grace-5.1.23/0000755000076500001440000000000012032153136012424 5ustar fnevgenyusersgrace-5.1.23/grconvert/0000755000076500001440000000000012032153126014434 5ustar fnevgenyusersgrace-5.1.23/grconvert/defaults.c0000644000076500001440000003155306626627165016443 0ustar fnevgenyusers#include #include #include #include #include #include "grconvert.h" static defaults d_d = {1, 1, 1, 1.0, 4, 0, 1.0}; /* defaults layout int color; int lines; int linew; double charsize; int font; int fontsrc; double symsize; */ static world d_w = {0.0, 1.0, 0.0, 1.0}; static view d_v = {0.15, 0.85, 0.15, 0.85}; void set_program_defaults(void) { int i; grdefaults = d_d; g = (graph *) calloc(maxgraph, sizeof(graph)); for (i = 0; i < maxgraph; i++) { g[i].p = (plotarr *) calloc(maxplot, sizeof(plotarr)); if (g[i].p == NULL) { fprintf(stderr, "Couldn't allocate memory for sets in graph %d, maxplot = %d, fatal error", i, maxplot); exit(1); } set_default_graph(i); setdefaultcolors(i); } for (i = 0; i < MAXREGION; i++) { set_region_defaults(i); } set_default_annotation(); set_default_string(×tamp); alloc_blockdata(maxplot); timestamp.x = 0.03; timestamp.y = 0.03; if (init_scratch_arrays(maxarr)) { errmsg("Couldn't allocate memory for scratch arrays, don't use them"); } } void set_region_defaults(int rno) { int j; rg[rno].active = OFF; rg[rno].type = 0; rg[rno].color = grdefaults.color; rg[rno].lines = grdefaults.lines; rg[rno].linew = grdefaults.linew; rg[rno].linkto = (int *) malloc(maxgraph * sizeof(int)); for (j = 0; j < maxgraph; j++) { rg[rno].linkto[j] = -1; } rg[rno].n = 0; rg[rno].x = rg[rno].y = (double *) NULL; rg[rno].x1 = rg[rno].y1 = rg[rno].x2 = rg[rno].y2 = 0.0; } void set_default_framep(framep * f) { f->active = ON; /* frame on or off */ f->type = 0; /* frame type */ f->lines = grdefaults.lines; f->linew = grdefaults.linew; f->color = grdefaults.color; f->fillbg = OFF; /* fill background */ f->bgcolor = 0; /* background color inside frame */ } void set_default_world(world * w) { memcpy(w, &d_w, sizeof(world)); } void set_default_view(view * v) { memcpy(v, &d_v, sizeof(view)); } void set_default_string(plotstr * s) { s->active = OFF; s->loctype = VIEW; s->gno = -1; s->x = s->y = 0.0; s->lines = grdefaults.lines; s->linew = grdefaults.linew; s->color = grdefaults.color; s->rot = 0; s->font = grdefaults.font; s->just = 0; s->charsize = grdefaults.charsize; s->s = (char *) malloc(sizeof(char)); s->s[0] = 0; } void set_default_line(linetype * l) { l->active = OFF; l->loctype = VIEW; l->gno = -1; l->x1 = l->y1 = l->x2 = l->y2 = 0.0; l->lines = grdefaults.lines; l->linew = grdefaults.linew; l->color = grdefaults.color; l->arrow = 0; l->atype = 0; l->asize = 1.0; } void set_default_box(boxtype * b) { b->active = OFF; b->loctype = VIEW; b->gno = -1; b->x1 = b->y1 = b->x2 = b->y2 = 0.0; b->lines = grdefaults.lines; b->linew = grdefaults.linew; b->color = grdefaults.color; b->fill = OFF; b->fillcolor = 1; b->fillpattern = 1; } void set_default_ellipse(ellipsetype * e) { e->active = OFF; e->loctype = VIEW; e->gno = -1; e->x1 = e->y1 = e->x2 = e->y2 = 0.0; e->lines = grdefaults.lines; e->linew = grdefaults.linew; e->color = grdefaults.color; e->fill = OFF; e->fillcolor = 1; e->fillpattern = 1; } void set_default_legend(int gno, legend * l) { l->active = OFF; l->loctype = VIEW; l->layout = 0; l->vgap = 2; l->hgap = 1; l->len = 4; l->legx = 0.8; l->legy = 0.8; l->font = grdefaults.font; l->charsize = 1.0; l->color = grdefaults.color; l->linew = grdefaults.linew; l->lines = grdefaults.lines; l->box = OFF; l->boxfill = OFF; l->boxfillusing = COLOR; l->boxfillcolor = 0; l->boxfillpat = 1; l->boxlcolor = grdefaults.color; /* color for symbol */ l->boxlinew = grdefaults.linew; /* set plot sym line width */ l->boxlines = grdefaults.lines; /* set plot sym line style */ } void set_default_plotarr(plotarr * p) { int i; p->active = OFF; /* active flag */ p->type = XY; /* dataset type */ p->deact = 0; /* deactivated set */ p->hotlink = 0; /* hot linked set */ p->hotfile[0] = 0; /* hot linked file name */ p->len = 0; /* set length */ p->missing = DATASET_MISSING; /* value for missing data */ p->s = (char **) NULL; /* pointer to strings */ p->xmin = p->xmax = p->ymin = p->ymax = 0.0; p->sym = 0; /* set plot symbol */ p->symchar = 0; /* character for symbol */ p->symskip = 0; /* How many symbols to skip */ p->symfill = 0; /* Symbol fill type */ p->symdot = 0; /* Symbol dot in center */ p->symlines = grdefaults.lines; /* set plot sym line style */ p->symlinew = grdefaults.linew; /* set plot sym line width */ p->symcolor = -1; /* color for symbol; -1 means same color as line */ p->symsize = 1.0; /* size of symbols */ p->font = grdefaults.font; /* font for strings */ p->format = DECIMAL; /* format for drawing values */ p->prec = 1; /* precision for drawing values */ p->just = LEFT; /* justification for drawing values */ p->where = RIGHT; /* where to draw values */ p->valsize = 1.0; /* char size for drawing values */ p->lines = grdefaults.lines; p->linew = grdefaults.linew; p->color = grdefaults.color; p->lineskip = 0; /* How many points to skip when drawing lines */ p->fill = 0; /* fill type */ p->fillusing = COLOR; /* fill using color or pattern */ p->fillcolor = 1; /* fill color */ p->fillpattern = 0; /* fill pattern */ p->errbar = -1; /* if type is _DX, _DY, _DXDY and errbar = * TRUE */ p->errbarxy = BOTH; /* type of error bar */ p->errbar_lines = grdefaults.lines; /* error bar line width */ p->errbar_linew = grdefaults.linew; /* error bar line style */ p->errbar_riser = ON; /* connecting line between error limits */ p->errbar_riser_linew = 1; /* connecting line between error limits line * width */ p->errbar_riser_lines = 1; /* connecting line between error limits line * style */ p->errbarper = 1.0; /* length of error bar */ p->hilowper = 1.0; /* length of hi-low */ p->density_plot = 0; /* if type is XYZ then density_plot = 1 */ p->zmin = p->zmax = 0.0; /* min max for density plots */ p->comments[0] = 0; /* how did this set originate */ p->lstr[0] = 0; /* legend */ for (i = 0; i < MAX_SET_COLS; i++) { p->ex[i] = NULL; p->emin[i] = 0.0; /* min for each column */ p->emax[i] = 0.0; /* max for each column */ p->imin[i] = 0; /* min loc for each column */ p->imax[i] = 0; /* max loc for each column */ } p->ep = NULL; /* EditPoints pointer */ } void set_default_velocityp(velocityp * vp) { vp->active = OFF; vp->type = 0; vp->loctype = VIEW; vp->velx = 0.8; vp->vely = 0.7; vp->lines = grdefaults.lines; vp->linew = grdefaults.linew; vp->color = grdefaults.color; set_default_string(&(vp->vstr)); vp->arrowtype = 0; vp->vscale = 1.0; vp->units = 0; vp->userlength = 1.0; } void set_default_graph(int gno) { int i; g[gno].active = OFF; g[gno].hidden = FALSE; g[gno].label = OFF; g[gno].type = XY; g[gno].auto_type = AUTO; g[gno].autoscale = 0; g[gno].noautoscale = 0; g[gno].revx = FALSE; g[gno].revy = FALSE; g[gno].ws_top = 1; g[gno].ws[0].w.xg1=g[gno].ws[0].w.xg2=g[gno].ws[0].w.yg1=g[gno].ws[0].w.yg2=0; g[gno].curw = 0; g[gno].maxplot = maxplot; g[gno].dsx = g[gno].dsy = 0.0; /* locator props */ g[gno].pointset = FALSE; g[gno].pt_type = 0; g[gno].fx = GENERAL; g[gno].fy = GENERAL; g[gno].px = 6; g[gno].py = 6; g[gno].barwid = 0.85; g[gno].sbarwid = 0.75; set_default_ticks(&g[gno].t[0], X_AXIS); set_default_ticks(&g[gno].t[1], Y_AXIS); set_default_ticks(&g[gno].t[2], ZX_AXIS); set_default_ticks(&g[gno].t[3], ZY_AXIS); set_default_framep(&g[gno].f); set_default_world(&g[gno].w); set_default_view(&g[gno].v); g[gno].rt.xg1 = 1.0; g[gno].rt.yg1 = 2.0 * M_PI; set_default_legend(gno, &g[gno].l); set_default_string(&g[gno].labs.title); g[gno].labs.title.charsize = 1.5; set_default_string(&g[gno].labs.stitle); g[gno].labs.stitle.charsize = 1.0; for (i = 0; i < maxplot; i++) { set_default_plotarr(&g[gno].p[i]); } set_default_velocityp(&g[gno].vp); } void realloc_plots(int maxplot) { int i, j; for (i = 0; i < maxgraph; i++) { g[i].p = (plotarr *) realloc(g[i].p, maxplot * sizeof(plotarr)); for (j = g[i].maxplot; j < maxplot; j++) { g[i].p[j].len = 0; set_default_plotarr(&g[i].p[j]); } g[i].maxplot = maxplot; } } void realloc_graph_plots(int gno, int maxplot) { int j; g[gno].p = (plotarr *) realloc(g[gno].p, maxplot * sizeof(plotarr)); for (j = g[gno].maxplot; j < maxplot; j++) { g[gno].p[j].len = 0; set_default_plotarr(&g[gno].p[j]); } g[gno].maxplot = maxplot; } void realloc_graphs(void) { int j; g = (graph *) realloc(g, maxgraph * sizeof(graph)); for (j = MAXGRAPH; j < maxgraph; j++) { g[j].p = (plotarr *) calloc(maxplot, sizeof(plotarr)); set_default_graph(j); } } void set_default_annotation(void) { int i; lines = (linetype *) malloc(maxlines * sizeof(linetype)); boxes = (boxtype *) malloc(maxboxes * sizeof(boxtype)); pstr = (plotstr *) malloc(maxstr * sizeof(plotstr)); ellip = (ellipsetype *) malloc(maxellipses * sizeof(ellipsetype)); for (i = 0; i < maxboxes; i++) { set_default_box(&boxes[i]); } for (i = 0; i < maxlines; i++) { set_default_line(&lines[i]); } for (i = 0; i < maxellipses; i++) { set_default_ellipse(&ellip[i]); } for (i = 0; i < maxstr; i++) { set_default_string(&pstr[i]); } } void set_default_ticks(tickmarks * t, int a) { int i; t->axis = a; switch (a) { case X_AXIS: case Y_AXIS: t->active = ON; t->alt = OFF; t->tl_flag = ON; t->t_flag = ON; break; case ZX_AXIS: case ZY_AXIS: t->active = ON; t->alt = OFF; t->tl_flag = OFF; t->t_flag = OFF; break; } set_default_string(&t->label); t->tmin = 0.0; t->tmax = 1.0; t->tmajor = 0.5; t->tminor = 0.25; t->offsx = 0.0; t->offsy = 0.0; t->label_layout = PARA; t->label_place = AUTO; t->tl_type = AUTO; t->tl_layout = HORIZONTAL; t->tl_loc = ON; t->tl_sign = NORMAL; t->tl_prec = 1; t->tl_format = DECIMAL; t->tl_angle = 0; t->tl_just = (a % 2) ? RIGHT : CENTER; t->tl_skip = 0; t->tl_staggered = 0; t->tl_starttype = AUTO; t->tl_stoptype = AUTO; t->tl_start = 0.0; t->tl_stop = 0.0; t->tl_op = (a % 2) ? LEFT : BOTTOM; t->tl_vgap = 1.0; t->tl_hgap = 1.0; t->tl_font = grdefaults.font; t->tl_charsize = 1.0; t->tl_linew = grdefaults.linew; t->tl_color = grdefaults.color; t->tl_appstr[0] = 0; t->tl_prestr[0] = 0; t->t_type = AUTO; t->t_mflag = ON; t->t_integer = OFF; t->t_num = 6; t->t_inout = IN; t->t_log = OFF; t->t_op = BOTH; t->t_size = 1.0; t->t_msize = 0.5; t->t_drawbar = OFF; t->t_drawbarcolor = grdefaults.color; t->t_drawbarlines = grdefaults.lines; t->t_drawbarlinew = grdefaults.linew; t->t_gridflag = OFF; t->t_mgridflag = OFF; t->t_color = grdefaults.color; t->t_lines = grdefaults.lines; t->t_linew = grdefaults.linew; t->t_mcolor = grdefaults.color; t->t_mlines = grdefaults.lines; t->t_mlinew = grdefaults.linew; t->t_spec = 0; for (i = 0; i < MAX_TICK_LABELS; i++) { t->t_specloc[i] = 0.0; t->t_speclab[i].s = NULL; } } static int default_color[MAXPLOT] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; void setdefaultcolors(int gno) { int i; for (i = 0; i < g[gno].maxplot; i++) { g[gno].p[i].color = default_color[i % MAXPLOT]; } } void kill_blockdata(void) { int j; if (blockdata != NULL) { for (j = 0; j < maxblock; j++) { cxfree(blockdata[j]); } } } void alloc_blockdata(int ncols) { int j; if (blockdata != NULL) { kill_blockdata(); } if (ncols < MAXPLOT) { ncols = MAXPLOT; } blockdata = (double **) malloc(ncols * sizeof(double *)); if (blockdata != NULL) { maxblock = ncols; for (j = 0; j < maxblock; j++) { blockdata[j] = NULL; } } else { errmsg("alloc_blockdata(): Error, unable to allocate memory for block data"); } } int init_array(double **a, int n) { if (*a != NULL) { *a = (double *) realloc(*a, n * sizeof(double)); } else { *a = (double *) calloc(n, sizeof(double)); } return *a == NULL ? 1 : 0; } int init_scratch_arrays(int n) { if (!init_array(&ax, n)) { if (!init_array(&bx, n)) { if (!init_array(&cx, n)) { if (!init_array(&dx, n)) { maxarr = n; return 0; } free(cx); } free(bx); } free(ax); } return 1; } grace-5.1.23/grconvert/util.c0000644000076500001440000001721406626627165015607 0ustar fnevgenyusers#include #include #include #include #include #include #include "grconvert.h" /* graph *g; plotstr *pstr; boxtype *boxes; linetype *lines; ellipsetype *ellip; polytype *polys; */ char *graph_types(int it, int which) { static char s[128]; strcpy(s, "UNKNOWN"); switch (it) { case XY: if (which) { strcpy(s, "xy"); } else { strcpy(s, "XY"); } break; case LOGX: if (which) { strcpy(s, "logx"); } else { strcpy(s, "LOG-LINEAR"); } break; case LOGY: if (which) { strcpy(s, "logy"); } else { strcpy(s, "LINEAR-LOG"); } break; case LOGXY: if (which) { strcpy(s, "logxy"); } else { strcpy(s, "LOG-LOG"); } break; case XYFIXED: strcpy(s, "FIXED XY"); break; case POLAR: strcpy(s, "polar"); break; case BAR: if (which) { strcpy(s, "bar"); } else { strcpy(s, "BAR"); } break; case HBAR: if (which) { strcpy(s, "hbar"); } else { strcpy(s, "HORIZONTAL BAR"); } break; case PIE: strcpy(s, "pie"); break; case STACKEDBAR: if (which) { strcpy(s, "stackedbar"); } else { strcpy(s, "STACKED BAR"); } break; case STACKEDHBAR: if (which) { strcpy(s, "stackedhbar"); } else { strcpy(s, "STACKED HORIZONTAL BAR"); } break; case STACKEDLINE: strcpy(s, "STACKED LINE"); break; } return s; } char *get_format_types(int f) { static char s[128]; strcpy(s, "decimal"); switch (f) { case DECIMAL: strcpy(s, "decimal"); break; case EXPONENTIAL: strcpy(s, "exponential"); break; case POWER: strcpy(s, "power"); break; case GENERAL: strcpy(s, "general"); break; case DDMMYY: strcpy(s, "ddmmyy"); break; case MMDDYY: strcpy(s, "mmddyy"); break; case MMYY: strcpy(s, "mmyy"); break; case MMDD: strcpy(s, "mmdd"); break; case MONTHDAY: strcpy(s, "monthday"); break; case DAYMONTH: strcpy(s, "daymonth"); break; case MONTHS: strcpy(s, "months"); break; case MONTHSY: strcpy(s, "monthsy"); break; case MONTHL: strcpy(s, "monthl"); break; case DAYOFWEEKS: strcpy(s, "dayofweeks"); break; case DAYOFWEEKL: strcpy(s, "dayofweekl"); break; case DAYOFYEAR: strcpy(s, "dayofyear"); break; case HMS: strcpy(s, "hms"); break; case MMDDHMS: strcpy(s, "mmddhms"); break; case MMDDYYHMS: strcpy(s, "mmddyyhms"); break; case DEGREESLON: strcpy(s, "degreeslon"); break; case DEGREESMMLON: strcpy(s, "degreesmmlon"); break; case DEGREESMMSSLON: strcpy(s, "degreesmmsslon"); break; case MMSSLON: strcpy(s, "mmsslon"); break; case DEGREESLAT: strcpy(s, "degreeslat"); break; case DEGREESMMLAT: strcpy(s, "degreesmmlat"); break; case DEGREESMMSSLAT: strcpy(s, "degreesmmsslat"); break; case MMSSLAT: strcpy(s, "mmsslat"); break; } return s; } void get_graph_box(int i, boxtype * b) { memcpy(b, &boxes[i], sizeof(boxtype)); } void get_graph_ellipse(int i, ellipsetype * b) { memcpy(b, &ellip[i], sizeof(ellipsetype)); } void get_graph_line(int i, linetype * l) { memcpy(l, &lines[i], sizeof(linetype)); } void get_graph_string(int i, plotstr * s) { memcpy(s, &pstr[i], sizeof(plotstr)); } void get_graph_framep(int gno, framep * f) { memcpy(f, &g[gno].f, sizeof(framep)); } void get_graph_world(int gno, world * w) { memcpy(w, &g[gno].w, sizeof(world)); } void get_graph_view(int gno, view * v) { memcpy(v, &g[gno].v, sizeof(view)); } void get_graph_labels(int gno, labels * labs) { memcpy(labs, &g[gno].labs, sizeof(labels)); } void get_graph_plotarr(int gno, int i, plotarr * p) { memcpy(p, &g[gno].p[i], sizeof(plotarr)); } void get_graph_tickmarks(int gno, tickmarks * t, int a) { memcpy(t, &g[gno].t[a], sizeof(tickmarks)); } void get_graph_legend(int gno, legend * leg) { memcpy(leg, &g[gno].l, sizeof(legend)); } void set_graph_tickmarks(int gno, tickmarks * t, int a) { memcpy(&g[gno].t[a], t, sizeof(tickmarks)); } /* * nicenum: find a "nice" number approximately equal to x * round if round=1, ceil if round=0 */ static double nicenum(double x, int round) { int exp; double f, y; exp = floor(log10(x)); f = x / pow(10., (double) exp); /* fraction between 1 and 10 */ if (round) if (f < 1.5) y = 1.; else if (f < 3.) y = 2.; else if (f < 7.) y = 5.; else y = 10.; else if (f <= 1.) y = 1.; else if (f <= 2.) y = 2.; else if (f <= 5.) y = 5.; else y = 10.; return y * pow(10., (double) exp); } void default_ticks(int gno, int axis, double *gmin, double *gmax) { tickmarks t; double range, d, tmpmax = *gmax, tmpmin = *gmin; get_graph_tickmarks(gno, &t, axis); if (axis % 2 && (g[gno].type == LOGY || g[gno].type == LOGXY)) { tmpmax = ceil(log10(tmpmax)); tmpmin = floor(log10(tmpmin)); } else if ((axis % 2 == 0) && (g[gno].type == LOGX || g[gno].type == LOGXY)) { tmpmax = ceil(log10(tmpmax)); tmpmin = floor(log10(tmpmin)); } range = nicenum(tmpmax - tmpmin, 0); d = nicenum(range / (t.t_num - 1), 1); tmpmin = floor(tmpmin / d) * d; tmpmax = ceil(tmpmax / d) * d; if (axis % 2 && (g[gno].type == LOGY || g[gno].type == LOGXY)) { *gmax = pow(10.0, tmpmax); *gmin = pow(10.0, tmpmin); t.tmajor = (int) d; if (t.tmajor == 0.0) { t.tmajor = 1.0; } if ((int) t.tmajor < 2) { t.tminor = 1.0; } else { t.tminor = 0.0; } if (fabs(tmpmax) > 6.0 || fabs(tmpmin) > 6.0) { t.tl_format = POWER; t.tl_prec = 0; } else { t.tl_format = DECIMAL; t.tl_prec = 0; } } else if ((axis % 2 == 0) && (g[gno].type == LOGX || g[gno].type == LOGXY)) { *gmax = pow(10.0, tmpmax); *gmin = pow(10.0, tmpmin); t.tmajor = (int) d; if (t.tmajor == 0.0) { t.tmajor = 1.0; } if (fabs(tmpmax) > 6.0 || fabs(tmpmin) > 6.0) { t.tl_format = POWER; t.tl_prec = 0; } else { t.tl_format = DECIMAL; t.tl_prec = 0; } if ((int) t.tmajor < 2) { t.tminor = 1.0; } else { t.tminor = 0.0; } } else { *gmax = tmpmax; *gmin = tmpmin; t.tmajor = d; t.tminor = d * 0.5; } set_graph_tickmarks(gno, &t, axis); } void errmsg(char *buf) { printf("%s\n", buf); } /* * escape quotes */ char *escapequotes (char *s) { char *es; int i, k, n, len, elen; if (s == NULL) return NULL; len = strlen(s); es = (char *) malloc ((len + 1)*sizeof(char)); strcpy(es, s); n = 0; while ((es = strchr(es, '\"'))) { es++; n++; } elen = len + n + 1; es = (char *) realloc (es, elen*sizeof(char)); i = k = 0; while (i < len) { if (s[i] == '\"') { es[k] = '\\'; k++; } es[k] = s[i]; i++; k++; } es[elen-1] = '\0'; return es; } /* * return the string version of the set type */ char *set_types(int it) { char *s = "XY"; switch (it) { case XY: s = "xy"; break; case XYDX: s = "xydx"; break; case XYDY: s = "xydy"; break; case XYDYDY: s = "xydydy"; break; case XYDXDX: s = "xydxdx"; break; case XYDXDY: s = "xydxdy"; break; case XYZ: s = "xyz"; break; case XYHILO: s = "xyhilo"; break; case XYBOX: s = "xybox"; break; case XYRT: s = "xyrt"; break; case XYUV: s = "xyuv"; break; case XYBOXPLOT: s = "xyboxplot"; break; case XYSTRING: s = "xystring"; break; case POLY: s = "poly"; break; } return s; } int is_hotlinked(int gno, int setno) { return (g[gno].p[setno].hotlink && strlen(g[gno].p[setno].hotfile) > 0); } /* * free and check for NULL pointer */ void cxfree(void *ptr) { if (ptr != NULL) { free(ptr); } } grace-5.1.23/grconvert/grconvert.h0000644000076500001440000005040706626627165016651 0ustar fnevgenyusers #ifndef TRUE # define TRUE 1 #endif #ifndef FALSE # define FALSE 0 #endif /* * types of tick displays */ #define X_AXIS 0 #define Y_AXIS 1 #define ZX_AXIS 2 #define ZY_AXIS 3 #ifndef MAXARR # define MAXARR 20000 /* max elements in an array */ #endif #define MAXGRAPH 10 /* max number of graphs */ #define MAXPLOT 30 /* max number of sets in a graph */ #define MAXAXES 4 /* max number of axes per graph */ #define MAX_SET_COLS 6 /* max number of data columns for a set */ #define MAX_TICK_LABELS 40 /* max number of user defined ticks/labels */ #define MAX_ZOOM_STACK 20 /* max stack depth for world stack */ #define MAXREGION 5 /* max number of regions */ #define MAXBOXES 50 /* max number of boxes */ #define MAXLINES 50 /* max number of lines */ #define MAXELLIPSES 50 /* max number of ellipses */ #define MAXSTR 100 /* max number of strings */ #define PAGE_FREE 0 #define GR_PS_L 1 /* PostScript landscape */ /* set HDEV to the default hardcopy device */ #ifndef HDEV # define HDEV GR_PS_L #endif #define DATASET_MISSING (1.23456789e+30) #define NONAME "Untitled" #define ABOVE 589 #define ABSOLUTE 309 #define AUTO 324 #define BAR 332 #define BELOW 590 #define BOTH 336 #define BOTTOM 337 #define CENTER 342 #define COLOR 348 #define DAYMONTH 600 #define DAYOFWEEKL 605 #define DAYOFWEEKS 604 #define DAYOFYEAR 606 #define DDMMYY 594 #define DECIMAL 352 #define DEGREESLAT 615 #define DEGREESLON 611 #define DEGREESMMLAT 616 #define DEGREESMMLON 612 #define DEGREESMMSSLAT 617 #define DEGREESMMSSLON 613 #define DISK 360 #define EXPONENTIAL 373 #define FIXED 634 #define FREE 633 #define GENERAL 593 #define HBAR 395 #define HMS 607 #define HORIZONTAL 399 #define IN 407 #define LANDSCAPE 631 #define LEFT 419 #define LOGX 432 #define LOGXY 434 #define LOGY 433 #define MMDD 598 #define MMDDHMS 608 #define MMDDYY 596 #define MMDDYYHMS 609 #define MMSSLAT 618 #define MMSSLON 614 #define MMYY 597 #define MONTHDAY 599 #define MONTHL 603 #define MONTHS 601 #define MONTHSY 602 #define NEGATE 443 #define NONE 445 #define NORMAL 446 #define OFF 448 #define ON 451 #define OUT 454 #define PARA 456 #define PATTERN 460 #define PERP 462 #define PIE 464 #define POLAR 468 #define POLY 469 #define POLYI 591 #define POLYO 592 #define PORTRAIT 632 #define POWER 470 #define RIGHT 490 #define SPEC 513 #define STACKEDBAR 517 #define STACKEDHBAR 518 #define STACKEDLINE 519 #define TOP 535 #define VERTICAL 540 #define VIEW 542 #define WORLD 544 #define XY 554 #define XYBOX 556 #define XYBOXPLOT 557 #define XYDX 563 #define XYDXDX 565 #define XYDXDY 567 #define XYDY 564 #define XYDYDY 566 #define XYFIXED 558 #define XYHILO 559 #define XYRT 560 #define XYSTRING 562 #define XYUV 573 #define XYZ 571 #define YYMMDD 595 /* * defaults */ typedef struct { int color; int lines; int linew; double charsize; int font; int fontsrc; double symsize; } defaults; typedef struct { double xg1, xg2, yg1, yg2; /* window into world coords */ } world; typedef struct { double xv1, xv2, yv1, yv2; /* device viewport */ } view; /* * world stack */ typedef struct { world w; /* current world */ world t[3]; /* current tick spacing */ int prec[MAXAXES]; /* precision of labels */ } world_stack; typedef struct { int active; int loctype; int gno; double x; double y; int lines; int linew; int color; int rot; int font; int just; double charsize; char *s; } plotstr; typedef struct { plotstr title; /* graph title */ plotstr stitle; /* graph subtitle */ } labels; typedef struct { int active; /* active flag */ int type; /* regression type */ double xmin; double xmax; double coef[15]; } Regression; typedef struct { int active; /* active flag */ int type; /* regression type */ int npts; /* number of points */ double xmin; double xmax; double *a; double *b; double *c; double *d; } Spline; typedef struct { int active; /* active flag */ int type; /* dataset type */ int deact; /* deactivated set */ int len; /* set length */ int nx, ny; /* number of pts in X and Y for grids */ int setno; /* set number */ int gno; /* graph number */ char comments[256]; /* how did this set originate */ char lstr[256]; /* legend for this set */ double missing; /* value for missing data */ double *ex[MAX_SET_COLS]; /* x, y, dx, z, r, hi depending on dataset type */ char **s; /* pointer to strings */ int nel; /* # of ? */ int **con; /* con */ double xmin, xmax; /* min max for x */ double ymin, ymax; /* min max for y */ int sym; /* set plot symbol */ char symchar; /* character for symbol */ int symskip; /* How many symbols to skip */ int symfill; /* Symbol fill type */ int symdot; /* Symbol dot in center */ int symlines; /* Symbol linestyle */ int symlinew; /* Symbol linewidth */ int symcolor; /* color for symbol line */ double symsize; /* size of symbols */ int avgflag; /* average */ int avgstdflag; /* average+- std */ int avg2stdflag; /* average+- 2std */ int avg3stdflag; /* average+- 3std */ int avgallflag; /* average+- 3std */ int avgvalflag; /* average+- val */ int harmonicflag; /* harmonic mean */ int geometricflag; /* geometric */ int font; /* font for strings */ int format; /* format for drawing values */ int prec; /* precision for drawing values */ int just; /* justification for drawing values */ int where; /* where to draw values */ double valsize; /* char size for drawing values */ int lines; /* set line style */ int linew; /* line width */ int color; /* color for linestyle */ int lineskip; /* How many points to skip when drawing lines */ int clipflag; /* turn clipping on or off for this set */ int fill; /* fill type */ int fillusing; /* fill using color or pattern */ int fillcolor; /* fill color */ int fillpattern; /* fill pattern */ int errbar; /* if type is _DX, _DY, _DXDY and errbar = TRUE */ int errbarxy; /* type of error bar */ int errbar_linew; /* error bar line width */ int errbar_lines; /* error bar line style */ int errbar_riser; /* connecting line between error limits */ int errbar_riser_linew; /* connecting line between error limits line width */ int errbar_riser_lines; /* connecting line between error limits line style */ double errbarper; /* length of error bar */ double hilowper; /* length of hi-low */ int density_plot; /* if type is XYZ then density_plot = 1 */ double zmin, zmax; /* min max for density plots */ int hotlink; /* hot linked set */ int hotsrc; /* source for hot linked file (DISK|PIPE) */ char hotfile[256]; /* hot linked filename */ double emin[MAX_SET_COLS]; /* min for each column */ double emax[MAX_SET_COLS]; /* max for each column */ int imin[MAX_SET_COLS]; /* min loc for each column */ int imax[MAX_SET_COLS]; /* max loc for each column */ Regression *r; /* coefs from any regression performed on this set */ Spline *spl; /* coefs from any spline performed on this set */ void *ep; /* pointer to EditPoints structure */ } plotarr; typedef struct { int axis; /* which axis */ int active; /* active or not */ int alt; /* alternate map if TRUE */ double tmin, tmax; /* mapping for alternate tickmarks */ double tmajor, tminor; /* major, minor tick divisions */ double offsx, offsy; /* offset of axes in viewport coords */ plotstr label; /* graph axis label */ int label_layout; /* axis label orientation (h or v) */ int label_place; /* axis label placement (specfied or auto) */ int tl_flag; /* toggle ticmark labels on or off */ int tl_type; /* either auto or specified (below) */ int tl_loc; /* Tick label location, at tick, between ticks */ int tl_layout; /* horizontal, vertical, or specified */ int tl_angle; /* angle to draw labels if layout is specified */ int tl_sign; /* tick labels normal, absolute value, or negate */ int tl_just; /* justification of ticklabel and type of anchor point */ int tl_prec; /* places to right of decimal point */ int tl_format; /* decimal or exponential ticmark labels .. */ int tl_skip; /* tick labels to skip */ int tl_staggered; /* tick labels staggered */ int tl_starttype; /* start at graphmin or use tl_start/stop */ int tl_stoptype; /* start at graphmax or use tl_start/stop */ double tl_start; /* value of x to begin tick labels and major ticks */ double tl_stop; /* value of x to begin tick labels and major ticks */ int tl_op; /* tick labels on opposite side or both */ double tl_vgap; /* tick label to tickmark distance vertically */ double tl_hgap; /* tick label to tickmark distance horizontally */ int tl_font; /* font to use for labels */ double tl_charsize; /* character size for labels */ int tl_color; /* color */ int tl_linew; /* line width for labels */ char tl_appstr[256]; /* append string to tick label */ char tl_prestr[256]; /* prepend string to tick label */ int t_type; /* type of tickmarks, usual, xticstart, or specified */ int t_flag; /* toggle tickmark display */ int t_mflag; /* toggle minor tickmark display */ int t_integer; /* major tic marks on integer divisions */ int t_num; /* approximate default number of X-axis ticks */ int t_inout; /* ticks inward, outward or both */ int t_log; /* logarithmic ticmarks */ int t_op; /* ticks on opposite side */ int t_color; /* colors and linestyles */ int t_lines; int t_linew; int t_mcolor; int t_mlines; int t_mlinew; /* minor grid colors and linestyles */ double t_size; /* length of tickmarks */ double t_msize; /* length of minor tickmarks */ int t_drawbar; /* draw a bar connecting tick marks */ int t_drawbarcolor; /* color of bar */ int t_drawbarlines; /* linestyle of bar */ int t_drawbarlinew; /* line width of bar */ int t_gridflag; /* grid lines at major tick marks */ int t_mgridflag; /* grid lines at minor tick marks */ int t_spec; /* number of ticks at specified locations */ double t_specloc[MAX_TICK_LABELS]; plotstr t_speclab[MAX_TICK_LABELS]; int spec_font; double spec_charsize; int spec_color; int spec_linew; } tickmarks; typedef struct { int active; /* legend on or off */ int loctype; /* locate in world or viewport coords */ int layout; /* verticle or horizontal */ int vgap; /* verticle gap between entries */ int hgap; /* horizontal gap between entries */ int len; /* length of line to draw */ int box; /* box around legend on or off */ double legx; /* location on graph */ double legy; int font; double charsize; int color; int linew; int lines; int boxfill; /* legend frame fill toggle */ int boxfillusing; /* legend frame fill type */ int boxfillcolor; /* legend frame fill color */ int boxfillpat; /* legend frame fill pattern */ int boxlcolor; /* legend frame line color */ int boxlinew; /* legend frame line width */ int boxlines; /* legend frame line style */ } legend; typedef struct { int active; /* region on or off */ int type; /* region type */ int color; /* region color */ int lines; /* region linestyle */ int linew; /* region line width */ int *linkto; /* associated with graphs in linkto */ int n; /* number of points if type is POLY */ double *x, *y; /* coordinates if type is POLY */ double x1, y1, x2, y2; /* starting and ending points if type is not POLY */ } region; typedef struct { int active; /* frame on or off */ int type; /* frame type */ int color; /* frame color */ int lines; /* frame linestyle */ int linew; /* frame line width */ int fillbg; /* fill background */ int bgcolor; /* background color inside frame */ } framep; typedef struct _BoxPlot { double il; /* inner lower limit */ double iu; /* inner upper limit */ double ol; /* outer lower limit */ double ou; /* outer uppper limit */ int nthresh; /* threshhold for number of points for * boxplot */ int outliers; /* plot outliers */ int wtype; /* 1 = width by std dev or 0 = symsize */ double boxwid; } BoxPlot; typedef struct { int active; /* velocity legend on or off */ int type; /* velocity type */ int color; /* velocity color */ int lines; /* velocity linestyle */ int linew; /* velocity line width */ int arrowtype; /* velocity arrow type, fixed or variable head */ int loctype; /* world or viewport coords for legend */ double velx, vely; /* location of velocity legend */ double vscale; /* velocity scale */ int units; /* units of flow field */ double userlength; /* length of the legend vector in user units */ plotstr vstr; /* legend string for velocity legend */ } velocityp; /* * a graph */ typedef struct { int active; /* alive or dead */ int hidden; /* display or not */ int label; /* label graph */ int type; /* type of graph */ int clipflag; /* turn clipping on or off */ int autoscale; /* */ int noautoscale; /* */ int noauto_world; /* only time this is used is at startup */ int noauto_tics; /* only time this is used is at startup */ int auto_type; /* */ int parmsread; /* was a paramter file read for this graph */ int revx, revy; /* reverse mapping for x and y if true */ int maxplot; /* max number of sets for this graph */ plotarr *p; /* sets go here */ legend l; /* legends */ world w; /* world */ view v; /* world/view */ world rt; /* world for polar plots */ labels labs; /* title, subtitle, axes labels */ tickmarks t[MAXAXES]; /* flags etc. for tickmarks for all axes */ framep f; /* type of box around plot */ int pointset; /* if (dsx, dsy) have been set */ int pt_type; /* type of locator display */ double dsx, dsy; /* locator fixed point */ int fx, fy; /* locator format type */ int px, py; /* locator precision */ double barwid; /* bar width for bar charts */ double sbarwid; /* bar width for stacked bar charts */ world_stack ws[MAX_ZOOM_STACK]; /* zoom stack */ int ws_top; /* stack pointer */ int curw; /* for cycling through the stack */ velocityp vp; BoxPlot bp; } graph; /* * typedefs for objects */ typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; int linew; int color; int fill; int fillcolor; int fillpattern; } boxtype; typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; int linew; int color; int fill; int fillcolor; int fillpattern; } ellipsetype; typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; int linew; int color; int arrow; int atype; double asize; } linetype; #if defined(MAIN) graph *g; int cg = 0; /* the current graph */ int maxgraph = MAXGRAPH; char sformat[128] = "%16lg %16lg"; /* format for saving (ascii) projects */ defaults grdefaults; /* default properties */ int maxplot = MAXPLOT; int maxarr = MAXARR; plotstr timestamp; /* timestamp */ region rg[MAXREGION]; linetype *lines; /* lines */ int maxlines = MAXLINES; int maxboxes = MAXBOXES; boxtype *boxes; /* boxes */ plotstr *pstr; /* strings */ int maxstr = MAXSTR; int maxellipses = MAXELLIPSES; ellipsetype *ellip; /* ellipses */ double **blockdata; int maxblock = MAXPLOT; double *ax, *bx, *cx, *dx; /* scratch arrays used in scanner */ char docname[512] = NONAME; int blocklen; int blockncols; char description[2048]; int page_layout = PAGE_FREE; double scrollper = 0.05; /* scroll fraction */ double shexper = 0.05; /* expand/shrink fraction */ int scrolling_islinked = 0; /* linked scroll */ char buf[1024]; /* a string used here and there */ #else extern graph *g; extern int cg; extern int maxarr; extern char sformat[]; extern defaults grdefaults; /* default properties */ extern int maxgraph; extern int maxplot; extern plotstr timestamp; /* timestamp */ extern region rg[]; extern linetype *lines; /* lines */ extern int maxlines; extern int maxboxes; extern boxtype *boxes; /* boxes */ extern plotstr *pstr; /* strings */ extern int maxstr; extern int maxellipses; extern ellipsetype *ellip; /* ellipses */ extern double **blockdata; extern int maxblock; extern double *ax, *bx, *cx, *dx; extern char docname[]; extern int blocklen; extern int blockncols; extern char description[]; extern int page_layout; extern double scrollper; /* scroll fraction */ extern double shexper; /* expand/shrink fraction */ extern int scrolling_islinked; /* linked scroll */ extern char buf[]; #endif void set_program_defaults(void); void set_region_defaults(int rno); void set_default_framep(framep * f); void set_default_world(world * w); void set_default_view(view * v); void set_default_string(plotstr * s); void set_default_line(linetype * l); void set_default_box(boxtype * b); void set_default_ellipse(ellipsetype * e); void set_default_legend(int gno, legend * l); void set_default_plotarr(plotarr * p); void set_default_velocityp(velocityp * vp); void set_default_graph(int gno); void realloc_plots(int maxplot); void realloc_graph_plots(int gno, int maxplot); void realloc_graphs(void); void set_default_annotation(void); void set_default_ticks(tickmarks * t, int a); void setdefaultcolors(int gno); void kill_blockdata(void); void alloc_blockdata(int ncols); int init_array(double **a, int n); int init_scratch_arrays(int n); int read_boxtype(boxtype * d, FILE * fin); int read_ellipsetype(ellipsetype * d, FILE * fin); int read_linetype(linetype * d, FILE * fin); int read_plotstr(plotstr * d, FILE * fin); int read_graph(graph * d, FILE * fin); void close_xdr(void); int read_double(double *d, int n, FILE * fp); int read_int(int *d, int n, FILE * fp); int read_charstr(char *d, FILE * fp); int read_char(char *d, int n, FILE * fp); int read_short(short *d, int n, FILE * fp); int read_float(float *d, int n, FILE * fp); int replace_xdr_int( int *i ); int replace_xdr_short( short *i ); int is_state_save(char *fname); int getbinary(int gno, char *fname, int imbed); int do_writesets(int gno, int setno, int imbed, char *fn, char *format); void putparms(int gno, FILE * pp, int imbed); char *graph_types(int it, int which); char *get_format_types(int f); void get_graph_box(int i, boxtype * b); void get_graph_ellipse(int i, ellipsetype * b); void get_graph_line(int i, linetype * l); void get_graph_string(int i, plotstr * s); void get_graph_framep(int gno, framep * f); void get_graph_world(int gno, world * w); void get_graph_view(int gno, view * v); void get_graph_labels(int gno, labels * labs); void get_graph_plotarr(int gno, int i, plotarr * p); void get_graph_tickmarks(int gno, tickmarks * t, int a); void get_graph_legend(int gno, legend * leg); void set_graph_tickmarks(int gno, tickmarks * t, int a); void default_ticks(int gno, int axis, double *gmin, double *gmax); void errmsg(char *buf); char *escapequotes (char *s); char *set_types(int it); int is_hotlinked(int gno, int setno); void cxfree(void *ptr); #define isactive_set(gno, set) (g[gno].p[set].active == ON) #define isactive_graph(gno) (g[gno].active == ON) #define on_or_off(x) ((x == ON)?"on":"off") #define w_or_v(x) ((x == WORLD)?"world":"view") #define dataset_type(gno, set) (g[gno].p[set].type) #define getx(gno, set) ((double *) g[gno].p[set].ex[0]) #define gety(gno, set) ((double *) g[gno].p[set].ex[1]) #define getsetlength(gno, set) (g[gno].p[set].len) #define getcol(gno, set, col) ((double *) g[gno].p[set].ex[col]) grace-5.1.23/grconvert/grconvert.c0000644000076500001440000000121406626627165016634 0ustar fnevgenyusers/* * Utility to convert xmgr project files saved in old binary format */ #include #include #define MAIN #include "grconvert.h" static void usage(FILE *stream, char *progname); int main(int argc, char *argv[]) { /* initialize plots, strings, graphs */ set_program_defaults(); if (argc != 3) { usage(stderr, argv[0]); return (1); } if(!getbinary(cg, argv[1], 0)) { do_writesets(maxgraph, -1, 1, argv[2], sformat); return (0); } else { return (1); } } static void usage(FILE *stream, char *progname) { fprintf(stream, "Usage: %s \n", progname); } grace-5.1.23/grconvert/writeasc.c0000644000076500001440000006257206736256241016455 0ustar fnevgenyusers#include #include #include #include #include #include #include "grconvert.h" static void put_annotation(int gno, FILE * pp, int embed); static void put_region(FILE * pp, int embed); int realtime = 0; int change_gno; /* if the graph number changes on read in */ int change_type; /* current set type */ /* * write out a set */ int do_writesets(int gno, int setno, int embed, char *fn, char *format) { int i, j, k, n, which_graph = gno, save_cg = cg, start, stop, set_start, set_stop; FILE *cp; double *x, *y, *dx, *dy, *dz, *dw; if (!fn[0]) { errmsg("Define file name first"); return 1; } if (strcmp(fn, "-") == 0) { cp = stdout; } else { cp = fopen(fn, "w"); } if (cp == NULL) { char s[192]; sprintf(s, "Unable to open file %s", fn); errmsg(s); return 1; } if (which_graph == maxgraph) { start = 0; stop = maxgraph - 1; } else if (which_graph == -1) { start = cg; stop = cg; } else { start = which_graph; stop = which_graph; } if (embed) { if (start != stop) { putparms(-1, cp, embed); } else { putparms(start, cp, embed); } } for (k = start; k <= stop; k++) { if (isactive_graph(k)) { if (start != stop) { fprintf(cp, "@WITH G%1d\n", k); fprintf(cp, "@G%1d ON\n", k); } if (setno == -1) { set_start = 0; set_stop = g[cg].maxplot - 1; } else { set_start = setno; set_stop = setno; } for (j = set_start; j <= set_stop; j++) { if (isactive_set(k, j)) { fprintf(cp, "@TARGET S%d\n", j); fprintf(cp, "@TYPE %s\n", set_types(dataset_type(k, j))); x = getx(k, j); y = gety(k, j); n = getsetlength(k, j); switch (dataset_type(k, j)) { case XY: for (i = 0; i < n; i++) { fprintf(cp, format, x[i], y[i]); fputc('\n', cp); } break; case XYDX: case XYDY: case XYZ: case XYRT: dx = getcol(k, j, 2); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %g", x[i], y[i], dx[i]); fputc('\n', cp); } break; case POLY: dx = getcol(k, j, 2); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %d", x[i], y[i], (int) dx[i]); fputc('\n', cp); } break; case XYDXDX: case XYDYDY: case XYDXDY: case XYUV: dx = getcol(k, j, 2); dy = getcol(k, j, 3); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %g %g", x[i], y[i], dx[i], dy[i]); fputc('\n', cp); } break; case XYHILO: dx = getcol(k, j, 2); dy = getcol(k, j, 3); dz = getcol(k, j, 4); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %g %g %g", x[i], y[i], dx[i], dy[i], dz[i]); fputc('\n', cp); } break; case XYBOX: dx = getcol(k, j, 2); dy = getcol(k, j, 3); dz = getcol(k, j, 4); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %g %g %d", x[i], y[i], dx[i], dy[i], (int) dz[i]); fputc('\n', cp); } break; case XYBOXPLOT: dx = getcol(k, j, 2); dy = getcol(k, j, 3); dz = getcol(k, j, 4); dw = getcol(k, j, 5); for (i = 0; i < n; i++) { fprintf(cp, "%g %g %g %g %g %g", x[i], y[i], dx[i], dy[i], dz[i], dw[i]); fputc('\n', cp); } break; } fprintf(cp, "&\n"); } } } } fclose(cp); cg = save_cg; return 0; } void putparms(int gno, FILE * pp, int embed) { int i, j, k, ming, maxg; int ps, pt, gh, gl, gt, fx, fy, px, py; double dsx, dsy; char embedstr[2], tmpstr1[128], tmpstr2[128]; framep f; legend leg; labels lab; plotarr p; tickmarks t; world w; view v; char *p1, *p2, *tmpbuf; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } fprintf(pp, "# ACE/gr parameter file\n"); fprintf(pp, "#\n"); fprintf(pp, "%sversion 40000\n", embedstr); /* Print some global variables. Added by Henrik Seidel Tue Jun 10 16:47:14 MET DST 1997 */ switch (page_layout) { case FREE: strcpy(tmpstr1, "free"); break; case LANDSCAPE: strcpy(tmpstr1, "landscape"); break; case PORTRAIT: strcpy(tmpstr1, "portrait"); break; case FIXED: strcpy(tmpstr1, "fixed"); break; default: strcpy(tmpstr1, "free"); break; } fprintf(pp, "%spage layout %s\n", embedstr, tmpstr1); if (*description) { tmpbuf = (char *) malloc ((size_t) (strlen (description) + 1)); if (tmpbuf == NULL) { errmsg("Error: Unable to malloc temporary in putparms()"); return; } strcpy (tmpbuf, description); p1 = tmpbuf; while ((p2 = strchr (p1, '\n')) != NULL) { *p2 = 0; fprintf (pp, "%sdescription \"%s\"\n", embedstr, escapequotes(p1)); *p2 = '\n'; p1 = p2; p1++; } if (*p1) fprintf (pp, "%sdescription \"%s\"\n", embedstr, escapequotes(p1)); free (tmpbuf); } /* End of added globals */ fprintf(pp, "%spage %d\n", embedstr, (int) (scrollper * 100)); fprintf(pp, "%spage inout %d\n", embedstr, (int) (shexper * 100)); fprintf(pp, "%slink page %s\n", embedstr, scrolling_islinked ? "on" : "off"); fprintf(pp, "%sdefault linestyle %d\n", embedstr, grdefaults.lines); fprintf(pp, "%sdefault linewidth %d\n", embedstr, grdefaults.linew); fprintf(pp, "%sdefault color %d\n", embedstr, grdefaults.color); fprintf(pp, "%sdefault char size %f\n", embedstr, grdefaults.charsize); fprintf(pp, "%sdefault font %d\n", embedstr, grdefaults.font); fprintf(pp, "%sdefault font source %d\n", embedstr, grdefaults.fontsrc); fprintf(pp, "%sdefault symbol size %f\n", embedstr, grdefaults.symsize); put_annotation(gno, pp, embed); put_region(pp, embed); if (gno == -1) { maxg = maxgraph - 1; ming = 0; } else { maxg = gno; ming = gno; } for (k = ming; k <= maxg; k++) { if (isactive_graph(k)) { gno = k; gh = g[gno].hidden; gl = g[gno].label; gt = g[gno].type; ps = g[gno].pointset; pt = g[gno].pt_type; dsx = g[gno].dsx; dsy = g[gno].dsy; fx = g[gno].fx; fy = g[gno].fy; px = g[gno].px; py = g[gno].py; fprintf(pp, "%swith g%1d\n", embedstr, gno); fprintf(pp, "%sg%1d %s\n", embedstr, gno, on_or_off(g[gno].active)); fprintf(pp, "%sg%1d label %s\n", embedstr, gno, on_or_off(gl)); fprintf(pp, "%sg%1d hidden %s\n", embedstr, gno, gh ? "true" : "false"); fprintf(pp, "%sg%1d type %s\n", embedstr, gno, graph_types(g[gno].type, 1)); fprintf(pp, "%sg%1d autoscale type %s\n", embedstr, gno, g[gno].auto_type == AUTO ? "AUTO" : "SPEC"); fprintf(pp, "%sg%1d fixedpoint %s\n", embedstr, gno, on_or_off(ps)); fprintf(pp, "%sg%1d fixedpoint type %d\n", embedstr, gno, pt); fprintf(pp, "%sg%1d fixedpoint xy %f, %f\n", embedstr, gno, dsx, dsy); strcpy(tmpstr1, get_format_types(fx)); strcpy(tmpstr2, get_format_types(fy)); fprintf(pp, "%sg%1d fixedpoint format %s %s\n", embedstr, gno, tmpstr1, tmpstr2); fprintf(pp, "%sg%1d fixedpoint prec %d, %d\n", embedstr, gno, px, py); get_graph_world(gno, &w); fprintf(pp, "%s world xmin %.12g\n", embedstr, w.xg1); fprintf(pp, "%s world xmax %.12g\n", embedstr, w.xg2); fprintf(pp, "%s world ymin %.12g\n", embedstr, w.yg1); fprintf(pp, "%s world ymax %.12g\n", embedstr, w.yg2); for (i = 0; i < g[gno].ws_top; i++) { fprintf(pp, "%s stack world %.9g, %.9g, %.9g, %.9g tick %g, %g, %g, %g\n", embedstr, g[gno].ws[i].w.xg1, g[gno].ws[i].w.xg2, g[gno].ws[i].w.yg1, g[gno].ws[i].w.yg2, g[gno].ws[i].t[0].xg1, g[gno].ws[i].t[0].xg2, g[gno].ws[i].t[0].yg1, g[gno].ws[i].t[0].yg2); } get_graph_view(gno, &v); fprintf(pp, "%s view xmin %f\n", embedstr, v.xv1); fprintf(pp, "%s view xmax %f\n", embedstr, v.xv2); fprintf(pp, "%s view ymin %f\n", embedstr, v.yv1); fprintf(pp, "%s view ymax %f\n", embedstr, v.yv2); get_graph_labels(gno, &lab); fprintf(pp, "%s title \"%s\"\n", embedstr, escapequotes(lab.title.s)); fprintf(pp, "%s title font %d\n", embedstr, lab.title.font); fprintf(pp, "%s title size %f\n", embedstr, lab.title.charsize); fprintf(pp, "%s title color %d\n", embedstr, lab.title.color); fprintf(pp, "%s title linewidth %d\n", embedstr, lab.title.linew); fprintf(pp, "%s subtitle \"%s\"\n", embedstr, escapequotes(lab.stitle.s)); fprintf(pp, "%s subtitle font %d\n", embedstr, lab.stitle.font); fprintf(pp, "%s subtitle size %f\n", embedstr, lab.stitle.charsize); fprintf(pp, "%s subtitle color %d\n", embedstr, lab.stitle.color); fprintf(pp, "%s subtitle linewidth %d\n", embedstr, lab.stitle.linew); for (i = 0; i < g[gno].maxplot; i++) { get_graph_plotarr(gno, i, &p); if (isactive_set(gno, i)) { /* setting the type here causes big problems fprintf(pp, "%s s%1d type %s\n", embedstr, i, (char *) set_types(p.type)); */ fprintf(pp, "%s s%1d symbol %d\n", embedstr, i, p.sym); fprintf(pp, "%s s%1d symbol size %f\n", embedstr, i, p.symsize); fprintf(pp, "%s s%1d symbol fill %d\n", embedstr, i, p.symfill); fprintf(pp, "%s s%1d symbol color %d\n", embedstr, i, p.symcolor); fprintf(pp, "%s s%1d symbol linewidth %d\n", embedstr, i, p.symlinew); fprintf(pp, "%s s%1d symbol linestyle %d\n", embedstr, i, p.symlines); fprintf(pp, "%s s%1d symbol center %s\n", embedstr, i, p.symdot ? "true" : "false"); fprintf(pp, "%s s%1d symbol char %d\n", embedstr, i, p.symchar); fprintf(pp, "%s s%1d skip %d\n", embedstr, i, p.symskip); fprintf(pp, "%s s%1d linestyle %d\n", embedstr, i, p.lines); fprintf(pp, "%s s%1d linewidth %d\n", embedstr, i, p.linew); fprintf(pp, "%s s%1d color %d\n", embedstr, i, p.color); fprintf(pp, "%s s%1d fill %d\n", embedstr, i, p.fill); fprintf(pp, "%s s%1d fill with %s\n", embedstr, i, p.fillusing == COLOR ? "color" : "pattern"); fprintf(pp, "%s s%1d fill color %d\n", embedstr, i, p.fillcolor); fprintf(pp, "%s s%1d fill pattern %d\n", embedstr, i, p.fillpattern); switch (p.errbarxy) { case TOP: fprintf(pp, "%s s%1d errorbar type TOP\n", embedstr, i); break; case BOTTOM: fprintf(pp, "%s s%1d errorbar type BOTTOM\n", embedstr, i); break; case LEFT: fprintf(pp, "%s s%1d errorbar type LEFT\n", embedstr, i); break; case RIGHT: fprintf(pp, "%s s%1d errorbar type RIGHT\n", embedstr, i); break; case BOTH: fprintf(pp, "%s s%1d errorbar type BOTH\n", embedstr, i); break; } fprintf(pp, "%s s%1d errorbar length %f\n", embedstr, i, p.errbarper); fprintf(pp, "%s s%1d errorbar linewidth %d\n", embedstr, i, p.errbar_linew); fprintf(pp, "%s s%1d errorbar linestyle %d\n", embedstr, i, p.errbar_lines); fprintf(pp, "%s s%1d errorbar riser %s\n", embedstr, i, p.errbar_riser == ON ? "on" : "off"); fprintf(pp, "%s s%1d errorbar riser linewidth %d\n", embedstr, i, p.errbar_riser_linew); fprintf(pp, "%s s%1d errorbar riser linestyle %d\n", embedstr, i, p.errbar_riser_lines); if (is_hotlinked(gno, i)) { fprintf(pp, "%s s%1d link %s \"%s\"\n", embedstr, i, p.hotsrc == DISK ? "disk" : "pipe", p.hotfile); } fprintf(pp, "%s s%1d comment \"%s\"\n", embedstr, i, p.comments); } } for (i = 0; i < MAXAXES; i++) { switch (i) { case 0: get_graph_tickmarks(gno, &t, X_AXIS); if (t.active == OFF) { fprintf(pp, "%s xaxis off\n", embedstr); continue; } sprintf(buf, "%s xaxis ", embedstr); break; case 1: get_graph_tickmarks(gno, &t, Y_AXIS); if (t.active == OFF) { fprintf(pp, "%s yaxis off\n", embedstr); continue; } sprintf(buf, "%s yaxis ", embedstr); break; case 2: get_graph_tickmarks(gno, &t, ZX_AXIS); if (t.active == OFF) { fprintf(pp, "%s zeroxaxis off\n", embedstr); continue; } sprintf(buf, "%s zeroxaxis ", embedstr); break; case 3: get_graph_tickmarks(gno, &t, ZY_AXIS); if (t.active == OFF) { fprintf(pp, "%s zeroyaxis off\n", embedstr); continue; } sprintf(buf, "%s zeroyaxis ", embedstr); break; } fprintf(pp, "%s tick %s\n", buf, on_or_off(t.active)); fprintf(pp, "%s tick major %.12g\n", buf, t.tmajor); fprintf(pp, "%s tick minor %.12g\n", buf, t.tminor); fprintf(pp, "%s tick offsetx %f\n", buf, t.offsx); fprintf(pp, "%s tick offsety %f\n", buf, t.offsy); /* DEFUNCT fprintf(pp, "%s tick alt %s\n", buf, on_or_off(t.alt)); fprintf(pp, "%s tick min %.12g\n", buf, t.tmin); fprintf(pp, "%s tick max %.12g\n", buf, t.tmax); */ fprintf(pp, "%s label \"%s\"\n", buf, t.label.s); if (t.label_layout == PERP) { fprintf(pp, "%s label layout perp\n", buf); } else { fprintf(pp, "%s label layout para\n", buf); } if (t.label_place == AUTO) { fprintf(pp, "%s label place auto\n", buf); } else { fprintf(pp, "%s label place spec\n", buf); fprintf(pp, "%s label place %f, %f\n", buf, t.label.x, t.label.y); } fprintf(pp, "%s label char size %f\n", buf, t.label.charsize); fprintf(pp, "%s label font %d\n", buf, t.label.font); fprintf(pp, "%s label color %d\n", buf, t.label.color); fprintf(pp, "%s label linewidth %d\n", buf, t.label.linew); fprintf(pp, "%s ticklabel %s\n", buf, on_or_off(t.tl_flag)); if (t.tl_type == AUTO) { fprintf(pp, "%s ticklabel type auto\n", buf); } else { fprintf(pp, "%s ticklabel type spec\n", buf); } fprintf(pp, "%s ticklabel prec %d\n", buf, t.tl_prec); fprintf(pp, "%s ticklabel format %s\n", buf, get_format_types(t.tl_format)); fprintf(pp, "%s ticklabel append \"%s\"\n", buf, t.tl_appstr); fprintf(pp, "%s ticklabel prepend \"%s\"\n", buf, t.tl_prestr); switch (t.tl_layout) { case HORIZONTAL: fprintf(pp, "%s ticklabel layout horizontal\n", buf); break; case VERTICAL: fprintf(pp, "%s ticklabel layout vertical\n", buf); break; case SPEC: fprintf(pp, "%s ticklabel layout spec\n", buf); fprintf(pp, "%s ticklabel angle %d\n", buf, t.tl_angle); break; } fprintf(pp, "%s ticklabel skip %d\n", buf, t.tl_skip); fprintf(pp, "%s ticklabel stagger %d\n", buf, t.tl_staggered); switch (t.tl_op) { case TOP: fprintf(pp, "%s ticklabel op top\n", buf); break; case BOTTOM: fprintf(pp, "%s ticklabel op bottom\n", buf); break; case LEFT: fprintf(pp, "%s ticklabel op left\n", buf); break; case RIGHT: fprintf(pp, "%s ticklabel op right\n", buf); break; case BOTH: fprintf(pp, "%s ticklabel op both\n", buf); break; } switch (t.tl_sign) { case NORMAL: fprintf(pp, "%s ticklabel sign normal\n", buf); break; case ABSOLUTE: fprintf(pp, "%s ticklabel sign absolute\n", buf); break; case NEGATE: fprintf(pp, "%s ticklabel sign negate\n", buf); break; } fprintf(pp, "%s ticklabel start type %s\n", buf, t.tl_starttype == AUTO ? "auto" : "spec"); fprintf(pp, "%s ticklabel start %f\n", buf, t.tl_start); fprintf(pp, "%s ticklabel stop type %s\n", buf, t.tl_stoptype == AUTO ? "auto" : "spec"); fprintf(pp, "%s ticklabel stop %f\n", buf, t.tl_stop); fprintf(pp, "%s ticklabel char size %f\n", buf, t.tl_charsize); fprintf(pp, "%s ticklabel font %d\n", buf, t.tl_font); fprintf(pp, "%s ticklabel color %d\n", buf, t.tl_color); fprintf(pp, "%s ticklabel linewidth %d\n", buf, t.tl_linew); fprintf(pp, "%s tick major %s\n", buf, on_or_off(t.t_flag)); fprintf(pp, "%s tick minor %s\n", buf, on_or_off(t.t_mflag)); fprintf(pp, "%s tick default %d\n", buf, t.t_num); switch (t.t_inout) { case IN: fprintf(pp, "%s tick in\n", buf); break; case OUT: fprintf(pp, "%s tick out\n", buf); break; case BOTH: fprintf(pp, "%s tick both\n", buf); break; } fprintf(pp, "%s tick major color %d\n", buf, t.t_color); fprintf(pp, "%s tick major linewidth %d\n", buf, t.t_linew); fprintf(pp, "%s tick major linestyle %d\n", buf, t.t_lines); fprintf(pp, "%s tick minor color %d\n", buf, t.t_mcolor); fprintf(pp, "%s tick minor linewidth %d\n", buf, t.t_mlinew); fprintf(pp, "%s tick minor linestyle %d\n", buf, t.t_mlines); fprintf(pp, "%s tick log %s\n", buf, on_or_off(t.t_log)); fprintf(pp, "%s tick size %f\n", buf, t.t_size); fprintf(pp, "%s tick minor size %f\n", buf, t.t_msize); fprintf(pp, "%s bar %s\n", buf, on_or_off(t.t_drawbar)); fprintf(pp, "%s bar color %d\n", buf, t.t_drawbarcolor); fprintf(pp, "%s bar linestyle %d\n", buf, t.t_drawbarlines); fprintf(pp, "%s bar linewidth %d\n", buf, t.t_drawbarlinew); fprintf(pp, "%s tick major grid %s\n", buf, on_or_off(t.t_gridflag)); fprintf(pp, "%s tick minor grid %s\n", buf, on_or_off(t.t_mgridflag)); switch (t.t_op) { case TOP: fprintf(pp, "%s tick op top\n", buf); break; case BOTTOM: fprintf(pp, "%s tick op bottom\n", buf); break; case LEFT: fprintf(pp, "%s tick op left\n", buf); break; case RIGHT: fprintf(pp, "%s tick op right\n", buf); break; case BOTH: fprintf(pp, "%s tick op both\n", buf); break; } if (t.t_type == AUTO) { fprintf(pp, "%s tick type auto\n", buf); } else { fprintf(pp, "%s tick type spec\n", buf); } fprintf(pp, "%s tick spec %d\n", buf, t.t_spec); for (j = 0; j < t.t_spec; j++) { fprintf(pp, "%s tick %d, %g\n", buf, j, t.t_specloc[j]); fprintf(pp, "%s ticklabel %d, \"%s\"\n", buf, j, t.t_speclab[j].s); } } get_graph_legend(gno, &leg); fprintf(pp, "%s legend %s\n", embedstr, on_or_off(leg.active)); fprintf(pp, "%s legend loctype %s\n", embedstr, w_or_v(leg.loctype)); fprintf(pp, "%s legend layout %d\n", embedstr, leg.layout); fprintf(pp, "%s legend vgap %d\n", embedstr, leg.vgap); fprintf(pp, "%s legend hgap %d\n", embedstr, leg.hgap); fprintf(pp, "%s legend length %d\n", embedstr, leg.len); fprintf(pp, "%s legend box %s\n", embedstr, on_or_off(leg.box)); fprintf(pp, "%s legend box fill %s\n", embedstr, on_or_off(leg.box)); fprintf(pp, "%s legend box fill with %s\n", embedstr, leg.boxfillusing == COLOR ? "color" : "pattern"); fprintf(pp, "%s legend box fill color %d\n", embedstr, leg.boxfillcolor); fprintf(pp, "%s legend box fill pattern %d\n", embedstr, leg.boxfillpat); fprintf(pp, "%s legend box color %d\n", embedstr, leg.boxlcolor); fprintf(pp, "%s legend box linewidth %d\n", embedstr, leg.boxlinew); fprintf(pp, "%s legend box linestyle %d\n", embedstr, leg.boxlines); fprintf(pp, "%s legend x1 %.12g\n", embedstr, leg.legx); fprintf(pp, "%s legend y1 %.12g\n", embedstr, leg.legy); fprintf(pp, "%s legend font %d\n", embedstr, leg.font); fprintf(pp, "%s legend char size %f\n", embedstr, leg.charsize); fprintf(pp, "%s legend linestyle %d\n", embedstr, leg.lines); fprintf(pp, "%s legend linewidth %d\n", embedstr, leg.linew); fprintf(pp, "%s legend color %d\n", embedstr, leg.color); for (i = 0; i < maxplot; i++) { if (isactive_set(gno, i)) { if (strlen(g[gno].p[i].lstr)) { fprintf(pp, "%s legend string %d \"%s\"\n", embedstr, i, escapequotes(g[gno].p[i].lstr)); } } } get_graph_framep(gno, &f); fprintf(pp, "%s frame %s\n", embedstr, on_or_off(f.active)); fprintf(pp, "%s frame type %d\n", embedstr, f.type); fprintf(pp, "%s frame linestyle %d\n", embedstr, f.lines); fprintf(pp, "%s frame linewidth %d\n", embedstr, f.linew); fprintf(pp, "%s frame color %d\n", embedstr, f.color); fprintf(pp, "%s frame fill %s\n", embedstr, on_or_off(f.fillbg)); fprintf(pp, "%s frame background color %d\n", embedstr, f.bgcolor); } } } static void put_annotation(int gno, FILE * pp, int embed) { int i; boxtype b; linetype l; ellipsetype e; plotstr s; char embedstr[2]; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } for (i = 0; i < maxboxes; i++) { get_graph_box(i, &b); if (b.active == ON) { fprintf(pp, "%swith box\n", embedstr); fprintf(pp, "%s box on\n", embedstr); fprintf(pp, "%s box loctype %s\n", embedstr, w_or_v(b.loctype)); if (b.loctype == WORLD) { fprintf(pp, "%s box g%1d\n", embedstr, b.gno); } fprintf(pp, "%s box %.12g, %.12g, %.12g, %.12g\n", embedstr, b.x1, b.y1, b.x2, b.y2); fprintf(pp, "%s box linestyle %d\n", embedstr, b.lines); fprintf(pp, "%s box linewidth %d\n", embedstr, b.linew); fprintf(pp, "%s box color %d\n", embedstr, b.color); switch (b.fill) { case NONE: fprintf(pp, "%s box fill none\n", embedstr); break; case COLOR: fprintf(pp, "%s box fill color\n", embedstr); break; case PATTERN: fprintf(pp, "%s box fill pattern\n", embedstr); break; } fprintf(pp, "%s box fill color %d\n", embedstr, b.fillcolor); fprintf(pp, "%s box fill pattern %d\n", embedstr, b.fillpattern); fprintf(pp, "%sbox def\n", embedstr); } } for (i = 0; i < maxellipses; i++) { get_graph_ellipse(i, &e); if (e.active == ON) { fprintf(pp, "%swith ellipse\n", embedstr); fprintf(pp, "%s ellipse on\n", embedstr); fprintf(pp, "%s ellipse loctype %s\n", embedstr, w_or_v(e.loctype)); if (e.loctype == WORLD) { fprintf(pp, "%s ellipse g%1d\n", embedstr, e.gno); } fprintf(pp, "%s ellipse %.12g, %.12g, %.12g, %.12g\n", embedstr, e.x1, e.y1, e.x2, e.y2); fprintf(pp, "%s ellipse linestyle %d\n", embedstr, e.lines); fprintf(pp, "%s ellipse linewidth %d\n", embedstr, e.linew); fprintf(pp, "%s ellipse color %d\n", embedstr, e.color); switch (e.fill) { case NONE: fprintf(pp, "%s ellipse fill none\n", embedstr); break; case COLOR: fprintf(pp, "%s ellipse fill color\n", embedstr); break; case PATTERN: fprintf(pp, "%s ellipse fill pattern\n", embedstr); break; } fprintf(pp, "%s ellipse fill color %d\n", embedstr, e.fillcolor); fprintf(pp, "%s ellipse fill pattern %d\n", embedstr, e.fillpattern); fprintf(pp, "%sellipse def\n", embedstr); } } for (i = 0; i < maxlines; i++) { get_graph_line(i, &l); if (l.active == ON) { fprintf(pp, "%swith line\n", embedstr); fprintf(pp, "%s line on\n", embedstr); fprintf(pp, "%s line loctype %s\n", embedstr, w_or_v(l.loctype)); if (l.loctype == WORLD) { fprintf(pp, "%s line g%1d\n", embedstr, l.gno); } fprintf(pp, "%s line %.12g, %.12g, %.12g, %.12g\n", embedstr, l.x1, l.y1, l.x2, l.y2); fprintf(pp, "%s line linewidth %d\n", embedstr, l.linew); fprintf(pp, "%s line linestyle %d\n", embedstr, l.lines); fprintf(pp, "%s line color %d\n", embedstr, l.color); fprintf(pp, "%s line arrow %d\n", embedstr, l.arrow); fprintf(pp, "%s line arrow size %f\n", embedstr, l.asize); fprintf(pp, "%s line arrow type %d\n", embedstr, l.atype); fprintf(pp, "%sline def\n", embedstr); } } for (i = 0; i < maxstr; i++) { get_graph_string(i, &s); if (s.active == ON && s.s[0]) { fprintf(pp, "%swith string\n", embedstr); fprintf(pp, "%s string on\n", embedstr); fprintf(pp, "%s string loctype %s\n", embedstr, w_or_v(s.loctype)); if (s.loctype == WORLD) { fprintf(pp, "%s string g%1d\n", embedstr, s.gno); } fprintf(pp, "%s string %.12g, %.12g\n", embedstr, s.x, s.y); fprintf(pp, "%s string linewidth %d\n", embedstr, s.linew); fprintf(pp, "%s string color %d\n", embedstr, s.color); fprintf(pp, "%s string rot %d\n", embedstr, s.rot); fprintf(pp, "%s string font %d\n", embedstr, s.font); fprintf(pp, "%s string just %d\n", embedstr, s.just); fprintf(pp, "%s string char size %f\n", embedstr, s.charsize); fprintf(pp, "%sstring def \"%s\"\n", embedstr, escapequotes(s.s)); } } } static void put_region(FILE * pp, int embed) { int i, j; char embedstr[2]; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } for (i = 0; i < MAXREGION; i++) { if (rg[i].active == ON) { fprintf(pp, "%sr%1d ON\n", embedstr, i); switch (rg[i].type) { case ABOVE: fprintf(pp, "%sr%1d type above\n", embedstr, i); break; case BELOW: fprintf(pp, "%sr%1d type below\n", embedstr, i); break; case LEFT: fprintf(pp, "%sr%1d type left\n", embedstr, i); break; case RIGHT: fprintf(pp, "%sr%1d type right\n", embedstr, i); break; case POLYI: fprintf(pp, "%sr%1d type polyi\n", embedstr, i); break; case POLYO: fprintf(pp, "%sr%1d type polyo\n", embedstr, i); break; } fprintf(pp, "%sr%1d linestyle %d\n", embedstr, i, rg[i].lines); fprintf(pp, "%sr%1d linewidth %d\n", embedstr, i, rg[i].linew); fprintf(pp, "%sr%1d color %d\n", embedstr, i, rg[i].color); if (rg[i].type != POLYI && rg[i].type != POLYO) { fprintf(pp, "%sr%1d line %.12g, %.12g, %.12g, %.12g\n", embedstr, i, rg[i].x1, rg[i].y1, rg[i].x2, rg[i].y2); } else { if (rg[i].x != NULL) { for (j = 0; j < rg[i].n; j++) { fprintf(pp, "%sr%1d xy %.12g, %.12g\n", embedstr, i, rg[i].x[j], rg[i].y[j]); } } } for (j = 0; j < maxgraph; j++) { if (rg[i].linkto[j] == TRUE) { fprintf(pp, "%slink r%1d to g%1d\n", embedstr, i, j); } } } } } grace-5.1.23/grconvert/Makefile0000644000076500001440000000163207505061045016105 0ustar fnevgenyusers##################################################### # Makefile for grconvert # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) PROG = grconvert$(EXE) SRCS = grconvert.c defaults.c readbin.c writeasc.c util.c OBJS = grconvert$(O) defaults$(O) readbin$(O) writeasc$(O) util$(O) CFLAGS = $(CFLAGS0) -I$(TOP) -I. $(CPPFLAGS) LIBS = $(XDR_LIB) $(NOGUI_LIBS) all : $(PROG) $(PROG) : $(OBJS) $(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS) $(OBJS) : grconvert.h tests : dummy links : dummy clean : $(RM) $(OBJS) distclean : $(RM) $(PROG) $(OBJS) devclean : $(RM) $(PROG) $(OBJS) install : $(PROG) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/bin $(INSTALL_PROGRAM) -s $(PROG) $(DESTDIR)$(GRACE_HOME)/bin/$(PROG) dummy : grace-5.1.23/grconvert/readbin.c0000644000076500001440000007457206674026626016246 0ustar fnevgenyusers#include #include #include #include /* * for XDR */ #ifndef VMS # include #else # ifndef __ALPHA # define _XOPEN_SOURCE_EXTENDED 1 # endif # ifdef MULTINET # include # define DONT_DECLARE_MALLOC # include "multinet_root:[multinet.include.rpc]rpc.h" # else # include # endif #endif #include "grconvert.h" static XDR xdrs; #define BADMAGIC 999999 #define BADVERSION 999998 /* * Function prototypes */ int read_char(char *d, int n, FILE * fout); int read_int(int *d, int n, FILE * fout); int read_double(double *d, int n, FILE * fin); int read_charstr(char *d, FILE * fout); int read_float(float *d, int n, FILE * fout); int read_short(short *d, int n, FILE * fout); static int read_velocityp(velocityp * d, FILE * fin); static int read_world(world * d, FILE * fin); static int read_view(view * d, FILE * fin); static int read_world_stack(world_stack * d, FILE * fin); static int read_labels(labels * d, FILE * fin); static int read_plotarr(plotarr * d, FILE * fin); static int read_tickmarks(tickmarks * d, FILE * fin); static int read_legend(legend * d, FILE * fin); static int read_framep(framep * d, FILE * fin); static int read_BoxPlot(BoxPlot * d, FILE * fin); int replace_xdr_short( short *i ); /* * Read type boxtype */ int read_boxtype(boxtype * d, FILE * fin) { int err = 0; short magic, version, testmagic = 20, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->loctype), 1, fin))) return err; if ((err = read_int(&(d->gno), 1, fin))) return err; if ((err = read_double(&(d->x1), 1, fin))) return err; if ((err = read_double(&(d->y1), 1, fin))) return err; if ((err = read_double(&(d->x2), 1, fin))) return err; if ((err = read_double(&(d->y2), 1, fin))) return err; if ((err = read_int(&(d->lines), 1, fin))) return err; if ((err = read_int(&(d->linew), 1, fin))) return err; if ((err = read_int(&(d->color), 1, fin))) return err; if ((err = read_int(&(d->fill), 1, fin))) return err; if ((err = read_int(&(d->fillcolor), 1, fin))) return err; if ((err = read_int(&(d->fillpattern), 1, fin))) return err; return err; } /* * Read type ellipsetype */ int read_ellipsetype(ellipsetype * d, FILE * fin) { int err = 0; short magic, version, testmagic = 41, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) { /* try to recover so that older saves will be compatible */ replace_xdr_short( &magic ); return BADMAGIC; } if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->loctype), 1, fin))) return err; if ((err = read_int(&(d->gno), 1, fin))) return err; if ((err = read_double(&(d->x1), 1, fin))) return err; if ((err = read_double(&(d->y1), 1, fin))) return err; if ((err = read_double(&(d->x2), 1, fin))) return err; if ((err = read_double(&(d->y2), 1, fin))) return err; if ((err = read_int(&(d->lines), 1, fin))) return err; if ((err = read_int(&(d->linew), 1, fin))) return err; if ((err = read_int(&(d->color), 1, fin))) return err; if ((err = read_int(&(d->fill), 1, fin))) return err; if ((err = read_int(&(d->fillcolor), 1, fin))) return err; if ((err = read_int(&(d->fillpattern), 1, fin))) return err; return err; } /* * Read type linetype */ int read_linetype(linetype * d, FILE * fin) { int err = 0; short magic, version, testmagic = 21, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->loctype), 1, fin))) return err; if ((err = read_int(&(d->gno), 1, fin))) return err; if ((err = read_double(&(d->x1), 1, fin))) return err; if ((err = read_double(&(d->y1), 1, fin))) return err; if ((err = read_double(&(d->x2), 1, fin))) return err; if ((err = read_double(&(d->y2), 1, fin))) return err; if ((err = read_int(&(d->lines), 1, fin))) return err; if ((err = read_int(&(d->linew), 1, fin))) return err; if ((err = read_int(&(d->color), 1, fin))) return err; if ((err = read_int(&(d->arrow), 1, fin))) return err; if ((err = read_int(&(d->atype), 1, fin))) return err; if ((err = read_double(&(d->asize), 1, fin))) return err; return err; } /* * Read type plotstr */ int read_plotstr(plotstr * d, FILE * fin) { int i, err = 0; short magic, version, testmagic = 22, testversion = 0; if ((err = read_short(&magic, 1, fin))) return 1; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return 2; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return 3; if ((err = read_int(&(d->loctype), 1, fin))) return 4; if ((err = read_int(&(d->gno), 1, fin))) return 5; if ((err = read_double(&(d->x), 1, fin))) return 6; if ((err = read_double(&(d->y), 1, fin))) return 7; if ((err = read_int(&(d->lines), 1, fin))) return 8; if ((err = read_int(&(d->linew), 1, fin))) return 9; if ((err = read_int(&(d->color), 1, fin))) return 10; if ((err = read_int(&(d->rot), 1, fin))) return 11; if ((err = read_int(&(d->font), 1, fin))) return 12; if ((err = read_int(&(d->just), 1, fin))) return 13; if ((err = read_double(&(d->charsize), 1, fin))) return 14; if ((err = read_int(&i, 1, fin))) return 15; if (i <= 0) { err = -1; return 0; } /* if (d->s != NULL) { free(d->s); } else { d->s = (char *) malloc(i * sizeof(char)); } */ d->s = (char *) malloc(i * sizeof(char)); if ((err = read_char(d->s, i, fin))) return 16; return err; } /* * Read type velocityp */ static int read_velocityp(velocityp * d, FILE * fin) { int err = 0; short magic, version, testmagic = 25, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->type), 1, fin))) return err; if ((err = read_int(&(d->color), 1, fin))) return err; if ((err = read_int(&(d->lines), 1, fin))) return err; if ((err = read_int(&(d->linew), 1, fin))) return err; if ((err = read_int(&(d->arrowtype), 1, fin))) return err; if ((err = read_int(&(d->loctype), 1, fin))) return err; if ((err = read_double(&(d->velx), 1, fin))) return err; if ((err = read_double(&(d->vely), 1, fin))) return err; if ((err = read_double(&(d->vscale), 1, fin))) return err; if ((err = read_int(&(d->units), 1, fin))) return err; if ((err = read_double(&(d->userlength), 1, fin))) return err; if ((err = read_plotstr(&(d->vstr), fin))) return err; return err; } /* * Read type world */ static int read_world(world * d, FILE * fin) { int err = 0; short magic, version, testmagic = 26, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_double(&(d->xg1), 1, fin))) return err; if ((err = read_double(&(d->xg2), 1, fin))) return err; if ((err = read_double(&(d->yg1), 1, fin))) return err; if ((err = read_double(&(d->yg2), 1, fin))) return err; return err; } /* * Read type view */ static int read_view(view * d, FILE * fin) { int err = 0; short magic, version, testmagic = 27, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_double(&(d->xv1), 1, fin))) return err; if ((err = read_double(&(d->xv2), 1, fin))) return err; if ((err = read_double(&(d->yv1), 1, fin))) return err; if ((err = read_double(&(d->yv2), 1, fin))) return err; return err; } /* * Read type world_stack */ static int read_world_stack(world_stack * d, FILE * fin) { int i, err = 0; short magic, version, testmagic = 28, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_world(&(d->w), fin))) return err; for (i = 0; i < 3; i++) { if ((err = read_world(&(d->t[i]), fin))) return err; } return err; } /* * Read type labels */ static int read_labels(labels * d, FILE * fin) { int err = 0; short magic, version, testmagic = 29, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_plotstr(&(d->title), fin))) return err; if ((err = read_plotstr(&(d->stitle), fin))) return err; return err; } /* * Read type plotarr */ static int read_plotarr(plotarr * d, FILE * fin) { char buf[512]; int i, cnt, ind, err = 0; short magic, version, testmagic = 33, testversion = 0; if ((err = read_short(&magic, 1, fin))) return 1; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return 2; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return 3; if ((err = read_int(&(d->type), 1, fin))) return 4; if ((err = read_int(&(d->deact), 1, fin))) return 5; if ((err = read_int(&(d->len), 1, fin))) return 6; if ((err = read_double(&(d->missing), 1, fin))) return 7; if ((err = read_int(&cnt, 1, fin))) return 8; for (i = 0; i < cnt; i++) { if ((err = read_int(&ind, 1, fin))) return 9; d->ex[ind] = (double *) malloc(d->len * sizeof(double)); if ((err = read_double(d->ex[ind], d->len, fin))) return 10; } if (d->type == XYSTRING) { d->s = (char **) malloc(d->len * sizeof(char *)); if (d->s == NULL) { return 101; } for (i=0;ilen;i++) { if ((err = read_charstr(buf, fin))) return 102; d->s[i] = (char *) malloc((strlen(buf) + 1) * sizeof(char)); if (d->s[i] == NULL) { return 101; } strcpy(d->s[i], buf); } } if ((err = read_double(&(d->xmin), 1, fin))) return 11; if ((err = read_double(&(d->xmax), 1, fin))) return 12; if ((err = read_double(&(d->ymin), 1, fin))) return 13; if ((err = read_double(&(d->ymax), 1, fin))) return 14; if ((err = read_int(&(d->sym), 1, fin))) return 15; if ((err = read_char(&(d->symchar), 1, fin))) return 16; if ((err = read_int(&(d->symskip), 1, fin))) return 17; if ((err = read_int(&(d->symfill), 1, fin))) return 18; if ((err = read_int(&(d->symdot), 1, fin))) return 19; if ((err = read_int(&(d->symlines), 1, fin))) return 20; if ((err = read_int(&(d->symlinew), 1, fin))) return 21; if ((err = read_int(&(d->symcolor), 1, fin))) return 22; if ((err = read_double(&(d->symsize), 1, fin))) return 23; if ((err = read_int(&(d->avgflag), 1, fin))) return 24; if ((err = read_int(&(d->avgstdflag), 1, fin))) return 25; if ((err = read_int(&(d->avg2stdflag), 1, fin))) return 26; if ((err = read_int(&(d->avg3stdflag), 1, fin))) return 27; if ((err = read_int(&(d->avgallflag), 1, fin))) return 28; if ((err = read_int(&(d->avgvalflag), 1, fin))) return 29; if ((err = read_int(&(d->harmonicflag), 1, fin))) return 30; if ((err = read_int(&(d->geometricflag), 1, fin))) return 31; if ((err = read_int(&(d->font), 1, fin))) return 32; if ((err = read_int(&(d->format), 1, fin))) return 33; if ((err = read_int(&(d->prec), 1, fin))) return 34; if ((err = read_int(&(d->just), 1, fin))) return 35; if ((err = read_int(&(d->where), 1, fin))) return 36; if ((err = read_double(&(d->valsize), 1, fin))) return 37; if ((err = read_int(&(d->lines), 1, fin))) return 38; if ((err = read_int(&(d->linew), 1, fin))) return 39; if ((err = read_int(&(d->color), 1, fin))) return 40; if ((err = read_int(&(d->lineskip), 1, fin))) return 41; if ((err = read_int(&(d->fill), 1, fin))) return 42; if ((err = read_int(&(d->fillusing), 1, fin))) return 43; if ((err = read_int(&(d->fillcolor), 1, fin))) return 44; if ((err = read_int(&(d->fillpattern), 1, fin))) return 45; if ((err = read_int(&(d->errbar), 1, fin))) return 46; if ((err = read_int(&(d->errbarxy), 1, fin))) return 47; if ((err = read_int(&(d->errbar_linew), 1, fin))) return 48; if ((err = read_int(&(d->errbar_lines), 1, fin))) return 49; if ((err = read_int(&(d->errbar_riser), 1, fin))) return 50; if ((err = read_int(&(d->errbar_riser_linew), 1, fin))) return 51; if ((err = read_int(&(d->errbar_riser_lines), 1, fin))) return 52; if ((err = read_double(&(d->errbarper), 1, fin))) return 53; if ((err = read_double(&(d->hilowper), 1, fin))) return 54; if ((err = read_int(&(d->density_plot), 1, fin))) return 55; if ((err = read_double(&(d->zmin), 1, fin))) return 56; if ((err = read_double(&(d->zmax), 1, fin))) return 57; if ((err = read_charstr(d->comments, fin))) return 58; if ((err = read_charstr(d->lstr, fin))) return 58; if ((err = read_int(&(d->hotlink), 1, fin))) return 59; if ((err = read_int(&(d->hotsrc), 1, fin))) return 60; if ((err = read_charstr(d->hotfile, fin))) return 61; if ((err = read_double(d->emin, 6, fin))) return 62; if ((err = read_double(d->emax, 6, fin))) return 63; if ((err = read_int(d->imin, 6, fin))) return 64; if ((err = read_int(d->imax, 6, fin))) return 65; /* TODO for (i = 0; i < 0; i++) { if ((err = read_Regression(d->r, fin))) return err; } TODO for (i = 0; i < 0; i++) { if ((err = read_Spline(d->spl, fin))) return err; } */ return err; } /* * Read type tickmarks */ static int read_tickmarks(tickmarks * d, FILE * fin) { int i, cnt, err = 0; short magic, version, testmagic = 34, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->axis), 1, fin))) return err; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->alt), 1, fin))) return err; if ((err = read_double(&(d->tmin), 1, fin))) return err; if ((err = read_double(&(d->tmax), 1, fin))) return err; if ((err = read_double(&(d->tmajor), 1, fin))) return err; if ((err = read_double(&(d->tminor), 1, fin))) return err; if ((err = read_double(&(d->offsx), 1, fin))) return err; if ((err = read_double(&(d->offsy), 1, fin))) return err; if ((err = read_plotstr(&(d->label), fin))) return err; if ((err = read_int(&(d->label_layout), 1, fin))) return err; if ((err = read_int(&(d->label_place), 1, fin))) return err; if ((err = read_int(&(d->tl_flag), 1, fin))) return err; if ((err = read_int(&(d->tl_type), 1, fin))) return err; if ((err = read_int(&(d->tl_layout), 1, fin))) return err; if ((err = read_int(&(d->tl_angle), 1, fin))) return err; if ((err = read_int(&(d->tl_sign), 1, fin))) return err; if ((err = read_int(&(d->tl_just), 1, fin))) return err; if ((err = read_int(&(d->tl_prec), 1, fin))) return err; if ((err = read_int(&(d->tl_format), 1, fin))) return err; if ((err = read_int(&(d->tl_skip), 1, fin))) return err; if ((err = read_int(&(d->tl_staggered), 1, fin))) return err; if ((err = read_int(&(d->tl_starttype), 1, fin))) return err; if ((err = read_int(&(d->tl_stoptype), 1, fin))) return err; if ((err = read_double(&(d->tl_start), 1, fin))) return err; if ((err = read_double(&(d->tl_stop), 1, fin))) return err; if ((err = read_int(&(d->tl_op), 1, fin))) return err; if ((err = read_double(&(d->tl_vgap), 1, fin))) return err; if ((err = read_double(&(d->tl_hgap), 1, fin))) return err; if ((err = read_int(&(d->tl_font), 1, fin))) return err; if ((err = read_double(&(d->tl_charsize), 1, fin))) return err; if ((err = read_int(&(d->tl_color), 1, fin))) return err; if ((err = read_int(&(d->tl_linew), 1, fin))) return err; if ((err = read_charstr(d->tl_appstr, fin))) return err; if ((err = read_charstr(d->tl_prestr, fin))) return err; if ((err = read_int(&(d->t_type), 1, fin))) return err; if ((err = read_int(&(d->t_flag), 1, fin))) return err; if ((err = read_int(&(d->t_mflag), 1, fin))) return err; if ((err = read_int(&(d->t_integer), 1, fin))) return err; if ((err = read_int(&(d->t_num), 1, fin))) return err; if ((err = read_int(&(d->t_inout), 1, fin))) return err; if ((err = read_int(&(d->t_log), 1, fin))) return err; if ((err = read_int(&(d->t_op), 1, fin))) return err; if ((err = read_int(&(d->t_color), 1, fin))) return err; if ((err = read_int(&(d->t_lines), 1, fin))) return err; if ((err = read_int(&(d->t_linew), 1, fin))) return err; if ((err = read_int(&(d->t_mcolor), 1, fin))) return err; if ((err = read_int(&(d->t_mlines), 1, fin))) return err; if ((err = read_int(&(d->t_mlinew), 1, fin))) return err; if ((err = read_double(&(d->t_size), 1, fin))) return err; if ((err = read_double(&(d->t_msize), 1, fin))) return err; if ((err = read_int(&(d->t_drawbar), 1, fin))) return err; if ((err = read_int(&(d->t_drawbarcolor), 1, fin))) return err; if ((err = read_int(&(d->t_drawbarlines), 1, fin))) return err; if ((err = read_int(&(d->t_drawbarlinew), 1, fin))) return err; if ((err = read_int(&(d->t_gridflag), 1, fin))) return err; if ((err = read_int(&(d->t_mgridflag), 1, fin))) return err; if ((err = read_int(&(d->t_spec), 1, fin))) return err; if ((err = read_int(&cnt, 1, fin))) return err; if ((err = read_double(d->t_specloc, cnt, fin))) return err; for (i = 0; i < cnt; i++) { if ((err = read_plotstr(&(d->t_speclab[i]), fin))) return err; } if ((err = read_int(&(d->spec_font), 1, fin))) return err; if ((err = read_double(&(d->spec_charsize), 1, fin))) return err; if ((err = read_int(&(d->spec_color), 1, fin))) return err; if ((err = read_int(&(d->spec_linew), 1, fin))) return err; return err; } /* * Read type legend */ static int read_legend(legend * d, FILE * fin) { int err = 0; short magic, version, testmagic = 36, testversion = 0; if ((err = read_short(&magic, 1, fin))) return 1; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return 2; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return 3; if ((err = read_int(&(d->loctype), 1, fin))) return 4; if ((err = read_int(&(d->layout), 1, fin))) return 5; if ((err = read_int(&(d->vgap), 1, fin))) return 6; if ((err = read_int(&(d->hgap), 1, fin))) return err; if ((err = read_int(&(d->len), 1, fin))) return 7; if ((err = read_int(&(d->box), 1, fin))) return 8; if ((err = read_double(&(d->legx), 1, fin))) return 9; if ((err = read_double(&(d->legy), 1, fin))) return 10; if ((err = read_int(&(d->font), 1, fin))) return 11; if ((err = read_double(&(d->charsize), 1, fin))) return 12; if ((err = read_int(&(d->color), 1, fin))) return 13; if ((err = read_int(&(d->linew), 1, fin))) return 14; if ((err = read_int(&(d->lines), 1, fin))) return 15; if ((err = read_int(&(d->boxfill), 1, fin))) return 16; if ((err = read_int(&(d->boxfillusing), 1, fin))) return 17; if ((err = read_int(&(d->boxfillcolor), 1, fin))) return 18; if ((err = read_int(&(d->boxfillpat), 1, fin))) return 19; if ((err = read_int(&(d->boxlcolor), 1, fin))) return 20; if ((err = read_int(&(d->boxlinew), 1, fin))) return 21; if ((err = read_int(&(d->boxlines), 1, fin))) return 22; return err; } /* * Read type framep */ static int read_framep(framep * d, FILE * fin) { int err = 0; short magic, version, testmagic = 38, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->type), 1, fin))) return err; if ((err = read_int(&(d->color), 1, fin))) return err; if ((err = read_int(&(d->lines), 1, fin))) return err; if ((err = read_int(&(d->linew), 1, fin))) return err; if ((err = read_int(&(d->fillbg), 1, fin))) return err; if ((err = read_int(&(d->bgcolor), 1, fin))) return err; return err; } /* * Read type BoxPlot */ static int read_BoxPlot(BoxPlot * d, FILE * fin) { int err = 0; short magic, version, testmagic = 39, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_double(&(d->il), 1, fin))) return err; if ((err = read_double(&(d->iu), 1, fin))) return err; if ((err = read_double(&(d->ol), 1, fin))) return err; if ((err = read_double(&(d->ou), 1, fin))) return err; if ((err = read_int(&(d->nthresh), 1, fin))) return err; if ((err = read_int(&(d->outliers), 1, fin))) return err; if ((err = read_int(&(d->wtype), 1, fin))) return err; if ((err = read_double(&(d->boxwid), 1, fin))) return err; return err; } /* * Read type graph */ int read_graph(graph * d, FILE * fin) { int i, cnt, ind, err = 0; short magic, version, testmagic = 40, testversion = 0; if ((err = read_short(&magic, 1, fin))) return err; if (magic != testmagic) return BADMAGIC; if ((err = read_short(&version, 1, fin))) return err; if (version != testversion) return BADVERSION; if ((err = read_int(&(d->active), 1, fin))) return err; if ((err = read_int(&(d->hidden), 1, fin))) return err; if ((err = read_int(&(d->label), 1, fin))) return err; if ((err = read_int(&(d->type), 1, fin))) return err; if ((err = read_int(&(d->noauto_world), 1, fin))) return err; if ((err = read_int(&(d->noauto_tics), 1, fin))) return err; if ((err = read_int(&(d->auto_type), 1, fin))) return err; if ((err = read_int(&(d->parmsread), 1, fin))) return err; /* parmsread must be assumed to be true when read from a binary file */ /* (we don't erase the above 2 lines for the sake of compatibility) */ d->parmsread = TRUE; if ((err = read_int(&(d->revx), 1, fin))) return err; if ((err = read_int(&(d->revy), 1, fin))) return err; if ((err = read_int(&(d->maxplot), 1, fin))) return err; if ((err = read_int(&cnt, 1, fin))) return err; for (i = 0; i < cnt; i++) { if ((err = read_int(&ind, 1, fin))) return err; if ((err = read_plotarr(&(d->p[ind]), fin))) { return err; } } if ((err = read_legend(&(d->l), fin))) { return err; } if ((err = read_world(&(d->w), fin))) return err; if ((err = read_view(&(d->v), fin))) return err; if ((err = read_world(&(d->rt), fin))) return err; if ((err = read_labels(&(d->labs), fin))) return err; for (i = 0; i < 4; i++) { if ((err = read_tickmarks(&(d->t[i]), fin))) return err; } if ((err = read_framep(&(d->f), fin))) return err; if ((err = read_int(&(d->pointset), 1, fin))) return err; if ((err = read_int(&(d->pt_type), 1, fin))) return err; if ((err = read_double(&(d->dsx), 1, fin))) return err; if ((err = read_double(&(d->dsy), 1, fin))) return err; if ((err = read_int(&(d->fx), 1, fin))) return err; if ((err = read_int(&(d->fy), 1, fin))) return err; if ((err = read_int(&(d->px), 1, fin))) return err; if ((err = read_int(&(d->py), 1, fin))) return err; if ((err = read_int(&(d->ws_top), 1, fin))) return err; for (i = 0; i < d->ws_top; i++) { if ((err = read_world_stack(&(d->ws[i]), fin))) return err; } /* add this for compatability issues */ if( d->ws_top == 0 ) d->ws_top = 1; if ((err = read_int(&(d->curw), 1, fin))) return err; if ((err = read_velocityp(&(d->vp), fin))) return err; if ((err = read_BoxPlot(&(d->bp), fin))) return err; return err; } void open_xdr(FILE *fp, int rw) /* rw write = 0, read = 1 */ { if (rw == 0) { xdrstdio_create(&xdrs, fp, XDR_ENCODE); } else { xdrstdio_create(&xdrs, fp, XDR_DECODE); } } void close_xdr(void) { /* xdr_destroy(&xdrs); */ } int read_double(double *d, int n, FILE * fp) { int err; if (n <= 0) return 0; err = xdr_vector(&xdrs, (char *) d, n, sizeof(double), (xdrproc_t) xdr_double); return err ? 0 : err; } int read_int(int *d, int n, FILE * fp) { int err; if (n <= 0) return 0; err = xdr_vector(&xdrs, (char *) d, n, sizeof(int), (xdrproc_t) xdr_int); return err ? 0 : err; } int read_charstr(char *d, FILE * fp) { int err, n; n = strlen(d) + 1; xdr_int(&xdrs, &n); err = xdr_vector(&xdrs, (char *) d, n, sizeof(char), (xdrproc_t) xdr_char); return err ? 0 : err; } int read_char(char *d, int n, FILE * fp) { int err; if (n <= 0) return 0; err = xdr_vector(&xdrs, (char *) d, n, sizeof(char), (xdrproc_t) xdr_char); return err ? 0 : err; } int read_short(short *d, int n, FILE * fp) { int err; if (n <= 0) return 0; err = xdr_vector(&xdrs, (char *) d, n, sizeof(short), (xdrproc_t) xdr_short); return err ? 0 : err; } int read_float(float *d, int n, FILE * fp) { int err; if (n <= 0) return 0; err = xdr_vector(&xdrs, (char *) d, n, sizeof(float), (xdrproc_t) xdr_float); return err ? 0 : err; } int replace_xdr_int( int *i ) { int err; xdr_setpos( &xdrs, xdr_getpos( &xdrs )-4 ); err = xdr_vector(&xdrs, (char *) i, 1, sizeof(int), (xdrproc_t) xdr_int); xdr_setpos( &xdrs, xdr_getpos( &xdrs )-4 ); return err ? 0: err; } int replace_xdr_short( short *i ) { int err; xdr_setpos( &xdrs, xdr_getpos( &xdrs )-4 ); err = xdr_vector(&xdrs, (char *) i, 1, sizeof(short), (xdrproc_t) xdr_short); xdr_setpos( &xdrs, xdr_getpos( &xdrs )-4 ); return err ? 0: err; } /* * write state information */ #define PARMS_MAGIC 1002003 #define HEADERLENGTH 64 int is_state_save(char *fname) { int magic, clen, slen, ilen, flen, dlen; char buf[256]; char ver[64], ord[64], math[64], name[64]; FILE *fp; if ((fp = fopen(fname, "r")) == NULL) { return 0; } open_xdr(fp, 1); /* open XDR stream */ read_char(buf, HEADERLENGTH, fp); buf[HEADERLENGTH - 1] = 0; sscanf(buf, "%d %s %s %s %s %d %d %d %d %d", &magic, ver, ord, math, name, &clen, &slen, &ilen, &flen, &dlen); close_xdr(); fclose(fp); return (magic == PARMS_MAGIC) ? 1 : 0; } /* * getbinary - read in binary project file * * return: 0 - o.k. * 1 - nothing read in * 2 - partial read */ int getbinary(int gno, char *fname, int imbed) { int ind, i, k, cnt, ng, magic; int clen, slen, ilen, flen, dlen, nblocks; char buf[256]; char ver[64], ord[64], math[64], name[64]; FILE *pp; if ((pp = fopen(fname, "rb")) == NULL) { sprintf(buf, "Can't open project file %s", fname); errmsg(buf); return 1; } strcpy( docname, fname ); open_xdr(pp, 1); /* open XDR stream */ read_char(buf, HEADERLENGTH, pp); buf[HEADERLENGTH - 1] = 0; sscanf(buf, "%d %s %s %s %s %d %d %d %d %d", &magic, ver, ord, math, name, &clen, &slen, &ilen, &flen, &dlen); if (magic != PARMS_MAGIC) { errmsg("Bad magic in project file"); fclose(pp); return 1; } read_int(&cnt, 1, pp); for (k = 0; k < cnt; k++) { read_int(&ng, 1, pp); if (read_graph(&g[ng], pp)) { errmsg("Error reading project file (graphs), cancelled"); fclose(pp); return 2; } } read_int(&cnt, 1, pp); for (k = 0; k < cnt; k++) { read_int(&ind, 1, pp); if (read_linetype(&lines[ind], pp)) { errmsg("Error reading project file (lines), cancelled"); fclose(pp); return 2; } lines[ind].active = ON; } read_int(&cnt, 1, pp); for (k = 0; k < cnt; k++) { read_int(&ind, 1, pp); if (read_boxtype(&boxes[ind], pp)) { errmsg("Error reading project file (boxes), cancelled"); fclose(pp); return 2; } boxes[ind].active = ON; } read_int(&cnt, 1, pp); for (k = 0; k < cnt; k++) { read_int(&ind, 1, pp); switch(read_ellipsetype(&ellip[ind], pp)) { case 0: ellip[ind].active = ON; break; case BADMAGIC: /* assume error from reading pre-ellipse file so put things back onto stream */ if( replace_xdr_int( &ind ) || replace_xdr_int( &cnt ) ) { errmsg("Error reading project file (ellipses), cancelled"); fclose(pp); return 2; } else k = cnt; /* end loop */ break; default: errmsg("Error reading project file (plotstr), cancelled"); fclose(pp); return 2; } } read_int(&cnt, 1, pp); for (k = 0; k < cnt; k++) { read_int(&ind, 1, pp); if (read_plotstr(&pstr[ind], pp)) { errmsg("Error reading project file (plotstr), cancelled"); fclose(pp); return 2; } } /* read block data */ read_int(&nblocks, 1, pp); if (nblocks != 0) { read_int(&blocklen, 1, pp); read_int(&blockncols, 1, pp); for (i = 0; i < blockncols; i++) { read_int(&ind, 1, pp); /* TODO need to fix this malloc business */ blockdata[ind] = (double *) malloc(sizeof(double) * blocklen); read_double(blockdata[ind], blocklen, pp); } } /* read description */ if( read_charstr( description, pp ) ) strcpy( description, "Just a typical project I assume" ); if( read_int(&page_layout, 1, pp)) page_layout=FREE; close_xdr(); fclose(pp); return 0; } grace-5.1.23/cmath.h0000644000076500001440000000730310071615553013703 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* cmath.h - replacement for math.h or missing in libm functions */ #include #if defined(HAVE_MATH_H) # include #endif #if defined(HAVE_FLOAT_H) # include #endif #if defined(HAVE_IEEEFP_H) # include #endif #ifndef __GRACE_SOURCE_ #ifndef MACHEP extern double MACHEP; #endif #ifndef UFLOWTHRESH extern double UFLOWTHRESH; #endif #ifndef MAXNUM extern double MAXNUM; #endif #endif /* __GRACE_SOURCE_ */ #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifndef M_SQRT2 # define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ #endif #ifndef M_SQRT1_2 # define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif #ifndef M_SQRT1_3 # define M_SQRT1_3 0.57735026918962576451 /* 1/sqrt(3) */ #endif #ifndef HAVE_HYPOT # define hypot(x, y) sqrt((x)*(x) + (y)*(y)) #endif extern double round ( double x ); #ifndef HAVE_RINT # define rint round #else # ifndef HAVE_RINT_DECL extern double rint ( double x ); # endif #endif #ifndef HAVE_CBRT_DECL extern double cbrt ( double x ); #endif /* Cygnus gnuwin32 has the log2 macro */ #ifdef log2 # undef log2 #endif #ifndef HAVE_LOG2_DECL extern double log2 ( double x ); #endif #ifndef HAVE_LGAMMA extern int sgngam; # define lgamma lgam # define signgam sgngam extern double lgam ( double x ); #else # ifndef HAVE_LGAMMA_DECL extern double lgamma ( double x ); # endif # ifndef HAVE_SIGNGAM_DECL extern int signgam; # endif # define lgam lgamma # define sgngam signgam #endif #ifndef HAVE_ACOSH_DECL extern double acosh ( double x ); #endif #ifndef HAVE_ASINH_DECL extern double asinh ( double x ); #endif #ifndef HAVE_ATANH_DECL extern double atanh ( double x ); #endif #ifndef HAVE_ERF_DECL extern double erf ( double x ); #endif #ifndef HAVE_ERFC_DECL extern double erfc ( double x ); #endif #ifndef HAVE_Y0_DECL extern double y0 ( double x ); #endif #ifndef HAVE_Y1_DECL extern double y1 ( double x ); #endif #ifndef HAVE_YN_DECL extern double yn ( int n, double x ); #endif #ifndef HAVE_J0_DECL extern double j0 ( double x ); #endif #ifndef HAVE_J1_DECL extern double j1 ( double x ); #endif #ifndef HAVE_JN_DECL extern double jn ( int n, double x ); #endif /* isfinite is a macro */ #ifdef isfinite # define HAVE_ISFINITE_MACRO #endif #ifndef HAVE_FINITE # define finite isfinite # if !defined(HAVE_ISFINITE_DECL) && !defined(HAVE_ISFINITE_MACRO) extern int isfinite ( double x ); # endif #else # ifndef HAVE_FINITE_DECL extern int finite ( double x ); # endif #endif /* isnan is a macro */ #ifdef isnan # define HAVE_ISNAN_MACRO #endif #if !defined(HAVE_ISNAN_DECL) && !defined(HAVE_ISNAN_MACRO) extern int isnan ( double x ); #endif grace-5.1.23/COPYRIGHT0000644000076500001440000000157112032137477013735 0ustar fnevgenyusersCopyright (c) 1991-1995 Paul J Turner, Portland, OR Copyright (c) 1996-2012 Grace Development Team Maintained by Evgeny Stambulchik All Rights Reserved This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. grace-5.1.23/arch/0000755000076500001440000000000012032153126013340 5ustar fnevgenyusersgrace-5.1.23/arch/os2/0000755000076500001440000000000012032153126014043 5ustar fnevgenyusersgrace-5.1.23/arch/os2/Make.conf.os20000644000076500001440000000374507314217056016314 0ustar fnevgenyusers# No make rules by default .SUFFIXES: # Extension of object files O=.o # Extension of executables EXE=.exe # Extension of batch files BAT=.cmd # Bourn shell SHELL=sh # Path prefix for installation links PREFIX=$(X11ROOT)/XFree86 # List of subdirectories # I'll comment out if I have a DLL available of the library #SUBDIRS=cephes T1lib Xbae/Xbae src grace_np templates doc examples auxiliary SUBDIRS=cephes src grace_np templates doc examples auxiliary # Name of executable GRACE=xmgrace.exe # Location of the Grace home GRACE_HOME=$(X11ROOT)/XFree86/lib/grace # Relocatable that contains alloca() ALLOCA= # Type1 fonts library #T1_LIB=../../T1lib/t1lib.a T1_LIB=-lt1 # T1 include path #T1_INC=-I../../T1lib T1_INC= # T1lib defines (if the bundled version to be used) T1_AA_TYPE16=short T1_AA_TYPE32=int T1_AA_TYPE64= # Library containing XDR functions XDR_LIB=-lrpc -lsocket # Library containing dll-related functions DL_LIB= # FFTW library FFTW_LIB=-lfftw # netCDF libraries NETCDF_LIBS= # JPEG library JPEG_LIB=-ljpeg # libz library Z_LIB=-lz # PNG library PNG_LIB=-lpng # TIFF library TIFF_LIB=-ltiff # PDFlib library PDF_LIB=-lpdf # Xbae include path #XBAE_INC=-I../Xbae XBAE_INC= # Location of yacc (or its substitution) YACC=yacc # C compiler CC=gcc # F77 compiler FC=g77 # ar AR=ar # ranlib RANLIB=ar s # rm RM=rm -f # soft link LN_S=cp # BSD install INSTALL= INSTALL_PROGRAM= INSTALL_DATA= MKINSTALLDIRS= # CPP flags CPPFLAGS= -I$(X11ROOT)/XFree86/include # C flags CFLAGS0= -Wall -Wno-unused -O4 -mpentium -Zmt # GUI flags GUI_FLAGS= # LDFLAGS # -Zbin-files is removed. Not sure where this will hurt us (fftw, ?! ) ... LDFLAGS=-s -Zmt -Zcrtdll -Zbsd-signals -Zstack 0x3000 # Libraries (all but GUI) NOGUI_LIBS= # GUI libraries GUI_LIBS= -L. -ldlfcn -L$(X11ROOT)/XFree86/lib -lhlpclient -lXbae -lXm -lXpm -lXt -lXext -lXmu -lX11 -lsocket # Commamd used to print PRINT_CMD='lp' # Editor GRACE_EDITOR=nedit # HTML help viewer command HELPVIEWER=-DGRACE_HELPVIEWER=\"xmhelp\" grace-5.1.23/arch/os2/config.h.os20000644000076500001440000002400310071615561016171 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __CONFIG_H #define __CONFIG_H /* Define if on AIX 3. System headers sometimes define this. We just want to avoid a redefinition error message. */ #ifndef _ALL_SOURCE #undef _ALL_SOURCE #endif /* Define if you need to in order for stat and other things to work. */ #undef _POSIX_SOURCE /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if char is unsigned */ #undef __CHAR_UNSIGNED__ /* Define sizeof(char) */ #define SIZEOF_CHAR 1 /* Define sizeof(short) */ #define SIZEOF_SHORT 2 /* Define sizeof(int) */ #define SIZEOF_INT 4 /* Define sizeof(long) */ #define SIZEOF_LONG 4 /* Define sizeof(long long) */ #define SIZEOF_LONG_LONG 8 /* Define sizeof(float) */ #define SIZEOF_FLOAT 4 /* Define sizeof(double) */ #define SIZEOF_DOUBLE 8 /* Define sizeof(long double) */ #define SIZEOF_LONG_DOUBLE 12 /* Define sizeof(void *) */ #define SIZEOF_VOID_P 4 /* Define to empty if the keyword does not work. */ #undef const /* Define to `int' if doesn't define. */ #undef pid_t /* Define to `unsigned' if doesn't define. */ #undef size_t /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ #undef CRAY_STACKSEG_END /* Define if using alloca.c. */ #undef C_ALLOCA /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define as the return type of signal handlers (int or void). */ #define RETSIGTYPE void /* Define if you have that is POSIX.1 compatible. */ #define HAVE_SYS_WAIT_H 1 /* Define if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the header file. */ #define HAVE_SYS_PARAM_H 1 /* Define if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define if you have the header file. */ #define HAVE_SYS_SELECT_H 1 /* Define if your declares struct tm. */ #undef TM_IN_SYS_TIME /* Define if and can be both included. */ #define TIME_WITH_SYS_TIME 1 /* Define if you have the gettimeofday function. */ #define HAVE_GETTIMEOFDAY 1 /* Define if you have the getcwd function. */ #define HAVE_GETCWD 1 /* Define if you have the gethostname function. */ #define HAVE_GETHOSTNAME 1 /* Define if you have the memcpy function. */ #define HAVE_MEMCPY 1 /* Define if you have the memmove function. */ #define HAVE_MEMMOVE 1 /* Define if you have the unlink function. */ #define HAVE_UNLINK 1 /* Define if you have the fcntl function. */ #define HAVE_FCNTL 1 /* Define if you have the popen function. */ #define HAVE_POPEN 1 /* Define if you have the fnmatch function. */ #define HAVE_FNMATCH 1 /* Define if you have the on_exit function. */ #undef HAVE_ON_EXIT /* Define if you have the strstr function. */ #define HAVE_STRSTR 1 /* Define if you have the strerror function. */ #define HAVE_STRERROR 1 /* Define if stdio.h defines the sys_errlist table */ #undef HAVE_SYS_ERRLIST_DECL /* Define if you have the vsnprintf function. */ #define HAVE_VSNPRINTF 1 /* Define if you have the dlopen function. */ #define HAVE_DLOPEN 1 /* Define if dlfcn.h defines the RTLD_NOW constant */ #undef HAVE_RTLD_NOW /* Define if you have the shl_load function. */ #undef HAVE_SHL_LOAD /* If words are stored with the most significant byte first (like Motorola and SPARC, but not Intel and VAX, CPUs */ #undef WORDS_BIGENDIAN /* Define if your FPU arithmetics is of the DEC type. */ #undef HAVE_DEC_FPU /* Define if your FPU arithmetics is of the little endian IEEE type. */ #define HAVE_LIEEE_FPU 1 /* Define if your FPU arithmetics is of the big endian IEEE type. */ #undef HAVE_BIEEE_FPU /* Define if realloc() is buggy (SunOS4, for example) */ #undef REALLOC_IS_BUGGY /* Define if you have the drand48 function. */ #undef HAVE_DRAND48 /* Define if your system supports locale. */ #define HAVE_SETLOCALE 1 /* Define if stdlib.h defines the drand48 function. */ #undef HAVE_DRAND48_IN_STDLIB_H /* Define if you have the m library (-lm). */ #define HAVE_LIBM 1 /* Define if you have the header file. */ #define HAVE_MATH_H 1 /* Define if you have . */ #define HAVE_FLOAT_H 1 /* Define if you have . */ #undef HAVE_IEEEFP_H /* Define if you have the hypot function. */ #define HAVE_HYPOT 1 /* Define if the hypot function is declared in math.h. */ #define HAVE_HYPOT_DECL /* Define if you have the cbrt function. */ #define HAVE_CBRT 1 /* Define if the cbrt function is declared in math.h. */ #define HAVE_CBRT_DECL 1 /* Define if you have the log2 function. */ #undef HAVE_LOG2 /* Define if the log2 function is declared in math.h. */ #undef HAVE_LOG2_DECL /* Define if you have the rint function. */ #define HAVE_RINT 1 /* Define if the rint function is declared in math.h. */ #define HAVE_RINT_DECL 1 /* Define if you have the lgamma function. */ #undef HAVE_LGAMMA /* Define if the lgamma function is declared in math.h. */ #undef HAVE_LGAMMA_DECL /* Define if math.h defines the signgam variable. */ #undef HAVE_SIGNGAM_DECL /* Define if you have the asinh function. */ #undef HAVE_ASINH /* Define if the asinh function is declared in math.h. */ #undef HAVE_ASINH_DECL /* Define if you have the acosh function. */ #undef HAVE_ACOSH /* Define if the acosh function is declared in math.h. */ #undef HAVE_ACOSH_DECL /* Define if you have the atanh function. */ #undef HAVE_ATANH /* Define if the atanh function is declared in math.h. */ #undef HAVE_ATANH_DECL /* Define if you have the erf function. */ #undef HAVE_ERF /* Define if the erf function is declared in math.h. */ #undef HAVE_ERF_DECL /* Define if you have the erfc function. */ #undef HAVE_ERFC /* Define if the erfc function is declared in math.h. */ #undef HAVE_ERFC_DECL /* Define if you have the finite function. */ #undef HAVE_FINITE /* Define if the finite function is declared in math.h. */ #undef HAVE_FINITE_DECL /* Define if you have the isfinite function. */ #define HAVE_ISFINITE 1 /* Define if the isfinite function is declared in math.h. */ #define HAVE_ISFINITE_DECL 1 /* Define if you have the isnan function. */ #define HAVE_ISNAN 1 /* Define if the isnan function is declared in math.h. */ #define HAVE_ISNAN_DECL 1 /* Define if you have the Bessel j0 function. */ #undef HAVE_J0 /* Define if the j0 function is declared in math.h. */ #undef HAVE_J0_DECL /* Define if you have the Bessel j1 function. */ #undef HAVE_J1 /* Define if the j1 function is declared in math.h. */ #undef HAVE_J1_DECL /* Define if you have the Bessel jn function. */ #undef HAVE_JN /* Define if the jn function is declared in math.h. */ #undef HAVE_JN_DECL /* Define if you have the Bessel y0 function. */ #undef HAVE_Y0 /* Define if the y0 function is declared in math.h. */ #undef HAVE_Y0_DECL /* Define if you have the Bessel y1 function. */ #undef HAVE_Y1 /* Define if the y1 function is declared in math.h. */ #undef HAVE_Y1_DECL /* Define if you have the Bessel yn function. */ #undef HAVE_YN /* Define if the yn function is declared in math.h. */ #undef HAVE_YN_DECL /* Define if netCDF library is available */ #undef HAVE_NETCDF /* Define if FFTW Fourier transform library is available */ #define HAVE_FFTW 1 /* Define if PNG library is available */ #define HAVE_LIBPNG 1 /* Define if JPEG library is available */ #define HAVE_LIBJPEG 1 /* Define if PDFlib library is available */ #define HAVE_LIBPDF 1 /* Define if you want to compile a Fortran wrapper for grace_np lib. */ #define WITH_F77_WRAPPER 1 /* Define if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define if you have Motif. */ #define HAVE_MOTIF 1 /* Define if Motif library is actually Lesstif. */ #define HAVE_LESSTIF 1 /* Define if Motif library includes _XmVersionString[] string. */ #define HAVE__XMVERSIONSTRING 1 /* Define if you have the Xpm library (-lXpm). */ #define HAVE_XPM 1 /* Define if you have the xpm.h. */ #undef HAVE_XPM_H 1 /* Define if you have the xpm.h header among X11 includes. */ #define HAVE_X11_XPM_H 1 /* Define if you have (and want to use) libhelp */ #define WITH_LIBHELP 1 /* Define if you have (and want to use) XmHTML widget */ #undef WITH_XMHTML /* Define if you have (and want to use) editres */ #define WITH_EDITRES 1 #if (defined(HAVE_MOTIF) && !defined(X_DISPLAY_MISSING)) # define MOTIF_GUI #else # define NONE_GUI #endif /* Define if the print spooling command itself unlinks the temporary file */ #undef PRINT_CMD_UNLINKS /* Define if you want to compile in (a basic) support for debugging */ #undef WITH_DEBUG #if defined(WITH_DEBUG) # define DEBUG #else # define NDEBUG #endif #endif /* __CONFIG_H */ grace-5.1.23/arch/os2/dotest.cmd0000644000076500001440000001056607135707003016051 0ustar fnevgenyusers/* dotest.cmd, the REXX-based equivalent to shell-script 'dotest' */ /* demos for GRACE */ /* define the location */ curdir = Directory() curdir = Strip(curdir, 'T', '\') /* handle worst case: root */ /* find binary */ guess = Stream('..\src\xmgrace.exe', 'C', 'QUERY EXISTS') if guess = '' then do x11root = Value('X11ROOT', , 'OS2ENVIRONMENT') guess = Stream(x11root'/XFree86/bin/xmgrace.exe', 'C', 'QUERY EXISTS') if guess <> '' then do GRACE = guess end else do say 'No binary found' exit end end /* find examples */ gracehome = Value('GRACE_HOME', , 'OS2ENVIRONMENT') guess = Stream(gracehome'/examples/explain.agr', 'C', 'QUERY EXISTS') if guess = '' then do say 'No examples found' exit end else do exampledir = gracehome'/examples' end /* switch to example dir */ newdir=directory(exampledir) /* command line parameters */ call ExecuteCmd GRACE' -usage' /* call ExecuteCmd sleep 3 */ /* don't ask stupid questions */ GRACE = "xmgrace -noask" /* explain the row of single character buttons and a few other things */ GRACE" explain.agr" /* display the various axes available */ GRACE" axes.agr" /* display the symbols and line styles */ GRACE" symslines.agr" /* display various fill styles */ GRACE" fills.agr" /* some graph stuff and ticks */ GRACE" -p graphs.par" /* some graph stuff and ticks */ GRACE" props.agr" /* demonstration of many graphs */ GRACE" manygraphs.agr" /* some graph stuff and ticks */ GRACE" brw.dat -p regions.par" /* test of a graph inset */ GRACE" tinset.agr" /* some time and date formats */ GRACE" times.agr" /* some more tick label formats */ GRACE" -p tforms.par" /* Australia map */ GRACE" au.agr" /* log plots */ GRACE" -autoscale none -p logtest.par log.dat -graph 1 log.dat" /* more log plots */ GRACE" tlog.agr" /* a log2 example */ GRACE" log2.agr" /* a logit scale sample */ GRACE" logit.agr" /* display fonts and font mappings */ GRACE" tfonts.agr" /* text transforms */ GRACE" txttrans.agr" /* advaned typesetting */ GRACE" typeset.agr" /* example of world stack */ GRACE" tstack.agr" /* a graph with a parameter file */ GRACE" -p test1.par -autoscale xy test.dat" /* a graph with a parameter file in reverse video */ GRACE" -rvideo -p test1.par -autoscale xy test.dat" GRACE" test2.agr" /* explanation of arrow shape parameters */ GRACE" arrows.agr" /* multiple graphs with a parameter file */ GRACE" mlo.dat -graph 1 brw.dat -p co2.par" /* multiple graphs created with arrange feature */ GRACE" co2.agr" /* a nice sample */ GRACE" spectrum.agr" /* a graph with alternate axes */ GRACE" -p altaxis.par test.dat -autoscale xy" /* a graph with error bars */ GRACE" terr.agr" /* a fixed graph with XY RADIUS format */ GRACE" txyr.agr" /* string annotations */ GRACE" motif.agr" /* a graph with an XYZ set */ GRACE" xyz.agr" /* a graph with HILO data */ GRACE" hilo.agr" /* a graph with BOXPLOT data */ GRACE" boxplot.agr" /* polar plots */ GRACE" polar.agr" /* bar charts */ /* a bar graph demonstrating specified ticks and tick labels */ GRACE" bar.agr" /* a stacked bar chart */ GRACE" stackedb.agr" /* a bar chart with error bars */ GRACE" chartebar.agr" /* display all types of XY charts */ GRACE" charts.agr" /* pie charts */ GRACE" pie.agr" /* vector map */ GRACE" vmap.agr" /* a bubble plot */ GRACE" xysize.agr" /* non-linear curve fitting */ GRACE" logistic.agr" /* some interesting stuff */ GRACE" -b test.com" /* need a program */ /* modified from previous versions, a thank you goes to Bruce Barnett */ /* this modification allows others without write permission */ /* to run the demos. */ say rs = Stream('tmc.exe', 'C', 'QUERY EXISTS') if rs = '' then do say "Compiling a short program to test the -pipe option" say "Executing 'gcc tmc.c -o tmc.exe'" '@gcc tmc.c -o tmc.exe' say "Done compilation" say end /* a graph with the -pipe option */ say "Testing -pipe option, executing './tmc | $GRACE -pipe' " '.\tmc.exe | 'GRACE' -pipe' call ExecuteCmd 'rm -f tmc.exe' /* switch back */ newdir=directory(curdir) exit /* end of main program */ /* Procedures */ ExecuteCmd: PROCEDURE Parse Arg EC_param _silent_pre = "@" ADDRESS CMD _silent_pre""EC_param return rc grace-5.1.23/arch/os2/README0000644000076500001440000001127707314217056014745 0ustar fnevgenyusers Grace 5.1.xx for XFree86 OS/2 ============================= Contents of this document: 1) Introduction 2) How to build Grace 3) How to install 1) Introduction ------------ This is (xm)Grace compiled for OS/2. Since it's an X11 application (well, mostly) it requires XFree86 to be installed. Like every piece of software this port of Grace may have a few bugs. Some of them are just related to the general problems which un*x based applications have on non-un*x filesystems. So read the documentation and FAQs for XFree86 carefully to get some hints how to avoid running into these bugs&limitations, e.g. it might be a good idea to install TVFS, the Toronto Virtual File System. A pre-compiled version should always be available from http://www.tu-darmstadt.de/~st002279/os2/os2stuff.html This document describes only the OS/2 specifics. If you're going to use Grace you should read the general documentation files as well! 2) How to build Grace -------------------- Here I try to give a complete list what you need to build Grace. The first listed packages have be installed even if you're only going to use the prebuilt binaries. For your convenience I also point to locations where you can retrieve the packages. - EMX 0.9d (use Fixpack 4) Either development (lots of files) or runtime package (emxrt.zip) http://hobbes.nmsu.edu, http://www.leo.org - XFree86 for OS/2, including its development package(s) http://borneo.gmd.de/~veit/os2/xf86os2.html - LessTif for XFree/2 (version 0.92.26 or above) http://www.tu-darmstadt.de/~st002279/os2/lesstif.html - libXbae (for LessTif; see above for version information) http://www.tu-darmstadt.de/~st002279/os2/lesstif.html - t1lib for XFree/2 http://www.tu-darmstadt.de/~st002279/os2/tools.html - pdflib for XFree/2 (versions 3.0.x) http://www.tu-darmstadt.de/~st002279/os2/tools.html Additional useful utilities: - the "usual" GNU utilities (text, shell, file). - un*x shell (sh) To build Grace I use additional libraries which are not integral parts of Grace, in fact it can be built without using them. If you can't find them on my webpage, I'll provide them upon request. See the generic FAQ where to find the sources for these. - libhelp, xmhelp: Display the online help written in HTML) - libpng: Create PNG files - pdflib: Create PDF files - fftw library: Fast Fourier transformations By now the supplied configure script may not work under OS/2 (even using the existing Autoconf 2.13 port). As a small replacement I offer a small REXX-script 'configos2.cmd' which should - copy standard OS/2 configuration files (config.h and Make.conf) from .\arch\os2 to the toplevel source directory - build dlfcn.a in \arch\os2 (support for user-supplied mathematical functions in dynamic load libraries = DLLs) - build the complete package configos2.cmd is located in arch/os2 and has to be copied to the toplevel source directory before executing it. Please check arch/os2/config.h.os2 and arch/os2/Make.conf.os2 and modify them if necessary. Especially make changes to make use of pre-installed libraries like T1lib and fftw. Finally this script wil call 'x11make.exe'. Note that calling the 'make' script from XFree/2 won't work, because the generic Makefile is using shell commands which are disabled by "make.cmd". 3) How to install --------------- So far the OS/2 Makefiles don't offer an installation target. You have to do it manually ... The binary distribution archive can just be unpacked and will fit in the tree below $(X11ROOT). I supply a small REXX-script 'xmgrace1.cmd' which sets up the necessary environment variable(s) so that xmgrace runs fine within this setup. Check out the webpage or section 2) How to build Grace for other packages which are required to run Grace! A remaining problem is how to access installed printers without manual processing the Postscript files. But this is not only tied to Grace but an issue for every non-PM application on OS/2. I'm using the network printing tools 'lpr' and 'lpd' (part of OS/2 Warp 4) to access my local Postscript printer. Check out the printing utilitiess on LEO/Hobbes or just print to a file and do the further processing (e.g. running Ghostscript) manually. The document on http://www.tu-darmstadt.de/~st002279/os2/printing.html is however still work in progress. -- Alexander Mai st002279@hrzpub.tu-darmstadt.de amai@lesstif.org grace-5.1.23/arch/os2/dlfcn.c0000644000076500001440000000507007032753717015317 0ustar fnevgenyusers/* $Id: dlfcn.c,v 1.3 1999/12/30 22:08:15 fnevgeny Exp $ */ /* dlfcn.c */ /* Implementation of dlopen() interface for OS/2 */ /* This code is released into public domain */ #include #include #include /* We only need parts of the whole OS/2-specific stuff */ #define INCL_DOSMODULEMGR /* Module Manager values */ #define INCL_DOSERRORS /* Error values */ #include /* to get constants and check prototypes */ #include "dlfcn.h" #define LM_LENGTH 256 #define MAXDLLOPEN 256 static int LoadErrorFlag = FALSE; UCHAR LoadError[LM_LENGTH] = ""; /* this is being referenced from outside this module */ void *dlopen( const char *filename, int flag) { HMODULE DLLHandle; APIRET rc; rc = DosLoadModule( LoadError, LM_LENGTH-1, filename, &DLLHandle); if (rc != NO_ERROR) { sprintf(LoadError, "DosLoadModule(\"%s\") = %lu\n", filename, rc); LoadErrorFlag = TRUE; return NULL; } else { LoadErrorFlag = FALSE; return (void*)DLLHandle; } } char *dlerror(void) { if (!LoadErrorFlag) { return (char *)NULL; } else { LoadErrorFlag = FALSE; return LoadError; } } void *dlsym(void *handle, char *symbol) { APIRET rc; PFN FuncAddress; rc = DosQueryProcAddr( (HMODULE) handle, 0L, symbol, &FuncAddress); if (rc != NO_ERROR) { switch (rc) { case ERROR_INVALID_HANDLE: { sprintf(LoadError, "DosQueryProcAddr(\"%s\")=ERROR_INVALID_HANDLE (%lu)\n", symbol, rc); break; } case ERROR_ENTRY_IS_CALLGATE: { sprintf(LoadError, "DosQueryProcAddr(\"%s\")=ERROR_INVALID_HANDLE (%lu)\n", symbol, rc); break; } default: { sprintf(LoadError, "DosQueryProcAddr(\"%s\")=%lu\n", symbol, rc); break; } } /* end switch(rc) */ LoadErrorFlag = TRUE; return NULL; } else { LoadErrorFlag = FALSE; return (void*)FuncAddress; } } int dlclose( void *handle ) { APIRET rc; rc = DosFreeModule( (HMODULE)handle ); if (rc != NO_ERROR) { sprintf(LoadError, "DosFreeModule()=%lu\n", rc); LoadErrorFlag = TRUE; return 2; } else { LoadErrorFlag = FALSE; return 0; } } grace-5.1.23/arch/os2/dlfcn.mak0000644000076500001440000000044406626627166015653 0ustar fnevgenyusersCC= gcc CFLAGS= -Zmtd -O2 -Wall AR= ar rc .SUFFIXES: .c .o .a default: dlfcn.a all: default ../../src/dlfcn.h ../../src/dlfcn.a dlfcn.a: dlfcn.o $(AR) $@ $< dlfcn.o: dlfcn.c .c.o: $(CC) $(CFLAGS) -c $< -o $@ ../../src/dlfcn.h: dlfcn.h cp $< $@ ../../src/dlfcn.a: dlfcn.a cp $< $@ grace-5.1.23/arch/os2/dlfcn.h0000644000076500001440000000122607032753717015323 0ustar fnevgenyusers/* dlfcn.h */ /* Implementation of dlopen() interface for OS/2 */ /* This code is released into public domain */ #ifndef DLFCN_H #define DLFCN_H #if defined (__cplusplus) extern "C" { #endif extern void *dlopen (const char *filename, int flag); extern char *dlerror (void); extern void *dlsym (void *handle, char *symbol); extern int dlclose (void *handle); /* We do not actually use the definitions below but have to keep them for compatibility ... Values taken from linux */ #define RTLD_LAZY 1 #define RTLD_NOW 2 #define RTLD_GLOBAL 0x100 #if defined (__cplusplus) } #endif #endif /* not DLFCN_H */ grace-5.1.23/arch/os2/configos2.cmd0000644000076500001440000001070107113751314016427 0ustar fnevgenyusers/* REXX-Script to configure & build GRACE 5.x for XFree86 OS/2 (19991228) */ /* Todo: - forget about this mess and switch to configure ;-) - Ask/check for libhelp, g77, ... - distinguish between debug- & production builds */ trace n Parse Arg param True = 1 False = 0 options = '' do while param <> '' Parse Var param tp param tp = Translate(tp) tpr = Right(tp,1) if (Left(tp,1) = '-') & (Length(tp) = 2) then select when tpr = 'D' then do options = options'D' end when tpr = 'E' then do options = options'E' end when tpr = 'O' then do options = options'O' end when (tpr = '?') then do call ShowHelp SIGNAL FIN end otherwise do call ShowHelp SIGNAL FIN end end /* select */ end /* do while */ say "configos2.cmd" say "Options are: "options cf_make_conf = 'Make.conf' cf_config_h = 'config.h' curdir = Directory() x11root = Value('X11ROOT', , 'OS2ENVIRONMENT') if x11root <> '' then do x11path=x11root'\XFree86' newdir = Directory(x11path) call Directory(curdir) if Translate(newdir) <> Translate(x11path) then do say 'XFree/2 is not properly installed!' say 'The X11ROOT environment variable is not set correctly' end end else do say 'XFree/2 is not properly installed!' say 'The X11ROOT environment variable is missing' SIGNAL FIN end systemdir = Strip(curdir, 'T', '\')'\arch\os2' /* Install Make.conf */ if FileExists(cf_make_conf) = True then do if Pos('E', options) = 0 then do say cf_make_conf' is already installed!' call CharOut , 'Install default file instead ? (y/n) ' Parse Upper Pull answer if answer = 'Y' then do call FileCopy systemdir'\'cf_make_conf'.os2', curdir'\'cf_make_conf call Execute 'touch 'curdir'\'cf_make_conf end else do /* not a good idea perhaps ... */ call Execute 'touch 'curdir'\'cf_make_conf end end end else do call FileCopy systemdir'\'cf_make_conf'.os2', curdir'\'cf_make_conf /* call Execute 'touch 'curdir'\'cf_make_conf */ end /* Install config.h */ if FileExists(cf_config_h) = True then do if Pos('E', options) = 0 then do say cf_config_h' is already installed!' call CharOut , 'Install default file instead ? (y/n) ' Parse Upper Pull answer if answer = 'Y' then do call FileCopy systemdir'\'cf_config_h'.os2', curdir'\'cf_config_h call Execute 'touch 'curdir'\'cf_config_h end else do /* not a good idea perhaps ... */ call Execute 'touch 'curdir'\'cf_config_h end end end else do call FileCopy systemdir'\'cf_config_h'.os2', curdir'\'cf_config_h /* call Execute 'touch 'curdir'\'cf_config_h */ end /* Building dlfcn.a */ call Execute "cd .\arch\os2 && x11make.exe -f dlfcn.mak all & cd ..\.." /* Calling x11make.exe cause make.cmd won't work here due to the sh command embedded in the Makefiles*/ say 'Start compiling ...' call Execute 'x11make' call FileCopy systemdir'\dotest.cmd', curdir'\examples\dotest.cmd' say 'configos2.cmd has finished!' FIN: exit /* ######################################################################## */ Execute: procedure Parse Arg command Address CMD ''command return FileCopy: procedure Parse Arg par1, par2 call Execute '@copy 'par1' 'par2' >nul' return FileExists: procedure expose True False Parse Arg fe_file rs = Stream(fe_file, 'C', 'QUERY EXISTS') if rs = '' then return False else return True ShowHelp: say 'Valid options for configos2.cmd:' /* say " -d : create binaries for debugging" */ say " -e : use existing configuration files; don't prompt for using default ones" /* say " -o : optimize" */ return rtest: /* work in progress (hopefully ;-) */ _CR = D2C(13) _LF = D2C(10) _CRLF = _CR''_LF rc = LineIn (rfile,1,0) rlength = Chars(rfile) rcontent = CharIn(rfile, rlength) call LineOut rfile rcount = 0 do while rcontent <> '' Parse Var rcontent rline (_CRLF) rcontent rline = Strip(rline, 'T') if rline <> '' then do rcount = rcount+1 rnew.rcount = rline say rcount'. 'rline end end /* do while */ rnew.0 = rcount return grace-5.1.23/arch/win32/0000755000076500001440000000000012032153126014302 5ustar fnevgenyusersgrace-5.1.23/arch/win32/README0000644000076500001440000000054707415146206015202 0ustar fnevgenyusers In order to compile Grace, you'll need Cygnus's GNU-win32 development kit (http://www.cygwin.com/), version 1.3.6 or above, a respective port of the XWindows libs, and an X server. You'll find all at the aforementioned site. Evgeny PS. Please don't send me private e-mails related to Grace; use the grace@plasma-gate.weizmann.ac.il mailing list instead. grace-5.1.23/arch/vms/0000755000076500001440000000000012032153126014145 5ustar fnevgenyusersgrace-5.1.23/arch/vms/xbae.mms0000644000076500001440000000153306776762644015641 0ustar fnevgenyusers##################################################### # Makefile for Xbae matrix widget on VMS # ##################################################### TOP=[--] ECHO = WRITE SYS$OUTPUT include $(TOP)Make.conf CFLAGS=$(CFLAGS0)/INCLUDE=($(TOP)) $(GUI_FLAGS) \ /DEFINE=(DRAW_RESIZE_SHADOW)/WARNINGS=(DISABLE=LONGEXTERN) LIB=libXbae.OLB include Make.common all : msg $(LIB)($(OBJS)) @ ! msg : @ $(ECHO) "" @ $(ECHO) "Making $(LIB) ..." @ $(ECHO) "" install : $(LIB) tests : dummy links : dummy clean : IF F$SEARCH("*$(O)",).NES."" THEN $(RM) *$(O);* IF F$SEARCH("$(LIB)",).NES."" THEN $(RM) $(LIB);* distclean : clean @ ! devclean : clean @ ! dummy : .FIRST @ define/nolog xbae 'f$string(f$parse("[-]","","","device")+ \ f$parse("[-]","","","directory") - "]" + ".xbae]") grace-5.1.23/arch/vms/netscape.com0000644000076500001440000000042206636742760016472 0ustar fnevgenyusers$ lock = f$trnlnm ("sys$login") - "]" + ".NETSCAPE]LOCK.VMS" $ if (f$search(lock) .eqs. "") then goto not_running $ open/read/error=running lock 'lock' $ close lock $not_running: $ netscape 'p1' $ exit $running: $ netscape -noraise -remote "openURL(''p1',newwindow)" $ exit grace-5.1.23/arch/vms/t1lib_type1.mms0000644000076500001440000000111306662657540017041 0ustar fnevgenyusersTOP=[--] include $(TOP)Make.conf CFLAGS = $(CFLAGS0)/INCLUDE=[--]/DEFINE=(GLOBAL_CONFIG_DIR="""[]""",\ T1_AA_TYPE16="$(T1_AA_TYPE16)",T1_AA_TYPE32="$(T1_AA_TYPE32)") OBJS = \ arith$(O) \ curves$(O) \ fontfcn$(O) \ hints$(O) \ lines$(O) \ objects$(O) \ paths$(O) \ regions$(O) \ scanfont$(O) \ spaces$(O) \ t1io$(O) \ t1snap$(O) \ t1stub$(O) \ token$(O) \ type1$(O) \ util$(O) all : $(OBJS) @ ! clean : dummy $(RM) *$(O);* install : dummy dummy : # Dependencies of object files # (generated by "gcc -MM *.c > .dependencies"): #include .dependencies grace-5.1.23/arch/vms/t1lib_t1lib.mms0000644000076500001440000000151607064715101017002 0ustar fnevgenyusersTOP=[--] include $(TOP)Make.conf CFLAGS = $(CFLAGS0)/INCLUDE=[--]/DEFINE=(GLOBAL_CONFIG_DIR="""[]""",\ T1_AA_TYPE16="$(T1_AA_TYPE16)",T1_AA_TYPE32="$(T1_AA_TYPE32)")\ /WARNING=(DISABLE=DUPEXTERN)/UNDEFINE=("VMS") # The VMS specific code defines ] as the directory separator. Grace uses # unix format for all file specifications, so having the T1 library add # a ] instead of a / causes problems. I undefine VMS when compiling to # prevent this problem. OBJS = \ t1finfo$(O) \ t1base$(O) \ t1delete$(O) \ t1enc$(O) \ t1env$(O) \ t1load$(O) \ t1set$(O) \ t1trans$(O) \ t1aaset$(O) \ t1afmtool$(O) \ t1outline$(O) \ parseAFM$(O) all : $(OBJS) @ ! clean : dummy $(RM) *$(O);* install : dummy dummy : # Dependencies of object files # (generated by "gcc -MM *.c > .dependencies"): #include .dependencies grace-5.1.23/arch/vms/cephes.mms0000644000076500001440000000133206636742760016156 0ustar fnevgenyusers##################################################### # Makefile for Cephes math library (VMS) # ##################################################### # Rolf Niepraschk, 12/97, niepraschk@ptb.de TOP = [-] ECHO = WRITE SYS$OUTPUT INCLUDE $(TOP)Make.conf CFLAGS = $(CFLAGS0)/INCLUDE=$(TOP) LIB = libcephes.olb INCLUDE Make.common #INCLUDE Make.dep all : msg $(LIB)($(OBJS)) @ ! msg : @ $(ECHO) "" @ $(ECHO) "Making $(LIB) ..." @ $(ECHO) "" install : $(LIB) tests : dummy links : dummy clean : IF F$SEARCH("*$(O)",).NES."" THEN $(RM) *$(O);* IF F$SEARCH("$(LIB)",).NES."" THEN $(RM) $(LIB);* distclean : clean @ ! devclean : clean @ ! dummy : grace-5.1.23/arch/vms/grconvert.mms0000644000076500001440000000165506737414176016727 0ustar fnevgenyusers##################################################### # Makefile for grconvert -- VMS version (R.N.) 5/98 # ##################################################### # not tested (RN) TOP = [-] SRCDIR = [-.SRC] VMSDIR = [-.ARCH.VMS] #RM = DELETE/log include $(TOP)Make.conf PROG = grconvert$(EXE) SRCS = grconvert.c defaults.c readbin.c writeasc.c util.c OBJS = grconvert$(O) defaults$(O) readbin$(O) writeasc$(O) util$(O) .IFDEF FLOAT .ELSE FLOAT = D_FLOAT .ENDIF .IFDEF MULTINET CFLAGS = /INCLUDE=($(TOP),$(SRCDIR),$(VMSDIR))/DEFINE=(GRCONVERT=1,MULTINET=1) \ /FLOAT=$(FLOAT)/PREFIX=ALL LIBS = ,multinet_common_root:[multinet.library]rpc.olb/LIBRARY .ELSE CFLAGS = /INCLUDE=($(TOP),$(SRCDIR),$(VMSDIR))/DEFINE=(GRCONVERT=1) \ /FLOAT=$(FLOAT)/PREFIX=ALL LIBS = ,$(VMSDIR)xdr.opt/OPTION .ENDIF all : $(PROG) @ ! $(PROG) : $(OBJS) $(LINK) /EXECUTABLE=$@ $+ $(LIBS) clean : $(RM) $(OBJS) distclean : clean $(RM) $(PROG) grace-5.1.23/arch/vms/src.mms0000644000076500001440000000326306776762644015513 0ustar fnevgenyusers########################################## # Makefile for GRACE (VMS) # ########################################## # Rolf Niepraschk, 5/98, niepraschk@ptb.de TOP = [-] ECHO = WRITE SYS$OUTPUT INCLUDE $(TOP)Make.conf CEPHES_LIB = ,[-.CEPHES]libcephes.olb/LIBRARY CFLAGS = $(CFLAGS0)/INCLUDE=($(TOP)$(T1_INC)$(LIB_INC)) \ /DEFINE=("xfree=xfree_") LIBS = $(GUI_LIBS)$(CEPHES_LIB)$(T1_LIB)$(NETCDF_LIBS)$(FFTW_LIB) \ $(PDF_LIB)$(TIFF_LIB)$(JPEG_LIB)$(PNG_LIB)$(Z_LIB) \ $(NOGUI_LIBS)$(DL_LIB) PREFS = /DEFINE=(CCOMPILER="""$(CCOMPILER)""",\ GRACE_HOME="""$(GRACE_HOME)""",\ GRACE_EDITOR="""$(GRACE_EDITOR)""",\ GRACE_HELPVIEWER="""$(HELPVIEWER)""",\ GRACE_PRINT_CMD="""$(PRINT_CMD)""") ALL : msg logicals buildinfo.h $(GRACE) @ ! INCLUDE Make.common msg : @ $(ECHO) "" @ $(ECHO) "Making $(GRACE) ..." @ $(ECHO) "" logicals : @ define/nolog cephes \ 'f$string(f$parse("[-.cephes]",,,,"syntax_only")-".;")' @ define/nolog xbae \ 'f$string(f$parse("$(XBAE_INC)",,,,"syntax_only")-".;")' .IFDEF USE_DECC$CRTL @ define/nolog decc$crtlmap sys$library:decc$crtl.exe .ENDIF #INCLUDE Make.dep $(GRACE) : xmgrace.olb($(GROBJS) $(GUIOBJS)) LINK /EXECUTABLE=$@ $(LDFLAGS) xmgrace.olb/LIBRARY/INCLUDE=main $(LIBS) buildinfo$(EXE) : buildinfo$(O) LINK /EXECUTABLE=$@ $? $(LDFLAGS) $(GUI_LIBS) $(T1_LIB) $(NOGUI_LIBS) buildinfo$(O) : $(TOP)Make.conf $(CC) $(CFLAGS) $(PREFS)/OBJECT=$@ buildinfo.c buildinfo.h : buildinfo$(EXE) DEFINE/USER SYS$OUTPUT $@ RUN $? clean : IF F$SEARCH("*$(O)").NES."" THEN $(RM) *$(O);* distclean : clean IF F$SEARCH("$(GRACE)").NES."" THEN $(RM) $(GRACE);* grace-5.1.23/arch/vms/build.com0000644000076500001440000001467307050130610015754 0ustar fnevgenyusers$ V = 'F$VERIFY(0)' $ SAY = "WRITE SYS$OUTPUT" $ ! $ OPEN/READ IN MAKE.CONF $LOOP_CONF: $ READ/END=DONE_CONF IN REC $ IF (F$EXTRACT(0,1,REC) .NES. "#" .AND. F$ELEMENT(1,"=",REC) .NES. "=") $ THEN $ SYM = F$ELEMENT (0, "=", REC) $ VAL = REC - SYM - "=" $ 'SYM' = "''VAL'" $ ENDIF $ GOTO LOOP_CONF $DONE_CONF: $ CLOSE IN $ ! $ IF (P1 .EQS. "BUILDINFO") $ THEN $ SET DEFAULT [.SRC] $ CREATE BUILDINFO.OBJ $ CREATE BUILDINFO.EXE $ GOSUB BUILDINFO $ SET DEFAULT [-] $ V = F$VERIFY(V) $ EXIT $ ENDIF $ ! $ SAY "Building CEPHES" $ SET DEFAULT [.CEPHES] $ CFLAGS = CFLAGS0 + "/INCLUDE=[-]" $ LIB = "libcephes.olb" $ FILE = "MAKE.COMMON" $ NAME = "OBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ SET DEFAULT [-] $ ! $ SAY "Building T1LIB" $ SET DEFAULT [.T1LIB.TYPE1] $ CFLAGS = CFLAGS0 - + "/INCLUDE=[--]/DEFINE=(GLOBAL_CONFIG_DIR=""""""[]"""""", " - + "T1_AA_TYPE16=""''T1_AA_TYPE16'"",T1_AA_TYPE32=""''T1_AA_TYPE32'"")" $ LIB = "[-]libt1lib.olb" $ FILE = "DESCRIP.MMS" $ NAME = "OBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ SET DEFAULT [-.T1LIB] $ CFLAGS = CFLAGS0 - + "/INCLUDE=[--]/DEFINE=(GLOBAL_CONFIG_DIR=""""""[]"""""", " - + "T1_AA_TYPE16=""''T1_AA_TYPE16'"",T1_AA_TYPE32=""''T1_AA_TYPE32'"")" - + "/WARNING=(DISABLE=DUPEXTERN)" $ LIB = "[-]libt1lib.olb" $ FILE = "DESCRIP.MMS" $ NAME = "OBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ SET DEFAULT [--] $ ! $ SAY "Building XBAE" $ SET DEFAULT [.XBAE.XBAE] $ XBAE = F$PARSE("[]",,,,"SYNTAX_ONLY") - ".;" $ DEFINE/NOLOG XBAE 'XBAE' $ CFLAGS = CFLAGS0 + "/INCLUDE=[-]" + GUI_FLAGS - + "/DEFINE=(DRAW_RESIZE_SHADOW)/WARNINGS=(DISABLE=LONGEXTERN)" $ LIB = "libXbae.OLB" $ FILE = "MAKE.COMMON" $ NAME = "OBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ DEASSIGN XBAE $ SET DEFAULT [--] $ ! $ SAY "Building SRC" $ SET DEFAULT [.SRC] $ IF (F$TYPE(USE_DECC$CRTL) .EQS. "") THEN USE_DECC$CRTL = 0 $ IF (USE_DECC$CRTL) THEN DEFINE/NOLOG DECC$CRTLMAP SYS$LIBRARY:DECC$CRTL.EXE $ VMS_MAJOR = F$ELEMENT (0, ".", F$GETSYI ("NODE_SWVERS")) - "V" $ IF (USE_DECC$CRTL .OR. VMS_MAJOR .GE. 7) $ THEN $ CFLAGS = CFLAGS0 + "/INCLUDE=([-],[-.T1LIB.T1LIB]''NETCDF_INC')" - + "/DEFINE=(CCOMPILER=""""""''CCOMPILER'""""""," - + "GRACE_HOME=""""""''GRACE_HOME'""""""," - + "GRACE_EDITOR=""""""''GRACE_EDITOR'""""""," - + "GRACE_HELPVIEWER=""""""''HELPVIEWER'""""""," - + "GRACE_PRINT_CMD=""""""''PRINT_CMD'"""""")" $ LIB = "" $ SRCS = "buildinfo" $ GOSUB COMPILE $ V = F$VERIFY(1) $ LINK/EXECUTABLE=BUILDINFO.EXE BUILDINFO.OBJ,[-.T1LIB]libt1lib.olb/LIBRARY - 'NOGUI_LIBS' $ DEFINE/USER SYS$OUTPUT BUILDINFO.H $ RUN BUILDINFO.EXE $ V = 'F$VERIFY(0)' $ ELSE $ GOSUB BUILDINFO $ ENDIF $ CEPHES = F$PARSE("[-.CEPHES]",,,,"SYNTAX_ONLY") - ".;" $ DEFINE/NOLOG CEPHES 'CEPHES' $ XBAE = F$PARSE(XBAE_INC,,,,"SYNTAX_ONLY") - ".;" $ DEFINE/NOLOG XBAE 'XBAE' $ CFLAGS = CFLAGS0 + "/INCLUDE=([-],[-.T1LIB.T1LIB]''LIB_INC')" - + "/DEFINE=(""xfree=xfree_"")" $ LIB = "xmgrace.olb" $ PARS_O = "pars$(O)" $ FILE = "MAKE.COMMON" $ NAME = "GROBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ FILE = "MAKE.COMMON" $ NAME = "GUIOBJS" $ GOSUB GETLIST $ GOSUB COMPILE $ CEPHES_LIB = ",[-.CEPHES]LIBCEPHES.OLB/LIB" $ V = F$VERIFY(1) $ LINK /EXECUTABLE=xmgrace.exe 'LDFLAGS' xmgrace.olb/lib/inc=main - 'GUI_LIBS''CEPHES_LIB''T1_LIB''NETCDF_LIBS''FFTW_LIB' - 'PDF_LIB''TIFF_LIB''JPEG_LIB''PNG_LIB''Z_LIB' - 'NOGUI_LIBS''DL_LIB' $ V = 'F$VERIFY(0)' $ DEASSIGN CEPHES $ DEASSIGN XBAE $ SET DEFAULT [-] $ ! $ SAY "Done" $ V = F$VERIFY(V) $ EXIT $ ! $GETLIST: $ SRCS = "" $ OPEN/READ IN 'FILE' $GETLISTLOOP1: $ READ/END=GETLISTDONE IN REC $ IF (F$ELEMENT(0," ",REC) .NES. NAME) THEN GOTO GETLISTLOOP1 $ REC = REC - NAME - "=" $ GOSUB MOVETOSRCS $ IF (REC .NES. "\") THEN GOTO GETLISTDONE $GETLISTLOOP2: $ READ/END=GETLISTDONE IN REC $ GOSUB MOVETOSRCS $ IF (REC .NES. "\") THEN GOTO GETLISTDONE $ GOTO GETLISTLOOP2 $GETLISTDONE: $ CLOSE IN $ RETURN $MOVETOSRCS: $ REC = F$EDIT (REC, "TRIM,COMPRESS") $ N = 0 $MOVETOSRCSLOOP: $ OBJ = F$ELEMENT (N, " ", REC) $ N = N + 1 $ IF (OBJ .EQS. " ") $ THEN $ REC = "" $ RETURN $ ENDIF $ IF (OBJ .EQS. "\") $ THEN $ REC = "\" $ RETURN $ ENDIF $ IF (F$EXTRACT (0, 2, OBJ) .EQS. "$(") $ THEN $ OBJ = OBJ - "$(" - ")" $ IF (F$TYPE('OBJ') .NES. "") $ THEN $ OBJ = 'OBJ' $ IF (OBJ .EQS. "") THEN GOTO MOVETOSRCSLOOP $ ELSE $ GOTO MOVETOSRCSLOOP $ ENDIF $ ENDIF $ OBJ = OBJ - "$(O)" $ SRCS = SRCS + " " + OBJ $ GOTO MOVETOSRCSLOOP $ ! $COMPILE: $ IF (LIB .NES. "" .AND. F$SEARCH(LIB) .EQS. "") THEN LIBRARY/CREATE/LOG 'LIB' $ N = 0 $LOOP_COMPILE: $ FILE = F$ELEMENT (N, " ", SRCS) $ N = N + 1 $ IF (FILE .EQS. " ") THEN RETURN $ IF (FILE .EQS. "") THEN GOTO LOOP_COMPILE $ V = F$VERIFY(1) $ 'CC''CFLAGS' 'FILE'.C $ V = 'F$VERIFY(0)' $ IF (LIB .NES. "") THEN LIBRARY/LOG 'LIB' 'FILE'.OBJ $ GOTO LOOP_COMPILE $ ! $BUILDINFO: $ OPEN/READ IN BUILDINFO.C $BUILDINFO_C_LOOP: $ READ/END=BUILDINFO_C_DONE IN REC $ IF (F$ELEMENT(0," ",REC) .NES. "#define") THEN GOTO BUILDINFO_C_LOOP $ VAL = F$ELEMENT(2," ",REC) $ IF (VAL .NES. " ") THEN 'F$ELEMENT(1," ",REC)' = 'VAL' $ GOTO BUILDINFO_C_LOOP $BUILDINFO_C_DONE: $ CLOSE IN $ @SYS$UPDATE:DECW$GET_IMAGE_VERSION SYS$SHARE:DECW$XLIBSHR.EXE DECWVERSION $ OPEN/READ IN [-.T1LIB.T1LIB]SYSCONF.H $SYSCONF_H_LOOP: $ READ/END=SYSCONF_H_DONE IN REC $ IF (F$ELEMENT(0," ",REC) .NES. "#define") THEN GOTO SYSCONF_H_LOOP $ VAL = F$ELEMENT(2," ",REC) $ IF (VAL .NES. " ") THEN 'F$ELEMENT(1," ",REC)' = 'VAL' $ GOTO SYSCONF_H_LOOP $SYSCONF_H_DONE: $ CLOSE IN $ OPEN/WRITE OUT BUILDINFO.H $ VERSION = MAJOR_REV*10000 + MINOR_REV*100 + PATCHLEVEL $ WRITE OUT "#define BI_VERSION_ID ", VERSION $ VERSION = "Grace-''MAJOR_REV'.''MINOR_REV'.''PATCHLEVEL' ''BETA_VER'" $ WRITE OUT "#define BI_VERSION """, VERSION, """" $ WRITE OUT "#define BI_GUI ""@(#)OSF/Motif Version ", DECWVERSION, """" $ WRITE OUT "#define BI_T1LIB """, T1LIB_IDENT, """" $ WRITE OUT "#define BI_CCOMPILER """, CCOMPILER, """" $ WRITE OUT "#define BI_SYSTEM ""OpenVMS 0 ", F$GETSYI("HW_NAME"), """" $ WRITE OUT "#define BI_DATE """, F$TIME(), """" $ WRITE OUT "" $ WRITE OUT "#define GRACE_HOME """, GRACE_HOME, """" $ WRITE OUT "#define GRACE_EDITOR """, GRACE_EDITOR, """" $QUOTELOOP: $ N = F$LOCATE ("\\", PRINT_CMD) $ IF (N .NE. F$LENGTH(PRINT_CMD)) $ THEN $ PRINT_CMD = F$EXTRACT (0, N, PRINT_CMD) + F$EXTRACT (N+1, 255, PRINT_CMD) $ GOTO QUOTELOOP $ ENDIF $ WRITE OUT "#define GRACE_PRINT_CMD """, PRINT_CMD, """" $ WRITE OUT "#define GRACE_HELPVIEWER """, HELPVIEWER, """" $ CLOSE OUT $ RETURN grace-5.1.23/arch/vms/dotest.com0000644000076500001440000000111506737414176016171 0ustar fnevgenyusers$ ! This command file reads DOTEST. and executes the GRACE commands. $ ! $ XMGRACE = XMGRACE + " -noask" $ ! $ ON CONTROL_Y THEN GOTO DONE $ ON ERROR THEN GOTO DONE $ OPEN IN DOTEST. $LOOP: $ READ/END=DONE IN REC $ IF (F$EXTRACT (0, 6, REC) .EQS. "$GRACE") $ THEN $ REDIR = F$ELEMENT (1, "<", REC) $ IF (REDIR .NES. "<") $ THEN $ WRITE SYS$OUTPUT "$ DEFINE/USER SYS$INPUT ''REDIR'" $ DEFINE/USER SYS$INPUT 'REDIR' $ REC = F$ELEMENT (0, "<", REC) $ ENDIF $ REC = "XM" + (REC - "$") $ WRITE SYS$OUTPUT "$ ", REC $ 'REC' $ ENDIF $ GOTO LOOP $DONE: $ CLOSE IN $ EXIT grace-5.1.23/arch/vms/t1lib.mms0000644000076500001440000000650706737414176015732 0ustar fnevgenyusers##################################################### # Makefile for T1lib (bundled with GRACE) # ##################################################### TOP = [-] ECHO = WRITE SYS$OUTPUT CD = SET DEFAULT include $(TOP)Make.conf TYPE1_OBJS = \ [.type1]arith$(O) \ [.type1]curves$(O) \ [.type1]fontfcn$(O) \ [.type1]hints$(O) \ [.type1]lines$(O) \ [.type1]objects$(O) \ [.type1]paths$(O) \ [.type1]regions$(O) \ [.type1]scanfont$(O) \ [.type1]spaces$(O) \ [.type1]t1io$(O) \ [.type1]t1snap$(O) \ [.type1]t1stub$(O) \ [.type1]token$(O) \ [.type1]type1$(O) \ [.type1]util$(O) T1LIB_OBJS = \ [.t1lib]t1finfo$(O) \ [.t1lib]t1base$(O) \ [.t1lib]t1delete$(O) \ [.t1lib]t1enc$(O) \ [.t1lib]t1env$(O) \ [.t1lib]t1load$(O) \ [.t1lib]t1set$(O) \ [.t1lib]t1trans$(O) \ [.t1lib]t1aaset$(O) \ [.t1lib]t1afmtool$(O) \ [.t1lib]t1outline$(O) \ [.t1lib]parseAFM$(O) TYPE1_SRCS = \ [.type1]arith.c \ [.type1]curves.c \ [.type1]fontfcn.c \ [.type1]hints.c \ [.type1]lines.c \ [.type1]objects.c \ [.type1]paths.c \ [.type1]regions.c \ [.type1]scanfont.c \ [.type1]spaces.c \ [.type1]t1io.c \ [.type1]t1snap.c \ [.type1]t1stub.c \ [.type1]token.c \ [.type1]type1.c \ [.type1]util.c T1LIB_SRCS = \ [.t1lib]t1finfo.c \ [.t1lib]t1base.c \ [.t1lib]t1delete.c \ [.t1lib]t1enc.c \ [.t1lib]t1env.c \ [.t1lib]t1load.c \ [.t1lib]t1set.c \ [.t1lib]t1trans.c \ [.t1lib]t1aaset.c \ [.t1lib]t1afmtool.c \ [.t1lib]t1outline.c \ [.t1lib]parseAFM.c TYPE1_HEADERS = \ [.type1]Xstuff.h \ [.type1]arith.h \ [.type1]blues.h \ [.type1]cluts.h \ [.type1]curves.h \ [.type1]digit.h \ [.type1]ffilest.h \ [.type1]font.h \ [.type1]fontfcn.h \ [.type1]fontfile.h \ [.type1]fontmisc.h \ [.type1]fonts.h \ [.type1]fontstruct.h \ [.type1]fontxlfd.h \ [.type1]fsmasks.h \ [.type1]hdigit.h \ [.type1]hints.h \ [.type1]lines.h \ [.type1]objects.h \ [.type1]paths.h \ [.type1]paths_rmz.h \ [.type1]pictures.h \ [.type1]regions.h \ [.type1]spaces.h \ [.type1]spaces_rmz.h \ [.type1]strokes.h \ [.type1]t1hdigit.h \ [.type1]t1imager.h \ [.type1]t1intf.h \ [.type1]t1stdio.h \ [.type1]token.h \ [.type1]tokst.h \ [.type1]trig.h \ [.type1]types.h \ [.type1]util.h T1LIB_HEADERS = \ [.t1lib]parseAFM.h \ [.t1lib]t1afmtool.h \ [.t1lib]t1aaset.h \ [.t1lib]t1base.h \ [.t1lib]t1delete.h \ [.t1lib]t1enc.h \ [.t1lib]t1env.h \ [.t1lib]t1extern.h \ [.t1lib]t1finfo.h \ [.t1lib]t1global.h \ [.t1lib]t1lib.h \ [.t1lib]t1load.h \ [.t1lib]t1misc.h \ [.t1lib]t1set.h \ [.t1lib]t1trans.h \ [.t1lib]t1types.h MAIN_TARGET = libt1lib.olb DUMMYSUBDIRS=XXXX all : msg $(DUMMYSUBDIRS) $(MAIN_TARGET)($(TYPE1_OBJS) $(T1LIB_OBJS)) @ ! msg : @ $(ECHO) "" @ $(ECHO) "Making $(MAIN_TARGET) ..." @ $(ECHO) "" $(DUMMYSUBDIRS) : dummy @ $(CD) [.TYPE1] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] @ $(CD) [.T1LIB] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] libt1lib.olb : $(TYPE1_OBJS) $(T1LIB_OBJS) clean : dummy @ $(CD) [.TYPE1] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] @ $(CD) [.T1LIB] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] distclean : dummy @ $(CD) [.TYPE1] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] @ $(CD) [.T1LIB] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [-] $(RM) libt1lib.olb install : dummy links : dummy tests : dummy dummy : @ ! grace-5.1.23/arch/vms/descrip.mms0000644000076500001440000000136006776762644016351 0ustar fnevgenyusers##################################################### # Top-level Makefile for GRACE (VMS) # ##################################################### # Rolf Niepraschk, 11/97, niepraschk@ptb.de INCLUDE Make.conf CD = SET DEFAULT TOP = [-] ECHO = WRITE SYS$OUTPUT ALL : $(SUBDIRS) @ ! .LAST @ $(ECHO) "" @ $(ECHO) "Done." CEPHES : @ $(CD) [.CEPHES] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) $(TOP) T1LIB : @ $(CD) [.T1LIB] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) $(TOP) XBAE : @ $(CD) [.XBAE.XBAE] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) [--] SRC : @ $(CD) [.SRC] @ $(MMS) $(MMSQUALIFIERS) $(MMSTARGETS) @ $(CD) $(TOP) clean : $(SUBDIRS) @ ! distclean : $(SUBDIRS) @ ! grace-5.1.23/arch/vms/xdr.opt0000644000076500001440000000004306626627167015512 0ustar fnevgenyuserssys$share:UCX$RPCXDR_SHR.EXE/share grace-5.1.23/arch/vms/motif1_2.opt0000644000076500001440000000023706626627167016342 0ustar fnevgenyuserssys$share:decw$mrmlibshr12/share sys$share:decw$dxmlibshr12/share sys$share:decw$xmlibshr12/share sys$share:decw$xtlibshrr5/share sys$share:decw$xlibshr/share grace-5.1.23/arch/vms/configure.com0000644000076500001440000005316507623537175016664 0ustar fnevgenyusers$! configure for GRACE -- VMS version $! Rolf Niepraschk, 12/97, niepraschk@ptb.de $! John Hasstedt, 12/98, John.Hasstedt@sunysb.edu $! $ echo := WRITE SYS$OUTPUT $! $! get versions, hardware type, etc $! $ VMSVERSION = F$GETSYI ("NODE_SWVERS") $ VMS_MAJOR = F$ELEMENT (0, ".", VMSVERSION) - "V" $ VMS_MINOR = F$ELEMENT (0, "-", F$ELEMENT (1, ".", VMSVERSION)) $ HW = F$GETSYI("ARCH_NAME") $ @SYS$UPDATE:DECW$GET_IMAGE_VERSION SYS$SHARE:DECW$XLIBSHR.EXE DECWVERSION $ DECWVERSION = F$ELEMENT (1, " ", DECWVERSION) $ DECW_MAJOR = F$ELEMENT (0, "-", DECWVERSION) $ @SYS$UPDATE:DECW$GET_IMAGE_VERSION SYS$SYSTEM:DECC$COMPILER.EXE DECCVERSION $ DECCVERSION = F$ELEMENT (1, " ", DECCVERSION) $ DECC_MAJOR = F$ELEMENT (0, ".", DECCVERSION) - "V" $! $! set defaults for command line parameters $! $ IF (F$SEARCH("SYS$LIBRARY:DECC$CRTL.EXE") .NES. "") $ THEN DECC$CRTLSHR = "Yes" $ ELSE DECC$CRTLSHR = "No" $ ENDIF $ IF (VMS_MAJOR .LT. 7) $ THEN DECC$CRTL = DECC$CRTLSHR $ ELSE DECC$CRTL = "No" $ ENDIF $ IF (F$SEARCH("SYS$LIBRARY:DPML$SHR.EXE") .NES. "") $ THEN DPMLSHR = "Yes" $ ELSE DPMLSHR = "No" $ ENDIF $ DPML = DPMLSHR $ OPTIMIZE = "Yes" $ IF (HW .EQS. "Alpha") $ THEN FLOAT = "IEEE" $ ELSE FLOAT = "G_FLOAT" $ ENDIF $ HOME = "" $ PRINT = "" $ QUEUE = "decw$printer_format_ps" $ EDIT = "edit/tpu/display=motif" $ HELP = "mosaic" $ FFTWINC = "" $ FFTWLIB = "" $ NETCDFINC = "" $ NETCDFLIB = "" $ JPEGINC = "" $ JPEGLIB = "" $ ZINC = "" $ ZLIB = "" $ PNGINC = "" $ PNGLIB = "" $ TIFFINC = "" $ TIFFLIB = "" $ PDFINC = "" $ PDFLIB = "" $ FORCECOPY = 0 $ SAVE = 0 $! $! read saved information and add command line parameters $! $ N = 1 $ SAVEFILE = F$ELEMENT (0, "]", F$ENVIRONMENT ("PROCEDURE")) + "]SAVED.DAT" $ IF (F$SEARCH(SAVEFILE) .EQS. "") THEN GOTO NO_SAVEFILE $ echo "" $ echo "Using saved information" $ OPEN/READ IN 'SAVEFILE' $LOOP_SAVEFILE: $ READ/END=DONE_SAVEFILE IN PAR'N' $ N = N + 1 $ GOTO LOOP_SAVEFILE $DONE_SAVEFILE: $ CLOSE IN $NO_SAVEFILE: $ PAR'N' = P1 $ N = N + 1 $ PAR'N' = P2 $ N = N + 1 $ PAR'N' = P3 $ N = N + 1 $ PAR'N' = P4 $ N = N + 1 $ PAR'N' = P5 $ N = N + 1 $ PAR'N' = P6 $ N = N + 1 $ PAR'N' = P7 $ N = N + 1 $ PAR'N' = P8 $ N = N + 1 $ PAR'N' = "" $ N = 0 $LOOP_PARAM: $ N = N + 1 $ P = F$ELEMENT (0, "=", PAR'N') $ IF (P .EQS. "") THEN GOTO DONE_PARAM $ IF (P .EQS. "DPML") $ THEN $ DPML = DPMLSHR $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "NODPML") $ THEN $ DPML = "No" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "DECC$CRTL") $ THEN $ DECC$CRTL = DECC$CRTLSHR $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "NODECC$CRTL") $ THEN $ DECC$CRTL = "No" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "OPTIMIZE") $ THEN $ OPTIMIZE = "Yes" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "NOOPTIMIZE") $ THEN $ OPTIMIZE = "No" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "D_FLOAT") $ THEN $ FLOAT = "D_FLOAT" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "G_FLOAT") $ THEN $ FLOAT = "G_FLOAT" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "IEEE") $ THEN $ IF (HW .EQS. "VAX") $ THEN $ echo "" $ echo "Ignoring IEEE option on VAX" $ ELSE $ FLOAT = "IEEE" $ ENDIF $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "HOME") $ THEN $ HOME = PAR'N' - "HOME=" $ IF (F$EXTRACT(0,1,HOME) .EQS. """") THEN - HOME = F$EXTRACT(1,F$LENGTH(HOME)-1,HOME) $ IF (F$EXTRACT(F$LENGTH(HOME)-1,1,HOME) .EQS. """") THEN - HOME = F$EXTRACT(0,F$LENGTH(HOME)-1,HOME) $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "PRINT") $ THEN $ PRINT = PAR'N' - "PRINT=" $ IF (F$EXTRACT(0,1,PRINT) .EQS. """") THEN - PRINT = F$EXTRACT(1,F$LENGTH(PRINT)-1,PRINT) $ IF (F$EXTRACT(F$LENGTH(PRINT)-1,1,PRINT) .EQS. """") THEN - PRINT = F$EXTRACT(0,F$LENGTH(PRINT)-1,PRINT) $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "QUEUE") $ THEN $ QUEUE = PAR'N' - "QUEUE=" $ IF (F$EXTRACT(0,1,QUEUE) .EQS. """") THEN - QUEUE = F$EXTRACT(1,F$LENGTH(QUEUE)-1,QUEUE) $ IF (F$EXTRACT(F$LENGTH(QUEUE)-1,1,QUEUE) .EQS. """") THEN - QUEUE = F$EXTRACT(0,F$LENGTH(QUEUE)-1,QUEUE) $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "EDIT") $ THEN $ EDIT = PAR'N' - "EDIT=" $ IF (F$EXTRACT(0,1,EDIT) .EQS. """") THEN - EDIT = F$EXTRACT(1,F$LENGTH(EDIT)-1,EDIT) $ IF (F$EXTRACT(F$LENGTH(EDIT)-1,1,EDIT) .EQS. """") THEN - EDIT = F$EXTRACT(0,F$LENGTH(EDIT)-1,EDIT) $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "HELP") $ THEN $ HELP = PAR'N' - "HELP=" $ IF (F$EXTRACT(0,1,HELP) .EQS. """") THEN - HELP = F$EXTRACT(1,F$LENGTH(HELP)-1,HELP) $ IF (F$EXTRACT(F$LENGTH(HELP)-1,1,HELP) .EQS. """") THEN - HELP = F$EXTRACT(0,F$LENGTH(HELP)-1,HELP) $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "FFTW") $ THEN $ FFTWINC = F$ELEMENT (1, "=", PAR'N') $ FFTWLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "NETCDF") $ THEN $ NETCDFINC = F$ELEMENT (1, "=", PAR'N') $ NETCDFLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "JPEG") $ THEN $ JPEGINC = F$ELEMENT (1, "=", PAR'N') $ JPEGLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "ZLIB") $ THEN $ ZINC = F$ELEMENT (1, "=", PAR'N') $ ZLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "PNG") $ THEN $ PNGINC = F$ELEMENT (1, "=", PAR'N') $ PNGLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "TIFF") $ THEN $ TIFFINC = F$ELEMENT (1, "=", PAR'N') $ TIFFLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "PDF") $ THEN $ PDFINC = F$ELEMENT (1, "=", PAR'N') $ PDFLIB = F$ELEMENT (2, "=", PAR'N') - "=" $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "COPY") $ THEN $ FORCECOPY = 1 $ GOTO LOOP_PARAM $ ENDIF $ IF (P .EQS. "SAVE") $ THEN $ SAVE = 1 $ GOTO LOOP_PARAM $ ENDIF $ echo "Unrecognized option: ", P $ EXIT $DONE_PARAM: $ IF (FFTWINC .NES. "") $ THEN $ FFTWLIB = F$PARSE (FFTWLIB, "''FFTWINC'FFTW.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (NETCDFINC .NES. "" .AND. NETCDFLIB .EQS. "") $ THEN $ echo "You must specify both the include directory and the libraries" $ echo "with the NETCDF option." $ EXIT $ ENDIF $ IF (JPEGINC .NES. "") $ THEN $ JPEGLIB = F$PARSE (JPEGLIB, "''JPEGINC'LIBJPEG.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (ZINC .NES. "") $ THEN $ ZLIB = F$PARSE (ZLIB, "''ZINC'LIBZ.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (PNGINC .NES. "") $ THEN $ PNGLIB = F$PARSE (PNGLIB, "''PNGINC'LIBPNG.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (ZLIB .EQS. "" .AND. PNGLIB .NES. "") $ THEN $ echo "You must include ZLIB if you want PNG." $ EXIT $ ENDIF $ IF (TIFFINC .NES. "") $ THEN $ TIFFLIB = F$PARSE (TIFFLIB, "''TIFFINC'TIFF.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (PDFINC .NES. "") $ THEN $ PDFLIB = F$PARSE (PDFLIB, "''PDFINC'PDFLIB.OLB",,, "SYNTAX_ONLY") - ";" $ ENDIF $ IF (SAVE) $ THEN $ IF (F$SEARCH(SAVEFILE) .EQS. "") $ THEN $ OPEN/WRITE OUT 'SAVEFILE' $ ELSE $ OPEN/APPEND OUT 'SAVEFILE' $ ENDIF $ IF (P1 .NES. "" .AND. P1 .NES. "SAVE") THEN WRITE OUT P1 $ IF (P2 .NES. "" .AND. P2 .NES. "SAVE") THEN WRITE OUT P2 $ IF (P3 .NES. "" .AND. P3 .NES. "SAVE") THEN WRITE OUT P3 $ IF (P4 .NES. "" .AND. P4 .NES. "SAVE") THEN WRITE OUT P4 $ IF (P5 .NES. "" .AND. P5 .NES. "SAVE") THEN WRITE OUT P5 $ IF (P6 .NES. "" .AND. P6 .NES. "SAVE") THEN WRITE OUT P6 $ IF (P7 .NES. "" .AND. P7 .NES. "SAVE") THEN WRITE OUT P7 $ IF (P8 .NES. "" .AND. P8 .NES. "SAVE") THEN WRITE OUT P8 $ CLOSE OUT $ ENDIF $ IF (PRINT .EQS. "") THEN - PRINT = "print/name=""from Grace""/delete/queue=" + QUEUE $ IF (F$LOCATE("%s",HELP) .EQ. F$LENGTH(HELP)) THEN HELP = HELP + " %s" $! $! Define the __CRTL_VER symbol. $! $ IF (DECC$CRTL) THEN DEFINE/USER DECC$CRTLMAP SYS$LIBRARY:DECC$CRTL.EXE $ CC/OBJECT=DEFINE_CRTL_VER.OBJ SYS$INPUT #include #include #include #include #ifndef __CRTL_VER # define __CRTL_VER __VMS_VER #endif main () { static $DESCRIPTOR(crtl,"__CRTL_VER"); struct dsc$descriptor_s val = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; static int tab = {1}; char str[10]; val.dsc$w_length = sprintf (str, "%d", __CRTL_VER); val.dsc$a_pointer = str; exit (lib$set_symbol (&crtl, &val, &tab)); } $ LINK/EXECUTABLE=DEFINE_CRTL_VER.EXE DEFINE_CRTL_VER.OBJ $ RUN DEFINE_CRTL_VER.EXE $ DELETE DEFINE_CRTL_VER.OBJ;*,DEFINE_CRTL_VER.EXE;* $ __CRTL_VER = F$INTEGER(__CRTL_VER) $! $! Write the configureation. $! $ OPEN/WRITE OUT CONFIGURE.LOG $ WRITE OUT "Configuration of GRACE for VMS on ", F$GETSYI("NODENAME"), - " at ", F$TIME() $ WRITE OUT "" $ WRITE OUT "VMS version: ", VMSVERSION $ WRITE OUT "Architecture: ", HW $ WRITE OUT "GUI: Motif ", DECWVERSION $ WRITE OUT "DECC version: ", DECCVERSION $ WRITE OUT "Use DECC$CRTL.OLB: ", DECC$CRTL $ WRITE OUT "CRTL version: ", __CRTL_VER $ WRITE OUT "Use DPML: ", DPML $ WRITE OUT "Optimize: ", OPTIMIZE $ WRITE OUT "Floating point: ", FLOAT $ WRITE OUT "Home directory: ", HOME $ WRITE OUT "Print command: ", PRINT $ WRITE OUT "Edit command: ", EDIT $ WRITE OUT "Help viewer: ", HELP $ IF (FFTWLIB .EQS. "") $ THEN $ WRITE OUT "FFTW: Not used" $ ELSE $ WRITE OUT "FFTW: Include dir: ", FFTWINC $ WRITE OUT " Library: ", FFTWLIB $ ENDIF $ IF (NETCDFLIB .EQS. "") $ THEN $ WRITE OUT "NetCDF: Not used" $ ELSE $ WRITE OUT "NetCDF: Include dir: ", NETCDFINC $ WRITE OUT " Libraries: ", NETCDFLIB $ ENDIF $ IF (JPEGLIB .EQS. "") $ THEN $ WRITE OUT "JPEG: Not used" $ ELSE $ WRITE OUT "JPEG: Include dir: ", JPEGINC $ WRITE OUT " Library: ", JPEGLIB $ ENDIF $ IF (ZLIB .EQS. "") $ THEN $ WRITE OUT "ZLIB: Not used" $ ELSE $ WRITE OUT "ZLIB: Include dir: ", ZINC $ WRITE OUT " Library: ", ZLIB $ ENDIF $ IF (PNGLIB .EQS. "") $ THEN $ WRITE OUT "PNG: Not used" $ ELSE $ WRITE OUT "PNG: Include dir: ", PNGINC $ WRITE OUT " Library: ", PNGLIB $ ENDIF $ IF (TIFFLIB .EQS. "") $ THEN $ WRITE OUT "TIFF: Not used" $ ELSE $ WRITE OUT "TIFF: Include dir: ", TIFFINC $ WRITE OUT " Library: ", TIFFLIB $ ENDIF $ IF (PDFLIB .EQS. "") $ THEN $ WRITE OUT "PDF: Not used" $ ELSE $ WRITE OUT "PDF: Include dir: ", PDFINC $ WRITE OUT " Library: ", PDFLIB $ ENDIF $ CLOSE OUT $ echo "" $ TYPE/NOPAGE CONFIGURE.LOG $ echo "" $! $! define symbols for the other directories $! $ MAIN_DIR := [--] $ CEPHES_DIR := [--.CEPHES] $ T1LIB_DIR := [--.T1LIB] $ T1LIB_T1LIB_DIR := [--.T1LIB.T1LIB] $ T1LIB_TYPE1_DIR := [--.T1LIB.TYPE1] $ XBAE_DIR := [--.XBAE.XBAE] $ SRC_DIR := [--.SRC] $ GRCONVERT_DIR := [--.GRCONVERT] $ EXAMPLES_DIR := [--.EXAMPLES] $ CONF_DIR := [--.AC-TOOLS] $! $! save the current directory and set default to the vms directory $! $ CURDIR = F$ENVIRONMENT ("DEFAULT") $ VMSDIR = F$ELEMENT (0, "]", F$ENVIRONMENT ("PROCEDURE")) + "]" $ SET DEFAULT 'VMSDIR' $! $! copy files to other directories $! $ IF (FORCECOPY .OR. F$SEARCH("''MAIN_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY DESCRIP.MMS 'MAIN_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''CEPHES_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY CEPHES.MMS 'CEPHES_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''T1LIB_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY T1LIB.MMS 'T1LIB_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''T1LIB_T1LIB_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY T1LIB_T1LIB.MMS 'T1LIB_T1LIB_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''T1LIB_TYPE1_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY T1LIB_TYPE1.MMS 'T1LIB_TYPE1_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''XBAE_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY XBAE.MMS 'XBAE_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''SRC_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY SRC.MMS 'SRC_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''GRCONVERT_DIR'DESCRIP.MMS") .EQS. "") THEN - COPY GRCONVERT.MMS 'GRCONVERT_DIR'DESCRIP.MMS $ IF (FORCECOPY .OR. F$SEARCH("''EXAMPLES_DIR'DOTEST.COM") .EQS. "") THEN - COPY DOTEST.COM 'EXAMPLES_DIR'DOTEST.COM $! $! Copy the default font encoding file. $! $ IF (F$SEARCH("[--.FONTS.ENC]DEFAULT.ENC") .EQS. "") THEN - COPY [--.FONTS.ENC]ISOLATIN1.ENC [--.FONTS.ENC]DEFAULT.ENC $! $! Rename files in [.DOC]. $! $RENAMEDOC: $ FILE = F$SEARCH ("[--.DOC]*.*_*") $ IF (FILE .NES. "") $ THEN $ NAME = F$PARSE (FILE,,, "NAME") $ TYPE = F$PARSE (FILE,,, "TYPE") - "." $ REAL = F$ELEMENT (3, "_", TYPE) $ IF (REAL .EQS. "_") $ THEN $ REAL = F$ELEMENT (2, "_", TYPE) $ IF (REAL .EQS. "_") $ THEN $ REAL = F$ELEMENT (1, "_", TYPE) $ ENDIF $ ENDIF $ N = F$LENGTH (TYPE) - F$LENGTH (REAL) - 1 $ NAME = NAME + "_" + F$EXTRACT (0, N, TYPE) $ RENAME 'FILE' [--.DOC]'NAME'.'REAL' $ GOTO RENAMEDOC $ ENDIF $! $! Define symbols for make.conf. These symbols are in make.conf_in; they $! are set to the value they should be in make.conf. $! $ O = ".obj" $ EXE = ".exe" $ BAT = ".com" $ SHELL = "" $ PREFIX = "" $ SUBDIRS = "cephes t1lib xbae src" $ GRACE = "xmgrace$(EXE)" $ GRACE_HOME = HOME $ IF (HW .EQS. "Alpha" .OR. DECC_MAJOR .GE. 6) $ THEN ALLOCA = "" $ ELSE ALLOCA = "alloca$(O)" $ ENDIF $ T1_LIB = ",[-.T1LIB]libt1lib.olb/LIBRARY" $ T1_INC = ",[-.T1LIB.T1LIB]" $ T1_AA_TYPE16 = "short" $ T1_AA_TYPE32 = "int" $ T1_AA_TYPE64 = "" $ XDR_LIB = "" $ DL_LIB = "" $ IF (FFTWLIB .NES. "") $ THEN FFTW_LIB = "," + FFTWLIB + "/LIBRARY" $ ELSE FFTW_LIB = "" $ ENDIF $ NETCDF_LIBS = "" $ IF (NETCDFLIB .EQS. "") THEN GOTO DONE_NETCDF_LIBS $ N = 0 $LOOP_NETCDF_LIBS: $ LIB = F$ELEMENT (N, ",", NETCDFLIB) $ IF (LIB .EQS. ",") THEN GOTO DONE_NETCDF_LIBS $ NETCDF_LIBS = NETCDF_LIBS + "," + LIB + "/LIBRARY" $ N = N + 1 $ GOTO LOOP_NETCDF_LIBS $DONE_NETCDF_LIBS: $ IF (JPEGLIB .NES. "") $ THEN JPEG_LIB = "," + JPEGLIB + "/LIBRARY" $ ELSE JPEG_LIB = "" $ ENDIF $ IF (ZLIB .NES. "") $ THEN Z_LIB = "," + ZLIB + "/LIBRARY" $ ELSE Z_LIB = "" $ ENDIF $ IF (PNGLIB .NES. "") $ THEN PNG_LIB = "," + PNGLIB + "/LIBRARY" $ ELSE PNG_LIB = "" $ ENDIF $ IF (TIFFLIB .NES. "") $ THEN TIFF_LIB = "," + TIFFLIB + "/LIBRARY" $ ELSE TIFF_LIB = "" $ ENDIF $ IF (PDFLIB .NES. "") $ THEN $ PDF_LIB = "," + PDFLIB + "/LIBRARY" $ PDFDRV_O = "pdfdrv$(O)" $ ELSE $ PDF_LIB = "" $ PDFDRV_O = "" $ ENDIF $ XBAE_INC = "[-.XBAE.XBAE]" $ YACC = "" $ CC = "cc" $ FC = "fortran" $ AR = "library" $ RANLIB = "" $ RM = "delete/log" $ LN_S = "" $ INSTALL = "" $ INSTALL_PROGRAM = "" $ INSTALL_DATA = "" $ MKINSTALLDIRS = "" $ CPPFLAGS = "" $ IF (DPMLSHR .AND. .NOT. DPML) $ THEN $ CFLAGS0 = "/PREFIX=(ALL,EXCEPT=(CBRT,LOG2,RINT,ASINH,ACOSH,ATANH," - + "ERF,ERFC,J0,J1,JN,Y0,Y1,YN))" $ ELSE $ CFLAGS0 = "/PREFIX=ALL" $ ENDIF $ CFLAGS0 = CFLAGS0 + "/FLOAT=" + FLOAT $ IF (.NOT. OPTIMIZE) THEN CFLAGS0 = CFLAGS0 + "/NOOPTIMIZE" $ GUI_FLAGS = "" $ LDFLAGS = "" $ IF (DECC$CRTL) $ THEN $ NOGUI_LIBS = ",sys$library:decc$crtl.olb/LIBRARY" $ IF (HW .EQS. "VAX") THEN - NOGUI_LIBS = NOGUI_LIBS + ",sys$library:vaxc$lcl.opt/OPTION" $ ELSE $ NOGUI_LIBS = "" $ ENDIF $ GUI_LIBS = ",[-.XBAE.XBAE]libxbae.olb/LIBRARY,[-.ARCH.VMS]motif1_2.opt/OPTION" $ PRINT_CMD = F$ELEMENT (0, """", PRINT) $ N = 1 $LOOP_PRINT_CMD: $ P = F$ELEMENT (N, """", PRINT) $ IF (P .NES. """") $ THEN $ PRINT_CMD = PRINT_CMD + "\\042" + P $ N = N + 1 $ GOTO LOOP_PRINT_CMD $ ENDIF $ GRACE_EDITOR = EDIT $ HELPVIEWER = HELP $! $! create make.conf $! $ echo "Creating make.conf" $ OPEN/READ IN 'CONF_DIR'MAKE.CONF_IN $ OPEN/WRITE OUT 'MAIN_DIR'MAKE.CONF $LOOP_MAKE_CONF: $ READ/END=DONE_MAKE_CONF IN REC $ IF (F$LOCATE("=",REC) .NE. F$LENGTH(REC)) $ THEN $ SYM = F$ELEMENT(0,"=",REC) $ IF (F$TYPE('SYM') .EQS. "") $ THEN $ WRITE SYS$OUTPUT "No DCL symbol for ", REC $ ELSE $ REC = SYM + "=" + 'SYM' $ ENDIF $ ELSE $ IF (REC .EQS. ".SUFFIXES:") THEN REC = "#.SUFFIXES:" ! allow make rules $ ENDIF $ WRITE OUT REC $ GOTO LOOP_MAKE_CONF $DONE_MAKE_CONF: $ CLOSE IN $ LIB_INC = "" $ IF (FFTWINC .NES. "") THEN LIB_INC = LIB_INC + "," + FFTWINC $ IF (NETCDFINC .NES. "") THEN LIB_INC = LIB_INC + "," + NETCDFINC $ IF (JPEGINC .NES. "") THEN LIB_INC = LIB_INC + "," + JPEGINC $ IF (ZINC .NES. "") THEN LIB_INC = LIB_INC + "," + ZINC $ IF (PNGINC .NES. "") THEN LIB_INC = LIB_INC + "," + PNGINC $ IF (TIFFINC .NES. "") THEN LIB_INC = LIB_INC + "," + TIFFINC $ IF (PDFINC .NES. "") THEN LIB_INC = LIB_INC + "," + PDFINC $ WRITE OUT "" $ WRITE OUT "# Library include directories" $ WRITE OUT "LIB_INC=", LIB_INC $ WRITE OUT "" $ WRITE OUT "# Use DECC$CRTL.OLB object library" $ IF (DECC$CRTL) $ THEN WRITE OUT "USE_DECC$CRTL=1" $ ELSE WRITE OUT "#USE_DECC$CRTL=1" $ ENDIF $ WRITE OUT "" $ WRITE OUT "# C compiler" $ CCOMPILER = "DECC " + DECCVERSION $ IF (DECC$CRTL) THEN CCOMPILER = CCOMPILER + "/DECC$CRTL.OLB" $ IF (DPML) $ THEN CCOMPILER = CCOMPILER + "/DPML" $ ELSE CCOMPILER = CCOMPILER + "/No DPML" $ ENDIF $ IF (.NOT. OPTIMIZE) THEN CCOMPILER = CCOMPILER + "/No Optimize" $ CCOMPILER = CCOMPILER + "/" + FLOAT $ IF (NETCDFINC .NES. "") THEN CCOMPILER = CCOMPILER + "/NETCDF" $ WRITE OUT "CCOMPILER=", CCOMPILER $ CLOSE OUT $! $! define symbols for config.h $! These symbols are in config.h_in; if the DCL symbol is equal to 0, $! the symbol should be undefined in config.h; otherwise, it should be $! defined to the value of the DCL symbol. I define all values in DCL $! (instead of just those that need to be defined in config.h) so I can $! check when symbols are added to config.h_in. $! $ _ALL_SOURCE = 0 $ _POSIX_SOURCE = 0 $ STDC_HEADERS = 1 $ __CHAR_UNSIGNED__ = 0 $ SIZEOF_CHAR = "sizeof(char)" $ SIZEOF_SHORT = "sizeof(short)" $ SIZEOF_INT = "sizeof(int)" $ SIZEOF_LONG = "sizeof(long)" $ IF (HW .EQS. "Alpha") $ THEN SIZEOF_LONG_LONG = "sizeof(long long)" $ ELSE SIZEOF_LONG_LONG = "0" $ ENDIF $ SIZEOF_FLOAT = "sizeof(float)" $ SIZEOF_DOUBLE = "sizeof(double)" $ IF (HW .EQS. "Alpha") $ THEN SIZEOF_LONG_DOUBLE = "sizeof(long double)" $ ELSE SIZEOF_LONG_DOUBLE = "0" $ ENDIF $ SIZEOF_VOID_P = "sizeof(void *)" $ const = 0 $ pid_t = 0 $ size_t = 0 $ HAVE_UNISTD_H = 1 $ CRAY_STACKSEG_END = 0 $ HAVE_ALLOCA = (HW .EQS. "Alpha") .OR. (DECC_MAJOR .GE. 6) $ C_ALLOCA = (.NOT. HAVE_ALLOCA) .AND. 1 $ HAVE_ALLOCA_H = 0 $ RETSIGTYPE = "void" $ HAVE_SYS_WAIT_H = 1 $ HAVE_FCNTL_H = 1 $ HAVE_SYS_PARAM_H = 0 $ HAVE_SYS_TIME_H = 1 $ HAVE_SYS_SELECT_H = 0 $ TM_IN_SYS_TIME = 1 $ TIME_WITH_SYS_TIME = 1 $ HAVE_GETTIMEOFDAY = __CRTL_VER .GE. 70000000 $ HAVE_GETCWD = 1 $ HAVE_GETHOSTNAME = __CRTL_VER .GE. 50500000 $ HAVE_MEMCPY = 1 $ HAVE_MEMMOVE = 1 $ HAVE_UNLINK = 0 $ HAVE_FCNTL = __CRTL_VER .GE. 70200000 $ HAVE_POPEN = __CRTL_VER .GE. 70000000 $ HAVE_FNMATCH = 0 $ HAVE_ON_EXIT = 0 $ HAVE_STRSTR = 1 $ HAVE_STRERROR = 1 $ HAVE_SYS_ERRLIST_DECL = 0 $ HAVE_VSNPRINTF = 0 $ HAVE_DLOPEN = 0 $ HAVE_RTLD_NOW = 0 $ HAVE_SHL_LOAD = 0 $ WORDS_BIGENDIAN = 0 $ HAVE_DEC_FPU = FLOAT .NES. "IEEE" $ HAVE_LIEEE_FPU = (.NOT. HAVE_DEC_FPU) .AND. 1 $ HAVE_BIEEE_FPU = 0 $ REALLOC_IS_BUGGY = 0 $ HAVE_DRAND48 = __CRTL_VER .GE. 70000000 $ HAVE_SETLOCALE = __CRTL_VER .GE. 60200000 $ HAVE_DRAND48_DECL = HAVE_DRAND48 $ HAVE_LIBM = 1 $ HAVE_MATH_H = 1 $ HAVE_FLOAT_H = 1 $ HAVE_IEEEFP_H = 0 $ HAVE_HYPOT = 1 $ HAVE_HYPOT_DECL = HAVE_HYPOT $ HAVE_CBRT = F$INTEGER(DPML) $ HAVE_CBRT_DECL = HAVE_CBRT $ HAVE_LOG2 = F$INTEGER(DPML) $ HAVE_LOG2_DECL = HAVE_LOG2 $ HAVE_RINT = F$INTEGER(DPML) $ HAVE_RINT_DECL = HAVE_RINT $ HAVE_LGAMMA = 0 $ HAVE_LGAMMA_DECL = HAVE_LGAMMA $ HAVE_SIGNGAM_DECL = (HW .EQS. "Alpha") $ HAVE_ASINH = F$INTEGER(DPML) $ HAVE_ASINH_DECL = HAVE_ASINH $ HAVE_ACOSH = F$INTEGER(DPML) $ HAVE_ACOSH_DECL = HAVE_ACOSH $ HAVE_ATANH = F$INTEGER(DPML) $ HAVE_ATANH_DECL = HAVE_ATANH $ HAVE_ERF = F$INTEGER(DPML) $ HAVE_ERF_DECL = HAVE_ERF $ HAVE_ERFC = F$INTEGER(DPML) $ HAVE_ERFC_DECL = HAVE_ERFC $ HAVE_FINITE = (HW .EQS. "Alpha") $ HAVE_FINITE_DECL = HAVE_FINITE $ HAVE_ISFINITE = 0 $ HAVE_ISFINITE_DECL = HAVE_ISFINITE $ HAVE_ISNAN = (HW .EQS. "Alpha") $ HAVE_ISNAN_DECL = HAVE_ISNAN $ HAVE_J0 = F$INTEGER(DPML) $ HAVE_J0_DECL = HAVE_J0 $ HAVE_J1 = F$INTEGER(DPML) $ HAVE_J1_DECL = HAVE_J1 $ HAVE_JN = F$INTEGER(DPML) $ HAVE_JN_DECL = HAVE_JN $ HAVE_Y0 = F$INTEGER(DPML) $ HAVE_Y0_DECL = HAVE_Y0 $ HAVE_Y1 = F$INTEGER(DPML) $ HAVE_Y1_DECL = HAVE_Y1 $ HAVE_YN = F$INTEGER(DPML) $ HAVE_YN_DECL = HAVE_YN $ HAVE_NETCDF = NETCDFLIB .NES. "" $ HAVE_FFTW = FFTWLIB .NES. "" $ HAVE_LIBPNG = PNGLIB .NES. "" $ HAVE_LIBJPEG = JPEGLIB .NES. "" $ HAVE_LIBPDF = PDFLIB .NES. "" $ WITH_F77_WRAPPER = 1 $ X_DISPLAY_MISSING = 0 $ HAVE_MOTIF = 1 $ HAVE_LESSTIF = 0 $ HAVE__XMVERSIONSTRING = 0 $ HAVE_XPM = 0 $ HAVE_XPM_H = 0 $ HAVE_X11_XPM_H = 0 $ WITH_LIBHELP = 0 $ WITH_XMHTML = 0 $ WITH_EDITRES = 0 $ PRINT_CMD_UNLINKS = 1 $ WITH_DEBUG = 0 $! $! create config.h $! Any lines beginning with #define SIZEOF or #undef are rewritten; all $! other lines are copied to the output. $! $ echo "Creating config.h" $ OPEN/READ IN 'CONF_DIR'CONFIG.H_IN $ OPEN/WRITE OUT 'MAIN_DIR'CONFIG.H $LOOP_CONFIG_H: $ READ/END=DONE_CONFIG_H IN REC $ IF (F$ELEMENT(0," ",REC) .EQS. "#define") ! check for #define SIZEOF* $ THEN $ SYM = F$ELEMENT(1," ",REC) $ IF (F$EXTRACT(0,6,SYM) .EQS. "SIZEOF") $ THEN $ IF (F$TYPE('SYM') .EQS. "") $ THEN $ WRITE SYS$OUTPUT "No DCL symbol for ", REC $ ELSE $ REC = "#define " + SYM + " " + 'SYM' $ ENDIF $ ENDIF $ ELSE $ IF (F$ELEMENT(0," ",REC) .EQS. "#undef") ! check for #undef * $ THEN $ SYM = F$ELEMENT(1," ",REC) $ IF (F$TYPE('SYM') .EQS. "") $ THEN $ WRITE SYS$OUTPUT "No DCL symbol for ", REC $ ELSE $ VAL = 'SYM' $ IF (F$TYPE(VAL) .EQS. "STRING" .OR. VAL .NE. 0) $ THEN $ REC = "#define " + SYM + " " + F$STRING(VAL) $ ENDIF $ ENDIF $ ENDIF $ ENDIF $ WRITE OUT REC $ GOTO LOOP_CONFIG_H $DONE_CONFIG_H: $ CLOSE IN $ CLOSE OUT $! $! restore directory and exit $! $ SET DEFAULT 'CURDIR' $ EXIT grace-5.1.23/arch/vms/readme0000644000076500001440000003170307064715101015337 0ustar fnevgenyusersREADME for GRACE on VMS -- 1-Oct-1999 People who have worked on Grace for VMS: Rolf Niepraschk (niepraschk@ptb.de) John Hasstedt (John.Hasstedt@sunysb.edu) Martin Zinser (zinser@decus.decus.de) 1. Introduction I have compiled this version of Grace on VMS version 7.2 with DECC version 5.7. I have allowed for other versions, but may have missed some things. Please send mail to John Hasstedt if you have any problems building; include CONFIGURE.LOG in your message. Grace calls library functions not included in VMS until version 7. Starting with version 5.6 of DECC, Compaq distributes an object library (sys$library:decc$crtl.olb) containing these new functions (see sys$libray:decc$crtl.readme for information on it). On VMS version 6 and older, you can build Grace using this library, or you can build it with versions of the needed routines that are [.src]missing.c. The default is to use the decc$crtl library if it exists on VMS version 6 and older, and to not use it on VMS version 7. The build procedure runs a program (buildinfo) to create a header file (buildinfo.h) contining information on when and where it is built. This program requires the new routines. Instead of modifying it to work with older versions, I wrote some DCL code to create buildinfo.h. This code is not executed automatically. If you do not use decc$crtl on version 6 and older of VMS, you must do @[.ARCH.VMS]BUILD BUILDINFO before building with MMK or MMS. Grace requires Motif 1.2; it uses the Tab widget and Xbae, which do not support with Motif 1.1. 2. Other software There are five libraries that can be included with Grace: FFTW does fast fourier transforms and allows you to do non-power-of-2 length FFT's along with the normal ones; NetCDF allows you to read files in the HDF format; PNG, JPEG, and PDF allow you to write PNG, JPEG, and PDF files. When you compile the libraries, you should use the same floating point format (IEEE, G_FLOAT, or D_FLOAT) as you use with Grace; note that the TIFF library (which may be included with PDF) supports IEEE and D_FLOAT only. The FFTW package is at http://www.fftw.org/. Compile all the C files in [.fftw] with the command CC /FLOAT=IEEE /PREFIX=ALL /INCLUDE=[] then create a library (fftw.olb) containing all the object files. Change the /FLOAT qualifier if you are using a different format. The NETCDF package is at ftp://ftp.ncsa.uiuc.edu/HDF/, including precompiled binaries for VAX and Alpha. The JPEG library, the PNG library, and the ZLIB library (required if you want PNG) are in the Ghostscript distribution at http://www.cs.wisc.edu/~ghost/index.html. You will need to modify the make file to use the floating point format you use with Grace. There is also a precompiled version of the JPEG library in the netcdf distribution. The TIFF library is at http://www.libtiff.org/. By default, it uses IEEE on Alpha and D_FLOAT on VAX; the code will not work with G_FLOAT, so you must use IEEE or D_FLOAT for Grace. Grace does not do TIFF output, but configure.in says it may be needed for pdflib; my experience was that it is not needed. The PDF library is at http://www.pdflib.com/. Get the Unix distribution and compile the C files in [.pdflib] with the command CC/FLOAT=IEEE/PREFIX=ALL - /DEFINE=(HAVE_SETLOCALE="",HAVE_LIBZ,HAVE_LIBTIFF) - /INCLUDE=(,) - /WARNING=(DISABLE=LONGEXTERN) then create an object library (pdflib.olb) from all the files. Change the /FLOAT qualifier if you are using a different format. If you don't have the TIFF library, omit HAVE_LIBTIFF and the libtiff include directory. 3. Compilation In the top directory, do @[.ARCH.VMS]CONFIGURE [OPTIONS] Then do one of the following: MMK MMS /IGNORE=WARNING @[.ARCH.VMS]BUILD MMK is MadGoat's make utility; you can get it from ftp://ftp.madgoat.com/madgoat/mmk.zip. MMS is Compaq's make utility; the /IGNORE=WARNING is necessary with MMS to get the T1 library to build. If you don't have either make utility, the BUILD.COM command file will compile and link Grace. Configure accepts options as parameters on the command line. Separate multiple options with spaces. Note that you CANNOT put spaces around the equal sign. Configure accepts the following options: DECC$CRTL -- Use the DECC$CRTL.OLB library if it exists (see section 1). The default is to use the library (if it exists) on systems running version 6 and older of VMS. If you do not use DECC$CRTL on version 6 or older of VMS, you must first do @[.ARCH.VMS]BUILD BUILDINFO if you are building with MMK or MMS. NODECC$CRTL -- Do not use the DECC$CRTL. DPML -- Use the DPML if it exists. This option allows you to override a NODPML specified in a save file. DPML is the Digital Portable Math Library; it contains hyperbolic trig and other functions. It does not exist on the VAX. Grace uses the routines in the cephes library if you don't have the DPML. NODPML -- Do not use the DPML even if the system has it. OPTIMIZE -- Use the optimizer when you compile code. This is the default. This option allows you to override a NOOPTIMIZE specified in a save file. NOOPTIMIZE -- Compile the code with /NOOPTIMIZE. D_FLOAT, G_FLOAT, IEEE -- Specify the type of floating point; the default is G on VAX and IEEE on Alpha. IEEE is not available on VAX. You will get errors about overflow and underflow of some constants in [.t1lib.type1]token.c from the T1 library if you use D_FLOAT. However, grace still works (you should use MMS/IGNORE=WARNING to compile if you select D_FLOAT). If you are including libraries (FFTW, NETCDF, JPEG, ZLIB, PNG, TIFF, and PDF options), you should compile the library using the same floating point you use here. HOME="/dev/dir" -- Specify the home directory for grace; it must be in Unix format. You can override this compiled in directory when running grace by defining the logical name GRACE_HOME. The default is "", and you have to define the logical name. PRINT="print cmd" -- Specify the default print command. If you don't specify a print command, configure will use print/name="from Grace"/delete/queue= where is specified with the QUEUE option. You should not double the quotes in the string: PRINT="print/name="from Grace"..." You can override this compiled in command when running by defining the logical name GRACE_PRINT_CMD. QUEUE="queue" -- This option is ignored if you include the PRINT option. The default is decw$printer_format_ps. Note that the string you specify is appended to the string given above, so you can add other print qualifiers. For example, QUEUE="psqueue/form=ps" EDIT="edit command" -- The command used to open a new window and start the text editor. The default is edit/tpu/interface=motif. You can override this compiled in command when running by defining the logical name GRACE_EDITOR. HELP="browser" -- Specify the command used to start the html browser for viewing help; you can override this compiled in command by defining the logical name GRACE_HELPVIEWER. The default is mosaic. A %s indicates where the URL should be added; if you omit it, " %s" will be added to the end. There is a command file, [.arch.vms]netscape.com, that you can use with netscape. When you select help, this command file will start netscape if it is not already running; otherwise, it will display the new help in a new window using the existing netscape process. To use it, you need to specify HELP="@dev:[dir]netscape.com %s"; you cannot use GRACE_HOME: instead of the device and directory because GRACE_HOME is defined in Unix format. FFTW=
= -- Include the FFTW library.
is the directory containing the header files and is the object library. The default library is fftw.olb in the
directory; you can omit the second equal sign if you use the default. NETCDF=
= -- Include the netcdf library.
is the directory containing the netcdf header files. is a list of the netcdf object libraries, separated by commas. JPEG=
= -- ZLIB=
= -- PNG=
= -- TIFF=
= -- PDF=
= -- Include the other graphics libraries.
is the directory containing the header files and is the object library. The default libraries are libjpeg.olb, libz.olb, libpng.olb, tiff.olb, and pdflib.olb, respectively, and in the
directory; you can omit the second equal sign if you use the default. You must include ZLIB if you include PNG. COPY -- Copy the build files from [.arch.vms] to the other directories even if the files already exist in the other directories. This option is used when debugging the build procedures to make sure the version in the other directories is the same as the version in [.arch.vms]. SAVE -- Save the command line parameters in [.arch.vms]saved.dat. If this file exists when you execute configure.com, configure.com reads the file and processes the parameters in it before processing the command line parameters. If you specify the SAVE option and saved.dat exists, the new command line parameters are appended to the file; if you specify a parameter that is already in the save file, the original parameter will remain in the file, but the new parameter will override it. For example, if you run configure with parameters QUEUE="psprinter" and SAVE, in future runs of configure.com, QUEUE will default to psprinter. However, any value for QUEUE on the command line will override this, and if you specify QUEUE and SAVE on a later run, the new value of QUEUE will override the old one. You can also edit saved.dat to add or delete parameters. The file is just the parameters you specify on the command line, one on each line of the file. Configure displays the versions and parameters it is using for the build and writes this information to configure.log. 4. Installation To run, you need the files in [.doc] and [.fonts...], and [.templates]default.agr. You probably want the files in [.examples]. These directories should be subdirectories of the home directory. Define a symbol for the executable: $ xmgrace :== $disk:[path]xmgrace Define the following logicals if necessary: $ define GRACE_HOME "/disk/dir1/dir2/grace" ! The path to the directory containing [.doc], [.fonts], and [.templates] ! in Unix format. See the description of the HOME= option above. $ define GRACE_PRINT_CMD ! See the description of the PRINT= option above. $ define GRACE_EDITOR ! See the description of the EDIT= option above. $ define GRACE_HELPVIEWER "www-browser %s" ! See the description of the HELP= option above. X-resources: The file [.SRC]XMGRACE.AD contains the x resources. You may want to copy this file to XMGRACE.DAT in either DECW$SYSTEM_DEFAULTS and/or DECW$USER_DEFAULTS to customize the program. 5. Testing $ set default [.examples] $ @dotest Click exit after each test to display the next test. 6. Other routines Grace_np is a library for interfacing with Grace using pipes. I have not yet gotten it to work on VMS. I have included my notes in case someone wants to work on it. I had to modify grace_np.c: I changed the call to execlp to execl; and I changed the first parameter of the call to execl to the complete file specification ("/dev/dir/xmgrace.exe"). I couldn't get it to work with logical names or symbols. I then compiled with $ CFLAGS = "/INCLUDE=[-]/PREFIX=ALL" $ DEFINE/NOLOG DECC$CRTLMAP SYS$LIBRARY:DECC$CRTL.EXE $ CC'CFLAGS' TEST_NP $ CC'CFLAGS' GRACE_NP $ LINK TEST_NP,GRACE_NP,SYS$LIBRARY:DECC$CRTL.OLB/LIBRARY $ RUN TEST_NP The DEFINE and including DECC$CRTL.OLB on the link are not necessary on VMS version 7. TEST_NP will run Grace as a subprocess, but is not able to pass any commands to it. GRCONVERT is a program to convert the binary projects from older versions of XMGR to ascii format. It needs RPC routines included with TCPIP software. If you need it, there is a descrip.mms file in the directory. The default is to compile with D floating point; use /MACRO=(FLOAT=) to compile with either G_FLOAT or IEEE format. The default is for systems running UCX. I have added code to descrip.mms so you can use /MACRO=(MULTINET=1) to compile with multinet; however, there are errors about undefined symbols when linking, so you will need to do some debugging if you need this. 7. Bugs Send questions about building on VMS to John.Hasstedt@sunysb.edu. Send questions about use or bug reports to the grace mailing list. grace-5.1.23/Xbae/0000755000076500001440000000000012032153126013302 5ustar fnevgenyusersgrace-5.1.23/Xbae/Xbae/0000755000076500001440000000000012032153126014161 5ustar fnevgenyusersgrace-5.1.23/Xbae/Xbae/ScrollMgr.c0000644000076500001440000013042506766327622016263 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: ScrollMgr.c,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * ScrollMgr.c created by Andrew Lister (7 August, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include /* * ScrollMgr implementation. * When we scroll using XCopyArea, occluding windows will cause GraphicsExpose * events to be generated, if there are no occluding windows then NoExpose * events will be generated. The removal of occluding windows will cause Expose * events. If a number of scrolls (XCopyAreas) occur in quick succession, * the events will contain obsolete x/y information since our internal * coordinates have been scrolled to a new location. The ScrollMgr * keeps track of scrolls and offsets required to relocate the events to the * current coordinate system. * * The Matrix widget has two ScrollMgrs, one for the Matrix's window * and one for the Clip widget's window. * * Each widgets compress_exposures field should be XtExposeCompressSeries * or XtExposeNoCompress. * * The idea behind this code is based on the PanHandler posted by Chuck Ocheret * (chuck@fid.morgan.com) */ /* * Create and initialize a ScrollMgr */ SmScrollMgr xbaeSmCreateScrollMgr() { SmScrollMgr scrollMgr = XtNew(SmScrollMgrRec); scrollMgr->offset_x = 0; scrollMgr->offset_y = 0; scrollMgr->scroll_count = 0; scrollMgr->scroll_queue = NULL; scrollMgr->scrolling = False; return scrollMgr; } /* * Destroy a ScrollMgr, including any queued scrolls */ void xbaeSmDestroyScrollMgr(scrollMgr) SmScrollMgr scrollMgr; { if (scrollMgr->scroll_queue) { SmScrollNode node = scrollMgr->scroll_queue->next; while (node != scrollMgr->scroll_queue) { SmScrollNode d = node; node = node->next; XtFree((XtPointer) d); } XtFree((XtPointer) node); } XtFree((XtPointer) scrollMgr); } /* * Record a new scroll request in the ScrollMgr */ void xbaeSmAddScroll(scrollMgr, delta_x, delta_y) SmScrollMgr scrollMgr; int delta_x; int delta_y; { SmScrollNode node = XtNew(SmScrollNodeRec); node->x = delta_x; node->y = delta_y; scrollMgr->offset_x += delta_x; scrollMgr->offset_y += delta_y; scrollMgr->scroll_count++; /* * Insert the node at the end of the queue */ if (!scrollMgr->scroll_queue) { scrollMgr->scroll_queue = node; node->next = node; node->prev = node; } else { SmScrollNode last = scrollMgr->scroll_queue->prev; last->next = node; node->next = scrollMgr->scroll_queue; node->prev = last; scrollMgr->scroll_queue->prev = node; } } /* * Remove a scroll from the ScrollMgr queue */ void xbaeSmRemoveScroll(scrollMgr) SmScrollMgr scrollMgr; { if (scrollMgr->scroll_count) { SmScrollNode node = scrollMgr->scroll_queue; scrollMgr->offset_x -= node->x; scrollMgr->offset_y -= node->y; /* * Remove node from head of queue */ if (node->next == node) scrollMgr->scroll_queue = NULL; else { scrollMgr->scroll_queue = node->next; node->next->prev = node->prev; node->prev->next = node->next; } XtFree((XtPointer) node); scrollMgr->scroll_count--; } } /* * Handle an expose event */ void xbaeSmScrollEvent(scrollMgr, event) SmScrollMgr scrollMgr; XEvent *event; { switch (event->type) { case Expose: /* * Normal Expose event, translate it into our scrolled * coordinate system. */ event->xexpose.x += scrollMgr->offset_x; event->xexpose.y += scrollMgr->offset_y; break; case GraphicsExpose: /* * If we are not scrolling, then this must be the first * GraphicsExpose event. Remove the corresponding scroll from the * queue, and if we have more GraphicsExposes to come, set scrolling * to True. */ if (scrollMgr->scrolling == False) { xbaeSmRemoveScroll(scrollMgr); if (event->xgraphicsexpose.count != 0) scrollMgr->scrolling = True; } /* * This is the last GraphicsExpose so set scrolling to False. */ else if (event->xgraphicsexpose.count == 0) scrollMgr->scrolling = False; /* * Translate the event into our scrolled coordinate system. */ event->xgraphicsexpose.x += scrollMgr->offset_x; event->xgraphicsexpose.y += scrollMgr->offset_y; break; case NoExpose: /* * A NoExpose event means we won't be getting any GraphicsExpose * events, so remove the scroll from the queue and set scrolling * to False. */ xbaeSmRemoveScroll(scrollMgr); scrollMgr->scrolling = False; break; default: break; } } /* * Callback for vertical scrollbar */ /* ARGSUSED */ void xbaeScrollVertCB(w, client_data, call_data) Widget w; XtPointer client_data; XmScrollBarCallbackStruct *call_data; { XbaeMatrixWidget mw = (XbaeMatrixWidget) XtParent(w); Rectangle fixed, nonfixed; int src_y, dest_y, height; int vert_sb_offset = VERT_SB_OFFSET(mw); int row_height = ROW_HEIGHT(mw); int trailing_fixed_row_label_offset = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_column_label_offset = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); int trailing_fixed_column_width = TRAILING_FIXED_COLUMN_WIDTH(mw); int row_label_width = ROW_LABEL_WIDTH(mw); int fixed_row_label_offset = FIXED_ROW_LABEL_OFFSET(mw); /* * Not managed yet */ if (!XtIsRealized((Widget)mw)) return; /* * Didn't scroll */ if (call_data->value == VERT_ORIGIN(mw)) return; /* * Scrolled forward. We want to copy a chunk starting at src_y up * to the top (dest_y=0) */ else if (call_data->value > VERT_ORIGIN(mw)) { dest_y = 0; src_y = (call_data->value - VERT_ORIGIN(mw)) * row_height; height = ClipChild(mw)->core.height - src_y; } /* * Scrolled backward. We want to copy a chunk starting at the top * (src_y=0) down to dest_y. */ else { dest_y = (VERT_ORIGIN(mw) - call_data->value) * row_height; src_y = 0; height = ClipChild(mw)->core.height - dest_y; } /* * The textField needs to scroll along with the cells. */ if (XtIsManaged(TextChild(mw)) && mw->matrix.current_row >= (int)mw->matrix.fixed_rows && mw->matrix.current_row < TRAILING_VERT_ORIGIN(mw)) XtMoveWidget(TextChild(mw), TextChild(mw)->core.x, TextChild(mw)->core.y + (VERT_ORIGIN(mw) - call_data->value) * row_height); /* * Now we can adjust our vertical origin */ VERT_ORIGIN(mw) = call_data->value; /* * If we scrolled more than a screenful, just clear and * redraw the whole thing */ if (height <= 0) { /* * Clear the whole clip window. */ XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, False); /* * Clear the whole Left and Right Clips */ if (XtIsManaged(LeftClip(mw))) XClearArea(XtDisplay(mw), XtWindow(LeftClip(mw)), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, False); if (XtIsManaged(RightClip(mw))) XClearArea(XtDisplay(mw), XtWindow(RightClip(mw)), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, False); /* * Redraw all the non-fixed cells in the clip window */ SETRECT(nonfixed, 0, 0, ClipChild(mw)->core.width - 1, ClipChild(mw)->core.height - 1); /* * Clear non-fixed row labels, if necessary. * If we don't have a row label width, then * it would clear the entire width. */ if (row_label_width) XClearArea(XtDisplay(mw), XtWindow(mw), vert_sb_offset, fixed_row_label_offset, row_label_width - 1, VISIBLE_HEIGHT(mw), False); /* * Clear the trailing filled rows, if necessary */ if (IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw)) XClearArea(XtDisplay(mw), XtWindow(mw), trailing_fixed_column_label_offset + trailing_fixed_column_width, fixed_row_label_offset, FILL_HORIZ_WIDTH(mw), ClipChild(mw)->core.height, False); /* * Redraw non-fixed row labels and cells in fixed columns */ SETRECT(fixed, vert_sb_offset, fixed_row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, trailing_fixed_row_label_offset - 1); } /* * If we scrolled less than a screenful, we want to copy as many * pixels as we can and then clear and redraw the newly scrolled data. */ else { int y_clear = src_y > dest_y ? height : 0; /* * Queue this scroll with the ScrollMgr */ xbaeSmAddScroll(mw->matrix.clip_scroll_mgr, 0, dest_y - src_y); /* * Copy the non-fixed cells in the clip widget */ XCopyArea(XtDisplay(mw), XtWindow(ClipChild(mw)), XtWindow(ClipChild(mw)), mw->matrix.draw_gc, 0, src_y, ClipChild(mw)->core.width, height, 0, dest_y); /* * Clear the newly scrolled chunk of the clip widget */ XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), 0, y_clear, 0 /*Full Width*/, ClipChild(mw)->core.height - height, False); /* * Redraw the non-fixed cells into the new chunk */ SETRECT(nonfixed, 0, y_clear, ClipChild(mw)->core.width - 1, (y_clear + (ClipChild(mw)->core.height - height)) - 1); /* * Queue this scroll with the ScrollMgr */ xbaeSmAddScroll(mw->matrix.matrix_scroll_mgr, 0, dest_y - src_y); /* * Copy cells in the fixed columns on LeftClip */ if (XtIsManaged(LeftClip(mw))) XCopyArea(XtDisplay(mw), XtWindow(LeftClip(mw)), XtWindow(LeftClip(mw)), mw->matrix.draw_gc, 0, src_y, FIXED_COLUMN_WIDTH(mw), height, 0, dest_y); /* * Copy cells in the trailing fixed columns on RightClip */ if (XtIsManaged(RightClip(mw))) XCopyArea(XtDisplay(mw), XtWindow(RightClip(mw)), XtWindow(RightClip(mw)), mw->matrix.draw_gc, 0, src_y, trailing_fixed_column_width, height, 0, dest_y); /* * Translate coordinates for row labels (on the parent matrix window). */ src_y += fixed_row_label_offset; dest_y += fixed_row_label_offset; /* * Copy the row labels */ if (row_label_width) XCopyArea(XtDisplay(mw), XtWindow(mw), XtWindow(mw), mw->matrix.draw_gc, vert_sb_offset, src_y, row_label_width, height, vert_sb_offset, dest_y); /* * Copy trailing filled portion of the rows if necessary */ if (IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw)) { XCopyArea(XtDisplay(mw), XtWindow(mw), XtWindow(mw), mw->matrix.draw_gc, trailing_fixed_column_label_offset + trailing_fixed_column_width, src_y, FILL_HORIZ_WIDTH(mw), height, trailing_fixed_column_label_offset + trailing_fixed_column_width, dest_y); } /* * Clear newly scrolled chunk of fixed columns on LeftClip */ if (XtIsManaged(LeftClip(mw))) XClearArea(XtDisplay(mw), XtWindow(LeftClip(mw)), 0, y_clear, 0 /* Full Width */, ClipChild(mw)->core.height - height, False); /* * Clear newly scrolled chunk of trailing fixed columns on RightClip */ if (XtIsManaged(RightClip(mw))) XClearArea(XtDisplay(mw), XtWindow(RightClip(mw)), 0, y_clear, 0 /* Full Width */, ClipChild(mw)->core.height - height, False); /* * Translate coordinates for row labels on Matrix */ y_clear += fixed_row_label_offset; /* * Clear the newly scrolled chunk of row labels */ if (row_label_width) XClearArea(XtDisplay(mw), XtWindow(mw), vert_sb_offset, y_clear, row_label_width, CLIP_VERT_VISIBLE_SPACE(mw) + mw->manager.shadow_thickness, False); /* * Clear the trailing filled rows, if necessary */ if ((src_y > dest_y) && IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw)) XClearArea(XtDisplay(mw), XtWindow(mw), trailing_fixed_column_label_offset + trailing_fixed_column_width, y_clear, FILL_HORIZ_WIDTH(mw), ClipChild(mw)->core.height - height, False); /* * Redraw the new chunk of fixed columns and row labels */ SETRECT(fixed, vert_sb_offset, y_clear, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, y_clear + CLIP_VERT_VISIBLE_SPACE(mw)); } /* * Perform the actual redraw. The call to draw the grid shadows * must be done after any XClearAreas() to ensure we don't redraw * more than we have to; that is, we could put the call in the * redraw cells routine, but we would end up occasionally redrawing * more than once. */ xbaeRedrawLabelsAndFixed(mw, &fixed); xbaeRedrawCells(mw, &nonfixed); } /* * Callback for horizontal scrollbar */ /* ARGSUSED */ void xbaeScrollHorizCB(w, client_data, call_data) Widget w; XtPointer client_data; XmScrollBarCallbackStruct *call_data; { XbaeMatrixWidget mw = (XbaeMatrixWidget) XtParent(w); Rectangle fixed, nonfixed; int src_x, dest_x, width; int horiz_sb_offset = HORIZ_SB_OFFSET(mw); int trailing_fixed_row_label_offset = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_row_height = TRAILING_FIXED_ROW_HEIGHT(mw); /* int trailing_fixed_column_label_offset = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw);*/ int column_label_height = COLUMN_LABEL_HEIGHT(mw); int fixed_column_label_offset = FIXED_COLUMN_LABEL_OFFSET(mw); int fixed_column_width = FIXED_COLUMN_WIDTH(mw); int vert_dead_space_height = VERT_DEAD_SPACE_HEIGHT(mw); Boolean need_vert_fill = NEED_VERT_FILL(mw); Boolean has_attached_trailing_rows = HAS_ATTACHED_TRAILING_ROWS(mw); Boolean need_vert_dead_space_fill = NEED_VERT_DEAD_SPACE_FILL(mw); /*printf("%d\n", HORIZ_ORIGIN(mw));*/ /* * Didn't scroll */ if (call_data->value == HORIZ_ORIGIN(mw)) return; /* * Scrolled right. We want to copy a chunk starting at src_x over to * the left (dest_x=0) */ else if (call_data->value > HORIZ_ORIGIN(mw)) { dest_x = 0; src_x = call_data->value - HORIZ_ORIGIN(mw); width = ClipChild(mw)->core.width - src_x; } /* * Scrolled left. We want to copy a chunk starting at the left (src_x=0) * over to the right to dest_x */ else { dest_x = HORIZ_ORIGIN(mw) - call_data->value; src_x = 0; width = ClipChild(mw)->core.width - dest_x; } /* * The textField needs to scroll along with the cells. */ if (XtIsManaged(TextChild(mw)) && mw->matrix.current_column >= (int)mw->matrix.fixed_columns && mw->matrix.current_column < TRAILING_HORIZ_ORIGIN(mw)) { XtMoveWidget(TextChild(mw), TextChild(mw)->core.x + (HORIZ_ORIGIN(mw) - call_data->value), TextChild(mw)->core.y); } /* * Now we can adjust our horizontal origin */ HORIZ_ORIGIN(mw) = call_data->value; mw->matrix.left_column = xbaeXtoCol(mw, fixed_column_width + HORIZ_ORIGIN(mw)) - mw->matrix.fixed_columns; if (!XtIsRealized((Widget)mw)) return; /* * If we scrolled more than a screenful, just clear and * redraw the whole thing */ if (width <= 0) { /* * Clear the whole clip window */ XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), 0, 0, 0 /* Full Width */, 0 /* Full Height */, False); /* * Clear the whole Top and Bottom Clips */ if (XtIsManaged(TopClip(mw))) XClearArea(XtDisplay(mw), XtWindow(TopClip(mw)), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, False); if (XtIsManaged(BottomClip(mw))) XClearArea(XtDisplay(mw), XtWindow(BottomClip(mw)), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, False); /* * Redraw all the non-fixed cells in the clip window */ SETRECT(nonfixed, 0, 0, ClipChild(mw)->core.width - 1, ClipChild(mw)->core.height - 1); /* * Clear the non-fixed column labels */ if (column_label_height) XClearArea(XtDisplay(mw), XtWindow(mw), fixed_column_label_offset, horiz_sb_offset, VISIBLE_WIDTH(mw), column_label_height - 1, False); /* * Clear the trailing fixed column */ if (IN_GRID_COLUMN_MODE(mw)) { if (need_vert_fill && (! has_attached_trailing_rows)) XClearArea(XtDisplay(mw), XtWindow(mw), fixed_column_label_offset, trailing_fixed_row_label_offset + trailing_fixed_row_height, MATRIX_HORIZ_VISIBLE_SPACE(mw), 0, False); if (need_vert_dead_space_fill) XClearArea(XtDisplay(mw), XtWindow(mw), fixed_column_label_offset, UNATTACHED_TRAILING_ROWS_OFFSET(mw), MATRIX_HORIZ_VISIBLE_SPACE(mw), 0, False); } /* * Redraw non-fixed column labels and cells in fixed rows */ SETRECT(fixed, fixed_column_label_offset, horiz_sb_offset, fixed_column_label_offset + CLIP_HORIZ_VISIBLE_SPACE(mw), trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); } /* * If we scrolled less than a screenful, we want to copy as many * pixels as we can and then clear and redraw the newly scrolled data. */ else { int x_clear = src_x > dest_x ? width : 0; int unattached_trailing_rows_offset = UNATTACHED_TRAILING_ROWS_OFFSET(mw); /* * Queue this scroll with the ScrollMgr */ xbaeSmAddScroll(mw->matrix.clip_scroll_mgr, dest_x - src_x, 0); /* * Copy the non-fixed cells in the clip widget */ XCopyArea(XtDisplay(mw), XtWindow(ClipChild(mw)), XtWindow(ClipChild(mw)), mw->matrix.draw_gc, src_x, 0, width, ClipChild(mw)->core.height, dest_x, 0); /* * Clear the newly scrolled chunk of the clip widget */ XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), x_clear, 0, ClipChild(mw)->core.width - width, 0 /*Full Height*/, False); /* * Redraw the non-fixed cells into the new chunk */ SETRECT(nonfixed, x_clear, horiz_sb_offset, (x_clear + (ClipChild(mw)->core.width - width)) - 1, ClipChild(mw)->core.height - 1); /* * Queue this scroll with the ScrollMgr */ xbaeSmAddScroll(mw->matrix.matrix_scroll_mgr, dest_x - src_x, 0); /* * Copy cells across in fixed rows on TopClip */ if (XtIsManaged(TopClip(mw))) XCopyArea(XtDisplay(mw), XtWindow(TopClip(mw)), XtWindow(TopClip(mw)), mw->matrix.draw_gc, src_x, 0, width, FIXED_ROW_HEIGHT(mw), dest_x, 0); /* * Copy cells across in trailing fixed rows on BottomClip */ if (XtIsManaged(BottomClip(mw))) XCopyArea(XtDisplay(mw), XtWindow(BottomClip(mw)), XtWindow(BottomClip(mw)), mw->matrix.draw_gc, src_x, horiz_sb_offset, width, trailing_fixed_row_height, dest_x, 0); /* * Translate coordinates for column labels on the Matrix. */ src_x += fixed_column_label_offset; dest_x += fixed_column_label_offset; /* * Copy the column labels */ if (column_label_height) XCopyArea(XtDisplay(mw), XtWindow(mw), XtWindow(mw), mw->matrix.draw_gc, src_x, horiz_sb_offset, width, column_label_height, dest_x, horiz_sb_offset); /* * Copy trailing filled portion of the columns if necessary */ if (IN_GRID_COLUMN_MODE(mw)) { if (need_vert_fill && (! has_attached_trailing_rows)) XCopyArea(XtDisplay(mw), XtWindow(mw), XtWindow(mw), mw->matrix.draw_gc, src_x, trailing_fixed_row_label_offset + trailing_fixed_row_height, width, FILL_VERT_HEIGHT(mw), dest_x, trailing_fixed_row_label_offset + trailing_fixed_row_height); if (need_vert_dead_space_fill) XCopyArea(XtDisplay(mw), XtWindow(mw), XtWindow(mw), mw->matrix.draw_gc, src_x, unattached_trailing_rows_offset, width, vert_dead_space_height, dest_x, unattached_trailing_rows_offset); } /* * Clear newly scrolled chunk of fixed rows on TopClip */ if (XtIsManaged(TopClip(mw))) XClearArea(XtDisplay(mw), XtWindow(TopClip(mw)), x_clear, 0, ClipChild(mw)->core.width - width, 0 /* Full Height */, False); /* * Clear newly scrolled chunk of trailing fixed rows on BottomClip */ if (XtIsManaged(BottomClip(mw))) XClearArea(XtDisplay(mw), XtWindow(BottomClip(mw)), x_clear, 0, ClipChild(mw)->core.width - width, 0 /* Full Height */, False); /* * Translate coordinates for row labels on Matrix */ x_clear += fixed_column_label_offset; /* * Clear the newly scrolled chunk of column labels */ if (column_label_height) XClearArea(XtDisplay(mw), XtWindow(mw), x_clear, horiz_sb_offset, ClipChild(mw)->core.width - width, column_label_height, False); /* * Clear the dead space if necessary */ if (IN_GRID_COLUMN_MODE(mw) && need_vert_dead_space_fill) XClearArea(XtDisplay(mw), XtWindow(mw), x_clear,unattached_trailing_rows_offset, ClipChild(mw)->core.width - width, vert_dead_space_height, False); /* * Redraw the new chunk of fixed rows and column labels */ SETRECT(fixed, x_clear, horiz_sb_offset, x_clear + CLIP_HORIZ_VISIBLE_SPACE(mw), trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); } /* * Perform the actual redraw. The call to draw the grid shadows * must be done after any XClearAreas() to ensure we don't redraw * more than we have to; that is, we could put the call in the * redraw cells routine, but we would end up occasionally redrawing * more than once. */ xbaeRedrawLabelsAndFixed(mw, &fixed); xbaeRedrawCells(mw, &nonfixed); } /* * Redraw all cells in the clip widget damaged by the passed Rectangle. * The Rectangle must be within the bounds of the cells. These are the * non-fixed cells. */ void xbaeRedrawCells(mw, expose) XbaeMatrixWidget mw; Rectangle *expose; { int startCol, endCol, startRow, endRow, i, j; Rectangle rect; Boolean set_mask = False; if ((mw->matrix.disable_redisplay) || (!mw->matrix.rows) || (!mw->matrix.columns)) return; /* * Translate the 'expose' Rectangle to take into account the * fixed rows or columns. */ SETRECT(rect, expose->x1 + FIXED_COLUMN_WIDTH(mw), expose->y1 + FIXED_ROW_HEIGHT(mw), expose->x2 + FIXED_COLUMN_WIDTH(mw), expose->y2 + FIXED_ROW_HEIGHT(mw)); /* * Calculate the starting and ending rows/columns of the cells * which must be redrawn. */ startCol = xbaeXtoCol(mw, rect.x1 + HORIZ_ORIGIN(mw)); endCol = xbaeXtoCol(mw, rect.x2 + HORIZ_ORIGIN(mw)); startRow = YtoRow(mw, rect.y1 + mw->matrix.first_row_offset) + VERT_ORIGIN(mw); endRow = YtoRow(mw, rect.y2 + mw->matrix.first_row_offset) + VERT_ORIGIN(mw); SANITY_CHECK_ROW(mw, startRow); SANITY_CHECK_ROW(mw, endRow); SANITY_CHECK_COLUMN(mw, startCol); SANITY_CHECK_COLUMN(mw, endCol); /* * Redraw all cells which were exposed. */ for (i = startRow; i <= endRow; i++) { /* * If we need to clip the vertical fill */ if ((!set_mask) && IN_GRID_COLUMN_MODE(mw) && ((mw->matrix.rows - 1) == i) && NEED_VERT_FILL(mw)) { set_mask = True; xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); } for (j = startCol; j <= endCol; j++) xbaeDrawCell(mw, i, j); } if (set_mask) xbaeSetClipMask(mw, CLIP_NONE); } /* * Redraw the row and column labels and the cells in fixed rows/columns * that are overlapped by the Rectangle argument. */ void xbaeRedrawLabelsAndFixed(mw, expose) XbaeMatrixWidget mw; Rectangle *expose; { /* * Set up some local variables to avoid calling too many macros :p */ int horiz_sb_offset = HORIZ_SB_OFFSET(mw); int vert_sb_offset = VERT_SB_OFFSET(mw); int column_label_height = COLUMN_LABEL_HEIGHT(mw); int row_label_offset = ROW_LABEL_OFFSET(mw); int row_label_width = ROW_LABEL_WIDTH(mw); int fixed_row_label_offset = FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_row_label_offset = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_row_height = TRAILING_FIXED_ROW_HEIGHT(mw); int fixed_column_label_offset = FIXED_COLUMN_LABEL_OFFSET(mw); int fixed_column_width = FIXED_COLUMN_WIDTH(mw); int trailing_fixed_column_label_offset = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); int trailing_fixed_column_width = TRAILING_FIXED_COLUMN_WIDTH(mw); int column_label_offset = COLUMN_LABEL_OFFSET(mw); Boolean need_vert_fill = NEED_VERT_FILL(mw); Boolean has_attached_trailing_rows = HAS_ATTACHED_TRAILING_ROWS(mw); if (mw->matrix.disable_redisplay) return; /* * Handle the row labels that are in fixed rows */ if (mw->matrix.rows && mw->matrix.fixed_rows && mw->matrix.row_labels) { Rectangle rect; /* * Get the Rectangle enclosing the fixed row labels */ SETRECT(rect, vert_sb_offset, row_label_offset, vert_sb_offset + row_label_width - 1, fixed_row_label_offset - 1); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endRow, i; /* * Intersect the fixed-row-labels Rectangle with the expose * Rectangle along the Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ Y_INTERSECT(rect, *expose, intersect); /* * Redraw each label that was intersected */ endRow = YtoRow(mw, intersect.y2 + mw->matrix.first_row_offset); SANITY_CHECK_ROW(mw, endRow); for (i = YtoRow(mw, intersect.y1 + mw->matrix.first_row_offset), SANITY_CHECK_ROW(mw, i); i <= endRow; i++) xbaeDrawRowLabel(mw, i, False); } } /* * Handle the row labels that are in trailing fixed rows */ if (mw->matrix.rows && mw->matrix.trailing_fixed_rows && mw->matrix.row_labels) { Rectangle rect; /* * Get the Rectangle enclosing the fixed row labels */ SETRECT(rect, vert_sb_offset, trailing_fixed_row_label_offset, vert_sb_offset + row_label_width - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endRow, i; /* * Intersect the fixed-row-labels Rectangle with the expose * Rectangle along the Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ Y_INTERSECT(rect, *expose, intersect); /* * Redraw each label that was intersected */ endRow = YtoRow(mw, intersect.y2) + TRAILING_VERT_ORIGIN(mw); SANITY_CHECK_ROW(mw, endRow); for (i = YtoRow(mw, intersect.y1) + TRAILING_VERT_ORIGIN(mw), SANITY_CHECK_ROW(mw, i); i <= endRow; i++) xbaeDrawRowLabel(mw, i, False); } } /* * Handle row labels that aren't in fixed rows */ if (mw->matrix.row_labels && mw->matrix.rows) { Rectangle rect; /* * Get the Rectangle enclosing the non-fixed row labels */ SETRECT(rect, vert_sb_offset, fixed_row_label_offset, vert_sb_offset + row_label_width - 1, fixed_row_label_offset + VISIBLE_HEIGHT(mw) - 1); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endRow, i; /* * Intersect the fixed-row-labels Rectangle with the expose * Rectangle along the Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ Y_INTERSECT(rect, *expose, intersect); /* * Translate 'intersect' to take into account any fixed rows. * This gets it back into the coord system expected by YtoRow(). */ intersect.y1 += FIXED_ROW_HEIGHT(mw); intersect.y2 += FIXED_ROW_HEIGHT(mw); /* * Redraw each label that was intersected */ endRow = YtoRow(mw, intersect.y2) + VERT_ORIGIN(mw); SANITY_CHECK_ROW(mw, endRow); for (i = YtoRow(mw, intersect.y1) + VERT_ORIGIN(mw), SANITY_CHECK_ROW(mw, i); i <= endRow; i++) xbaeDrawRowLabel(mw, i, False); } } /* * Handle the column labels that are in fixed columns */ if (mw->matrix.columns && mw->matrix.fixed_columns && mw->matrix.column_labels) { Rectangle rect; /* * Get the Rectangle enclosing the portion of the column labels * that are in fixed columns */ SETRECT(rect, column_label_offset, horiz_sb_offset, fixed_column_label_offset - 1, horiz_sb_offset + column_label_height - 1); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endCol, i; /* * Intersect the fixed-column-labels Rectangle with the expose * Rectangle along the X axis. The resulting Rectangle will * be in 'rect's coordinate system. */ X_INTERSECT(rect, *expose, intersect); /* * Redraw each label that was intersected */ endCol = xbaeXtoCol(mw, intersect.x2); SANITY_CHECK_COLUMN(mw, endCol); for (i = xbaeXtoCol(mw, intersect.x1), SANITY_CHECK_COLUMN(mw, i); i <= endCol; i++) xbaeDrawColumnLabel(mw, i, False); } } /* * Handle the column labels that are in trailing fixed columns */ if (mw->matrix.columns && mw->matrix.trailing_fixed_columns && mw->matrix.column_labels) { Rectangle rect; /* * Get the Rectangle enclosing the portion of the column labels * that are in fixed columns */ SETRECT(rect, trailing_fixed_column_label_offset, horiz_sb_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width, horiz_sb_offset + column_label_height); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endCol, i; /* * Intersect the fixed-column-labels Rectangle with the expose * Rectangle along the X axis. The resulting Rectangle will * be in 'rect's coordinate system. */ X_INTERSECT(rect, *expose, intersect); /* * Redraw each label that was intersected */ endCol = xbaeXtoTrailingCol(mw, intersect.x2); SANITY_CHECK_COLUMN(mw, endCol); for (i = xbaeXtoTrailingCol(mw, intersect.x1), SANITY_CHECK_COLUMN(mw, i); i <= endCol; i++) xbaeDrawColumnLabel(mw, i, False); } } /* * Handle column labels that aren't in fixed columns */ if (mw->matrix.column_labels && mw->matrix.columns) { Rectangle rect; /* * Get the Rectangle enclosing the non-fixed column labels */ SETRECT(rect, fixed_column_label_offset, horiz_sb_offset, fixed_column_label_offset + VISIBLE_WIDTH(mw) - 1, horiz_sb_offset + column_label_height - 1); /* * If the expose Rectangle overlaps, then some labels must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int endCol, i; /* * Intersect the non-fixed-column-labels Rectangle with the expose * Rectangle along the X axis. The resulting Rectangle will * be in 'rect's coordinate system. */ X_INTERSECT(rect, *expose, intersect); /* * Translate 'intersect' to take into account any fixed columns. * This gets it back into the coord system expected by XtoCol(). */ intersect.x1 += fixed_column_width; intersect.x2 += fixed_column_width; /* * Redraw each label that was intersected */ endCol = xbaeXtoCol(mw, intersect.x2 + HORIZ_ORIGIN(mw)); SANITY_CHECK_COLUMN(mw, endCol); for (i = xbaeXtoCol(mw, intersect.x1 + HORIZ_ORIGIN(mw)), SANITY_CHECK_COLUMN(mw, i); i <= endCol; i++) xbaeDrawColumnLabel(mw, i, False); } } /* * Handle cells in fixed rows except those also in fixed columns */ if (mw->matrix.rows && mw->matrix.columns && mw->matrix.fixed_rows) { Rectangle rect; /* * Get the Rectangle enclosing the cells in fixed rows */ SETRECT(rect, fixed_column_label_offset, row_label_offset, fixed_column_label_offset + VISIBLE_WIDTH(mw) - 1, fixed_row_label_offset - 1); /* * If the expose Rectangle overlaps, then some cells must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int startCol, endCol, startRow, endRow, i, j; /* * Intersect the fixed-cells Rectangle with the expose * Rectangle along the X and Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ INTERSECT(rect, *expose, intersect); intersect.x1 += fixed_column_width; intersect.x2 += fixed_column_width; /* * Get starting and ending rows/columns. Always take into * account the scrolling origins for the columns; for rows * only if we are fixed in that dimension. */ startCol = xbaeXtoCol(mw, intersect.x1 + HORIZ_ORIGIN(mw)); endCol = xbaeXtoCol(mw, intersect.x2 + HORIZ_ORIGIN(mw)); startRow = YtoRow(mw, intersect.y1) + (mw->matrix.fixed_rows ? 0 : VERT_ORIGIN(mw)); endRow = YtoRow(mw, intersect.y2) + (mw->matrix.fixed_rows ? 0 : VERT_ORIGIN(mw)); /* * Redraw each cell that was intersected */ SANITY_CHECK_ROW(mw, startRow); SANITY_CHECK_ROW(mw, endRow); SANITY_CHECK_COLUMN(mw, startCol); SANITY_CHECK_COLUMN(mw, endCol); for (i = startRow; i <= endRow; i++) for (j = startCol; j <= endCol; j++) xbaeDrawCell(mw, i, j); } } /* * Handle cells in trailing fixed rows except those also in fixed columns */ if (mw->matrix.rows && mw->matrix.columns && mw->matrix.trailing_fixed_rows) { Rectangle rect; /* * Get the Rectangle enclosing the cells in trailing fixed rows */ SETRECT(rect, fixed_column_label_offset, trailing_fixed_row_label_offset, fixed_column_label_offset + VISIBLE_WIDTH(mw) - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); /* * If the expose Rectangle overlaps, then some cells must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int startCol, endCol, startRow, endRow, i, j; /* * Intersect the fixed-cells Rectangle with the expose * Rectangle along the X and Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ INTERSECT(rect, *expose, intersect); intersect.x1 += fixed_column_width; intersect.x2 += fixed_column_width; /* * Get starting and ending rows/columns. Always take into * account the scrolling origins for the columns and never * for the rows. */ startCol = xbaeXtoCol(mw, intersect.x1 + HORIZ_ORIGIN(mw)); endCol = xbaeXtoCol(mw, intersect.x2 + HORIZ_ORIGIN(mw)); startRow = YtoRow(mw, intersect.y1) + TRAILING_VERT_ORIGIN(mw); endRow = YtoRow(mw, intersect.y2) + TRAILING_VERT_ORIGIN(mw); /* * Redraw each cell that was intersected */ SANITY_CHECK_ROW(mw, startRow); SANITY_CHECK_ROW(mw, endRow); SANITY_CHECK_COLUMN(mw, startCol); SANITY_CHECK_COLUMN(mw, endCol); xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); for (i = startRow; i <= endRow; i++) for (j = startCol; j <= endCol; j++) xbaeDrawCell(mw, i, j); xbaeSetClipMask(mw, CLIP_NONE); } } /* * Handle cells in fixed columns */ if (mw->matrix.rows && mw->matrix.columns && mw->matrix.fixed_columns) { Rectangle rect; /* * Get the Rectangle enclosing the cells in fixed columns */ SETRECT(rect, column_label_offset, row_label_offset, fixed_column_label_offset - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); /* * If the expose Rectangle overlaps, then some cells must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int startCol, endCol, startRow, endRow, skipRow = -1, i, j; Boolean redrawFixedRows, redrawTrailingFixedRows; unsigned int clip_reason = CLIP_NONE; /* * Intersect the fixed-cells Rectangle with the expose * Rectangle along the X and Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ INTERSECT(rect, *expose, intersect); /* * If we have any fixed rows, we might need to redraw the cells * located in the intersection of the fixed rows and columns. * These cells may force use to be different than our current * VERT_ORIGIN. */ redrawFixedRows = redrawTrailingFixedRows = False; if (mw->matrix.fixed_rows) { clip_reason = CLIP_FIXED_COLUMNS; SETRECT(rect, column_label_offset, row_label_offset, fixed_column_label_offset - 1, fixed_row_label_offset - 1); if (OVERLAP(*expose, rect)) redrawFixedRows = True; } if (mw->matrix.trailing_fixed_rows) { clip_reason = CLIP_FIXED_COLUMNS; SETRECT(rect, column_label_offset, trailing_fixed_row_label_offset, fixed_column_label_offset - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (OVERLAP(*expose, rect)) redrawTrailingFixedRows = True; } if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, clip_reason); /* * Get starting and ending rows/columns. Never take into * account the scrolling origins for the rows; for columns * only if we are fixed in that dimension. */ startCol = xbaeXtoCol(mw, intersect.x1 + (mw->matrix.fixed_columns ? 0 : HORIZ_ORIGIN(mw))); endCol = xbaeXtoCol(mw, intersect.x2 + (mw->matrix.fixed_columns ? 0 : HORIZ_ORIGIN(mw))); startRow = redrawFixedRows ? 0 : YtoRow(mw, intersect.y1) + VERT_ORIGIN(mw); if (redrawTrailingFixedRows) { skipRow = YtoRow(mw, intersect.y2) + VERT_ORIGIN(mw) - mw->matrix.trailing_fixed_rows + 1; endRow = mw->matrix.rows - 1; } else endRow = YtoRow(mw, intersect.y2) + VERT_ORIGIN(mw); /* * Redraw each cell that was intersected */ SANITY_CHECK_ROW(mw, startRow); SANITY_CHECK_ROW(mw, endRow); SANITY_CHECK_COLUMN(mw, startCol); SANITY_CHECK_COLUMN(mw, endCol); for (i = startRow; i <= endRow; i++) for (j = startCol; j <= endCol; j++) { /* * If we had to redraw cells located in both fixed rows * and columns, when we are done redrawing those cells, * we need to skip to the correct non-fixed row to draw, * or alternatively, jump to the trailing fixed row * to draw. */ if (redrawFixedRows && i == mw->matrix.fixed_rows) i += VERT_ORIGIN(mw); if (redrawTrailingFixedRows && i == skipRow && endRow > skipRow && i < TRAILING_VERT_ORIGIN(mw)) i = TRAILING_VERT_ORIGIN(mw); /* * If we need to clip the vertical fill */ if (!(clip_reason & CLIP_TRAILING_FIXED_ROWS) && IN_GRID_COLUMN_MODE(mw) && ((mw->matrix.rows - 1) == i) && (need_vert_fill && (! has_attached_trailing_rows))) { clip_reason |= CLIP_FIXED_COLUMNS | CLIP_TRAILING_FIXED_ROWS; xbaeSetClipMask(mw, clip_reason); } xbaeDrawCell(mw, i, j); } if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, CLIP_NONE); } } /* * Handle cells in trailing fixed columns */ if (mw->matrix.rows && mw->matrix.columns && mw->matrix.trailing_fixed_columns) { Rectangle rect; /* * Get the Rectangle enclosing the cells in trailing fixed columns */ SETRECT(rect, trailing_fixed_column_label_offset, row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); /* * If the expose Rectangle overlaps, then some cells must be redrawn */ if (OVERLAP(*expose, rect)) { Rectangle intersect; int startCol, endCol, startRow, endRow, skipRow = -1, i, j; Boolean redrawFixedRows, redrawTrailingFixedRows; unsigned int clip_reason = CLIP_NONE; /* * Intersect the fixed-cells Rectangle with the expose * Rectangle along the X and Y axis. The resulting Rectangle will * be in 'rect's coordinate system. */ INTERSECT(rect, *expose, intersect); /* * If we have any fixed rows, we might need to redraw the cells * located in the intersection of the fixed rows and columns. * These cells may force us to be different than our current * VERT_ORIGIN. */ redrawFixedRows = redrawTrailingFixedRows = False; if (mw->matrix.fixed_rows) { clip_reason = CLIP_FIXED_COLUMNS; SETRECT(rect, trailing_fixed_column_label_offset, row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, fixed_row_label_offset - 1); if (OVERLAP(*expose, rect)) redrawFixedRows = True; } if (mw->matrix.trailing_fixed_rows) { clip_reason = CLIP_FIXED_COLUMNS; SETRECT(rect, trailing_fixed_column_label_offset, trailing_fixed_row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (OVERLAP(*expose, rect)) redrawTrailingFixedRows = True; } if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, clip_reason); /* * Get starting and ending rows/columns. Never take into * account the scrolling origins for the rows; for columns * only if we are fixed in that dimension. */ startCol = xbaeXtoTrailingCol(mw, intersect.x1); endCol = xbaeXtoTrailingCol(mw, intersect.x2); startRow = redrawFixedRows ? 0 : YtoRow(mw, intersect.y1) + VERT_ORIGIN(mw); if (redrawTrailingFixedRows) { skipRow = YtoRow(mw, intersect.y2) + VERT_ORIGIN(mw) - mw->matrix.trailing_fixed_rows + 1; endRow = mw->matrix.rows - 1; } else endRow = YtoRow(mw, intersect.y2) + VERT_ORIGIN(mw); /* * Redraw each cell that was intersected */ SANITY_CHECK_ROW(mw, startRow); SANITY_CHECK_ROW(mw, endRow); SANITY_CHECK_COLUMN(mw, startCol); SANITY_CHECK_COLUMN(mw, endCol); for (i = startRow; i <= endRow; i++) for (j = startCol; j <= endCol; j++) { /* * If we had to redraw cells located in both fixed rows * and columns, when we are done redrawing those cells, * we need to skip to the correct non-fixed row to draw */ if (redrawFixedRows && (i == mw->matrix.fixed_rows)) i += VERT_ORIGIN(mw); if (redrawTrailingFixedRows && (i == skipRow) && (endRow > skipRow)) i = TRAILING_VERT_ORIGIN(mw); /* * If we need to clip the vertical fill */ if (!(clip_reason & CLIP_TRAILING_FIXED_ROWS) && IN_GRID_COLUMN_MODE(mw) && ((mw->matrix.rows - 1) == i) && (need_vert_fill && (! has_attached_trailing_rows))) { clip_reason |= CLIP_TRAILING_FIXED_COLUMNS | CLIP_TRAILING_FIXED_ROWS; xbaeSetClipMask(mw, clip_reason); } xbaeDrawCell(mw, i, j); } if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, CLIP_NONE); } } /* * Draw a shadow just inside row/column labels and around outer edge * of clip widget. We can't use height of clip widget because it is * truncated to nearest row. We use cell_visible_height instead. */ if (mw->manager.shadow_thickness) { Dimension width, height; if (! mw->matrix.fill) { width = ClipChild(mw)->core.width + fixed_column_width + trailing_fixed_column_width + 2 * mw->manager.shadow_thickness; height = mw->matrix.cell_visible_height + FIXED_ROW_HEIGHT(mw) + trailing_fixed_row_height + 2 * mw->manager.shadow_thickness; } else { width = mw->core.width - row_label_width - VERT_SB_SPACE(mw); height = mw->core.height - column_label_height - HORIZ_SB_SPACE(mw) ; } DRAW_SHADOW(XtDisplay(mw), XtWindow(mw), mw->manager.top_shadow_GC, mw->manager.bottom_shadow_GC, mw->manager.shadow_thickness, row_label_width + vert_sb_offset, column_label_height + horiz_sb_offset, width, height, mw->matrix.shadow_type); } } grace-5.1.23/Xbae/Xbae/Converters.c0000644000076500001440000005761706766327621016523 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Converters.c,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * Convert a comma separated list of strings to a NULL terminated array * of substrings. * A comma (,) terminates a string * Backslash is an escape character allowing leading and terminating * white space to be protected. A backslash-comma (\,) does not * terminate a string and is copied as a comma (,). */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include /* #include */ #include #include #include #include #include #ifndef tolower #define tolower(c) ((c) - 'A' + 'a') #endif static Boolean StringsAreEqual P((String, String, int)); /* ARGSUSED */ Boolean CvtStringToStringArray(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static String *array; String start = from->addr; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToStringArray", "wrongParameters", "XbaeMatrix", "String to StringArray conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(String *)) { to->size = sizeof(String *); return False; } if (start == NULL || *start == '\0') array = NULL; else { char *ch, *next, *a; int i, sub, len, count; /* * Count the substrings */ for (ch = start, count = 1; *ch != '\0'; ch++) { /* * We hit a backslash */ if (*ch == '\\') { ch++; } /* * We hit an unescaped comma */ else if (*ch == ',') count++; } /* * Malloc the array, make it one bigger for a terminating NULL entry */ array = (String *) XtMalloc((count + 1) * sizeof(String)); array[count] = NULL; for (sub = 0; sub < count; sub++) { /* * Skip leading white space */ while (isspace((unsigned char) *start)) start++; /* * Count the number of chars in this substring. * backslash-comma counts as one and does not terminate. * backslash-backslash-comma counts as two and does not terminate. */ for (ch = start, len = 0; *ch != '\0' && *ch != ','; ch++) { /* * We hit a backslash */ if (*ch == '\\') { ch++; if (*ch == '\0') { break; } } len++; } /* * Save the beginning of the next substring */ next = ch + 1; /* * Back up over unprotected trailing white space if we moved at all */ if (ch != start) while (*(ch-2) != '\\' && isspace((unsigned char) *(--ch))) len--; /* * Malloc a String of the correct size */ array[sub] = (String) XtMalloc(len + 1); /* * Copy the substring into our new string. */ for (i = 0, ch = start, a = array[sub]; i < len; i++, ch++) { /* * We hit a backslash */ if (*ch == '\\') { ch++; } *(a++) = *ch; } *a = '\0'; /* * Point to the beginning of the next string. */ start = next; } } if (to->addr == NULL) to->addr = (XtPointer) & array; else *(String **) to->addr = array; to->size = sizeof(String *); return True; } /* * Free the string array allocated by the String to StringArray converter */ /* ARGSUSED */ void StringArrayDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { String *array = *(String **) to->addr; String *entry; if (array == NULL) return; for (entry = array; *entry != NULL; entry++) XtFree((XtPointer) * entry); XtFree((XtPointer) array); } /* ARGSUSED */ Boolean CvtStringToCellTable(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static String **array; String start = from->addr; char *ch, c; int k, count; XrmValue lfrom, lto; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToCellTable", "wrongParameters", "XbaeMatrix", "String to CellTable conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(String **)) { to->size = sizeof(String *); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the nl separated rows */ for (ch = start, count = 1; *ch != '\0'; ch++) { if ((*ch == '\\' && *(ch+1) == 'n') || *ch == '\n') count++; } /* * Malloc the array */ array = (String **)XtMalloc((count + 1) * sizeof(String *)); array[count] = (String*)0; for (k = 0; k < count; k++) { for (ch = start; *ch != '\0' ; ch++) { if ((*ch == '\\' && *(ch+1) == 'n') || *ch == '\n') break; } c = *ch ; *ch = '\0'; lfrom.addr = start; lfrom.size = strlen(start)+1; lto.addr = (char *)(&array[k]); lto.size = sizeof(String *); if (!CvtStringToStringArray(dpy, args, num_args, &lfrom, <o, data)) { *ch = c; XtDisplayStringConversionWarning(dpy, from->addr, XmRCellTable); array[k] = (String *)0; lto.addr = (char *)&array; StringCellDestructor(0, <o, 0, 0, 0); return False; } *ch = c; if (c == '\\') start = ch+2 ; else if (c == '\n') start = ch+1; else start = ch; } } if (to->addr == NULL) to->addr = (XtPointer) &array; else *(String ***) to->addr = array; to->size = sizeof(String **); return True; } /* * Free the string array allocated by the String to StringCellTable converter */ /* ARGSUSED */ void StringCellDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { String **array = *(String ***) to->addr; String **entry, *row; if (array == NULL) return; for (entry = array; *entry != NULL; entry++) { for (row = *entry; *row != NULL; row++) XtFree((XtPointer) *row); XtFree((XtPointer) *entry); } XtFree((XtPointer) array); } /* * Convert a comma separated list of short ints to array of widths. * The array is terminated with BAD_WIDTH. */ /* ARGSUSED */ Boolean CvtStringToWidthArray(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static short *array; String start = from->addr; char *ch; int i, count; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToWidthArray", "wrongParameters", "XbaeMatrix", "String to WidthArray conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(short *)) { to->size = sizeof(short *); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the comma separated shorts */ for (ch = start, count = 1; *ch != '\0'; ch++) if (*ch == ',') count++; /* * Malloc the array */ array = (short *) XtMalloc((count + 1) * sizeof(short)); array[count] = BAD_WIDTH; for (i = 0; i < count; i++) { array[i] = (short) atoi(start); /* * Find the comma at the end of this short */ /* EMPTY */ for (; *start != '\0' && *start != ','; start++); start++; } } if (to->addr == NULL) to->addr = (XtPointer) & array; else *(short **) to->addr = array; to->size = sizeof(short *); return True; } /* * Free the width array allocated by the String to WidthArray converter */ /* ARGSUSED */ void WidthArrayDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { short *array = *(short **) to->addr; XtFree((XtPointer) array); } /* * Convert a comma separated list of ints to array of max lengths. * The array is terminated with BAD_MAXLENGTH. */ /* ARGSUSED */ Boolean CvtStringToMaxLengthArray(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static int *array; String start = from->addr; char *ch; int i, count; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToMaxLengthArray", "wrongParameters", "XbaeMatrix", "String to MaxLengthArray conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(int *)) { to->size = sizeof(int *); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the comma separated ints */ for (ch = start, count = 1; *ch != '\0'; ch++) if (*ch == ',') count++; /* * Malloc the array */ array = (int *) XtMalloc((count + 1) * sizeof(int)); array[count] = BAD_MAXLENGTH; for (i = 0; i < count; i++) { array[i] = (int) atoi(start); /* * Find the comma at the end of this int */ /* EMPTY */ for (; *start != '\0' && *start != ','; start++); start++; } } if (to->addr == NULL) to->addr = (XtPointer) & array; else *(int **) to->addr = array; to->size = sizeof(int *); return True; } /* * Free the max length array allocated by the String to * MaxLengthArray converter */ /* ARGSUSED */ void MaxLengthArrayDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { int *array = *(int **) to->addr; XtFree((XtPointer) array); } /* * Compare two strings up to length chars, and return True if they are equal. * Handles Xm prefix too. The string test must be lower case. * Used by StringToAlignmentArray converter. */ static Boolean StringsAreEqual(in, test, length) String in; String test; int length; { int i; if ((in[0] == 'X' || in[0] == 'x') && (in[1] == 'M' || in[1] == 'm')) in += 2; for (i = 0; i < length; i++) { char c = *in; if (isupper(c)) c = tolower(c); if (c != test[i]) return False; in++; } /* * String in may have trailing garbage, but as long as the first * length chars matched, we return True */ return True; } /* * Convert a comma separated list of alignments to array of Booleans. */ /* ARGSUSED */ Boolean CvtStringToBooleanArray(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static Boolean *array; String start = from->addr; char *ch; int i, count; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToBooleanArray", "wrongParameters", "XbaeMatrix", "String to BooleanArray conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(Boolean *)) { to->size = sizeof(Boolean *); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the comma separated alignments */ for (ch = start, count = 1; *ch != '\0'; ch++) if (*ch == ',') count++; /* * Malloc the array */ array = (Boolean*) XtMalloc((count + 1) * sizeof(Boolean)); /* array[count] = BAD_WIDTH; */ for (i = 0; i < count; i++) { /* * Skip leading white space */ while (isspace(*start)) start++; if (StringsAreEqual(start, "true", 4)) array[i] = True; else if (StringsAreEqual(start, "1", 1)) array[i] = True; else if (StringsAreEqual(start, "false", 5)) array[i] = False; else if (StringsAreEqual(start, "0", 1)) array[i] = False; else { XtDisplayStringConversionWarning(dpy, from->addr, XmRBooleanArray); XtFree((void*)array); return False; } /* * Find the comma at the end of this short */ /* EMPTY */ for (; *start != '\0' && *start != ','; start++); start++; } } if (to->addr == NULL) to->addr = (XtPointer) & array; else *(Boolean **) to->addr = array; to->size = sizeof(Boolean *); return True; } /* * Free the alignment array allocated by the String to BooleanArray converter */ /* ARGSUSED */ void BooleanArrayDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { Boolean *array = *(Boolean **) to->addr; XtFree((XtPointer) array); } /* * Convert a comma separated list of alignments to array of alignments * (unsigned chars). The array is terminated by BAD_ALIGNMENT. */ /* ARGSUSED */ Boolean CvtStringToAlignmentArray(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static unsigned char *array; String start = from->addr; char *ch; int i, count; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToAlignmentArray", "wrongParameters", "XbaeMatrix", "String to AlignmentArray conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(unsigned char *)) { to->size = sizeof(unsigned char *); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the comma separated alignments */ for (ch = start, count = 1; *ch != '\0'; ch++) if (*ch == ',') count++; /* * Malloc the array */ array = (unsigned char *) XtMalloc((count + 1) * sizeof(unsigned char)); array[count] = BAD_ALIGNMENT; /* * Compare each substring to the alignment strings. * If we find a bad one, display a warning and fail. * We should be able to use XtCallConverter on _XmCvtStringToAlignment, * but that function is static so we have to duplicate its * functionality. */ for (i = 0; i < count; i++) { /* * Skip leading white space */ while (isspace(*start)) start++; if (StringsAreEqual(start, "alignment_beginning", 19)) array[i] = XmALIGNMENT_BEGINNING; else if (StringsAreEqual(start, "alignment_center", 16)) array[i] = XmALIGNMENT_CENTER; else if (StringsAreEqual(start, "alignment_end", 13)) array[i] = XmALIGNMENT_END; else { XtDisplayStringConversionWarning(dpy, from->addr, XmRAlignmentArray); XtFree((void*)array); return False; } /* * Find the comma at the end of this alignment */ /* EMPTY */ for (; *start != '\0' && *start != ','; start++); start++; } } if (to->addr == NULL) to->addr = (XtPointer) & array; else *(unsigned char **) to->addr = array; to->size = sizeof(unsigned char *); return True; } /* * Free the alignment array allocated by the String to AlignmentArray converter */ /* ARGSUSED */ void AlignmentArrayDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { unsigned char *array = *(unsigned char **) to->addr; XtFree((XtPointer) array); } /* * Convert a comma separated list of pixels to array of pixels * . The array is terminated by BAD_PIXEL. */ /* ARGSUSED */ Boolean CvtStringToPixelTable(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static Pixel **array, *row; String start = from->addr; char *ch, c; int i, k, count_x , count_y; XrmValue lfrom, lto; Pixel last_pixel = 0; if (*num_args != 2) XtAppWarningMsg(XtDisplayToApplicationContext(dpy), "cvtStringToPixelTable", "wrongParameters", "XbaeMatrix", "String to PixelTable conversion needs screen and colormap arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(Pixel **)) { to->size = sizeof(Pixel **); return False; } if (start == NULL || *start == '\0') array = NULL; else { /* * Count the comma and nl separated alignments */ count_x = 1; for (ch = start, k = 1, count_y=1; *ch != '\0'; ch++) { if (*ch == ',') k++; if ((*ch == '\\' && *(ch+1) == 'n') || *ch == '\n') { count_y++; if (k > count_x) count_x = k; k = 1; } } /* * Malloc the arrays */ array = (Pixel **)XtMalloc((count_y + 1) * sizeof(Pixel *)); array[count_y] = (Pixel*)0; for (k = 0; k < count_y; k++) { row = (Pixel *)XtMalloc((count_x + 1) * sizeof(Pixel)); row[count_x] = BAD_PIXEL; row[0] = last_pixel; array[ k ] = row; /* * Convert each substring into Pixel */ for (i = 0; i < count_x; i++) { if (*start == '\0') break; /* * Skip leading white space */ while (isspace(*start)) start++; /* * Find the comma at the end of this color */ /* EMPTY */ for (ch = start; *ch != '\0' && *ch != ','; ch++) { if ((*ch == '\\' && *(ch+1) == 'n') || *ch == '\n') break; } c = *ch ; *ch = '\0'; lfrom.addr = start; lfrom.size = strlen(start)+1; lto.addr = (char *)(&row[i]); lto.size = sizeof(Pixel); if (! XtCvtStringToPixel(dpy, args, num_args, &lfrom, <o, data)) { row[i] = last_pixel; XtDisplayStringConversionWarning(dpy, from->addr, XmRPixelTable); } last_pixel = row[i]; *ch = c; if (c == '\0') { start = ch; break; } if (c == '\\') { ch++ ; start = ch+1; break; } start = ch+1; } for (; i < count_x-1 ; i++) { /* fill rest of row with same value */ row[i+1] = row[i]; } } } if (to->addr == NULL) to->addr = (XtPointer) &array; else *(Pixel ***) to->addr = array; to->size = sizeof(Pixel *); return True; } /* * Free the pixel array allocated by the String to PixelTable converter */ /* ARGSUSED */ void PixelTableDestructor(app, to, converter_data, args, num_args) XtAppContext app; XrmValuePtr to; XtPointer converter_data; XrmValuePtr args; Cardinal *num_args; { Pixel **array = *(Pixel ***) to->addr; Pixel **col; if (array) { for (col = array ; col ; col++) XtFree((XtPointer)*col); XtFree((XtPointer) array); } } /* ARGSUSED */ Boolean CvtStringToGridType(dpy, args, num_args, from, to, data) Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static unsigned char grid_type; String start = from->addr; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToGridType", "wrongParameters", "XbaeMatrix", "String to GridType conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(unsigned char)) { to->size = sizeof(unsigned char); return False; } /* * Skip leading white space */ while (isspace(*start)) start++; if (StringsAreEqual(start, "grid_none", 9)) grid_type = XmGRID_NONE; else if (StringsAreEqual(start, "grid_cell_line", 14)) grid_type = XmGRID_CELL_LINE; else if (StringsAreEqual(start, "grid_cell_shadow", 16)) grid_type = XmGRID_CELL_SHADOW; else if (StringsAreEqual(start, "grid_row_line", 13)) grid_type = XmGRID_ROW_LINE; else if (StringsAreEqual(start, "grid_row_shadow", 15)) grid_type = XmGRID_ROW_SHADOW; else if (StringsAreEqual(start, "grid_column_line", 16)) grid_type = XmGRID_COLUMN_LINE; else if (StringsAreEqual(start, "grid_column_shadow", 15)) grid_type = XmGRID_COLUMN_SHADOW; /* Deprecated types. To be removed in next version. */ else if (StringsAreEqual(start, "grid_line", 9)) grid_type = XmGRID_LINE; else if (StringsAreEqual(start, "grid_shadow_in", 14)) grid_type = XmGRID_SHADOW_IN; else if (StringsAreEqual(start, "grid_shadow_out", 15)) grid_type = XmGRID_SHADOW_OUT; else { XtDisplayStringConversionWarning(dpy, from->addr, XmRGridType); return False; } /* Deprecated types. To be removed in next version. */ if (grid_type >= XmGRID_LINE) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToGridType", "deprecatedType", "XbaeMatrix", "Value for GridType is deprecated and will be removed in next release", NULL, NULL); /* * Store our return value */ if (to->addr == NULL) to->addr = (XtPointer) &grid_type; else *(unsigned char *) to->addr = grid_type; to->size = sizeof(unsigned char); return True; } /* ARGSUSED */ Boolean #ifdef __VMS /* According to Barry Stone VMS only allows function names with a maximum length of 31 characters */ CvtStringToMatrixScrollBarDisp(dpy, args, num_args, from, to, data) #else CvtStringToMatrixScrollBarDisplayPolicy(dpy, args, num_args, from, to, data) #endif Display *dpy; XrmValuePtr args; Cardinal *num_args; XrmValuePtr from, to; XtPointer *data; { static unsigned char display_policy; String start = from->addr; if (*num_args != 0) XtAppWarningMsg( XtDisplayToApplicationContext(dpy), "cvtStringToMatrixScrollBarDisplayPolicy", "wrongParameters", "XbaeMatrix", "String to MatrixScrollBarDisplayPolicy conversion needs no extra arguments", NULL, NULL); /* * User didn't provide enough space */ if (to->addr != NULL && to->size < sizeof(unsigned char)) { to->size = sizeof(unsigned char); return False; } /* * Skip leading white space */ while (isspace(*start)) start++; if (StringsAreEqual(start, "display_none", 12)) display_policy = XmDISPLAY_NONE; else if (StringsAreEqual(start, "display_as_needed", 17)) display_policy = XmDISPLAY_AS_NEEDED; else if (StringsAreEqual(start, "display_static", 14)) display_policy = XmDISPLAY_STATIC; else { XtDisplayStringConversionWarning(dpy, from->addr, XmRMatrixScrollBarDisplayPolicy); return False; } /* * Store our return value */ if (to->addr == NULL) to->addr = (XtPointer) &display_policy; else *(unsigned char *) to->addr = display_policy; to->size = sizeof(unsigned char); return True; } grace-5.1.23/Xbae/Xbae/Utils.h0000644000076500001440000000562206766327622015464 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Utils.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Utils.h created by Andrew Lister (6 August, 1995) */ #ifndef _Xbae_Utils_h #define _Xbae_Utils_h #include void xbaeGetVisibleRows P((XbaeMatrixWidget, int *, int *)); void xbaeGetVisibleColumns P((XbaeMatrixWidget, int *, int *)); void xbaeGetVisibleCells P((XbaeMatrixWidget mw, int *, int *, int *, int *)); void xbaeClearCell P((XbaeMatrixWidget, int, int)); void xbaeMakeRowVisible P((XbaeMatrixWidget, int)); void xbaeMakeColumnVisible P((XbaeMatrixWidget, int)); void xbaeMakeCellVisible P((XbaeMatrixWidget, int, int)); void xbaeAdjustTopRow P((XbaeMatrixWidget)); void xbaeAdjustLeftColumn P((XbaeMatrixWidget)); Boolean xbaeIsRowVisible P((XbaeMatrixWidget, int)); Boolean xbaeIsColumnVisible P((XbaeMatrixWidget, int)); Boolean xbaeIsCellVisible P((XbaeMatrixWidget, int, int)); void xbaeSetClipMask P((XbaeMatrixWidget, unsigned int)); void xbaeGetCellTotalWidth P((XbaeMatrixWidget)); void xbaeGetColumnPositions P((XbaeMatrixWidget)); void xbaeComputeSize P((XbaeMatrixWidget, Boolean, Boolean)); short xbaeMaxRowLabel P((XbaeMatrixWidget)); void xbaeParseColumnLabel P((String, ColumnLabelLines)); Boolean xbaeEventToXY P((XbaeMatrixWidget, XEvent *, int *, int *, CellType *)); Boolean xbaeXYToRowCol P((XbaeMatrixWidget, int *, int *, int *, int *, CellType)); int xbaeXtoCol P((XbaeMatrixWidget, int)); int xbaeXtoTrailingCol P((XbaeMatrixWidget, int)); void xbaeRowColToXY P((XbaeMatrixWidget, int, int, int *, int *)); Window xbaeGetCellWindow P((XbaeMatrixWidget, Widget *, int, int)); void xbaeCalcVertFill P((XbaeMatrixWidget, Window, int, int, int, int, int *, int *, int *, int *)); void xbaeCalcHorizFill P((XbaeMatrixWidget, Window, int, int, int, int, int *, int *, int *, int *)); #endif grace-5.1.23/Xbae/Xbae/Converters.h0000644000076500001440000000633006766327621016512 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Converters.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ #ifndef _Xbae_Converters_h #define _Xbae_Converters_h /* * Converters.h created by Andrew Lister (6 August, 1995) */ #include #include /* * Type converters */ Boolean CvtStringToStringArray P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void StringArrayDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToCellTable P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void StringCellDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToWidthArray P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void WidthArrayDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToMaxLengthArray P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void MaxLengthArrayDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToBooleanArray P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void BooleanArrayDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToAlignmentArray P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void AlignmentArrayDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *num_args)); Boolean CvtStringToPixelTable P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); void PixelTableDestructor P((XtAppContext, XrmValuePtr, XtPointer, XrmValuePtr, Cardinal *)); Boolean CvtStringToGridType P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); Boolean #ifdef __VMS CvtStringToMatrixScrollBarDisp #else CvtStringToMatrixScrollBarDisplayPolicy #endif P((Display *, XrmValuePtr, Cardinal *, XrmValuePtr, XrmValuePtr, XtPointer *)); #endif grace-5.1.23/Xbae/Xbae/Macros.h0000644000076500001440000004741606766327621015616 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Macros.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * Macros.h created by Andrew Lister (6 August, 1995) */ #ifndef _Xbae_Macros_h #define _Xbae_Macros_h /* * Prototype wrapper */ #ifndef P #if defined(__STDC__) || defined (__cplusplus) #define P(x) x #else #define P(x) () #define const #define volatile #endif #endif #if XmVersion <= 1001 #include #else #include #endif #include #include #if XmVersion <= 1001 #define DRAW_SHADOW(dpy, draw, tgc, bgc, sz, x, y, w, h, type) \ _XmDrawShadow(dpy, draw, tgc, bgc, sz, x, y, w, h) #else #if XmVersion >= 2000 #define DRAW_SHADOW(dpy, draw, tgc, bgc, sz, x, y, w, h, type) \ XmeDrawShadows(dpy, draw, tgc, bgc, x, y, w, h, sz, type) #else #define DRAW_SHADOW(dpy, draw, tgc, bgc, sz, x, y, w, h, type) \ _XmDrawShadows(dpy, draw, tgc, bgc, x, y, w, h, sz, type) #endif #endif #if XmVersion <= 1001 #define DRAW_HIGHLIGHT(dpy, draw, tgc, x, y, w, h, sz, type) \ _XmDrawSimpleHighlight(dpy, draw, tgc, x, y, w, h, sz, type) #else #if XmVersion >= 2000 #define DRAW_HIGHLIGHT(dpy, draw, tgc, x, y, w, h, sz, type) \ XmeDrawHighlight(dpy, draw, tgc, x, y, w, h, sz) #else #define DRAW_HIGHLIGHT(dpy, draw, tgc, x, y, w, h, sz, type) \ _XmDrawHighlight(dpy, draw, tgc, x, y, w, h, sz, type) #endif #endif /* * Macros to retrieve our children. Children must be created in this order. */ #define XbaeNumChildren 8 #define HorizScrollChild(mw) (mw->composite.children[0]) #define VertScrollChild(mw) (mw->composite.children[1]) #define ClipChild(mw) (mw->composite.children[2]) #define TextChild(mw) (mw->composite.children[3]) #define LeftClip(mw) (mw->composite.children[4]) #define RightClip(mw) (mw->composite.children[5]) #define TopClip(mw) (mw->composite.children[6]) #define BottomClip(mw) (mw->composite.children[7]) #define VISIBLE_WIDTH(mw) ((int)ClipChild(mw)->core.width) #define VISIBLE_HEIGHT(mw) ((int)ClipChild(mw)->core.height) #define VERT_ORIGIN(mw) (mw->matrix.top_row) #define TRAILING_VERT_ORIGIN(mw) (mw->matrix.rows - \ (int)mw->matrix.trailing_fixed_rows) #define HORIZ_ORIGIN(mw) (mw->matrix.horiz_origin) #define TRAILING_HORIZ_ORIGIN(mw) (mw->matrix.columns - \ (int)mw->matrix.trailing_fixed_columns) /* * Macros */ /* * Max and Min are defined in Xm/XmP.h in 1.1, they are deprecated in 1.2 */ #if XmVersion >= 1002 #define Max(x, y) (((x) > (y)) ? (x) : (y)) #define Min(x, y) (((x) < (y)) ? (x) : (y)) #endif #define FONT_WIDTH(mw) (mw->matrix.font_width) #define LABEL_WIDTH(mw) (mw->matrix.label_font_width) #define TEXT_WIDTH_OFFSET(mw) (mw->matrix.cell_margin_width +\ mw->matrix.cell_shadow_thickness + \ mw->matrix.cell_highlight_thickness + \ mw->matrix.text_shadow_thickness) #define TEXT_HEIGHT_OFFSET(mw) (mw->matrix.cell_margin_height +\ mw->matrix.cell_shadow_thickness + \ mw->matrix.cell_highlight_thickness + \ mw->matrix.text_shadow_thickness) #define COLUMN_WIDTH(mw, col) ((mw->matrix.column_widths[col] * \ FONT_WIDTH(mw)) + \ ((int)TEXT_WIDTH_OFFSET(mw) * 2)) #define FONT_HEIGHT(mw) (mw->matrix.font_height) #define LABEL_HEIGHT(mw) (mw->matrix.label_font_height) #define HORIZ_SB_WIDTH(mw) (HorizScrollChild(mw)->core.width + \ 2 * HorizScrollChild(mw)->core.border_width) #define HORIZ_SB_HEIGHT(mw) (HorizScrollChild(mw)->core.height + \ 2 * HorizScrollChild(mw)->core.border_width +\ mw->matrix.space) #define HORIZ_SB_SPACE(mw) (! HorizScrollChild(mw)->core.managed ? \ 0 : HORIZ_SB_HEIGHT(mw)) #define HORIZ_SB_OFFSET(mw) (((mw->matrix.scrollbar_placement == \ XmTOP_LEFT) || \ (mw->matrix.scrollbar_placement == \ XmTOP_RIGHT)) ? HORIZ_SB_SPACE(mw) : 0) #define HORIZ_SB_POSITION(mw) (((mw->matrix.scrollbar_placement == \ XmTOP_LEFT) || \ (mw->matrix.scrollbar_placement == \ XmTOP_RIGHT)) ? 0 : \ TRAILING_FIXED_ROW_LABEL_OFFSET(mw)) #define VERT_SB_WIDTH(mw) (VertScrollChild(mw)->core.width + \ 2 * VertScrollChild(mw)->core.border_width + \ mw->matrix.space) #define VERT_SB_HEIGHT(mw) (VertScrollChild(mw)->core.height + \ 2 * VertScrollChild(mw)->core.border_width) #define VERT_SB_SPACE(mw) (! VertScrollChild(mw)->core.managed ? \ 0 : VERT_SB_WIDTH(mw)) #define VERT_SB_OFFSET(mw) (((mw->matrix.scrollbar_placement == \ XmTOP_LEFT) || \ (mw->matrix.scrollbar_placement == \ XmBOTTOM_LEFT)) ? VERT_SB_SPACE(mw) : 0) #define VERT_SB_POSITION(mw) (((mw->matrix.scrollbar_placement == \ XmTOP_LEFT) || \ (mw->matrix.scrollbar_placement == \ XmBOTTOM_LEFT)) ? 0 : \ VertScrollChild(mw)->core.x - \ mw->matrix.space) #define CLIP_HORIZ_VISIBLE_SPACE(mw) ((int)(VISIBLE_WIDTH(mw) +\ FIXED_COLUMN_WIDTH(mw) + \ TRAILING_FIXED_COLUMN_WIDTH(mw))) #define CLIP_VERT_VISIBLE_SPACE(mw) ((int)(mw->matrix.cell_visible_height +\ FIXED_ROW_HEIGHT(mw) + \ TRAILING_FIXED_ROW_HEIGHT(mw))) #define MATRIX_HORIZ_VISIBLE_SPACE(mw) ((int)(mw->core.width - \ mw->manager.shadow_thickness - \ COLUMN_LABEL_OFFSET(mw) -\ VERT_SB_SPACE(mw))) #define MATRIX_VERT_VISIBLE_SPACE(mw) ((int)(mw->core.height -\ mw->manager.shadow_thickness - \ ROW_LABEL_OFFSET(mw) -\ HORIZ_SB_SPACE(mw))) #define NEED_HORIZ_FILL(mw) (mw->matrix.fill && \ (MATRIX_HORIZ_VISIBLE_SPACE(mw) > \ CLIP_HORIZ_VISIBLE_SPACE(mw))) #define NEED_VERT_FILL(mw) (mw->matrix.fill && \ (MATRIX_VERT_VISIBLE_SPACE(mw) > \ CLIP_VERT_VISIBLE_SPACE(mw))) #define FILL_HORIZ_WIDTH(mw) (mw->core.width - VISIBLE_WIDTH(mw) - \ TRAILING_FIXED_COLUMN_WIDTH(mw) - \ VERT_SB_SPACE(mw) - \ FIXED_COLUMN_LABEL_OFFSET(mw) - \ mw->manager.shadow_thickness) #define FILL_VERT_HEIGHT(mw) (mw->core.height - VISIBLE_HEIGHT(mw) - \ TRAILING_FIXED_ROW_HEIGHT(mw) - \ FIXED_ROW_LABEL_OFFSET(mw) - \ mw->manager.shadow_thickness) #define SANITY_CHECK_ROW(mw, row) (row = (row >= mw->matrix.rows) ? \ ((mw->matrix.rows > 0) ? \ mw->matrix.rows - 1 : 0) : \ (row < 0) ? 0 : row) #define SANITY_CHECK_COLUMN(mw, column) (column = \ (column >= mw->matrix.columns) ? \ ((mw->matrix.columns > 0) ? \ mw->matrix.columns - 1 : 0) : \ (column < 0) ? 0 : column) /* * The text height defines the row height. It needs to be the biggest * we can expect from both font and label font */ #define TEXT_HEIGHT(mw) (Max(FONT_HEIGHT(mw), LABEL_HEIGHT(mw))) #define ROW_HEIGHT(mw) (int)((TEXT_HEIGHT_OFFSET(mw) * 2) + \ TEXT_HEIGHT(mw)) #define TEXT_X_OFFSET(mw) (int)(TEXT_WIDTH_OFFSET(mw)) #define TEXT_Y_OFFSET(mw) (int)(mw->matrix.text_baseline) #define LABEL_Y_OFFSET(mw) (int)(mw->matrix.label_baseline) #define ROW_LABEL_WIDTH(mw) ((mw->matrix.row_labels \ ? (mw->matrix.row_label_width * \ LABEL_WIDTH(mw)) + \ (int)TEXT_WIDTH_OFFSET(mw) * 2 : 0) + \ (mw->matrix.button_labels ? \ mw->matrix.cell_shadow_thickness * 2 : 0)) #define COLUMN_LABEL_HEIGHT(mw) (mw->matrix.column_labels \ ? (int)TEXT_HEIGHT_OFFSET(mw) * 2 + \ mw->matrix.column_label_maxlines * \ LABEL_HEIGHT(mw) : 0) #define COLUMN_POSITION(mw, column) mw->matrix.column_positions[column] #define FIXED_COLUMN_WIDTH(mw) COLUMN_POSITION(mw, mw->matrix.fixed_columns) #define TRAILING_FIXED_COLUMN_WIDTH(mw) \ (mw->matrix.trailing_fixed_columns ? \ (COLUMN_POSITION(mw, mw->matrix.columns-1) + \ COLUMN_WIDTH(mw, mw->matrix.columns-1) - \ COLUMN_POSITION(mw, TRAILING_HORIZ_ORIGIN(mw))) : 0) #define COLUMN_LABEL_OFFSET(mw) (ROW_LABEL_WIDTH(mw) + \ VERT_SB_OFFSET(mw) + \ (int)mw->manager.shadow_thickness) #define FIXED_COLUMN_LABEL_OFFSET(mw) (COLUMN_LABEL_OFFSET(mw) + \ FIXED_COLUMN_WIDTH(mw)) #define TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw) (FIXED_COLUMN_LABEL_OFFSET(mw)+\ VISIBLE_WIDTH(mw)) #define FIXED_ROW_HEIGHT(mw) ((int)mw->matrix.fixed_rows * ROW_HEIGHT(mw)) #define TRAILING_FIXED_ROW_HEIGHT(mw) ((int)mw->matrix.trailing_fixed_rows * \ ROW_HEIGHT(mw)) #define ROW_LABEL_OFFSET(mw) (COLUMN_LABEL_HEIGHT(mw) + \ HORIZ_SB_OFFSET(mw) + \ mw->manager.shadow_thickness) #define FIXED_ROW_LABEL_OFFSET(mw) (ROW_LABEL_OFFSET(mw) + \ FIXED_ROW_HEIGHT(mw)) #define UNATTACHED_TRAILING_ROWS_OFFSET(mw) (FIXED_ROW_LABEL_OFFSET(mw) + \ VISIBLE_HEIGHT(mw)) #define ATTACHED_TRAILING_ROWS_OFFSET(mw) (mw->core.height - \ mw->manager.shadow_thickness - \ HORIZ_SB_SPACE(mw) - \ TRAILING_FIXED_ROW_HEIGHT(mw)) #define VERT_DEAD_SPACE_HEIGHT(mw) ((int)(ATTACHED_TRAILING_ROWS_OFFSET(mw) - \ UNATTACHED_TRAILING_ROWS_OFFSET(mw))) #define HAS_ATTACHED_TRAILING_ROWS(mw) (mw->matrix.fill && \ mw->matrix.trailing_attached_bottom && \ mw->matrix.trailing_fixed_rows) #define TRAILING_FIXED_ROW_LABEL_OFFSET(mw) (HAS_ATTACHED_TRAILING_ROWS(mw) ? \ ATTACHED_TRAILING_ROWS_OFFSET(mw) : \ UNATTACHED_TRAILING_ROWS_OFFSET(mw)) #define NEED_VERT_DEAD_SPACE_FILL(mw) (HAS_ATTACHED_TRAILING_ROWS(mw) && \ (VERT_DEAD_SPACE_HEIGHT(mw) > 0)) #define NON_FIXED_TOTAL_WIDTH(mw) mw->matrix.non_fixed_total_width #define CELL_TOTAL_HEIGHT(mw) ((mw->matrix.rows - \ (int) mw->matrix.fixed_rows - \ (int) mw->matrix.trailing_fixed_rows) \ * ROW_HEIGHT(mw)) #define IS_LEADING_FIXED_COLUMN(mw, column) (column < (int)mw->matrix.fixed_columns) #define IS_TRAILING_FIXED_COLUMN(mw, column) (column >= TRAILING_HORIZ_ORIGIN(mw)) #define IS_FIXED_COLUMN(mw, column) (IS_LEADING_FIXED_COLUMN(mw, column) || \ IS_TRAILING_FIXED_COLUMN(mw, column)) #define IS_LEADING_FIXED_ROW(mw, row) (row < (int)mw->matrix.fixed_rows) #define IS_TRAILING_FIXED_ROW(mw, row) (row >= TRAILING_VERT_ORIGIN(mw)) #define IS_FIXED_ROW(mw, row) (IS_LEADING_FIXED_ROW(mw, row) || \ IS_TRAILING_FIXED_ROW(mw, row)) #define IS_FIXED(mw, row, column) (IS_FIXED_ROW(mw, row) || \ IS_FIXED_COLUMN(mw, column)) #define IS_CLIPPED(mw, row, column) ((row >= (int)mw->matrix.fixed_rows) && \ (column >= \ (int)mw->matrix.fixed_columns) && \ (row < TRAILING_VERT_ORIGIN(mw)) && \ (column < TRAILING_HORIZ_ORIGIN(mw))) /* * I hereby dub thee, Jay Schmidgall, as Sir Silly Macro - writer of * the most obsfucated macros I've ever seen - AL (26 Feb 1998) * * How do you come up with these??? The first couple are OK but * the last two??? */ /* Here are some handy dandy macros to make it look cleaner in the * actual code. I did the vertical scrollbar stuff first, then the * horizontal. For the horizontal, I just referenced the other * orientation, and it worked. */ /* If we have fixed rows, the y position of the vsb must * be offset starting from the fixed rows. Otherwise, we * want it to be even with the matrix area top. Perhaps * oddly, we can use this macro for both XtConfigure's. */ #define VSB_Y_POSITION(mw) (mw->matrix.fixed_rows ? \ FIXED_ROW_LABEL_OFFSET(mw) - \ HORIZ_SB_OFFSET(mw) + \ ((scrollbar_top && has_horiz) ? \ HORIZ_SB_HEIGHT(mw) : 0) : \ COLUMN_LABEL_HEIGHT(mw) + \ HORIZ_SB_OFFSET(mw)) #define HSB_X_POSITION(mw) (mw->matrix.fixed_columns ? \ FIXED_COLUMN_LABEL_OFFSET(mw) - \ VERT_SB_OFFSET(mw) + \ ((scrollbar_left && has_vert) ? \ VERT_SB_WIDTH(mw) : 0) : \ ROW_LABEL_WIDTH(mw) + VERT_SB_OFFSET(mw)) /* I started trying to write a comment that sort of explains this macro. * Then I quit. What the heck, it works. Feel free on your own to make * up something that reassures you. I myself have the feeling that there * has got to be a cleaner, better way to do this, sort of like the above * two seem somehow fairly clean. But this? This is some serious gaaack. * Same thing as above. Did VSB first, then just switched orientation * for HSB. */ #define VSB_HEIGHT(mw) ((!mw->matrix.fill) ? cell_height + \ mw->manager.shadow_thickness * \ (mw->matrix.fixed_rows || \ mw->matrix.trailing_fixed_rows ? \ (mw->matrix.fixed_rows && \ mw->matrix.trailing_fixed_rows ? 0 : 1) : 2) : \ ((TRAILING_FIXED_ROW_HEIGHT(mw) > 0) ? full_height - \ (mw->matrix.fixed_rows ? \ mw->manager.shadow_thickness : 0) - \ ROW_LABEL_OFFSET(mw) - FIXED_ROW_HEIGHT(mw) - \ TRAILING_FIXED_ROW_HEIGHT(mw) + \ HORIZ_SB_OFFSET(mw) : mw->core.height + \ (mw->matrix.fixed_rows ? 0 : \ mw->manager.shadow_thickness) - \ ROW_LABEL_OFFSET(mw) - FIXED_ROW_HEIGHT(mw) + \ HORIZ_SB_OFFSET(mw) - \ (has_horiz ? HORIZ_SB_HEIGHT(mw) : 0))) #define HSB_WIDTH(mw) ((!mw->matrix.fill) ? cell_width + \ mw->manager.shadow_thickness * \ (mw->matrix.fixed_columns || \ mw->matrix.trailing_fixed_columns ? \ (mw->matrix.fixed_columns && \ mw->matrix.trailing_fixed_columns ? 0 : 1) : 2) : \ ((TRAILING_FIXED_COLUMN_WIDTH(mw) > 0) ? \ full_width - (mw->matrix.fixed_columns ? \ mw->manager.shadow_thickness : 0) - \ COLUMN_LABEL_OFFSET(mw) - FIXED_COLUMN_WIDTH(mw) - \ TRAILING_FIXED_COLUMN_WIDTH(mw) + \ VERT_SB_OFFSET(mw) : \ mw->core.width + (mw->matrix.fixed_columns ? 0 :\ mw->manager.shadow_thickness) - \ COLUMN_LABEL_OFFSET(mw) - FIXED_COLUMN_WIDTH(mw) + \ VERT_SB_OFFSET(mw) - \ (has_vert ? VERT_SB_WIDTH(mw) : 0))) #define CELL_WINDOW(mw, row, column) \ (IS_FIXED(mw, row, column) ? XtWindow(mw) : XtWindow(ClipChild(mw))) /* Inline functions */ #define xbaeFreeColumnWidths(mw) { \ if (mw->matrix.column_widths) \ XtFree((XtPointer) \ mw->matrix.column_widths); \ } #define xbaeFreeColumnMaxLengths(mw) { \ if (mw->matrix.\ column_max_lengths) \ XtFree((XtPointer) \ mw->matrix. \ column_max_lengths); \ } #define xbaeFreeColumnPositions(mw) { \ if (mw->matrix. \ column_positions) \ XtFree((XtPointer) \ mw->matrix. \ column_positions); \ } #define xbaeFreeColumnAlignments(mw) { \ if (mw->matrix. \ column_alignments) \ XtFree((XtPointer) \ mw->matrix. \ column_alignments); \ } #define xbaeFreeColumnButtonLabels(mw) { \ if (mw->matrix. \ column_button_labels) \ XtFree((XtPointer) \ mw->matrix. \ column_button_labels); \ } #define xbaeFreeRowButtonLabels(mw) { \ if (mw->matrix. \ row_button_labels) \ XtFree((XtPointer) \ mw->matrix. \ row_button_labels); \ } #define xbaeFreeColumnLabelAlignments(mw) { \ if (mw->matrix. \ column_label_alignments) \ XtFree((XtPointer) \ mw->matrix. \ column_label_alignments); \ } #define xbaeFreeRowUserData(mw) { \ if (mw->matrix.\ row_user_data) \ XtFree((XtPointer) \ mw->matrix.\ row_user_data); \ } #define xbaeFreeColumnUserData(mw) { \ if (mw->matrix.\ column_user_data) \ XtFree((XtPointer) \ mw->matrix.\ column_user_data); \ } #define xbaeFreeRowShadowTypes(mw) { \ if (mw->matrix.\ row_shadow_types) \ XtFree((XtPointer) \ mw->matrix.\ row_shadow_types); \ } #define xbaeFreeColumnShadowTypes(mw) { \ if (mw->matrix.\ column_shadow_types) \ XtFree((XtPointer) \ mw->matrix.\ column_shadow_types); \ } #define CreateColumnPositions(mw) (int *)XtMalloc((mw->matrix.columns+1)* \ sizeof(int)) #define YtoRow(mw, y) ((y) / ROW_HEIGHT(mw)) /* * Evaluates to 1 if two Rectangles overlap, 0 if no overlap */ #define OVERLAP(r1, r2) ((r1).x2 >= (r2).x1 && \ (r1).x1 <= (r2).x2 && \ (r1).y2 >= (r2).y1 && \ (r1).y1 <= (r2).y2) /* * Intersect rectangles r1 and r2, place the result in res. * Result will be in r1's coord system. */ #define X_INTERSECT(r1, r2, res) { (res).x1 = Max((r1).x1, (r2).x1) - (r1).x1;\ (res).x2 = Min((r1).x2, (r2).x2) - (r1).x1;} #define Y_INTERSECT(r1, r2, res) { (res).y1 = Max((r1).y1, (r2).y1) - (r1).y1;\ (res).y2 = Min((r1).y2, (r2).y2) - (r1).y1;} #define INTERSECT(r1, r2, res) { X_INTERSECT(r1, r2, res); \ Y_INTERSECT(r1, r2, res); } /* * Evaluates to 1 if the point is in the Rectangle, 0 if not */ #define INBOX(r, x, y) ((((r).x2 >= x)) && \ (((r).x1 <= x)) && \ (((r).y2 >= y)) && \ (((r).y1 <= y))) /* * Macros used for Rectangle calculations. A Rectangle is defined by it's * upper left and lower right corners. */ /* * Set a Rectangle. (x1,y1) is upper left corner, (x2,y2) is lower right corner */ #define SETRECT(r, X1, Y1, X2, Y2) { (r).x1 = X1; (r).y1 = Y1; \ (r).x2 = X2; (r).y2 = Y2; } #ifdef NEED_WCHAR #define TWO_BYTE_FONT(mw) (mw->matrix.font->max_byte1 != 0) #endif #ifdef NEED_24BIT_VISUAL #define GC_PARENT_WINDOW(w) XtWindow(get_shell_ancestor((Widget)w)) #else #define GC_PARENT_WINDOW(w) RootWindowOfScreen(XtScreen(w)) #endif /* * End of array flags for the array type converters */ #define BAD_WIDTH -1 #define BAD_MAXLENGTH 0 #define BAD_ALIGNMENT 3 /* see Xm.h */ #define BAD_PIXEL 0x10000000 /* normally 256 indices */ /* * SetClipMask flags for indicating clip areas */ #define CLIP_NONE 0x0000 #define CLIP_FIXED_COLUMNS 0x0001 #define CLIP_FIXED_ROWS 0x0002 #define CLIP_TRAILING_FIXED_COLUMNS 0x0004 #define CLIP_TRAILING_FIXED_ROWS 0x0008 #define CLIP_BETWEEN_FIXED_ROWS 0x0010 #define CLIP_VISIBLE_HEIGHT 0x0020 #define CLIP_TRAILING_HORIZ_FILL 0x0040 #define CLIP_TRAILING_VERT_FILL 0x0080 #define CLIP_COLUMN_LABELS 0x0100 #define CLIP_ROW_LABELS 0x0200 #define CLIP_ALL 0x0400 /* * Row and Column grid shadow/line redraw reasons */ #define GRID_REDRAW_EXPOSE 0x0000 #define GRID_REDRAW_SCROLL_VERT 0x0001 #define GRID_REDRAW_SCROLL_HORIZ 0x0002 #define GRID_REDRAW_EDIT (GRID_REDRAW_SCROLL_VERT | \ GRID_REDRAW_SCROLL_HORIZ) /* * Un/Highlight indicators */ #if XmVersion >= 1002 #define GRID_REDRAW_HIGHLIGHT 0x0100 #define HIGHLIGHTING_SOMETHING 0x0F #define UNHIGHLIGHTING_SOMETHING 0xF0 #endif /* * Grid shadow/line detectors */ #define GRID_MODE_CELL (XmGRID_CELL_LINE & XmGRID_CELL_SHADOW) #define GRID_MODE_ROW (XmGRID_ROW_LINE & XmGRID_ROW_SHADOW) #define GRID_MODE_COLUMN (XmGRID_COLUMN_LINE & XmGRID_COLUMN_SHADOW) #define IN_GRID_CELL_MODE(mw) (mw->matrix.grid_type & GRID_MODE_CELL) #define IN_GRID_ROW_MODE(mw) (mw->matrix.grid_type & GRID_MODE_ROW) #define IN_GRID_COLUMN_MODE(mw) (mw->matrix.grid_type & GRID_MODE_COLUMN) #endif /* _Xbae_Macros_h */ grace-5.1.23/Xbae/Xbae/ScrollMgr.h0000644000076500001440000000361006766327622016263 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: ScrollMgr.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * ScrollMgr.h created by Andrew Lister (6 August, 1995) */ #ifndef _Xbae_ScrollMgr_h #define _Xbae_ScrollMgr_h #include /* * ScrollMgr implementation */ SmScrollMgr xbaeSmCreateScrollMgr P((void)); void xbaeSmDestroyScrollMgr P((SmScrollMgr)); void xbaeSmAddScroll P((SmScrollMgr, int, int)); void xbaeSmRemoveScroll P((SmScrollMgr)); void xbaeSmScrollEvent P((SmScrollMgr, XEvent *)); /* * Scrollbar callbacks */ void xbaeScrollVertCB P((Widget, XtPointer, XmScrollBarCallbackStruct *)); void xbaeScrollHorizCB P((Widget, XtPointer , XmScrollBarCallbackStruct *)); void xbaeRedrawCells P((XbaeMatrixWidget, Rectangle *)); void xbaeRedrawLabelsAndFixed P((XbaeMatrixWidget, Rectangle *)); #endif grace-5.1.23/Xbae/Xbae/Clip.h0000644000076500001440000000401606766327621015246 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * ClipWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Clip.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * Clip.h - Public definitions for Clip widget */ #ifndef _Xbae_Clip_h #define _Xbae_Clip_h #include #include /* Resources: * Name Class RepType Default Value * ---- ----- ------- ------------- * exposeProc Function Function NULL * focusCallback Callback Callback NULL */ #define XmNexposeProc "exposeProc" /* Class record constants */ extern WidgetClass xbaeClipWidgetClass; typedef struct _XbaeClipClassRec *XbaeClipWidgetClass; typedef struct _XbaeClipRec *XbaeClipWidget; /* * External interfaces to class methods */ #if defined (__cplusplus) || defined(c_plusplus) extern "C" { #endif extern void XbaeClipRedraw( #if NeedFunctionPrototypes Widget /* w */ #endif ); #if defined (__cplusplus) || defined(c_plusplus) } #endif #endif /* _Xbae_Clip_h */ grace-5.1.23/Xbae/Xbae/Shadow.h0000644000076500001440000000307506766327622015611 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Shadow.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Shadow.h created by Andrew Lister (30 October, 1995) */ #ifndef _Xbae_Shadow_h #define _Xbae_Shadow_h #include void xbaeDrawCellShadow P((XbaeMatrixWidget, Window, int, int, int, int, int, int, Boolean, Boolean, Boolean)); #if XmVersion >= 1002 void xbaeDrawCellHighlight P((XbaeMatrixWidget, Window, GC, int, int, int, int, int, int, int)); #endif #endif grace-5.1.23/Xbae/Xbae/Actions.h0000644000076500001440000000431406766327620015757 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Actions.h,v 1.1 1999/09/11 01:25:36 fnevgeny Exp $ */ /* * Actions.h created by Andrew Lister (6 August, 1995) */ #ifndef _Xbae_Actions_h #define _Xbae_Actions_h #include /* * Actions */ void xbaeEditCellACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeCancelEditACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeCommitEditACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeSelectCellACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeDefaultActionACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeResizeColumnsACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeTraverseNextACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeTraversePrevACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeProcessDragACT P((Widget, XEvent *, String *, Cardinal *)); void xbaeHandleClick P((Widget, XtPointer, XEvent *, Boolean *)); void xbaeHandleMotionACT P((Widget, XEvent *, String *, Cardinal *)); void xbaePageDownACT P((Widget, XEvent *, String *, Cardinal *)); void xbaePageUpACT P((Widget, XEvent *, String *, Cardinal *)); #endif grace-5.1.23/Xbae/Xbae/patchlevel.h0000644000076500001440000000255106766327622016511 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * */ #ifndef _Xbae_patchlevel_h #define _Xbae_patchlevel_h #define XbaeVERSION 4 #define XbaeREVISION 7 #define XbaeVersion (XbaeVERSION * 1000 + XbaeREVISION) #endif grace-5.1.23/Xbae/Xbae/Draw.h0000644000076500001440000000374506766327621015264 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Draw.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * Draw.h created by Andrew Lister (30 October, 1995) */ #ifndef _Xbae_Draw_h #define _Xbae_Draw_h #include void xbaeComputeCellColors P((XbaeMatrixWidget, int, int, Pixel *, Pixel *)); void xbaeDrawCell P((XbaeMatrixWidget, int, int)); XbaeCellType xbaeGetDrawCellValue P((XbaeMatrixWidget, int, int, String *, Pixmap *, Pixmap *, int *, int *, Pixel *, Pixel *, int *)); void xbaeDrawString P((XbaeMatrixWidget mw, Window win, GC gc, String string, int length, int x, int y, int maxlen, unsigned char alignment, Boolean highlight, Boolean bold, Boolean rowLabel, Boolean colLabel, Pixel color)); void xbaeDrawColumnLabel P((XbaeMatrixWidget mw, int column, Boolean pressed)); void xbaeDrawRowLabel P((XbaeMatrixWidget mw, int row, Boolean pressed)); #endif grace-5.1.23/Xbae/Xbae/Matrix.c0000644000076500001440000030243410071354476015613 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Matrix.c,v 1.1.2.2 2004/07/02 21:53:02 fnevgeny Exp $ */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #if XmVersion > 1001 #include #include #include #endif #include #include #include #include #include #include #include #include #include #ifndef XlibSpecificationRelease #define XrmPermStringToQuark XrmStringToQuark #endif /* * Translations for Matrix (these will also be used by the Clip child). */ static char defaultTranslations[] = " : DefaultAction()\n\ : DefaultAction() EditCell(Pointer)\n\ Shift : ResizeColumns()\n\ : ProcessDrag()\n\ : HandleMotion()"; /* * Default translations for XmNtextTranslations resource */ static char default_text_translations[] = "#override\n\ Shift ~Ctrl ~Meta ~Alt Tab : EditCell(Left)\n\ ~Ctrl ~Meta ~Alt Tab : EditCell(Right)\n\ osfUp : EditCell(Up)\n\ osfDown : EditCell(Down)\n\ osfActivate : CommitEdit(False)\n\ ~Shift ~Meta ~Alt Return : CommitEdit(False)\n\ Ctrl osfCancel : CancelEdit(False)\n\ Shift Ctrl ~Meta ~Alt Tab : TraversePrev()\n\ Ctrl ~Meta ~Alt Tab : TraverseNext()\n\ osfPageDown : PageDown()\n\ osfPageUp : PageUp()"; #define offset(field) XtOffsetOf(XbaeMatrixRec, field) static XtResource resources[] = { #ifdef ALLOW_COLUMN_RESIZE {XmNallowColumnResize, XmCColumnResize, XmRBoolean, sizeof(Boolean), offset(matrix.allow_column_resize), XmRImmediate, (XtPointer) True}, #else {XmNallowColumnResize, XmCColumnResize, XmRBoolean, sizeof(Boolean), offset(matrix.allow_column_resize), XmRImmediate, (XtPointer) False}, #endif {XmNaltRowCount, XmCAltRowCount, XmRInt, sizeof(int), offset(matrix.alt_row_count), XmRImmediate, (XtPointer) 1}, {XmNboldLabels, XmCBoldLabels, XmRBoolean, sizeof(Boolean), offset(matrix.bold_labels), XmRImmediate, (XtPointer) False}, {XmNbuttonLabels, XmCButtonLabels, XmRBoolean, sizeof(Boolean), offset(matrix.button_labels), XmRImmediate, (XtPointer) False}, {XmNbuttonLabelBackground, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.button_label_background), XmRCallProc, (XtPointer)xbaeCopyBackground}, {XmNcalcCursorPosition, XmCCalcCursorPosition, XmRBoolean, sizeof(Boolean), offset(matrix.calc_cursor_position), XmRImmediate, (XtPointer) False}, {XmNcellBackgrounds, XmCColors, XmRPixelTable, sizeof(Pixel **), offset(matrix.cell_background), XmRImmediate, (XtPointer) NULL}, {XmNcellHighlightThickness, XmCHighlightThickness, XmRHorizontalDimension, sizeof(Dimension), offset(matrix.cell_highlight_thickness), XmRImmediate, (XtPointer) 2}, {XmNcellMarginHeight, XmCMarginHeight, XmRVerticalDimension, sizeof(Dimension), offset(matrix.cell_margin_height), XmRImmediate, (XtPointer) 3}, {XmNcellMarginWidth, XmCMarginWidth, XmRHorizontalDimension, sizeof(Dimension), offset(matrix.cell_margin_width), XmRImmediate, (XtPointer) 3}, {XmNcellShadowThickness, XmCShadowThickness, XmRDimension, sizeof(Dimension), offset(matrix.cell_shadow_thickness), XmRImmediate, (XtPointer) 1}, {XmNcellShadowType, XmCShadowType, XmRShadowType, sizeof(unsigned char), offset(matrix.cell_shadow_type), XmRImmediate, (XtPointer) XmSHADOW_OUT}, {XmNcellShadowTypes, XmCCellShadowTypes, XmRShadowTypeTable, sizeof(unsigned char**), offset(matrix.cell_shadow_types), XmRImmediate, (XtPointer) NULL}, {XmNcellUserData, XmCCellUserData, XmRUserDataTable, sizeof(XtPointer**), offset(matrix.cell_user_data), XmRImmediate, (XtPointer) NULL}, #if CELL_WIDGETS {XmNcellWidgets, XmCCellWidgets, XmRWidgetTable, sizeof(Widget **), offset(matrix.cell_widgets), XmRImmediate, (XtPointer) NULL}, #endif {XmNcells, XmCCells, XmRCellTable, sizeof(String **), offset(matrix.cells), XmRImmediate, NULL}, {XmNclipWindow, XmCClipWindow, XmRWidget, sizeof(Widget), offset(matrix.clip_window), XmRImmediate, NULL}, {XmNcolors, XmCColors, XmRPixelTable, sizeof(Pixel **), offset(matrix.colors), XmRImmediate, (XtPointer) NULL}, {XmNcolumnAlignments, XmCAlignments, XmRAlignmentArray, sizeof(unsigned char *), offset(matrix.column_alignments), XmRImmediate, (XtPointer) NULL}, {XmNcolumnButtonLabels, XmCButtonLabels, XmRBooleanArray, sizeof(Boolean*), offset(matrix.column_button_labels), XmRImmediate, (XtPointer) NULL}, {XmNcolumnLabelAlignments, XmCAlignments, XmRAlignmentArray, sizeof(unsigned char *), offset(matrix.column_label_alignments), XmRImmediate, (XtPointer) NULL}, {XmNcolumnLabelColor, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.column_label_color), XmRCallProc, (XtPointer)xbaeCopyForeground}, {XmNcolumnLabels, XmCLabels, XmRStringArray, sizeof(String *), offset(matrix.column_labels), XmRImmediate, NULL}, {XmNcolumnMaxLengths, XmCColumnMaxLengths, XmRMaxLengthArray, sizeof(int *), offset(matrix.column_max_lengths), XmRImmediate, NULL}, {XmNcolumnShadowTypes, XmCShadowTypes, XmRShadowTypeArray, sizeof(unsigned char*), offset(matrix.column_shadow_types), XmRImmediate, (XtPointer) NULL}, {XmNcolumnUserData, XmCUserDatas, XmRUserDataArray, sizeof(XtPointer*), offset(matrix.column_user_data), XmRImmediate, (XtPointer) NULL}, {XmNcolumnWidths, XmCColumnWidths, XmRWidthArray, sizeof(short *), offset(matrix.column_widths), XmRImmediate, NULL}, {XmNcolumns, XmCColumns, XmRInt, sizeof(int), offset(matrix.columns), XmRImmediate, (XtPointer) 1}, {XmNdefaultActionCallback,XmCCallback,XmRCallback,sizeof(XtCallbackList), offset(matrix.default_action_callback),XmRCallback,NULL }, {XmNdoubleClickInterval, XmCDoubleClickInterval, XmRInt, sizeof(int), offset(matrix.double_click_interval), XmRCallProc, (XtPointer)xbaeCopyDoubleClick }, {XmNdrawCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.draw_cell_callback), XmRCallback, NULL}, {XmNenterCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.enter_cell_callback), XmRCallback, NULL}, {XmNevenRowBackground, XmCBackground, XmRPixel, sizeof(Pixel), offset(matrix.even_row_background), XmRCallProc, (XtPointer)xbaeCopyBackground}, {XmNfill, XmCFill, XmRBoolean, sizeof(Boolean), offset(matrix.fill), XmRImmediate, (XtPointer) False}, {XmNfixedColumns, XmCFixedColumns, XmRDimension, sizeof(Dimension), offset(matrix.fixed_columns), XmRImmediate, (XtPointer) 0}, {XmNfixedRows, XmCFixedRows, XmRDimension, sizeof(Dimension), offset(matrix.fixed_rows), XmRImmediate, (XtPointer) 0}, {XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList), offset(matrix.font_list), XmRString, (XtPointer) "fixed"}, {XmNgridLineColor, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.grid_line_color), XmRCallProc, (XtPointer)xbaeCopyForeground}, {XmNgridType, XmCGridType, XmRGridType, sizeof(unsigned char), offset(matrix.grid_type), XmRImmediate, (XtPointer)XmGRID_CELL_LINE}, #if XmVersion >= 1002 {XmNhighlightedCells, XmCHighlightedCells, XmRHighlightTable, sizeof(unsigned char **), offset(matrix.highlighted_cells), XmRImmediate, (XtPointer) NULL}, #endif {XmNhorizontalScrollBar, XmCHorizontalScrollBar, XmRWidget, sizeof(Widget), offset(matrix.horizontal_sb), XmRImmediate, NULL}, {XmNhorizontalScrollBarDisplayPolicy, XmCMatrixScrollBarDisplayPolicy, XmRMatrixScrollBarDisplayPolicy, sizeof(unsigned char), offset(matrix.hsb_display_policy), XmRImmediate, (XtPointer) XmDISPLAY_AS_NEEDED}, {XmNlabelActivateCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.label_activate_callback), XmRCallback, NULL}, {XmNlabelFont, XmCFontList, XmRFontList, sizeof(XmFontList), offset(matrix.label_font_list), XmRString, (XtPointer)NULL }, {XmNleaveCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.leave_cell_callback), XmRCallback, NULL}, {XmNleftColumn, XmCLeftColumn, XmRInt, sizeof(int), offset(matrix.left_column), XmRImmediate, (XtPointer) 0 }, {XmNmodifyVerifyCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.modify_verify_callback), XmRCallback, NULL}, {XmNoddRowBackground, XmCBackground, XmRPixel, sizeof(Pixel), offset(matrix.odd_row_background), XmRCallProc, (XtPointer)xbaeCopyBackground}, #if XmVersion > 1001 {XmNprocessDragCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.process_drag_callback), XmRCallback, NULL}, #endif /* Resize callback resource. Added by mjs */ {XmNresizeCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.resize_callback), XmRCallback, NULL}, {XmNresizeColumnCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.resize_column_callback), XmRCallback, NULL}, {XmNreverseSelect, XmCReverseSelect, XmRBoolean, sizeof(Boolean), offset(matrix.reverse_select), XmRImmediate, (XtPointer) False}, {XmNrowButtonLabels, XmCButtonLabels, XmRBooleanArray, sizeof(Boolean*), offset(matrix.row_button_labels), XmRImmediate, (XtPointer) NULL}, {XmNrowLabelAlignment, XmCAlignment, XmRAlignment, sizeof(unsigned char), offset(matrix.row_label_alignment), XmRImmediate, (XtPointer) XmALIGNMENT_END}, {XmNrowLabelColor, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.row_label_color), XmRCallProc, (XtPointer)xbaeCopyForeground }, {XmNrowLabelWidth, XmCRowLabelWidth, XmRShort, sizeof(short), offset(matrix.row_label_width), XmRImmediate, (XtPointer) 0}, {XmNrowLabels, XmCLabels, XmRStringArray, sizeof(String *), offset(matrix.row_labels), XmRImmediate, NULL}, {XmNrowShadowTypes, XmCShadowTypes, XmRShadowTypeArray, sizeof(unsigned char*), offset(matrix.row_shadow_types), XmRImmediate, (XtPointer) NULL}, {XmNrowUserData, XmCUserDatas, XmRUserDataArray, sizeof(XtPointer*), offset(matrix.row_user_data), XmRImmediate, (XtPointer) NULL}, {XmNrows, XmCRows, XmRInt, sizeof(int), offset(matrix.rows), XmRImmediate, (XtPointer) 1}, {XmNscrollBarPlacement, XmCScrollBarPlacement, XmRScrollBarPlacement, sizeof(unsigned char), offset(matrix.scrollbar_placement), XmRImmediate, (XtPointer) XmBOTTOM_RIGHT }, {XmNselectCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.select_cell_callback), XmRCallback, NULL}, {XmNselectScrollVisible, XmCSelectScrollVisible, XmRBoolean, sizeof(Boolean), offset(matrix.scroll_select), XmRImmediate, (XtPointer) True}, {XmNselectedBackground, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.selected_background), XmRCallProc, (XtPointer)xbaeCopyForeground}, {XmNselectedCells, XmCSelectedCells, XmRBooleanTable, sizeof(Boolean **), offset(matrix.selected_cells), XmRImmediate, (XtPointer) NULL}, {XmNselectedForeground, XmCColor, XmRPixel, sizeof(Pixel), offset(matrix.selected_foreground), XmRCallProc, (XtPointer)xbaeCopyBackground}, {XmNselectionPolicy, XmCSelectionPolicy, XmRSelectionPolicy, sizeof(unsigned char), offset(matrix.selection_policy), XmRImmediate, XmSINGLE_SELECT}, /* Override Manager default */ {XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension, sizeof(Dimension), XtOffsetOf(XmManagerRec, manager.shadow_thickness), XmRImmediate, (XtPointer) 2}, {XmNshadowType, XmCShadowType, XmRShadowType, sizeof(unsigned char), offset(matrix.shadow_type), XmRImmediate, (XtPointer) XmSHADOW_IN}, {XmNshowArrows, XmCShowArrows, XmRBoolean, sizeof(Boolean), offset(matrix.show_arrows), XmRImmediate, (XtPointer) False}, {XmNspace, XmCSpace, XmRHorizontalDimension, sizeof(Dimension), offset(matrix.space), XmRImmediate, (XtPointer) 4}, {XmNtextBackground, XmCTextBackground, XmRPixel, sizeof(Pixel), offset(matrix.text_background), XmRCallProc, (XtPointer)xbaeCopyBackground}, {XmNtextField, XmCTextField, XmRWidget, sizeof(Widget), offset(matrix.text_field), XmRImmediate, NULL}, {XmNtextShadowThickness, XmCTextShadowThickness, XmRDimension, sizeof(Dimension), offset(matrix.text_shadow_thickness), XmRImmediate, (XtPointer) 0}, {XmNtextTranslations, XmCTranslations, XmRTranslationTable, sizeof(XtTranslations), offset(matrix.text_translations), XmRString, (XtPointer) default_text_translations}, {XmNtopRow, XmCTopRow, XmRInt, sizeof(int), offset(matrix.top_row), XmRImmediate, (XtPointer) 0}, {XmNtrailingAttachedBottom, XmCTrailingAttachedBottom, XmRBoolean, sizeof(Boolean), offset(matrix.trailing_attached_bottom), XmRImmediate, (XtPointer) False}, {XmNtrailingAttachedRight, XmCTrailingAttachedRight, XmRBoolean, sizeof(Boolean), offset(matrix.trailing_attached_right), XmRImmediate, (XtPointer) False}, {XmNtrailingFixedColumns, XmCTrailingFixedColumns, XmRDimension, sizeof(Dimension), offset(matrix.trailing_fixed_columns), XmRImmediate, (XtPointer) 0}, {XmNtrailingFixedRows, XmCTrailingFixedRows, XmRDimension, sizeof(Dimension), offset(matrix.trailing_fixed_rows), XmRImmediate, (XtPointer) 0}, {XmNtraverseCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.traverse_cell_callback), XmRCallback, NULL}, {XmNtraverseFixedCells, XmCTraverseFixedCells, XmRBoolean, sizeof(Boolean), offset(matrix.traverse_fixed), XmRImmediate, (XtPointer) False}, {XmNverticalScrollBar, XmCVerticalScrollBar, XmRWidget, sizeof(Widget), offset(matrix.vertical_sb), XmRImmediate, NULL}, {XmNverticalScrollBar, XmCVerticalScrollBar, XmRWidget, sizeof(Widget), offset(matrix.vertical_sb), XmRImmediate, NULL}, {XmNverticalScrollBarDisplayPolicy, XmCMatrixScrollBarDisplayPolicy, XmRMatrixScrollBarDisplayPolicy, sizeof(unsigned char), offset(matrix.vsb_display_policy), XmRImmediate, (XtPointer) XmDISPLAY_AS_NEEDED}, {XmNvisibleColumns, XmCVisibleColumns, XmRDimension, sizeof(Dimension), offset(matrix.visible_columns), XmRImmediate, (XtPointer) 0}, {XmNvisibleRows, XmCVisibleRows, XmRDimension, sizeof(Dimension), offset(matrix.visible_rows), XmRImmediate, (XtPointer) 0}, {XmNwriteCellCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), offset(matrix.write_cell_callback), XmRCallback, NULL}, }; static XmSyntheticResource syn_resources[] = { {XmNcellHighlightThickness, sizeof(Dimension), offset(matrix.cell_highlight_thickness), _XmFromHorizontalPixels, _XmToHorizontalPixels}, {XmNcellMarginHeight, sizeof(Dimension), offset(matrix.cell_margin_height), _XmFromVerticalPixels, _XmToVerticalPixels}, {XmNcellMarginWidth, sizeof(Dimension), offset(matrix.cell_margin_width), _XmFromHorizontalPixels, _XmToHorizontalPixels}, {XmNcellShadowThickness, sizeof(Dimension), offset(matrix.cell_shadow_thickness), _XmFromHorizontalPixels, _XmToHorizontalPixels}, {XmNspace, sizeof(Dimension), offset(matrix.space), _XmFromHorizontalPixels, _XmToHorizontalPixels}, }; #if XmVersion >= 1002 static XtIntervalId TraverseID = 0; #endif /* * Declaration of methods */ static void ClassInitialize P((void)); static void xbaeRegisterConverters P((void)); static void ClassPartInitialize P((XbaeMatrixWidgetClass)); static void Initialize P((XbaeMatrixWidget, XbaeMatrixWidget, ArgList, Cardinal *)); static void Realize P((XbaeMatrixWidget, XtValueMask *, XSetWindowAttributes *)); static void InsertChild P((Widget)); static void Redisplay P((Widget, XEvent *, Region)); static Boolean SetValues P((XbaeMatrixWidget, XbaeMatrixWidget, XbaeMatrixWidget, ArgList, Cardinal *)); static void SetValuesAlmost P((XbaeMatrixWidget, XbaeMatrixWidget, XtWidgetGeometry *, XtWidgetGeometry *)); static void Destroy P((XbaeMatrixWidget)); static XtGeometryResult GeometryManager P((Widget, XtWidgetGeometry *, XtWidgetGeometry *)); static XtGeometryResult QueryGeometry P((XbaeMatrixWidget, XtWidgetGeometry *, XtWidgetGeometry *)); /* * Redraw function for clip widget */ static void ClipRedisplay P((Widget, XEvent *, Region)); /* * Private functions unique to Matrix */ static void ResizeCells P((XbaeMatrixWidget, XbaeMatrixWidget)); static void ResizeSelectedCells P((XbaeMatrixWidget, XbaeMatrixWidget)); #if XmVersion >= 1002 static void ResizeHighlightedCells P((XbaeMatrixWidget, XbaeMatrixWidget)); #endif static void ResizeColors P((XbaeMatrixWidget, XbaeMatrixWidget, Boolean)); static void TraverseIn P((XbaeMatrixWidget)); #if XmVersion >= 1002 static void TraverseInTimeOut P((XtPointer, XtIntervalId *)); #endif /* XmVersion >= 1002 */ /* * Clip widget focusCallback */ static void TraverseInCB P((Widget, XbaeMatrixWidget, XtPointer)); /* * Matrix actions */ static XtActionsRec actions[] = { {"EditCell", xbaeEditCellACT}, {"CancelEdit", xbaeCancelEditACT}, {"DefaultAction", xbaeDefaultActionACT}, {"CommitEdit", xbaeCommitEditACT}, {"ResizeColumns", xbaeResizeColumnsACT}, {"SelectCell", xbaeSelectCellACT}, {"TraverseNext", xbaeTraverseNextACT}, {"TraversePrev", xbaeTraversePrevACT}, {"ProcessDrag", xbaeProcessDragACT}, {"HandleMotion", xbaeHandleMotionACT}, {"PageDown", xbaePageDownACT}, {"PageUp", xbaePageUpACT} }; static XmBaseClassExtRec BaseClassExtRec = { NULL, /* next_extension */ NULLQUARK, /* record_type */ XmBaseClassExtVersion, /* version */ sizeof(XmBaseClassExtRec), /* record_size */ NULL, /* InitializePrehook */ NULL, /* SetValuesPrehook */ NULL, /* InitializePosthook */ NULL, /* SetValuesPosthook */ NULL, /* secondaryObjectClass */ NULL, /* secondaryCreate */ NULL, /* getSecRes data */ { 0 }, /* fastSubclass flags */ NULL, /* get_values_prehook */ NULL, /* get_values_posthook */ NULL, /* classPartInitPrehook */ NULL, /* classPartInitPosthook*/ NULL, /* ext_resources */ NULL, /* compiled_ext_resources*/ 0, /* num_ext_resources */ FALSE, /* use_sub_resources */ XmInheritWidgetNavigable, /* widgetNavigable */ XmInheritFocusChange, /* focusChange */ }; externaldef(xbaematrixclassrec) XbaeMatrixClassRec xbaeMatrixClassRec = { { /* core_class fields */ (WidgetClass) & xmManagerClassRec, /* superclass */ "XbaeMatrix", /* class_name */ sizeof(XbaeMatrixRec), /* widget_size */ ClassInitialize, /* class_initialize */ (XtWidgetClassProc)ClassPartInitialize, /* class_part_initialize*/ False, /* class_inited */ (XtInitProc)Initialize, /* initialize */ NULL, /* initialize_hook */ (XtRealizeProc)Realize, /* realize */ actions, /* actions */ XtNumber(actions), /* num_actions */ resources, /* resources */ XtNumber(resources), /* num_resources */ NULLQUARK, /* xrm_class */ True, /* compress_motion */ XtExposeCompressMultiple | /* compress_exposure */ XtExposeGraphicsExpose | XtExposeNoExpose, True, /* compress_enterleave */ False, /* visible_interest */ (XtWidgetProc)Destroy, /* destroy */ (XtWidgetProc)xbaeResize, /* resize */ (XtExposeProc)Redisplay, /* expose */ (XtSetValuesFunc)SetValues, /* set_values */ NULL, /* set_values_hook */ (XtAlmostProc)SetValuesAlmost, /* set_values_almost */ NULL, /* get_values_hook */ NULL, /* accept_focus */ XtVersionDontCheck, /* version */ NULL, /* callback_private */ defaultTranslations, /* tm_table */ (XtGeometryHandler)QueryGeometry, /* query_geometry */ NULL, /* display_accelerator */ (XtPointer) &BaseClassExtRec /* extension */ }, { /* composite_class fields */ GeometryManager, /* geometry_manager */ NULL, /* change_managed */ InsertChild, /* insert_child */ XtInheritDeleteChild, /* delete_child */ NULL, /* extension */ }, { /* constraint_class fields */ NULL, /* resources */ 0, /* num_resources */ 0, /* constraint_size */ NULL, /* initialize */ NULL, /* destroy */ NULL, /* set_values */ NULL /* extension */ }, { /* manager_class fields */ XtInheritTranslations, /* translations */ syn_resources, /* syn_resources */ XtNumber(syn_resources), /* num_syn_resources */ NULL, /* syn_constraint_resources */ 0, /* num_syn_constraint_resources */ XmInheritParentProcess, /* parent_process */ NULL /* extension */ }, { /* matrix_class fields */ xbaeSetCell, /* set_cell */ xbaeGetCell, /* get_cell */ xbaeEditCell, /* edit_cell */ xbaeSelectCell, /* select_cell */ xbaeSelectRow, /* select_row */ xbaeSelectColumn, /* select_column */ xbaeDeselectAll, /* deselect_all */ xbaeSelectAll, /* select_all */ xbaeDeselectCell, /* deselect_cell */ xbaeDeselectRow, /* deselect_row */ xbaeDeselectColumn, /* deselect_column */ xbaeCommitEdit, /* commit_edit */ xbaeCancelEdit, /* cancel_edit */ xbaeAddRows, /* add_rows */ xbaeDeleteRows, /* delete_rows */ xbaeAddColumns, /* add_columns */ xbaeDeleteColumns, /* delete_columns */ xbaeSetRowColors, /* set_row_colors */ xbaeSetColumnColors, /* set_column_colors */ xbaeSetCellColor, /* set_cell_color */ NULL, /* extension */ } }; externaldef(xbaematrixwidgetclass) WidgetClass xbaeMatrixWidgetClass = (WidgetClass) & xbaeMatrixClassRec; static XtConvertArgRec convertArg[] = { {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen), sizeof(Screen *)}, {XtWidgetBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.colormap), sizeof(Colormap)} }; static void xbaeRegisterConverters() { /* * String to StringArray is used for XmNrowLabels and XmNcolumnLabels * We make a private copy of this table */ XtSetTypeConverter(XmRString, XmRStringArray, CvtStringToStringArray, NULL, 0, XtCacheAll | XtCacheRefCount, StringArrayDestructor); /* * String to String2DArray is used for XmNcells resource * We make a private copy of this table */ XtSetTypeConverter(XmRString, XmRCellTable, CvtStringToCellTable, NULL, 0, XtCacheNone, StringCellDestructor); /* * String to ShortArray is used for XmNcolumnWidths resource. * We make a private copy of this table */ XtSetTypeConverter(XmRString, XmRWidthArray, CvtStringToWidthArray, NULL, 0, XtCacheAll | XtCacheRefCount, WidthArrayDestructor); /* * String to IntArray is used for XmNcolumnMaxLengths resource. * We make a private copy of this table */ XtSetTypeConverter(XmRString, XmRMaxLengthArray, CvtStringToMaxLengthArray, NULL, 0, XtCacheAll | XtCacheRefCount, MaxLengthArrayDestructor); /* * String to PixelTable is used for XmNcolors * and XmNcellBackgrounds resources. */ XtSetTypeConverter(XmRString, XmRPixelTable, CvtStringToPixelTable,convertArg, XtNumber(convertArg), XtCacheNone, PixelTableDestructor); /* * String to BooleanArray is used for XmNcolumnButtonLabels and * XmNrowButtonLabels resources. */ XtSetTypeConverter(XmRString, XmRBooleanArray, CvtStringToBooleanArray, NULL, 0, XtCacheAll | XtCacheRefCount, BooleanArrayDestructor); /* * String to AlignmentArray is used for XmNcolumnAlignments * and XmNcolumnLabelAlignments resources. */ XtSetTypeConverter(XmRString, XmRAlignmentArray, CvtStringToAlignmentArray, NULL, 0, XtCacheAll | XtCacheRefCount, AlignmentArrayDestructor); /* * String to grid type is used for XmNgridType */ XtSetTypeConverter(XmRString, XmRGridType, CvtStringToGridType, NULL, 0, XtCacheAll, NULL); /* * String to matrix display policy is used for * XmN{vertical,horizontal}ScrollBarDisplayPolicy */ XtSetTypeConverter(XmRString, XmRMatrixScrollBarDisplayPolicy, #ifdef __VMS CvtStringToMatrixScrollBarDisp, #else CvtStringToMatrixScrollBarDisplayPolicy, #endif NULL, 0, XtCacheAll, NULL); } static void ClassInitialize() { xbaeRegisterConverters(); } static void ClassPartInitialize(mwc) XbaeMatrixWidgetClass mwc; { register XbaeMatrixWidgetClass super = (XbaeMatrixWidgetClass) mwc->core_class.superclass; /* * Allow subclasses to inherit new Matrix methods */ if (mwc->matrix_class.set_cell == XbaeInheritSetCell) mwc->matrix_class.set_cell = super->matrix_class.set_cell; if (mwc->matrix_class.get_cell == XbaeInheritGetCell) mwc->matrix_class.get_cell = super->matrix_class.get_cell; if (mwc->matrix_class.edit_cell == XbaeInheritEditCell) mwc->matrix_class.edit_cell = super->matrix_class.edit_cell; if (mwc->matrix_class.select_cell == XbaeInheritSelectCell) mwc->matrix_class.select_cell = super->matrix_class.select_cell; if (mwc->matrix_class.select_row == XbaeInheritSelectRow) mwc->matrix_class.select_row = super->matrix_class.select_row; if (mwc->matrix_class.select_column == XbaeInheritSelectColumn) mwc->matrix_class.select_column = super->matrix_class.select_column; if (mwc->matrix_class.deselect_all == XbaeInheritDeselectAll) mwc->matrix_class.deselect_all = super->matrix_class.deselect_all; if (mwc->matrix_class.select_all == XbaeInheritSelectAll) mwc->matrix_class.select_all = super->matrix_class.select_all; if (mwc->matrix_class.deselect_cell == XbaeInheritDeselectCell) mwc->matrix_class.deselect_cell = super->matrix_class.deselect_cell; if (mwc->matrix_class.deselect_row == XbaeInheritDeselectRow) mwc->matrix_class.deselect_row = super->matrix_class.deselect_row; if (mwc->matrix_class.deselect_column == XbaeInheritDeselectColumn) mwc->matrix_class.deselect_column = super->matrix_class.deselect_column; if (mwc->matrix_class.commit_edit == XbaeInheritCommitEdit) mwc->matrix_class.commit_edit = super->matrix_class.commit_edit; if (mwc->matrix_class.cancel_edit == XbaeInheritCancelEdit) mwc->matrix_class.cancel_edit = super->matrix_class.cancel_edit; if (mwc->matrix_class.add_rows == XbaeInheritAddRows) mwc->matrix_class.add_rows = super->matrix_class.add_rows; if (mwc->matrix_class.delete_rows == XbaeInheritDeleteRows) mwc->matrix_class.delete_rows = super->matrix_class.delete_rows; if (mwc->matrix_class.add_columns == XbaeInheritAddColumns) mwc->matrix_class.add_columns = super->matrix_class.add_columns; if (mwc->matrix_class.delete_columns == XbaeInheritDeleteColumns) mwc->matrix_class.delete_columns = super->matrix_class.delete_columns; if (mwc->matrix_class.set_row_colors == XbaeInheritSetRowColors) mwc->matrix_class.set_row_colors = super->matrix_class.set_row_colors; if (mwc->matrix_class.set_column_colors == XbaeInheritSetColumnColors) mwc->matrix_class.set_column_colors = super->matrix_class.set_column_colors; if (mwc->matrix_class.set_cell_color == XbaeInheritSetCellColor) mwc->matrix_class.set_cell_color = super->matrix_class.set_cell_color; } #ifdef NEED_24BIT_VISUAL static Widget get_shell_ancestor(w) Widget w; { Widget sh; for (sh=w ; !XtIsShell(sh) ; sh=XtParent(sh)) ; } #endif /* * Callbacks for our scrollbars. */ static XtCallbackRec VSCallback[] = { {(XtCallbackProc) xbaeScrollVertCB, (XtPointer) NULL}, {(XtCallbackProc) NULL, NULL} }; static XtCallbackRec HSCallback[] = { {(XtCallbackProc) xbaeScrollHorizCB, (XtPointer) NULL}, {(XtCallbackProc) NULL, NULL} }; /* ARGSUSED */ static void Initialize(request, new, args, num_args) XbaeMatrixWidget request, new; ArgList args; Cardinal *num_args; { Dimension marginHeight; /* * Initialize redisplay counters */ new->matrix.disable_redisplay = 0; new->matrix.first_row_offset = 0; #if XmVersion >= 1002 /* * Initialize highlight location */ new->matrix.highlight_location = HighlightNone; #endif /* * Check rows/cols set by resources for consistency/validity */ if (new->matrix.rows < 0 || new->matrix.columns < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "initialize", "badSize", "XbaeMatrix", "XbaeMatrix: Number of rows or columns is less than zero", (String *) NULL, (Cardinal *) NULL); if (new->matrix.rows < 0) new->matrix.rows = 0; if (new->matrix.columns < 0) new->matrix.columns = 0; } /* * Make sure column_widths were specified. If not, use a default value. * This should keep the XDesigner users happy.... */ if (new->matrix.columns && (new->matrix.column_widths == NULL)) { int i; new->matrix.column_widths = (short*)XtMalloc(new->matrix.columns * sizeof(short)); for (i = 0; i < new->matrix.columns; i++) new->matrix.column_widths[i] = 5; } /* If no label font is specified, copy the default fontList, but if we do then override the bold_labels resource */ if (!new->matrix.label_font_list) new->matrix.label_font_list = XmFontListCopy(new->matrix.font_list); else new->matrix.bold_labels = False; /* * We must have at least one non-fixed row/column. Only complain if there * are some to complain about, though. We may have none at all (yet). */ if ((int)(new->matrix.fixed_rows + new->matrix.trailing_fixed_rows) > 0 && (int)(new->matrix.fixed_rows + new->matrix.trailing_fixed_rows) >= new->matrix.rows) { XtAppWarningMsg(XtWidgetToApplicationContext((Widget) new), "initialize", "tooManyFixed", "XbaeMatrix", "XbaeMatrix: At least one row must not be fixed", NULL, 0); new->matrix.fixed_rows = 0; new->matrix.trailing_fixed_rows = 0; } if ((int)(new->matrix.fixed_columns + new->matrix.trailing_fixed_columns) > 0 && (int)(new->matrix.fixed_columns + new->matrix.trailing_fixed_columns) >= new->matrix.columns) { XtAppWarningMsg(XtWidgetToApplicationContext((Widget) new), "initialize", "tooManyFixed", "XbaeMatrix", "XbaeMatrix: At least one column must not be fixed", NULL, 0); new->matrix.fixed_columns = 0; new->matrix.trailing_fixed_columns = 0; } /* * We can't have too many visible columns */ if (new->matrix.columns && ((int)new->matrix.visible_columns > (new->matrix.columns - (int)new->matrix.fixed_columns - (int)new->matrix.trailing_fixed_columns))) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "initialize", "tooManyVisibleColumns", "XbaeMatrix", "XbaeMatrix: visibleColumns must not be greater than\n (columns - fixedColumns - trailingFixedColumns)", (String *) NULL, (Cardinal *) NULL); new->matrix.visible_columns = 0; } if (new->matrix.grid_type >= XmGRID_LINE) /* Deprecated types. To be removed in next version. */ XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "cvtStringToGridType", "deprecatedType", "XbaeMatrix", "Value for GridType is deprecated and will be removed in next release", NULL, NULL); /* * Copy the pointed to resources. * If cells is NULL, we create an array of "" strings. */ if (new->matrix.cells) xbaeCopyCells(new); if (new->matrix.row_labels) xbaeCopyRowLabels(new); if (new->matrix.column_labels) xbaeCopyColumnLabels(new); else { new->matrix.column_label_lines = NULL; new->matrix.column_label_maxlines = 0; } xbaeCopyColumnWidths(new); if (new->matrix.cell_shadow_types) xbaeCopyCellShadowTypes(new); if (new->matrix.row_shadow_types) xbaeCopyRowShadowTypes(new); if (new->matrix.column_shadow_types) xbaeCopyColumnShadowTypes(new); if (new->matrix.cell_user_data) xbaeCopyCellUserData(new); if (new->matrix.row_user_data) xbaeCopyRowUserData(new); if (new->matrix.column_user_data) xbaeCopyColumnUserData(new); #if CELL_WIDGETS if (new->matrix.cell_widgets) xbaeCopyCellWidgets(new); #endif if (new->matrix.column_max_lengths) xbaeCopyColumnMaxLengths(new); if (new->matrix.column_alignments) xbaeCopyColumnAlignments(new); if (new->matrix.column_button_labels) xbaeCopyColumnButtonLabels(new); if (new->matrix.column_label_alignments) xbaeCopyColumnLabelAlignments(new); if (new->matrix.colors) xbaeCopyColors(new); if (new->matrix.cell_background) xbaeCopyBackgrounds(new); if (new->matrix.selected_cells) xbaeCopySelectedCells(new); #if XmVersion >= 1002 if (new->matrix.highlighted_cells) xbaeCopyHighlightedCells(new); #endif if (new->matrix.row_button_labels) xbaeCopyRowButtonLabels(new); /* * If user didn't specify a rowLabelWidth, then calculate one based on * the widest label */ if (new->matrix.row_label_width == 0 && new->matrix.row_labels) new->matrix.row_label_width = xbaeMaxRowLabel(new); /* * Copy the fontList. Get fontStruct from fontList. */ xbaeNewFont(new); xbaeNewLabelFont(new); /* * Create our 4 children (SBs and textField are unmanaged for now) * they must be created in this order so our macros work * (horiz scroll, vert scroll and then clip and textField). * We scroll horizontally by pixels, vertically by rows. */ new->matrix.horizontal_sb = XtVaCreateWidget( "horizScroll", xmScrollBarWidgetClass, (Widget) new, XmNorientation, XmHORIZONTAL, XmNdragCallback, HSCallback, XmNvalueChangedCallback, HSCallback, XmNincrement, FONT_WIDTH(new), XmNsliderSize, 1, XmNminimum, 0, XmNmaximum, 1, XmNbackground, new->core.background_pixel, XmNforeground, new->manager.foreground, XmNbottomShadowColor, new->manager.bottom_shadow_color, XmNbottomShadowPixmap, new->manager.bottom_shadow_pixmap, XmNhighlightColor, new->manager.highlight_color, XmNhighlightPixmap, new->manager.highlight_pixmap, XmNtopShadowColor, new->manager.top_shadow_color, XmNtopShadowPixmap, new->manager.top_shadow_pixmap, NULL); HORIZ_ORIGIN(new) = 0; new->matrix.vertical_sb = XtVaCreateWidget( "vertScroll", xmScrollBarWidgetClass, (Widget) new, XmNorientation, XmVERTICAL, XmNdragCallback, VSCallback, XmNvalueChangedCallback, VSCallback, XmNincrement, 1, XmNminimum, 0, XmNmaximum, new->matrix.rows ? (new->matrix.rows - (int) new->matrix.fixed_rows - (int) new->matrix.trailing_fixed_rows) : 1, XmNsliderSize, 1, XmNbackground, new->core.background_pixel, XmNforeground, new->manager.foreground, XmNbottomShadowColor, new->manager.bottom_shadow_color, XmNbottomShadowPixmap, new->manager.bottom_shadow_pixmap, XmNhighlightColor, new->manager.highlight_color, XmNhighlightPixmap, new->manager.highlight_pixmap, XmNtopShadowColor, new->manager.top_shadow_color, XmNtopShadowPixmap, new->manager.top_shadow_pixmap, NULL); /* * Create the Clip widget managed so we can use it for traversal */ new->matrix.clip_window = XtVaCreateManagedWidget( "clip", xbaeClipWidgetClass, (Widget) new, XmNexposeProc, ClipRedisplay, XmNtraversalOn, new->manager.traversal_on, XmNbackground, new->core.background_pixel, NULL); /* * Add a callback to the Clip widget so we know when it gets the focus * and can use it in traversal. */ XtAddCallback(ClipChild(new), XmNfocusCallback, (XtCallbackProc)TraverseInCB, (XtPointer) new); /* * Calculate an imaginary cellMarginHeight based on the largest of * the label and cell font. If the font for the labels is bigger, * the cellMarginHeight needs to be increased to allow the cell font * to still appear centrally placed */ if (LABEL_HEIGHT(new) > FONT_HEIGHT(new)) marginHeight = (int)(LABEL_HEIGHT(new) + (new->matrix.cell_margin_height * 2) - FONT_HEIGHT(new)) / 2; else marginHeight = new->matrix.cell_margin_height; /* * Create text field (unmanaged for now) - its window will be reparented * in Realize to be a subwindow of Clip * * Set the shadow thickness to 0 to prevent a shadow drawn inside the * highlight region. The shadow thickness is used to draw the shadows * *around* the highlight */ new->matrix.text_field = XtVaCreateWidget( "textField", xmTextFieldWidgetClass, (Widget) new, XmNmarginWidth, new->matrix.cell_margin_width, XmNmarginHeight, marginHeight, XmNtranslations, new->matrix.text_translations, XmNfontList, new->matrix.font_list, XmNshadowThickness, new->matrix.text_shadow_thickness, XmNbackground, new->matrix.text_background, XmNforeground, new->manager.foreground, XmNbottomShadowColor, new->manager.bottom_shadow_color, XmNbottomShadowPixmap, new->manager.bottom_shadow_pixmap, XmNhighlightThickness, new->matrix.cell_highlight_thickness, XmNhighlightColor, new->manager.highlight_color, XmNhighlightPixmap, new->manager.highlight_pixmap, XmNeditMode, XmSINGLE_LINE_EDIT, NULL); XtAddCallback(TextChild(new), XmNmodifyVerifyCallback, xbaeModifyVerifyCB, (XtPointer) new); /* Add a handler on top of the text field to handle clicks on it */ XtAddEventHandler(TextChild(new), ButtonPressMask | ButtonReleaseMask, True, (XtEventHandler)xbaeHandleClick, (XtPointer)new); XtAddEventHandler((Widget)new, ButtonPressMask | ButtonReleaseMask, True, (XtEventHandler)xbaeHandleClick, (XtPointer)new); /* * Compute cell text baseline based on TextField widget */ new->matrix.text_baseline = XmTextGetBaseline(TextChild(new)) + new->matrix.cell_shadow_thickness; /* * Adjust the label_baseline according to the larger of the two fonts */ if (LABEL_HEIGHT(new) == FONT_HEIGHT(new)) new->matrix.label_baseline = new->matrix.text_baseline; else { if (LABEL_HEIGHT(new) < FONT_HEIGHT(new)) marginHeight = (int)(FONT_HEIGHT(new) + new->matrix.text_shadow_thickness * 2 + new->matrix.cell_margin_height * 2 - LABEL_HEIGHT(new)) / 2; else marginHeight = new->matrix.cell_margin_height + new->matrix.text_shadow_thickness; new->matrix.label_baseline = marginHeight + new->matrix.cell_shadow_thickness - new->matrix.label_font_y; } /* * Calculate total pixel width of cell area */ xbaeGetCellTotalWidth(new); /* * Make the clips for the fixed cells which are scrollable (i.e. the * fixed rows that can scroll horizontally, and the fixed columns which * can scroll vertically. This makes 4 scrollable fixed-cell areas. */ new->matrix.left_clip = XtVaCreateWidget( "leftclip", xbaeClipWidgetClass, (Widget) new, XmNexposeProc, Redisplay, XmNtraversalOn, new->manager.traversal_on, XmNbackground, new->core.background_pixel, NULL); new->matrix.right_clip = XtVaCreateWidget( "rightclip", xbaeClipWidgetClass, (Widget) new, XmNexposeProc, Redisplay, XmNtraversalOn, new->manager.traversal_on, XmNbackground, new->core.background_pixel, NULL); new->matrix.top_clip = XtVaCreateWidget( "topclip", xbaeClipWidgetClass, (Widget) new, XmNexposeProc, Redisplay, XmNtraversalOn, new->manager.traversal_on, XmNbackground, new->core.background_pixel, NULL); new->matrix.bottom_clip = XtVaCreateWidget( "bottomclip", xbaeClipWidgetClass, (Widget) new, XmNexposeProc, Redisplay, XmNtraversalOn, new->manager.traversal_on, XmNbackground, new->core.background_pixel, NULL); /* * Cache the pixel position of each column */ new->matrix.column_positions = CreateColumnPositions(new); xbaeGetColumnPositions(new); /* * Now we can set the VSB maximum (relies on data from * GetCellTotalWidth above) */ XtVaSetValues(HorizScrollChild(new), XmNmaximum, NON_FIXED_TOTAL_WIDTH(new) ? NON_FIXED_TOTAL_WIDTH(new) : 1, NULL); /* * Current position starts at the top left editable cell. */ new->matrix.current_row = new->matrix.fixed_rows; new->matrix.current_column = new->matrix.fixed_columns; new->matrix.current_clip = CLIP_NONE; /* * We aren't trying to traverse out */ new->matrix.traversing = NOT_TRAVERSING; #ifndef NEED_24BIT_VISUAL /* * Get/create our GCs */ xbaeCreateDrawGC(new); xbaeCreatePixmapGC(new); xbaeCreateLabelGC(new); xbaeCreateLabelClipGC(new); xbaeCreateGridLineGC(new); xbaeCreateTopShadowClipGC(new); xbaeCreateBottomShadowClipGC(new); #endif /* * Now we have created our GCs, check if the widget is sensitive */ if (!new->core.sensitive) { XGCValues values; unsigned long valuemask = GCFillStyle; Display *dpy = XtDisplay(new); if (!new->core.sensitive) { int i; values.fill_style = FillStippled; /* * Change our drawing GC's to the stipple effect to indicate * the widget is insensitive and redraw */ XChangeGC(dpy, new->matrix.draw_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_clip_gc, valuemask, &values); XChangeGC(dpy, new->matrix.pixmap_gc, valuemask, &values); /* * Propogate the insensitive feel to our children */ for (i = 0; i < XbaeNumChildren; i++) XtSetSensitive(new->composite.children[i], False); } } /* * Create ScrollMgrs to manage scrolling events */ new->matrix.matrix_scroll_mgr = xbaeSmCreateScrollMgr(); new->matrix.clip_scroll_mgr = xbaeSmCreateScrollMgr(); /* * Set the last row and column to an impossible value */ new->matrix.last_row = -1; new->matrix.last_column = -1; new->matrix.last_click_time = (Time)0; /* * Compute our size. If either dimension was explicitly set to 0, * then that dimension is computed. * Use request because superclasses modify width/height. */ if (request->core.width == 0 || request->core.height == 0) xbaeComputeSize(new, request->core.width == 0, request->core.height == 0); /* * Make sure top_row is sensible before we call Resize */ if (VERT_ORIGIN(new) < 0) VERT_ORIGIN(new) = 0; else if (VERT_ORIGIN(new) > new->matrix.rows) VERT_ORIGIN(new) = new->matrix.rows; /* * Tweak top_row to make sure it is valid before calling Resize */ if (VERT_ORIGIN(new)) xbaeAdjustTopRow(new); if (new->matrix.left_column) xbaeAdjustLeftColumn(new); /* * Layout the scrollbars and clip widget based on our size */ xbaeResize(new); } static void Realize(mw, valueMask, attributes) XbaeMatrixWidget mw; XtValueMask *valueMask; XSetWindowAttributes *attributes; { *valueMask |= CWDontPropagate; attributes->do_not_propagate_mask = ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | PointerMotionMask; /* * Don't call our superclasses realize method, because Manager sets * bit_gravity */ XtCreateWindow((Widget) mw, InputOutput, CopyFromParent, *valueMask, attributes); #ifdef NEED_24BIT_VISUAL /* * Now that we have a window... * Get/create our GCs */ xbaeCreateDrawGC(mw); xbaeCreatePixmapGC(mw); xbaeCreateLabelGC(mw); xbaeCreateLabelClipGC(mw); xbaeCreateTopShadowClipGC(mw); xbaeCreateBottomShadowClipGC(mw); #endif /* * Reparent the textFields window to be a subwindow of Clip widget * (we need to realize them first) */ XtRealizeWidget(TextChild(mw)); XtRealizeWidget(ClipChild(mw)); XtRealizeWidget(LeftClip(mw)); XtRealizeWidget(RightClip(mw)); XtRealizeWidget(TopClip(mw)); XtRealizeWidget(BottomClip(mw)); XReparentWindow(XtDisplay(mw), XtWindow(TextChild(mw)), XtWindow(ClipChild(mw)), TextChild(mw)->core.x, TextChild(mw)->core.y); mw->matrix.current_parent = ClipChild(mw); /* * Set the clip_mask in our clipping GCs. */ xbaeSetClipMask(mw, CLIP_NONE); } static void InsertChild(w) Widget w; { #if 0 if (((CompositeWidget) XtParent(w))->composite.num_children > 7) { #if XmVersion > 1001 /* Hah! Cannot use XmIsDragIconObjectClass because it is defined * using XtIsSubclass() (at least in the 1.2 and 2.0 headers I have * available to me). Nothing like a little QA, huh. * * Anyways, since the drag icon & context are created as widget * children of the matrix, we need to allow just those extra types * to be created as our kids. */ if ((!XmIsDragContext(w)) && (!XtIsSubclass(w, xmDragIconObjectClass))) { #endif String params[1]; Cardinal num_params = 1; params[0] = XtClass(XtParent(w))->core_class.class_name; XtAppWarningMsg( XtWidgetToApplicationContext(w), "insertChild", "badChild", "XbaeMatrix", "XbaeMatrix: Applications cannot add children to %s widgets", params, &num_params); #if XmVersion > 1001 } #endif return; } #endif #if XmVersion > 1001 (*((XmManagerWidgetClass) (xbaeMatrixWidgetClass->core_class.superclass))->composite_class.insert_child) (w); #endif } /* * This is the expose method for the Matrix widget. * It redraws the row and column labels, the cells in fixed rows and columns * and the clip window shadow. */ /* ARGSUSED */ static void Redisplay(w, event, region) Widget w; XEvent *event; Region region; { Rectangle expose; XbaeMatrixWidget mw; if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget) w; else /* must be one of the clips */ { int *x = NULL, *y = NULL; mw = (XbaeMatrixWidget) XtParent(w); /* point at the correct x,y pair */ switch (event->type) { case Expose: x = &event->xexpose.x; y = &event->xexpose.y; break; case GraphicsExpose: x = &event->xgraphicsexpose.x; y = &event->xgraphicsexpose.y; break; case NoExpose: break; default: return; } /* NoExpose event can't be translated so make sure x is set */ if (x) { /* * Translate expose event coords into matrix coords if it occured * on a clip. xbaeRedrawLabelsAndFixed needs to check intersections * in matrix coords, even though the xbaeDraw* routines will * correctly retranslate these onto the correct windows for drawing. */ if (w == LeftClip(mw)) { *x += ROW_LABEL_WIDTH(mw) + mw->manager.shadow_thickness; *y += FIXED_ROW_LABEL_OFFSET(mw); } else if (w == RightClip(mw)) { *x += TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); *y += FIXED_ROW_LABEL_OFFSET(mw); } else if (w == TopClip(mw)) { *x += FIXED_COLUMN_LABEL_OFFSET(mw); *y += (COLUMN_LABEL_HEIGHT(mw) + mw->manager.shadow_thickness); } else if (w == BottomClip(mw)) { *x += FIXED_COLUMN_LABEL_OFFSET(mw); *y += TRAILING_FIXED_ROW_LABEL_OFFSET(mw); } else return; /* eek! Run away quickly */ } } if (mw->matrix.disable_redisplay) return; /* * Send our events to the mw ScrollMgr to be adjusted. */ switch (event->type) { case Expose: /* * The Expose event will be translated into our scrolled * coordinate system. Then it is put in a Rectangle. */ xbaeSmScrollEvent(mw->matrix.matrix_scroll_mgr, event); SETRECT(expose, event->xexpose.x, event->xexpose.y, event->xexpose.x + event->xexpose.width, event->xexpose.y + event->xexpose.height); break; case GraphicsExpose: /* * The GraphicsExpose event will cause a scroll to be removed * from the managers queue, then the event will be translated * into our scrolled coordinate system. Then it is put in a Rectangle. */ xbaeSmScrollEvent(mw->matrix.matrix_scroll_mgr, event); SETRECT(expose, event->xgraphicsexpose.x, event->xgraphicsexpose.y, event->xgraphicsexpose.x + event->xgraphicsexpose.width, event->xgraphicsexpose.y + event->xgraphicsexpose.height); break; case NoExpose: /* * The NoExpose event means we won't be getting any GraphicsExpose * events, so the scroll will be removed from the queue and * we are done. */ xbaeSmScrollEvent(mw->matrix.matrix_scroll_mgr, event); return; default: /* maybe handled above already */ return; } /* * Redraw the row/column labels and fixed rows/columns which are * overlapped by the expose Rectangle. */ if ((! mw->matrix.trailing_fixed_columns) && IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw)) { Rectangle nonfixed; /* * We need to ensure that the last column of cells gets * redrawn so that the fill is properly redrawn. */ SETRECT(nonfixed, COLUMN_POSITION(mw, mw->matrix.columns-1), 0, COLUMN_POSITION(mw, mw->matrix.columns-1)+1, ClipChild(mw)->core.height-1); xbaeRedrawCells(mw, &nonfixed); } else if ((! mw->matrix.trailing_fixed_rows) && IN_GRID_COLUMN_MODE(mw) && NEED_VERT_FILL(mw)) { Rectangle nonfixed; /* * We need to ensure that the last row of cells gets * redrawn so that the fill is properly redrawn. */ SETRECT(nonfixed, 0, ROW_HEIGHT(mw) * (mw->matrix.rows - 1), ClipChild(mw)->core.width-1, ROW_HEIGHT(mw) * mw->matrix.rows); xbaeRedrawCells(mw, &nonfixed); } xbaeRedrawLabelsAndFixed(mw, &expose); } /* * This is the exposeProc function for the Clip widget. * It handles expose events for the Clip widget by redrawing those * non-fixed cells which were damaged. * It receives Expose, GraphicsExpose and NoExpose events. */ /* ARGSUSED */ static void ClipRedisplay(w, event, region) Widget w; XEvent *event; Region region; { XbaeMatrixWidget mw = (XbaeMatrixWidget) XtParent(w); Rectangle expose, clip, intersect; if (mw->matrix.disable_redisplay) return; /* * Send our events to the clip ScrollMgr to be adjusted. */ switch (event->type) { case Expose: /* * The Expose event will be translated into our scrolled * coordinate system. Then it is put in a Rectangle. */ xbaeSmScrollEvent(mw->matrix.clip_scroll_mgr, event); SETRECT(expose, event->xexpose.x, event->xexpose.y, event->xexpose.x + event->xexpose.width - 1, event->xexpose.y + event->xexpose.height - 1); break; case GraphicsExpose: /* * The GraphicsExpose event will cause a scroll to be removed * from the managers queue, then the event will be translated * into our scrolled coordinate system. Then it is put in a Rectangle. */ xbaeSmScrollEvent(mw->matrix.clip_scroll_mgr, event); SETRECT(expose, event->xgraphicsexpose.x, event->xgraphicsexpose.y, event->xgraphicsexpose.x + event->xgraphicsexpose.width - 1, event->xgraphicsexpose.y + event->xgraphicsexpose.height - 1); break; case NoExpose: /* * The NoExpose event means we won't be getting any GraphicsExpose * events, so the scroll well be removed from the queue and * we are done. */ xbaeSmScrollEvent(mw->matrix.clip_scroll_mgr, event); return; default: return; } /* * We may get an expose event larger than the size of the Clip widget. * This is because in set_values we may clear the Clip widget * before it gets resized smaller (maybe in set_values_almost). * So here we intersect the expose event with the clip widget * to ensure the expose Rectangle is not larger than the Clip widget. */ SETRECT(clip, 0, 0, w->core.width - 1, w->core.height - 1); INTERSECT(clip, expose, intersect); /* * Redraw those cells which overlap the intersect Rectangle. */ xbaeRedrawCells(mw, &intersect); } /* ARGSUSED */ static Boolean SetValues(current, request, new, args, num_args) XbaeMatrixWidget current, request, new; ArgList args; Cardinal *num_args; { Boolean redisplay = False; /* need to redraw */ Boolean relayout = False; /* need to layout, but same size */ Boolean new_column_widths = False; /* column widths changed */ Boolean new_cells = False; /* cells changed */ Boolean do_top_row = False; /* reset top_row */ Boolean do_left_column = False; /* reset left_column */ int n; Arg wargs[9]; #define NE(field) (current->field != new->field) #define EQ(field) (current->field == new->field) /* * We cannot re-set either of the scrollbars, the textField or * clip window. */ if (NE(matrix.vertical_sb) || NE(matrix.horizontal_sb) || NE(matrix.clip_window) || NE(matrix.text_field)) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "set matrix children", "XbaeMatrix", "XbaeMatrix: Cannot set matrix widget children", NULL, 0); new->matrix.vertical_sb = current->matrix.vertical_sb; new->matrix.horizontal_sb = current->matrix.horizontal_sb; new->matrix.clip_window = current->matrix.clip_window; new->matrix.text_field = current->matrix.text_field; } /* * If rows changed, then: * row_labels must change or be NULL * row_button_labels must change or be NULL */ if ((NE(matrix.rows) && (new->matrix.row_labels && EQ(matrix.row_labels))) || (new->matrix.row_button_labels && EQ(matrix.row_button_labels))) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "rows", "XbaeMatrix", "XbaeMatrix: Number of rows changed but dependent resources did not", NULL, 0); new->matrix.rows = current->matrix.rows; new->matrix.row_labels = current->matrix.row_labels; new->matrix.row_button_labels = current->matrix.row_button_labels; } /* * If columns changed, then: * column_widths must change * column_max_lengths must change or be NULL * column_labels must change or be NULL * column_alignments must change or be NULL * column_button_labels must change or be NULL * column_label_alignments must change or be NULL */ if (NE(matrix.columns) && ((new->matrix.column_labels && EQ(matrix.column_labels)) || (new->matrix.column_max_lengths && EQ(matrix.column_max_lengths)) || (new->matrix.column_alignments && EQ(matrix.column_alignments)) || (new->matrix.column_button_labels && EQ(matrix.column_button_labels)) || (new->matrix.column_label_alignments && EQ(matrix.column_label_alignments)) || EQ(matrix.column_widths))) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "columns", "XbaeMatrix", "XbaeMatrix: Number of columns changed but dependent resources did not", NULL, 0); new->matrix.columns = current->matrix.columns; new->matrix.column_widths = current->matrix.column_widths; new->matrix.column_max_lengths = current->matrix.column_max_lengths; new->matrix.column_labels = current->matrix.column_labels; new->matrix.column_alignments = current->matrix.column_alignments; new->matrix.column_button_labels = current->matrix.column_button_labels; new->matrix.column_label_alignments = current->matrix.column_label_alignments; } /* * Make sure we have at least one row/column. */ if (new->matrix.columns < 0 || new->matrix.rows < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "size", "XbaeMatrix", "XbaeMatrix: Must have at least one row and column", NULL, 0); if (new->matrix.columns < 0) new->matrix.columns = current->matrix.columns; if (new->matrix.rows < 0) new->matrix.rows = current->matrix.rows; } /* * We must have at least one non-fixed row/column. * This could be caused by (trailing) fixed_rows/columns or * rows/columns changing. */ if ((int)(new->matrix.fixed_rows + new->matrix.trailing_fixed_rows) > 0 && (int)(new->matrix.fixed_rows + new->matrix.trailing_fixed_rows) >= new->matrix.rows) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "tooManyFixed", "XbaeMatrix", "XbaeMatrix: At least one row must not be fixed", NULL, 0); if (NE(matrix.fixed_rows)) new->matrix.fixed_rows = current->matrix.fixed_rows; if (NE(matrix.trailing_fixed_rows)) new->matrix.trailing_fixed_rows = current->matrix.trailing_fixed_rows; if (NE(matrix.rows)) new->matrix.rows = current->matrix.rows; } if ((int)(new->matrix.fixed_columns + new->matrix.trailing_fixed_columns) > 0 && (int)(new->matrix.fixed_columns + new->matrix.trailing_fixed_columns) >= new->matrix.columns) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "tooManyFixed", "XbaeMatrix", "XbaeMatrix: At least one column must not be fixed", NULL, 0); if (NE(matrix.fixed_columns)) new->matrix.fixed_columns = current->matrix.fixed_columns; if (NE(matrix.trailing_fixed_columns)) new->matrix.trailing_fixed_columns = current->matrix.trailing_fixed_columns; if (NE(matrix.columns)) new->matrix.columns = current->matrix.columns; } /* * We can't have too many visible columns. * This could be caused by visible_columns or columns or fixed_columns * changing. */ if (new->matrix.columns && ((int)new->matrix.visible_columns > (new->matrix.columns - (int)new->matrix.fixed_columns - (int)new->matrix.trailing_fixed_columns))) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "tooManyVisibleColumns", "XbaeMatrix", "XbaeMatrix: visibleColumns must not be greater than\n (columns - fixedColumns - trailingFixedColumns)", (String *) NULL, (Cardinal *) NULL); if (NE(matrix.visible_columns)) new->matrix.visible_columns = current->matrix.visible_columns; if (NE(matrix.columns)) new->matrix.columns = current->matrix.columns; if (NE(matrix.fixed_columns)) new->matrix.fixed_columns = current->matrix.fixed_columns; if (NE(matrix.trailing_fixed_columns)) new->matrix.trailing_fixed_columns = current->matrix.trailing_fixed_columns; } /* * Make sure we have column_widths */ if (new->matrix.columns && (new->matrix.column_widths == NULL)) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "setValues", "columnWidths", "XbaeMatrix", "XbaeMatrix: Must specify columnWidths", NULL, 0); new->matrix.column_widths = current->matrix.column_widths; } /* * If rows or columns or fixed rows/columns changed, * then we need to relayout. */ if (NE(matrix.rows) || NE(matrix.fixed_rows) || NE(matrix.trailing_fixed_rows)) { /* * Reset VSB maximum. sliderSize will be reset later in Resize. */ XtVaSetValues(VertScrollChild(new), XmNmaximum, (new->matrix.rows - (int) new->matrix.fixed_rows - (int) new->matrix.trailing_fixed_rows), XmNsliderSize, 1, NULL); do_top_row = True; relayout = True; } if (NE(matrix.columns) || NE(matrix.fixed_columns) || NE(matrix.trailing_fixed_columns)) relayout = True; /* * Copy any pointed to resources if they changed */ #if CELL_WIDGETS if (NE(matrix.cell_widgets)) { xbaeFreeCellWidgets(current); xbaeCopyCellWidgets(current); redisplay = True; } #endif if (NE(matrix.cells)) { xbaeFreeCells(current); xbaeCopyCells(new); redisplay = True; new_cells = True; } else if (NE(matrix.rows) || NE(matrix.columns)) ResizeCells(current, new); if (NE(matrix.cell_user_data)) { xbaeFreeCellUserData(current); if (new->matrix.cell_user_data) xbaeCopyCellUserData(new); } if (NE(matrix.row_user_data)) { xbaeFreeRowUserData(current); if (new->matrix.row_user_data) xbaeCopyRowUserData(new); } if (NE(matrix.column_user_data)) { xbaeFreeColumnUserData(current); if (new->matrix.column_user_data) xbaeCopyColumnUserData(new); } if (NE(matrix.cell_shadow_types)) { xbaeFreeCellShadowTypes(current); if (new->matrix.cell_shadow_types) xbaeCopyCellShadowTypes(new); } if (NE(matrix.row_shadow_types)) { xbaeFreeRowShadowTypes(current); if (new->matrix.row_shadow_types) xbaeCopyRowShadowTypes(new); } if (NE(matrix.column_shadow_types)) { xbaeFreeColumnShadowTypes(current); if (new->matrix.column_shadow_types) xbaeCopyColumnShadowTypes(new); } if (NE(matrix.row_labels)) { /* * If we added or deleted row_labels, we need to layout. */ if (!current->matrix.row_labels || !new->matrix.row_labels) relayout = True; else redisplay = True; xbaeFreeRowLabels(current); if (new->matrix.row_labels) xbaeCopyRowLabels(new); } if (NE(matrix.column_labels)) { xbaeFreeColumnLabels(current); if (new->matrix.column_labels) xbaeCopyColumnLabels(new); else { new->matrix.column_label_lines = NULL; new->matrix.column_label_maxlines = 0; } /* * If the number of lines in column labels changed, we need to relayout */ if (current->matrix.column_label_maxlines != new->matrix.column_label_maxlines) relayout = True; else redisplay = True; } if (NE(matrix.column_max_lengths)) { xbaeFreeColumnMaxLengths(current); if (new->matrix.column_max_lengths) xbaeCopyColumnMaxLengths(new); redisplay = True; } if (NE(matrix.column_alignments)) { xbaeFreeColumnAlignments(current); if (new->matrix.column_alignments) xbaeCopyColumnAlignments(new); redisplay = True; } if (NE(matrix.column_button_labels)) { xbaeFreeColumnButtonLabels(current); if (new->matrix.column_button_labels) xbaeCopyColumnButtonLabels(new); redisplay = True; } if (NE(matrix.row_button_labels)) { xbaeFreeRowButtonLabels(current); if (new->matrix.row_button_labels) xbaeCopyRowButtonLabels(new); redisplay = True; } if (NE(matrix.column_label_alignments)) { xbaeFreeColumnLabelAlignments(current); if (new->matrix.column_label_alignments) xbaeCopyColumnLabelAlignments(new); redisplay = True; } if (NE(matrix.row_label_alignment)) redisplay = True; if (NE(matrix.row_label_color) || NE(matrix.column_label_color) || NE(matrix.button_label_background)) redisplay = True; if (NE(matrix.colors)) { xbaeFreeColors(current); if (new->matrix.colors) xbaeCopyColors(new); redisplay = True; } if (NE(matrix.cell_background)) { xbaeFreeBackgrounds(current); if (new->matrix.cell_background) xbaeCopyBackgrounds(new); redisplay = True; } if (NE(matrix.grid_line_color)) { XtReleaseGC((Widget)new, new->matrix.grid_line_gc); XFreeGC(XtDisplay(new), new->matrix.cell_grid_line_gc); xbaeCreateGridLineGC(new); if ((new->matrix.grid_type == XmGRID_CELL_LINE) || (new->matrix.grid_type == XmGRID_ROW_LINE) || (new->matrix.grid_type == XmGRID_COLUMN_LINE)) redisplay = True; } if (NE(matrix.alt_row_count) && (new->matrix.even_row_background != current->core.background_pixel || new->matrix.odd_row_background != current->core.background_pixel)) redisplay = True; if (NE(matrix.even_row_background) || NE(matrix.odd_row_background) || NE(matrix.grid_type) || NE(matrix.selected_foreground) || NE(matrix.selected_background)) redisplay = True; if (NE(matrix.grid_type) && (new->matrix.grid_type >= XmGRID_LINE)) /* Deprecated types. To be removed in next version. */ XtAppWarningMsg( XtWidgetToApplicationContext((Widget) new), "cvtStringToGridType", "deprecatedType", "XbaeMatrix", "Value for GridType is deprecated and will be removed in next release", NULL, NULL); if (new->matrix.colors && EQ(matrix.colors) && (NE(matrix.rows) || NE(matrix.columns))) { ResizeColors(current, new, False); redisplay = True; } if (new->matrix.cell_background && EQ(matrix.cell_background) && (NE(matrix.rows) || NE(matrix.columns))) { ResizeColors(current, new, True); redisplay = True; } if (NE(matrix.cell_shadow_type) || NE(matrix.shadow_type) || NE(matrix.reverse_select)) redisplay = True; if (NE(matrix.column_widths)) { xbaeFreeColumnWidths(current); xbaeCopyColumnWidths(new); relayout = True; new_column_widths = True; } if (NE(matrix.selected_cells)) { xbaeFreeSelectedCells(current); xbaeCopySelectedCells(new); redisplay = True; } else if (NE(matrix.rows) || NE(matrix.columns)) ResizeSelectedCells(current, new); #if XmVersion >= 1002 if (NE(matrix.highlighted_cells)) { xbaeFreeHighlightedCells(current); xbaeCopyHighlightedCells(new); redisplay = True; } else if (NE(matrix.rows) || NE(matrix.columns)) ResizeHighlightedCells(current, new); #endif /* * If traversal changes, pass through to Clip and textField children. */ if (NE(manager.traversal_on)) { XtVaSetValues(ClipChild(new), XmNtraversalOn, new->manager.traversal_on, NULL); } if (NE(matrix.even_row_background) || NE(matrix.odd_row_background)) redisplay = True; /* * Pass through primitive/manager resources to our children */ n = 0; if (NE(core.background_pixel)) { /* * Set all clip widgets to the new background (thanks Daiji) */ XtVaSetValues(ClipChild(new), XmNbackground, new->core.background_pixel, NULL); XtVaSetValues(LeftClip(new), XmNbackground, new->core.background_pixel, NULL); XtVaSetValues(RightClip(new), XmNbackground, new->core.background_pixel, NULL); XtVaSetValues(TopClip(new), XmNbackground, new->core.background_pixel, NULL); XtVaSetValues(BottomClip(new), XmNbackground, new->core.background_pixel, NULL); XtSetArg(wargs[n], XmNbackground, new->core.background_pixel); n++; } if (NE(manager.foreground)) { XtSetArg(wargs[n], XmNforeground, new->manager.foreground); n++; } if (NE(manager.bottom_shadow_color)) { XtSetArg(wargs[n], XmNbottomShadowColor, new->manager.bottom_shadow_color); n++; } if (NE(manager.bottom_shadow_pixmap)) { XtSetArg(wargs[n], XmNbottomShadowPixmap, new->manager.bottom_shadow_pixmap); n++; } if (NE(manager.highlight_color)) { XtSetArg(wargs[n], XmNhighlightColor, new->manager.highlight_color); n++; } if (NE(manager.highlight_pixmap)) { XtSetArg(wargs[n], XmNhighlightPixmap, new->manager.highlight_pixmap); n++; } if (NE(manager.top_shadow_color)) { XtSetArg(wargs[n], XmNtopShadowColor, new->manager.top_shadow_color); n++; } if (NE(manager.top_shadow_pixmap)) { XtSetArg(wargs[n], XmNtopShadowPixmap, new->manager.top_shadow_pixmap); n++; } if (n) { XtSetValues(VertScrollChild(new), wargs, n); XtSetValues(HorizScrollChild(new), wargs, n); XtSetValues(TextChild(new), wargs, n); } /* * Would really like to do this in the above, * but we need to override background_pixel. */ if (EQ(matrix.text_background) && (current->matrix.text_background == current->core.background_pixel)) new->matrix.text_background = new->core.background_pixel; if (NE(matrix.text_background) || NE(core.background_pixel)) { XtVaSetValues(TextChild(new), XmNbackground, new->matrix.text_background, NULL); if (XtIsManaged(TextChild(new))) redisplay = True; } /* * Get a new XFontStruct and copy the fontList if it changed * and pass it to the textField. * Reset the HSB increment. * redisplay and relayout will be set below. */ if (NE(matrix.font_list)) { XmFontListFree(current->matrix.font_list); xbaeNewFont(new); XtVaSetValues(TextChild(new), XmNfontList, new->matrix.font_list, NULL); XtVaSetValues(HorizScrollChild(new), XmNincrement, FONT_WIDTH(new), NULL); } if (NE(matrix.label_font_list)) { XmFontListFree(current->matrix.label_font_list); xbaeNewLabelFont(new); XtVaSetValues(HorizScrollChild(new), XmNincrement, FONT_WIDTH(new), NULL); } /* * Pass the cell resources on to the textField. * Both redisplay and relayout will be set below. * * If anything changed to affect cell total width or column positions, * recalc them */ if (new_cells || NE(matrix.fid) || NE(matrix.label_fid) || NE(matrix.cell_margin_width) || NE(matrix.cell_margin_height) || NE(matrix.cell_shadow_thickness) || NE(matrix.fixed_columns) || NE(matrix.trailing_fixed_columns) || NE(matrix.cell_highlight_thickness) || new_column_widths || NE(matrix.text_shadow_thickness)) { /* * Recalculate the margin height, based on the larger of the * label and general fonts. */ int marginHeight = new->matrix.cell_margin_height; /* by default */ if (LABEL_HEIGHT(new) > FONT_HEIGHT(new)) marginHeight = (int)(LABEL_HEIGHT(new) + (new->matrix.cell_margin_height * 2) - FONT_HEIGHT(new)) / 2; /* * Cancel the edit -> If I think of a better way of doing this * I'll do it, AL. */ (*((XbaeMatrixWidgetClass) XtClass(new))->matrix_class.cancel_edit) (new, True); XtVaSetValues( TextChild(new), XmNmarginWidth, new->matrix.cell_margin_width, XmNhighlightThickness, new->matrix.cell_highlight_thickness, XmNshadowThickness, new->matrix.text_shadow_thickness, XmNmarginHeight, marginHeight, NULL); xbaeGetCellTotalWidth(new); /* * Reset the HSB maximum. sliderSize will be reset later in Resize. */ XtVaSetValues(HorizScrollChild(new), XmNmaximum, NON_FIXED_TOTAL_WIDTH(new) ? NON_FIXED_TOTAL_WIDTH(new) : 1, XmNsliderSize, 1, NULL); /* * If the number of columns changed, we need to allocate a new array. */ if (NE(matrix.columns)) { xbaeFreeColumnPositions(current); new->matrix.column_positions = CreateColumnPositions(new); } /* * If anything but (trailing_)fixed_columns or the highlight color * changed, we need to recalc column positions. */ if (new_cells || NE(matrix.fid) || NE(matrix.label_fid) || NE(matrix.cell_margin_width) || NE(matrix.cell_margin_height) || NE(matrix.cell_shadow_thickness) || NE(matrix.cell_highlight_thickness) || new_column_widths || NE(matrix.text_shadow_thickness)) xbaeGetColumnPositions(new); /* * Recalculate the baselines */ new->matrix.text_baseline = XmTextGetBaseline(TextChild(new)) + new->matrix.cell_shadow_thickness /*+ new->matrix.text_shadow_thickness*/; /* * Adjust the label_baseline according to the larger of the two fonts */ if (LABEL_HEIGHT(new) == FONT_HEIGHT(new)) new->matrix.label_baseline = new->matrix.text_baseline; else { if (LABEL_HEIGHT(new) < FONT_HEIGHT(new)) marginHeight = (FONT_HEIGHT(new) + new->matrix.text_shadow_thickness * 2 + new->matrix.cell_margin_height * 2 - (int)LABEL_HEIGHT(new)) / 2; else marginHeight = new->matrix.cell_margin_height + new->matrix.text_shadow_thickness; new->matrix.label_baseline = marginHeight + new->matrix.cell_shadow_thickness - new->matrix.label_font_y; } /* JDS: The comment above this section says both redisplay and * relayout get set, but only relayout was being set. I noticed * this because the resizeColumns action was setting the * columnWidths, but the clip widget wasn't properly redrawing * its cells when they were resized. This was in conjunction with * calling clipRedisplay only when the matrix redisplayed instead * of also when it relayedout :) (see the comment below). * * However, I'm not sure what else this might impact. But, I'm in * favor of the change I made to only redisplay when the matrix * redisplays since that's more efficient, I think, and it eliminated * some ugly redraws that I at least encountered. So there :). */ redisplay = relayout = True; } /* * Install text_translations on textField */ if (NE(matrix.text_translations)) XtVaSetValues(TextChild(new), XmNtranslations, new->matrix.text_translations, NULL); /* * If row_label_width was set to 0, calculate it. * Otherwise if it was changed, set flags. */ if (new->matrix.row_label_width == 0 && new->matrix.row_labels) { new->matrix.row_label_width = xbaeMaxRowLabel(new); relayout = True; } else if (NE(matrix.row_label_width)) relayout = True; /* * Check whether the widget is sensitive has changed and set our GC's * appropriately */ if (XtIsSensitive((Widget)current) != XtIsSensitive((Widget)new)) { XGCValues values; int i; unsigned long valuemask = GCFillStyle; Display *dpy = XtDisplay(new); if (!XtIsSensitive((Widget)new)) { values.fill_style = FillStippled; /* * Change our drawing GC's to the stipple effect to indicate * the widget is insensitive and redraw */ XChangeGC(dpy, new->matrix.draw_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_clip_gc, valuemask, &values); XChangeGC(dpy, new->matrix.pixmap_gc, valuemask, &values); /* * Propogate the insensitive feel to our children */ for (i = 0; i < XbaeNumChildren; i++) XtSetSensitive(new->composite.children[i], False); } else { values.fill_style = FillSolid; XChangeGC(dpy, new->matrix.draw_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_gc, valuemask, &values); XChangeGC(dpy, new->matrix.label_clip_gc, valuemask, &values); XChangeGC(dpy, new->matrix.pixmap_gc, valuemask, &values); for (i = 0; i < XbaeNumChildren; i++) XtSetSensitive(new->composite.children[i], True); } redisplay = True; } /* * If our fill policy changed or our bottom attachment, * we must redisplay and relayout. */ if (NE(matrix.fill) || NE(matrix.trailing_attached_bottom)) { redisplay = True; relayout = True; } /* * If either of the scrollbar display policies changed, * we need to redisplay and relayout. */ if (NE(matrix.vsb_display_policy) || NE(matrix.hsb_display_policy)) relayout = True; /* * If the place of the scrollbars changes, we must redisplay */ if (NE(matrix.scrollbar_placement)) relayout = True; /* * Change created GCs if needed */ if (NE(manager.foreground)) { /* * We don't need to put the new foreground in draw_gc or * draw_clip_gc because they get a new foreground when they are used. */ XSetForeground(XtDisplay(new), new->matrix.cell_top_shadow_clip_gc, new->manager.foreground); XSetBackground(XtDisplay(new), new->matrix.cell_bottom_shadow_clip_gc, new->manager.foreground); redisplay = True; } if (NE(manager.top_shadow_color)) { XSetForeground(XtDisplay(new), new->matrix.cell_top_shadow_clip_gc, new->manager.top_shadow_color); XSetForeground(XtDisplay(new), new->matrix.resize_top_shadow_gc, new->manager.top_shadow_color); redisplay = True; } if (NE(manager.top_shadow_pixmap)) { XSetTile(XtDisplay(new), new->matrix.cell_top_shadow_clip_gc, new->manager.top_shadow_pixmap); XSetTile(XtDisplay(new), new->matrix.resize_top_shadow_gc, new->manager.top_shadow_pixmap); redisplay = True; } if (NE(manager.bottom_shadow_color)) { XSetForeground(XtDisplay(new), new->matrix.cell_bottom_shadow_clip_gc, new->manager.bottom_shadow_color); XSetForeground(XtDisplay(new), new->matrix.resize_bottom_shadow_gc, new->manager.bottom_shadow_color); redisplay = True; } if (NE(manager.bottom_shadow_pixmap)) { XSetTile(XtDisplay(new), new->matrix.cell_bottom_shadow_clip_gc, new->manager.bottom_shadow_pixmap); XSetTile(XtDisplay(new), new->matrix.resize_bottom_shadow_gc, new->manager.bottom_shadow_pixmap); redisplay = True; } if (NE(matrix.fid)) { XSetFont(XtDisplay(new), new->matrix.draw_gc, new->matrix.fid); redisplay = True; } if (NE(matrix.label_fid)) { XSetFont(XtDisplay(new), new->matrix.label_gc, new->matrix.label_fid); XSetFont(XtDisplay(new), new->matrix.label_clip_gc, new->matrix.label_fid); redisplay = True; } /* * See if any other resources changed which will require a relayout */ if (NE(matrix.space) || NE(matrix.cell_shadow_thickness) || NE(manager.shadow_thickness)) relayout = True; /* * If bold_labels or button labels changed, and we have labels, * we must redisplay */ if ((NE(matrix.bold_labels) || NE(matrix.button_labels)) && (new->matrix.row_labels || new->matrix.column_labels)) redisplay = True; /* * If showArrows is changed, redisplay to get rid of existing arrows */ if (NE(matrix.show_arrows)) redisplay = True; /* * Compute a new size if: * visible_rows or visible_columns changed. * user set our width or height to zero. */ if (NE(matrix.visible_rows) || NE(matrix.visible_columns) || request->core.height == 0 || request->core.width == 0) xbaeComputeSize(new, request->core.width == 0, request->core.height == 0); /* * If our size didn't change, but we need to layout, call Resize. * If our size did change, then Xt will call our Resize method for us. * If our size did change, but the new size is later refused, * then SetValuesAlmost will call Resize to layout. */ if (EQ(core.width) && EQ(core.height) && relayout) xbaeResize(new); /* * The user forced a new top_row or something changed to force * us to recheck the current top_row. */ if (NE(matrix.top_row) || do_top_row) { XmScrollBarCallbackStruct call_data; xbaeAdjustTopRow(new); call_data.value = VERT_ORIGIN(new); /* * Trick xbaeScrollVertCB() into believing it needs to scroll */ VERT_ORIGIN(new) = VERT_ORIGIN(current); xbaeScrollVertCB((Widget)VertScrollChild(new), NULL, &call_data); VERT_ORIGIN(new) = call_data.value; /* and reset VERT_ORIGIN */ XtVaSetValues(VertScrollChild(new), XmNvalue, VERT_ORIGIN(new), NULL); } if (NE(matrix.left_column) || do_left_column) { XmScrollBarCallbackStruct call_data; xbaeAdjustLeftColumn(new); call_data.value = HORIZ_ORIGIN(new); HORIZ_ORIGIN(new) = HORIZ_ORIGIN(current); xbaeScrollHorizCB((Widget)HorizScrollChild(new), NULL, &call_data); HORIZ_ORIGIN(new) = call_data.value; XtVaSetValues(HorizScrollChild(new), XmNvalue, HORIZ_ORIGIN(new), NULL); } /* * Force the Clip widget to redisplay. Note: this may generate an * expose event for the current size of the Clip widget, and the Clip * widget may be sized smaller in set_values_almost. The ClipRedisplay * function can handle this case. * * JDS: Don't need to force a redisplay on a relayout, since the Clip * widget's resize method (now non-NULL) will be called and Xt will * automatically do an expose after that occurs. Seems to work, anyways :). */ if (redisplay) XbaeMatrixRefresh((Widget)new); /* * We want to return True when we need to redisplay or relayout. */ return redisplay || relayout; #undef NE #undef EQ } /* ARGSUSED */ static void SetValuesAlmost(old, new, request, reply) XbaeMatrixWidget old; XbaeMatrixWidget new; XtWidgetGeometry *request; XtWidgetGeometry *reply; { /* * If XtGeometryAlmost, accept compromize - Resize will take care of it */ if (reply->request_mode) { *request = *reply; #if XtSpecificationRelease > 4 /* * In R5, XtSetValues changed so that when a widgets parent * returns XtGeometryAlmost, Xt will only call the widgets resize * method if the widgets size actually changed. It turns out that * some manager widgets (old Wcl XmpTable and 1.1.x XmForm) return * XtGeometryAlmost with a compromise size which is the widgets * original size (not much of a compromise)! This means as of R5, * Matrix's resize method won't get called in that case. * * So, for R5 we explicitly call our resize method here for the * case of XtGeometryAlmost where our size did not change. */ if ((reply->request_mode & CWWidth || reply->request_mode & CWHeight) && (old->core.width == new->core.width && old->core.height == new->core.height)) xbaeResize(new); #endif } /* * If XtGeometryNo, call Resize to relayout if it was a size change * that was denied. * Accept the original geometry. * (we need to call Resize even though the size * didn't change to force a relayout - set_values relies on this) */ else { if ((request->request_mode & CWWidth || request->request_mode & CWHeight)) xbaeResize(new); request->request_mode = 0; } } static void Destroy(mw) XbaeMatrixWidget mw; { #if XmVersion >= 1002 if (TraverseID) XtRemoveTimeOut(TraverseID); #endif XtReleaseGC((Widget) mw, mw->matrix.grid_line_gc); XFreeGC(XtDisplay(mw), mw->matrix.cell_grid_line_gc); XFreeGC(XtDisplay(mw), mw->matrix.label_gc); XFreeGC(XtDisplay(mw), mw->matrix.label_clip_gc); XFreeGC(XtDisplay(mw), mw->matrix.draw_gc); XFreeGC(XtDisplay(mw), mw->matrix.pixmap_gc); XFreeGC(XtDisplay(mw), mw->matrix.cell_top_shadow_clip_gc); XFreeGC(XtDisplay(mw), mw->matrix.cell_bottom_shadow_clip_gc); XtReleaseGC((Widget) mw, mw->matrix.resize_top_shadow_gc); XtReleaseGC((Widget) mw, mw->matrix.resize_bottom_shadow_gc); xbaeFreeCells(mw); #if CELL_WIDGETS xbaeFreeCellWidgets(mw); #endif xbaeFreeRowLabels(mw); xbaeFreeColumnLabels(mw); xbaeFreeColumnWidths(mw); xbaeFreeColumnMaxLengths(mw); xbaeFreeColumnPositions(mw); xbaeFreeColumnAlignments(mw); xbaeFreeColumnButtonLabels(mw); xbaeFreeRowButtonLabels(mw); xbaeFreeColumnLabelAlignments(mw); xbaeFreeCellUserData(mw); xbaeFreeRowUserData(mw); xbaeFreeColumnUserData(mw); xbaeFreeCellShadowTypes(mw); xbaeFreeRowShadowTypes(mw); xbaeFreeColumnShadowTypes(mw); xbaeFreeColors(mw); xbaeFreeBackgrounds(mw); xbaeFreeSelectedCells(mw); #if XmVersion >= 1002 xbaeFreeHighlightedCells(mw); #endif XmFontListFree(mw->matrix.font_list); XmFontListFree(mw->matrix.label_font_list); xbaeSmDestroyScrollMgr(mw->matrix.matrix_scroll_mgr); xbaeSmDestroyScrollMgr(mw->matrix.clip_scroll_mgr); } /* * Since we totally control our childrens geometry, allow anything. */ /* ARGSUSED */ static XtGeometryResult GeometryManager(w, desired, allowed) Widget w; XtWidgetGeometry *desired, *allowed; { #define Wants(flag) (desired->request_mode & flag) if (Wants(XtCWQueryOnly)) return (XtGeometryYes); if (Wants(CWWidth)) w->core.width = desired->width; if (Wants(CWHeight)) w->core.height = desired->height; if (Wants(CWX)) w->core.x = desired->x; if (Wants(CWY)) w->core.y = desired->y; if (Wants(CWBorderWidth)) w->core.border_width = desired->border_width; return (XtGeometryYes); #undef Wants } /* * We would prefer to be the size calculated in ComputeSize and saved in * desired_width/height */ static XtGeometryResult QueryGeometry(mw, proposed, desired) XbaeMatrixWidget mw; XtWidgetGeometry *proposed, *desired; { #define Set(bit) (proposed->request_mode & bit) desired->width = mw->matrix.desired_width; desired->height = mw->matrix.desired_height; desired->request_mode = CWWidth | CWHeight; if (Set(CWWidth) && proposed->width == desired->width && Set(CWHeight) && proposed->height == desired->height) return (XtGeometryYes); if (desired->width == mw->core.width && desired->height == mw->core.height) return (XtGeometryNo); return (XtGeometryAlmost); #undef Set } /* * This function is called from either the Clip focus CB or a timeout proc. * It is called as a result of the Clip getting the focus. We want to give * the focus to the textField if a cell is being edited. If no cells are * being edited, force an edit on the top left most visible cell. */ static void TraverseIn(mw) XbaeMatrixWidget mw; { /* * If the traversing flag is set, then Clip got the focus because * textField was trying to traverse out of mw. We'll help it along. * Sickening. */ if (mw->matrix.traversing != NOT_TRAVERSING) { XmProcessTraversal(ClipChild(mw), mw->matrix.traversing); return; } /* * If the textField is managed and not visible, scroll it onto the screen * and traverse to it. */ if (XtIsManaged(TextChild(mw))) { if (mw->matrix.scroll_select) xbaeMakeCellVisible(mw, mw->matrix.current_row, mw->matrix.current_column); XmProcessTraversal(TextChild(mw), XmTRAVERSE_CURRENT); } /* * Otherwise, no cell is being edited. Force an edit on the top-left * most visible cell. */ else { int column = xbaeXtoCol(mw, FIXED_COLUMN_WIDTH(mw) + HORIZ_ORIGIN(mw)); int row = VERT_ORIGIN(mw) + mw->matrix.fixed_rows; /* * Call the traverseCellCallback to allow the application to * perform custom traversal. */ if (mw->matrix.traverse_cell_callback) { XbaeMatrixTraverseCellCallbackStruct call_data; call_data.reason = XbaeTraverseCellReason; call_data.event = (XEvent *)NULL; call_data.row = 0; call_data.column = 0; call_data.next_row = row; call_data.next_column = column; call_data.fixed_rows = mw->matrix.fixed_rows; call_data.fixed_columns = mw->matrix.fixed_columns; call_data.trailing_fixed_rows = mw->matrix.trailing_fixed_rows; call_data.trailing_fixed_columns = mw->matrix.trailing_fixed_columns; call_data.num_rows = mw->matrix.rows; call_data.num_columns = mw->matrix.columns; call_data.param = NULL; call_data.qparam = NULLQUARK; XtCallCallbackList((Widget) mw, mw->matrix.traverse_cell_callback, (XtPointer) & call_data); row = call_data.next_row; column = call_data.next_column; } (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.edit_cell) (mw, NULL, row, column, NULL, 0); XmProcessTraversal(TextChild(mw), XmTRAVERSE_CURRENT); } } #if XmVersion >= 1002 /* * Under Motif 1.2, TraverseInCB can't call TraverseIn directly, so it * adds a zero length timeout and we call it from here. */ /* ARGSUSED */ static void TraverseInTimeOut(mw, timer) XtPointer mw; XtIntervalId *timer; { TraverseIn((XbaeMatrixWidget)mw); } #endif /* XmVersion >= 1002 */ /* * This is the Clip widgets focusCallback. We want to give the focus to * the textField if a cell is being edited. If no cells are being edited, * force an edit on the top left most visible cell. */ /* ARGSUSED */ static void TraverseInCB(w, mw, call_data) Widget w; XbaeMatrixWidget mw; XtPointer call_data; { #if XmVersion < 1002 TraverseIn(mw); #else /* * Under Motif 1.2, we can't call TraverseIn directly because it * calls XmProcessTraversal and recursive calls to XmProcessTraversal * are disallowed in 1.2 (we may be in this CB as a result of someone * calling XmProcessTraversal). So we add a zero length timeout * and call TraverseIn from there. */ TraverseID = XtAppAddTimeOut(XtWidgetToApplicationContext((Widget) w), 0L, TraverseInTimeOut, (XtPointer) mw); #endif } /* * Add rows/columns of cells when set_values changes our rows/columns */ static void ResizeCells(current, new) XbaeMatrixWidget current; XbaeMatrixWidget new; { int i, j; int safe_rows = 0; /* * If there is a draw cell callback, we don't need to allocate any * memory for the cells so get outta here. If there is a draw cell * callback, no memory should have been allocated when this point is * reached. */ if (!new->matrix.cells) return; if (new->matrix.rows == current->matrix.rows) safe_rows = new->matrix.rows; /* * Adding rows */ if (new->matrix.rows > current->matrix.rows) { /* * Realloc a larger array of row pointers */ new->matrix.cells = (String **) XtRealloc((char *) new->matrix.cells, new->matrix.rows * sizeof(String *)); /* * Malloc a new row array for each row. Initialize it with * NULL Strings. Use the new column size. */ for (i = current->matrix.rows; i < new->matrix.rows; i++) { new->matrix.cells[i] = (String *) XtMalloc(new->matrix.columns * sizeof(String)); for (j = 0; j < new->matrix.columns; j++) new->matrix.cells[i][j] = XtNewString(""); } safe_rows = current->matrix.rows; } /* * Deleting rows */ if (new->matrix.rows < current->matrix.rows) { /* * Free the cells in the rows being deleted and the rows themselves */ for (i = new->matrix.rows; i < current->matrix.rows; i++) { for (j = 0; j < current->matrix.columns; j++) XtFree((XtPointer) new->matrix.cells[i][j]); XtFree((XtPointer) new->matrix.cells[i]); } safe_rows = new->matrix.rows; } /* * Adding columns */ if (new->matrix.columns > current->matrix.columns) { /* * Realloc each row array. Do not touch any rows added/deleted above * (use safe_rows) */ for (i = 0; i < safe_rows; i++) { new->matrix.cells[i] = (String *) XtRealloc((char *) new->matrix.cells[i], new->matrix.columns * sizeof(String)); for (j = current->matrix.columns; j < new->matrix.columns; j++) new->matrix.cells[i][j] = XtNewString(""); } } /* * Deleting columns */ if (new->matrix.columns < current->matrix.columns) { /* * Free all the cells in the deleted columns. Do not touch any * rows added/deleted above (use safe_rows). * We don't bother to realloc each row, just leave some wasted space. * XXX is this a problem? */ for (i = 0; i < safe_rows; i++) for (j = new->matrix.columns; j < current->matrix.columns; j++) XtFree((XtPointer) new->matrix.cells[i][j]); } } /* * Add rows/columns of selected flags when set_values changes our rows/columns */ static void ResizeSelectedCells(current, new) XbaeMatrixWidget current; XbaeMatrixWidget new; { int i; int safe_rows = 0; /* * selectedCells is allocated when the first cell is selected. If it * is still NULL, no cells have been selected up to this point. */ if (!new->matrix.selected_cells) return; if (new->matrix.rows == current->matrix.rows) safe_rows = new->matrix.rows; /* * Adding rows */ if (new->matrix.rows > current->matrix.rows) { /* * Realloc a larger array of row pointers */ new->matrix.selected_cells = (Boolean **) XtRealloc((char *) new->matrix.selected_cells, new->matrix.rows * sizeof(Boolean *)); /* * Calloc a new row array for each row. Use the new column size. */ for (i = current->matrix.rows; i < new->matrix.rows; i++) new->matrix.selected_cells[i] = (Boolean *) XtCalloc(new->matrix.columns, sizeof(Boolean)); safe_rows = current->matrix.rows; } /* * Deleting rows */ if (new->matrix.rows < current->matrix.rows) { for (i = new->matrix.rows; i < current->matrix.rows; i++) XtFree((XtPointer) new->matrix.selected_cells[i]); safe_rows = new->matrix.rows; } /* * Adding columns */ if (new->matrix.columns > current->matrix.columns) { /* * Realloc each row array. Do not touch any rows added/deleted above * (use safe_rows) */ for (i = 0; i < safe_rows; i++) { int j; new->matrix.selected_cells[i] = (Boolean *) XtRealloc((char *) new->matrix.selected_cells[i], new->matrix.columns * sizeof(Boolean)); for (j = current->matrix.columns; j < new->matrix.columns; j++) new->matrix.selected_cells[i][j] = False; } } /* * Deleting columns * if (new->matrix.columns < current->matrix.columns) * We don't bother to realloc, just leave some wasted space. * XXX is this a problem? */ } #if XmVersion >= 1002 /* * Add rows/columns of highlighted flags when set_values changes our rows/columns */ static void ResizeHighlightedCells(current, new) XbaeMatrixWidget current; XbaeMatrixWidget new; { int i; int safe_rows = 0; if (!new->matrix.highlighted_cells) return; if (new->matrix.rows == current->matrix.rows) safe_rows = new->matrix.rows; /* * Adding rows */ if (new->matrix.rows > current->matrix.rows) { /* * Realloc a larger array of row pointers */ new->matrix.highlighted_cells = (unsigned char **) XtRealloc( (char *) new->matrix.highlighted_cells, new->matrix.rows * sizeof(unsigned char *)); /* * Calloc a new row array for each row. Use the new column size. */ for (i = current->matrix.rows; i < new->matrix.rows; i++) new->matrix.highlighted_cells[i] = (unsigned char *) XtCalloc(new->matrix.columns, sizeof(unsigned char)); safe_rows = current->matrix.rows; } /* * Deleting rows */ if (new->matrix.rows < current->matrix.rows) { for (i = new->matrix.rows; i < current->matrix.rows; i++) XtFree((XtPointer) new->matrix.highlighted_cells[i]); safe_rows = new->matrix.rows; } /* * Adding columns */ if (new->matrix.columns > current->matrix.columns) { /* * Realloc each row array. Do not touch any rows added/deleted above * (use safe_rows) */ for (i = 0; i < safe_rows; i++) { int j; new->matrix.highlighted_cells[i] = (unsigned char *) XtRealloc( (char *) new->matrix.highlighted_cells[i], new->matrix.columns * sizeof(unsigned char)); for (j = current->matrix.columns; j < new->matrix.columns; j++) new->matrix.highlighted_cells[i][j] = HighlightNone; } } /* * Deleting columns * if (new->matrix.columns < current->matrix.columns) * We don't bother to realloc, just leave some wasted space. * XXX is this a problem? */ } #endif /* * Add rows/columns of colors when set_values changes our rows/columns */ static void #if NeedFunctionPrototypes ResizeColors(XbaeMatrixWidget current, XbaeMatrixWidget new, Boolean bg) #else ResizeColors(current, new, bg) XbaeMatrixWidget current; XbaeMatrixWidget new; Boolean bg; #endif { int i, j; int safe_rows = 0; if (! new->matrix.rows) return; if (new->matrix.rows == current->matrix.rows) safe_rows = new->matrix.rows; /* * Adding rows */ if (new->matrix.rows > current->matrix.rows) { /* * Realloc a larger array of row pointers */ if (bg) { new->matrix.cell_background = (Pixel **) XtRealloc((char *) new->matrix.cell_background, new->matrix.rows * sizeof(Pixel *)); for (i = current->matrix.rows; i < new->matrix.rows; i++) { new->matrix.cell_background[i] = (Pixel *) XtMalloc(new->matrix.columns * sizeof(Pixel)); for (j = 0; j < new->matrix.columns; j++) new->matrix.cell_background[i][j] = new->core.background_pixel; } } else { new->matrix.colors = (Pixel **) XtRealloc((char *) new->matrix.colors, new->matrix.rows * sizeof(Pixel *)); for (i = current->matrix.rows; i < new->matrix.rows; i++) { new->matrix.colors[i] = (Pixel *) XtMalloc(new->matrix.columns * sizeof(Pixel)); for (j = 0; j < new->matrix.columns; j++) new->matrix.colors[i][j] = new->manager.foreground; } } /* * Malloc a new row array for each row. Initialize it with foreground. * Use the new column size. */ safe_rows = current->matrix.rows; } /* * Deleting rows */ if (new->matrix.rows < current->matrix.rows) { if (bg) for (i = new->matrix.rows; i < current->matrix.rows; i++) XtFree((XtPointer) new->matrix.cell_background[i]); else for (i = new->matrix.rows; i < current->matrix.rows; i++) XtFree((XtPointer) new->matrix.colors[i]); safe_rows = new->matrix.rows; } /* * Adding columns */ if (new->matrix.columns > current->matrix.columns) { /* * Realloc each row array. Do not touch any rows added/deleted above * (use safe_rows) */ if (bg) { for (i = 0; i < safe_rows; i++) { int k; new->matrix.cell_background[i] = (Pixel *) XtRealloc( (char *) new->matrix.cell_background[i], new->matrix.columns * sizeof(Pixel)); for (k = current->matrix.columns; k < new->matrix.columns; k++) new->matrix.cell_background[i][k] = new->core.background_pixel; } } else { for (i = 0; i < safe_rows; i++) { int k; new->matrix.colors[i] = (Pixel *) XtRealloc( (char *) new->matrix.colors[i], new->matrix.columns * sizeof(Pixel)); for (k = current->matrix.columns; k < new->matrix.columns; k++) new->matrix.colors[i][k] = new->manager.foreground; } } } /* * Deleting columns * if (new->matrix.columns < current->matrix.columns) * We don't bother to realloc, just leave some wasted space. * XXX is this a problem? AL: Probably! If you are deleting enough * columns, it would be nice to make the memory available again. * I'll get to it later. */ } grace-5.1.23/Xbae/Xbae/Draw.c0000644000076500001440000010077006766327621015253 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Draw.c,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ #ifdef HAVE_CONFIG_H #include #endif #include #include #if XmVersion > 1001 #include #endif #include #include #include #include #include static void xbaeDrawCellString P((XbaeMatrixWidget, int, int, int, int, String, Pixel, Pixel)); #if CELL_WIDGETS static void xbaeDrawCellWidget P((XbaeMatrixWidget, int, int, int, int, Widget, Pixel, Pixel)); #endif static void xbaeDrawCellPixmap P((XbaeMatrixWidget, int, int, int, int, Pixmap, Pixmap, int, int, Pixel, Pixel, int)); /* * Draw a fixed or non-fixed cell. The coordinates are calculated relative * to the correct window and pixmap is copied to that window. */ static void xbaeDrawCellPixmap(mw, row, column, x, y, pixmap, mask, width, height, bg, fg, depth) XbaeMatrixWidget mw; int row; int column; int x; int y; Pixmap pixmap; Pixmap mask; int width; int height; Pixel bg; Pixel fg; int depth; { int src_x = 0, src_y, dest_x, dest_y; int copy_width, copy_height; int cell_height = ROW_HEIGHT(mw); int cell_width = COLUMN_WIDTH(mw, column); Widget w; unsigned char alignment = mw->matrix.column_alignments ? mw->matrix.column_alignments[column] : XmALIGNMENT_BEGINNING; Display *display = XtDisplay(mw); GC gc; Window win = xbaeGetCellWindow(mw, &w, row, column); if (!win) return; /* * Convert the row/column to the coordinates relative to the correct * window */ dest_x = x + TEXT_WIDTH_OFFSET(mw); gc = mw->matrix.pixmap_gc; XSetForeground(display, gc, bg); #if XmVersion >= 1002 /* * If we are only changing the highlighting of a cell, we don't need * to do anything other than draw (or undraw) the highlight */ if (mw->matrix.highlighted_cells && mw->matrix.highlight_location != HighlightNone) { xbaeDrawCellHighlight(mw, win, gc, row, column, x, y, cell_width, cell_height, mw->matrix.highlight_location); return; } #endif XFillRectangle(display, win, gc, x, y, COLUMN_WIDTH(mw, column), ROW_HEIGHT(mw)); XSetForeground(display, gc, fg); XSetBackground(display, gc, bg); /* * Adjust the x and y drawing destinations as appropriate. First the * y value.... */ dest_y = y; if (height > cell_height) { /* Adjust the starting location in the src image */ src_y = (height - cell_height) / 2; copy_height = cell_height; } else { /* Adjust the destination point */ src_y = 0; dest_y += ((cell_height - height) / 2); copy_height = height; } /* * Adjust the x value, paying attention to the columnAlignment */ if (width > cell_width) copy_width = cell_width; else copy_width = width; switch (alignment) { case XmALIGNMENT_BEGINNING: src_x = 0; break; case XmALIGNMENT_CENTER: if (width > cell_width) src_x = (width - cell_width) / 2; else { src_x = 0; dest_x += ((cell_width - width) / 2); } break; case XmALIGNMENT_END: if (width > cell_width) src_x = width - cell_width; else { src_x = 0; dest_x = x + COLUMN_WIDTH(mw, column) - TEXT_WIDTH_OFFSET(mw) - width; } break; } /* * Draw the pixmap. Clip it, if necessary */ if (pixmap) { if (depth > 1) /* A pixmap using xpm */ { if (mask) { XSetClipMask(display, gc, mask); XSetClipOrigin(display, gc, dest_x - src_x, dest_y - src_y); } XCopyArea(display, pixmap, win, gc, src_x, src_y, copy_width, copy_height, dest_x, dest_y); if (mask) XSetClipMask(display, gc, None); } else /* A plain old bitmap */ XCopyPlane(display, pixmap, win, gc, src_x, src_y, copy_width, copy_height, dest_x, dest_y, 1L); } /* * If we need to fill the rest of the space, do so */ if (IN_GRID_COLUMN_MODE(mw) && NEED_VERT_FILL(mw) && (row == (mw->matrix.rows - 1))) { int ax, ay; int fill_width, fill_height; /* * Need to check the actual window we are drawing on to ensure * the correct visual */ xbaeCalcVertFill(mw, win, x, y, row, column, &ax, &ay, &fill_width, &fill_height); XFillRectangle(XtDisplay(mw), XtWindow(mw), gc, ax, ay, fill_width, fill_height); } else if (IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw) && (column == (mw->matrix.columns - 1))) { int ax, ay; int fill_width, fill_height; xbaeCalcHorizFill(mw, win, x, y, row, column, &ax, &ay, &fill_width, &fill_height); XFillRectangle(XtDisplay(mw), XtWindow(mw), gc, ax, ay, fill_width, fill_height); } #if XmVersion >= 1002 if (mw->matrix.highlighted_cells && mw->matrix.highlighted_cells[row][column]) { xbaeDrawCellHighlight(mw, win, gc, row, column, x, y, cell_width, cell_height, HIGHLIGHTING_SOMETHING); } #endif xbaeDrawCellShadow(mw, win, row, column, x, y, cell_width, cell_height, False, False, False); } /* * Draw a fixed or non-fixed cell. The coordinates are calculated relative * to the correct window and the cell is drawn in that window. */ static void xbaeDrawCellString(mw, row, column, x, y, string, bg, fg) XbaeMatrixWidget mw; int row, column; String string; Pixel bg, fg; { GC gc; Widget w; Window win = xbaeGetCellWindow(mw, &w, row, column); Dimension column_width = COLUMN_WIDTH(mw, column); Dimension row_height = ROW_HEIGHT(mw); Dimension width = column_width; Dimension height = row_height; Boolean selected = mw->matrix.selected_cells ? mw->matrix.selected_cells[row][column] : False; String str = string; if (!win) return; #if 0 /* * Probably not needed - time will tell! If anybody gets a segv on * ignoring this code, be sure to let me know - AL 11/96 * * Make sure y coordinate is valid */ if ((win == XtWindow(mw)) && ((y > (CLIP_VERT_VISIBLE_SPACE(mw) + ROW_LABEL_OFFSET(mw) - 1)) || (y < ROW_LABEL_OFFSET(mw)))) return; #endif gc = mw->matrix.draw_gc; XSetForeground(XtDisplay(mw), gc, bg); /* * If we are only changing the highlighting of a cell, we don't need * to do anything other than draw (or undraw) the highlight */ if (mw->matrix.highlighted_cells && mw->matrix.highlight_location != HighlightNone) { xbaeDrawCellHighlight(mw, win, gc, row, column, x, y, width, height, mw->matrix.highlight_location); return; } /* * Fill the cell's background if it can be done * without duplicating work below */ if ((XtWindow(mw) != win) || (!(IN_GRID_COLUMN_MODE(mw) && NEED_VERT_FILL(mw) && ((mw->matrix.rows - 1) == row)) && !(IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw) && ((mw->matrix.columns - 1) == column)))) XFillRectangle(XtDisplay(mw), win, gc, x, y, column_width, row_height); /* * If we need to fill the rest of the space, do so */ if (IN_GRID_COLUMN_MODE(mw) && NEED_VERT_FILL(mw) && ((mw->matrix.rows - 1) == row)) { int ax, ay; int fill_width, fill_height; /* * Need to check the actual window we are drawing on to ensure * the correct visual */ xbaeCalcVertFill(mw, win, x, y, row, column, &ax, &ay, &fill_width, &fill_height); XFillRectangle(XtDisplay(mw), XtWindow(mw), gc, ax, ay, fill_width, fill_height); } else if (IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw) && (column == (mw->matrix.columns - 1))) { int ax, ay; int fill_width, fill_height; xbaeCalcHorizFill(mw, win, x, y, row, column, &ax, &ay, &fill_width, &fill_height); XFillRectangle(XtDisplay(mw), XtWindow(mw), gc, ax, ay, fill_width, fill_height); } /* * Draw the string in the cell. */ xbaeDrawString(mw, win, gc, str, strlen(str), x + TEXT_X_OFFSET(mw), y + TEXT_Y_OFFSET(mw), mw->matrix.column_widths[column], mw->matrix.column_alignments ? mw->matrix.column_alignments[column] : XmALIGNMENT_BEGINNING, selected, False, False, False, fg); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells && mw->matrix.highlighted_cells[row][column]) { xbaeDrawCellHighlight(mw, win, gc, row, column, x, y, width, height, HIGHLIGHTING_SOMETHING); } #endif xbaeDrawCellShadow(mw, win, row, column, x, y, COLUMN_WIDTH(mw, column), ROW_HEIGHT(mw), False, False, False); } #if CELL_WIDGETS /* * Draw a user defined widget in the cell */ static void xbaeDrawCellWidget(mw, row, column, x, y, widget, bg, fg) XbaeMatrixWidget mw; int row, column; int x, y; Widget widget; Pixel bg, fg; { GC gc; Widget w; Window win = xbaeGetCellWindow(mw, &w, row, column); if (!win) return; gc = mw->matrix.draw_gc; XSetForeground(XtDisplay(mw), gc, bg); XFillRectangle(XtDisplay(mw), win, gc, x, y, COLUMN_WIDTH(mw, column), ROW_HEIGHT(mw)); /* * Draw the widget in the cell. */ XtMoveWidget(widget, x + mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness, y + mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); xbaeDrawCellShadow(mw, win, row, column, x, y, COLUMN_WIDTH(mw, column), ROW_HEIGHT(mw), False, clipped, False); } #endif /* * Width in pixels of a character in a given font */ #define charWidth(fs,c) ((fs)->per_char ? \ (fs)->per_char[((c) < (fs)->min_char_or_byte2 ? \ (fs)->default_char : \ (c) - \ (fs)->min_char_or_byte2)].width : \ (fs)->min_bounds.width) /* * Draw a string with specified attributes. We want to avoid having to * use a GC clip_mask, so we clip by characters. This complicates the code. */ void #if NeedFunctionPrototypes xbaeDrawString(XbaeMatrixWidget mw, Window win, GC gc, String string, int length, int x, int y, int maxlen, unsigned char alignment, Boolean highlight, Boolean bold, Boolean rowLabel, Boolean colLabel, Pixel color) #else xbaeDrawString(mw, win, gc, string, length, x, y, maxlen, alignment, highlight, bold, rowLabel, colLabel, color) XbaeMatrixWidget mw; Window win; GC gc; String string; int length; int x; int y; int maxlen; unsigned char alignment; Boolean highlight; Boolean bold; Boolean rowLabel; Boolean colLabel; Pixel color; #endif { int start, width, maxwidth; XFontStruct *font_struct; XFontSet font_set; Boolean choppedStart = False; Boolean choppedEnd = False; XRectangle *ink_array = NULL; XRectangle *logical_array = NULL; int num_chars; XRectangle overall_logical; if (rowLabel || colLabel) { font_struct = mw->matrix.label_font_struct; font_set = mw->matrix.label_font_set; } else { font_struct = mw->matrix.font_struct; font_set = mw->matrix.font_set; } /* * Initialize starting character in string */ start = 0; if (!rowLabel) maxwidth = maxlen * FONT_WIDTH(mw); else maxwidth = maxlen * LABEL_WIDTH(mw); if (font_set) { ink_array = (XRectangle*)XtMalloc(length * sizeof(XRectangle)); logical_array = (XRectangle*)XtMalloc(length * sizeof(XRectangle)); XmbTextPerCharExtents(font_set, string, length, ink_array, logical_array, length, &num_chars, NULL, &overall_logical); /* * If the width of the string is greater than the width of this cell, * we need to clip. We don't want to use the server to clip because * it is slow, so we truncate characters if we exceed a cells pixel * width. */ if (overall_logical.width > maxwidth) { switch (alignment) { case XmALIGNMENT_CENTER: { int startx; int endx; int i; int end; /* * If we are going to draw arrows at both ends, allow for them. */ if (mw->matrix.show_arrows) { maxwidth -= 2 * mw->matrix.font_width; choppedStart = True; choppedEnd = True; } /* * Find limits of cell relative to the origin of the string. */ startx = overall_logical.x + overall_logical.width / 2 - maxwidth / 2; endx = startx + maxwidth - 1; /* * Find the first character which fits into the cell. */ for (i = 0; i < num_chars && logical_array[i].x < startx; ++i) { int cl = mblen(string + start, length); start += cl; length -= cl; } /* * Find the last character which fits into the cell. * At this point length represents the number of bytes * between the end of the cell and the end of the full * string. Note that the scan continues from above. */ for (end = start; i < num_chars && (logical_array[i].x + logical_array[i].width) < endx; ++i) { int cl = mblen(string + end, length); end += cl; length -= cl; } /* * Now reset length so that it represents the number of bytes * in the string. */ length = end - start; break; } case XmALIGNMENT_END: { int startx; int i; /* * We are going to an draw arrow at the end, allow for it. */ if (mw->matrix.show_arrows) { maxwidth -= mw->matrix.font_width; choppedEnd = True; } /* * Find limits of cell relative to the origin of the string. */ startx = overall_logical.x + overall_logical.width - maxwidth; /* * Find the first character which fits into the cell. */ for (i = 0; i < num_chars && logical_array[i].x < startx; ++i) { int cl = mblen(string + start, length); start += cl; length -= cl; } break; } case XmALIGNMENT_BEGINNING: default: { int endx; int i; int end; /* * We are going to an draw arrow at the start, allow for it. */ if (mw->matrix.show_arrows) { maxwidth -= mw->matrix.font_width; choppedStart = True; } /* * Find limits of cell relative to the origin of the string. */ endx = overall_logical.x + maxwidth - 1; /* * Find the last character which fits into the cell. * At this point length represents the number of bytes * between the end of the cell and the end of the full * string. */ for (i = 0, end = start; i < num_chars && (logical_array[i].x + logical_array[i].width) < endx; ++i) { int cl = mblen(string + end, length); end += cl; length -= cl; choppedEnd = True; } /* * Now reset length so that it represents the number of bytes * in the string. */ length = end - start; break; } } /* * Having truncated string recalculate extents to find origin */ XmbTextPerCharExtents(font_set, string, length, ink_array, logical_array, length, &num_chars, NULL, &overall_logical); } /* * We fit inside our cell, so just compute the x of the start of * our string */ else { switch (alignment) { case XmALIGNMENT_CENTER: x += maxwidth / 2 - overall_logical.width / 2; break; case XmALIGNMENT_END: x += maxwidth - overall_logical.width; break; case XmALIGNMENT_BEGINNING: default: /* * Leave x alone */ break; } } /* * Don't worry, XSetForeground is smart about avoiding unnecessary * protocol requests. */ XSetForeground(XtDisplay(mw), gc, color); if (mw->matrix.show_arrows && choppedStart) { XPoint points[ 3 ]; points[ 0 ].x = points[ 1 ].x = x + mw->matrix.font_width; points[ 0 ].y = y + mw->matrix.font_y; points[ 1 ].y = y + mw->matrix.font_y + mw->matrix.font_height; points[ 2 ].x = x; points[ 2 ].y = y + mw->matrix.font_y + mw->matrix.font_height / 2; XFillPolygon(XtDisplay(mw), win, gc, points, 3, Convex, CoordModeOrigin); /* Offset the start point so as to not draw on the triangle */ x += FONT_WIDTH(mw); } if (mw->matrix.show_arrows && choppedEnd) { XPoint points[ 3 ]; points[ 0 ].x = points[ 1 ].x = x + overall_logical.width; points[ 0 ].y = y + mw->matrix.font_y; points[ 1 ].y = y + mw->matrix.font_y + mw->matrix.font_height; points[ 2 ].x = x + overall_logical.width + mw->matrix.font_width; points[ 2 ].y = y + mw->matrix.font_y + mw->matrix.font_height / 2; XFillPolygon(XtDisplay(mw), win, gc, points, 3, Convex, CoordModeOrigin); } /* * Adjust x for origin of string. */ x -= overall_logical.x; /* * Now draw the string at x starting at char 'start' and of * length 'length' */ XmbDrawString(XtDisplay(mw), win, font_set, gc, x, y, &string[start], length); /* * If bold is on, draw the string again offset by 1 pixel (overstrike) */ if (bold) XmbDrawString(XtDisplay(mw), win, font_set, gc, x - 1, y, &string[start], length); if (ink_array) XtFree((char*)ink_array); if (logical_array) XtFree((char*)logical_array); } else { width = XTextWidth(font_struct, string, length); /* * If the width of the string is greater than the width of this cell, * we need to clip. We don't want to use the server to clip because * it is slow, so we truncate characters if we exceed a cells pixel * width. */ if (width > maxwidth) { switch (alignment) { case XmALIGNMENT_CENTER: { int startx = x; int endx = x + maxwidth - 1; int newendx; /* * Figure out our x for the centered string. Then loop * and chop characters off the front until we are within * the cell. * * Adjust x, the starting character and the length of the * string for each char. */ x += maxwidth / 2 - width / 2; while (x < startx) { int cw = charWidth(font_struct, (unsigned char)string[start]); x += cw; width -= cw; length--; start++; choppedStart = True; } /* * Now figure out the end x of the string. Then loop and chop * characters off the end until we are within the cell. */ newendx = x + width - 1; while (newendx > endx && *(string + start)) { int cw = charWidth(font_struct, (unsigned char)string[start]); newendx -= cw; width -= cw; length--; choppedEnd = True; } break; } case XmALIGNMENT_END: { /* * Figure out our x for the right justified string. * Then loop and chop characters off the front until we fit. * Adjust x for each char lopped off. Also adjust the starting * character and length of the string for each char. */ x += maxwidth - width; while (width > maxwidth) { int cw = charWidth(font_struct, (unsigned char)string[start]); width -= cw; x += cw; length--; start++; choppedStart = True; } break; } case XmALIGNMENT_BEGINNING: default: /* * Leave x alone, but chop characters off the end until we fit */ while (width > maxwidth) { width -= charWidth(font_struct, (unsigned char)string[length - 1]); length--; choppedEnd = True; } break; } } /* * We fit inside our cell, so just compute the x of the start of * our string */ else { switch (alignment) { case XmALIGNMENT_CENTER: x += maxwidth / 2 - width / 2; break; case XmALIGNMENT_END: x += maxwidth - width; break; case XmALIGNMENT_BEGINNING: default: /* * Leave x alone */ break; } } /* * Don't worry, XSetForeground is smart about avoiding unnecessary * protocol requests. */ XSetForeground(XtDisplay(mw), gc, color); if (mw->matrix.show_arrows && choppedEnd) { XPoint points[3]; points[0].x = points[1].x = x + width - mw->matrix.font_width; points[0].y = y + mw->matrix.font_y; points[1].y = y + mw->matrix.font_y + mw->matrix.font_height; points[2].x = x + width; points[2].y = y + mw->matrix.font_y + mw->matrix.font_height / 2; XFillPolygon(XtDisplay(mw), win, gc, points, 3, Convex, CoordModeOrigin); /* Reduce the length to allow for our foreign character */ length--; } if (mw->matrix.show_arrows && choppedStart) { XPoint points[3]; points[0].x = points[1].x = x + mw->matrix.font_width; points[0].y = y + mw->matrix.font_y; points[1].y = y + mw->matrix.font_y + mw->matrix.font_height; points[2].x = x; points[2].y = y + mw->matrix.font_y + mw->matrix.font_height / 2; XFillPolygon(XtDisplay(mw), win, gc, points, 3, Convex, CoordModeOrigin); /* Offset the start point so as to not draw on the triangle */ x += mw->matrix.font_width; start++; length--; } /* * Now draw the string at x starting at char 'start' and of length * 'length' */ #ifdef NEED_WCHAR if (TWO_BYTE_FONT(mw)) XDrawString16(XtDisplay(mw), win, gc, x, y, &string[start], length); else #endif XDrawString(XtDisplay(mw), win, gc, x, y, &string[start], length); /* * If bold is on, draw the string again offset by 1 pixel (overstrike) */ if (bold) #ifdef NEED_WCHAR if (TWO_BYTE_FONT(mw)) XDrawString16(XtDisplay(mw), win, gc, x - 1, y, &string[start], length); else #endif XDrawString(XtDisplay(mw), win, gc, x - 1, y, &string[start], length); } } void xbaeComputeCellColors(mw, row, column, fg, bg) XbaeMatrixWidget mw; int row, column; Pixel *fg, *bg; { Boolean alt = mw->matrix.alt_row_count ? (row / mw->matrix.alt_row_count) % 2 : False; /* * Compute the background and foreground colours of the cell */ if (mw->matrix.selected_cells && mw->matrix.selected_cells[row][column]) if (mw->matrix.reverse_select) if (mw->matrix.colors) *bg = mw->matrix.colors[row][column]; else *bg = mw->manager.foreground; else *bg = mw->matrix.selected_background; else if (mw->matrix.cell_background && mw->matrix.cell_background[row][column] != mw->core.background_pixel) *bg = mw->matrix.cell_background[row][column]; else { if (alt) *bg = mw->matrix.odd_row_background; else *bg = mw->matrix.even_row_background; } if (mw->matrix.selected_cells && mw->matrix.selected_cells[row][column]) if (mw->matrix.reverse_select) if (mw->matrix.cell_background) *fg = mw->matrix.cell_background[row][column]; else *fg = mw->core.background_pixel; else *fg = mw->matrix.selected_foreground; else if (mw->matrix.colors) *fg = mw->matrix.colors[row][column]; else *fg = mw->manager.foreground; } void xbaeDrawCell(mw, row, column) XbaeMatrixWidget mw; int row, column; { Pixel bg, fg; String string; int x, y; if (mw->matrix.disable_redisplay || mw->matrix.rows == 0 || mw->matrix.columns == 0) return; /* * Convert the row/column to the coordinates relative to the correct * window */ xbaeRowColToXY(mw, row, column, &x, &y); xbaeComputeCellColors(mw, row, column, &fg, &bg); #if CELL_WIDGETS if (mw->matrix.cell_widgets[row][column]) xbaeDrawCellWidget(mw, row, column, x, y, mw->matrix.cell_widgets[row][column], bg, fg); else #endif if (!mw->matrix.draw_cell_callback) { if (row < mw->matrix.rows && column < mw->matrix.columns) { string = mw->matrix.cells ? mw->matrix.cells[row][column] : ""; xbaeDrawCellString(mw, row, column, x, y, string, bg, fg); } } else { Pixmap pixmap; Pixmap mask; XbaeCellType type; int width, height; int depth; if (row < mw->matrix.rows && column < mw->matrix.columns) { type = xbaeGetDrawCellValue(mw, row, column, &string, &pixmap, &mask, &width, &height, &bg, &fg, &depth); if (type == XbaeString) xbaeDrawCellString(mw, row, column, x, y, string, bg, fg); else if (type == XbaePixmap) xbaeDrawCellPixmap(mw, row, column, x, y, pixmap, mask, width, height, bg, fg, depth); } } } XbaeCellType xbaeGetDrawCellValue(mw, row, column, string, pixmap, mask, width, height, bg, fg, depth) XbaeMatrixWidget mw; int row; int column; String *string; Pixmap *pixmap; Pixmap *mask; int *width, *height; Pixel *bg, *fg; int *depth; { XbaeMatrixDrawCellCallbackStruct call_data; call_data.reason = XbaeDrawCellReason; call_data.event = (XEvent *)NULL; call_data.row = row; call_data.column = column; call_data.width = COLUMN_WIDTH(mw, column) - TEXT_WIDTH_OFFSET(mw) * 2; call_data.height = ROW_HEIGHT(mw) - TEXT_HEIGHT_OFFSET(mw) * 2; call_data.type = XbaeString; call_data.string = ""; call_data.pixmap = (Pixmap)NULL; call_data.mask = (Pixmap)NULL; call_data.foreground = *fg; call_data.background = *bg; call_data.depth = 0; XtCallCallbackList((Widget)mw, mw->matrix.draw_cell_callback, (XtPointer) &call_data); *pixmap = call_data.pixmap; *mask = call_data.mask; *string = call_data.string ? call_data.string : ""; /* Handle NULLs */ if (mw->matrix.reverse_select && mw->matrix.selected_cells && mw->matrix.selected_cells[row][column]) { /* * if colours were set by the draw cell callback, handle reverse * selection */ if (*bg != call_data.background) { if (*fg != call_data.foreground) *bg = call_data.foreground; *fg = call_data.background; } else if (*fg != call_data.foreground) *bg = call_data.foreground; } else { *fg = call_data.foreground; *bg = call_data.background; } *width = call_data.width; *height = call_data.height; *depth = call_data.depth; if (call_data.type == XbaePixmap) { if (*mask == XmUNSPECIFIED_PIXMAP || *mask == BadPixmap) call_data.mask = 0; if (*pixmap == XmUNSPECIFIED_PIXMAP || *pixmap == BadPixmap) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget)mw), "drawCellCallback", "Pixmap", "XbaeMatrix", "XbaeMatrix: Bad pixmap passed from drawCellCallback", NULL, 0); call_data.type = XbaeString; *string = ""; } else if (!*depth) { /* * If we know the depth, width and height don't do a round * trip to find the * geometry */ Window root_return; int x_return, y_return; unsigned int width_return, height_return; unsigned int border_width_return; unsigned int depth_return; if (XGetGeometry(XtDisplay(mw), *pixmap, &root_return, &x_return, &y_return, &width_return, &height_return, &border_width_return, &depth_return)) { *width = width_return; *height = height_return; *depth = depth_return; } } } return (call_data.type); } /* * Draw the column label for the specified column. Handles labels in * fixed and non-fixed columns. */ void #if NeedFunctionPrototypes xbaeDrawColumnLabel(XbaeMatrixWidget mw, int column, Boolean pressed) #else xbaeDrawColumnLabel(mw, column, pressed) XbaeMatrixWidget mw; int column; Boolean pressed; #endif { String label; int labelX, labelY; int buttonX; int i; GC gc; Window win = XtWindow(mw); Boolean clipped = (column >= (int)mw->matrix.fixed_columns && column < TRAILING_HORIZ_ORIGIN(mw)); Boolean button = mw->matrix.button_labels || (mw->matrix.column_button_labels && mw->matrix.column_button_labels[column]); if (mw->matrix.column_labels[column][0] == '\0' && !button) return; /* * If the column label is in a fixed column, we don't need to account * for the horiz_origin */ if (column < (int)mw->matrix.fixed_columns) { labelX = COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column) + TEXT_X_OFFSET(mw); buttonX = COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column); } else if (column >= TRAILING_HORIZ_ORIGIN(mw)) { labelX = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, TRAILING_HORIZ_ORIGIN(mw)) + TEXT_X_OFFSET(mw); buttonX = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, TRAILING_HORIZ_ORIGIN(mw)); } else { labelX = COLUMN_LABEL_OFFSET(mw) + (COLUMN_POSITION(mw, column) - HORIZ_ORIGIN(mw)) + TEXT_X_OFFSET(mw); buttonX = COLUMN_LABEL_OFFSET(mw) + (COLUMN_POSITION(mw, column) - HORIZ_ORIGIN(mw)); } /* * Set our y to the baseline of the first line in this column */ labelY = -mw->matrix.label_font_y + mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness + mw->matrix.cell_margin_height + mw->matrix.text_shadow_thickness + (mw->matrix.column_label_maxlines - mw->matrix.column_label_lines[column].lines) * LABEL_HEIGHT(mw) + HORIZ_SB_OFFSET(mw); if (clipped) gc = mw->matrix.label_clip_gc; else gc = mw->matrix.label_gc; if (button) { XSetForeground(XtDisplay(mw), gc, mw->matrix.button_label_background); XFillRectangle(XtDisplay(mw), win, gc, buttonX, HORIZ_SB_OFFSET(mw), COLUMN_WIDTH(mw, column), COLUMN_LABEL_HEIGHT(mw)); } XSetForeground(XtDisplay(mw), gc, mw->matrix.column_label_color); XSetBackground(XtDisplay(mw), gc, mw->matrix.button_label_background); label = mw->matrix.column_labels[column]; if (label[0] != '\0') for (i = 0; i < mw->matrix.column_label_lines[column].lines; i++) { xbaeDrawString(mw, XtWindow(mw), gc, label, mw->matrix.column_label_lines[column].lengths[i], labelX, labelY, mw->matrix.column_widths[column], mw->matrix.column_label_alignments ? mw->matrix.column_label_alignments[column] : XmALIGNMENT_BEGINNING, False, mw->matrix.bold_labels, False, True, mw->matrix.column_label_color); labelY += LABEL_HEIGHT(mw); label += mw->matrix.column_label_lines[column].lengths[i] + 1; } if (button) xbaeDrawCellShadow(mw, XtWindow(mw), -1, column, buttonX, HORIZ_SB_OFFSET(mw), COLUMN_WIDTH(mw, column), COLUMN_LABEL_HEIGHT(mw), True, clipped, pressed); } /* * Draw the row label for the specified row. Handles labels in fixed and * non-fixed rows. */ void #if NeedFunctionPrototypes xbaeDrawRowLabel(XbaeMatrixWidget mw, int row, Boolean pressed) #else xbaeDrawRowLabel(mw, row, pressed) XbaeMatrixWidget mw; int row; Boolean pressed; #endif { int y; GC gc; Window win = XtWindow(mw); Boolean clipped = (row >= (int)mw->matrix.fixed_rows && row < TRAILING_VERT_ORIGIN(mw)); Boolean button = mw->matrix.button_labels || (mw->matrix.row_button_labels && mw->matrix.row_button_labels[row]); if (mw->matrix.row_labels[row][0] == '\0' && !button) return; /* * If the row label is in a fixed row we don't need to account * for the vert_origin */ if (row < (int)mw->matrix.fixed_rows) y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * row + TEXT_Y_OFFSET(mw); else if (row >= TRAILING_VERT_ORIGIN(mw)) y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * (row - TRAILING_VERT_ORIGIN(mw)) + TEXT_Y_OFFSET(mw); else y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * (row - VERT_ORIGIN(mw)) + LABEL_Y_OFFSET(mw) - mw->matrix.first_row_offset; if (clipped) gc = mw->matrix.label_clip_gc; else gc = mw->matrix.label_gc; if (button) { XSetForeground(XtDisplay(mw), gc, mw->matrix.button_label_background); XFillRectangle(XtDisplay(mw), win, gc, VERT_SB_OFFSET(mw), y - TEXT_Y_OFFSET(mw), ROW_LABEL_WIDTH(mw), ROW_HEIGHT(mw)); } XSetForeground(XtDisplay(mw), gc, mw->matrix.row_label_color); XSetBackground(XtDisplay(mw), gc, mw->matrix.button_label_background); if (mw->matrix.row_labels[row][0] != '\0') xbaeDrawString(mw, win, gc, mw->matrix.row_labels[row], strlen(mw->matrix.row_labels[row]), TEXT_X_OFFSET(mw) + VERT_SB_OFFSET(mw), y, mw->matrix.row_label_width, mw->matrix.row_label_alignment, False, mw->matrix.bold_labels, True, False, mw->matrix.row_label_color); if (button) xbaeDrawCellShadow(mw, win, row, -1, VERT_SB_OFFSET(mw), y - TEXT_Y_OFFSET(mw), ROW_LABEL_WIDTH(mw), ROW_HEIGHT(mw), True, clipped, pressed); } grace-5.1.23/Xbae/Xbae/Shadow.c0000644000076500001440000005132106766327622015601 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Shadow.c,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Shadow.c created by Andrew Lister (30 October, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #if XmVersion > 1001 #include #endif #include #include #include #include static void DrawRowShadow P((XbaeMatrixWidget, Window, int, int, int, int, int, int, GC, GC)); static void DrawColumnShadow P((XbaeMatrixWidget, Window, int, int, int, int, int, int, GC, GC)); static void DrawRowHighlight P((XbaeMatrixWidget, Window, GC, int, int, int, int, int, int, int)); static void DrawColumnHighlight P((XbaeMatrixWidget, Window, GC, int, int, int, int, int, int, int)); void #if NeedFunctionPrototypes xbaeDrawCellShadow(XbaeMatrixWidget mw, Window win, int row, int column, int x, int y, int width, int height, Boolean label, Boolean clipped, Boolean pressed) #else xbaeDrawCellShadow(mw, win, row, column, x, y, width, height, label, clipped, pressed) XbaeMatrixWidget mw; Window win; int row; int column; int x; int y; int width; int height; Boolean label; Boolean clipped; Boolean pressed; #endif { unsigned char grid_type; unsigned char shadow; if ((mw->matrix.cell_shadow_thickness == 0) && (!IN_GRID_ROW_MODE(mw)) && (!IN_GRID_COLUMN_MODE(mw))) return; /* * Surround the cell with a shadow. */ if(label) { shadow = pressed ? XmSHADOW_IN : XmSHADOW_OUT; grid_type = XmGRID_CELL_SHADOW; } else { shadow = mw->matrix.cell_shadow_types ? mw->matrix.cell_shadow_types[row][column] : mw->matrix.cell_shadow_type; grid_type = mw->matrix.grid_type; } if (clipped) { switch (grid_type) { case XmGRID_CELL_SHADOW: DRAW_SHADOW(XtDisplay(mw), win, mw->matrix.cell_top_shadow_clip_gc, mw->matrix.cell_bottom_shadow_clip_gc, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; /* Deprecated types. To be removed in next version. */ case XmGRID_SHADOW_OUT: DRAW_SHADOW(XtDisplay(mw), win, mw->matrix.cell_bottom_shadow_clip_gc, mw->matrix.cell_top_shadow_clip_gc, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; case XmGRID_SHADOW_IN: DRAW_SHADOW(XtDisplay(mw), win, mw->matrix.cell_top_shadow_clip_gc, mw->matrix.cell_bottom_shadow_clip_gc, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; } } else { switch (grid_type) { case XmGRID_NONE: break; case XmGRID_ROW_SHADOW: DrawRowShadow(mw, win, row, column, x, y, width, height, mw->manager.top_shadow_GC, mw->manager.bottom_shadow_GC); break; case XmGRID_ROW_LINE: DrawRowShadow(mw, win, row, column, x, y, width, height, mw->matrix.grid_line_gc, mw->matrix.grid_line_gc); break; case XmGRID_COLUMN_SHADOW: DrawColumnShadow(mw, win, row, column, x, y, width, height, mw->manager.top_shadow_GC, mw->manager.bottom_shadow_GC); break; case XmGRID_COLUMN_LINE: DrawColumnShadow(mw, win, row, column, x, y, width, height, mw->matrix.grid_line_gc, mw->matrix.grid_line_gc); break; case XmGRID_CELL_LINE: DRAW_SHADOW(XtDisplay(mw), win, mw->matrix.grid_line_gc, mw->matrix.grid_line_gc, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; case XmGRID_CELL_SHADOW: DRAW_SHADOW(XtDisplay(mw), win, mw->manager.top_shadow_GC, mw->manager.bottom_shadow_GC, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; /* Deprecated types. To be removed in next version. */ case XmGRID_LINE: DRAW_SHADOW(XtDisplay(mw), win, mw->matrix.grid_line_gc, mw->matrix.grid_line_gc, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; case XmGRID_SHADOW_OUT: DRAW_SHADOW(XtDisplay(mw), win, mw->manager.bottom_shadow_GC, mw->manager.top_shadow_GC, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; case XmGRID_SHADOW_IN: DRAW_SHADOW(XtDisplay(mw), win, mw->manager.top_shadow_GC, mw->manager.bottom_shadow_GC, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); break; } } } #if XmVersion >= 1002 void xbaeDrawCellHighlight(mw, win, gc, row, column, x, y, width, height, reason) XbaeMatrixWidget mw; Window win; GC gc; int row; int column; int x; int y; int width; int height; int reason; { int thick; if (!mw->matrix.highlighted_cells) /* Just a precaution */ return; if (!mw->matrix.highlighted_cells[row][column]) return; /* Nothing to do! */ if (reason & HIGHLIGHTING_SOMETHING) gc = mw->manager.highlight_GC; if (IN_GRID_ROW_MODE(mw) && (reason & HighlightRow || reason & UnhighlightRow) && mw->matrix.highlighted_cells[row][column] == HighlightRow) DrawRowHighlight(mw, win, gc, row, column, x, y, width, height, reason); else if (IN_GRID_COLUMN_MODE(mw) && (reason & HighlightColumn || reason & UnhighlightColumn) && mw->matrix.highlighted_cells[row][column] == HighlightColumn) DrawColumnHighlight(mw, win, gc, row, column, x, y, width, height, reason); else { thick = (2 * mw->matrix.cell_shadow_thickness); DRAW_HIGHLIGHT(XtDisplay(mw), win, gc, x + mw->matrix.cell_shadow_thickness, y + mw->matrix.cell_shadow_thickness, width - thick, height - thick, mw->matrix.cell_highlight_thickness, LineSolid); } } static void DrawRowHighlight(mw, win, gc, row, column, x, y, width, height, reason) XbaeMatrixWidget mw; Window win; GC gc; int row; int column; int x; int y; int width; int height; int reason; { XRectangle rect[1]; rect[0].x = 0; rect[0].y = 0; rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), gc, x, y, rect, 1, Unsorted); y += mw->matrix.cell_shadow_thickness; height -= 2 * mw->matrix.cell_shadow_thickness; if (column != mw->matrix.columns - 1) { if (column != 0) x -= (mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); else x += mw->matrix.cell_shadow_thickness; DRAW_HIGHLIGHT(XtDisplay(mw), win, gc, x, y, mw->core.width, height, mw->matrix.cell_highlight_thickness, LineSolid); } else { if (NEED_HORIZ_FILL(mw)) width = mw->core.width; x -= (mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); width += mw->matrix.cell_highlight_thickness; DRAW_HIGHLIGHT(XtDisplay(mw), win, gc, x, y, width, height, mw->matrix.cell_highlight_thickness, LineSolid); if (NEED_HORIZ_FILL(mw)) { int ax, ay; xbaeCalcHorizFill(mw, win, x, y, row, column, &ax, &ay, &width, &height); rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), gc, ax, ay, rect, 1, Unsorted); height -= mw->matrix.cell_shadow_thickness * 2; ax -= mw->matrix.cell_highlight_thickness; width += (mw->matrix.cell_highlight_thickness - mw->matrix.cell_shadow_thickness); DRAW_HIGHLIGHT(XtDisplay(mw), XtWindow(mw), gc, ax, ay, width, height, mw->matrix.cell_highlight_thickness, LineSolid); } } XSetClipMask(XtDisplay(mw), gc, None); } static void DrawColumnHighlight(mw, win, gc, row, column, x, y, width, height, reason) XbaeMatrixWidget mw; Window win; GC gc; int row; int column; int x; int y; int width; int height; int reason; { XRectangle rect[1]; int vert_dead_space_height = VERT_DEAD_SPACE_HEIGHT(mw); int clip_vert_visible_space = CLIP_VERT_VISIBLE_SPACE(mw); int vert_sb_height = VERT_SB_HEIGHT(mw); Boolean need_vert_dead_space_fill = NEED_VERT_DEAD_SPACE_FILL(mw); /* This adjustment takes care of that little open area * between the last nonfixed row and the first trailing * fixed row when the matrix is smaller than its max height */ if ((vert_dead_space_height == 0) && ((TRAILING_VERT_ORIGIN(mw) - 1) == row) && (vert_sb_height < clip_vert_visible_space)) height += (mw->matrix.cell_shadow_thickness + clip_vert_visible_space - vert_sb_height); rect[0].x = 0; rect[0].y = 0; rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), gc, x, y, rect, 1, Unsorted); x += mw->matrix.cell_shadow_thickness; width -= 2 * mw->matrix.cell_shadow_thickness; if (row != mw->matrix.rows - 1) { if (row != 0) y -= (mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); else y += mw->matrix.cell_shadow_thickness; DRAW_HIGHLIGHT(XtDisplay(mw), win, gc, x, y, width, mw->core.height, mw->matrix.cell_highlight_thickness, LineSolid); } else { if (NEED_VERT_FILL(mw) && (! HAS_ATTACHED_TRAILING_ROWS(mw))) height = mw->core.height; else height += mw->matrix.cell_highlight_thickness; y -= (mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); DRAW_HIGHLIGHT(XtDisplay(mw), win, gc, x, y, width, height, mw->matrix.cell_highlight_thickness, LineSolid); if (NEED_VERT_FILL(mw) || need_vert_dead_space_fill) { int ax, ay; xbaeCalcVertFill(mw, win, x, y, row, column, &ax, &ay, &width, &height); /* If we're filling the dead space, then we only use * the width and ax from above call. */ if (need_vert_dead_space_fill) { ay = UNATTACHED_TRAILING_ROWS_OFFSET(mw); height = mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness + vert_dead_space_height; } rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), gc, ax, ay, rect, 1, Unsorted); width -= mw->matrix.cell_shadow_thickness * 2; ay -= mw->matrix.cell_highlight_thickness; height += (mw->matrix.cell_highlight_thickness - mw->matrix.cell_shadow_thickness); /* Make sure height extends past bottom clip */ if (need_vert_dead_space_fill && IS_FIXED_COLUMN(mw, column)) height += (mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); DRAW_HIGHLIGHT(XtDisplay(mw), XtWindow(mw), gc, ax, ay, width, height, mw->matrix.cell_highlight_thickness, LineSolid); } } XSetClipMask(XtDisplay(mw), gc, None); } #endif static void DrawRowShadow(mw, win, row, column, x, y, width, height, topGC, bottomGC) XbaeMatrixWidget mw; Window win; int row; int column; int x; int y; int width; int height; GC topGC; GC bottomGC; { XRectangle rect[1]; unsigned char shadow = mw->matrix.row_shadow_types ? mw->matrix.row_shadow_types[row] : mw->matrix.cell_shadow_type; rect[0].x = 0; rect[0].y = 0; rect[0].width = width; rect[0].height = height; /* * Set up the clipping rectangle to be only over the current cell */ XSetClipRectangles(XtDisplay(mw), topGC, x, y, rect, 1, Unsorted); if (topGC != bottomGC) XSetClipRectangles(XtDisplay(mw), bottomGC, x, y, rect, 1, Unsorted); /* * Now, convert our coordinates to what we need to draw */ if (column != mw->matrix.columns - 1) { /* * If column is 0, then we need to show the left hand side of the * box, otherwise just draw the edges outside the clipping rectangle */ width = mw->core.width; if (column != 0) x -= mw->matrix.cell_shadow_thickness; DRAW_SHADOW(XtDisplay(mw), win, topGC, bottomGC, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); } else { if (NEED_HORIZ_FILL(mw)) /* * If we are going to fill, the right hand side of the shadow * shouldn't be drawn - we'll do it later! */ width = mw->core.width; else width += mw->matrix.cell_shadow_thickness; DRAW_SHADOW(XtDisplay(mw), win, topGC, bottomGC, mw->matrix.cell_shadow_thickness, x - mw->matrix.cell_shadow_thickness, y, width, height, shadow); if (NEED_HORIZ_FILL(mw)) { /* * The filled part is drawn on the matrix's window so we need to * do a bit of extra work. */ int ax, ay; xbaeCalcHorizFill(mw, win, x, y, row, column, &ax, &ay, &width, &height); rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), topGC, ax, ay, rect, 1, Unsorted); if (topGC != bottomGC) XSetClipRectangles(XtDisplay(mw), bottomGC, ax, ay, rect, 1, Unsorted); /* * Final tweaks. Note that these _cannot_ be part of the calc * horiz fill logic, since that is used to set the clipping * rectangle */ if ((win == XtWindow(ClipChild(mw))) && (height != ROW_HEIGHT(mw))) { if (height == (ClipChild(mw)->core.height + ClipChild(mw)->core.y - ay)) height += mw->matrix.cell_shadow_thickness; if (ay == ClipChild(mw)->core.y) { height += mw->matrix.cell_shadow_thickness; ay -= mw->matrix.cell_shadow_thickness; } } /* Do same check for RightClip. Now, why this is even * necessary when we're drawing on the Matrix's window, * I dunno. This one is only necessary when * we've got trailing fixed columns. */ if (mw->matrix.trailing_fixed_columns && (win == XtWindow(RightClip(mw))) && (height != ROW_HEIGHT(mw))) { if (height == (RightClip(mw)->core.height + RightClip(mw)->core.y - ay)) height += mw->matrix.cell_shadow_thickness; if (ay == RightClip(mw)->core.y) { height += mw->matrix.cell_shadow_thickness; ay -= mw->matrix.cell_shadow_thickness; } } /* * Draw the remaining shadow directly onto the matrix window */ DRAW_SHADOW(XtDisplay(mw), XtWindow(mw), topGC, bottomGC, mw->matrix.cell_shadow_thickness, ax - mw->matrix.cell_shadow_thickness, ay, width + mw->matrix.cell_shadow_thickness, height, shadow); } } /* * Reset our GC's clip mask */ XSetClipMask(XtDisplay(mw), topGC, None); if (topGC != bottomGC) XSetClipMask(XtDisplay(mw), bottomGC, None); } static void DrawColumnShadow(mw, win, row, column, x, y, width, height, topGC, bottomGC) XbaeMatrixWidget mw; Window win; int row; int column; int x; int y; int width; int height; GC topGC; GC bottomGC; { XRectangle rect[1]; unsigned char shadow = mw->matrix.column_shadow_types ? mw->matrix.column_shadow_types[column] : mw->matrix.cell_shadow_type; int vert_dead_space_height = VERT_DEAD_SPACE_HEIGHT(mw); int clip_vert_visible_space = CLIP_VERT_VISIBLE_SPACE(mw); int vert_sb_height = VERT_SB_HEIGHT(mw); Boolean need_vert_dead_space_fill = NEED_VERT_DEAD_SPACE_FILL(mw); /* This adjustment takes care of that little open area * between the last nonfixed row and the first trailing * fixed row when the matrix is smaller than its max height */ if ((vert_dead_space_height == 0) && ((TRAILING_VERT_ORIGIN(mw) - 1) == row) && (vert_sb_height < clip_vert_visible_space)) height += (mw->matrix.cell_shadow_thickness + clip_vert_visible_space - vert_sb_height); rect[0].x = 0; rect[0].y = 0; rect[0].width = width; rect[0].height = height; /* * Set up the clipping rectangle to be only over the current cell */ XSetClipRectangles(XtDisplay(mw), topGC, x, y, rect, 1, Unsorted); if (topGC != bottomGC) XSetClipRectangles(XtDisplay(mw), bottomGC, x, y, rect, 1, Unsorted); /* * Now, convert our coordinates to what we need to draw */ if (row != mw->matrix.rows - 1) { /* * If column is 0, then we need to show the left hand side of the * box, otherwise just draw the edges outside the clipping rectangle */ height = mw->core.height; if (row != 0) y -= mw->matrix.cell_shadow_thickness; DRAW_SHADOW(XtDisplay(mw), win, topGC, bottomGC, mw->matrix.cell_shadow_thickness, x, y, width, height, shadow); } else { if (NEED_VERT_FILL(mw) && (! HAS_ATTACHED_TRAILING_ROWS(mw))) /* * If we are going to fill, the bottom of the shadow * shouldn't be drawn */ height = mw->core.height; else height += mw->matrix.cell_shadow_thickness; DRAW_SHADOW(XtDisplay(mw), win, topGC, bottomGC, mw->matrix.cell_shadow_thickness, x, y - mw->matrix.cell_shadow_thickness, width, height, shadow); /* * The filled part is drawn on the matrix's window so we need to * do a bit of extra work. We may need to fill either the entire * bottom portion of the matrix, or the dead space, that is, the * space between the last nonfixed row and the first trailing * fixed row. We only need to do the latter case when we've got * bottom attached trailing fixed rows with vertical dead space * (vertical dead space only occurs when the matrix is bigger * than its maximum height, i.e., we're filling). */ if (NEED_VERT_FILL(mw) || need_vert_dead_space_fill) { int ax, ay; xbaeCalcVertFill(mw, win, x, y, row, column, &ax, &ay, &width, &height); /* If we're filling the dead space, then we only use * the width and ax from above call. */ if (need_vert_dead_space_fill) { ay = UNATTACHED_TRAILING_ROWS_OFFSET(mw); height = mw->matrix.cell_shadow_thickness + vert_dead_space_height; } rect[0].width = width; rect[0].height = height; XSetClipRectangles(XtDisplay(mw), topGC, ax, ay, rect, 1, Unsorted); if (topGC != bottomGC) XSetClipRectangles(XtDisplay(mw), bottomGC, ax, ay, rect, 1, Unsorted); /* * Final tweaks. Note that these _cannot_ be part of the * calc vert fill logic, since that is used to set the * clipping rectangle */ if ((win == XtWindow(ClipChild(mw))) && (width != COLUMN_WIDTH(mw, column))) { /* Make sure we don't draw a shadow along the matrix's * shadow by extending our width past the edge of the * clipping rectangle */ if (width == (ClipChild(mw)->core.width + ClipChild(mw)->core.x - ax)) width += mw->matrix.cell_shadow_thickness; /* * Make sure the shadow doesn't get drawn along the left * side by moving the x pos outside the clipping * rectangle. */ if (ax == ClipChild(mw)->core.x) { width += mw->matrix.cell_shadow_thickness; ax -= mw->matrix.cell_shadow_thickness; } } /* * Do same check for BottomClip. Now, why this is even * necessary when we're drawing on the Matrix's window, * I dunno. This one is only necessary when we've got * trailing fixed rows. */ if (mw->matrix.trailing_fixed_rows && (win == XtWindow(BottomClip(mw))) && (width != COLUMN_WIDTH(mw, column))) { if (width == (BottomClip(mw)->core.width + BottomClip(mw)->core.x - ax)) width += mw->matrix.cell_shadow_thickness; if (ax == BottomClip(mw)->core.x) { width += mw->matrix.cell_shadow_thickness; ax -= mw->matrix.cell_shadow_thickness; } } /* Make sure height extends past bottom clip */ if (need_vert_dead_space_fill && IS_FIXED_COLUMN(mw, column)) height += mw->matrix.cell_shadow_thickness; /* * Draw the remaining shadow directly onto the matrix window */ DRAW_SHADOW(XtDisplay(mw), XtWindow(mw), topGC, bottomGC, mw->matrix.cell_shadow_thickness, ax, ay - mw->matrix.cell_shadow_thickness, width, height + mw->matrix.cell_shadow_thickness, shadow); } } /* * Reset our GC's clip mask */ XSetClipMask(XtDisplay(mw), topGC, None); if (topGC != bottomGC) XSetClipMask(XtDisplay(mw), bottomGC, None); } grace-5.1.23/Xbae/Xbae/ClipP.h0000644000076500001440000000501306766327621015364 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * ClipWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: ClipP.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * ClipP.h - Private definitions for Clip widget */ #ifndef _Xbae_ClipP_h #define _Xbae_ClipP_h #if XmVersion == 1001 #include #else #include #endif #include /* * New type for class method */ #if defined (__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef void (*XbaeClipRedrawProc) P((Widget)); #if defined (__cplusplus) || defined(c_plusplus) } #endif /* * New fields for the Clip widget class record */ typedef struct { XbaeClipRedrawProc redraw; XtPointer extension; } XbaeClipClassPart; /* * Full class record declaration */ typedef struct _XbaeClipClassRec { CoreClassPart core_class; XmPrimitiveClassPart primitive_class; XbaeClipClassPart clip_class; } XbaeClipClassRec; extern XbaeClipClassRec xbaeClipClassRec; /* * New inheritance constant */ #define XbaeInheritRedraw ((XbaeClipRedrawProc) _XtInherit) /* * New fields for the Clip widget record */ typedef struct { /* resources */ XtExposeProc expose_proc; /* function to call on expose */ XtCallbackList focus_callback; /* callbacks for when we get focus */ } XbaeClipPart; /* * Full instance record declaration */ typedef struct _XbaeClipRec { CorePart core; XmPrimitivePart primitive; XbaeClipPart clip; } XbaeClipRec; #endif /* _Xbae_ClipP_h */ grace-5.1.23/Xbae/Xbae/Makefile0000644000076500001440000000132006766327621015641 0ustar fnevgenyusers##################################################### # Makefile for Xbae widget (bundled with Grace) # ##################################################### # You should not change anything here. # ##################################################### TOP=../.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) CFLAGS=$(CFLAGS0) -I$(TOP) -I. $(XBAE_INC) $(CPPFLAGS) $(GUI_FLAGS) \ -DHAVE_CONFIG_H -DDRAW_RESIZE_SHADOW LIB=libXbae.a all : $(LIB) include Make.common $(LIB) : $(OBJS) $(AR) cr $(LIB) $(OBJS) $(RANLIB) $(LIB) install : $(LIB) tests : dummy links : dummy clean : $(RM) $(LIB) $(OBJS) distclean : $(RM) $(LIB) $(OBJS) *.orig devclean : $(RM) $(LIB) $(OBJS) *.orig dummy : grace-5.1.23/Xbae/Xbae/Create.c0000644000076500001440000010013110103515733015527 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Create.c,v 1.1.2.3 2004/08/02 19:54:03 fnevgeny Exp $ */ /* * Create.c created by Andrew Lister (28 Jan, 1996) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include static Pixmap createInsensitivePixmap P((XbaeMatrixWidget mw)); void xbaeCopyBackground(widget, offset, value) Widget widget; int offset; XrmValue *value; { value->addr = (XtPointer)&(widget->core.background_pixel); } void xbaeCopyForeground(widget, offset, value) Widget widget; int offset; XrmValue *value; { value->addr = (XtPointer)&(((XmManagerWidget)widget)->manager.foreground); } void xbaeCopyDoubleClick(widget, offset, value) Widget widget; int offset; XrmValue *value; { static int interval; interval = XtGetMultiClickTime(XtDisplay(widget)); value->addr = (XtPointer)&interval; } void xbaeCopyCells(mw) XbaeMatrixWidget mw; { String **copy = NULL; int i, j; Boolean empty_row; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ copy = (String **) XtMalloc(mw->matrix.rows * sizeof(String *)); /* * Malloc an array of Strings for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) copy[i] = (String *) XtMalloc(mw->matrix.columns * sizeof(String)); /* * Create a bunch of "" cells if cells was NULL */ if (!mw->matrix.cells) { for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) copy[i][j] = XtNewString(""); } /* * Otherwise copy the table passed in */ else { for (i = 0, empty_row = False; i < mw->matrix.rows; i++) { if (!empty_row && !mw->matrix.cells[i]) empty_row = True; for (j = 0; j < mw->matrix.columns; j++) { if (empty_row || !mw->matrix.cells[i][j]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget)mw), "copyCells", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in cell table", NULL, 0); for (;j < mw->matrix.columns; j++) copy[i][j] = XtNewString(""); } else copy[i][j] = XtNewString(mw->matrix.cells[i][j]); } } } } mw->matrix.cells = copy; } #if CELL_WIDGETS void xbaeCopyCellWidgets(mw) XbaeMatrixWidget mw; { Widget **copy = NULL; int i, j; /* * Malloc an array of row pointers */ if (mw->matrix.rows && mw->matrix.columns) { copy = (Widget **) XtCalloc((Cardinal)mw->matrix.rows, sizeof(Widget *)); for (i = 0; i < mw->matrix.rows; i++) { copy[i] = (Widget *) XtCalloc((Cardinal)mw->matrix.columns, sizeof(Widget)); if (mw->matrix.cell_widgets) for (j = 0; j < mw->matrix.columns; j++) if (mw->matrix.cell_widgets[i][j]) copy[i][j] = mw->matrix.cell_widgets[i][j]; } } mw->matrix.cell_widgets = copy; } #endif void xbaeCopyCellShadowTypes(mw) XbaeMatrixWidget mw; { unsigned char **copy = NULL; int i, j; if (mw->matrix.rows && mw->matrix.columns) { copy = (unsigned char **) XtMalloc(mw->matrix.rows * sizeof(unsigned char*)); for (i = 0; i < mw->matrix.rows; i++) copy[i] = (unsigned char*) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) { if (!mw->matrix.cell_shadow_types[i][j]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "xbaeCopyCellShadowTypes", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in cellShadowTypes array", NULL, 0); copy[i][j] = XmSHADOW_OUT; } else copy[i][j] = mw->matrix.cell_shadow_types[i][j]; } } mw->matrix.cell_shadow_types = copy; } void xbaeCopyRowShadowTypes(mw) XbaeMatrixWidget mw; { unsigned char *copy = NULL; int i; if (mw->matrix.rows) { copy = (unsigned char *) XtMalloc(mw->matrix.rows * sizeof(unsigned char)); for (i = 0; i < mw->matrix.rows; i++) if (!mw->matrix.row_shadow_types[i]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "xbaeCopyRowShadowTypes", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in rowShadowTypes array", NULL, 0); copy[i] = XmSHADOW_OUT; } else copy[i] = mw->matrix.row_shadow_types[i]; } mw->matrix.row_shadow_types = copy; } void xbaeCopyColumnShadowTypes(mw) XbaeMatrixWidget mw; { unsigned char *copy = NULL; int i; if (mw->matrix.columns) { copy = (unsigned char *) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); for (i = 0; i < mw->matrix.columns; i++) if (!mw->matrix.column_shadow_types[i]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "xbaeCopyColumnShadowTypes", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in columnShadowTypes array", NULL, 0); copy[i] = XmSHADOW_OUT; } else copy[i] = mw->matrix.column_shadow_types[i]; } mw->matrix.column_shadow_types = copy; } void xbaeCopyCellUserData(mw) XbaeMatrixWidget mw; { XtPointer **copy = NULL; int i, j; if (mw->matrix.rows && mw->matrix.columns) { copy = (XtPointer **) XtMalloc(mw->matrix.rows * sizeof(XtPointer*)); for (i = 0; i < mw->matrix.rows; i++) copy[i] = (XtPointer*) XtMalloc(mw->matrix.columns * sizeof(XtPointer)); for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) copy[i][j] = mw->matrix.cell_user_data[i][j]; } mw->matrix.cell_user_data = copy; } void xbaeCopyRowUserData(mw) XbaeMatrixWidget mw; { XtPointer *copy = NULL; int i; if (mw->matrix.rows) { copy = (XtPointer *) XtMalloc(mw->matrix.rows * sizeof(XtPointer)); for (i = 0; i < mw->matrix.rows; i++) copy[i] = mw->matrix.row_user_data[i]; } mw->matrix.row_user_data = copy; } void xbaeCopyColumnUserData(mw) XbaeMatrixWidget mw; { XtPointer *copy = NULL; int i; if (mw->matrix.columns) { copy = (XtPointer *) XtMalloc(mw->matrix.columns * sizeof(XtPointer)); for (i = 0; i < mw->matrix.columns; i++) copy[i] = mw->matrix.column_user_data[i]; } mw->matrix.column_user_data = copy; } void xbaeCopyRowLabels(mw) XbaeMatrixWidget mw; { String *copy = NULL; int i; Boolean empty_label; if (mw->matrix.rows) { copy = (String *) XtMalloc(mw->matrix.rows * sizeof(String)); for (i = 0, empty_label = False; i < mw->matrix.rows; i++) if (empty_label || !mw->matrix.row_labels[i]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyRowLabels", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in rowLabels array", NULL, 0); copy[i] = XtNewString(""); empty_label = True; } else copy[i] = XtNewString(mw->matrix.row_labels[i]); } mw->matrix.row_labels = copy; } void xbaeCopyColumnLabels(mw) XbaeMatrixWidget mw; { String *copy = NULL; int i; Boolean empty_column; if (mw->matrix.columns) { copy = (String *) XtMalloc(mw->matrix.columns * sizeof(String)); mw->matrix.column_label_lines = (ColumnLabelLines) XtMalloc(mw->matrix.columns * sizeof(ColumnLabelLinesRec)); for (i = 0, empty_column = False; i < mw->matrix.columns; i++) if (empty_column || !mw->matrix.column_labels[i]) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyColumnLabels", "badValue", "XbaeMatrix", "XbaeMatrix: NULL entry found in columnLabels array", NULL, 0); copy[i] = XtNewString(""); empty_column = True; xbaeParseColumnLabel( copy[i], &mw->matrix.column_label_lines[i]); } else { copy[i] = XtNewString(mw->matrix.column_labels[i]); xbaeParseColumnLabel(mw->matrix.column_labels[i], &mw->matrix.column_label_lines[i]); } /* * Determine max number of lines in column labels */ mw->matrix.column_label_maxlines = mw->matrix.column_label_lines[0].lines; for (i = 1; i < mw->matrix.columns; i++) if (mw->matrix.column_label_lines[i].lines > mw->matrix.column_label_maxlines) mw->matrix.column_label_maxlines = mw->matrix.column_label_lines[i].lines; } mw->matrix.column_labels = copy; } void xbaeCopyColumnWidths(mw) XbaeMatrixWidget mw; { short *copy = NULL; int i; Boolean bad = False; if (mw->matrix.columns) { copy = (short *) XtMalloc(mw->matrix.columns * sizeof(short)); for (i = 0; i < mw->matrix.columns; i++) { if (!bad && mw->matrix.column_widths[i] == BAD_WIDTH) { bad = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyColumnWidths", "tooShort", "XbaeMatrix", "XbaeMatrix: Column widths array is too short", NULL, 0); copy[i] = 1; } else if (bad) copy[i] = 1; else copy[i] = mw->matrix.column_widths[i]; } } mw->matrix.column_widths = copy; } void xbaeCopyColumnMaxLengths(mw) XbaeMatrixWidget mw; { int *copy = NULL; int i; Boolean bad = False; if (mw->matrix.columns) { copy = (int *) XtMalloc(mw->matrix.columns * sizeof(int)); for (i = 0; i < mw->matrix.columns; i++) { if (!bad && mw->matrix.column_max_lengths[i] == BAD_MAXLENGTH) { bad = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyColumnMaxLengths", "tooShort", "XbaeMatrix", "XbaeMatrix: Column max lengths array is too short", NULL, 0); copy[i] = 1; } else if (bad) copy[i] = 1; else copy[i] = mw->matrix.column_max_lengths[i]; } } mw->matrix.column_max_lengths = copy; } void xbaeCopyColumnAlignments(mw) XbaeMatrixWidget mw; { unsigned char *copy = NULL; int i; Boolean bad = False; if (mw->matrix.columns) { copy = (unsigned char *) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); for (i = 0; i < mw->matrix.columns; i++) { if (!bad && mw->matrix.column_alignments[i] == BAD_ALIGNMENT) { bad = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyColumnAlignments", "tooShort", "XbaeMatrix", "XbaeMatrix: Column alignments array is too short", NULL, 0); copy[i] = XmALIGNMENT_BEGINNING; } else if (bad) copy[i] = XmALIGNMENT_BEGINNING; else copy[i] = mw->matrix.column_alignments[i]; } } mw->matrix.column_alignments = copy; } void xbaeCopyColumnButtonLabels(mw) XbaeMatrixWidget mw; { Boolean *copy = NULL; int i; if (mw->matrix.columns) { copy = (Boolean *) XtMalloc(mw->matrix.columns * sizeof(Boolean)); for (i = 0; i < mw->matrix.columns; i++) { copy[i] = mw->matrix.column_button_labels[i]; } } mw->matrix.column_button_labels = copy; } void xbaeCopyRowButtonLabels(mw) XbaeMatrixWidget mw; { Boolean *copy = NULL; int i; if (mw->matrix.rows) { copy = (Boolean *) XtMalloc(mw->matrix.rows * sizeof(Boolean)); for (i = 0; i < mw->matrix.rows; i++) { copy[i] = mw->matrix.row_button_labels[i]; } } mw->matrix.row_button_labels = copy; } void xbaeCopyColumnLabelAlignments(mw) XbaeMatrixWidget mw; { unsigned char *copy = NULL; int i; Boolean bad = False; if (mw->matrix.columns) { copy = (unsigned char *) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); for (i = 0; i < mw->matrix.columns; i++) { if (!bad && mw->matrix.column_label_alignments[i] == BAD_ALIGNMENT) { bad = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "copyColumnLabelAlignments", "tooShort", "XbaeMatrix", "XbaeMatrix: Column label alignments array is too short", NULL, 0); copy[i] = XmALIGNMENT_BEGINNING; } else if (bad) copy[i] = XmALIGNMENT_BEGINNING; else copy[i] = mw->matrix.column_label_alignments[i]; } } mw->matrix.column_label_alignments = copy; } void xbaeCopyColors(mw) XbaeMatrixWidget mw; { Pixel **copy = NULL; int i, j; Boolean badrow = False; Boolean badcol; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ copy = (Pixel **) XtMalloc(mw->matrix.rows * sizeof(Pixel *)); /* * Malloc an array of Pixels for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) copy[i] = (Pixel *) XtMalloc(mw->matrix.columns * sizeof(Pixel)); if (!mw->matrix.colors) { for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) copy[i][j] = mw->manager.foreground; } else for (i = 0; i < mw->matrix.rows; i++) { if (!badrow && !mw->matrix.colors[i]) { badrow = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget)mw), "copyCellColors", "tooShort", "XbaeMatrix", "XbaeMatrix: Cell ColorPixelTable is too short", NULL, 0); } badcol = badrow; for (j = 0; j < mw->matrix.columns; j++) { if (badcol || mw->matrix.colors[i][j] == BAD_PIXEL) { badcol = True; if (j > 0) copy[i][j] = copy[i][j-1] ; else if (i > 0) copy[i][j] = copy[i-1][j] ; else copy[i][j] = mw->manager.foreground; } else { copy[i][j] = mw->matrix.colors[i][j]; } } } } mw->matrix.colors = copy; } void xbaeCopyBackgrounds(mw) XbaeMatrixWidget mw; { Pixel **copy = NULL; int i, j; Boolean badrow = False; Boolean badcol; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ copy = (Pixel **) XtMalloc(mw->matrix.rows * sizeof(Pixel *)); /* * Malloc an array of Pixels for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) copy[i] = (Pixel *) XtMalloc(mw->matrix.columns * sizeof(Pixel)); if (!mw->matrix.cell_background) { for (i = 0; i < mw->matrix.rows; i++) { Boolean alt = (mw->matrix.alt_row_count && i >= (int)mw->matrix.fixed_rows) ? ( ((i - (int)mw->matrix.fixed_rows) / mw->matrix.alt_row_count) % 2) : False; /* * Assign the even and odd row colours appropriately. These * will be a copy of the core->background if they have not * been explicitly set but if they have, we want to * preserve the colours as they appear now */ for (j = 0; j < mw->matrix.columns; j++) copy[i][j] = (alt ? mw->matrix.odd_row_background : mw->matrix.even_row_background); } } else for (i = 0; i < mw->matrix.rows; i++) { if (!badrow && !mw->matrix.cell_background[i]) { badrow = True; XtAppWarningMsg( XtWidgetToApplicationContext((Widget)mw), "copyCellColors", "tooShort", "XbaeMatrix", "XbaeMatrix: Cell BackgroundPixelTable is too short", NULL, 0); } badcol = badrow; for (j = 0; j < mw->matrix.columns; j++) { if (badcol || mw->matrix.cell_background[i][j] == BAD_PIXEL) { badcol = True; if (j > 0) copy[i][j] = copy[i][j-1] ; else if (i > 0) copy[i][j] = copy[i-1][j] ; else copy[i][j] = mw->core.background_pixel; } else { copy[i][j] = mw->matrix.cell_background[i][j]; } } } } mw->matrix.cell_background = copy; } /* * Copy the selectedCells resource. Create a 2D array of Booleans to * represent selected cells if it is NULL. */ void xbaeCopySelectedCells(mw) XbaeMatrixWidget mw; { Boolean **copy = NULL; int i, j; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ mw->matrix.num_selected_cells = 0; copy = (Boolean **) XtMalloc(mw->matrix.rows * sizeof(Boolean *)); /* * Malloc an array of Booleans for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) copy[i] = (Boolean *) XtCalloc(mw->matrix.columns, sizeof(Boolean)); /* * If selected_cells is not NULL, copy the table passed in */ if (mw->matrix.selected_cells) for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) { copy[i][j] = mw->matrix.selected_cells[i][j]; if (mw->matrix.selected_cells[i][j]) mw->matrix.num_selected_cells++; } } mw->matrix.selected_cells = copy; } #if XmVersion >= 1002 /* * Copy the highlightedCells resource. Create a 2D array of Booleans to * represent highlighted cells if it is NULL. */ void xbaeCopyHighlightedCells(mw) XbaeMatrixWidget mw; { unsigned char **copy = NULL; int i, j; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ copy = (unsigned char **) XtMalloc(mw->matrix.rows * sizeof(Boolean *)); /* * Malloc an array of Booleans for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) copy[i] = (unsigned char *) XtCalloc(mw->matrix.columns, sizeof(Boolean)); /* * If highlighted_cells is not NULL, copy the table passed in */ if (mw->matrix.highlighted_cells) for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) copy[i][j] = mw->matrix.highlighted_cells[i][j]; } mw->matrix.highlighted_cells = copy; } #endif /* * Create a matrix of Pixels */ void xbaeCreateColors(mw) XbaeMatrixWidget mw; { int i; if (mw->matrix.rows && mw->matrix.columns) { /* * Malloc an array of row pointers */ mw->matrix.colors = (Pixel **) XtMalloc(mw->matrix.rows * sizeof(Pixel *)); /* * Malloc an array of Pixels for each row pointer */ for (i = 0; i < mw->matrix.rows; i++) mw->matrix.colors[i] = (Pixel *) XtMalloc(mw->matrix.columns * sizeof(Pixel)); } else mw->matrix.colors = NULL; } /* * Create a pixmap to be used for drawing the matrix contents when * XmNsensitive is set to False */ static Pixmap createInsensitivePixmap(mw) XbaeMatrixWidget mw; { static char stippleBits[] = { 0x01, 0x02 }; static Pixmap *stipple = NULL; Display *dpy = XtDisplay(mw); Screen *scr = XtScreen (mw); int i; int maxScreens = ScreenCount(dpy); if (!stipple) { stipple = (Pixmap *) XtMalloc(maxScreens*sizeof(Pixmap)); for (i = 0 ; i < maxScreens ; i++) stipple[i] = XCreatePixmapFromBitmapData( dpy, RootWindow(dpy,i), stippleBits, 2, 2, 0, 1, 1); } for (i = 0; i < maxScreens; i++) { if (ScreenOfDisplay(dpy, i) == scr) return stipple[i]; } return (Pixmap)NULL; } void xbaeCreateGridLineGC(mw) XbaeMatrixWidget mw; { XGCValues values; XtGCMask mask = GCForeground | GCBackground; values.foreground = mw->matrix.grid_line_color; values.background = mw->manager.foreground; /* * GC for drawing grid lines */ mw->matrix.grid_line_gc = XtGetGC((Widget) mw, mask, &values); /* * GC for drawing grid lines with clipping */ mw->matrix.cell_grid_line_gc = XCreateGC(XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); } void xbaeCreateDrawGC(mw) XbaeMatrixWidget mw; { XGCValues values; unsigned long mask = GCForeground | GCStipple; /* * GC for drawing cells. We create it instead of using a cached one, * since the foreground may change frequently. */ values.foreground = mw->manager.foreground; values.stipple = createInsensitivePixmap(mw); /* font id isn't used for fontsets */ if (mw->matrix.font_struct) { mask |= GCFont; values.font = mw->matrix.fid; } mw->matrix.draw_gc = XCreateGC(XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); } void xbaeCreatePixmapGC(mw) XbaeMatrixWidget mw; { XGCValues values; unsigned long mask = GCForeground | GCGraphicsExposures | GCStipple; values.foreground = mw->manager.foreground; values.graphics_exposures = False; values.stipple = createInsensitivePixmap(mw); mw->matrix.pixmap_gc = XCreateGC(XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); } void xbaeCreateLabelGC(mw) XbaeMatrixWidget mw; { XGCValues values; unsigned long mask = GCForeground | GCStipple; /* * GC for drawing labels */ values.foreground = mw->manager.foreground; values.stipple = createInsensitivePixmap(mw); /* font id isn't used for fontsets */ if (mw->matrix.label_font_struct) { mask |= GCFont; values.font = mw->matrix.label_fid; } mw->matrix.label_gc = XCreateGC(XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); } void xbaeCreateLabelClipGC(mw) XbaeMatrixWidget mw; { XGCValues values; unsigned long mask = GCForeground | GCStipple; /* * GC for drawing labels with clipping. */ values.foreground = mw->manager.foreground; values.stipple = createInsensitivePixmap(mw); /* font id isn't used for fontsets */ if (mw->matrix.label_font_struct) { mask |= GCFont; values.font = mw->matrix.label_fid; } mw->matrix.label_clip_gc = XCreateGC(XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); } void xbaeCreateTopShadowClipGC(mw) XbaeMatrixWidget mw; { XGCValues values; XtGCMask mask = GCForeground | GCBackground; /* * GC for drawing top shadow inside cells with clipping. */ values.foreground = mw->manager.top_shadow_color; values.background = mw->manager.foreground; if (mw->manager.top_shadow_pixmap != XmUNSPECIFIED_PIXMAP) { mask |= GCFillStyle | GCTile; values.fill_style = FillTiled; values.tile = mw->manager.top_shadow_pixmap; } mw->matrix.cell_top_shadow_clip_gc = XCreateGC( XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); mask |= GCFunction; values.function = GXxor; mw->matrix.resize_top_shadow_gc = XtGetGC( (Widget) mw, mask, &values); } void xbaeCreateBottomShadowClipGC(mw) XbaeMatrixWidget mw; { XGCValues values; XtGCMask mask = GCForeground | GCBackground; /* * GC for drawing bottom shadow inside cells with clipping. */ values.foreground = mw->manager.bottom_shadow_color; values.background = mw->manager.foreground; if (mw->manager.bottom_shadow_pixmap != XmUNSPECIFIED_PIXMAP) { mask |= GCFillStyle | GCTile; values.fill_style = FillTiled; values.tile = mw->manager.bottom_shadow_pixmap; } mw->matrix.cell_bottom_shadow_clip_gc = XCreateGC( XtDisplay(mw), GC_PARENT_WINDOW(mw), mask, &values); mask |= GCFunction; values.function = GXxor; mw->matrix.resize_bottom_shadow_gc = XtGetGC( (Widget) mw, mask, &values); } static short xbaeGetFontWidth(font_struct) XFontStruct *font_struct; { short width; unsigned long fp; unsigned char char_idx; /* * From the XmText man page: If the em-space value is * available, it is used. If not, the width of the numeral "0" * is used. If this is not available, the maximum width is used. */ if (XGetFontProperty(font_struct, XA_QUAD_WIDTH, &fp) && fp != 0) { width = (short) fp; } else { if (font_struct->min_char_or_byte2 <= '0' && font_struct->max_char_or_byte2 >= '0' && font_struct->per_char) { char_idx = '0' - font_struct->min_char_or_byte2; width = font_struct->per_char[char_idx].width; } else { width = font_struct->max_bounds.width; } } /* last safety check */ if (width <= 0) { width = 1; } return width; } void xbaeNewFont(mw) XbaeMatrixWidget mw; { XmFontContext context; XmFontListEntry font_list_entry; XmFontType type; XtPointer fontp; /* * Make a private copy of the FontList */ mw->matrix.font_list = XmFontListCopy(mw->matrix.font_list); /* * Get XmFontListEntry from FontList */ if (!XmFontListInitFontContext(&context, mw->matrix.font_list)) XtAppErrorMsg( XtWidgetToApplicationContext((Widget) mw), "newFont", "badFont", "XbaeMatrix", "XbaeMatrix: XmFontListInitFontContext failed, bad fontList", NULL, 0); if ((font_list_entry = XmFontListNextEntry(context)) == NULL) XtAppErrorMsg( XtWidgetToApplicationContext((Widget) mw), "newFont", "badFont", "XbaeMatrix", "XbaeMatrix: XmFontListNextEntry failed, no next fontList", NULL, 0); fontp = XmFontListEntryGetFont(font_list_entry, &type); if (type == XmFONT_IS_FONTSET) { XFontSetExtents *extents; mw->matrix.font_set = (XFontSet)fontp; mw->matrix.font_struct = (XFontStruct*)NULL; extents = XExtentsOfFontSet(mw->matrix.font_set); mw->matrix.font_width = extents->max_logical_extent.width; mw->matrix.font_height = extents->max_logical_extent.height; mw->matrix.font_y = extents->max_logical_extent.y; mw->matrix.fid = 0; /* not used for fontsets */ } else { XFontStruct *font_struct = (XFontStruct *)fontp; mw->matrix.font_set = (XFontSet)NULL; mw->matrix.font_struct = font_struct; mw->matrix.font_width = xbaeGetFontWidth(font_struct); mw->matrix.font_height = (font_struct->max_bounds.descent + font_struct->max_bounds.ascent); mw->matrix.font_y = -font_struct->max_bounds.ascent; mw->matrix.fid = font_struct->fid; } XmFontListFreeFontContext(context); } void xbaeNewLabelFont(mw) XbaeMatrixWidget mw; { XmFontContext context; XmFontListEntry font_list_entry; XmFontType type; XtPointer fontp; /* * Make a private copy of the FontList */ mw->matrix.label_font_list = XmFontListCopy(mw->matrix.label_font_list); /* * Get XmFontListEntry from FontList */ if (!XmFontListInitFontContext(&context, mw->matrix.label_font_list)) XtAppErrorMsg( XtWidgetToApplicationContext((Widget) mw), "newFont", "badLabelFont", "XbaeMatrix", "XbaeMatrix: XmFontListInitFontContext failed, bad labelFontList", NULL, 0); if ((font_list_entry = XmFontListNextEntry(context)) == NULL) XtAppErrorMsg( XtWidgetToApplicationContext((Widget) mw), "newFont", "badLabelFont", "XbaeMatrix", "XbaeMatrix: XmFontListNextEntry failed, no next fontList", NULL, 0); fontp = XmFontListEntryGetFont(font_list_entry, &type); if (type == XmFONT_IS_FONTSET) { XFontSetExtents *extents; mw->matrix.label_font_set = (XFontSet)fontp; mw->matrix.label_font_struct = (XFontStruct*)NULL; extents = XExtentsOfFontSet(mw->matrix.label_font_set); mw->matrix.label_font_width = extents->max_logical_extent.width; mw->matrix.label_font_height = extents->max_logical_extent.height; mw->matrix.label_font_y = extents->max_logical_extent.y; mw->matrix.label_fid = 0; /* not used for fontsets */ } else { XFontStruct *font_struct = (XFontStruct *)fontp; mw->matrix.label_font_set = (XFontSet)NULL; mw->matrix.label_font_struct = font_struct; mw->matrix.label_font_width = xbaeGetFontWidth(font_struct); mw->matrix.label_font_height = (font_struct->max_bounds.descent + font_struct->max_bounds.ascent); mw->matrix.label_font_y = -font_struct->max_bounds.ascent; mw->matrix.label_fid = font_struct->fid; } XmFontListFreeFontContext(context); } void xbaeFreeCells(mw) XbaeMatrixWidget mw; { int i, j; if (!mw->matrix.cells) return; /* * Free each cell in a row, then free the row and go to the next one */ for (i = 0; i < mw->matrix.rows; i++) { for (j = 0; j < mw->matrix.columns; j++) XtFree((XtPointer) mw->matrix.cells[i][j]); XtFree((XtPointer) mw->matrix.cells[i]); } /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.cells); mw->matrix.cells = NULL; } #if CELL_WIDGETS void xbaeFreeCellWidgets(mw) XbaeMatrixWidget mw; { int i, j; if (!mw->matrix.cell_widgets) return; /* * Free each cell in a row, then free the row and go to the next one */ for (i = 0; i < mw->matrix.rows; i++) { for (j = 0; j < mw->matrix.columns; j++) XtFree((XtPointer) mw->matrix.cell_widgets[i][j]); XtFree((XtPointer) mw->matrix.cell_widgets[i]); } /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.cell_widgets); mw->matrix.cell_widgets = NULL; } #endif void xbaeFreeRowLabels(mw) XbaeMatrixWidget mw; { int i; if (!mw->matrix.row_labels) return; for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.row_labels[i]); XtFree((XtPointer) mw->matrix.row_labels); mw->matrix.row_labels = NULL; } void xbaeFreeColumnLabels(mw) XbaeMatrixWidget mw; { int i; if (!mw->matrix.column_labels) return; for (i = 0; i < mw->matrix.columns; i++) { XtFree((XtPointer) mw->matrix.column_labels[i]); XtFree((XtPointer) mw->matrix.column_label_lines[i].lengths); } XtFree((XtPointer) mw->matrix.column_label_lines); XtFree((XtPointer) mw->matrix.column_labels); mw->matrix.column_labels = NULL; } void xbaeFreeColors(mw) XbaeMatrixWidget mw; { int i; if (!mw->matrix.colors) return; /* * Free each row of Pixels */ for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.colors[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.colors); mw->matrix.colors = NULL; } void xbaeFreeBackgrounds(mw) XbaeMatrixWidget mw; { int i; if (!mw->matrix.cell_background) return; /* * Free each row of Pixels */ for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.cell_background[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.cell_background); mw->matrix.cell_background = NULL; } void xbaeFreeSelectedCells(mw) XbaeMatrixWidget mw; { int i; /* * Free each row of XtPointer pointers */ if (!mw->matrix.selected_cells) return; for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.selected_cells[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.selected_cells); mw->matrix.selected_cells = NULL; } #if XmVersion >= 1002 void xbaeFreeHighlightedCells(mw) XbaeMatrixWidget mw; { int i; if (!mw->matrix.highlighted_cells) return; /* * Free each row of XtPointer pointers */ for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.highlighted_cells[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.highlighted_cells); mw->matrix.highlighted_cells = NULL; } #endif void xbaeFreeCellUserData(mw) XbaeMatrixWidget mw; { if (mw->matrix.cell_user_data) { int i; /* * Free each row of Booleans */ for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.cell_user_data[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.cell_user_data); } mw->matrix.cell_user_data = NULL; } void xbaeFreeCellShadowTypes(mw) XbaeMatrixWidget mw; { if (mw->matrix.cell_shadow_types) { int i; /* * Free each row of unsigned char pointers */ for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.cell_shadow_types[i]); /* * Free the array of row pointers */ XtFree((XtPointer) mw->matrix.cell_shadow_types); } mw->matrix.cell_shadow_types = NULL; } grace-5.1.23/Xbae/Xbae/Actions.c0000644000076500001440000014730006766327620015755 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Actions.c,v 1.1 1999/09/11 01:25:36 fnevgeny Exp $ */ /* * Actions.c created by Andrew Lister (7 August, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #if XmVersion > 1001 #include #endif #include #include #include #include #include #include #include #include #include #ifndef XlibSpecificationRelease #define XrmPermStringToQuark XrmStringToQuark #endif #if !defined(DRAW_RESIZE_LINE) && !defined(DRAW_RESIZE_SHADOW) /* One of DRAW_RESIZE_LINE and DRAW_RESIZE_SHADOW must be defined. */ #define DRAW_RESIZE_SHADOW #endif #ifndef DEFAULT_SCROLL_SPEED #define DEFAULT_SCROLL_SPEED 500 #endif typedef struct { XbaeMatrixWidget mw; GC gc; int row; int column; int startx; int lastx; int currentx; int y, height; short *columnWidths; Boolean grabbed; Boolean haveVSB; } XbaeMatrixResizeColumnStruct; typedef struct { XbaeMatrixWidget mw; int row; int column; Boolean pressed; Boolean grabbed; } XbaeMatrixButtonPressedStruct; typedef struct { XbaeMatrixWidget mw; XbaeClipWidget cw; XEvent *event; XtIntervalId timerID; XtAppContext app_context; unsigned long interval; Boolean inClip; Boolean grabbed; Boolean above; Boolean below; Boolean left; Boolean right; } XbaeMatrixScrollStruct; static int DoubleClick P((XbaeMatrixWidget, XEvent *, int, int)); static void DrawSlideColumn P((XbaeMatrixWidget, int)); static void SlideColumn P((Widget, XtPointer, XEvent *, Boolean *)); static void PushButton P((Widget, XtPointer, XEvent *, Boolean *)); static void updateScroll P((XtPointer)); static void checkScrollValues P((Widget, XtPointer, XEvent *, Boolean *)); static void callSelectCellAction P((XbaeMatrixWidget, XEvent *)); static int last_row = 0; static int last_column = 0; static int last_selected_row = 0; static int last_selected_column = 0; static Boolean scrolling = False; /* ARGSUSED */ void xbaeDefaultActionACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; int x, y; int row, column; CellType cell; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "defaultActionACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to DefaultAction action", NULL, 0); return; } if (!mw->matrix.default_action_callback) return; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; if (!xbaeXYToRowCol(mw, &x, &y, &row, &column, cell)) return; if (DoubleClick(mw, event, row, column)) { XbaeMatrixDefaultActionCallbackStruct call_data; call_data.reason = XbaeDefaultActionReason; call_data.event = event; call_data.row = row; call_data.column = column; XtCallCallbackList((Widget)mw, mw->matrix.default_action_callback, (XtPointer)&call_data); } } static void DrawSlideColumn(mw, x) XbaeMatrixWidget mw; int x; { #ifdef DRAW_RESIZE_SHADOW /* These values derived through that age-old process * of what looks good to me */ #define SHADOW_WIDTH 2 #define RESIZE_COLUMN_LINE_WIDTH 4 Dimension width = RESIZE_COLUMN_LINE_WIDTH; Dimension shadow_width = SHADOW_WIDTH; #endif Dimension height; Window win; Display *display = XtDisplay(mw); int column = xbaeXtoCol(mw, x - COLUMN_LABEL_OFFSET(mw)); int top, bottom; int adjusted_x; int y; #ifdef DRAW_RESIZE_LINE GC gc = mw->matrix.draw_gc; #endif Boolean need_vert_dead_space_fill = NEED_VERT_DEAD_SPACE_FILL(mw); unsigned int clip_reason; /* * If the column being resized is a fixed one then we don't need to * bother with the clip region */ if (column < (int)mw->matrix.fixed_columns) { y = ROW_LABEL_OFFSET(mw); height = VISIBLE_HEIGHT(mw) + FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw); win = XtWindow (mw); if (need_vert_dead_space_fill) height += VERT_DEAD_SPACE_HEIGHT(mw); #ifdef DRAW_RESIZE_LINE XDrawLine(display, win, gc, x, y, x, y + height); if (XtIsManaged(LeftClip(mw))) XDrawLine(display, XtWindow(LeftClip(mw)), gc, x - COLUMN_LABEL_OFFSET(mw), 0, x - COLUMN_LABEL_OFFSET(mw), LeftClip(mw)->core.height); #endif #ifdef DRAW_RESIZE_SHADOW DRAW_SHADOW(display, win, mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, x, y, width, height, XmSHADOW_OUT); if (XtIsManaged(LeftClip(mw))) DRAW_SHADOW(display, XtWindow(LeftClip(mw)), mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, x - COLUMN_LABEL_OFFSET(mw), 0, width, LeftClip(mw)->core.height, XmSHADOW_OUT); #endif return; } /* * Similarly for trailingFixedColumns - beware going off the clip child * here also */ if (column >= TRAILING_HORIZ_ORIGIN(mw) || x >= (int)(ClipChild(mw)->core.x + ClipChild(mw)->core.width)) { y = ROW_LABEL_OFFSET(mw); height = VISIBLE_HEIGHT(mw) + FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw); win = XtWindow(mw); if (need_vert_dead_space_fill) height += VERT_DEAD_SPACE_HEIGHT(mw); #ifdef DRAW_RESIZE_LINE XDrawLine(display, win, gc, x, y, x, y + height); if (XtIsManaged(RightClip(mw))) XDrawLine(display, XtWindow(RightClip(mw)), gc, x - TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw), 0, x - TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw), RightClip(mw)->core.height); #endif #ifdef DRAW_RESIZE_SHADOW DRAW_SHADOW(display, win, mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, x, y, width, height, XmSHADOW_OUT); if (XtIsManaged(RightClip(mw))) DRAW_SHADOW(display, XtWindow(RightClip(mw)), mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, x - TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw), 0, width, RightClip(mw)->core.height, XmSHADOW_OUT); #endif return; } xbaeGetVisibleRows(mw, &top, &bottom); /* * we need all non-fixed rows, so add 1 to bottom * to include the last one as the return values * are inclusive */ bottom += 1; /* * The area between top and bottom rows are the non fixed rows. They * fall on the ClipChild */ y = -mw->matrix.cell_shadow_thickness; /* relative to clip */ height = ROW_HEIGHT(mw) * (bottom - top) + 2 * mw->matrix.cell_shadow_thickness; /* * If we are on the clip, the x location is offset by the * fixed column width, label offset and label width */ adjusted_x = x - FIXED_COLUMN_LABEL_OFFSET(mw); win = XtWindow(ClipChild(mw)); #ifdef DRAW_RESIZE_LINE XDrawLine(display, win, gc, adjusted_x, y, adjusted_x, y + height); #endif #ifdef DRAW_RESIZE_SHADOW DRAW_SHADOW(display, win, mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, adjusted_x, y, width, height, XmSHADOW_OUT); #endif /* * Now draw the line (or shadow) on the non clipped region - that is * the fixed and trailingFixed rows. First, do the leading rows. */ if (mw->matrix.fixed_rows) { y = ROW_LABEL_OFFSET(mw); height = FIXED_ROW_HEIGHT(mw) + 2 * mw->matrix.cell_shadow_thickness; win = XtWindow(mw); xbaeSetClipMask(mw, CLIP_FIXED_ROWS); #ifdef DRAW_RESIZE_LINE if (XtIsManaged(TopClip(mw))) XDrawLine(display, XtWindow(TopClip(mw)), gc, adjusted_x, -mw->matrix.cell_shadow_thickness, adjusted_x, height); #endif #ifdef DRAW_RESIZE_SHADOW if (XtIsManaged(TopClip(mw))) DRAW_SHADOW(display, XtWindow(TopClip(mw)), mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, adjusted_x, -mw->matrix.cell_shadow_thickness, width, height, XmSHADOW_OUT); #endif xbaeSetClipMask(mw, CLIP_NONE); } /* * The trailingFixedRows */ if (mw->matrix.trailing_fixed_rows) { y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); height = TRAILING_FIXED_ROW_HEIGHT(mw) + 2 * mw->matrix.cell_shadow_thickness; clip_reason = CLIP_TRAILING_FIXED_ROWS; if (IS_LEADING_FIXED_COLUMN(mw, column)) clip_reason |= CLIP_FIXED_COLUMNS; else if (IS_TRAILING_FIXED_COLUMN(mw, column)) clip_reason |= CLIP_TRAILING_FIXED_COLUMNS; xbaeSetClipMask(mw, clip_reason); #ifdef DRAW_RESIZE_LINE if (XtIsManaged(BottomClip(mw))) XDrawLine(display, XtWindow(BottomClip(mw)), gc, adjusted_x, -mw->matrix.cell_shadow_thickness, adjusted_x, height); #endif #ifdef DRAW_RESIZE_SHADOW if (XtIsManaged(BottomClip(mw))) DRAW_SHADOW(display, XtWindow(BottomClip(mw)), mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, adjusted_x, -mw->matrix.cell_shadow_thickness, width, height, XmSHADOW_OUT); #endif xbaeSetClipMask(mw, CLIP_NONE); } if ((NEED_VERT_FILL(mw) && (! HAS_ATTACHED_TRAILING_ROWS(mw))) || need_vert_dead_space_fill) { if (need_vert_dead_space_fill) { y = UNATTACHED_TRAILING_ROWS_OFFSET(mw) - mw->matrix.cell_shadow_thickness; height = 2 * mw->matrix.cell_shadow_thickness + VERT_DEAD_SPACE_HEIGHT(mw); } else { y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw) + TRAILING_FIXED_ROW_HEIGHT(mw); height = FILL_VERT_HEIGHT(mw) - HORIZ_SB_SPACE(mw); } #ifdef DRAW_RESIZE_LINE XDrawLine(display, XtWindow(mw), gc, adjusted_x, y, adjusted_x, height); #endif #ifdef DRAW_RESIZE_SHADOW DRAW_SHADOW(display, XtWindow(mw), mw->matrix.resize_top_shadow_gc, mw->matrix.resize_bottom_shadow_gc, shadow_width, x, y, width, height, XmSHADOW_OUT); #endif } } static void SlideColumn(w, data, event, cont) Widget w; XtPointer data; XEvent *event; Boolean *cont; { XbaeMatrixResizeColumnStruct *rd = (XbaeMatrixResizeColumnStruct *)data; XMotionEvent *motionEvent; Boolean relayout = False; int numCharacters; int i; if (event->type == ButtonRelease) { DrawSlideColumn(rd->mw, rd->lastx); XUngrabPointer(XtDisplay(w), CurrentTime); rd->grabbed = False; /* * Remanage the VSB if we unmapped it earlier */ if (rd->haveVSB) XtManageChild(VertScrollChild(rd->mw)); if (rd->mw->matrix.resize_column_callback) { XbaeMatrixResizeColumnCallbackStruct call_data; call_data.reason = XbaeResizeColumnReason; call_data.event = event; call_data.row = rd->row; call_data.column = rd->column - 1; call_data.which = rd->column - 1; call_data.columns = rd->mw->matrix.columns; call_data.column_widths = rd->columnWidths; XtCallCallbackList ((Widget)rd->mw, rd->mw->matrix.resize_column_callback, (XtPointer)&call_data); } for (i = 0; i < rd->mw->matrix.columns; i++) if (rd->columnWidths[i] != rd->mw->matrix.column_widths[i]) { /* Make sure everything is handled correctly with SetValues */ XtVaSetValues((Widget)rd->mw, XmNcolumnWidths, rd->columnWidths, NULL); break; } /* * If maxColumnLengths are set and we have resized the column to * larger, reset the corresponding maxColumnLength */ if (rd->mw->matrix.column_max_lengths && rd->columnWidths[rd->column - 1] > rd->mw->matrix.column_max_lengths[rd->column - 1]) rd->mw->matrix.column_max_lengths[rd->column - 1] = rd->columnWidths[rd->column - 1]; XtFree((char *)rd->columnWidths); return; } if (event->type != MotionNotify) /* Double check! */ return; motionEvent = (XMotionEvent *)event; if (rd->currentx - motionEvent->x > FONT_WIDTH(rd->mw)) { /* If we're only one character wide, we cannae get any smaller */ if (rd->columnWidths[rd->column - 1] == BAD_WIDTH + 1) return; /* * Moved left a full character - update the column widths and force * a redisplay */ numCharacters = (rd->currentx - motionEvent->x) / FONT_WIDTH(rd->mw); if (numCharacters >= rd->columnWidths[rd->column - 1]) /* Must keep a column at least one character wide */ numCharacters = rd->columnWidths[rd->column - 1] - 1; rd->columnWidths[rd->column - 1] -= numCharacters; rd->currentx -= numCharacters * FONT_WIDTH(rd->mw); relayout = True; } if (motionEvent->x - rd->currentx > FONT_WIDTH(rd->mw)) { /* * Moved right a full character - update the column widths and force * a redisplay */ numCharacters = (motionEvent->x - rd->currentx) / FONT_WIDTH(rd->mw); rd->columnWidths[rd->column - 1] += numCharacters; rd->currentx += numCharacters * FONT_WIDTH(rd->mw); relayout = True; } if (relayout) { /* Draw the marker line in the new location */ if (rd->lastx != rd->currentx) { DrawSlideColumn(rd->mw, rd->currentx); DrawSlideColumn(rd->mw, rd->lastx); rd->lastx = rd->currentx; } } } /* ARGSUSED */ void xbaeResizeColumnsACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; int x, y; int eventx; int i; int row, column; CellType cell; static Cursor cursor; XbaeMatrixResizeColumnStruct resizeData; XGCValues values; XtAppContext appcontext; #ifdef DRAW_RESIZE_LINE XGCValues save; #endif unsigned long gcmask, event_mask; Display *display = XtDisplay(w); #define FUZZ_FACTOR 3 int fuzzy = FUZZ_FACTOR; #undef FUZZ_FACTOR /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "resizeColumnsACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to ResizeColumns action", NULL, 0); return; } /* * If we won't allow dynamic column resize, leave. */ if (!mw->matrix.allow_column_resize) return; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; eventx = x; if (!xbaeXYToRowCol(mw, &x, &y, &row, &column, cell)) return; /* * Calculate if the x and y of the middle button event is on * a column border. Allow the width of the shadow to be the * allowed delta. x is modified in xbaeXYToRowCol() to be * the x distance from the cell's border */ if ((int)mw->matrix.cell_shadow_thickness > fuzzy) fuzzy = mw->matrix.cell_shadow_thickness; if (x > fuzzy && COLUMN_WIDTH(mw, column) - x > fuzzy) return; /* * Looks like we hit a column border, determine the column that is * intended to be resized */ if ((COLUMN_WIDTH(mw, column) - x) <= fuzzy) column++; /* Can't adjust the origin or should you be able to?? */ if (column == 0) return; /* * Make it here and it's time to start the fun stuff! */ /* Create the left / right cursor */ if (!cursor) cursor = XCreateFontCursor(display, XC_sb_h_double_arrow); /* Commit any edit in progress and unmap the text field - it's just bad luck */ (*((XbaeMatrixWidgetClass)XtClass(mw))->matrix_class.commit_edit) (mw, event, True); /* * Redraw the cell that had the text field in it or it might stay blank */ xbaeDrawCell(mw, mw->matrix.current_row, mw->matrix.current_column); /* * Say goodbye to the Vertical ScrollBar -> it only gets in the way! */ if ((resizeData.haveVSB = XtIsManaged(VertScrollChild(mw)) && ((mw->matrix.scrollbar_placement == XmTOP_RIGHT) || (mw->matrix.scrollbar_placement == XmBOTTOM_RIGHT)))) XtUnmanageChild(VertScrollChild(mw)); /* * Flush the commit events out to the server. Otherwise, our changes * to the GCs below have a bad effect. */ XSync(display, False); event_mask = PointerMotionMask | ButtonReleaseMask; XtAddEventHandler(w, event_mask, True, (XtEventHandler)SlideColumn, (XtPointer)&resizeData); XGrabPointer(display, XtWindow(w), True, event_mask, GrabModeAsync, GrabModeAsync, XtWindow((Widget)mw), cursor, CurrentTime); /* Copy the columnWidth array */ resizeData.columnWidths = (short *)XtMalloc(mw->matrix.columns * sizeof(short)); for (i = 0; i < mw->matrix.columns; i++) resizeData.columnWidths[i] = mw->matrix.column_widths[i]; resizeData.grabbed = True; resizeData.mw = mw; resizeData.column = column; resizeData.startx = resizeData.currentx = resizeData.lastx = event->xbutton.x; gcmask = GCForeground | GCBackground | GCFunction; values.function = GXxor; #ifdef DRAW_RESIZE_LINE XGetGCValues(display, mw->matrix.draw_gc, gcmask, &save); values.foreground = values.background = save.background; XChangeGC(display, mw->matrix.draw_gc, gcmask, &values); #endif DrawSlideColumn(mw, resizeData.currentx); appcontext = XtWidgetToApplicationContext(w); while (resizeData.grabbed) XtAppProcessEvent(appcontext, XtIMAll); XtRemoveEventHandler(w, event_mask, True, (XtEventHandler)SlideColumn, (XtPointer)&resizeData); #ifdef DRAW_RESIZE_LINE XSetFunction(display, mw->matrix.draw_gc, GXcopy); #endif } /* * Action to process a drag out */ /* ARGSUSED */ void xbaeProcessDragACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { #if XmVersion > 1001 XbaeMatrixWidget mw; int x, y; int row, column; CellType cell; XbaeMatrixProcessDragCallbackStruct call_data; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "processDragACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to ProcessDrag action", NULL, 0); return; } if (!mw->matrix.process_drag_callback) return; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; if (!xbaeXYToRowCol(mw, &x, &y, &row, &column, cell)) return; call_data.reason = XbaeProcessDragReason; call_data.event = event; call_data.row = row; call_data.column = column; if (mw->matrix.draw_cell_callback) { Pixel bgcolor, fgcolor; int width, height, depth; call_data.type = xbaeGetDrawCellValue( mw, row, column, &call_data.string, &call_data.pixmap, &call_data.mask, &width, &height, &bgcolor, &fgcolor, &depth); } else call_data.string = mw->matrix.cells ? mw->matrix.cells[row][column] : ""; call_data.num_params = *nparams; call_data.params = params; XtCallCallbackList((Widget)mw, mw->matrix.process_drag_callback, (XtPointer)&call_data); #endif } /* * Action to edit a non-fixed cell. */ /* ARGSUSED */ void xbaeEditCellACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; int row, column; XrmQuark q; static XrmQuark QPointer, QLeft, QRight, QUp, QDown; static Boolean haveQuarks = False; /* * Get static quarks for the parms we understand */ if (!haveQuarks) { QPointer = XrmPermStringToQuark("Pointer"); QLeft = XrmPermStringToQuark("Left"); QRight = XrmPermStringToQuark("Right"); QUp = XrmPermStringToQuark("Up"); QDown = XrmPermStringToQuark("Down"); haveQuarks = True; } /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "editCellACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to EditCell action", NULL, 0); return; } /* * Make sure we have a single parm */ if (*nparams != 1) { XtAppWarningMsg( XtWidgetToApplicationContext(w), "editCellACT", "badParms", "XbaeMatrix", "XbaeMatrix: Wrong params passed to EditCell action, needs 1", NULL, 0); return; } /* * Initialize row/column to the current position */ row = mw->matrix.current_row; column = mw->matrix.current_column; /* * Quarkify the string param */ q = XrmStringToQuark(params[0]); /* * If we aren't currently editing, then the only kind of traversal that * makes sense is pointer. */ if (!XtIsManaged(TextChild(mw)) && q != QPointer) return; if (q == QPointer) { CellType cellType = NonFixedCell; int x, y; /* * Get the x,y point coordinate relative to the Clip window. * Return if this event did not occur in the Clip subwindow * (since we can only edit non-fixed cells). */ switch(event->type) { case ButtonPress: case ButtonRelease: x = event->xbutton.x; y = event->xbutton.y; break; case KeyPress: case KeyRelease: x = event->xkey.x; y = event->xkey.y; break; case MotionNotify: x = event->xmotion.x; y = event->xmotion.y; break; default: return; } if (event->xbutton.subwindow == XtWindow(ClipChild(mw))) { x -= FIXED_COLUMN_LABEL_OFFSET(mw); y -= FIXED_ROW_LABEL_OFFSET(mw); cellType = NonFixedCell; } else if (event->xbutton.window != XtWindow(ClipChild(mw))) { if (!mw->matrix.traverse_fixed) return; cellType = FixedCell; } /* * Convert the point to a row,column. If it does not pick a valid * cell, then return. */ if (!xbaeXYToRowCol(mw, &x, &y, &row, &column, cellType)) return; } else if (q == QRight) { /* * If we are in the lower right corner, stay there. * Otherwise move over a column. If we move off to the right of the * final column to which traversing is allowed then move down a row * and back to the first column to which traversing is allowed. */ if (!mw->matrix.traverse_fixed) { /* check scrollable boundary */ if (mw->matrix.current_row != TRAILING_VERT_ORIGIN(mw) - 1 || mw->matrix.current_column != TRAILING_HORIZ_ORIGIN(mw) - 1) { column++; if (IS_TRAILING_FIXED_COLUMN(mw, column)) { column = mw->matrix.fixed_columns; row++; } } } else { /* check matrix boundary */ if (mw->matrix.current_row != mw->matrix.rows - 1 || mw->matrix.current_column != mw->matrix.columns - 1) { column++; if (column >= mw->matrix.columns) { column = 0; row++; } } } } else if (q == QLeft) { /* * If we are in the upper left corner, stay there. * Otherwise move back a column. If we move before the first column * to which traversing is allowed, move up a row and over to the last * column to which traversing is allowed. */ if (!mw->matrix.traverse_fixed) { /* check scrollable boundary */ if (mw->matrix.current_row != mw->matrix.fixed_rows || mw->matrix.current_column != mw->matrix.fixed_columns) { column--; if (IS_LEADING_FIXED_COLUMN(mw, column)) { column = TRAILING_HORIZ_ORIGIN(mw) - 1; row--; } } } else { if (mw->matrix.current_row != 0 || mw->matrix.current_column != 0) { column--; if (column < 0) { column = mw->matrix.columns - 1; row--; } } } } else if (q == QDown) { row++; /* adjust row for allowable traversable regions */ if (!mw->matrix.traverse_fixed) { if (IS_TRAILING_FIXED_ROW(mw, row)) row = mw->matrix.fixed_rows; } else { if (row >= mw->matrix.rows) row = 0; } } else if (q == QUp) { row--; if (!mw->matrix.traverse_fixed) { if (IS_LEADING_FIXED_ROW(mw, row)) row = TRAILING_VERT_ORIGIN(mw) - 1; } else { if (row < 0) row = mw->matrix.rows - 1; } } /* * Call the traverseCellCallback to allow the application to * perform custom traversal. */ if (mw->matrix.traverse_cell_callback) { XbaeMatrixTraverseCellCallbackStruct call_data; call_data.reason = XbaeTraverseCellReason; call_data.event = event; call_data.row = mw->matrix.current_row; call_data.column = mw->matrix.current_column; call_data.next_row = row; call_data.next_column = column; call_data.fixed_rows = mw->matrix.fixed_rows; call_data.fixed_columns = mw->matrix.fixed_columns; call_data.trailing_fixed_rows = mw->matrix.trailing_fixed_rows; call_data.trailing_fixed_columns = mw->matrix.trailing_fixed_columns; call_data.num_rows = mw->matrix.rows; call_data.num_columns = mw->matrix.columns; call_data.param = params[0]; call_data.qparam = q; XtCallCallbackList((Widget)mw, mw->matrix.traverse_cell_callback, (XtPointer)&call_data); row = call_data.next_row; column = call_data.next_column; } /* * Attempt to edit the new cell using the edit_cell method. * If we are editing a cell based on pointer position, we always * call edit_cell. Otherwise, we must be editing a new cell to * call edit_cell. */ if (q == QPointer || (row != mw->matrix.current_row || column != mw->matrix.current_column)) (*((XbaeMatrixWidgetClass)XtClass(mw))->matrix_class.edit_cell) (mw, event, row, column, params, *nparams); /* * Traverse to the textField */ (void)XmProcessTraversal(TextChild(mw), XmTRAVERSE_CURRENT); } /* * Action to unmap the textField and discard any edits made */ /* ARGSUSED */ void xbaeCancelEditACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; Boolean unmap; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "cancelEditACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to CancelEdit action", NULL, 0); return; } /* * Make sure we have a single param */ if (*nparams != 1) { XtAppWarningMsg( XtWidgetToApplicationContext(w), "cancelEditACT", "badParms", "XbaeMatrix", "XbaeMatrix: Wrong params passed to CancelEdit action, needs 1", NULL, 0); return; } /* * Validate our param */ if (!strcmp(params[0], "True")) unmap = True; else if (!strcmp(params[0], "False")) unmap = False; else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "cancelEditACT", "badParm", "XbaeMatrix", "XbaeMatrix: Bad parameter for CancelEdit action", NULL, 0); return; } /* * Call the cancel_edit method */ (*((XbaeMatrixWidgetClass)XtClass(mw))->matrix_class.cancel_edit) (mw, unmap); } /* * Action save any edits made and unmap the textField if params[0] is True */ /* ARGSUSED */ void xbaeCommitEditACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; Boolean unmap; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "commitEditACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to CommitEdit action", NULL, 0); return; } /* * Make sure we have a single param */ if (*nparams != 1) { XtAppWarningMsg( XtWidgetToApplicationContext(w), "commitEditACT", "badParms", "XbaeMatrix", "XbaeMatrix: Wrong params for CommitEdit action, needs 1", NULL, 0); return; } /* * Validate our param */ if (!strcmp(params[0], "True")) unmap = True; else if (!strcmp(params[0], "False")) unmap = False; else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "commitEditACT", "badParm", "XbaeMatrix", "XbaeMatrix: Bad parameter for CommitEdit action", NULL, 0); return; } (void)(*((XbaeMatrixWidgetClass)XtClass(mw))->matrix_class.commit_edit) (mw, event, unmap); } static int DoubleClick(mw, event, row, column) XbaeMatrixWidget mw; XEvent *event; int row; int column; { /* A double click in this instance is two clicks in the same cell in a time period < double_click_interval */ Time current_time; unsigned long delta; static int ret = 0; if (event->type == ButtonRelease) { /* If the button is released, store the current location and time - next time through, if it's a button press event, we check for double click */ mw->matrix.last_row = row; mw->matrix.last_column = column; if (ret) /* just had a double click */ mw->matrix.last_click_time = (Time)0; else mw->matrix.last_click_time = event->xbutton.time; ret = 0; return ret; } current_time = event->xbutton.time; delta = current_time - mw->matrix.last_click_time; if (row == mw->matrix.last_row && column == mw->matrix.last_column && delta < (unsigned long)mw->matrix.double_click_interval) ret = 1; else ret = 0; return ret; } /*ARGSUSED*/ static void PushButton(w, data, event, cont) Widget w; XtPointer data; XEvent *event; Boolean *cont; { XbaeMatrixButtonPressedStruct *button = (XbaeMatrixButtonPressedStruct *)data; XMotionEvent *motionEvent; int x, y; int row, column; Boolean pressed = button->pressed; CellType cell; if (event->type == ButtonRelease) { button->grabbed = False; XtRemoveGrab(w); scrolling = False; if (button->pressed) { /* If the button is still pressed, it has been released in the same button that was pressed. "Unpress" it and call the callbacks */ if (button->column == -1) xbaeDrawRowLabel(button->mw, button->row, False); else if (button->row == -1) xbaeDrawColumnLabel(button->mw, button->column, False); if (button->mw->matrix.label_activate_callback) { XbaeMatrixLabelActivateCallbackStruct call_data; call_data.reason = XbaeLabelActivateReason; call_data.event = event; call_data.row_label = (button->column == -1); call_data.row = button->row; call_data.column = button->column; if (button->column == -1) call_data.label = button->mw->matrix.row_labels[button->row]; else call_data.label = button->mw->matrix.column_labels[button->column]; XtCallCallbackList((Widget)button->mw, button->mw->matrix.label_activate_callback, (XtPointer)&call_data); } } return; } if (event->type != MotionNotify) /* We want to be sure about this! */ return; motionEvent = (XMotionEvent *)event; x = motionEvent->x; y = motionEvent->y; if (!xbaeEventToXY(button->mw, event, &x, &y, &cell)) return; if (xbaeXYToRowCol(button->mw, &x, &y, &row, &column, cell)) /* Moved off the labels */ pressed = False; else { if (button->column != column || button->row != row) /* Moved out of the button that was originally pressed */ pressed = False; else if (button->column == column || button->row == row) pressed = True; } /* If the status of whether or not the button should be pressed has changed, redraw the appropriate visual */ if (pressed != button->pressed) { if (button->column == -1) xbaeDrawRowLabel(button->mw, button->row, pressed); else if (button->row == -1) xbaeDrawColumnLabel(button->mw, button->column, pressed); /* And set our struct's pressed member to the current setting */ button->pressed = pressed; } } /*ARGSUSED*/ void xbaeHandleClick(w, data, event, cont) Widget w; XtPointer data; XEvent *event; Boolean *cont; { XbaeMatrixWidget mw = (XbaeMatrixWidget)data; int x, y; CellType cell; int row, column; Boolean translation; /* if we have a double click and a callback - break out! */ if (event->type != ButtonPress && event->type != ButtonRelease) return; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; translation = xbaeXYToRowCol(mw, &x, &y, &row, &column, cell); if (!translation && (mw->matrix.button_labels || (row == -1 && mw->matrix.column_button_labels && mw->matrix.column_button_labels[column]) || (column == -1 && mw->matrix.row_button_labels && mw->matrix.row_button_labels[row])) && ((row == -1) ^ (column == -1))) { unsigned long event_mask; XtAppContext appcontext; XbaeMatrixButtonPressedStruct button; /* If the row and column are invalid, return. If it is ButtonRelease event, also return - the ButtonRelease events are handled in the event handler loop below */ if (event->type != ButtonPress) return; if (column == -1 && event->type == ButtonPress) /* row label */ xbaeDrawRowLabel(mw, row, True); else if (row == -1 && event->type == ButtonPress) /* Column label */ xbaeDrawColumnLabel(mw, column, True); /* Action stations! */ event_mask = ButtonReleaseMask | PointerMotionMask; scrolling = True; XtAddGrab(w, True, False); /* Copy the data needed to be passed to the event handler */ button.mw = mw; button.row = row; button.column = column; button.pressed = True; button.grabbed = True; XtAddEventHandler(w, event_mask, True, (XtEventHandler)PushButton, (XtPointer)&button); XtAddEventHandler(TextChild(mw), event_mask, True, (XtEventHandler)PushButton, (XtPointer)&button); appcontext = XtWidgetToApplicationContext(w); while (button.grabbed) XtAppProcessEvent(appcontext, XtIMAll); XtRemoveEventHandler(w, event_mask, True, (XtEventHandler)PushButton, (XtPointer)&button); XtRemoveEventHandler(TextChild(mw), event_mask, True, (XtEventHandler)PushButton, (XtPointer)&button); } else if (translation && mw->matrix.default_action_callback && w != (Widget)mw && DoubleClick(mw, event, mw->matrix.current_row, mw->matrix.current_column)) { /* Put this as an else -> we don't want double clicks on labels to be recognised */ XbaeMatrixDefaultActionCallbackStruct call_data; if (row == -1 || column == -1) return; call_data.reason = XbaeDefaultActionReason; call_data.event = event; call_data.row = row; call_data.column = column; XtCallCallbackList((Widget)mw, mw->matrix.default_action_callback, (XtPointer)&call_data); } } /* ARGSUSED */ void xbaeSelectCellACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; int x, y; int row, column; CellType cell; XbaeMatrixSelectCellCallbackStruct call_data; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "xbaeSelectCellACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to SelectCell action", NULL, 0); return; } /* * If we don't have a selectCellCallback, then return now */ if (!mw->matrix.select_cell_callback) return; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; /* * Convert the point to a row,column. If it does not pick a valid * cell, then return. If button up then use the last selected cell * to make sure a valid button up event occurs when dragging out of * the matrix */ if (!xbaeXYToRowCol(mw, &x, &y, &row, &column, cell)) { if (event->type == ButtonRelease) { column = last_selected_column; row = last_selected_row; } else { return; } } /* * Call our select_cell callbacks */ call_data.reason = XbaeSelectCellReason; call_data.event = event; if (scrolling) { call_data.row = last_row; call_data.column = last_column; } else { call_data.row = row; call_data.column = column; } last_selected_column = call_data.column; last_selected_row = call_data.row; call_data.selected_cells = mw->matrix.selected_cells; call_data.cells = mw->matrix.cells; call_data.num_params = *nparams; call_data.params = params; XtCallCallbackList((Widget)mw, mw->matrix.select_cell_callback, (XtPointer)&call_data); } /* ARGSUSED */ void xbaeTraverseNextACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; /* * Get Matrix widget and make sure it is a Matrix subclass. * w should be the textField widget. */ if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "traverseNextACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to TraverseNext action", NULL, 0); return; } /* * Set the traversing direction flag. XmProcessTraversal may traverse * to the Clip widget. If it does, then we will see this flag in * the Clip focusCallback, TraverseInCB, and we will continue to traverse * on out of the mw. yuck! */ mw->matrix.traversing = XmTRAVERSE_NEXT_TAB_GROUP; (void)XmProcessTraversal(TextChild(mw), XmTRAVERSE_NEXT_TAB_GROUP); mw->matrix.traversing = NOT_TRAVERSING; } /* ARGSUSED */ void xbaeTraversePrevACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; /* * Get Matrix widget and make sure it is a Matrix subclass. * w should be the textField widget. */ if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "traversePrevACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to TraversePrev action", NULL, 0); return; } /* * Set the traversing direction flag. XmProcessTraversal may traverse * to the Clip widget. If it does, then we will see this flag in * the Clip focusCallback, TraverseInCB, and we will continue to traverse * on out of the mw. yuck! */ mw->matrix.traversing = (int)XmTRAVERSE_PREV_TAB_GROUP; (void)XmProcessTraversal(TextChild(mw), XmTRAVERSE_PREV_TAB_GROUP); mw->matrix.traversing = NOT_TRAVERSING; } static void callSelectCellAction(mw, event) XbaeMatrixWidget mw; XEvent *event; { XbaeMatrixSelectCellCallbackStruct call_data; Boolean old_scroll_select = mw->matrix.scroll_select; mw->matrix.scroll_select = False; call_data.reason = XbaeSelectCellReason; call_data.event = event; call_data.row = last_row; call_data.column = last_column; call_data.selected_cells = mw->matrix.selected_cells; call_data.cells = mw->matrix.cells; call_data.num_params = 1; call_data.params = (char **)XtMalloc(sizeof(char *)); call_data.params[0] = "extend"; XtCallCallbackList( (Widget)mw, mw->matrix.select_cell_callback, (XtPointer)&call_data); (void)XtFree((char *)call_data.params); mw->matrix.scroll_select = old_scroll_select; } /*ARGSUSED*/ static void checkScrollValues(w, data, event, cont) Widget w; XtPointer data; XEvent *event; Boolean *cont; { XbaeMatrixScrollStruct *ss = (XbaeMatrixScrollStruct *)data; XMotionEvent *motionEvent; int x, y; CellType cell; Boolean inMatrix; int distance = 0; int halfRows; int denom = 1; int row, column; int i; ss->event = event; if (event->type == ButtonRelease) { XtRemoveTimeOut(ss->timerID); ss->grabbed = False; if (ss->mw->matrix.selection_policy == XmMULTIPLE_SELECT || ss->mw->matrix.selection_policy == XmEXTENDED_SELECT) callSelectCellAction(ss->mw, ss->event); return; } if (!xbaeEventToXY(ss->mw, event, &x, &y, &cell)) return; motionEvent = (XMotionEvent *)event; /* * In this instance, we don't care if a valid row and column are * returned as we'll be the judge of the result */ inMatrix = xbaeXYToRowCol(ss->mw, &x, &y, &row, &column, cell); /* * Reset the flags, so the matrix stops scrolling when the * pointer is moved back into the fixed columns/rows after a drag * select in the fixed columns/rows which caused the matrix to * scroll vertically/horizontally. */ ss->below = False; ss->above = False; ss->left = False; ss->right = False; if (inMatrix && cell == NonFixedCell) { ss->inClip = True; return; } else { /* * Calculate our position relative to the clip and adjust. */ if (motionEvent->y >= (int)(ss->cw->core.y + ss->cw->core.height)) { /* Below the matrix */ distance = motionEvent->y - ss->cw->core.y - ss->cw->core.height; ss->below = True; ss->above = False; /* * If we are below the matrix, the current column may have * still changed from horizontal motion. */ i = 0; while (COLUMN_POSITION(ss->mw, i) < HORIZ_ORIGIN(ss->mw) + motionEvent->x) i++; if (i <= ss->mw->matrix.columns && i > 0) last_column = i - 1; } else if (motionEvent->y <= ss->cw->core.y) { /* * Above the matrix - can't be both above and below at the same * time unless we have two mouses! */ distance = ss->cw->core.y - motionEvent->y; ss->below = False; ss->above = True; i = 0; while (COLUMN_POSITION(ss->mw, i) < HORIZ_ORIGIN(ss->mw) + motionEvent->x) i++; if (i > 0 && i <= ss->mw->matrix.columns) last_column = i - 1; } if (motionEvent->x <= ss->cw->core.x) { /* To the left */ ss->left = True; ss->right = False; distance = Min(distance, ss->cw->core.x - motionEvent->x); /* * Check for any vertical motion */ if (!ss->below && !ss->above) { last_row = YtoRow(ss->mw, motionEvent->y - COLUMN_LABEL_HEIGHT(ss->mw)) + VERT_ORIGIN(ss->mw); SANITY_CHECK_ROW(ss->mw, last_row); } } else if (motionEvent->x >= (int)(ss->cw->core.x + ss->cw->core.width)) { /* To the right */ ss->left = False; ss->right = True; distance = Min(distance, (int)(motionEvent->x - ss->cw->core.x - ss->cw->core.width)); if (!ss->below && !ss->above) { last_row = YtoRow(ss->mw, motionEvent->y - COLUMN_LABEL_HEIGHT(ss->mw)) + VERT_ORIGIN(ss->mw); SANITY_CHECK_ROW(ss->mw, last_row); } } /* * Adjust the value of the update interval based on the distance we * are away from the matrix */ halfRows = distance / (ROW_HEIGHT(ss->mw) / 2); /* * Avoid use of the math library by doing a simple calculation */ for (i = 0; i < halfRows; i++) denom *= 2; ss->interval = DEFAULT_SCROLL_SPEED / (denom > 0 ? denom : 1); if (ss->interval <= 0) /* Just to be on the safe side */ ss->interval = 1; } } static void updateScroll(data) XtPointer data; { XbaeMatrixScrollStruct *ss = (XbaeMatrixScrollStruct *)data; Boolean callCallback = False; static int my_last_row = -1, my_last_column = -1; if (!scrolling) return; if (my_last_column != last_column || my_last_row != last_row) callCallback = True; my_last_row = last_row; my_last_column = last_column; /* * Off the clip widget - check there are cells that could * be scrolled into a visible position. If there are, * scroll them into view. If not, start setting the fixed * rows and columns as the current row and column. */ if (ss->below && last_row < TRAILING_VERT_ORIGIN(ss->mw) - 1) { xbaeMakeRowVisible(ss->mw, ++last_row); callCallback = True; } else if (ss->above && last_row > (int)ss->mw->matrix.fixed_rows) { xbaeMakeRowVisible(ss->mw, --last_row); callCallback = True; } if (ss->right && last_column < TRAILING_HORIZ_ORIGIN(ss->mw) - 1) { xbaeMakeColumnVisible(ss->mw, ++last_column); callCallback = True; } else if (ss->left && last_column > (int)ss->mw->matrix.fixed_columns) { xbaeMakeColumnVisible(ss->mw, --last_column); callCallback = True; } if (callCallback && (ss->mw->matrix.selection_policy == XmMULTIPLE_SELECT || ss->mw->matrix.selection_policy == XmEXTENDED_SELECT)) callSelectCellAction(ss->mw, ss->event); /* * Flush the updates out to the server so we don't end up lagging * behind too far and end up with a million redraw requests. * Particularly for higher update speeds */ XFlush(XtDisplay((Widget)ss->mw)); ss->timerID = XtAppAddTimeOut( ss->app_context, ss->interval, (XtTimerCallbackProc)updateScroll, (XtPointer)ss); } /* ARGSUSED */ void xbaeHandleMotionACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; XbaeClipWidget cw; XMotionEvent *motionEvent; XButtonEvent *buttonEvent; int x, y, row, column; CellType cell; Boolean inMatrix; if (scrolling) return; /* * Get Matrix widget and make sure it is a Matrix subclass. * w could be Matrix, or the Clip or textField children of Matrix */ if (XtIsSubclass(w, xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)w; else if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "handleMotionACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to HandleMotion action", NULL, 0); return; } motionEvent = (XMotionEvent *)event; buttonEvent = (XButtonEvent *)event; cw = (XbaeClipWidget)ClipChild(mw); if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return; /* * In this instance, we don't care if a valid row and column are * returned as we'll be the judge of the result */ inMatrix = xbaeXYToRowCol(mw, &x, &y, &row, &column, cell); if (inMatrix && cell == NonFixedCell) { /* * If we are in a NonFixedCell, then we're cruisin'. Just * update our position */ if (row != last_row || column != last_column) { if (row < mw->matrix.rows && column < mw->matrix.columns) { last_row = row; last_column = column; if (mw->matrix.selection_policy == XmMULTIPLE_SELECT || mw->matrix.selection_policy == XmEXTENDED_SELECT) callSelectCellAction(mw, event); } } } else { XbaeMatrixScrollStruct scrollData; Boolean cont; /* * Grab the pointer and add a timeout routine to start modifying * the current row and/or column in the matrix. Also add an * event handler to monitor the current distance outside the * matrix so we can adjust the timeout routine to go faster when * the pointer is further away from the matrix. */ scrolling = True; XtAddGrab(w, True, False); scrollData.mw = mw; scrollData.cw = cw; scrollData.event = event; scrollData.interval = DEFAULT_SCROLL_SPEED; scrollData.inClip = False; scrollData.grabbed = True; scrollData.app_context = XtWidgetToApplicationContext(w); scrollData.above = scrollData.below = False; scrollData.left = scrollData.right = False; XtAddEventHandler(w, PointerMotionMask | ButtonReleaseMask, True, (XtEventHandler)checkScrollValues, (XtPointer)&scrollData); /* * Call checkScrollValues() to find out where exactly we are in * relation to the clip widget */ checkScrollValues(w, (XtPointer)&scrollData, event, &cont); /* * The above / below / left / right members of the scrollData struct * should now be set so we know where we should be moving. Let's * get on with it, eh? */ updateScroll((XtPointer)&scrollData); while (scrollData.grabbed && !scrollData.inClip) XtAppProcessEvent(scrollData.app_context, XtIMAll); XtRemoveEventHandler(w, PointerMotionMask | ButtonReleaseMask, True, (XtEventHandler)checkScrollValues, (XtPointer)&scrollData); XtRemoveGrab(w); /* * We don't want the timeout getting called again as, in two lines, * we'll be way out of scope! */ XtRemoveTimeOut(scrollData.timerID); scrolling = False; } } /* ARGSUSED */ void xbaePageDownACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; char *down = "0"; int top; /* * Get Matrix widget and make sure it is a Matrix subclass. * w should be the textField widget. */ if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "pageDownACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to PageDown action", NULL, 0); return; } if (!XtIsManaged(VertScrollChild(mw))) return; /* * Save the top row - if scrolling occurs, the text widget needs * to be moved */ top = VERT_ORIGIN(mw); XtCallActionProc(VertScrollChild(mw), "PageDownOrRight", event, &down, 1); if (VERT_ORIGIN(mw) != top) /* * Position the cursor at the top most non fixed row if there was * a page down */ XbaeMatrixEditCell((Widget)mw, VERT_ORIGIN(mw) + mw->matrix.fixed_rows, mw->matrix.current_column); } /* ARGSUSED */ void xbaePageUpACT(w, event, params, nparams) Widget w; XEvent *event; String *params; Cardinal *nparams; { XbaeMatrixWidget mw; char *up = "0"; int top; /* * Get Matrix widget and make sure it is a Matrix subclass. * w should be the textField widget. */ if (XtIsSubclass(XtParent(w), xbaeMatrixWidgetClass)) mw = (XbaeMatrixWidget)XtParent(w); else { XtAppWarningMsg( XtWidgetToApplicationContext(w), "pageUpACT", "badWidget", "XbaeMatrix", "XbaeMatrix: Bad widget passed to PageUp action", NULL, 0); return; } if (!XtIsManaged(VertScrollChild(mw))) return; /* * Save the top row - if scrolling occurs, the text widget needs * to be moved */ top = VERT_ORIGIN(mw); XtCallActionProc(VertScrollChild(mw), "PageUpOrLeft", event, &up, 1); if (VERT_ORIGIN(mw) != top) /* * Position the cursor at the top most non fixed row if there was * a page down */ XbaeMatrixEditCell((Widget)mw, VERT_ORIGIN(mw) + mw->matrix.fixed_rows, mw->matrix.current_column); } grace-5.1.23/Xbae/Xbae/Utils.c0000644000076500001440000012456106766327622015463 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Utils.c,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Utils.c created by Andrew Lister (7 August, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include /* * Return the top and bottom-most visible non-fixed row */ void xbaeGetVisibleRows(mw, top_row, bottom_row) XbaeMatrixWidget mw; int *top_row, *bottom_row; { *top_row = VERT_ORIGIN(mw) + mw->matrix.fixed_rows; *bottom_row = *top_row + (VISIBLE_HEIGHT(mw) - 1) / ROW_HEIGHT(mw); SANITY_CHECK_ROW(mw, *bottom_row); } /* * Return the left and right-most visible non-fixed column */ void xbaeGetVisibleColumns(mw, left_column, right_column) XbaeMatrixWidget mw; int *left_column, *right_column; { *left_column = xbaeXtoCol(mw, FIXED_COLUMN_WIDTH(mw) + HORIZ_ORIGIN(mw)); *right_column = xbaeXtoCol(mw, FIXED_COLUMN_WIDTH(mw) + HORIZ_ORIGIN(mw) + VISIBLE_WIDTH(mw) - 1); } /* * Return the top and bottom row and left and right column of * the visible non-fixed cells */ void xbaeGetVisibleCells(mw, top_row, bottom_row, left_column, right_column) XbaeMatrixWidget mw; int *top_row, *bottom_row, *left_column, *right_column; { xbaeGetVisibleRows(mw, top_row, bottom_row); xbaeGetVisibleColumns(mw, left_column, right_column); } /* * Try to make the column specified by the leftColumn resource * be the left column. The column is relative to fixed_columns - so 0 would * be the first non-fixed column. * If we can't make leftColumn the left column, make it as close as possible. */ void xbaeAdjustLeftColumn(mw) XbaeMatrixWidget mw; { int y; int i; int required_width; int visible_width = VISIBLE_WIDTH(mw); int dynamic_columns; if (visible_width < 0) /* will happen on initialisation */ return; /* Adjust the column if it is out of bounds */ dynamic_columns = mw->matrix.columns - mw->matrix.fixed_columns - mw->matrix.trailing_fixed_columns; if (mw->matrix.left_column < 0) mw->matrix.left_column = 0; else if (mw->matrix.left_column > dynamic_columns-1) mw->matrix.left_column = dynamic_columns-1; /* Find out where the horiz_origin will be if we tried setting the given left column and adjust till it all fits */ do { required_width = 0; HORIZ_ORIGIN(mw) = 0; xbaeRowColToXY(mw, mw->matrix.fixed_rows, mw->matrix.left_column + mw->matrix.fixed_columns, &mw->matrix.horiz_origin, &y); /* Check how much space is remaining */ for (i = mw->matrix.left_column + mw->matrix.fixed_columns; i < mw->matrix.columns - (int)mw->matrix.trailing_fixed_columns; i++) { required_width += COLUMN_WIDTH(mw, i); if (required_width >= visible_width) break; } if (required_width < visible_width) mw->matrix.left_column--; } while (required_width < visible_width); } /* * Try to make the row specified by the topRow resource (VERT_ORIGIN) * be the top row. The row is relative to fixed_rows - so 0 would * be the first non-fixed row. * If we can't make topRow the top row, make it as close as possible. */ void xbaeAdjustTopRow(mw) XbaeMatrixWidget mw; { int rows_visible = VISIBLE_HEIGHT(mw) / ROW_HEIGHT(mw); /* * If we have less than one full row visible, then count it as a full row */ if (rows_visible <= 0) rows_visible = 1; /* * rows_visible might be inaccurate since Clip may not have been resized */ else if (rows_visible > mw->matrix.rows) rows_visible = mw->matrix.rows; if (VERT_ORIGIN(mw) > (int)(mw->matrix.rows - rows_visible - mw->matrix.fixed_rows - mw->matrix.trailing_fixed_rows)) mw->matrix.top_row = mw->matrix.rows - rows_visible - mw->matrix.fixed_rows - mw->matrix.trailing_fixed_rows; else if (VERT_ORIGIN(mw) < 0) mw->matrix.top_row = 0; } /* * Utility function to clear a cell so we can draw something new in it. * Does not generate expose events on the cell. * Does not check if the cell is actually visible before clearing it. */ void xbaeClearCell(mw, row, column) XbaeMatrixWidget mw; int row, column; { int x, y; Boolean fixed = IS_FIXED(mw, row, column); Window win = fixed ? XtWindow(mw) : XtWindow(ClipChild(mw)); if (!win || mw->matrix.disable_redisplay) return; xbaeRowColToXY(mw, row, column, &x, &y); /* * Make sure y coord is valid */ #if 0 if ((win == XtWindow(mw)) && ((y > (int)(CLIP_VERT_VISIBLE_SPACE(mw) + ROW_LABEL_OFFSET(mw) - 1)) || (y < (int)ROW_LABEL_OFFSET(mw)))) return; #endif XClearArea(XtDisplay(mw), win, x, y, COLUMN_WIDTH(mw, column), ROW_HEIGHT(mw), fixed); } /* * Return True if a row is visible on the screen (not scrolled totally off) */ Boolean xbaeIsRowVisible(mw, row) XbaeMatrixWidget mw; int row; { /* * If we are not in a fixed row or trailing fixed row, * see if we are on the screen vertically * (fixed rows are always on the screen) */ if (! IS_FIXED_ROW(mw, row)) { row -= mw->matrix.fixed_rows; if (row >= VERT_ORIGIN(mw)) { double height = ((double)ClipChild(mw)->core.height / ROW_HEIGHT(mw)) + VERT_ORIGIN(mw); if (row < height) return True; if ((int)ClipChild(mw)->core.height > (int)TEXT_HEIGHT_OFFSET(mw) && (int)ClipChild(mw)->core.height < ROW_HEIGHT(mw) && row == VERT_ORIGIN(mw)) return True; } } else return True; return False; } /* * Return True if a column is visible on the screen (not scrolled totally off) */ Boolean xbaeIsColumnVisible(mw, column) XbaeMatrixWidget mw; int column; { /* * If we are not in a fixed column, see if we are on the screen * horizontally (fixed columns are always on the screen) */ if (! IS_FIXED_COLUMN(mw, column)) { int x; /* * Calculate the x endpoints of this column */ x = COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, mw->matrix.fixed_columns); /* * Check if we are visible horizontally */ if (x + COLUMN_WIDTH(mw, column) > HORIZ_ORIGIN(mw) && x < (int)(ClipChild(mw)->core.width) + HORIZ_ORIGIN(mw)) return True; } else return True; return False; } /* * Return True if a cell is visible on the screen (not scrolled totally off) */ Boolean xbaeIsCellVisible(mw, row, column) XbaeMatrixWidget mw; int row, column; { return xbaeIsRowVisible(mw, row) && xbaeIsColumnVisible(mw, column); } /* * Scroll a row so it is visible on the screen. */ void xbaeMakeRowVisible(mw, row) XbaeMatrixWidget mw; int row; { int rows_visible; int value, slider_size, increment, page_increment, vert_value; /* * If we are in a fixed row, we are already visible. */ if (IS_FIXED_ROW(mw, row)) return; /* * Take into account fixed_rows. * Calculate the number of rows visible. If less than one full * row is visible, use one full row. */ row -= mw->matrix.fixed_rows; rows_visible = VISIBLE_HEIGHT(mw) / ROW_HEIGHT(mw); if (rows_visible == 0) rows_visible = 1; /* * Figure out the new value of the VSB to scroll this cell * onto the screen (the VSB uses row coordinates instead of pixels) */ if (row < VERT_ORIGIN(mw)) vert_value = row; else if (row >= rows_visible + VERT_ORIGIN(mw)) vert_value = row - rows_visible + 1; else vert_value = VERT_ORIGIN(mw); /* * Give the VSB the new value and pass a flag to make it call * our scroll callbacks */ if (vert_value != VERT_ORIGIN(mw)) { XmScrollBarGetValues(VertScrollChild(mw), &value, &slider_size, &increment, &page_increment); XmScrollBarSetValues(VertScrollChild(mw), vert_value, slider_size, increment, page_increment, True); } } /* * Scroll a column so it is visible on the screen. */ void xbaeMakeColumnVisible(mw, column) XbaeMatrixWidget mw; int column; { int value, slider_size, increment, page_increment, x, horiz_value; /* * If we are in a fixed column, we are already visible. */ if (IS_FIXED_COLUMN(mw, column)) return; /* * Calculate the x position of this column */ x = COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, mw->matrix.fixed_columns); /* * Figure out the new value of the HSB to scroll this cell * onto the screen. If the whole cell won't fit, scroll so its * left edge is visible. */ if (x < HORIZ_ORIGIN(mw)) horiz_value = x; else if (x + COLUMN_WIDTH(mw, column) > VISIBLE_WIDTH(mw) + HORIZ_ORIGIN(mw)) { int off = (x + COLUMN_WIDTH(mw, column)) - (VISIBLE_WIDTH(mw) + HORIZ_ORIGIN(mw)); if (x - off < HORIZ_ORIGIN(mw)) horiz_value = x; else horiz_value = HORIZ_ORIGIN(mw) + off; } else horiz_value = HORIZ_ORIGIN(mw); /* * Give the HSB the new value and pass a flag to make it * call our scroll callbacks */ if (horiz_value != HORIZ_ORIGIN(mw)) { XmScrollBarGetValues(HorizScrollChild(mw), &value, &slider_size, &increment, &page_increment); XmScrollBarSetValues(HorizScrollChild(mw), horiz_value, slider_size, increment, page_increment, True); } } /* * Scrolls a fixed or non-fixed cell so it is visible on the screen. */ void xbaeMakeCellVisible(mw, row, column) XbaeMatrixWidget mw; int row, column; { if (!xbaeIsRowVisible(mw, row)) xbaeMakeRowVisible(mw, row); if (!xbaeIsColumnVisible(mw, column)) xbaeMakeColumnVisible(mw, column); } /* * Set the clip_mask in our draw and shadow GCs. This is necessary for * drawing non-fixed column labels and fixed rows. */ void xbaeSetClipMask(mw, clip_reason) XbaeMatrixWidget mw; unsigned int clip_reason; { XRectangle r[2]; int n = 1; /* * Set new clip reason */ mw->matrix.current_clip = clip_reason; /* * XRectangle enclosing column labels and fixed rows */ if ((CLIP_FIXED_COLUMNS & clip_reason) && mw->matrix.fixed_columns) { r[0].x = COLUMN_LABEL_OFFSET(mw); r[0].width = FIXED_COLUMN_WIDTH(mw); } else if ((CLIP_TRAILING_FIXED_COLUMNS & clip_reason) && (mw->matrix.trailing_fixed_columns || mw->matrix.fill)) { r[0].x = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); r[0].width = TRAILING_FIXED_COLUMN_WIDTH(mw); if (NEED_HORIZ_FILL(mw)) r[0].width += FILL_HORIZ_WIDTH(mw); } else { r[0].x = FIXED_COLUMN_LABEL_OFFSET(mw); r[0].width = ClipChild(mw)->core.width; if (NEED_HORIZ_FILL(mw)) r[0].width += FILL_HORIZ_WIDTH(mw); } if (CLIP_VISIBLE_HEIGHT & clip_reason) { r[0].y = ROW_LABEL_OFFSET(mw); r[0].height = ClipChild(mw)->core.height + FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw); if (NEED_VERT_FILL(mw)) r[0].height += FILL_VERT_HEIGHT(mw); } else if ((CLIP_TRAILING_FIXED_ROWS & clip_reason) && (mw->matrix.trailing_fixed_rows || mw->matrix.fill)) { r[0].y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); r[0].height = TRAILING_FIXED_ROW_HEIGHT(mw); if (NEED_VERT_FILL(mw)) r[0].height += FILL_VERT_HEIGHT(mw); } else if (CLIP_BETWEEN_FIXED_ROWS & clip_reason) { r[0].y = FIXED_ROW_LABEL_OFFSET(mw); r[0].height = ClipChild(mw)->core.height; } else /* clip fixed rows & clip_reason */ { r[0].y = HORIZ_SB_OFFSET(mw); r[0].height = FIXED_ROW_LABEL_OFFSET(mw); } if (mw->matrix.row_labels) { r[1].x = VERT_SB_OFFSET(mw); r[1].y = FIXED_ROW_LABEL_OFFSET(mw); r[1].width = ROW_LABEL_WIDTH(mw); r[1].height = ClipChild(mw)->core.height; n = 2; } /* * Reset the clip_mask in our clipping GCs */ XSetClipRectangles(XtDisplay(mw), mw->matrix.cell_grid_line_gc, 0, 0, r, n, Unsorted); XSetClipRectangles(XtDisplay(mw), mw->matrix.cell_top_shadow_clip_gc, 0, 0, r, n, Unsorted); XSetClipRectangles(XtDisplay(mw), mw->matrix.cell_bottom_shadow_clip_gc, 0, 0, r, n, Unsorted); XSetClipRectangles(XtDisplay(mw), mw->matrix.label_clip_gc, 0, 0, r, n, Unsorted); } /* * Get the total pixel width of the non-fixed cell area */ void xbaeGetCellTotalWidth(mw) XbaeMatrixWidget mw; { int i, columns; /* * Calculate width of non-fixed cell area. */ columns = TRAILING_HORIZ_ORIGIN(mw); for (i = mw->matrix.fixed_columns, mw->matrix.non_fixed_total_width = 0; i < columns; i++) mw->matrix.non_fixed_total_width += COLUMN_WIDTH(mw, i); } /* * Cache the pixel position of each column */ void xbaeGetColumnPositions(mw) XbaeMatrixWidget mw; { int i, x; for (i = 0, x = 0; i < mw->matrix.columns; x += COLUMN_WIDTH(mw, i), i++) COLUMN_POSITION(mw, i) = x; } void #if NeedFunctionPrototypes xbaeComputeSize(XbaeMatrixWidget mw, Boolean compute_width, Boolean compute_height) #else xbaeComputeSize(mw, compute_width, compute_height) XbaeMatrixWidget mw; Boolean compute_width; Boolean compute_height; #endif { unsigned long full_width = NON_FIXED_TOTAL_WIDTH(mw) + FIXED_COLUMN_WIDTH(mw) + TRAILING_FIXED_COLUMN_WIDTH(mw) + ROW_LABEL_WIDTH(mw) + 2 * mw->manager.shadow_thickness; unsigned long full_height = CELL_TOTAL_HEIGHT(mw) + FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw) + COLUMN_LABEL_HEIGHT(mw) + 2 * mw->manager.shadow_thickness; unsigned long width, height; /* * Calculate our width. * If visible_columns is set, then base it on that. * Otherwise, if the compute_width flag is set, then we are full width. * Otherwise we keep whatever width we are. */ if (mw->matrix.visible_columns) width = ROW_LABEL_WIDTH(mw) + 2 * mw->manager.shadow_thickness + COLUMN_WIDTH(mw, (mw->matrix.visible_columns + mw->matrix.fixed_columns) - 1) + COLUMN_POSITION(mw, mw->matrix.fixed_columns + mw->matrix.visible_columns - 1) + TRAILING_FIXED_COLUMN_WIDTH(mw); else if (compute_width) width = full_width; else width = mw->core.width; /* * Calculate our height. * If visible_rows is set, then base it on that. * Otherwise, if the compute_height flag is set, then we are full height. * Otherwise we keep whatever height we are. */ if (mw->matrix.visible_rows) height = mw->matrix.visible_rows * ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw) + FIXED_ROW_HEIGHT(mw) + COLUMN_LABEL_HEIGHT(mw) + 2 * mw->manager.shadow_thickness; else if (compute_height) height = full_height; else height = mw->core.height; /* * Store our calculated size. */ mw->core.width = width; mw->core.height = height; /* * If we are less than full width or our horizontal display policy is * constant, then we need an HSB, so increment our height by the size * of the HSB (if we are allowed to modify our height and we are allowed * to have an HSB). */ if (((width < full_width) || (XmDISPLAY_STATIC == mw->matrix.hsb_display_policy)) && (compute_height || mw->matrix.visible_rows) && (XmDISPLAY_NONE != mw->matrix.hsb_display_policy)) mw->core.height += HORIZ_SB_HEIGHT(mw); /* * If we are less than full height or our vertical display policy is * constant, then we need a VSB, so increment our width by the size * of the VSB (if we are allowed to modify our width and we are allowed * to have a VSB). */ if (((height < full_height) || (XmDISPLAY_STATIC == mw->matrix.vsb_display_policy)) && (compute_width || mw->matrix.visible_columns) && (XmDISPLAY_NONE != mw->matrix.vsb_display_policy)) mw->core.width += VERT_SB_WIDTH(mw); /* * Save our calculated size for use in our query_geometry method. * This is the size we really want to be (not necessarily the size * we will end up being). */ mw->matrix.desired_width = mw->core.width; mw->matrix.desired_height = mw->core.height; } /* * Return the length of the longest row label */ short xbaeMaxRowLabel(mw) XbaeMatrixWidget mw; { int i; short max = 0, len; /* * Determine the length of the longest row label */ for (i = 0; i < mw->matrix.rows; i++) { len = strlen(mw->matrix.row_labels[i]); if (len > max) max = len; } return max; } void xbaeParseColumnLabel(label, lines) String label; ColumnLabelLines lines; { char *nl; /* * First count the number of lines in the label */ lines->lines = 1; nl = label; while ((nl = strchr(nl, '\n')) != NULL) { nl++; lines->lines++; } /* * Now malloc a lengths array of the correct size. */ lines->lengths = (int *) XtMalloc(lines->lines * sizeof(int)); /* * An entry in the lengths array is the length of that line (substring). */ /* * Handle the case of one line (no strchr() needed) */ if (lines->lines == 1) lines->lengths[0] = strlen(label); else { int i; nl = label; i = 0; while ((nl = strchr(nl, '\n')) != NULL) { lines->lengths[i] = nl - label; nl++; label = nl; i++; } lines->lengths[i] = strlen(label); } } /* * Convert an x/y pixel position to the row/column cell position it picks. * 'cell' specifies whether the x/y coord is relative to the fixed cells * window or the non-fixed cells window. * The coords x,y are adjusted so they are relative to the origin of the * picked cell. * If we are "out of bounds" on the ``low'' side, go ahead and return False * to show an error, but also set the row/column to -1 to indicate this could * be a row/column header. This is currently undocumented behaviour, but * may be useful nevertheless. */ Boolean xbaeXYToRowCol(mw, x, y, row, column, cell) XbaeMatrixWidget mw; int *x, *y; int *row, *column; CellType cell; { Rectangle rect; unsigned int inBox = CLIP_NONE; Boolean need_vert_dead_space_fill = NEED_VERT_DEAD_SPACE_FILL(mw); int horiz_sb_offset = HORIZ_SB_OFFSET(mw); int vert_sb_offset = VERT_SB_OFFSET(mw); int column_label_height = COLUMN_LABEL_HEIGHT(mw); int row_label_offset = ROW_LABEL_OFFSET(mw); int row_label_width = ROW_LABEL_WIDTH(mw); int fixed_row_label_offset = FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_row_label_offset = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); int trailing_fixed_row_height = TRAILING_FIXED_ROW_HEIGHT(mw); int fixed_column_label_offset = FIXED_COLUMN_LABEL_OFFSET(mw); int trailing_fixed_column_label_offset = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); int trailing_fixed_column_width = TRAILING_FIXED_COLUMN_WIDTH(mw); int column_label_offset = COLUMN_LABEL_OFFSET(mw); int row_height = ROW_HEIGHT(mw); int unattached_trailing_rows_offset = UNATTACHED_TRAILING_ROWS_OFFSET(mw); *row = -1; *column = -1; switch (cell) { case FixedCell: /* * Check the various rectangles enclosing the cells in fixed rows * or columns. * * If we don't have fixed rows or columns, then we didn't hit a cell. */ /* * Upper left */ if (!inBox && mw->matrix.fixed_columns && mw->matrix.fixed_rows) { SETRECT(rect, column_label_offset, row_label_offset, fixed_column_label_offset - 1, fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_FIXED_COLUMNS | CLIP_FIXED_ROWS; } /* * Lower left */ if (!inBox && mw->matrix.fixed_columns && mw->matrix.trailing_fixed_rows) { SETRECT(rect, column_label_offset, trailing_fixed_row_label_offset, fixed_column_label_offset - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_FIXED_COLUMNS | CLIP_TRAILING_FIXED_ROWS; } /* * Upper right */ if (!inBox && mw->matrix.trailing_fixed_columns && mw->matrix.fixed_rows) { SETRECT(rect, trailing_fixed_column_label_offset, row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_FIXED_COLUMNS | CLIP_FIXED_ROWS; } /* * Lower right */ if (!inBox && mw->matrix.trailing_fixed_columns && mw->matrix.trailing_fixed_rows) { SETRECT(rect, trailing_fixed_column_label_offset, trailing_fixed_row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_FIXED_COLUMNS | CLIP_TRAILING_FIXED_ROWS; } /* * Right (mid) */ if (!inBox && mw->matrix.fixed_columns) { SETRECT(rect, column_label_offset, fixed_row_label_offset, fixed_column_label_offset - 1, need_vert_dead_space_fill ? unattached_trailing_rows_offset : trailing_fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_FIXED_COLUMNS; } /* * Upper (mid) */ if (!inBox && mw->matrix.fixed_rows) { SETRECT(rect, fixed_column_label_offset, row_label_offset, trailing_fixed_column_label_offset - 1, fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_FIXED_ROWS; } /* * Left (mid) */ if (!inBox && mw->matrix.trailing_fixed_columns) { SETRECT(rect, trailing_fixed_column_label_offset, fixed_row_label_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, need_vert_dead_space_fill ? unattached_trailing_rows_offset : trailing_fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_FIXED_COLUMNS; } /* * Lower (mid) */ if (!inBox && mw->matrix.trailing_fixed_rows) { SETRECT(rect, fixed_column_label_offset, trailing_fixed_row_label_offset, trailing_fixed_column_label_offset - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_FIXED_ROWS; } /* * Trailing horizontal fill. This is trickier because * even though we're in the fixed cell section, this really * might not be a fixed cell. */ if (!inBox && IN_GRID_ROW_MODE(mw) && NEED_HORIZ_FILL(mw)) { int rx = trailing_fixed_column_label_offset + trailing_fixed_column_width; /* * Upper fill */ if (!inBox && mw->matrix.fixed_rows) { SETRECT(rect, rx, row_label_offset, rx + FILL_HORIZ_WIDTH(mw) - 1, fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_HORIZ_FILL | CLIP_FIXED_ROWS; } /* * Lower fill */ if (!inBox && mw->matrix.trailing_fixed_rows) { SETRECT(rect, rx, trailing_fixed_row_label_offset, rx + FILL_HORIZ_WIDTH(mw) - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_HORIZ_FILL | CLIP_TRAILING_FIXED_ROWS; } /* * Mid fill */ if (!inBox) { SETRECT(rect, rx, row_label_offset, rx + FILL_HORIZ_WIDTH(mw) - 1, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_HORIZ_FILL; } } /* * Trailing vertical fill */ if (!inBox && IN_GRID_COLUMN_MODE(mw) && NEED_VERT_FILL(mw)) { int ry = trailing_fixed_row_label_offset + trailing_fixed_row_height; /* * Left fill */ if (mw->matrix.fixed_columns) { SETRECT(rect, column_label_offset, ry, fixed_column_label_offset - 1, ry + FILL_VERT_HEIGHT(mw) - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_VERT_FILL | CLIP_FIXED_COLUMNS; } /* * Right fill */ if (!inBox && mw->matrix.trailing_fixed_columns) { SETRECT(rect, trailing_fixed_column_label_offset, ry, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, ry + FILL_VERT_HEIGHT(mw) - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_VERT_FILL | CLIP_TRAILING_FIXED_COLUMNS; } /* * Mid fill */ if (!inBox) { SETRECT(rect, column_label_offset, ry, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, ry + FILL_VERT_HEIGHT(mw) - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_TRAILING_VERT_FILL; } } /* * If the point is in this rectangle, calculate the row/column * it hits. Otherwise we didn't hit a cell. */ if (inBox) { /* * Translate the point to rect's coord system */ if (mw->matrix.fixed_columns && (CLIP_TRAILING_FIXED_ROWS == inBox || CLIP_FIXED_ROWS == inBox)) *x -= column_label_offset; else *x -= rect.x1; *y -= rect.y1; /* * Convert this point to a row/column. We need to take into * account the scrolling origins depending on which fixed * areas the point is located in. */ if (CLIP_TRAILING_VERT_FILL & inBox) { *row = mw->matrix.rows - 1; *y += row_height; } else *row = YtoRow(mw, *y) + ((((CLIP_FIXED_COLUMNS & inBox) || (CLIP_TRAILING_FIXED_COLUMNS & inBox))) && !((CLIP_FIXED_ROWS & inBox) || (CLIP_TRAILING_FIXED_ROWS & inBox)) ? mw->matrix.fixed_rows : 0) + ((CLIP_FIXED_ROWS & inBox) ? 0 : VERT_ORIGIN(mw)) + ((CLIP_TRAILING_FIXED_ROWS & inBox) ? TRAILING_VERT_ORIGIN(mw) - VERT_ORIGIN(mw) : 0); if ((CLIP_TRAILING_FIXED_COLUMNS & inBox) || (CLIP_TRAILING_HORIZ_FILL & inBox)) *column = xbaeXtoTrailingCol(mw, *x); else *column = xbaeXtoCol( mw, *x + ((CLIP_FIXED_COLUMNS & inBox) ? 0 : HORIZ_ORIGIN(mw))); /* * Sanity check the result, making sure it is in fixed location */ if (((*row < 0) || (*column < 0)) || (((mw->matrix.fixed_rows && (*row >= (int)mw->matrix.fixed_rows) && (!mw->matrix.trailing_fixed_rows || (mw->matrix.trailing_fixed_rows && (*row < TRAILING_VERT_ORIGIN(mw))))) || (!mw->matrix.fixed_rows && mw->matrix.trailing_fixed_rows && (*row < TRAILING_VERT_ORIGIN(mw)))) && ((mw->matrix.fixed_columns && (*column >= (int)mw->matrix.fixed_columns) && (!mw->matrix.trailing_fixed_columns || (mw->matrix.trailing_fixed_columns && (*column < TRAILING_HORIZ_ORIGIN(mw))))) || (!mw->matrix.fixed_columns && mw->matrix.trailing_fixed_columns && (*column < TRAILING_HORIZ_ORIGIN(mw)))))) return False; /* * Adjust x,y so they are relative to this cells origin. */ if (CLIP_TRAILING_HORIZ_FILL & inBox) *x += COLUMN_WIDTH(mw, *column); else *x -= COLUMN_POSITION(mw, *column) - (mw->matrix.fixed_columns || (CLIP_TRAILING_FIXED_COLUMNS & inBox) ? 0 : HORIZ_ORIGIN(mw)) - ((CLIP_TRAILING_FIXED_COLUMNS & inBox) ? COLUMN_POSITION(mw, TRAILING_HORIZ_ORIGIN(mw)) : 0); if (!(CLIP_TRAILING_VERT_FILL & inBox)) *y %= row_height; return True; } else return False; /* NOTREACHED */ break; case RowLabelCell: if (!inBox && mw->matrix.row_labels) { /* Check the various regions of the matrix to make sure we get the correct row label */ if (mw->matrix.fixed_rows) { SETRECT(rect, vert_sb_offset, row_label_offset, row_label_width + vert_sb_offset, fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_ROW_LABELS | CLIP_FIXED_ROWS; } if (!inBox && mw->matrix.trailing_fixed_rows) { SETRECT(rect, vert_sb_offset, trailing_fixed_row_label_offset, row_label_width + vert_sb_offset, trailing_fixed_row_label_offset + trailing_fixed_row_height - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_ROW_LABELS | CLIP_TRAILING_FIXED_ROWS; } /* check the rows in the non fixed regions */ if (!inBox) { SETRECT(rect, vert_sb_offset, fixed_row_label_offset, row_label_width + vert_sb_offset, trailing_fixed_row_label_offset - 1); if (INBOX(rect, *x, *y)) inBox = CLIP_ROW_LABELS; } } if (CLIP_ROW_LABELS & inBox) { *y -= row_label_offset; *row = YtoRow(mw, *y); *row += (CLIP_FIXED_ROWS & inBox ? 0 : mw->matrix.top_row); *row += ((CLIP_TRAILING_FIXED_ROWS & inBox) ? (CELL_TOTAL_HEIGHT(mw) - VISIBLE_HEIGHT(mw)) / row_height - mw->matrix.top_row: 0); *column = -1; } else { *row = -1; *column = -1; } /* Sanity check - make sure we don't over step the mark */ if (*row >= mw->matrix.rows || *column >= mw->matrix.columns) { *row = -1; *column = -1; } return False; /*NOTREACHED*/ break; case ColumnLabelCell: if (!inBox && mw->matrix.column_labels) { if (mw->matrix.fixed_columns) { SETRECT(rect, column_label_offset, horiz_sb_offset, fixed_column_label_offset - 1, column_label_height + horiz_sb_offset); if (INBOX(rect, *x, *y)) inBox = CLIP_FIXED_COLUMNS | CLIP_COLUMN_LABELS; } if (!inBox && mw->matrix.trailing_fixed_columns) { SETRECT(rect, trailing_fixed_column_label_offset, horiz_sb_offset, trailing_fixed_column_label_offset + trailing_fixed_column_width - 1, column_label_height + horiz_sb_offset); if (INBOX(rect, *x, *y)) inBox = CLIP_COLUMN_LABELS | CLIP_TRAILING_FIXED_COLUMNS; } /* check the columns in the non fixed regions */ if (!inBox) { SETRECT(rect, fixed_column_label_offset, horiz_sb_offset, trailing_fixed_column_label_offset, column_label_height + horiz_sb_offset); if (INBOX(rect, *x, *y)) inBox = CLIP_COLUMN_LABELS; } } if (CLIP_COLUMN_LABELS & inBox) { *x -= column_label_offset; if (CLIP_TRAILING_FIXED_COLUMNS & inBox) *column = xbaeXtoTrailingCol(mw, *x); else *column = xbaeXtoCol(mw, *x + ((CLIP_FIXED_COLUMNS & inBox) ? 0 : HORIZ_ORIGIN(mw))); *row = -1; } else { *row = -1; *column = -1; } /* Sanity check - make sure we don't overstep the mark */ if (*row >= mw->matrix.rows || *column >= mw->matrix.columns) { *row = -1; *column = -1; } return False; /* NOTREACHED */ break; case NonFixedCell: /* * Translate the point to take into account fixed rows or columns. */ *x += FIXED_COLUMN_WIDTH(mw); *y += FIXED_ROW_HEIGHT(mw); /* * Convert the new point to a row/column position */ *row = YtoRow(mw, *y + mw->matrix.first_row_offset) + VERT_ORIGIN(mw); *column = xbaeXtoCol(mw, *x + HORIZ_ORIGIN(mw)); /* * Sanity check the result */ if (*row >= TRAILING_VERT_ORIGIN(mw) || *column >= TRAILING_HORIZ_ORIGIN(mw) || *row < 0 || *column < 0) return False; /* * Adjust x,y so they are relative to this cell's origin. */ *x -= COLUMN_POSITION(mw, *column) - HORIZ_ORIGIN(mw); *y %= row_height; return True; /* NOTREACHED */ break; default: *row = -1; *column = -1; return False; } } /* * Convert the coordinates in an event to be relative to the Clip * window or the Matrix window. Set the cell to indicate which one. * Used by some actions. */ /* ARGSUSED */ Boolean xbaeEventToXY(mw, event, x, y, cell) XbaeMatrixWidget mw; XEvent *event; int *x, *y; CellType *cell; { switch (event->type) { case ButtonPress: case ButtonRelease: *x = event->xbutton.x; *y = event->xbutton.y; break; case KeyPress: case KeyRelease: *x = event->xkey.x; *y = event->xkey.y; break; case MotionNotify: *x = event->xmotion.x; *y = event->xmotion.y; break; default: return False; } if (event->xbutton.subwindow == XtWindow(ClipChild(mw))) { *cell = NonFixedCell; *x -= FIXED_COLUMN_LABEL_OFFSET(mw); *y -= FIXED_ROW_LABEL_OFFSET(mw); } else if (event->xbutton.window == XtWindow(mw)) if (*x < (int)COLUMN_LABEL_OFFSET(mw) && *x > (int)VERT_SB_OFFSET(mw)) *cell = RowLabelCell; else if (*y < (int)ROW_LABEL_OFFSET(mw) && *y > (int)HORIZ_SB_OFFSET(mw)) *cell = ColumnLabelCell; else *cell = FixedCell; else if (event->xbutton.window == XtWindow(ClipChild(mw))) *cell = NonFixedCell; else if (event->xbutton.window == XtWindow(TextChild(mw))) { Position tx, ty; if (mw->matrix.current_parent == ClipChild(mw)) *cell = NonFixedCell; else if (mw->matrix.current_parent == (Widget)mw) *cell = FixedCell; else /* We're on one of the extra clips */ { *cell = FixedCell; *x += mw->matrix.current_parent->core.x; *y += mw->matrix.current_parent->core.y; } XtVaGetValues(TextChild(mw), XmNx, &tx, XmNy, &ty, NULL); *x += tx; *y += ty; } else return False; return True; } /* * Convert a pixel position to the column it is contained in. */ int xbaeXtoCol(mw, x) XbaeMatrixWidget mw; int x; { int i; for (i = 0; i < mw->matrix.columns; i++) if (COLUMN_POSITION(mw, i) > x) return i - 1; /* * I have seen cases where this function returned mw->matrix.columns * causing a crash as array bounds are read - AL */ if (i > mw->matrix.columns) return mw->matrix.columns - 1; return i - 1; } /* * Convert a pixel position to the trailing * fixed column it is contained in */ int xbaeXtoTrailingCol(mw, x) XbaeMatrixWidget mw; int x; { int i; x += COLUMN_POSITION(mw, TRAILING_HORIZ_ORIGIN(mw)); for (i = TRAILING_HORIZ_ORIGIN(mw); i < mw->matrix.columns; i++) { if (COLUMN_POSITION(mw, i) > x) return i - 1; } return i - 1; } /* * Convert a row/column cell position to the x/y of its upper left corner * wrt the window it will be drawn in (either the matrix window for * fixed cells, or the clip window for non-fixed). */ void xbaeRowColToXY(mw, row, column, x, y) XbaeMatrixWidget mw; int row; int column; int *x; int *y; { /* * If we are in a fixed cell, calculate x/y relative to Matrixs * window (take into account labels etc) */ if (IS_FIXED(mw, row, column)) { /* * Ignore horiz_origin if we are in a fixed column */ if (IS_LEADING_FIXED_COLUMN(mw, column)) { if (IS_FIXED_ROW(mw, row)) *x = COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column); else *x = COLUMN_POSITION(mw, column); /* LeftClip */ } else if (IS_TRAILING_FIXED_COLUMN(mw, column)) { int m; if (IS_FIXED_ROW(mw, row)) *x = TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); else *x = 0; /* RightClip */ for (m = TRAILING_HORIZ_ORIGIN(mw); m < column; m++) *x += COLUMN_WIDTH(mw, m); } else if (IS_FIXED_ROW(mw, row)) *x = (COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, mw->matrix.fixed_columns)) - HORIZ_ORIGIN(mw); else *x = COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column) - HORIZ_ORIGIN(mw); /* * Ignore vert_origin if we are in a fixed row */ if (IS_LEADING_FIXED_ROW(mw, row)) { if (IS_FIXED_COLUMN(mw, column)) *y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * row; else *y = ROW_HEIGHT(mw) * row; /* TopClip */ } else if (IS_TRAILING_FIXED_ROW(mw, row)) { int m; if (IS_FIXED_COLUMN(mw, column)) *y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw); else *y = 0; /* BottomClip */ for (m = TRAILING_VERT_ORIGIN(mw); m < row; m++) *y += ROW_HEIGHT(mw); } else if (IS_FIXED_COLUMN(mw, column)) *y = ROW_HEIGHT(mw) * ((row - (int)mw->matrix.fixed_rows) - VERT_ORIGIN(mw)); else *y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * (row - VERT_ORIGIN(mw)); } /* * If we are not fixed we must account for fixed rows/columns * and scrolling origins. */ else { *x = (COLUMN_POSITION(mw, column) - COLUMN_POSITION(mw, mw->matrix.fixed_columns)) - HORIZ_ORIGIN(mw); *y = ROW_HEIGHT(mw) * ((row - (int) mw->matrix.fixed_rows) - VERT_ORIGIN(mw)); *y -= mw->matrix.first_row_offset; } } #define FIXED_NONE 0 #define FIXED_LEFT 1 #define FIXED_RIGHT 2 #define FIXED_TOP 4 #define FIXED_BOTTOM 8 #define FIXED_TOPLEFT 5 #define FIXED_TOPRIGHT 6 #define FIXED_BOTLEFT 9 #define FIXED_BOTRIGHT 10 /* Gotta love that numbering scheme! - AL */ /* * Returns the window on which a cell is displayed, i.e. the matrix, the clip, * or one of the extra clips which handle the fixed row/col cells. */ Window xbaeGetCellWindow(mw, w, row, column) XbaeMatrixWidget mw; Widget *w; int row, column; { int posn; Window win; if (IS_LEADING_FIXED_ROW(mw, row)) posn = FIXED_TOP; else if (IS_TRAILING_FIXED_ROW(mw, row)) posn = FIXED_BOTTOM; else posn = FIXED_NONE; if (IS_LEADING_FIXED_COLUMN(mw, column)) posn += FIXED_LEFT; else if (IS_TRAILING_FIXED_COLUMN(mw, column)) posn += FIXED_RIGHT; else posn += FIXED_NONE; /* add zero!? */ switch(posn) { case FIXED_TOPLEFT: case FIXED_TOPRIGHT: case FIXED_BOTLEFT: case FIXED_BOTRIGHT: /* total fixed cell - on parent matrix window */ *w = (Widget)mw; win = XtWindow(mw); break; case FIXED_NONE: /* not fixed at all - on clip child */ *w = ClipChild(mw); win = XtWindow(ClipChild(mw)); break; case FIXED_LEFT: /* fixed col only - on left clip */ *w = LeftClip(mw); win = XtWindow(LeftClip(mw)); break; case FIXED_RIGHT: /* fixed trailing col only - on right clip */ win = XtWindow(RightClip(mw)); *w = RightClip(mw); break; case FIXED_TOP: /* fixed row only - on top clip */ win = XtWindow(TopClip(mw)); *w = TopClip(mw); break; case FIXED_BOTTOM: /* fixed trailing row only - on bottom clip */ win = XtWindow(BottomClip(mw)); *w = BottomClip(mw); break; default: /* bogus */ win = (Window)NULL; *w = (Widget)NULL; } return win; } void xbaeCalcVertFill(mw, win, x, y, row, column, ax, ay, width, height) XbaeMatrixWidget mw; Window win; int x; int y; int row; int column; int *ax; int *ay; int *width; int *height; { *ax = x; *width = COLUMN_WIDTH(mw, column); if (win == XtWindow(LeftClip(mw))) { *ax += COLUMN_LABEL_OFFSET(mw); *ay = LeftClip(mw)->core.y + LeftClip(mw)->core.height; } else if (win == XtWindow(RightClip(mw))) { *ax += TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw); *ay = RightClip(mw)->core.y + RightClip(mw)->core.height; } else if (win == XtWindow(BottomClip(mw))) { *ax += BottomClip(mw)->core.x; *ay = BottomClip(mw)->core.y + BottomClip(mw)->core.height; } else if (win == XtWindow(ClipChild(mw))) { if (XtIsManaged(LeftClip(mw))) *ax += FIXED_COLUMN_LABEL_OFFSET(mw); else *ax += COLUMN_LABEL_OFFSET(mw); *ay = ClipChild(mw)->core.y + ClipChild(mw)->core.height; if (*ax < (int)COLUMN_LABEL_OFFSET(mw)) { *width += *ax - COLUMN_LABEL_OFFSET(mw); *ax = COLUMN_LABEL_OFFSET(mw); } } else /* must be in a corner */ *ay = y; *height = MATRIX_VERT_VISIBLE_SPACE(mw) + ROW_LABEL_OFFSET(mw) + HORIZ_SB_OFFSET(mw) - *ay; /* * Unfortunately, on the filled area, we don't have the luxury * of the clip widgets to help us out with the edges of the area. * Check our width isn't going to draw outside the left or right clip */ if (! IS_FIXED_COLUMN(mw, column)) { if (XtIsManaged(LeftClip(mw)) && *ax < (int)FIXED_COLUMN_LABEL_OFFSET(mw)) { *width -= (FIXED_COLUMN_LABEL_OFFSET(mw) - *ax); *ax = FIXED_COLUMN_LABEL_OFFSET(mw); } if (XtIsManaged(RightClip(mw)) && ((*ax + *width) > (int)RightClip(mw)->core.x)) *width = RightClip(mw)->core.x - *ax; if (win == XtWindow(BottomClip(mw))) { if ((*ax + *width) > (int)(BottomClip(mw)->core.x + BottomClip(mw)->core.width)) *width = BottomClip(mw)->core.width + BottomClip(mw)->core.x - *ax; if (*ax < (int)COLUMN_LABEL_OFFSET(mw)) { *width += *ax - COLUMN_LABEL_OFFSET(mw); *ax = COLUMN_LABEL_OFFSET(mw); } } if ((win == XtWindow(ClipChild(mw))) && ((*ax + *width) > (int)(ClipChild(mw)->core.x + ClipChild(mw)->core.width))) *width = ClipChild(mw)->core.width + ClipChild(mw)->core.x - *ax; } } void xbaeCalcHorizFill(mw, win, x, y, row, column, ax, ay, width, height) XbaeMatrixWidget mw; Window win; int x; int y; int row; int column; int *ax; int *ay; int *width; int *height; { *ay = y; *height = ROW_HEIGHT(mw); if (win == XtWindow(TopClip(mw))) { *ax = TopClip(mw)->core.x + TopClip(mw)->core.width; *ay += ROW_LABEL_OFFSET(mw); } else if (win == XtWindow(BottomClip(mw))) { *ax = BottomClip(mw)->core.x + BottomClip(mw)->core.width; *ay += TRAILING_FIXED_ROW_LABEL_OFFSET(mw); } else if (win == XtWindow(RightClip(mw))) { *ax = RightClip(mw)->core.x + RightClip(mw)->core.width; *ay += RightClip(mw)->core.y; } else if (win == XtWindow(ClipChild(mw))) { if (XtIsManaged(TopClip(mw))) *ay += FIXED_ROW_LABEL_OFFSET(mw); else *ay += ROW_LABEL_OFFSET(mw); *ax = ClipChild(mw)->core.x + ClipChild(mw)->core.width; if (*ay < (int)ROW_LABEL_OFFSET(mw)) *ay = ROW_LABEL_OFFSET(mw); } else /* must be in a corner */ *ax = x; *width = MATRIX_HORIZ_VISIBLE_SPACE(mw) + COLUMN_LABEL_OFFSET(mw) + VERT_SB_OFFSET(mw) - *ax; /* * Unfortunately, on the filled area, we don't have the luxury * of the clip widgets to help us out with the edges of the area. * Check our width isn't going to draw outside the left or right clip, * or out past our matrix region. */ if (! IS_FIXED_ROW(mw, row)) { if (XtIsManaged(LeftClip(mw)) && (*ay < (int)FIXED_ROW_LABEL_OFFSET(mw))) { *height -= (FIXED_ROW_LABEL_OFFSET(mw) - *ay); *ay = FIXED_ROW_LABEL_OFFSET(mw); } if (XtIsManaged(RightClip(mw)) && ((*ay + *height) > (int)(RightClip(mw)->core.y + RightClip(mw)->core.height))) *height = RightClip(mw)->core.height + RightClip(mw)->core.y - *ay; if ((win == XtWindow(ClipChild(mw))) && ((*ay + *height) > (int)(ClipChild(mw)->core.y + ClipChild(mw)->core.height))) *height = ClipChild(mw)->core.height + ClipChild(mw)->core.y - *ay; } } grace-5.1.23/Xbae/Xbae/Matrix.h0000644000076500001440000006465707412442103015622 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Matrix.h,v 1.1.2.1 2001/12/26 21:42:27 fnevgeny Exp $ */ #ifndef _Xbae_Matrix_h #define _Xbae_Matrix_h /* * Matrix Widget public include file */ #include #include #include /* * A few definitions we like to use, but those with R4 won't have. * From Xfuncproto.h in R5. */ #ifndef XlibSpecificationRelease # ifndef _XFUNCPROTOBEGIN # ifdef __cplusplus /* for C++ V2.0 */ # define _XFUNCPROTOBEGIN extern "C" { # define _XFUNCPROTOEND } # else # define _XFUNCPROTOBEGIN # define _XFUNCPROTOEND # endif # endif /* _XFUNCPROTOBEGIN */ #else #include #endif #ifdef __cplusplus extern "C" { #endif /* Resources: * Name Class RepType Default Value * ---- ----- ------- ------------- * allowColumnResize ColumnResize Boolean False * altRowCount AltRowCount int 1 * boldLabels BoldLabels Boolean False * buttonLabels ButtonLabels Boolean False * buttonLabelBackground Color Pixel dynamic * calcCursorPosition CalcCursorPosition Boolean False * cellBackgrounds Colors PixelTable NULL * cellHighlightThickness HighlightThickness HorizontalDimension 2 * cellMarginHeight MarginHeight VerticalDimension 5 * cellMarginWidth MarginWidth HorizontalDimension 5 * cells Cells StringTable NULL * cellShadowThickness ShadowThickness Dimension 2 * cellShadowType ShadowType unsigned char SHADOW_OUT * cellShadowTypes CellShadowTypes ShadowTypeTable NULL * cellUserData CellUserData UserDataTable NULL * clipWindow XmCClipWindow Widget NULL (get only) * colors Colors PixelTable NULL * columnAlignments Alignments AlignmentArray dynamic * columnButtonLabels ButtonLabels BooleanArray NULL * columnLabelAlignments Alignments AlignmentArray dynamic * columnLabelColor Color Pixel dynamic * columnLabels Labels StringArray NULL * columnMaxLengths ColumnMaxLengths MaxLengthArray NULL * columnShadowTypes ShadowTypes ShadowTypeArray NULL * columnUserData UserDatas UserDataArray NULL * columnWidths ColumnWidths WidthArray NULL * columns Columns int 0 * defaultActionCallback Callback Callback NULL * doubleClickInterval Interval int dynamic * drawCellCallback Callback Callback NULL * enterCellCallback Callback Callback NULL * evenRowBackground Background Pixel dynamic * fill Fill Boolean False * fixedColumns FixedColumns Dimension 0 * fixedRows FixedRows Dimension 0 * fontList FontList FontList fixed * labelFont FontList FontList fixed * gridLineColor Color Pixel dynamic * gridType GridType GridType XmGRID_CELL_LINE * highlightedCells HighlightedCells HighlightTable dynamic * horizonalScrollBar HorizonalScrollBar Widget NULL (get only) * horizontalScrollBarDisplayPolicy * XmCMatrixScrollBarDisplayPolicy * unsigned char AS_NEEDED * labelActivateCallback Callback Callback NULL * leaveCellCallback Callback Callback NULL * leftColumn LeftColumn int 0 * modifyVerifyCallback Callback Callback NULL * oddRowBackground Background Pixel NULL * processDragCallback Callback Callback NULL * resizeCallback Callback Callback NULL * resizeColumnCallback Callback Callback NULL * reverseSelect reverseSelect Boolean False * rowButtonLabels ButtonLabels BooleanArray NULL * rowLabelAlignment Alignment Alignment XmALIGNMENT_END * rowLabelColor Color Pixel dynamic * rowLabelWidth RowLabelWidth Short dynamic * rowLabels Labels StringArray NULL * rowShadowTypes ShadowTypes ShadowTypeArray NULL * rowUserData UserDatas UserDataArray NULL * rows Rows int 0 * selectCellCallback Callback Callback NULL * selectedBackground Color Pixel dynamic * selectedCells SelectedCells BooleanTable dynamic * selectedForeground Color Pixel dynamic * selectScrollVisible SelectScrollVisible Boolean True * space Space Dimension 6 * shadowType ShadowType unsigned char SHADOW_IN * textBackground Backgound Pixel dynamic * textField TextField Widget NULL (get only) * textShadowThickness TextShadowThickness Dimension 0 * textTranslations Translations TranslationTable dynamic * topRow TopRow int 0 * trailingFixedColumns TrailingFixedColumns Dimension 0 * trailingFixedRows TrailingFixedRows Dimension 0 * traverseCellCallback Callback Callback NULL * traverseFixedCells TraverseFixedCells Boolean False * verticalScrollBar VerticalScrollBar Widget NULL (get only) * verticalScrollBarDisplayPolicy * XmCMatrixScrollBarDisplayPolicy * unsigned char AS_NEEDED * visibleColumns VisibleColumns Dimension 0 * visibleRows VisibleRows Dimension 0 * writeCellCallback Callback Callback NULL */ #ifndef XmNallowColumnResize #define XmNallowColumnResize "allowColumnResize" #endif #ifndef XmNaltRowCount #define XmNaltRowCount "altRowCount" #endif #ifndef XmNboldLabels #define XmNboldLabels "boldLabels" #endif #ifndef XmNbuttonLabels #define XmNbuttonLabels "buttonLabels" #endif #ifndef XmNbuttonLabelBackground #define XmNbuttonLabelBackground "buttonLabelBackground" #endif #ifndef XmNcalcCursorPosition #define XmNcalcCursorPosition "calcCursorPosition" #endif #ifndef XmNcellBackgrounds #define XmNcellBackgrounds "cellBackgrounds" #endif #ifndef XmNcellHighlightThickness #define XmNcellHighlightThickness "cellHighlightThickness" #endif #ifndef XmNcellMarginHeight #define XmNcellMarginHeight "cellMarginHeight" #endif #ifndef XmNcellMarginWidth #define XmNcellMarginWidth "cellMarginWidth" #endif #ifndef XmNcellShadowType #define XmNcellShadowType "cellShadowType" #endif #ifndef XmNcellShadowTypes #define XmNcellShadowTypes "cellShadowTypes" #endif #ifndef XmNcellShadowThickness #define XmNcellShadowThickness "cellShadowThickness" #endif #ifndef XmNcellUserData #define XmNcellUserData "cellUserData" #endif #if CELL_WIDGETS #ifndef XmNcellWidgets #define XmNcellWidgets "cellWidgets" #endif #endif #ifndef XmNcells #define XmNcells "cells" #endif #ifndef XmNcolors #define XmNcolors "colors" #endif #ifndef XmNcolumnAlignments #define XmNcolumnAlignments "columnAlignments" #endif #ifndef XmNcolumnButtonLabels #define XmNcolumnButtonLabels "columnButtonLabels" #endif #ifndef XmNcolumnLabelAlignments #define XmNcolumnLabelAlignments "columnLabelAlignments" #endif #ifndef XmNcolumnLabelBackground #define XmNcolumnLabelBackground "columnLabelBackground" #endif #ifndef XmNcolumnLabelColor #define XmNcolumnLabelColor "columnLabelColor" #endif #ifndef XmNcolumnLabels #define XmNcolumnLabels "columnLabels" #endif #ifndef XmNcolumnMaxLengths #define XmNcolumnMaxLengths "columnMaxLengths" #endif #ifndef XmNcolumnShadowTypes #define XmNcolumnShadowTypes "columnShadowTypes" #endif #ifndef XmNcolumnUserData #define XmNcolumnUserData "columnUserData" #endif #ifndef XmNcolumnWidths #define XmNcolumnWidths "columnWidths" #endif #ifndef XmNdrawCellCallback #define XmNdrawCellCallback "drawCellCallback" #endif #ifndef XmNenterCellCallback #define XmNenterCellCallback "enterCellCallback" #endif #ifndef XmNevenRowBackground #define XmNevenRowBackground "evenRowBackground" #endif #ifndef XmNfill #define XmNfill "fill" #endif #ifndef XmNfixedColumns #define XmNfixedColumns "fixedColumns" #endif #ifndef XmNfixedRows #define XmNfixedRows "fixedRows" #endif #ifndef XmNgridLineColor #define XmNgridLineColor "gridLineColor" #endif #ifndef XmNgridType #define XmNgridType "gridType" #endif #if XmVersion >= 1002 #ifndef XmNhighlightedCells #define XmNhighlightedCells "highlightedCells" #endif #endif #ifndef XmNhorizontalScrollBarDisplayPolicy #define XmNhorizontalScrollBarDisplayPolicy "horizontalScrollBarDisplayPolicy" #endif #ifndef XmNlabelActivateCallback #define XmNlabelActivateCallback "labelActivateCallback" #endif #ifndef XmNlabelFont #define XmNlabelFont "labelFont" #endif #ifndef XmNleaveCellCallback #define XmNleaveCellCallback "leaveCellCallback" #endif #ifndef XmNleftColumn #define XmNleftColumn "leftColumn" #endif #ifndef XmNoddRowBackground #define XmNoddRowBackground "oddRowBackground" #endif #if XmVersion > 1001 #ifndef XmNprocessDragCallback #define XmNprocessDragCallback "processDragCallback" #endif #endif #ifndef XmNresizeCallback #define XmNresizeCallback "resizeCallback" #endif #ifndef XmNresizeColumnCallback #define XmNresizeColumnCallback "resizeColumnCallback" #endif #ifndef XmNreverseSelect #define XmNreverseSelect "reverseSelect" #endif #ifndef XmNrowButtonLabels #define XmNrowButtonLabels "rowButtonLabels" #endif #ifndef XmNrowLabelAlignment #define XmNrowLabelAlignment "rowLabelAlignment" #endif #ifndef XmNrowLabelWidth #define XmNrowLabelWidth "rowLabelWidth" #endif #ifndef XmNrowLabelBackground #define XmNrowLabelBackground "rowLabelBackground" #endif #ifndef XmNrowLabelColor #define XmNrowLabelColor "rowLabelColor" #endif #ifndef XmNrowLabels #define XmNrowLabels "rowLabels" #endif #ifndef XmNrowShadowTypes #define XmNrowShadowTypes "rowShadowTypes" #endif #ifndef XmNrowUserData #define XmNrowUserData "rowUserData" #endif #ifndef XmNselectedCells #define XmNselectedCells "selectedCells" #endif #ifndef XmNselectedBackground #define XmNselectedBackground "selectedBackground" #endif #ifndef XmNselectCellCallback #define XmNselectCellCallback "selectCellCallback" #endif #ifndef XmNselectedForeground #define XmNselectedForeground "selectedForeground" #endif #ifndef XmNselectScrollVisible #define XmNselectScrollVisible "selectScrollVisible" #endif #ifndef XmNtextBackground #define XmNtextBackground "textBackground" #endif #ifndef XmNtextField #define XmNtextField "textField" #endif #ifndef XmNtopRow #define XmNtopRow "topRow" #endif #ifndef XmNtrailingAttachedBottom #define XmNtrailingAttachedBottom "trailingAttachedBottom" #endif #ifndef XmNtrailingAttachedRight #define XmNtrailingAttachedRight "trailingAttachedRight" #endif #ifndef XmNtrailingFixedColumns #define XmNtrailingFixedColumns "trailingFixedColumns" #endif #ifndef XmNtrailingFixedRows #define XmNtrailingFixedRows "trailingFixedRows" #endif #ifndef XmNleftColumn #define XmNleftColumn "leftColumn" #endif #ifndef XmNtextShadowThickness #define XmNtextShadowThickness "textShadowThickness" #endif #ifndef XmNtraverseCellCallback #define XmNtraverseCellCallback "traverseCellCallback" #endif #ifndef XmNtraverseFixedCells #define XmNtraverseFixedCells "traverseFixedCells" #endif #ifndef XmNverticalScrollBarDisplayPolicy #define XmNverticalScrollBarDisplayPolicy "verticalScrollBarDisplayPolicy" #endif #ifndef XmNvisibleColumns #define XmNvisibleColumns "visibleColumns" #endif #ifndef XmNvisibleRows #define XmNvisibleRows "visibleRows" #endif #ifndef XmNwriteCellCallback #define XmNwriteCellCallback "writeCellCallback" #endif #ifndef XmCAlignments #define XmCAlignments "Alignments" #endif #ifndef XmCAltRowCount #define XmCAltRowCount "AltRowCount" #endif #ifndef XmCBoldLabels #define XmCBoldLabels "BoldLabels" #endif #ifndef XmCButtonLabels #define XmCButtonLabels "ButtonLabels" #endif #ifndef XmCCalcCursorPosition #define XmCCalcCursorPosition "CalcCursorPosition" #endif #ifndef XmCCells #define XmCCells "Cells" #endif #ifndef XmCCellShadowTypes #define XmCCellShadowTypes "CellShadowTypes" #endif #ifndef XmCCellUserData #define XmCCellUserData "CellUserData" #endif #if CELL_WIDGETS #ifndef XmCCellWidgets #define XmCCellWidgets "CellWidgets" #endif #endif #ifndef XmCColors #define XmCColors "Colors" #endif #ifndef XmCColumnMaxLengths #define XmCColumnMaxLengths "ColumnMaxLengths" #endif #ifndef XmCColumnResize #define XmCColumnResize "ColumnResize" #endif #ifndef XmCColumnWidths #define XmCColumnWidths "ColumnWidths" #endif #ifndef XmCFill #define XmCFill "Fill" #endif #ifndef XmCFixedColumns #define XmCFixedColumns "FixedColumns" #endif #ifndef XmCFixedRows #define XmCFixedRows "FixedRows" #endif #ifndef XmCGridType #define XmCGridType "GridType" #endif #if XmVersion >= 1002 #ifndef XmCHighlightedCells #define XmCHighlightedCells "HighlightedCells" #endif #endif #ifndef XmCLabels #define XmCLabels "Labels" #endif #ifndef XmCLeftColumn #define XmCLeftColumn "LeftColumn" #endif #ifndef XmCMatrixScrollBarDisplayPolicy #define XmCMatrixScrollBarDisplayPolicy "MatrixScrollBarDisplayPolicy" #endif #ifndef XmCReverseSelect #define XmCReverseSelect "ReverseSelect" #endif #ifndef XmCRowLabelWidth #define XmCRowLabelWidth "RowLabelWidth" #endif #ifndef XmCSelectedCells #define XmCSelectedCells "SelectedCells" #endif #ifndef XmCSelectScrollVisible #define XmCSelectScrollVisible "SelectScrollVisible" #endif #ifndef XmCShadowTypes #define XmCShadowTypes "ShadowTypes" #endif #ifndef XmCTextBackground #define XmCTextBackground "TextBackground" #endif #ifndef XmCTextField #define XmCTextField "TextField" #endif #ifndef XmCTextShadowThickness #define XmCTextShadowThickness "TextShadowThickness" #endif #ifndef XmCTraverseFixedCells #define XmCTraverseFixedCells "TraverseFixedCells" #endif #ifndef XmCTopRow #define XmCTopRow "TopRow" #endif #ifndef XmCTrailingAttachedBottom #define XmCTrailingAttachedBottom "TrailingAttachedBottom" #endif #ifndef XmCTrailingAttachedRight #define XmCTrailingAttachedRight "TrailingAttachedRight" #endif #ifndef XmCTrailingFixedColumns #define XmCTrailingFixedColumns "TrailingFixedColumns" #endif #ifndef XmCTrailingFixedRows #define XmCTrailingFixedRows "TrailingFixedRows" #endif #ifndef XmCUserDatas #define XmCUserDatas "UserDatas" #endif #ifndef XmCVisibleColumns #define XmCVisibleColumns "VisibleColumns" #endif #ifndef XmCVisibleRows #define XmCVisibleRows "VisibleRows" #endif #ifndef XmRStringArray #define XmRStringArray "StringArray" #endif #ifndef XmRBooleanArray #define XmRBooleanArray "BooleanArray" #endif #ifndef XmRAlignmentArray #define XmRAlignmentArray "AlignmentArray" #endif #ifndef XmRBooleanTable #define XmRBooleanTable "BooleanTable" #endif #ifndef XmRCellTable #define XmRCellTable "CellTable" #endif #ifndef XmRWidgetTable #define XmRWidgetTable "WidgetTable" #endif #ifndef XmRGridType #define XmRGridType "GridType" #endif #if XmVersion >= 1002 #ifndef XmRHighlightTable #define XmRHighlightTable "HighlightTable" #endif #endif #ifndef XmRMatrixScrollBarDisplayPolicy #define XmRMatrixScrollBarDisplayPolicy "MatrixScrollBarDisplayPolicy" #endif #ifndef XmRMaxLengthArray #define XmRMaxLengthArray "MaxLengthArray" #endif #ifndef XmRPixelTable #define XmRPixelTable "PixelTable" #endif #ifndef XmRShadowTypeTable #define XmRShadowTypeTable "ShadowTypeTable" #endif #ifndef XmRShadowTypeArray #define XmRShadowTypeArray "ShadowTypeArray" #endif #ifndef XmRUserDataTable #define XmRUserDataTable "UserDataTable" #endif #ifndef XmRUserDataArray #define XmRUserDataArray "UserDataArray" #endif #ifndef XmRWidthArray #define XmRWidthArray "WidthArray" #endif #ifndef XbaeIsXbaeMatrix #define XbaeIsXbaeMatrix( w) XtIsSubclass(w, xbaeMatrixWidgetClass) #endif /* XbaeIsXbaeMatrix */ /* Class record constants */ externalref WidgetClass xbaeMatrixWidgetClass; typedef struct _XbaeMatrixClassRec *XbaeMatrixWidgetClass; typedef struct _XbaeMatrixRec *XbaeMatrixWidget; /* * Prototype wrapper */ #ifndef P #if defined(__STDC__) || defined (__cplusplus) #define P(x) x #else #define P(x) () #define const #define volatile #endif #endif /* * External interfaces to class methods */ _XFUNCPROTOBEGIN extern void XbaeMatrixAddColumns P((Widget, int, String *, String *, short *, int *, unsigned char *, unsigned char *, Pixel *, int)); extern void XbaeMatrixAddRows P((Widget, int , String *, String *, Pixel *, int)); extern void XbaeMatrixCancelEdit P((Widget, Boolean)); extern Boolean XbaeMatrixCommitEdit P((Widget, Boolean)); extern void XbaeMatrixDeleteColumns P((Widget, int, int)); extern void XbaeMatrixDeleteRows P((Widget, int, int)); extern void XbaeMatrixDeselectAll P((Widget)); extern void XbaeMatrixDeselectCell P((Widget, int, int)); extern void XbaeMatrixDeselectColumn P((Widget, int)); extern void XbaeMatrixDeselectRow P((Widget, int)); extern void XbaeMatrixEditCell P((Widget, int, int)); extern void XbaeMatrixFirstSelectedCell P((Widget, int *, int *)); extern int XbaeMatrixFirstSelectedColumn P((Widget)); extern int XbaeMatrixFirstSelectedRow P((Widget)); extern String XbaeMatrixGetCell P((Widget, int, int)); extern XtPointer XbaeMatrixGetCellUserData P((Widget, int, int)); extern XtPointer XbaeMatrixGetColumnUserData P((Widget, int)); extern void XbaeMatrixGetCurrentCell P((Widget, int *, int *)); extern int XbaeMatrixGetEventRowColumn P((Widget, XEvent *, int *, int *)); extern Boolean XbaeMatrixEventToXY P((Widget, XEvent *, int *, int *)); extern Boolean XbaeMatrixRowColToXY P((Widget, int, int, int *, int *)); extern int XbaeMatrixGetNumSelected P((Widget)); extern XtPointer XbaeMatrixGetRowUserData P((Widget, int)); extern Boolean XbaeMatrixIsCellSelected P((Widget, int, int)); extern Boolean XbaeMatrixIsColumnSelected P((Widget, int)); extern Boolean XbaeMatrixIsRowSelected P((Widget, int)); extern void XbaeMatrixRefresh P((Widget)); extern void XbaeMatrixRefreshCell P((Widget, int, int)); extern void XbaeMatrixRefreshColumn P((Widget, int)); extern void XbaeMatrixRefreshRow P((Widget, int)); extern void XbaeMatrixSelectAll P((Widget)); extern void XbaeMatrixSelectCell P((Widget, int, int)); extern void XbaeMatrixSelectColumn P((Widget, int)); extern void XbaeMatrixSelectRow P((Widget, int)); #if XmVersion >= 1002 extern void XbaeMatrixHighlightCell P((Widget, int, int)); extern void XbaeMatrixHighlightRow P((Widget, int)); extern void XbaeMatrixHighlightColumn P((Widget, int)); extern void XbaeMatrixUnhighlightCell P((Widget, int, int)); extern void XbaeMatrixUnhighlightRow P((Widget, int)); extern void XbaeMatrixUnhighlightColumn P((Widget, int)); extern void XbaeMatrixUnhighlightAll P((Widget)); #endif extern void XbaeMatrixSetCell P((Widget, int, int, const String)); extern void XbaeMatrixSetCellBackground P((Widget, int, int, Pixel)); extern void XbaeMatrixSetCellColor P((Widget, int, int, Pixel)); extern void XbaeMatrixSetCellUserData P((Widget, int, int, XtPointer)); #if CELL_WIDGETS extern void XbaeMatrixSetCellWidget P((Widget, int, int, Widget)); #endif extern void XbaeMatrixSetColumnBackgrounds P((Widget, int, Pixel *, int)); extern void XbaeMatrixSetColumnColors P((Widget, int, Pixel *, int)); extern void XbaeMatrixSetColumnUserData P((Widget, int, XtPointer)); extern void XbaeMatrixSetRowBackgrounds P((Widget, int, Pixel *, int)); extern void XbaeMatrixSetRowColors P((Widget, int , Pixel *, int)); extern void XbaeMatrixSetRowUserData P((Widget, int, XtPointer)); extern int XbaeMatrixVisibleColumns P((Widget)); extern int XbaeMatrixVisibleRows P((Widget)); extern int XbaeMatrixNumColumns P((Widget)); extern int XbaeMatrixNumRows P((Widget)); extern void XbaeMatrixDisableRedisplay P((Widget)); extern void XbaeMatrixEnableRedisplay P((Widget, Boolean)); extern void XbaeMatrixMakeCellVisible P((Widget, int, int)); extern Boolean XbaeMatrixIsRowVisible P((Widget, int)); extern Boolean XbaeMatrixIsColumnVisible P((Widget, int)); extern Boolean XbaeMatrixIsCellVisible P((Widget, int, int)); extern void XbaeMatrixVisibleCells P((Widget, int *, int *, int *, int *)); extern String XbaeMatrixGetColumnLabel P((Widget, int)); extern String XbaeMatrixGetRowLabel P((Widget, int)); extern void XbaeMatrixSetColumnLabel P((Widget, int, String)); extern void XbaeMatrixSetRowLabel P((Widget, int, String)); extern Widget XbaeCreateMatrix P((Widget, String, ArgList, Cardinal)); _XFUNCPROTOEND typedef unsigned char Alignment; typedef Alignment * AlignmentArray; typedef String * StringTable; typedef short Width; typedef Width * WidthArray; typedef int MaxLength; typedef MaxLength * MaxLengthArray; /* * cell shadow types */ enum { XmGRID_NONE = 0x00, XmGRID_CELL_LINE = 0x02, XmGRID_CELL_SHADOW = 0x03, XmGRID_ROW_LINE = 0x04, XmGRID_ROW_SHADOW = 0x05, XmGRID_COLUMN_LINE = 0x08, XmGRID_COLUMN_SHADOW = 0x09, /* Deprecated types. Use will cause * a run-time warning to be issued. */ XmGRID_LINE = 0x20, XmGRID_SHADOW_IN = 0x40, XmGRID_SHADOW_OUT = 0x80 }; /* * Enumeration for Matrix ScrollBar Display Policy */ enum { XmDISPLAY_NONE, XmDISPLAY_AS_NEEDED, XmDISPLAY_STATIC }; /* * Enumeration for type of a cell */ typedef enum { FixedCell, NonFixedCell, RowLabelCell, ColumnLabelCell } CellType; #if XmVersion >= 1002 /* * Enumeration for highlight reason/location */ enum { HighlightNone = 0x0000, HighlightCell = 0x0001, HighlightRow = 0x0002, HighlightColumn = 0x0004, HighlightOther = 0x0008, UnhighlightCell = 0x0010, UnhighlightRow = 0x0020, UnhighlightColumn = 0x0040, UnhighlightAll = UnhighlightCell | UnhighlightRow | UnhighlightColumn }; #endif /* * Callback reasons. Try to stay out of range of the Motif XmCR_* reasons. */ typedef enum _XbaeReasonType { XbaeModifyVerifyReason = 102, XbaeEnterCellReason, XbaeLeaveCellReason, XbaeTraverseCellReason, XbaeSelectCellReason, XbaeDrawCellReason, XbaeWriteCellReason, XbaeResizeReason, XbaeResizeColumnReason, XbaeDefaultActionReason, XbaeProcessDragReason, XbaeLabelActivateReason } XbaeReasonType; /* * DrawCell types. */ typedef enum { XbaeString=1, XbaePixmap } XbaeCellType; /* * The 'Any' struct which can be used in callbacks used with different * Callback structs but only need to access its 4 members */ typedef struct _XbaeMatrixAnyCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; } XbaeMatrixAnyCallbackStruct; /* * Struct passed to modifyVerifyCallback */ typedef struct _XbaeMatrixModifyVerifyCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; XmTextVerifyCallbackStruct *verify; const char *prev_text; } XbaeMatrixModifyVerifyCallbackStruct; /* * Struct passed to enterCellCallback */ typedef struct _XbaeMatrixEnterCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; int position; Boolean select_text; Boolean map; Cardinal num_params; String *params; Boolean doit; } XbaeMatrixEnterCellCallbackStruct; /* * Struct passed to leaveCellCallback */ typedef struct _XbaeMatrixLeaveCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; String value; Boolean doit; } XbaeMatrixLeaveCellCallbackStruct; /* * Struct passed to traverseCellCallback */ typedef struct _XbaeMatrixTraverseCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; int next_row; int next_column; int fixed_rows; int fixed_columns; int trailing_fixed_rows; int trailing_fixed_columns; int num_rows; int num_columns; String param; XrmQuark qparam; } XbaeMatrixTraverseCellCallbackStruct; /* * Struct passed to selectCellCallback */ typedef struct _XbaeMatrixSelectCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; Boolean **selected_cells; String **cells; Cardinal num_params; String *params; } XbaeMatrixSelectCellCallbackStruct; /* * Struct passed to drawCellCallback */ typedef struct _XbaeMatrixDrawCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; int width; int height; XbaeCellType type; String string; Pixmap pixmap; Pixmap mask; Pixel foreground; Pixel background; int depth; } XbaeMatrixDrawCellCallbackStruct; /* * Struct passed to writeCellCallback */ typedef struct _XbaeMatrixWriteCellCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; XbaeCellType type; String string; Pixmap pixmap; Pixmap mask; } XbaeMatrixWriteCellCallbackStruct; /* * Struct passed to resizeCallback */ typedef struct _XbaeMatrixResizeCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; Dimension width; Dimension height; } XbaeMatrixResizeCallbackStruct; /* * Struct passed to resizeColumnCallback * */ typedef struct _XbaeMatrixResizeColumnCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; int which; int columns; short *column_widths; } XbaeMatrixResizeColumnCallbackStruct; #if XmVersion > 1001 /* * Struct passed to processDragCallback */ typedef struct _XbaeMatrixProcessDragCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; String string; XbaeCellType type; Pixmap pixmap; Pixmap mask; Cardinal num_params; String *params; } XbaeMatrixProcessDragCallbackStruct; #endif /* * Struct passed to defaultActionCallback */ typedef struct _XbaeMatrixDefaultActionCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; } XbaeMatrixDefaultActionCallbackStruct; /* * Struct passed to labelActivateCallback */ typedef struct _XbaeMatrixLabelActivateCallbackStruct { XbaeReasonType reason; XEvent *event; int row; int column; Boolean row_label; String label; } XbaeMatrixLabelActivateCallbackStruct; /* provide clean-up for those with R4 */ #ifndef XlibSpecificationRelease # undef _Xconst # undef _XFUNCPROTOBEGIN # undef _XFUNCPROTOEND #endif #ifdef __cplusplus } /* Close scope of 'extern "C"' declaration which encloses file. */ #endif #endif /* _Xbae_Matrix_h */ grace-5.1.23/Xbae/Xbae/Clip.c0000644000076500001440000001377006766327620015247 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * ClipWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Clip.c,v 1.1 1999/09/11 01:25:36 fnevgeny Exp $ */ /* * Clip.c - private child of Matrix - used to clip Matrix's textField child */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include static char defaultTranslations[] = ": FocusIn()"; static XtResource resources[] = { { XmNexposeProc, XmCFunction, XtRFunction, sizeof(XtExposeProc), XtOffsetOf(XbaeClipRec, clip.expose_proc), XtRFunction, (XtPointer) NULL }, { XmNfocusCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), XtOffsetOf(XbaeClipRec, clip.focus_callback), XtRImmediate, (XtPointer) NULL }, }; /* * Declaration of methods */ static void ClassPartInitialize P((XbaeClipWidgetClass)); static void Realize P((XbaeClipWidget, XtValueMask *, XSetWindowAttributes *)); static void Redisplay P((XbaeClipWidget, XEvent *, Region)); static void Resize P((Widget)); static void Redraw P((XbaeClipWidget)); /* * Public convenience function */ void XbaeClipRedraw P((Widget w)); /* * Clip actions */ static void FocusInACT P((XbaeClipWidget, XEvent *, String *, Cardinal *)); static XtActionsRec actions[] = { {"FocusIn", (XtActionProc)FocusInACT}, }; XbaeClipClassRec xbaeClipClassRec = { { /* core_class fields */ /* superclass */ (WidgetClass) &xmPrimitiveClassRec, /* class_name */ "XbaeClip", /* widget_size */ sizeof(XbaeClipRec), /* class_initialize */ NULL, /* class_part_initialize*/ (XtWidgetClassProc)ClassPartInitialize, /* class_inited */ False, /* initialize */ NULL, /* initialize_hook */ NULL, /* realize */ (XtRealizeProc)Realize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ True, /* compress_exposure */ XtExposeCompressSeries | XtExposeGraphicsExpose | XtExposeNoExpose, /* compress_enterleave */ True, /* visible_interest */ False, /* destroy */ NULL, /* resize */ Resize, /* expose */ (XtExposeProc)Redisplay, /* set_values */ NULL, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ defaultTranslations, /* query_geometry */ NULL, /* display_accelerator */ NULL, /* extension */ NULL }, /* primitive_class fields */ { /* border_highlight */ NULL, /* border_unhighlight */ NULL, /* translations */ NULL, /* arm_and_activate */ NULL, /* syn_resources */ NULL, /* num_syn_resources */ 0, /* extension */ NULL }, /* clip_class fields */ { /* redraw */ (XbaeClipRedrawProc)Redraw, /* extension */ NULL, } }; WidgetClass xbaeClipWidgetClass = (WidgetClass) & xbaeClipClassRec; static void ClassPartInitialize(cwc) XbaeClipWidgetClass cwc; { register XbaeClipWidgetClass super = (XbaeClipWidgetClass) cwc->core_class.superclass; /* * Allow subclasses to inherit our redraw method */ if (cwc->clip_class.redraw == XbaeInheritRedraw) cwc->clip_class.redraw = super->clip_class.redraw; } static void Realize(cw, valueMask, attributes) XbaeClipWidget cw; XtValueMask *valueMask; XSetWindowAttributes *attributes; { /* * Don't call our superclasses realize method, because Primitive sets * bit_gravity and do_not_propagate */ XtCreateWindow((Widget)cw, InputOutput, CopyFromParent, *valueMask, attributes); } /* ARGSUSED */ static void Redisplay(cw, event, region) XbaeClipWidget cw; XEvent *event; Region region; { if (cw->clip.expose_proc) cw->clip.expose_proc((Widget)cw, event, region); } /* ARGSUSED */ static void Resize(w) Widget w; { /* * Xt will call the expose method when this method returns. * So we won't have to do any exposure stuff here, which * means the Matrix's SetValues method only needs to force a * redraw when a redisplay is needed, not when a relayout is performed. */ } /* * Clip redraw method */ /* ARGSUSED */ static void Redraw(cw) XbaeClipWidget cw; { if (XtIsRealized((Widget)cw)) XClearArea(XtDisplay(cw), XtWindow(cw), 0, 0, 0, 0, True); } /* * Public interface to redraw method */ void XbaeClipRedraw(w) Widget w; { /* * Make sure w is a Clip or a subclass */ XtCheckSubclass(w, xbaeClipWidgetClass, NULL); /* * Call the redraw method */ if (XtIsRealized(w)) (*((XbaeClipWidgetClass) XtClass(w))->clip_class.redraw) ((Widget)w); } /* ARGSUSED */ static void FocusInACT(cw, event, params, nparams) XbaeClipWidget cw; XEvent *event; String *params; Cardinal *nparams; { if (event->xany.type != FocusIn || !event->xfocus.send_event) return; if (cw->clip.focus_callback) XtCallCallbackList((Widget)cw, cw->clip.focus_callback, NULL); } grace-5.1.23/Xbae/Xbae/Make.common0000644000076500001440000000072307412442103016254 0ustar fnevgenyusers##################################################### # System-independent Make.common file for # # Xbae matrix widget library # ##################################################### SRCS = Actions.c Clip.c Converters.c Create.c Draw.c \ Matrix.c Methods.c Public.c ScrollMgr.c Shadow.c Utils.c OBJS = Actions$(O) Clip$(O) Converters$(O) Create$(O) Draw$(O) \ Matrix$(O) Methods$(O) Public$(O) ScrollMgr$(O) Shadow$(O) Utils$(O) grace-5.1.23/Xbae/Xbae/Public.c0000644000076500001440000012470706766327622015603 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: Public.c,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Public.c created by Andrew Lister (7 August, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include /* * Public interface to set_cell method */ void XbaeMatrixSetCell(w, row, column, value) Widget w; int row; int column; const String value; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_cell method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_cell) ((XbaeMatrixWidget)w, row, column, value, True); } /* * Public interface to edit_cell method */ void XbaeMatrixEditCell(w, row, column) Widget w; int row, column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the edit_cell method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.edit_cell) ((XbaeMatrixWidget)w, NULL, row, column, NULL, 0); XmProcessTraversal(TextChild(((XbaeMatrixWidget) w)), XmTRAVERSE_CURRENT); } /* * Public interface to select_cell method */ void XbaeMatrixSelectCell(w, row, column) Widget w; int row, column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the select_cell method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.select_cell) ((XbaeMatrixWidget)w, row, column); } /* * Public interface to select_row method */ void XbaeMatrixSelectRow(w, row) Widget w; int row; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the select_row method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.select_row) ((XbaeMatrixWidget)w, row); } /* * Public interface to select_column method */ void XbaeMatrixSelectColumn(w, column) Widget w; int column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the select_column method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.select_column) ((XbaeMatrixWidget)w, column); } /* * Public interface to deselect_all method */ void XbaeMatrixDeselectAll(w) Widget w; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the deselect_all method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.deselect_all) ((XbaeMatrixWidget)w); } /* * Public interface to select_all method */ void XbaeMatrixSelectAll(w) Widget w; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the deselect_all method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.select_all) ((XbaeMatrixWidget)w); } /* * Public interface to deselect_cell method */ void XbaeMatrixDeselectCell(w, row, column) Widget w; int row; int column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the deselect_cell method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.deselect_cell) ((XbaeMatrixWidget)w, row, column); } /* * Public interface to deselect_row method */ void XbaeMatrixDeselectRow(w, row) Widget w; int row; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the deselect_row method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.deselect_row) ((XbaeMatrixWidget)w, row); } /* * Public interface to deselect_column method */ void XbaeMatrixDeselectColumn(w, column) Widget w; int column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the deselect_column method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.deselect_column) ((XbaeMatrixWidget)w, column); } /* * Public interface to get_cell method */ String XbaeMatrixGetCell(w, row, column) Widget w; int row, column; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the get_cell method */ return (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.get_cell) ((XbaeMatrixWidget)w, row, column); } /* * Public interface to commit_edit method */ Boolean #if NeedFunctionPrototypes XbaeMatrixCommitEdit(Widget w, Boolean unmap) #else XbaeMatrixCommitEdit(w, unmap) Widget w; Boolean unmap; #endif { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the commit_edit method */ return (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.commit_edit) ((XbaeMatrixWidget)w, NULL, unmap); } /* * Public interface to cancel_edit method */ void #if NeedFunctionPrototypes XbaeMatrixCancelEdit(Widget w, Boolean unmap) #else XbaeMatrixCancelEdit(w, unmap) Widget w; Boolean unmap; #endif { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the cancel_edit method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.cancel_edit) ((XbaeMatrixWidget)w, unmap); } /* * Public interface to add_rows method */ void XbaeMatrixAddRows(w, position, rows, labels, colors, num_rows) Widget w; int position; String *rows; String *labels; Pixel *colors; int num_rows; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the add_rows method */ (*((XbaeMatrixWidgetClass)XtClass(w))->matrix_class.add_rows) ((XbaeMatrixWidget)w, position, rows, labels, colors, NULL, num_rows); } /* * Public interface to delete_rows method */ void XbaeMatrixDeleteRows(w, position, num_rows) Widget w; int position; int num_rows; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the delete_rows method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.delete_rows) ((XbaeMatrixWidget)w, position, num_rows); } /* * Public interface to add_columns method */ void XbaeMatrixAddColumns(w, position, columns, labels, widths, max_lengths, alignments, label_alignments, colors, num_columns) Widget w; int position; String *columns; String *labels; short *widths; int *max_lengths; unsigned char *alignments; unsigned char *label_alignments; Pixel *colors; int num_columns; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the add_columns method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.add_columns) ((XbaeMatrixWidget)w, position, columns, labels, widths, max_lengths, alignments, label_alignments, colors, NULL, num_columns); } /* * Public interface to delete_columns method */ void XbaeMatrixDeleteColumns(w, position, num_columns) Widget w; int position; int num_columns; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the delete_columns method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.delete_columns) ((XbaeMatrixWidget)w, position, num_columns); } /* * Public interface to set_row_colors method */ void XbaeMatrixSetRowColors(w, position, colors, num_colors) Widget w; int position; Pixel *colors; int num_colors; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_row_colors method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_row_colors) ((XbaeMatrixWidget)w, position, colors, num_colors, False); } /* * Public interface to set_column_colors method */ void XbaeMatrixSetColumnColors(w, position, colors, num_colors) Widget w; int position; Pixel *colors; int num_colors; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_column_colors method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_column_colors) ((XbaeMatrixWidget)w, position, colors, num_colors, False); } /* * Public interface to set_cell_color method */ void XbaeMatrixSetCellColor(w, row, column, color) Widget w; int row; int column; Pixel color; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_cell_color method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_cell_color) ((XbaeMatrixWidget)w, row, column, color, False); } /* * Public interface to set_row_colors method */ void XbaeMatrixSetRowBackgrounds(w, position, colors, num_colors) Widget w; int position; Pixel *colors; int num_colors; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_row_colors method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_row_colors) ((XbaeMatrixWidget)w, position, colors, num_colors, True); } /* * Public interface to set_column_colors method */ void XbaeMatrixSetColumnBackgrounds(w, position, colors, num_colors) Widget w; int position; Pixel *colors; int num_colors; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_column_colors method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_column_colors) ((XbaeMatrixWidget)w, position, colors, num_colors, True); } /* * Public interface to set_cell_color method */ void XbaeMatrixSetCellBackground(w, row, column, color) Widget w; int row; int column; Pixel color; { /* * Make sure w is a Matrix or a subclass */ XtCheckSubclass(w, xbaeMatrixWidgetClass, NULL); /* * Call the set_cell_color method */ (*((XbaeMatrixWidgetClass) XtClass(w))->matrix_class.set_cell_color) ((XbaeMatrixWidget)w, row, column, color, True); } /* * Help the user know what row & column he is in given an x & y (via an event). * Return True on success, False on failure. */ int XbaeMatrixGetEventRowColumn(w, event, row, column) Widget w; XEvent * event; int *row; int *column; { XbaeMatrixWidget mw; int x, y; CellType cell; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; /* Convert the event to the correct XY for the matrix widget. */ mw = (XbaeMatrixWidget) w; if (!xbaeEventToXY(mw, event, &x, &y, &cell)) return False; /* Convert the point to a row,column. If it does not pick a valid cell, then return. */ if (!xbaeXYToRowCol(mw, &x, &y, row, column, cell)) return False; return True; } /* * Public interface for xbaeEventToXY() */ Boolean XbaeMatrixEventToXY(w, event, x, y) Widget w; XEvent *event; int *x; int *y; { XbaeMatrixWidget mw; CellType cell; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget)w; if (!xbaeEventToXY(mw, event, x, y, &cell)) return False; return True; } /* * Public interface for xbaeRowColToXY(). From Philip Aston * (philipa@parallax.co.uk) */ Boolean XbaeMatrixRowColToXY(w, row, column, x, y) Widget w; int row; int column; int *x; int *y; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget)w; xbaeRowColToXY(mw, row, column, x, y); return True; } /* * Help the programmer to know what row & column we are currently at. * Set the row & column to -1 if bad widget. Maybe the program will core. :) */ void XbaeMatrixGetCurrentCell(w, row, column) Widget w; int *row; int *column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) *row = *column = -1; else { mw = (XbaeMatrixWidget)w; *row = mw->matrix.current_row; *column = mw->matrix.current_column; } } /* * Allow the programmer to call the Expose method directly if he feels * that it is really needed. */ void XbaeMatrixRefresh(w) Widget w; { XbaeMatrixWidget mw = (XbaeMatrixWidget)w; int x, y; if (mw->matrix.disable_redisplay) return; if (!XtIsSubclass(w, xbaeMatrixWidgetClass) || !XtIsRealized((Widget)mw)) return; /* * We're about to flush scroll exposure events, so reset the * scroll managers. */ xbaeSmDestroyScrollMgr(mw->matrix.matrix_scroll_mgr); xbaeSmDestroyScrollMgr(mw->matrix.clip_scroll_mgr); mw->matrix.matrix_scroll_mgr = xbaeSmCreateScrollMgr(); mw->matrix.clip_scroll_mgr = xbaeSmCreateScrollMgr(); /* * Don't respond to exposures. */ mw->matrix.disable_redisplay = 1; /* * Flush pending expose events. */ XmUpdateDisplay(w); /* * Respond to exposures. */ mw->matrix.disable_redisplay = 0; /* * Generate expose events on the Matrix to force the redrawing. */ x = 0; y = 0; if (mw->matrix.column_labels) XClearArea(XtDisplay(mw), XtWindow(mw), x, y, mw->core.width, ROW_LABEL_OFFSET(mw), True); y += ROW_LABEL_OFFSET(mw); if (mw->matrix.row_labels) XClearArea(XtDisplay(mw), XtWindow(mw), x, y, COLUMN_LABEL_OFFSET(mw), mw->core.height - x, True); x += COLUMN_LABEL_OFFSET(mw); if (mw->matrix.fixed_rows) { /* Clear the top clip completely */ XClearArea(XtDisplay(mw), XtWindow(TopClip(mw)), 0, 0, 0, 0, True); /* Don't forget the corner areas! */ if (mw->matrix.fixed_columns) XClearArea(XtDisplay(mw), XtWindow(mw), x, y, LeftClip(mw)->core.width, TopClip(mw)->core.height, True); if (mw->matrix.trailing_fixed_columns) XClearArea(XtDisplay(mw), XtWindow(mw), RightClip(mw)->core.x, y, RightClip(mw)->core.width, TopClip(mw)->core.height, True); } if (mw->matrix.fixed_columns) XClearArea(XtDisplay(mw), XtWindow(LeftClip(mw)), 0, 0, 0, 0, True); if (mw->matrix.trailing_fixed_columns) XClearArea(XtDisplay(mw), XtWindow(RightClip(mw)), 0, 0, 0, 0, True); if (mw->matrix.trailing_fixed_rows) { XClearArea(XtDisplay(mw), XtWindow(BottomClip(mw)), 0, 0, 0, 0, True); if (mw->matrix.fixed_columns) XClearArea(XtDisplay(mw), XtWindow(mw), x, BottomClip(mw)->core.y, LeftClip(mw)->core.width, BottomClip(mw)->core.height, True); if (mw->matrix.trailing_fixed_columns) XClearArea(XtDisplay(mw), XtWindow(mw), RightClip(mw)->core.x, BottomClip(mw)->core.y, RightClip(mw)->core.width, BottomClip(mw)->core.height, True); } /* * The areas to the right and bottom of the matrix also need to be * exposed. First to do is the right hand side. */ x = COLUMN_POSITION(mw, mw->matrix.columns-1) + COLUMN_WIDTH(mw, mw->matrix.columns-1); XClearArea(XtDisplay(mw), XtWindow(mw), x, 0, mw->core.width - x, mw->core.height, True); y = ClipChild(mw)->core.y + ClipChild(mw)->core.height + TRAILING_FIXED_ROW_HEIGHT(mw); XClearArea(XtDisplay(mw), XtWindow(mw), 0, y, mw->core.width, mw->core.height - y, True); XbaeClipRedraw(ClipChild(mw)); } /* * Public interface for redrawing one cell */ void XbaeMatrixRefreshCell(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw = (XbaeMatrixWidget)w; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; if (xbaeIsCellVisible(mw, row, column)) { /* this doesn't seem to be necessary -cg 16/7/99 */ /*xbaeClearCell(mw, row, column);*/ xbaeDrawCell(mw, row, column); } } /* * Redraw an entire column */ void XbaeMatrixRefreshColumn(w, column) Widget w; int column; { XbaeMatrixWidget mw = (XbaeMatrixWidget)w; int row; int found = 0; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; /* we attempt to be mildly efficient about this */ if (xbaeIsColumnVisible(mw, column)) { /* fixed always visible */ for (row = 0; row < mw->matrix.fixed_rows; row++) xbaeDrawCell(mw, row, column); /* now the scrollable clip */ for (; row < mw->matrix.rows - mw->matrix.trailing_fixed_rows; row++) if (xbaeIsRowVisible(mw, row)) { found = 1; xbaeDrawCell(mw, row, column); } else if (found) break; /* came to the end of the clip */ /* and finally trailing fixed are always visible */ for (row = mw->matrix.rows - mw->matrix.trailing_fixed_rows; row < mw->matrix.rows; row++) xbaeDrawCell(mw, row, column); } } /* * Redraw an entire row */ void XbaeMatrixRefreshRow(w, row) Widget w; int row; { XbaeMatrixWidget mw = (XbaeMatrixWidget)w; int column; int found = 0; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; /* we attempt to be mildly efficient about this */ if (xbaeIsRowVisible(mw, row)) { /* fixed always visible */ for (column = 0; column < mw->matrix.fixed_columns; column++) xbaeDrawCell(mw, row, column); /* now the scrollable clip */ for (; column < mw->matrix.columns - mw->matrix.trailing_fixed_columns; column++) if (xbaeIsColumnVisible(mw, column)) { found = 1; xbaeDrawCell(mw, row, column); } else if (found) break; /* came to the end of the clip */ /* and finally trailing fixed are always visible */ for (column = mw->matrix.columns - mw->matrix.trailing_fixed_columns; column < mw->matrix.columns; column++) xbaeDrawCell(mw, row, column); } } /* * XbaeMatrixVisibleRows() * * This routine returns the number of rows that are visible in the matrix. * * D. Craig Wilson 5-MAY-1995 * - Cloned from the local "xbaeAdjustTopRow(mw)" routine. */ int XbaeMatrixVisibleRows(w) Widget w; { XbaeMatrixWidget matrix = (XbaeMatrixWidget) w; int rows_visible = VISIBLE_HEIGHT(matrix) / ROW_HEIGHT(matrix); /* * If we have less than one full row visible, then count it as a full row. */ if (rows_visible == 0) rows_visible = 1; /* * rows_visible might be inaccurate since Clip may not have been resized. * Test this routine and see if we need to call XbaeMatrixRefresh() to * ensure accuracy. */ else if (rows_visible > matrix->matrix.rows) rows_visible = matrix->matrix.rows; return rows_visible; } /* XbaeMatrixVisibleRows */ /* * XbaeMatrixVisibleColumns() * * This routine returns the number of columns that are visible in the matrix. * * D. Craig Wilson 5-MAY-1995 * - Cloned from the local "xbaeAdjustTopRow(mw)" routine. */ int XbaeMatrixVisibleColumns (w) Widget w; { XbaeMatrixWidget matrix = (XbaeMatrixWidget)w; int left_column; int right_column; xbaeGetVisibleColumns(matrix, &left_column, &right_column); return right_column - left_column + 1; } /* XbaeMatrixVisibleColumns */ /* * Get per-cell user data */ XtPointer XbaeMatrixGetCellUserData(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw; XtPointer data; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return NULL; mw = (XbaeMatrixWidget) w; if (mw->matrix.cell_user_data) data = mw->matrix.cell_user_data[row][column]; else return NULL; return data; } /* * Set per-cell user data */ void XbaeMatrixSetCellUserData(w, row, column, data) Widget w; int row; int column; XtPointer data; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (! mw->matrix.cell_user_data) { XtPointer **copy; register int i; copy = (XtPointer **) XtMalloc(mw->matrix.rows * sizeof(XtPointer*)); for (i = 0; i < mw->matrix.rows; i++) copy[i] = (XtPointer*) XtCalloc(mw->matrix.columns, sizeof(XtPointer)); mw->matrix.cell_user_data = copy; } mw->matrix.cell_user_data[row][column] = data; return; } /* * Get per-row user data */ XtPointer XbaeMatrixGetRowUserData(w, row) Widget w; int row; { XbaeMatrixWidget mw; XtPointer data; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return NULL; mw = (XbaeMatrixWidget) w; if (mw->matrix.row_user_data) data = mw->matrix.row_user_data[row]; else return NULL; return data; } /* * Set per-row user data */ void XbaeMatrixSetRowUserData(w, row, data) Widget w; int row; XtPointer data; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (! mw->matrix.row_user_data) { XtPointer *copy; copy = (XtPointer *) XtCalloc(mw->matrix.rows, sizeof(XtPointer)); mw->matrix.row_user_data = copy; } mw->matrix.row_user_data[row]= data; return; } /* * Get per-column user data */ XtPointer XbaeMatrixGetColumnUserData(w, column) Widget w; int column; { XbaeMatrixWidget mw; XtPointer data; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return NULL; mw = (XbaeMatrixWidget) w; if (mw->matrix.column_user_data) data = mw->matrix.column_user_data[column]; else return NULL; return data; } /* * Set per-column user data */ void XbaeMatrixSetColumnUserData(w, column, data) Widget w; int column; XtPointer data; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (! mw->matrix.column_user_data) { XtPointer *copy; copy = (XtPointer *) XtCalloc(mw->matrix.columns, sizeof(XtPointer)); mw->matrix.column_user_data = copy; } mw->matrix.column_user_data[column]= data; return; } #if CELL_WIDGETS /* * Set per-cell widget */ void XbaeMatrixSetCellWidget(w, row, column, widget) Widget w; int row; int column; Widget widget; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (! mw->matrix.cell_widgets) { Widget **copy; register int i; copy = (Widget **) XtMalloc(mw->matrix.rows * sizeof(Widget*)); for (i = 0; i < mw->matrix.rows; i++) copy[i] = (Widget*) XtCalloc(mw->matrix.columns, sizeof(Widget)); mw->matrix.cell_widgets = copy; } mw->matrix.cell_widgets[row][column] = widget; return; } #endif Boolean XbaeMatrixIsRowSelected(w, row) Widget w; int row; { int col; XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; if (row < 0 || row >= mw->matrix.rows) { XtAppContext appcontext = XtWidgetToApplicationContext(w); XtAppError(appcontext, "Invalid row passed to XbaeMatrixIsRowSelected()"); return False; } if (!mw->matrix.selected_cells) return False; /* * Check all the cells in the row */ for (col = 0 ; col < mw->matrix.columns ; col++) if (! mw->matrix.selected_cells[row][col]) return False; /* * Return success */ return True; } Boolean XbaeMatrixIsColumnSelected(w, col) Widget w; int col; { int row; XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; if (col < 0 || col >= mw->matrix.columns) { XtAppContext appcontext = XtWidgetToApplicationContext(w); XtAppError(appcontext, "Invalid column passed to XbaeMatrixIsColumnSelected()"); return False; } if (!mw->matrix.selected_cells) return False; /* * Check all the cells in the row */ for (row = 0 ; row < mw->matrix.rows ; row++) if (! mw->matrix.selected_cells[row][col]) return False; /* * Return success */ return True; } Boolean XbaeMatrixIsCellSelected(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; if (column < 0 || column >= mw->matrix.columns || row < 0 || row >= mw->matrix.rows) { XtAppContext appcontext = XtWidgetToApplicationContext(w); XtAppError( appcontext, "Invalid coordinates passed to XbaeMatrixIsCellSelected()"); return False; } if (!mw->matrix.selected_cells) return False; if (! mw->matrix.selected_cells[row][column]) return False; /* * Return success */ return True; } int XbaeMatrixFirstSelectedRow(w) Widget w; { int i; XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return -1; mw = (XbaeMatrixWidget) w; if (!mw->matrix.selected_cells) return -1; /* * Linear search for first selected */ for (i = 0 ; i < mw->matrix.rows ; i++) if (XbaeMatrixIsRowSelected(w, i)) return i; /* * No selection - return an invalid row id */ return -1; } int XbaeMatrixFirstSelectedColumn(w) Widget w; { int i; XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return -1; mw = (XbaeMatrixWidget) w; if (!mw->matrix.selected_cells) return -1; /* * Linear search for first selected */ for (i = 0 ; i < mw->matrix.columns ; i++) if (XbaeMatrixIsColumnSelected(w, i)) return i; /* * No selection - return an invalid row id */ return -1; } void XbaeMatrixFirstSelectedCell(w, row, column) Widget w; int *row; int *column; { int i, j; XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) { *row = *column = -1; return; } mw = (XbaeMatrixWidget) w; if (!mw->matrix.selected_cells) { *row = -1; *column = -1; return; } for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) if (mw->matrix.selected_cells[ i ][ j ]) { *row = i; *column = j; return; } *row = *column = -1; } int XbaeMatrixGetNumSelected(w) Widget w; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return 0; mw = (XbaeMatrixWidget) w; return mw->matrix.selected_cells ? mw->matrix.num_selected_cells : 0; } int XbaeMatrixNumColumns(w) Widget w; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return 0; mw = (XbaeMatrixWidget) w; return mw->matrix.columns; } int XbaeMatrixNumRows(w) Widget w; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return 0; mw = (XbaeMatrixWidget) w; return mw->matrix.rows; } #if XmVersion >= 1002 void XbaeMatrixUnhighlightAll(w) Widget w; { XbaeMatrixWidget mw; int row, column; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (!mw->matrix.highlighted_cells) return; mw->matrix.highlight_location = UnhighlightAll; for (row = 0; row < mw->matrix.rows; row++) { for (column = 0; column < mw->matrix.columns; column++) { /* * If the cell is visible and highlighted */ if (mw->matrix.highlighted_cells[row][column] && xbaeIsCellVisible(mw, row, column)) xbaeDrawCell(mw, row, column); mw->matrix.highlighted_cells[row][column] = HighlightNone; } } mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixHighlightCell(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "highlightCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for HighlightCell.", NULL, 0); return; } /* * Scroll the cell onto the screen */ if (mw->matrix.scroll_select) xbaeMakeCellVisible(mw, row, column); if (!mw->matrix.highlighted_cells) xbaeCopyHighlightedCells(mw); /* * Establish location -- must be after scroll, * otherwise may not redraw properly */ mw->matrix.highlight_location = HighlightCell; /* * If the cell is not already highlighted */ if (!(mw->matrix.highlighted_cells[row][column] & HighlightCell)) { mw->matrix.highlighted_cells[row][column] |= HighlightCell; /* * Only redraw if cell is visible */ if (xbaeIsCellVisible(mw, row, column)) { int x, y; Window win; /* * Get the correct window */ win = xbaeGetCellWindow(mw, &w, row, column); /* * Convert row,column coordinates to the * coordinates relative to the correct window */ xbaeRowColToXY(mw, row, column, &x, &y); DRAW_HIGHLIGHT(XtDisplay(mw), win, mw->manager.highlight_GC, x + mw->matrix.cell_shadow_thickness, y + mw->matrix.cell_shadow_thickness, COLUMN_WIDTH(mw, column) - (2 * mw->matrix.cell_shadow_thickness), ROW_HEIGHT(mw) - (2 * mw->matrix.cell_shadow_thickness), mw->matrix.cell_highlight_thickness, LineSolid); } } mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixUnhighlightCell(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "unhighlightCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for UnhighlightCell.", NULL, 0); return; } if (!mw->matrix.highlighted_cells) return; mw->matrix.highlight_location = UnhighlightCell; if (xbaeIsCellVisible(mw, row, column)) xbaeDrawCell(mw, row, column); mw->matrix.highlighted_cells[row][column] &= ~HighlightCell; mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixHighlightRow(w, row) Widget w; int row; { XbaeMatrixWidget mw; int j, lc, rc; Boolean visible; unsigned char highlight; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (row >= mw->matrix.rows || row < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "highlightRow", "badIndex", "XbaeMatrix", "XbaeMatrix: Row out of bounds for HighlightRow.", NULL, 0); return; } if (!mw->matrix.highlighted_cells) xbaeCopyHighlightedCells(mw); /* * Scroll the row onto the screen */ if (mw->matrix.scroll_select) xbaeMakeRowVisible(mw, row); /* * Establish location -- must be after scroll, * otherwise may not redraw properly */ mw->matrix.highlight_location = HighlightRow; /* * For each cell in the row, if the cell is not already highlighted, * highlight it and redraw it if it is visible */ visible = xbaeIsRowVisible(mw, row); xbaeGetVisibleColumns(mw, &lc, &rc); highlight = (IN_GRID_ROW_MODE(mw) ? HighlightRow : HighlightOther); for (j = 0; j < mw->matrix.columns; j++) { if (!(mw->matrix.highlighted_cells[row][j] & highlight)) { mw->matrix.highlighted_cells[row][j] |= highlight; if (visible) xbaeDrawCell(mw, row, j); } } mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixUnhighlightRow(w, row) Widget w; int row; { XbaeMatrixWidget mw; int column, lc, rc; Boolean visible; unsigned char highlight; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (row >= mw->matrix.rows || row < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "highlightRow", "badIndex", "XbaeMatrix", "XbaeMatrix: Row out of bounds for UnhighlightRow.", NULL, 0); return; } if (!mw->matrix.highlighted_cells) return; mw->matrix.highlight_location = UnhighlightRow; visible = xbaeIsRowVisible(mw, row); /* * For each cell in the row, if the cell is highlighted, * unhighlight it and redraw it if it is visible */ xbaeGetVisibleColumns(mw, &lc, &rc); highlight = (IN_GRID_ROW_MODE(mw) ? HighlightRow : HighlightOther); for (column = 0; column < mw->matrix.columns; column++) { if (mw->matrix.highlighted_cells[row][column] & highlight) { if (visible) xbaeDrawCell(mw, row, column); mw->matrix.highlighted_cells[row][column] &= ~highlight; } } mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixHighlightColumn(w, column) Widget w; int column; { XbaeMatrixWidget mw; int row, tr, br; Boolean visible; unsigned char highlight; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "highlightColumn", "badIndex", "XbaeMatrix", "XbaeMatrix: Column out of bounds for HighlightColumn.", NULL, 0); return; } if (!mw->matrix.highlighted_cells) xbaeCopyHighlightedCells(mw); /* * Scroll the row onto the screen */ if (mw->matrix.scroll_select) xbaeMakeColumnVisible(mw, column); mw->matrix.highlight_location = HighlightColumn; /* * For each cell in the column, if the cell is not already highlighted, * highlight it and redraw it if it is visible */ visible = xbaeIsColumnVisible(mw, column); xbaeGetVisibleRows(mw, &tr, &br); highlight = (IN_GRID_COLUMN_MODE(mw) ? HighlightColumn : HighlightOther); for (row = 0; row < mw->matrix.rows; row++) { if (!(mw->matrix.highlighted_cells[row][column] & highlight)) { mw->matrix.highlighted_cells[row][column] |= highlight; if (visible) xbaeDrawCell(mw, row, column); } } mw->matrix.highlight_location = HighlightNone; } void XbaeMatrixUnhighlightColumn(w, column) Widget w; int column; { XbaeMatrixWidget mw; int row, tr, br; Boolean visible; unsigned char highlight; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "highlightColumn", "badIndex", "XbaeMatrix", "XbaeMatrix: Column out of bounds for UnhighlightColumn.", NULL, 0); return; } if (!mw->matrix.highlighted_cells) return; mw->matrix.highlight_location = UnhighlightColumn; visible = xbaeIsColumnVisible(mw, column); /* * For each cell in the row, if the cell is highlighted, * unhighlight it and redraw it if it is visible. */ xbaeGetVisibleRows(mw, &tr, &br); highlight = (IN_GRID_COLUMN_MODE(mw) ? HighlightColumn : HighlightOther); for (row = 0; row < mw->matrix.rows; row++) { if (mw->matrix.highlighted_cells[row][column] & highlight) { if (visible) xbaeDrawCell(mw, row, column); mw->matrix.highlighted_cells[row][column] &= ~highlight; } } mw->matrix.highlight_location = HighlightNone; } #endif void XbaeMatrixDisableRedisplay(w) Widget w; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; mw->matrix.disable_redisplay++ ; } void #if NeedFunctionPrototypes XbaeMatrixEnableRedisplay(Widget w, Boolean redisplay) #else XbaeMatrixEnableRedisplay(w, redisplay) Widget w; Boolean redisplay; #endif { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (mw->matrix.disable_redisplay) mw->matrix.disable_redisplay--; #undef FORCE_REDISPLAY_IF_TRUE #ifndef FORCE_REDISPLAY_IF_TRUE if (redisplay && mw->matrix.disable_redisplay == 0) XbaeMatrixRefresh(w); #else if (redisplay) { mw->matrix.disable_redisplay = 0; XbaeMatrixRefresh(w); } #endif } /* * Public interface for xbaeMakeCellVisible() */ void XbaeMatrixMakeCellVisible(w, row, column) Widget w; int row; int column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; xbaeMakeCellVisible(mw, row, column); } /* * Public interface for xbaeIsRowVisible() */ Boolean XbaeMatrixIsRowVisible(w, row) Widget w; int row; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; return xbaeIsRowVisible(mw, row); } /* * Public interface for xbaeIsColumnVisible() */ Boolean XbaeMatrixIsColumnVisible(w, col) Widget w; int col; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; return xbaeIsColumnVisible(mw, col); } /* * Public interface for xbaeIsCellVisible() */ Boolean XbaeMatrixIsCellVisible(w, row, col) Widget w; int row; int col; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return False; mw = (XbaeMatrixWidget) w; return xbaeIsCellVisible(mw, row, col); } /* * XbaeMatrixVisibleCells() * * This routine returns the range of cells that are visible in the matrix. * */ void XbaeMatrixVisibleCells(w, top_row, bottom_row, left_column, right_column) Widget w; int *top_row; int *bottom_row; int *left_column; int *right_column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; xbaeGetVisibleRows(mw, top_row, bottom_row); xbaeGetVisibleColumns(mw, left_column, right_column); } /* * Get the label of the column passed here. */ String XbaeMatrixGetColumnLabel(w, column) Widget w; int column; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return NULL; mw = (XbaeMatrixWidget)w; if (!(mw->matrix.column_labels) || column > mw->matrix.columns) return NULL; else return mw->matrix.column_labels[column]; } /* * Get the label of the row passed here. */ String XbaeMatrixGetRowLabel(w, row) Widget w; int row; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return NULL; mw = (XbaeMatrixWidget)w; if (!(mw->matrix.row_labels) || row > mw->matrix.rows) return NULL; else return mw->matrix.row_labels[row]; } void XbaeMatrixSetColumnLabel(w, column, value) Widget w; int column; String value; { XbaeMatrixWidget mw; ColumnLabelLines lines; String copy; if (!XtIsSubclass(w, xbaeMatrixWidgetClass) || !value) return; mw = (XbaeMatrixWidget) w; /* * Setting a column label when none are defined or changing the number * of lines in a column label would cause the need for a redraw of the * widget so we won't allow it. */ if (!mw->matrix.column_labels) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "setColumnLabel", "noLabels", "XbaeMatrix", "XbaeMatrix: Cannot set column labels when none defined", NULL, 0); return; } lines = (ColumnLabelLines)XtMalloc(sizeof(ColumnLabelLinesRec)); copy = XtNewString(value); xbaeParseColumnLabel(copy, lines); if (lines->lines != mw->matrix.column_label_lines[column].lines) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "setColumnLabel", "changeLines", "XbaeMatrix", "XbaeMatrix: Cannot change number of lines when setting column labels", NULL, 0); XtFree((XtPointer)copy); XtFree((XtPointer)lines->lengths); XtFree((XtPointer)lines); return; } /* * OK to make the change */ XtFree((XtPointer) mw->matrix.column_labels[column]); XtFree((XtPointer) mw->matrix.column_label_lines[column].lengths); mw->matrix.column_labels[column] = copy; mw->matrix.column_label_lines[column] = *lines; /* * Redraw the column label if it is visible. No expose event is * generated by simply changing the label */ if (xbaeIsColumnVisible(mw, column)) { /* * Don't generate expose events and let xbaeRedrawLabelsAndFixed * work it out - we know where we need to draw */ XClearArea(XtDisplay(mw), XtWindow(mw), COLUMN_LABEL_OFFSET(mw) + COLUMN_POSITION(mw, column), 0, COLUMN_WIDTH(mw, column), COLUMN_LABEL_HEIGHT(mw), False); xbaeDrawColumnLabel(mw, column, False); } return; } void XbaeMatrixSetRowLabel(w, row, value) Widget w; int row; String value; { XbaeMatrixWidget mw; if (!XtIsSubclass(w, xbaeMatrixWidgetClass)) return; mw = (XbaeMatrixWidget) w; if (!mw->matrix.row_labels || !value) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "setRowLabel", "noLabels", "XbaeMatrix", "XbaeMatrix: Cannot set row labels when none defined", NULL, 0); return; } XtFree((XtPointer) mw->matrix.row_labels[row]); mw->matrix.row_labels[row] = XtNewString(value); if (xbaeIsRowVisible(mw, row)) { int y; if (IS_LEADING_FIXED_ROW(mw, row)) y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * row; else if (IS_TRAILING_FIXED_ROW(mw, row)) y = TRAILING_FIXED_ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * (row - TRAILING_VERT_ORIGIN(mw)); else y = ROW_LABEL_OFFSET(mw) + ROW_HEIGHT(mw) * (row - VERT_ORIGIN(mw)); XClearArea(XtDisplay(mw), XtWindow(mw), 0, y, ROW_LABEL_WIDTH(mw), ROW_HEIGHT(mw), False); xbaeDrawRowLabel(mw, row, False); } } Widget XbaeCreateMatrix(parent, name, args, ac) Widget parent; String name; ArgList args; Cardinal ac; { return XtCreateWidget(name, xbaeMatrixWidgetClass, parent, args, ac); } grace-5.1.23/Xbae/Xbae/Methods.c0000644000076500001440000031656107412442103015746 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Methods.c,v 1.1.2.1 2001/12/26 21:42:27 fnevgeny Exp $ */ /* * Methods.c created by Andrew Lister (7 August, 1995) */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For memmove/bcopy */ #include #if !defined(HAVE_MEMMOVE) && !defined(XBAE_NEED_BCOPY) #define XBAE_NEED_BCOPY #endif /* Earl R. * Added another BCOPY macro for porting purposes. Porting to 15+ UNIX * platforms. Renamed bcopy to BCOPY and typecast to fix compiler warnings * on some platforms. */ #if !defined(XBAE_NEED_BCOPY) || defined(SVR4) || defined(VMS) || defined(__EMX__) #define BCOPY(src, dest, n) memmove((void *)(dest), (void *)(src), (n)) #else #define BCOPY(src, dest, n) bcopy((void *)(src), (void *)(dest), (n)) #endif static void AddRowsToTable P((XbaeMatrixWidget, int, String *, String *, Pixel *, Pixel *, int)); static void DeleteRowsFromTable P((XbaeMatrixWidget, int, int)); static void AddColumnsToTable P((XbaeMatrixWidget, int, String *, String *, short *, int *, unsigned char *, unsigned char *, Pixel *, Pixel *, int)); static void DeleteColumnsFromTable P((XbaeMatrixWidget, int, int)); static Boolean DoCommitEdit P((XbaeMatrixWidget, XEvent *)); /* * Add rows to the internal cells data structure. * If rows or labels is NULL, add empty rows. */ static void AddRowsToTable(mw, position, rows, labels, colors, backgrounds, num_rows) XbaeMatrixWidget mw; int position; String *rows; String *labels; Pixel *colors; Pixel *backgrounds; int num_rows; { int i, j; /* * Realloc a larger array of row pointers and a larger label arrays */ if (mw->matrix.cells || rows) mw->matrix.cells = (String **) XtRealloc((char *) mw->matrix.cells, (mw->matrix.rows + num_rows) * sizeof(String *)); if (mw->matrix.row_labels || labels) mw->matrix.row_labels = (String *) XtRealloc((char *) mw->matrix.row_labels, (mw->matrix.rows + num_rows) * sizeof(String)); if (mw->matrix.row_button_labels) mw->matrix.row_button_labels = (Boolean *) XtRealloc((char *) mw->matrix. row_button_labels, (mw->matrix.rows + num_rows) * sizeof(Boolean)); if (mw->matrix.colors || colors) mw->matrix.colors = (Pixel **) XtRealloc((char *) mw->matrix.colors, (mw->matrix.rows + num_rows) * sizeof(Pixel *)); if (mw->matrix.cell_background || backgrounds) mw->matrix.cell_background = (Pixel **) XtRealloc((char *) mw->matrix.cell_background, (mw->matrix.rows + num_rows) * sizeof(Pixel *)); if (mw->matrix.cell_user_data) mw->matrix.cell_user_data = (XtPointer **) XtRealloc((char*) mw->matrix.cell_user_data, (mw->matrix.rows + num_rows) * sizeof(XtPointer *)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets = (Widget **) XtRealloc((char*) mw->matrix.cell_widgets, (mw->matrix.rows + num_rows) * sizeof(Widget *)); #endif if (mw->matrix.row_user_data) mw->matrix.row_user_data = (XtPointer*) XtRealloc((char*) mw->matrix.row_user_data, (mw->matrix.rows + num_rows) * sizeof(XtPointer)); if (mw->matrix.cell_shadow_types) mw->matrix.cell_shadow_types = (unsigned char **) XtRealloc((char*) mw->matrix.cell_shadow_types, (mw->matrix.rows + num_rows) * sizeof(unsigned char *)); if (mw->matrix.row_shadow_types) mw->matrix.row_shadow_types = (unsigned char *) XtRealloc((char*) mw->matrix.row_shadow_types, (mw->matrix.rows + num_rows) * sizeof(unsigned char)); if (mw->matrix.selected_cells) mw->matrix.selected_cells = (Boolean **) XtRealloc((char *) mw->matrix.selected_cells, (mw->matrix.rows + num_rows) * sizeof(Boolean *)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) mw->matrix.highlighted_cells = (unsigned char **) XtRealloc((char *) mw->matrix.highlighted_cells, (mw->matrix.rows + num_rows) * sizeof(unsigned char *)); #endif /* * If we are inserting rows into the middle, we need to make room. */ if (position < mw->matrix.rows) { if (mw->matrix.cells) BCOPY(&mw->matrix.cells[position], &mw->matrix.cells[position + num_rows], (mw->matrix.rows - position) * sizeof(String *)); if (mw->matrix.row_labels) BCOPY(&mw->matrix.row_labels[position], &mw->matrix.row_labels[position + num_rows], (mw->matrix.rows - position) * sizeof(String)); if (mw->matrix.row_button_labels) BCOPY(&mw->matrix.row_button_labels[position], &mw->matrix.row_button_labels[position + num_rows], (mw->matrix.rows - position) * sizeof(Boolean)); if (mw->matrix.colors) BCOPY(&mw->matrix.colors[position], &mw->matrix.colors[position + num_rows], (mw->matrix.rows - position) * sizeof(Pixel *)); if (mw->matrix.cell_background) BCOPY(&mw->matrix.cell_background[position], &mw->matrix.cell_background[position + num_rows], (mw->matrix.rows - position) * sizeof(Pixel *)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) BCOPY(&mw->matrix.cell_widgets[position], &mw->matrix.cell_widgets[position + num_rows], (mw->matrix.rows - position) * sizeof(Widget *)); #endif if (mw->matrix.cell_user_data) BCOPY(&mw->matrix.cell_user_data[position], &mw->matrix.cell_user_data[position + num_rows], (mw->matrix.rows - position) * sizeof(XtPointer *)); if (mw->matrix.row_user_data) BCOPY(&mw->matrix.row_user_data[position], &mw->matrix.row_user_data[position + num_rows], (mw->matrix.rows - position) * sizeof(XtPointer)); if (mw->matrix.cell_shadow_types) BCOPY(&mw->matrix.cell_shadow_types[position], &mw->matrix.cell_shadow_types[position + num_rows], (mw->matrix.rows - position) * sizeof(unsigned char *)); if (mw->matrix.row_shadow_types) BCOPY(&mw->matrix.row_shadow_types[position], &mw->matrix.row_shadow_types[position + num_rows], (mw->matrix.rows - position) * sizeof(unsigned char)); if (mw->matrix.selected_cells) BCOPY(&mw->matrix.selected_cells[position], &mw->matrix.selected_cells[position + num_rows], (mw->matrix.rows - position) * sizeof(Boolean *)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) BCOPY(&mw->matrix.highlighted_cells[position], &mw->matrix.highlighted_cells[position + num_rows], (mw->matrix.rows - position) * sizeof(unsigned char *)); #endif } /* * Malloc a new row array for each new row. Copy the label for each row. * If no label was passed in, use a NULL String. Malloc a new Pixel * and Boolean row array for each new row. * Use False for new button label flags. */ for (i = 0; i < num_rows; i++) { if (mw->matrix.cells) mw->matrix.cells[i + position] = (String *) XtMalloc(mw->matrix.columns * sizeof(String)); if (mw->matrix.row_labels) mw->matrix.row_labels[i + position] = labels ? XtNewString(labels[i]) : XtNewString(""); if (mw->matrix.row_button_labels) mw->matrix.row_button_labels[i + position] = False; if (mw->matrix.colors) mw->matrix.colors[i + position] = (Pixel *) XtMalloc(mw->matrix.columns * sizeof(Pixel)); if (mw->matrix.cell_background) mw->matrix.cell_background[i + position] = (Pixel *) XtMalloc(mw->matrix.columns * sizeof(Pixel)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets[i + position] = (Widget *) XtMalloc(mw->matrix.columns * sizeof(Widget)); #endif if (mw->matrix.cell_user_data) mw->matrix.cell_user_data[i + position] = (XtPointer *) XtMalloc(mw->matrix.columns * sizeof(XtPointer)); if (mw->matrix.row_user_data) mw->matrix.row_user_data[i + position] = (XtPointer) NULL; if (mw->matrix.cell_shadow_types) mw->matrix.cell_shadow_types[i + position] = (unsigned char *) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); if (mw->matrix.row_shadow_types) mw->matrix.row_shadow_types[i + position] = mw->matrix.cell_shadow_type; if (mw->matrix.selected_cells) mw->matrix.selected_cells[i + position] = (Boolean *) XtMalloc(mw->matrix.columns * sizeof(Boolean)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) mw->matrix.highlighted_cells[i + position] = (unsigned char *) XtMalloc(mw->matrix.columns * sizeof(unsigned char)); #endif } /* * Copy the rows arrays passed in into each new row, or if NULL * was passed in initialize each row to NULL Strings. Copy the colors * arrays passed in into each new row, if NULL was passed use foreground. */ for (i = 0; i < num_rows; i++) for (j = 0; j < mw->matrix.columns; j++) { if (mw->matrix.cells) /* NULL row[j] is empty string. Earl R. */ mw->matrix.cells[i + position][j] = rows ? XtNewString((rows[i * mw->matrix.columns + j] ? rows[i * mw->matrix.columns + j] : "")) : XtNewString(""); if (mw->matrix.colors) mw->matrix.colors[i + position][j] = colors ? colors[i] : mw->manager.foreground; if (mw->matrix.cell_background) mw->matrix.cell_background[i + position][j] = backgrounds ? backgrounds[i] : mw->core.background_pixel; #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets[i + position][j] = NULL; #endif if (mw->matrix.cell_user_data) mw->matrix.cell_user_data[i + position][j] = (XtPointer) NULL; if (mw->matrix.cell_shadow_types) mw->matrix.cell_shadow_types[i + position][j] = mw->matrix.cell_shadow_type; if (mw->matrix.selected_cells) mw->matrix.selected_cells[i + position][j] = False; #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) mw->matrix.highlighted_cells[i + position][j] = HighlightNone; #endif } mw->matrix.rows += num_rows; } /* * Delete rows from the internal cells data structure. */ static void DeleteRowsFromTable(mw, position, num_rows) XbaeMatrixWidget mw; int position; int num_rows; { int i, j; /* * We don't bother to realloc, we will just have some wasted space. * XXX is this a problem? */ /* * Free all the cells in the rows being deleted and the rows themselves. * Also free the String row labels and label button flags. Free the color * arrays for the rows being deleted. */ for (i = position; i < position + num_rows; i++) { /* Fixed a crash I was getting, Since I allow NULL cells. Earl R. */ if (mw->matrix.cells && mw->matrix.cells[i]) { for (j = 0; j < mw->matrix.columns; j++) if (mw->matrix.cells[i][j]) XtFree((XtPointer) mw->matrix.cells[i][j]); XtFree((XtPointer) mw->matrix.cells[i]); } if (mw->matrix.row_labels) XtFree((XtPointer) mw->matrix.row_labels[i]); if (mw->matrix.colors) XtFree((XtPointer) mw->matrix.colors[i]); if (mw->matrix.cell_background) XtFree((XtPointer) mw->matrix.cell_background[i]); #if CELL_WIDGETS if (mw->matrix.cell_widgets) XtFree((XtPointer) mw->matrix.cell_widgets[i]); #endif if (mw->matrix.cell_user_data) XtFree((XtPointer) mw->matrix.cell_user_data[i]); if (mw->matrix.cell_shadow_types) XtFree((XtPointer) mw->matrix.cell_shadow_types[i]); if (mw->matrix.selected_cells) { /* * Deselect the row so num_selected_cells gets updated */ xbaeDeselectRow(mw, i); XtFree((XtPointer) mw->matrix.selected_cells[i]); } #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) XtFree((XtPointer) mw->matrix.highlighted_cells[i]); #endif } /* * Copy those rows which are below the ones deleted, up. * (unless we deleted rows from the bottom). */ if (position + num_rows < mw->matrix.rows) { if (mw->matrix.cells) BCOPY(&mw->matrix.cells[position + num_rows], &mw->matrix.cells[position], (mw->matrix.rows - position - num_rows) * sizeof(String *)); if (mw->matrix.row_labels) BCOPY(&mw->matrix.row_labels[position + num_rows], &mw->matrix.row_labels[position], (mw->matrix.rows - position - num_rows) * sizeof(String)); if (mw->matrix.row_button_labels) BCOPY(&mw->matrix.row_button_labels[position + num_rows], &mw->matrix.row_button_labels[position], (mw->matrix.rows - position - num_rows) * sizeof(Boolean)); if (mw->matrix.colors) BCOPY(&mw->matrix.colors[position + num_rows], &mw->matrix.colors[position], (mw->matrix.rows - position - num_rows) * sizeof(Pixel *)); if (mw->matrix.cell_background) BCOPY(&mw->matrix.cell_background[position + num_rows], &mw->matrix.cell_background[position], (mw->matrix.rows - position - num_rows) * sizeof(Pixel *)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) BCOPY(&mw->matrix.cell_widgets[position + num_rows], &mw->matrix.cell_widgets[position], (mw->matrix.rows - position - num_rows) * sizeof(Widget *)); #endif if (mw->matrix.cell_user_data) BCOPY(&mw->matrix.cell_user_data[position + num_rows], &mw->matrix.cell_user_data[position], (mw->matrix.rows - position - num_rows) * sizeof(XtPointer *)); if (mw->matrix.row_user_data) BCOPY(&mw->matrix.row_user_data[position + num_rows], &mw->matrix.row_user_data[position], (mw->matrix.rows - position - num_rows) * sizeof(XtPointer *)); if (mw->matrix.cell_shadow_types) BCOPY(&mw->matrix.cell_shadow_types[position + num_rows], &mw->matrix.cell_shadow_types[position], (mw->matrix.rows - position - num_rows) * sizeof(unsigned char *)); if (mw->matrix.row_shadow_types) BCOPY(&mw->matrix.row_shadow_types[position + num_rows], &mw->matrix.row_shadow_types[position], (mw->matrix.rows - position - num_rows) * sizeof(unsigned char *)); if (mw->matrix.selected_cells) BCOPY(&mw->matrix.selected_cells[position + num_rows], &mw->matrix.selected_cells[position], (mw->matrix.rows - position - num_rows) * sizeof(Boolean *)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) BCOPY(&mw->matrix.highlighted_cells[position + num_rows], &mw->matrix.highlighted_cells[position], (mw->matrix.rows - position - num_rows) * sizeof(unsigned char *)); #endif } mw->matrix.rows -= num_rows; } /* * Add columns to the internal cells data structure. * If columns or labels is NULL, add empty columns. * If max_lengths is NULL, widths will be used. * If alignments is NULL, use XmALIGNMENT_BEGINNING. * If label_alignments is NULL, use alignments, or if it is NULL * XmALIGNMENT_BEGINNING. * widths must not be NULL. */ static void AddColumnsToTable(mw, position, columns, labels, widths, max_lengths, alignments, label_alignments, colors, backgrounds, num_columns) XbaeMatrixWidget mw; int position; String *columns; String *labels; short *widths; int *max_lengths; unsigned char *alignments; unsigned char *label_alignments; Pixel *colors; Pixel *backgrounds; int num_columns; { int i, j; /* * Realloc larger cells, widths, max_lengths, alignments, colors, * highlighted_cells, selected_cells, labels and label lines arrays. */ if (mw->matrix.rows == 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "AddColumns", "noRows", "XbaeMatrix", "XbaeMatrix: Attempting to add columns with no rows.", NULL, 0); return; } for (i = 0; i < mw->matrix.rows; i++) { if (mw->matrix.cells || columns) { if (!mw->matrix.cells) { mw->matrix.columns += num_columns; xbaeCopyCells(mw); mw->matrix.columns -= num_columns; } else mw->matrix.cells[i] = (String *) XtRealloc((char *) mw->matrix.cells[i], (mw->matrix.columns + num_columns) * sizeof(String)); } if (mw->matrix.colors || colors) { if (!mw->matrix.colors) { mw->matrix.columns += num_columns; xbaeCopyColors(mw); mw->matrix.columns -= num_columns; } else mw->matrix.colors[i] = (Pixel *) XtRealloc((char *) mw->matrix.colors[i], (mw->matrix.columns + num_columns) * sizeof(Pixel)); } if (mw->matrix.cell_background || backgrounds) { if (!mw->matrix.cell_background) { mw->matrix.columns += num_columns; xbaeCopyBackgrounds(mw); mw->matrix.columns -= num_columns; } else mw->matrix.cell_background[i] = (Pixel *) XtRealloc((char *) mw->matrix.cell_background[i], (mw->matrix.columns + num_columns) * sizeof(Pixel)); } #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets[i] = (Widget *) XtRealloc((char *) mw->matrix.cell_widgets[i], (mw->matrix.columns + num_columns) * sizeof(Widget)); #endif if (mw->matrix.cell_user_data) mw->matrix.cell_user_data[i] = (XtPointer *) XtRealloc((char*) mw->matrix.cell_user_data[i], (mw->matrix.columns + num_columns) * sizeof(XtPointer)); if (mw->matrix.cell_shadow_types) mw->matrix.cell_shadow_types[i] = (unsigned char *) XtRealloc((char*) mw->matrix.cell_shadow_types[i], (mw->matrix.columns + num_columns) * sizeof(unsigned char)); if (mw->matrix.selected_cells) mw->matrix.selected_cells[i] = (Boolean *) XtRealloc((char *) mw->matrix.selected_cells[i], (mw->matrix.columns + num_columns) * sizeof(Boolean)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) mw->matrix.highlighted_cells[i] = (unsigned char *) XtRealloc( (char *) mw->matrix.highlighted_cells[i], (mw->matrix.columns + num_columns) * sizeof(unsigned char)); #endif } mw->matrix.column_widths = (short *) XtRealloc((char *) mw->matrix.column_widths, (mw->matrix.columns + num_columns) * sizeof(short)); if (mw->matrix.column_max_lengths) mw->matrix.column_max_lengths = (int *) XtRealloc((char *) mw->matrix.column_max_lengths, (mw->matrix.columns + num_columns) * sizeof(int)); if (mw->matrix.column_alignments) mw->matrix.column_alignments = (unsigned char *) XtRealloc((char *) mw->matrix.column_alignments, (mw->matrix.columns + num_columns) * sizeof(unsigned char)); if (mw->matrix.column_button_labels) mw->matrix.column_button_labels = (Boolean *) XtRealloc((char *) mw->matrix. column_button_labels, (mw->matrix.columns + num_columns) * sizeof(Boolean)); if (mw->matrix.column_label_alignments) mw->matrix.column_label_alignments = (unsigned char *) XtRealloc((char *) mw->matrix. column_label_alignments, (mw->matrix.columns + num_columns) * sizeof(unsigned char)); if (mw->matrix.column_user_data) mw->matrix.column_user_data = (XtPointer*) XtRealloc((char*) mw->matrix.column_user_data, (mw->matrix.columns + num_columns) * sizeof(XtPointer)); if (mw->matrix.column_shadow_types) mw->matrix.column_shadow_types = (unsigned char *) XtRealloc((char*) mw->matrix.column_shadow_types, (mw->matrix.columns + num_columns) * sizeof(unsigned char)); if (mw->matrix.column_labels) { mw->matrix.column_labels = (String *) XtRealloc((char *) mw->matrix.column_labels, (mw->matrix.columns + num_columns) * sizeof(String)); mw->matrix.column_label_lines = (ColumnLabelLines) XtRealloc( (char *) mw->matrix.column_label_lines, (mw->matrix.columns + num_columns) * sizeof(ColumnLabelLinesRec)); } /* * If we are inserting columns into the middle, we need to make room. */ if (position < mw->matrix.columns) { BCOPY(&mw->matrix.column_widths[position], &mw->matrix.column_widths[position + num_columns], (mw->matrix.columns - position) * sizeof(short)); if (mw->matrix.column_max_lengths) BCOPY(&mw->matrix.column_max_lengths[position], &mw->matrix.column_max_lengths[position + num_columns], (mw->matrix.columns - position) * sizeof(int)); if (mw->matrix.column_alignments) BCOPY(&mw->matrix.column_alignments[position], &mw->matrix.column_alignments[position + num_columns], (mw->matrix.columns - position) * sizeof(unsigned char)); if (mw->matrix.column_button_labels) BCOPY(&mw->matrix.column_button_labels[position], &mw->matrix.column_button_labels[position + num_columns], (mw->matrix.columns - position) * sizeof(Boolean)); if (mw->matrix.column_label_alignments) BCOPY(&mw->matrix.column_label_alignments[position], &mw->matrix.column_label_alignments[position + num_columns], (mw->matrix.columns - position) * sizeof(unsigned char)); if (mw->matrix.column_user_data) BCOPY(&mw->matrix.column_user_data[position], &mw->matrix.column_user_data[position + num_columns], (mw->matrix.columns - position) * sizeof(XtPointer)); if (mw->matrix.column_shadow_types) BCOPY(&mw->matrix.column_shadow_types[position], &mw->matrix.column_shadow_types[position + num_columns], (mw->matrix.columns - position) * sizeof(unsigned char)); if (mw->matrix.column_labels) { BCOPY(&mw->matrix.column_labels[position], &mw->matrix.column_labels[position + num_columns], (mw->matrix.columns - position) * sizeof(String)); BCOPY(&mw->matrix.column_label_lines[position], &mw->matrix.column_label_lines[position + num_columns], (mw->matrix.columns - position) * sizeof(ColumnLabelLinesRec)); } /* * Shift the columns in each row. */ for (i = 0; i < mw->matrix.rows; i++) { if (mw->matrix.cells) BCOPY(&mw->matrix.cells[i][position], &mw->matrix.cells[i][position + num_columns], (mw->matrix.columns - position) * sizeof(String)); if (mw->matrix.colors) BCOPY(&mw->matrix.colors[i][position], &mw->matrix.colors[i][position + num_columns], (mw->matrix.columns - position) * sizeof(Pixel)); if (mw->matrix.cell_background) BCOPY(&mw->matrix.cell_background[i][position], &mw->matrix.cell_background[i][position + num_columns], (mw->matrix.columns - position) * sizeof(Pixel)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) BCOPY(&mw->matrix.cell_widgets[i][position], &mw->matrix.cell_widgets[i][position + num_columns], (mw->matrix.columns - position) * sizeof(Widget)); #endif if (mw->matrix.cell_user_data) BCOPY(&mw->matrix.cell_user_data[i][position], &mw->matrix.cell_user_data[i][position + num_columns], (mw->matrix.columns - position) * sizeof(XtPointer)); if (mw->matrix.cell_shadow_types) BCOPY(&mw->matrix.cell_shadow_types[i][position], &mw->matrix.cell_shadow_types[i][position + num_columns], (mw->matrix.columns - position) * sizeof(unsigned char)); if (mw->matrix.selected_cells) BCOPY(&mw->matrix.selected_cells[i][position], &mw->matrix.selected_cells[i][position + num_columns], (mw->matrix.columns - position) * sizeof(Boolean)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) BCOPY(&mw->matrix.highlighted_cells[i][position], &mw->matrix.highlighted_cells[i][position + num_columns], (mw->matrix.columns - position) * sizeof(unsigned char)); #endif } } /* * Copy all of the passed in info into each new column * (except column_positions which will be recalculated below). * If columns or labels is NULL, add empty columns. * If max_lengths is NULL, widths will be used. * If alignments is NULL, use XmALIGNMENT_BEGINNING. * If label_alignments is NULL, use XmALIGNMENT_BEGINNING * If labels is NULL, use NULL strings. * If colors is NULL, use foreground. * Use False for new button label flags. */ for (j = 0; j < num_columns; j++) { mw->matrix.column_widths[j + position] = widths[j]; if (mw->matrix.column_max_lengths) mw->matrix.column_max_lengths[j + position] = max_lengths ? max_lengths[j] : (int) widths[j]; if (mw->matrix.column_alignments) mw->matrix.column_alignments[j + position] = alignments ? alignments[j] : XmALIGNMENT_BEGINNING; if (mw->matrix.column_button_labels) mw->matrix.column_button_labels[j + position] = False; if (mw->matrix.column_label_alignments) mw->matrix.column_label_alignments[j + position] = label_alignments ? label_alignments[j] : XmALIGNMENT_BEGINNING; if (mw->matrix.column_user_data) mw->matrix.column_user_data[j + position] = (XtPointer) NULL; #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets[j + position] = NULL; #endif if (mw->matrix.column_shadow_types) mw->matrix.column_shadow_types[j + position] = mw->matrix.cell_shadow_type; if (mw->matrix.column_labels) { mw->matrix.column_labels[j + position] = labels ? XtNewString(labels[j]) : XtNewString(""); xbaeParseColumnLabel(mw->matrix.column_labels[j + position], &mw->matrix.column_label_lines[j + position]); } /* * Add this new column to each row. */ for (i = 0; i < mw->matrix.rows; i++) { if (mw->matrix.cells) mw->matrix.cells[i][j + position] = columns ? XtNewString(columns[i * num_columns + j]) : XtNewString(""); if (mw->matrix.colors) mw->matrix.colors[i][j + position] = colors ? colors[j] : mw->manager.foreground; if (mw->matrix.cell_background) mw->matrix.cell_background[i][j + position] = backgrounds ? backgrounds[j] : mw->core.background_pixel; #if CELL_WIDGETS if (mw->matrix.cell_widgets) mw->matrix.cell_widgets[i][j + position] = (Widget) NULL; #endif if (mw->matrix.cell_user_data) mw->matrix.cell_user_data[i][j + position] = (XtPointer) NULL; if (mw->matrix.cell_shadow_types) mw->matrix.cell_shadow_types[i][j + position] = mw->matrix.cell_shadow_type; if (mw->matrix.selected_cells) mw->matrix.selected_cells[i][j + position] = False; #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) mw->matrix.highlighted_cells[i][j + position] = HighlightNone; #endif } } mw->matrix.columns += num_columns; xbaeGetCellTotalWidth(mw); /* * See if the max number of column label lines changed */ if (mw->matrix.column_labels) { int end; end = position + num_columns; for (i = position; i < end; i++) if (mw->matrix.column_label_lines[i].lines > mw->matrix.column_label_maxlines) mw->matrix.column_label_maxlines = mw->matrix.column_label_lines[i].lines; } /* * Recalculate the column positions */ xbaeFreeColumnPositions(mw); mw->matrix.column_positions = CreateColumnPositions(mw); xbaeGetColumnPositions(mw); } /* * Delete columns from the internal cells data structure. */ static void DeleteColumnsFromTable(mw, position, num_columns) XbaeMatrixWidget mw; int position; int num_columns; { int i, j; /* * Free all the cells in the columns being deleted. * Also free the String column labels and the associated ColumnLabelLines * lengths arrays, and the column button label flags. */ for (j = position; j < position + num_columns; j++) { if (mw->matrix.cells) for (i = 0; i < mw->matrix.rows; i++) XtFree((XtPointer) mw->matrix.cells[i][j]); if (mw->matrix.column_labels) { XtFree((XtPointer) mw->matrix.column_labels[j]); XtFree((XtPointer) mw->matrix.column_label_lines[j].lengths); } } /* * Shift those columns after the ones being deleted, left. * (unless we deleted columns from the right). */ if (position + num_columns < mw->matrix.columns) { BCOPY(&mw->matrix.column_widths[position + num_columns], &mw->matrix.column_widths[position], (mw->matrix.columns - position - num_columns) * sizeof(short)); if (mw->matrix.column_max_lengths) BCOPY(&mw->matrix.column_max_lengths[position + num_columns], &mw->matrix.column_max_lengths[position], (mw->matrix.columns - position - num_columns) * sizeof(int)); if (mw->matrix.column_alignments) BCOPY(&mw->matrix.column_alignments[position + num_columns], &mw->matrix.column_alignments[position], (mw->matrix.columns - position - num_columns) * sizeof(unsigned char)); if (mw->matrix.column_button_labels) BCOPY(&mw->matrix.column_button_labels[position + num_columns], &mw->matrix.column_button_labels[position], (mw->matrix.columns - position - num_columns) * sizeof(Boolean)); if (mw->matrix.column_label_alignments) BCOPY(&mw->matrix.column_label_alignments[position + num_columns], &mw->matrix.column_label_alignments[position], (mw->matrix.columns - position - num_columns) * sizeof(unsigned char)); if (mw->matrix.column_user_data) BCOPY(&mw->matrix.column_user_data[position + num_columns], &mw->matrix.column_user_data[position], (mw->matrix.columns - position - num_columns) * sizeof(XtPointer)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) BCOPY(&mw->matrix.cell_widgets[position + num_columns], &mw->matrix.cell_widgets[position], (mw->matrix.columns - position - num_columns) * sizeof(Widget)); #endif if (mw->matrix.column_shadow_types) BCOPY(&mw->matrix.column_shadow_types[position + num_columns], &mw->matrix.column_shadow_types[position], (mw->matrix.columns - position - num_columns) * sizeof(unsigned char)); if (mw->matrix.column_labels) { BCOPY(&mw->matrix.column_labels[position + num_columns], &mw->matrix.column_labels[position], (mw->matrix.columns - position - num_columns) * sizeof(String)); BCOPY(&mw->matrix.column_label_lines[position + num_columns], &mw->matrix.column_label_lines[position], (mw->matrix.columns - position - num_columns) * sizeof(ColumnLabelLinesRec)); } /* * Shift the columns in each row. */ for (i = 0; i < mw->matrix.rows; i++) { if (mw->matrix.cells) BCOPY(&mw->matrix.cells[i][position + num_columns], &mw->matrix.cells[i][position], (mw->matrix.columns - position - num_columns) * sizeof(String)); if (mw->matrix.colors) BCOPY(&mw->matrix.colors[i][position + num_columns], &mw->matrix.colors[i][position], (mw->matrix.columns - position - num_columns) * sizeof(Pixel)); if (mw->matrix.cell_background) BCOPY(&mw->matrix.cell_background[i][position + num_columns], &mw->matrix.cell_background[i][position], (mw->matrix.columns - position - num_columns) * sizeof(Pixel)); #if CELL_WIDGETS if (mw->matrix.cell_widgets) BCOPY(&mw->matrix.cell_widgets[i][position + num_columns], &mw->matrix.cell_widgets[i][position], (mw->matrix.columns - position - num_columns) * sizeof(Widget)); #endif if (mw->matrix.cell_user_data) BCOPY(&mw->matrix.cell_user_data[i][position + num_columns], &mw->matrix.cell_user_data[i][position], (mw->matrix.columns - position - num_columns) * sizeof(XtPointer)); if (mw->matrix.cell_shadow_types) BCOPY(&mw->matrix.cell_shadow_types[i][position + num_columns], &mw->matrix.cell_shadow_types[i][position], (mw->matrix.columns - position - num_columns) * sizeof(unsigned char)); if (mw->matrix.selected_cells) BCOPY(&mw->matrix.selected_cells[i][position + num_columns], &mw->matrix.selected_cells[i][position], (mw->matrix.columns - position - num_columns) * sizeof(Boolean)); #if XmVersion >= 1002 if (mw->matrix.highlighted_cells) BCOPY(&mw->matrix.highlighted_cells[i][position + num_columns], &mw->matrix.highlighted_cells[i][position], (mw->matrix.columns - position - num_columns) * sizeof(unsigned char)); #endif } } mw->matrix.columns -= num_columns; xbaeGetCellTotalWidth(mw); /* * See if the max number of column label lines changed */ if (mw->matrix.column_labels) { mw->matrix.column_label_maxlines = mw->matrix.column_label_lines[0].lines; for (i = 1; i < mw->matrix.columns; i++) if (mw->matrix.column_label_lines[i].lines > mw->matrix.column_label_maxlines) mw->matrix.column_label_maxlines = mw->matrix.column_label_lines[i].lines; } /* * Recalculate the column positions */ xbaeFreeColumnPositions(mw); mw->matrix.column_positions = CreateColumnPositions(mw); xbaeGetColumnPositions(mw); } /* * Matrix set_cell method */ void #if NeedFunctionPrototypes xbaeSetCell(XbaeMatrixWidget mw, int row, int column, const String value, Boolean update_text) #else xbaeSetCell(mw, row, column, value, update_text) XbaeMatrixWidget mw; int row; int column; const String value; Boolean update_text; #endif { if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "xbaeSetCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for xbaeSetCell.", NULL, 0); return; } /* * If we have a draw cell callback, we must have a write cell callback * also if we want to set the data. Use this callback to write the * new data back to the application. */ if (mw->matrix.draw_cell_callback) { XbaeMatrixWriteCellCallbackStruct call_data; if (mw->matrix.write_cell_callback) { call_data.reason = XbaeWriteCellReason; call_data.event = (XEvent *)NULL; call_data.row = row; call_data.column = column; call_data.string = value; call_data.type = XbaeString; call_data.pixmap = (Pixmap)NULL; call_data.mask = (Pixmap)NULL; XtCallCallbackList((Widget)mw, mw->matrix.write_cell_callback, (XtPointer) &call_data); } } else { /* * Store the new value in the cell. */ if (!mw->matrix.cells && value[0] != 0) /* * The user typed something, there is no drawCellCallback and * our cells have not been allocated :-( * The typed value must be stored, so allocate the cells array * now. */ xbaeCopyCells(mw); /* * Now we are free to store the value in the widget's cell array */ if (mw->matrix.cells && /* It's OK to store the value */ strcmp(mw->matrix.cells[row][column], value)) { /* * I'm not particularly keen on this code - ie. checking twice * for mw->matrix.cells but it seemed like the only way around * the problem AL (Nov 5, 1995). */ XtFree((XtPointer) mw->matrix.cells[row][column]); mw->matrix.cells[row][column] = XtNewString(value); } else return; } /* * Draw the cell. */ if (xbaeIsCellVisible(mw, row, column)) { xbaeClearCell(mw, row, column); xbaeDrawCell(mw, row, column); } /* * If we are editing this cell, load the textField too if update_text set. */ if (update_text && XtIsManaged(TextChild(mw)) && mw->matrix.current_row == row && mw->matrix.current_column == column) { String string; /* Remove the modify verify callback when the text field is set. It thinks we are modifying the value - Motif thinks that it knows best but we know better! */ XtRemoveCallback(TextChild(mw), XmNmodifyVerifyCallback, xbaeModifyVerifyCB, (XtPointer)mw); /* * We need to get the value to put back into the textField if the * application has a draw cell callback so that any reformatting will * be displayed. -cg May 13, 1999. */ if (mw->matrix.draw_cell_callback) { Pixmap pixmap, mask; Pixel bg, fg; int width, height, depth; xbaeGetDrawCellValue(mw, mw->matrix.current_row, mw->matrix.current_column, &string, &pixmap, &mask, &width, &height, &bg, &fg, &depth); } else string = value; if (string[0] == '\0') XtVaSetValues(TextChild(mw), XmNvalue, string, NULL); else XmTextSetString(TextChild(mw), string); XtAddCallback(TextChild(mw), XmNmodifyVerifyCallback, xbaeModifyVerifyCB, (XtPointer)mw); } } static Boolean DoCommitEdit(mw, event) XbaeMatrixWidget mw; XEvent *event; { String cell; if (!XtIsManaged(TextChild(mw))) return True; /* * Get the value the user entered in the textField (this is a copy) */ cell = XmTextGetString(TextChild(mw)); /* * Call the leaveCellCallback to see if we can leave the current cell. */ if (mw->matrix.leave_cell_callback) { XbaeMatrixLeaveCellCallbackStruct call_data; call_data.reason = XbaeLeaveCellReason; call_data.event = event; call_data.row = mw->matrix.current_row; call_data.column = mw->matrix.current_column; call_data.value = cell; call_data.doit = True; XtCallCallbackList((Widget) mw, mw->matrix.leave_cell_callback, (XtPointer)&call_data); /* * Application doesn't want to leave this cell. Make the cell visible * and traverse to it so the user can see where they screwed up. */ if (!call_data.doit) { xbaeMakeCellVisible( mw, mw->matrix.current_row, mw->matrix.current_column); XmProcessTraversal(TextChild(mw), XmTRAVERSE_CURRENT); XtFree((XtPointer) cell); return False; } /* * Use the applications value if it is different. * If the application modified the string inplace, we will pick that * up automatically. */ if (call_data.value != cell) { XtFree((XtPointer) cell); cell = call_data.value; } } /* * Call the set_cell method to store the new value in the cell and redraw. */ (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.set_cell) (mw, mw->matrix.current_row, mw->matrix.current_column, cell, True); XtFree((XtPointer) cell); return True; } /* * Position and size the scrollbars and clip widget for our new size. */ void xbaeResize(mw) XbaeMatrixWidget mw; { int cell_width, cell_height, rows_visible; Boolean has_horiz, has_vert; Boolean scrollbar_top; Boolean scrollbar_left; int width = mw->core.width; int height = mw->core.height; /* * Full size of widget (no SBs needed) - may be very large */ long int full_width = NON_FIXED_TOTAL_WIDTH(mw) + FIXED_COLUMN_WIDTH(mw) + TRAILING_FIXED_COLUMN_WIDTH(mw) + ROW_LABEL_WIDTH(mw) + 2 * mw->manager.shadow_thickness; long int full_height = CELL_TOTAL_HEIGHT(mw) + FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw) + COLUMN_LABEL_HEIGHT(mw) + 2 * mw->manager.shadow_thickness; /* * Portion of cells which are visible in clip widget */ int horiz_visible = NON_FIXED_TOTAL_WIDTH(mw) - HORIZ_ORIGIN(mw); int vert_visible = CELL_TOTAL_HEIGHT(mw) - VERT_ORIGIN(mw) * ROW_HEIGHT(mw); /* * Check the location of the scrollbars */ scrollbar_top = (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmTOP_RIGHT); scrollbar_left = (mw->matrix.scrollbar_placement == XmBOTTOM_LEFT || mw->matrix.scrollbar_placement == XmTOP_LEFT); /* * If our horizontal scrollbar display policy is constant, * then we always have the horizontal scrollbar. If it is * none, then we never have it. Otherwise, check if it * is needed: if we are wider than the matrix's width, * then we don't need it; if we are smaller, we do. */ if (mw->matrix.hsb_display_policy == XmDISPLAY_STATIC) has_horiz = TRUE; else if (mw->matrix.hsb_display_policy == XmDISPLAY_NONE) has_horiz = FALSE; else { if (width >= full_width) has_horiz = False; else has_horiz = True; } if (has_horiz) height -= HORIZ_SB_HEIGHT(mw); /* * Same reasoning for the vertical scrollbar. */ if (mw->matrix.vsb_display_policy == XmDISPLAY_STATIC) has_vert = TRUE; else if (mw->matrix.vsb_display_policy == XmDISPLAY_NONE) has_vert = FALSE; else { if (height >= full_height) has_vert = False; else has_vert = True; } /* * If we have a vertical scrollbar, adjust the width and * recheck if we need the horizontal scrollbar. */ if (has_vert) { width -= VERT_SB_WIDTH(mw); if ((XmDISPLAY_NONE != mw->matrix.hsb_display_policy) && (! has_horiz) && (width < full_width)) { has_horiz = True; height -= HORIZ_SB_HEIGHT(mw); } } /* * If widget is smaller than full size, move/resize the scrollbar and * set sliderSize, also if cell_width/cell_height is greater than * the amount of cell area visible, then we need to drag the cells * back into the visible part of the clip widget and set the * scrollbar value. * * Otherwise, the widget is larger than full size, so set * cell_width/cell_height to size of cells and set origin to 0 * to force full cell area to be displayed * * We also need to move the textField correspondingly */ /* * We were resized smaller than our max width. */ if (width < full_width) { int HSBwidth; /* * Calculate the width of the non-fixed visible cells. */ cell_width = mw->core.width - (FIXED_COLUMN_WIDTH(mw) + TRAILING_FIXED_COLUMN_WIDTH(mw) + ROW_LABEL_WIDTH(mw) + 2 * mw->manager.shadow_thickness); /* * Subtract the VSB if we have one. */ if (has_vert) cell_width -= VERT_SB_WIDTH(mw); if (cell_width <= 0) cell_width = 1; /* * Adjust for shadow thickness. */ HSBwidth = cell_width + mw->manager.shadow_thickness * (mw->matrix.fixed_columns || mw->matrix.trailing_fixed_columns ? (mw->matrix.fixed_columns && mw->matrix.trailing_fixed_columns ? 0 : 1) : 2); /* * If the window is not full height, then place the HSB at the edge * of the window. Is the window is larger than full height, then * place the HSB immediately below the cell region. */ XtConfigureWidget( HorizScrollChild(mw), HSB_X_POSITION(mw), (scrollbar_top && has_horiz) ? (Position) 0 : ((height < full_height) || mw->matrix.fill ? (Position) (mw->core.height - (HorizScrollChild(mw)->core.height + 2 * HorizScrollChild(mw)->core.border_width)) : (Position) (full_height + mw->matrix.space)), HSBwidth, HorizScrollChild(mw)->core.height, HorizScrollChild(mw)->core.border_width); /* * If the cells are scrolled off to the left, then drag them * back onto the screen. */ if (cell_width > horiz_visible) { if ((HORIZ_ORIGIN(mw) -= (cell_width - horiz_visible)) < 0) { HORIZ_ORIGIN(mw) = 0; mw->matrix.left_column = 0; } if (XtIsManaged(TextChild(mw))) XtMoveWidget(TextChild(mw), TextChild(mw)->core.x + (cell_width - horiz_visible), TextChild(mw)->core.y); } /* * Setup the HSB to reflect our new size. */ XtVaSetValues(HorizScrollChild(mw), XmNpageIncrement, cell_width, XmNsliderSize, cell_width, XmNvalue, HORIZ_ORIGIN(mw), NULL); } /* * We were resized larger than the our max width. Drag the cells back * onto the screen if they were scrolled off to the left. */ else { if (XtIsManaged(TextChild(mw))) XtMoveWidget(TextChild(mw), TextChild(mw)->core.x + HORIZ_ORIGIN(mw), TextChild(mw)->core.y); cell_width = NON_FIXED_TOTAL_WIDTH(mw); if (cell_width <= 0) cell_width = 1; HORIZ_ORIGIN(mw) = 0; mw->matrix.left_column = 0; if (has_horiz) { XtConfigureWidget( HorizScrollChild(mw), HSB_X_POSITION(mw), (scrollbar_top && has_horiz) ? (Position) 0 : ((height < full_height) || mw->matrix.fill ? (Position) (mw->core.height - (HorizScrollChild(mw)->core.height + 2 * HorizScrollChild(mw)->core.border_width)) : (Position) (full_height + mw->matrix.space)), HSB_WIDTH(mw), HorizScrollChild(mw)->core.height, HorizScrollChild(mw)->core.border_width); XtVaSetValues(HorizScrollChild(mw), XmNpageIncrement, cell_width, XmNsliderSize, cell_width, XmNvalue, HORIZ_ORIGIN(mw), NULL); } } /* * We were resized smaller than our max height. */ if (height < full_height) { int VSBheight; /* * Calculate the height of the non-fixed visible cells. */ cell_height = mw->core.height - (FIXED_ROW_HEIGHT(mw) + TRAILING_FIXED_ROW_HEIGHT(mw) + COLUMN_LABEL_HEIGHT(mw) + 2 * mw->manager.shadow_thickness); /* * Subtract the HSB if we have one. */ if (has_horiz) cell_height -= HORIZ_SB_HEIGHT(mw); if (cell_height <= 0) cell_height = 1; /* * Adjust for shadow thickness. */ if (TRAILING_FIXED_ROW_HEIGHT(mw) > 0) VSBheight = (cell_height / ROW_HEIGHT(mw)) * ROW_HEIGHT(mw) + (mw->matrix.fixed_rows ? 0 : mw->manager.shadow_thickness); else VSBheight = cell_height + ((mw->matrix.fixed_rows ? 1 : 2) * mw->manager.shadow_thickness); /* * If the window is not full width, then place the VSB at the edge * of the window. Is the window is larger than full width, then * place the VSB immediately to the right of the cell region. */ XtConfigureWidget( VertScrollChild(mw), (scrollbar_left && has_vert) ? (Position) 0 : ((width < full_width) || mw->matrix.fill ? (Position) (mw->core.width - (VertScrollChild(mw)->core.width + 2 * VertScrollChild(mw)->core.border_width)) : (Position) full_width + mw->matrix.space), VSB_Y_POSITION(mw), VertScrollChild(mw)->core.width, VSBheight > 0 ? VSBheight : 1, VertScrollChild(mw)->core.border_width); /* * If the cells are scrolled off the top, then drag them * back onto the screen. */ if (cell_height > vert_visible) { int rows = (cell_height - vert_visible) / ROW_HEIGHT(mw); VERT_ORIGIN(mw) -= rows; if (XtIsManaged(TextChild(mw))) XtMoveWidget(TextChild(mw), TextChild(mw)->core.x, TextChild(mw)->core.y + rows * ROW_HEIGHT(mw)); } /* * Setup the VSB to reflect our new size. */ rows_visible = cell_height / ROW_HEIGHT(mw); XtVaSetValues(VertScrollChild(mw), XmNpageIncrement, rows_visible <= 0 ? 1 : rows_visible, XmNsliderSize, rows_visible <= 0 ? 1 : rows_visible, XmNvalue, VERT_ORIGIN(mw), NULL); } /* * We were resized larger than the our max height. Drag the cells back * onto the screen if they were scrolled off the top. */ else { if (XtIsManaged(TextChild(mw))) XtMoveWidget(TextChild(mw), TextChild(mw)->core.x, TextChild(mw)->core.y + VERT_ORIGIN(mw) * ROW_HEIGHT(mw)); cell_height = CELL_TOTAL_HEIGHT(mw); if (cell_height <= 0) cell_height = 1; rows_visible = mw->matrix.rows - mw->matrix.fixed_rows - mw->matrix.trailing_fixed_rows; VERT_ORIGIN(mw) = 0; if (has_vert) { XtConfigureWidget( VertScrollChild(mw), (scrollbar_left && has_vert) ? (Position) 0 : ((width < full_width) || mw->matrix.fill ? (Position)(mw->core.width - (VertScrollChild(mw)->core.width + 2 * VertScrollChild(mw)->core.border_width)) : (Position)full_width + mw->matrix.space), VSB_Y_POSITION(mw), VertScrollChild(mw)->core.width, VSB_HEIGHT(mw), VertScrollChild(mw)->core.border_width); XtVaSetValues( VertScrollChild(mw), XmNpageIncrement, rows_visible <= 0 ? 1 : rows_visible, XmNsliderSize, rows_visible <= 0 ? 1 : rows_visible, XmNvalue, VERT_ORIGIN(mw), NULL); } } /* * Map/unmap scrollbars based on flags set above */ if (has_horiz && !HorizScrollChild(mw)->core.managed) { XtManageChild(HorizScrollChild(mw)); /* * Generate an expose over the horizontal scrollbar to ensure it gets * drawn properly */ if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_POSITION(mw), mw->core.width, scrollbar_top ? HORIZ_SB_HEIGHT(mw) : mw->core.height - HORIZ_SB_POSITION(mw), True); /* * Take into account the little bit at the bottom of the screen * if the scrollbar is in the top location. */ if (scrollbar_top && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, TRAILING_FIXED_ROW_LABEL_OFFSET(mw), mw->core.width, mw->core.height - TRAILING_FIXED_ROW_LABEL_OFFSET(mw), True); } else if (!has_horiz && HorizScrollChild(mw)->core.managed) { /* * Generate an expose over the horizontal scrollbar to ensure it gets * drawn properly */ XtUnmanageChild(HorizScrollChild(mw)); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_POSITION(mw), mw->core.width, scrollbar_top ? HORIZ_SB_HEIGHT(mw) : mw->core.height - HORIZ_SB_POSITION(mw), True); /* * Take into account the little bit at the bottom of the screen * if the scrollbar is in the top location. */ if (scrollbar_top && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, TRAILING_FIXED_ROW_LABEL_OFFSET(mw), mw->core.width, mw->core.height - TRAILING_FIXED_ROW_LABEL_OFFSET(mw), True); } if (has_vert && !VertScrollChild(mw)->core.managed) { /* * Generate an expose over the vertical scrollbar region to ensure * it gets drawn properly */ XtManageChild(VertScrollChild(mw)); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_POSITION(mw), 0, VERT_SB_POSITION(mw) + VERT_SB_WIDTH(mw), mw->core.height, True); /* * This one's a bit trickier! If the scrollbar appears on the * left hand side then it's possible to have some area *under* the * matrix that isn't redrawn properly. This will be most * noticeable at the top and bottom of the matrix. As the matrix * will move to the right by it's width, this width is the area * that needs to be redrawn. */ if (scrollbar_left && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), FIXED_COLUMN_LABEL_OFFSET(mw) - TRAILING_FIXED_COLUMN_WIDTH(mw), 0, TRAILING_FIXED_COLUMN_WIDTH(mw) + VERT_SB_WIDTH(mw), mw->core.height, True); /* * Also clear the area below the matrix as it can get a little * confused too */ if(XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, TRAILING_FIXED_ROW_LABEL_OFFSET(mw), mw->core.width, mw->core.height - TRAILING_FIXED_ROW_LABEL_OFFSET(mw), True); } else if (!has_vert && VertScrollChild(mw)->core.managed) { /* * Generate an expose over the vertical scrollbar region to ensure * it gets drawn properly */ XtUnmanageChild(VertScrollChild(mw)); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_POSITION(mw), 0, VERT_SB_POSITION(mw) + VERT_SB_WIDTH(mw), mw->core.height, True); /* * Similar to the case above but we need to clear the are to the * right of the matrix and only the width of the scrollbar itself */ if (scrollbar_left && XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), TRAILING_FIXED_COLUMN_LABEL_OFFSET(mw) + TRAILING_FIXED_COLUMN_WIDTH(mw), 0, VERT_SB_WIDTH(mw) + mw->manager.shadow_thickness, mw->core.height, True); /* * And also clear the area below the matrix as it can get a little * confused too */ if (XtIsRealized((Widget)mw)) XClearArea(XtDisplay(mw), XtWindow(mw), 0, TRAILING_FIXED_ROW_LABEL_OFFSET(mw), mw->core.width, mw->core.height - TRAILING_FIXED_ROW_LABEL_OFFSET(mw), True); } /* * Now that we have cell_width & cell_height, * make the clip widget this size. Height is truncated to the * nearest row. */ XtConfigureWidget(ClipChild(mw), FIXED_COLUMN_LABEL_OFFSET(mw), FIXED_ROW_LABEL_OFFSET(mw), cell_width, cell_height, 0); /* Resize all the other clips */ if (mw->matrix.fixed_columns <= 0) { if (XtIsManaged(LeftClip(mw))) XtUnmanageChild(LeftClip(mw)); } else { XtConfigureWidget(LeftClip(mw), COLUMN_LABEL_OFFSET(mw), FIXED_ROW_LABEL_OFFSET(mw), FIXED_COLUMN_WIDTH(mw), cell_height, 0); if (!XtIsManaged(LeftClip(mw))) XtManageChild(LeftClip(mw)); } if (mw->matrix.trailing_fixed_columns <= 0) { if (XtIsManaged(RightClip(mw))) XtUnmanageChild(RightClip(mw)); } else { XtConfigureWidget(RightClip(mw), cell_width + FIXED_COLUMN_LABEL_OFFSET(mw), FIXED_ROW_LABEL_OFFSET(mw), TRAILING_FIXED_COLUMN_WIDTH(mw), cell_height, 0); if (!XtIsManaged(RightClip(mw))) XtManageChild(RightClip(mw)); } if (mw->matrix.fixed_rows <= 0) { if (XtIsManaged(TopClip(mw))) XtUnmanageChild(TopClip(mw)); } else { XtConfigureWidget(TopClip(mw), FIXED_COLUMN_LABEL_OFFSET(mw), ROW_LABEL_OFFSET(mw), cell_width, FIXED_ROW_HEIGHT(mw), 0); if (!XtIsManaged(TopClip(mw))) XtManageChild(TopClip(mw)); } if (mw->matrix.trailing_fixed_rows <= 0) { if (XtIsManaged(BottomClip(mw))) XtUnmanageChild(BottomClip(mw)); } else { XtConfigureWidget(BottomClip(mw), FIXED_COLUMN_LABEL_OFFSET(mw), TRAILING_FIXED_ROW_LABEL_OFFSET(mw), cell_width, TRAILING_FIXED_ROW_HEIGHT(mw), 0); if (!XtIsManaged(BottomClip(mw))) XtManageChild(BottomClip(mw)); } /* * The text field needs to be moved manually as we don't have * the convenience of a clip widget to do it for us. */ if (mw->matrix.current_column >= TRAILING_HORIZ_ORIGIN(mw) && mw->matrix.current_parent == (Widget)mw && XtIsManaged(TextChild(mw))) XtMoveWidget(TextChild(mw), RightClip(mw)->core.x + mw->matrix.cell_shadow_thickness, TextChild(mw)->core.y); /* * Save the non-truncated height. We need this so we can draw * the shadow correctly. */ mw->matrix.cell_visible_height = cell_height; /* * Set the clip_mask in our clipping GCs. This function relies on * the Clip widget being the correct size (above). */ if (XtIsRealized((Widget)mw)) xbaeSetClipMask(mw, CLIP_NONE); if (mw->matrix.resize_callback != NULL) { XbaeMatrixResizeCallbackStruct call_data; call_data.reason = XbaeResizeReason; call_data.event = (XEvent *)NULL; call_data.row = mw->matrix.rows; call_data.column = mw->matrix.columns; call_data.width = mw->core.width; call_data.height = mw->core.height; XtCallCallbackList ((Widget)mw, mw->matrix.resize_callback, (XtPointer) &call_data); } } /* * This is the modifyVerifyCallback we added to textField. We need to * call Matrix's modifyVerifyCallback list with the textField info * and the row/col that is changing. */ /* ARGSUSED */ void xbaeModifyVerifyCB(w, client, call) Widget w; XtPointer client; XtPointer call; { XbaeMatrixWidget mw = (XbaeMatrixWidget)client; XmTextVerifyCallbackStruct *verify = (XmTextVerifyCallbackStruct *)call; XbaeMatrixModifyVerifyCallbackStruct call_data; if (!mw->matrix.modify_verify_callback) return; call_data.reason = XbaeModifyVerifyReason; call_data.row = mw->matrix.current_row; call_data.column = mw->matrix.current_column; call_data.event = (XEvent *)NULL; call_data.verify = verify; call_data.prev_text = ((XmTextRec*)w)->text.value; XtCallCallbackList((Widget) mw, mw->matrix.modify_verify_callback, (XtPointer) & call_data); } /* * Matrix edit_cell method */ void xbaeEditCell(mw, event, row, column, params, nparams) XbaeMatrixWidget mw; XEvent *event; int row; int column; String *params; Cardinal nparams; { XbaeMatrixEnterCellCallbackStruct call_data; Window newWin, oldWin; int x, y; Pixel fgcolor, bgcolor; Boolean alt; String string; Widget oldWidget, newWidget; #if CELL_WIDGETS Widget userWidget; #endif if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { /* * If we have zero rows or columns, there are no cells * available on which to place the text field so just return */ if (mw->matrix.rows == 0 || mw->matrix.columns == 0) return; XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "editCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for EditCell.", NULL, 0); return; } /* * Attempt to commit the edit in the current cell. Return if we fail. */ if (!DoCommitEdit(mw, event)) return; /* * Scroll the cell onto the screen */ xbaeMakeCellVisible(mw, row, column); /* * Fixed cells may not be editable. */ if (IS_FIXED(mw, row, column) && !mw->matrix.traverse_fixed) return; /* get the window of the new cell position */ newWin = xbaeGetCellWindow(mw, &newWidget, row, column); /* * If we have an enterCellCallback, call it to see if the cell is * editable. */ call_data.map = True; call_data.doit = True; call_data.position = -1; call_data.select_text = False; if (mw->matrix.enter_cell_callback) { call_data.reason = XbaeEnterCellReason; call_data.event = event; call_data.row = row; call_data.column = column; call_data.map = True; call_data.num_params = nparams; call_data.params = params; XtCallCallbackList((Widget) mw, mw->matrix.enter_cell_callback, (XtPointer) & call_data); } /* Get the window of the current cell so we can see if we need to move. */ oldWin = xbaeGetCellWindow(mw, &oldWidget, mw->matrix.current_row, mw->matrix.current_column); mw->matrix.current_row = row; mw->matrix.current_column = column; /* * Unmap the textField to avoid flashing. */ if (XtIsManaged(TextChild(mw)) && XtIsRealized(TextChild(mw))) XtUnmapWidget(TextChild(mw)); /* * Convert the row/column to an xy position and move the textField * to this position. (the xy position will be relative to the Clip * widget if a non-fixed cells is being edited, relative to Matrix if * a totally fixed cell is being edited (one of the corners), or one of * the other clips otherwise. */ xbaeRowColToXY(mw, row, column, &x, &y); #if CELL_WIDGETS userWidget = mw->matrix.cell_widgets[row][column]; if (!userWidget) { #endif /* * We actually don't check for traverse_fixed here even though * it looks like it might be needed. The reason is that we may * need to reparent back onto the clip in case we were on the * fixed area and then traverse_fixed has been set to False * via SetValues. Doing this on the next traversal is probably * preferable to magically warping the textField off the * matrix on to the clip when traverseFixedCells changes. It * also allows the user to finish editing the existing cell, * but won't allow continued traversal on the fixed area. -CG */ /* * The old check (oldWin != newWin) as criteria to reparent * wasn't quite correct in the case of editable fixed columns; * In this case the first time the cell was edited 'oldWin' * and 'newWin' where both the left clip widget (which was correct) * but the 'current_parent' was still the initial parent set in the * 'Reslize' function (I think the clip widget). * The result was that the text field was moved relative to wrong * window and therefore appearing at a complete different position; * I check now as additional criteria if the 'current_parent' widget * is the same as 'newWidget'. * It should fix the my problem without breaking anything else. * The check (oldWin && newWin) for apps which call on startup * editCell() without a realized widget tree. Without this check * X errors would be the result. * * donato petrino, 1997/11/ */ if ((oldWin != newWin || mw->matrix.current_parent != newWidget) && (oldWin && newWin)) { XReparentWindow(XtDisplay(mw), XtWindow(TextChild(mw)), newWin, x + mw->matrix.cell_shadow_thickness, y + mw->matrix.cell_shadow_thickness); mw->matrix.current_parent = newWidget; /* * Widget still needs moving, because all we have done * above is redraw it's window. The widget itself doesn't * know where it is and must be repositioned relative to * it's (possibly new) window. */ } XtMoveWidget(TextChild(mw), x + mw->matrix.cell_shadow_thickness, y + mw->matrix.cell_shadow_thickness); #if CELL_WIDGETS } else { /* * A user defined widget does not take into account the * cell_highlight_thickness, so we must do it! */ XtMoveWidget(userWidget, x + mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness, y + mw->matrix.cell_shadow_thickness + mw->matrix.cell_highlight_thickness); /* Force editing to be disabled */ call_data.doit = False; } #endif /* * Compute the foreground and background of the text widget */ alt = mw->matrix.alt_row_count ? (row / mw->matrix.alt_row_count) % 2 : False; if (mw->matrix.colors) fgcolor = mw->matrix.colors[row][column]; else fgcolor = mw->manager.foreground; if (mw->matrix.text_background != mw->core.background_pixel) bgcolor = mw->matrix.text_background; else if (mw->matrix.cell_background && mw->matrix.cell_background[row][column] != mw->core.background_pixel) bgcolor = mw->matrix.cell_background[row][column]; else { if (alt) bgcolor = mw->matrix.odd_row_background; else bgcolor = mw->matrix.even_row_background; } /* * If we're doing a drawCell, go ask the app what to put there. */ if (mw->matrix.draw_cell_callback) { Pixmap pixmap; Pixmap mask; int width, height, depth; Pixel orig_bg, orig_fg; orig_bg = bgcolor; orig_fg = fgcolor; if (xbaeGetDrawCellValue( mw, row, column, &string, &pixmap, &mask, &width, &height, &bgcolor, &fgcolor, &depth) == XbaePixmap) { /* * If we're showing a pixmap, we don't want the TextField. */ return; } /* * If we reverse selected then we would have reversed things we * shouldn't have. We can detect this by checking bgcolor against * orig_fg and fgcolor against orig_bg and setting the colors back * to their non-selected values (as with an ordinary selected when * it is being edited). -cg 23/7/99 */ if (mw->matrix.reverse_select && mw->matrix.selected_cells && mw->matrix.selected_cells[row][column]) { int new_fg = fgcolor; int new_bg = bgcolor; /* callback changed bg */ if (orig_fg != fgcolor) new_bg = fgcolor; else /* reset it */ new_bg = orig_bg; /* callback changed fg */ if (orig_bg != bgcolor) new_fg = bgcolor; else /* reset it */ new_fg = orig_fg; bgcolor = new_bg; fgcolor = new_fg; } } else string = mw->matrix.cells ? mw->matrix.cells[row][column] : ""; /* * Setup the textField for the new cell. If the modifyVerify CB * rejects the new value, then it is the applications fault for * loading the cell with a bad value to begin with. */ #if CELL_WIDGETS if (!mw->matrix.cell_widgets[row][column]) { #endif /* * Remove the modify verify callback when the text field is set. * It thinks we are modifying the value but Motif thinks that * it knows best and we know better! */ XtRemoveCallback(TextChild(mw), XmNmodifyVerifyCallback, xbaeModifyVerifyCB, (XtPointer)mw); XtVaSetValues(TextChild(mw), XmNwidth, COLUMN_WIDTH(mw, column) - mw->matrix.cell_shadow_thickness * 2, XmNheight, (ROW_HEIGHT(mw) - mw->matrix.cell_shadow_thickness * 2), XmNmaxLength, (mw->matrix.column_max_lengths ? mw->matrix.column_max_lengths[column] : (int) mw->matrix.column_widths[column]), XmNeditable, call_data.doit, XmNcursorPositionVisible, call_data.doit, XmNbackground, bgcolor, XmNforeground, fgcolor, NULL); XtVaSetValues(TextChild(mw), XmNvalue, string, NULL); XtAddCallback(TextChild(mw), XmNmodifyVerifyCallback, xbaeModifyVerifyCB, (XtPointer)mw); #if CELL_WIDGETS } else XtVaSetValues(userWidget, XmNwidth, COLUMN_WIDTH(mw, column) - mw->matrix.cell_shadow_thickness * 2, XmNheight, ROW_HEIGHT(mw) - mw->matrix.cell_shadow_thickness * 2, XmNbackground, bgcolor, XmNforeground, fgcolor, NULL); #endif /* * No need to do anything else if the text field is not going to * be mapped */ if (!call_data.map) return; /* * Manage and map the textField */ #if CELL_WIDGETS if (userWidget) { XtUnmanageChild(TextChild(mw)); XtManageChild(userWidget); } else #endif XtManageChild(TextChild(mw)); if (XtIsRealized(TextChild(mw)) #if CELL_WIDGETS && !userWidget #endif ) XtMapWidget(TextChild(mw)); #if CELL_WIDGETS else if (XtIsRealized(userWidget) && userWidget) XtMapWidget(userWidget); if (call_data.doit && !userWidget) #endif /* * Set the insert position of the cursor */ if (call_data.doit) { int position = call_data.position; int length = strlen(string); if (event && (event->type == ButtonPress || event->type == ButtonRelease ) && position < 0 && mw->matrix.calc_cursor_position) { /* * The location of the pointer click needs to be calculated * so the cursor can be positioned. If position is >= 0, * it has been set in the enterCellCallback and must * be honoured elsewhere. */ CellType cell; int r, c; /* * The event must have occurred in a legal position * otherwise control wouldn't have made it here */ (void)xbaeEventToXY(mw, event, &x, &y, &cell); (void)xbaeXYToRowCol(mw, &x, &y, &r, &c, cell); x -= mw->matrix.cell_shadow_thickness; y = ROW_HEIGHT(mw) / 2; /* XXX should be real y! */ position = XmTextXYToPos(TextChild(mw), x, y); } if (call_data.select_text) XmTextSetSelection(TextChild(mw), 0, length, CurrentTime); if (position < 0) XmTextSetInsertionPosition(TextChild(mw), length); else XmTextSetInsertionPosition( TextChild(mw), position > length ? length : position); } } /* * Matrix select_cell method */ void xbaeSelectCell(mw, row, column) XbaeMatrixWidget mw; int row, column; { Boolean visible; if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "selectCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for SelectCell.", NULL, 0); return; } /* If no cells have been selected yet, allocate memory here */ if (!mw->matrix.selected_cells) xbaeCopySelectedCells(mw); /* * Scroll the cell onto the screen */ visible = xbaeIsCellVisible(mw, row, column); if (mw->matrix.scroll_select && !visible) xbaeMakeCellVisible(mw, row, column); /* * If the cell is not already selected, select it and redraw it */ if (!mw->matrix.selected_cells[row][column]) { mw->matrix.selected_cells[row][column] = True; mw->matrix.num_selected_cells++; if (mw->matrix.scroll_select || visible) { if (row >= TRAILING_VERT_ORIGIN(mw)) xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); xbaeDrawCell(mw, row, column); if (row >= TRAILING_VERT_ORIGIN(mw)) xbaeSetClipMask(mw, CLIP_NONE); } } } /* * Matrix select_row method */ void xbaeSelectRow(mw, row) XbaeMatrixWidget mw; int row; { int j, lc, rc; Boolean fixed = False, trailing_fixed = False; Boolean visible; unsigned int clip_reason = CLIP_NONE, save_clip = CLIP_NONE; if (row >= mw->matrix.rows || row < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "selectRow", "badIndex", "XbaeMatrix", "XbaeMatrix: Row out of bounds for SelectRow.", NULL, 0); return; } /* If no cells have been selected yet, allocate memory here */ if (!mw->matrix.selected_cells) xbaeCopySelectedCells(mw); visible = xbaeIsRowVisible(mw, row); /* * Scroll the row onto the screen */ if (mw->matrix.scroll_select) xbaeMakeRowVisible(mw, row); /* * If the row is not visible, there's no need to redraw - but, we do * need to update the selected cell resource */ if(!mw->matrix.scroll_select && !visible) { for (j = 0; j < mw->matrix.columns; j++) if (!mw->matrix.selected_cells[row][j]) { mw->matrix.num_selected_cells++; mw->matrix.selected_cells[row][j] = True; } return; } /* * Establish any necessary clipping for redrawing the cells */ save_clip = mw->matrix.current_clip; if (row >= TRAILING_VERT_ORIGIN(mw)) clip_reason = CLIP_TRAILING_FIXED_ROWS; if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); /* * For each cell in the row, if the cell is not already selected, * select it and redraw it */ xbaeGetVisibleColumns(mw, &lc, &rc); for (j = 0; j < mw->matrix.columns; j++) { if (!mw->matrix.selected_cells[row][j]) { mw->matrix.selected_cells[row][j] = True; mw->matrix.num_selected_cells++; if ((j >= lc && j <= rc) || (j < (int)mw->matrix.fixed_columns) || (j >= TRAILING_HORIZ_ORIGIN(mw))) { if ((! fixed) && (j < (int)mw->matrix.fixed_columns)) { fixed = True; xbaeSetClipMask(mw, clip_reason | CLIP_FIXED_COLUMNS); } else if (fixed && (j >= (int)mw->matrix.fixed_columns) && (j < TRAILING_HORIZ_ORIGIN(mw))) { fixed = False; xbaeSetClipMask(mw, clip_reason); } else if ((! trailing_fixed) && (j >= TRAILING_HORIZ_ORIGIN(mw))) { trailing_fixed = True; xbaeSetClipMask(mw, clip_reason | CLIP_TRAILING_FIXED_COLUMNS); } xbaeClearCell(mw, row, j); xbaeDrawCell(mw, row, j); } } } if (save_clip != mw->matrix.current_clip) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix select_column method */ void xbaeSelectColumn(mw, column) XbaeMatrixWidget mw; int column; { int i, tr, br; Boolean once = False; unsigned int clip_reason = CLIP_NONE; if (column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "selectColumn", "badIndex", "XbaeMatrix", "XbaeMatrix: Column out of bounds for SelectColumn.", NULL, 0); return; } /* If no cells have been selected yet, allocate memory here */ if (!mw->matrix.selected_cells) xbaeCopySelectedCells(mw); /* * Scroll the column onto the screen */ if (mw->matrix.scroll_select) xbaeMakeColumnVisible(mw, column); /* * No need to redraw unless the column is visible */ if (!mw->matrix.scroll_select && !xbaeIsColumnVisible(mw, column)) { for (i = 0; i < mw->matrix.rows; i++) if (!mw->matrix.selected_cells[i][column]) { mw->matrix.num_selected_cells++; mw->matrix.selected_cells[i][column] = True; } return; } /* * Establish any necessary clipping for redrawing the cells */ if (column < (int)mw->matrix.fixed_columns) clip_reason = CLIP_FIXED_COLUMNS; else if (column >= TRAILING_HORIZ_ORIGIN(mw)) clip_reason = CLIP_TRAILING_FIXED_COLUMNS; if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, clip_reason | CLIP_VISIBLE_HEIGHT); /* * For each cell in the column, if the cell is not already selected, * select it and redraw it */ xbaeGetVisibleRows(mw, &tr, &br); for (i = 0; i < mw->matrix.rows; i++) { if (!mw->matrix.selected_cells[i][column]) { mw->matrix.selected_cells[i][column] = True; mw->matrix.num_selected_cells++; if ((i >= tr && i <= br) || (i < (int)mw->matrix.fixed_rows) || (i >= TRAILING_VERT_ORIGIN(mw))) { if ((! once) && (i >= TRAILING_VERT_ORIGIN(mw))) { once = True; xbaeSetClipMask(mw, clip_reason | CLIP_TRAILING_FIXED_ROWS); } xbaeClearCell(mw, i, column); xbaeDrawCell(mw, i, column); } } } if (once || (CLIP_NONE != clip_reason)) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix deselect_all method */ void xbaeDeselectAll(mw) XbaeMatrixWidget mw; { int i, j; int tr, br, lc, rc; register Boolean do_row, once = False; mw->matrix.num_selected_cells = 0; /* If selected_cells is NULL, no cells have been selected yet */ if (!mw->matrix.selected_cells) return; xbaeGetVisibleCells(mw, &tr, &br, &lc, &rc); for (i = 0; i < mw->matrix.rows; i++) { do_row = False; if ((! once) && (i >= TRAILING_VERT_ORIGIN(mw))) { once = True; xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); } for (j = 0; j < mw->matrix.columns; j++) { if (mw->matrix.selected_cells[i][j]) { mw->matrix.selected_cells[i][j] = False; if (((i < (int)mw->matrix.fixed_rows) || (i >= TRAILING_VERT_ORIGIN(mw)) || (i >= tr && i <= br)) && ((j < (int)mw->matrix.fixed_columns) || (j >= TRAILING_HORIZ_ORIGIN(mw)) || (j >= lc && j <= rc))) { xbaeClearCell(mw, i, j); xbaeDrawCell(mw, i, j); do_row = True; } } } } if (once) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix select_all method */ void xbaeSelectAll(mw) XbaeMatrixWidget mw; { int i, j; int tr, br, lc, rc; register Boolean do_row, once = False; xbaeGetVisibleCells(mw, &tr, &br, &lc, &rc); if (!mw->matrix.selected_cells) xbaeCopySelectedCells(mw); for (i = 0; i < mw->matrix.rows; i++) { do_row = False; if ((! once) && (i >= TRAILING_VERT_ORIGIN(mw))) { once = True; xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); } for (j = 0; j < mw->matrix.columns; j++) { if (!mw->matrix.selected_cells[i][j]) { mw->matrix.num_selected_cells++; mw->matrix.selected_cells[i][j] = True; if (((i < (int)mw->matrix.fixed_rows) || (i >= TRAILING_VERT_ORIGIN(mw)) || (i >= tr && i <= br)) && ((j < (int)mw->matrix.fixed_columns) || (j >= TRAILING_HORIZ_ORIGIN(mw)) || (j >= lc && j <= rc))) { xbaeClearCell(mw, i, j); xbaeDrawCell(mw, i, j); do_row = True; } } } } if (once) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix deselect_cell method */ void xbaeDeselectCell(mw, row, column) XbaeMatrixWidget mw; int row; int column; { if (row >= mw->matrix.rows || row < 0 || column > mw->matrix.columns - 1 || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deselectCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for DeselectCell.", NULL, 0); return; } if (!mw->matrix.selected_cells) return; if (mw->matrix.selected_cells[row][column]) { mw->matrix.num_selected_cells--; mw->matrix.selected_cells[row][column] = False; if (xbaeIsCellVisible(mw, row, column)) { if (row >= TRAILING_VERT_ORIGIN(mw)) xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); xbaeClearCell(mw, row, column); xbaeDrawCell(mw, row, column); if (row >= TRAILING_VERT_ORIGIN(mw)) xbaeSetClipMask(mw, CLIP_NONE); } } } /* * Matrix deselect_row method */ void xbaeDeselectRow(mw, row) XbaeMatrixWidget mw; int row; { int j, lc, rc; Boolean fixed = False, trailing_fixed = False; unsigned int clip_reason = CLIP_NONE, save_clip; if (row >= mw->matrix.rows || row < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deselectRow", "badIndex", "XbaeMatrix", "XbaeMatrix: Row parameter out of bounds for DeselectRow.", NULL, 0); return; } if (!mw->matrix.selected_cells) return; /* * Establish any necessary clipping for redrawing the cells */ save_clip = mw->matrix.current_clip; if (row >= TRAILING_VERT_ORIGIN(mw)) clip_reason = CLIP_TRAILING_FIXED_ROWS; if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, CLIP_TRAILING_FIXED_ROWS); /* * For each cell in the row, if the cell is selected, * deselect it and redraw it */ xbaeGetVisibleColumns(mw, &lc, &rc); for (j = 0; j < mw->matrix.columns; j++) { if (mw->matrix.selected_cells[row][j]) { mw->matrix.num_selected_cells--; mw->matrix.selected_cells[row][j] = False; if ((j >= lc && j <= rc) || (j < (int)mw->matrix.fixed_columns) || (j >= TRAILING_HORIZ_ORIGIN(mw))) { if ((! fixed) && (j < (int)mw->matrix.fixed_columns)) { fixed = True; xbaeSetClipMask(mw, clip_reason | CLIP_FIXED_COLUMNS); } else if (fixed && (j >= (int)mw->matrix.fixed_columns) && (j < TRAILING_HORIZ_ORIGIN(mw))) { fixed = False; xbaeSetClipMask(mw, clip_reason); } else if ((! trailing_fixed) && (j >= TRAILING_HORIZ_ORIGIN(mw))) { trailing_fixed = True; xbaeSetClipMask(mw, clip_reason | CLIP_TRAILING_FIXED_COLUMNS); } xbaeClearCell(mw, row, j); xbaeDrawCell(mw, row, j); } } } if (save_clip != mw->matrix.current_clip) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix deselect_column method */ void xbaeDeselectColumn(mw, column) XbaeMatrixWidget mw; int column; { int i, tr, br; Boolean once = False; unsigned int clip_reason = CLIP_NONE; if (column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deselectColumn", "badIndex", "XbaeMatrix", "XbaeMatrix: Column parameter out of bounds for DeselectColumn.", NULL, 0); return; } if (!mw->matrix.selected_cells) return; /* * Establish any necessary clipping for redrawing the cells */ if (column < (int)mw->matrix.fixed_columns) clip_reason = CLIP_FIXED_COLUMNS; else if (column >= TRAILING_HORIZ_ORIGIN(mw)) clip_reason = CLIP_TRAILING_FIXED_COLUMNS; if (CLIP_NONE != clip_reason) xbaeSetClipMask(mw, clip_reason | CLIP_VISIBLE_HEIGHT); /* * For each cell in the column, if the cell is selected, * deselect it and redraw it */ xbaeGetVisibleRows(mw, &tr, &br); for (i = 0; i < mw->matrix.rows; i++) { if (mw->matrix.selected_cells[i][column]) { mw->matrix.num_selected_cells--; mw->matrix.selected_cells[i][column] = False; if ((i >= tr && i <= br) || (i < (int)mw->matrix.fixed_rows) || (i >= TRAILING_VERT_ORIGIN(mw))) { if ((! once) && (i >= TRAILING_VERT_ORIGIN(mw))) { once = True; xbaeSetClipMask(mw, clip_reason | CLIP_TRAILING_FIXED_ROWS); } xbaeClearCell(mw, i, column); xbaeDrawCell(mw, i, column); } } } if (once || (CLIP_NONE != clip_reason)) xbaeSetClipMask(mw, CLIP_NONE); } /* * Matrix get_cell method */ String xbaeGetCell(mw, row, column) XbaeMatrixWidget mw; int row, column; { String value; if (row >= mw->matrix.rows || row < 0 || column > mw->matrix.columns - 1 || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "getCell", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for GetCell.", NULL, 0); return (NULL); } if (mw->matrix.draw_cell_callback) { Pixel bgcolor, fgcolor; Pixmap pixmap, mask; int width, height, depth; if (xbaeGetDrawCellValue(mw, row, column, &value, &pixmap, &mask, &width, &height, &bgcolor, &fgcolor, &depth) == XbaePixmap) value = ""; } else if (!mw->matrix.cells) return ""; else value = mw->matrix.cells[row][column]; return value; } /* * Matrix commit_edit method */ Boolean #if NeedFunctionPrototypes xbaeCommitEdit(XbaeMatrixWidget mw, XEvent *event, Boolean unmap) #else xbaeCommitEdit(mw, event, unmap) XbaeMatrixWidget mw; XEvent *event; Boolean unmap; #endif { Boolean commit; if (!XtIsManaged(TextChild(mw))) return True; /* * Attempt to commit the edit */ commit = DoCommitEdit(mw, event); /* * If the commit succeeded and we are supposed to unmap the textField, * then hide the textField and traverse out */ if (commit && unmap) { XtUnmanageChild(TextChild(mw)); XmProcessTraversal(TextChild(mw), XmTRAVERSE_RIGHT); } return commit; } /* * Matrix cancel_edit method */ void #if NeedFunctionPrototypes xbaeCancelEdit(XbaeMatrixWidget mw, Boolean unmap) #else xbaeCancelEdit(mw, unmap) XbaeMatrixWidget mw; Boolean unmap; #endif { if (!XtIsManaged(TextChild(mw))) return; /* * If unmap is set, hide the textField and traverse out. */ if (unmap) { XtUnmanageChild(TextChild(mw)); XmProcessTraversal(TextChild(mw), XmTRAVERSE_RIGHT); } /* * Don't unmap, just restore original contents */ else if (!mw->matrix.draw_cell_callback) { XtVaSetValues(TextChild(mw), XmNvalue, (mw->matrix.cells ? mw->matrix.cells[mw->matrix.current_row] [mw->matrix.current_column] : ""), NULL); } else { /* Ask the application what should be in the cell */ String string; Pixmap pixmap, mask; Pixel bg, fg; int width, height, depth; if (xbaeGetDrawCellValue(mw, mw->matrix.current_row, mw->matrix.current_column, &string, &pixmap, &mask, &width, &height, &bg, &fg, &depth) == XbaeString) XtVaSetValues(TextChild(mw), XmNvalue, string, NULL); } } /* * Matrix add_rows method */ void xbaeAddRows(mw, position, rows, labels, colors, backgrounds, num_rows) XbaeMatrixWidget mw; int position; String *rows; String *labels; Pixel *colors; Pixel *backgrounds; int num_rows; { Boolean haveVSB, haveHSB; /* * Do some error checking. */ if (num_rows <= 0) return; if (position < 0 || position > mw->matrix.rows) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "addRows", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds in AddRows.", NULL, 0); return; } haveVSB = XtIsManaged(VertScrollChild(mw)); haveHSB = XtIsManaged(HorizScrollChild(mw)); /* * If we add rows, and there is no drawCellCallback, we must allocate * the cells array to prevent potential disaster */ if (!mw->matrix.cells && !mw->matrix.draw_cell_callback) xbaeCopyCells(mw); /* * Add the new rows into the internal cells/labels data structure. */ AddRowsToTable(mw, position, rows, labels, colors, backgrounds, num_rows); /* * Reconfig the VSB maximum. */ XtVaSetValues(VertScrollChild(mw), XmNmaximum, mw->matrix.rows ? (mw->matrix.rows - (int) mw->matrix.fixed_rows - (int) mw->matrix.trailing_fixed_rows) : 1, NULL); /* * Relayout. */ xbaeResize(mw); /* * Call our cancel_edit method since the rows shifted underneath us */ (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.cancel_edit) (mw, True); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) { Rectangle rect; int x, y; /* * Determine which part of the non clip region needs to be * redisplayed */ if (position >= (int)mw->matrix.fixed_rows) { xbaeRowColToXY(mw, position, mw->matrix.fixed_columns, &x, &y); if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmTOP_RIGHT) y += HORIZ_SB_SPACE(mw); y += ROW_HEIGHT(mw) * mw->matrix.fixed_rows + COLUMN_LABEL_HEIGHT(mw); } else { if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmTOP_RIGHT) y = HORIZ_SB_SPACE(mw); else y = 0; y += ROW_HEIGHT(mw) * position + COLUMN_LABEL_HEIGHT(mw); } SETRECT(rect, 0, y, mw->core.width, mw->core.height); xbaeRedrawLabelsAndFixed(mw, &rect); XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1, True); /* * If the scrollbars have just been mapped and there are * labels then the labels shift around. The labels need * to be redrawn */ if (!haveVSB && XtIsManaged(VertScrollChild(mw)) && mw->matrix.column_labels) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_OFFSET(mw), 0, COLUMN_LABEL_HEIGHT(mw), True); if ((!haveHSB && XtIsManaged(VertScrollChild(mw)) && mw->matrix.row_labels) || ((mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmBOTTOM_LEFT) && !haveVSB && XtIsManaged(VertScrollChild(mw)))) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_OFFSET(mw), 0, ROW_LABEL_WIDTH(mw), 0, True); } } /* * Matrix delete_rows method */ void xbaeDeleteRows(mw, position, num_rows) XbaeMatrixWidget mw; int position; int num_rows; { int max, value; Boolean haveVSB; Boolean haveHSB; /* * Do some error checking. */ if (num_rows <= 0) return; if (position < 0 || position + num_rows > mw->matrix.rows) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deleteRows", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds in DeleteRows.", NULL, 0); return; } if (num_rows > (mw->matrix.rows - (int)mw->matrix.fixed_rows - (int)mw->matrix.trailing_fixed_rows)) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deleteRows", "tooMany", "XbaeMatrix", "XbaeMatrix: Attempting to delete too many rows in DeleteRows.", NULL, 0); return; } haveVSB = XtIsManaged(VertScrollChild(mw)); haveHSB = XtIsManaged(HorizScrollChild(mw)); /* * Delete the new rows from the internal cells/labels data structure. */ DeleteRowsFromTable(mw, position, num_rows); /* * Reconfig the VSB maximum. Reset the sliderSize to avoid warnings. * Also check the scrollbar value to see that it's not out of range. */ XtVaGetValues(VertScrollChild(mw), XmNvalue, &value, NULL); max = mw->matrix.rows ? (mw->matrix.rows - (int) mw->matrix.fixed_rows - (int) mw->matrix.trailing_fixed_rows) : 1; XtVaSetValues(VertScrollChild(mw), XmNvalue, (value >= max) ? max - 1 : value, XmNmaximum, mw->matrix.rows - (int) mw->matrix.fixed_rows - (int) mw->matrix.trailing_fixed_rows ? (mw->matrix.rows - (int) mw->matrix.fixed_rows - (int) mw->matrix.trailing_fixed_rows) : 1, XmNsliderSize, 1, NULL); /* * Relayout. */ xbaeResize(mw); /* * Call our cancel_edit method since the rows shifted underneath us */ (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.cancel_edit) (mw, True); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) { Rectangle rect; int y; /* * Determine which part of the non clip region needs to be * redisplayed */ #if 0 dest_y = (position - mw->matrix.fixed_rows) * ROW_HEIGHT(mw); src_y = dest_y + num_rows * ROW_HEIGHT(mw); if (XtIsManaged(LeftClip(mw))) { if (src_y < LeftClip(mw)->core.height) { /* Copy what we can up to replace the deleted rows */ XCopyArea(XtDisplay(mw), XtWindow(LeftClip(mw)), XtWindow(LeftClip(mw)), mw->matrix.draw_gc, 0, src_y, LeftClip(mw)->core.width, LeftClip(mw)->core.height - src_y, 0, dest_y); /* And clear the new area that needs to be redrawn */ XClearArea(XtDisplay(mw), XtWindow(LeftClip(mw)), 0, LeftClip(mw)->core.height - src_y, LeftClip(mw)->core.width, LeftClip(mw)->core.height - src_y, True); } } if (XtIsManaged(RightClip(mw))) { if (src_y < RightClip(mw)->core.height) { XCopyArea(XtDisplay(mw), XtWindow(RightClip(mw)), XtWindow(RightClip(mw)), mw->matrix.draw_gc, 0, src_y, RightClip(mw)->core.width, RightClip(mw)->core.height - src_y, 0, dest_y); XClearArea(XtDisplay(mw), XtWindow(RightClip(mw)), 0, RightClip(mw)->core.height - src_y, RightClip(mw)->core.width, RightClip(mw)->core.height - src_y, True); } } #endif y = ROW_LABEL_OFFSET(mw) + position * ROW_HEIGHT(mw); SETRECT(rect, 0, y, mw->core.width, mw->core.height - y); /* xxx could this use an XCopyArea() instead */ XClearArea(XtDisplay(mw), XtWindow(mw), 0, y, mw->core.width, mw->core.height - y, True); xbaeRedrawLabelsAndFixed(mw, &rect); y = (position - mw->matrix.fixed_rows) * ROW_HEIGHT(mw); XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), 0, y, rect.x2, mw->core.height - y, True); /* * If the scrollbars have just been unmapped and there are * labels then the labels shift around. The labels need * to be redrawn */ if (haveVSB && !XtIsManaged(VertScrollChild(mw)) && mw->matrix.column_labels) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_OFFSET(mw), 0, COLUMN_LABEL_HEIGHT(mw), True); if (haveHSB && !XtIsManaged(VertScrollChild(mw)) && mw->matrix.row_labels) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_OFFSET(mw), 0, ROW_LABEL_WIDTH(mw), 0, True); #if 0 /* * If we are deleting rows and there are different cell backgrounds * or foregrounds and the deleted row was on the visible clip, then * the colours can get confused. */ if (mw->matrix.colors || mw->matrix.even_row_background != mw->core.background_pixel || mw->matrix.odd_row_background != mw->core.background_pixel) XbaeClipRedraw(ClipChild(mw)); #endif } } /* * Matrix add_columns method. */ void xbaeAddColumns(mw, position, columns, labels, widths, max_lengths, alignments, label_alignments, colors, backgrounds, num_columns) XbaeMatrixWidget mw; int position; String *columns; String *labels; short *widths; int *max_lengths; unsigned char *alignments; unsigned char *label_alignments; Pixel *colors; Pixel *backgrounds; int num_columns; { Boolean haveVSB; Boolean haveHSB; /* * Do some error checking. */ if (num_columns <= 0) return; if (position < 0 || position > mw->matrix.columns) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "addColumns", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds in AddColumns.", NULL, 0); return; } if (!widths) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "addColumns", "noWidths", "XbaeMatrix", "XbaeMatrix: Must specify column widths in AddColumns.", NULL, 0); return; } /* * If we add columns, and there is no drawCellCallback, we must allocate * the cells array to prevent potential disaster */ if (!mw->matrix.cells && !mw->matrix.draw_cell_callback) xbaeCopyCells(mw); haveVSB = XtIsManaged(VertScrollChild(mw)); haveHSB = XtIsManaged(HorizScrollChild(mw)); /* * Add the new rows into the internal cells/labels data structure. */ AddColumnsToTable(mw, position, columns, labels, widths, max_lengths, alignments, label_alignments, colors, backgrounds, num_columns); /* * Reconfig the HSB maximum. */ XtVaSetValues(HorizScrollChild(mw), XmNmaximum, NON_FIXED_TOTAL_WIDTH(mw) ? NON_FIXED_TOTAL_WIDTH(mw) : 1, NULL); /* * Relayout. */ xbaeResize(mw); /* * Call our cancel_edit method since the columns shifted underneath us */ (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.cancel_edit) (mw, True); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) { Rectangle rect; int x, y; /* * Determine which part of the non clip region needs to be * redisplayed */ if (position >= (int)mw->matrix.fixed_columns) { xbaeRowColToXY(mw, mw->matrix.fixed_columns, position, &x, &y); if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmBOTTOM_LEFT) x += VERT_SB_SPACE(mw); x += COLUMN_POSITION(mw, mw->matrix.fixed_columns) + ROW_LABEL_WIDTH(mw); } else { if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmBOTTOM_LEFT) x = VERT_SB_SPACE(mw); else x = 0; x += COLUMN_POSITION(mw, position) + ROW_LABEL_WIDTH(mw); } SETRECT(rect, x, 0, mw->core.width, mw->core.height); xbaeRedrawLabelsAndFixed(mw, &rect); XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1, True); /* * If the scrollbars have just been mapped and there are * labels then the labels shift around. The labels need * to be redrawn */ if ((!haveVSB && XtIsManaged(VertScrollChild(mw)) && mw->matrix.column_labels) || ((mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmTOP_RIGHT) && !haveHSB && XtIsManaged(HorizScrollChild(mw)))) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_OFFSET(mw), 0, COLUMN_LABEL_HEIGHT(mw), True); if ((!haveHSB && XtIsManaged(VertScrollChild(mw)) && mw->matrix.row_labels) || ((mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmTOP_RIGHT))) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_OFFSET(mw), 0, ROW_LABEL_WIDTH(mw), 0, True); } } /* * Matrix delete_columns method */ void xbaeDeleteColumns(mw, position, num_columns) XbaeMatrixWidget mw; int position; int num_columns; { int maxlines; Boolean haveVSB; Boolean haveHSB; /* * Do some error checking. */ if (num_columns <= 0) return; if (position < 0 || position + num_columns > mw->matrix.columns) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deleteColumns", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds in DeleteColumns.", NULL, 0); return; } if (num_columns > (mw->matrix.columns - (int)mw->matrix.fixed_columns - (int)mw->matrix.trailing_fixed_columns)) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "deleteColumns", "tooMany", "XbaeMatrix", "XbaeMatrix: Attempting to delete too many columns in DeleteColumns.", NULL, 0); return; } haveVSB = XtIsManaged(VertScrollChild(mw)); haveHSB = XtIsManaged(HorizScrollChild(mw)); maxlines = mw->matrix.column_label_maxlines; /* * Delete the new columns from the internal cells/labels data structure. */ DeleteColumnsFromTable(mw, position, num_columns); /* * Reconfig the HSB maximum. Reset the sliderSize to avoid warnings. */ XtVaSetValues(HorizScrollChild(mw), XmNvalue, 0, /* value to 0 to stop sb from whinging */ XmNmaximum, NON_FIXED_TOTAL_WIDTH(mw) ? NON_FIXED_TOTAL_WIDTH(mw) : 1, XmNsliderSize, 1, NULL); /* * Relayout. */ xbaeResize(mw); /* * Call our cancel_edit method since the columns shifted underneath us */ (*((XbaeMatrixWidgetClass) XtClass(mw))->matrix_class.cancel_edit) (mw, True); if (!mw->matrix.disable_redisplay && XtIsRealized((Widget)mw)) { Rectangle rect; int x, y; if (maxlines != mw->matrix.column_label_maxlines) { /* * If a column with a high label gets deleted, then the matrix * gets pulled up the screen and leaves dangly bits underneath. * Clear the whole area to ensure correct display and forget the * rest of the calculation */ XClearArea(XtDisplay(mw), XtWindow(mw), 0, 0, 0 /*Full Width*/, 0 /*Full Height*/, True); return; } /* * Determine which part of the non clip region needs to be * redisplayed */ if (position >= (int)mw->matrix.fixed_columns) { xbaeRowColToXY(mw, mw->matrix.fixed_columns, position, &x, &y); if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmBOTTOM_LEFT) x += VERT_SB_SPACE(mw); x += COLUMN_POSITION(mw, mw->matrix.fixed_columns) + ROW_LABEL_WIDTH(mw); } else { if (mw->matrix.scrollbar_placement == XmTOP_LEFT || mw->matrix.scrollbar_placement == XmBOTTOM_LEFT) x = VERT_SB_SPACE(mw); else x = 0; x += COLUMN_POSITION(mw, position) + ROW_LABEL_WIDTH(mw); } SETRECT(rect, x, 0, mw->core.width, mw->core.height); XClearArea(XtDisplay(mw), XtWindow(mw), VISIBLE_WIDTH(mw) + FIXED_COLUMN_WIDTH(mw) + TRAILING_FIXED_COLUMN_WIDTH(mw), 0, mw->core.width, mw->core.height, True); xbaeRedrawLabelsAndFixed(mw, &rect); XClearArea(XtDisplay(mw), XtWindow(ClipChild(mw)), rect.x1, rect.y1, rect.x2 - rect.x1, rect.y2 - rect.y1, True); /* * If the scrollbars have just been unmapped and there are * labels then the labels shift around. The labels need * to be redrawn */ if (haveVSB && !XtIsManaged(VertScrollChild(mw)) && mw->matrix.column_labels) XClearArea(XtDisplay(mw), XtWindow(mw), 0, HORIZ_SB_OFFSET(mw), 0, COLUMN_LABEL_HEIGHT(mw), True); if (haveHSB && !XtIsManaged(VertScrollChild(mw)) && mw->matrix.row_labels) XClearArea(XtDisplay(mw), XtWindow(mw), VERT_SB_OFFSET(mw), 0, ROW_LABEL_WIDTH(mw), 0, True); } } /* * Matrix set_row_colors method */ void #if NeedFunctionPrototypes xbaeSetRowColors(XbaeMatrixWidget mw, int position, Pixel *colors, int num_colors, Boolean bg) #else xbaeSetRowColors(mw, position, colors, num_colors, bg) XbaeMatrixWidget mw; int position; Pixel *colors; int num_colors; Boolean bg; #endif { Rectangle rect; int i, j; Pixel **set; Pixel pixel; /* * Do some error checking. */ if (num_colors <= 0) return; if (position < 0 || position + num_colors > mw->matrix.rows) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "setRowColors", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds or too many colors in SetRowColors.", NULL, 0); return; } /* * If we don't have any colors yet, malloc them, and initialize * unused entries to the appropriate color */ if ((!bg && !mw->matrix.colors) || (bg && !mw->matrix.cell_background)) { if (!bg) { xbaeCreateColors(mw); set = &mw->matrix.colors[0]; pixel = mw->manager.foreground; for (i = 0; i < position; i++) for (j = 0; j < mw->matrix.columns; j++) set[i][j] = pixel; for (i = position + num_colors; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) set[i][j] = pixel; } else xbaeCopyBackgrounds(mw); } if (!bg) set = &mw->matrix.colors[0]; else set = &mw->matrix.cell_background[0]; /* * Set each row to the appropriate color */ for (i = 0; i < num_colors; i++) for (j = 0; j < mw->matrix.columns; j++) set[i + position][j] = colors[i]; if (XtIsRealized((Widget)mw)) { /* * Redraw all the visible non-fixed cells. We don't need to clear first * since only the color changed. */ SETRECT(rect, 0, 0, ClipChild(mw)->core.width - 1, ClipChild(mw)->core.height - 1); xbaeRedrawCells(mw, &rect); /* * Redraw all the visible fixed cells (but not the labels). * We don't need to clear first since only the color changed. */ SETRECT(rect, ROW_LABEL_WIDTH(mw), COLUMN_LABEL_HEIGHT(mw), mw->core.width - 1, mw->core.height - 1); xbaeRedrawLabelsAndFixed(mw, &rect); } if (position <= mw->matrix.current_row && position + num_colors > mw->matrix.current_row && XtIsRealized(TextChild(mw))) { if (bg) XtVaSetValues(TextChild(mw), XmNbackground, mw->matrix.cell_background[mw->matrix.current_row] [mw->matrix.current_column], NULL); else XtVaSetValues(TextChild(mw), XmNforeground, mw->matrix.colors[mw->matrix.current_row] [mw->matrix.current_column], NULL); } } /* * Matrix set_column_colors method */ void #if NeedFunctionPrototypes xbaeSetColumnColors(XbaeMatrixWidget mw, int position, Pixel *colors, int num_colors, Boolean bg) #else xbaeSetColumnColors(mw, position, colors, num_colors, bg) XbaeMatrixWidget mw; int position; Pixel *colors; int num_colors; Boolean bg; #endif { Rectangle rect; int i, j; Pixel **set; Pixel pixel; /* * Do some error checking. */ if (num_colors <= 0) return; if (position < 0 || position + num_colors > mw->matrix.columns) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "setColumnColors", "badPosition", "XbaeMatrix", "XbaeMatrix: Position out of bounds or too many colors in SetColumnColors.", NULL, 0); return; } /* * If we don't have any colors yet, malloc them, and initialize * unused entries to foreground */ if ((!bg && !mw->matrix.colors) || (bg && !mw->matrix.cell_background)) { if (!bg) { xbaeCreateColors(mw); set = &mw->matrix.colors[0]; pixel = mw->manager.foreground; for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < position; j++) set[i][j] = pixel; for (i = 0; i < mw->matrix.rows; i++) for (j = position + num_colors; j < mw->matrix.columns; j++) set[i][j] = pixel; } else xbaeCopyBackgrounds(mw); } if (!bg) set = &mw->matrix.colors[0]; else set = &mw->matrix.cell_background[0]; /* * Set each column to the appropriate color */ for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < num_colors; j++) set[i][j + position] = colors[j]; if (XtIsRealized((Widget)mw)) { /* * Redraw all the visible non-fixed cells. We don't need to clear first * since only the color changed. */ SETRECT(rect, 0, 0, ClipChild(mw)->core.width - 1, ClipChild(mw)->core.height - 1); xbaeRedrawCells(mw, &rect); /* * Redraw all the visible fixed cells (but not the labels). * We don't need to clear first since only the color changed. */ SETRECT(rect, ROW_LABEL_WIDTH(mw), COLUMN_LABEL_HEIGHT(mw), mw->core.width - 1, mw->core.height - 1); xbaeRedrawLabelsAndFixed(mw, &rect); } if (position <= mw->matrix.current_column && position + num_colors > mw->matrix.current_column && XtIsRealized(TextChild(mw))) { if (bg) XtVaSetValues(TextChild(mw), XmNbackground, mw->matrix.cell_background[mw->matrix.current_row] [mw->matrix.current_column], NULL); else XtVaSetValues(TextChild(mw), XmNforeground, mw->matrix.colors[mw->matrix.current_row] [mw->matrix.current_column], NULL); } } /* * Matrix set_cell_color method */ void #if NeedFunctionPrototypes xbaeSetCellColor(XbaeMatrixWidget mw, int row, int column, Pixel color, Boolean bg) #else xbaeSetCellColor(mw, row, column, color, bg) XbaeMatrixWidget mw; int row; int column; Pixel color; Boolean bg; #endif { int i, j; Pixel **set; Pixel pixel; /* * Do some error checking. */ if (row >= mw->matrix.rows || row < 0 || column >= mw->matrix.columns || column < 0) { XtAppWarningMsg( XtWidgetToApplicationContext((Widget) mw), "xbaeSetCellColor", "badIndex", "XbaeMatrix", "XbaeMatrix: Row or column out of bounds for xbaeSetCellColor.", NULL, 0); return; } /* * If we don't have any colors yet, malloc them and initialize them */ if ((!bg && !mw->matrix.colors) || (bg && !mw->matrix.cell_background)) { if (!bg) { xbaeCreateColors(mw); set = &mw->matrix.colors[0]; pixel = mw->manager.foreground; for (i = 0; i < mw->matrix.rows; i++) for (j = 0; j < mw->matrix.columns; j++) set[i][j] = pixel; } else xbaeCopyBackgrounds(mw); } if (!bg) set = &mw->matrix.colors[0]; else set = &mw->matrix.cell_background[0]; /* * Set the cell's color */ set[row][column] = color; if (XtIsRealized((Widget)mw)) { /* * Redraw the cell if it is visible */ if (xbaeIsCellVisible(mw, row, column)) xbaeDrawCell(mw, row, column); } if (row == mw->matrix.current_row && column == mw->matrix.current_column && XtIsRealized(TextChild(mw))) { if (bg) XtVaSetValues(TextChild(mw), XmNbackground, mw->matrix.cell_background[mw->matrix.current_row] [mw->matrix.current_column], NULL); else XtVaSetValues(TextChild(mw), XmNforeground, mw->matrix.colors[mw->matrix.current_row] [mw->matrix.current_column], NULL); } } grace-5.1.23/Xbae/Xbae/Methods.h0000644000076500001440000000532406766327622015766 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Methods.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * Methods.h created by Andrew Lister (7 August, 1995) */ #ifndef _Xbae_Methods_h #define _Xbae_Methods_h #include void xbaeResize P((XbaeMatrixWidget)); /* * New Matrix methods */ void xbaeSetCell P((XbaeMatrixWidget, int, int, const String, Boolean)); void xbaeModifyVerifyCB P((Widget, XtPointer, XtPointer)); void xbaeEditCell P((XbaeMatrixWidget, XEvent *, int, int, String *, Cardinal)); void xbaeSelectCell P((XbaeMatrixWidget, int, int)); void xbaeSelectRow P((XbaeMatrixWidget, int)); void xbaeSelectColumn P((XbaeMatrixWidget, int)); void xbaeDeselectAll P((XbaeMatrixWidget)); void xbaeSelectAll P((XbaeMatrixWidget)); void xbaeDeselectCell P((XbaeMatrixWidget, int, int)); void xbaeDeselectRow P((XbaeMatrixWidget, int)); void xbaeDeselectColumn P((XbaeMatrixWidget, int)); String xbaeGetCell P((XbaeMatrixWidget, int, int)); Boolean xbaeCommitEdit P((XbaeMatrixWidget, XEvent *, Boolean)); void xbaeCancelEdit P((XbaeMatrixWidget, Boolean)); void xbaeAddRows P((XbaeMatrixWidget, int, String *, String *, Pixel *, Pixel *, int)); void xbaeDeleteRows P((XbaeMatrixWidget, int, int)); void xbaeAddColumns P((XbaeMatrixWidget, int, String *, String *, short *, int *, unsigned char *, unsigned char *, Pixel *, Pixel *, int)); void xbaeDeleteColumns P((XbaeMatrixWidget, int, int)); void xbaeSetRowColors P((XbaeMatrixWidget, int, Pixel *, int, Boolean)); void xbaeSetColumnColors P((XbaeMatrixWidget, int, Pixel *, int, Boolean)); void xbaeSetCellColor P((XbaeMatrixWidget, int, int, Pixel, Boolean)); #endif grace-5.1.23/Xbae/Xbae/MatrixP.h0000644000076500001440000004171306766327622015751 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com * * $Id: MatrixP.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $ */ /* * MatrixP.h - Private definitions for Matrix widget */ #ifndef _Xbae_MatrixP_h #define _Xbae_MatrixP_h #if XmVersion <= 1001 # include #else # include #endif #include #ifndef P #if defined(__STDC__) || defined (__cplusplus) #define P(x) x #else #define P(x) () #define const #define volatile #endif #endif /* * A few definitions we like to use, but those with R4 won't have. * From Xfuncproto.h in R5. */ #ifndef XlibSpecificationRelease # ifndef _XFUNCPROTOBEGIN # ifdef __cplusplus /* for C++ V2.0 */ # define _XFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */ # define _XFUNCPROTOEND } # else # define _XFUNCPROTOBEGIN # define _XFUNCPROTOEND # endif # endif /* _XFUNCPROTOBEGIN */ #else #include #endif /* * New types for the class methods */ _XFUNCPROTOBEGIN typedef void (*XbaeMatrixSetCellProc) P((XbaeMatrixWidget, int, int, const String, Boolean)); typedef String (*XbaeMatrixGetCellProc) P((XbaeMatrixWidget, int, int)); typedef void (*XbaeMatrixEditCellProc) P((XbaeMatrixWidget, XEvent *, int, int, String *, Cardinal)); typedef void (*XbaeMatrixSelectCellProc) P((XbaeMatrixWidget, int, int)); typedef void (*XbaeMatrixSelectRowProc) P((XbaeMatrixWidget, int)); typedef void (*XbaeMatrixSelectColumnProc) P((XbaeMatrixWidget, int)); typedef void (*XbaeMatrixDeselectAllProc) P((XbaeMatrixWidget)); typedef void (*XbaeMatrixSelectAllProc) P((XbaeMatrixWidget)); typedef void (*XbaeMatrixDeselectCellProc) P((XbaeMatrixWidget, int, int)); typedef void (*XbaeMatrixDeselectRowProc) P((XbaeMatrixWidget, int)); typedef void (*XbaeMatrixDeselectColumnProc) P((XbaeMatrixWidget, int)); typedef Boolean (*XbaeMatrixCommitEditProc) P((XbaeMatrixWidget, XEvent *, Boolean)); typedef void (*XbaeMatrixCancelEditProc) P((XbaeMatrixWidget, Boolean)); typedef void (*XbaeMatrixAddRowsProc) P((XbaeMatrixWidget, int, String *, String *, Pixel *, Pixel *, int)); typedef void (*XbaeMatrixDeleteRowsProc) P((XbaeMatrixWidget, int, int)); typedef void (*XbaeMatrixAddColumnsProc) P((XbaeMatrixWidget, int, String *, String *, short *, int *, unsigned char*, unsigned char *, Pixel *, Pixel *, int)); typedef void (*XbaeMatrixDeleteColumnsProc) P((XbaeMatrixWidget, int, int)); typedef void (*XbaeMatrixSetRowColorsProc) P((XbaeMatrixWidget, int, Pixel *, int, Boolean)); typedef void (*XbaeMatrixSetColumnColorsProc) P((XbaeMatrixWidget, int, Pixel *, int, Boolean)); typedef void (*XbaeMatrixSetCellColorProc) P((XbaeMatrixWidget, int, int, Pixel, Boolean)); _XFUNCPROTOEND /* * Different than the traversal directions in Xm.h */ #define NOT_TRAVERSING -1 /* * New fields for the Matrix widget class record */ typedef struct { XbaeMatrixSetCellProc set_cell; XbaeMatrixGetCellProc get_cell; XbaeMatrixEditCellProc edit_cell; XbaeMatrixSelectCellProc select_cell; XbaeMatrixSelectRowProc select_row; XbaeMatrixSelectColumnProc select_column; XbaeMatrixDeselectAllProc deselect_all; XbaeMatrixSelectAllProc select_all; XbaeMatrixDeselectCellProc deselect_cell; XbaeMatrixDeselectRowProc deselect_row; XbaeMatrixDeselectColumnProc deselect_column; XbaeMatrixCommitEditProc commit_edit; XbaeMatrixCancelEditProc cancel_edit; XbaeMatrixAddRowsProc add_rows; XbaeMatrixDeleteRowsProc delete_rows; XbaeMatrixAddColumnsProc add_columns; XbaeMatrixDeleteColumnsProc delete_columns; XbaeMatrixSetRowColorsProc set_row_colors; XbaeMatrixSetColumnColorsProc set_column_colors; XbaeMatrixSetCellColorProc set_cell_color; XtPointer extension; } XbaeMatrixClassPart; /* * Full class record declaration */ typedef struct _XbaeMatrixClassRec { CoreClassPart core_class; CompositeClassPart composite_class; ConstraintClassPart constraint_class; XmManagerClassPart manager_class; XbaeMatrixClassPart matrix_class; } XbaeMatrixClassRec; externalref XbaeMatrixClassRec xbaeMatrixClassRec; /* * Inheritance constants for set/get/edit methods */ #define XbaeInheritGetCell ((XbaeMatrixGetCellProc) _XtInherit) #define XbaeInheritSetCell ((XbaeMatrixSetCellProc) _XtInherit) #define XbaeInheritEditCell ((XbaeMatrixEditCellProc) _XtInherit) #define XbaeInheritSelectCell ((XbaeMatrixSelectCellProc) _XtInherit) #define XbaeInheritSelectRow ((XbaeMatrixSelectRowProc) _XtInherit) #define XbaeInheritSelectColumn ((XbaeMatrixSelectColumnProc) _XtInherit) #if XmVersion >= 1002 #define XbaeInheritHighlightCell ((XbaeMatrixHighlightCellProc) _XtInherit) #define XbaeInheritHighlightRow ((XbaeMatrixHighlightRowProc) _XtInherit) #define XbaeInheritHighlightColumn ((XbaeMatrixHighlightColumnProc) _XtInherit) #endif #define XbaeInheritDeselectAll ((XbaeMatrixDeselectAllProc) _XtInherit) #define XbaeInheritSelectAll ((XbaeMatrixSelectAllProc) _XtInherit) #define XbaeInheritDeselectCell ((XbaeMatrixDeselectCellProc) _XtInherit) #define XbaeInheritDeselectRow ((XbaeMatrixDeselectRowProc) _XtInherit) #define XbaeInheritDeselectColumn ((XbaeMatrixDeselectColumnProc) _XtInherit) #define XbaeInheritCommitEdit ((XbaeMatrixCommitEditProc) _XtInherit) #define XbaeInheritCancelEdit ((XbaeMatrixCancelEditProc) _XtInherit) #define XbaeInheritAddRows ((XbaeMatrixAddRowsProc) _XtInherit) #define XbaeInheritDeleteRows ((XbaeMatrixDeleteRowsProc) _XtInherit) #define XbaeInheritAddColumns ((XbaeMatrixAddColumnsProc) _XtInherit) #define XbaeInheritDeleteColumns ((XbaeMatrixDeleteColumnsProc)_XtInherit) #define XbaeInheritSetRowColors ((XbaeMatrixSetRowColorsProc)_XtInherit) #define XbaeInheritSetColumnColors ((XbaeMatrixSetColumnColorsProc)_XtInherit) #define XbaeInheritSetCellColor ((XbaeMatrixSetCellColorProc)_XtInherit) /* * New data structures for the ScrollMgr code */ typedef struct _SmScrollNode { int x; int y; struct _SmScrollNode *next; struct _SmScrollNode *prev; } SmScrollNodeRec, *SmScrollNode; typedef struct _SmScrollMgr { int offset_x; int offset_y; int scroll_count; SmScrollNode scroll_queue; Boolean scrolling; } SmScrollMgrRec, *SmScrollMgr; /* * Rectangle struct used for internal calculations. (x1,y1) are the upper * left corner, (x2,y2) are the lower right. */ typedef struct _Rectangle { int x1, y1; int x2, y2; } Rectangle; /* * Data structure for column labels */ typedef struct _ColumnLabelLines { int lines; int *lengths; } ColumnLabelLinesRec, *ColumnLabelLines; /* * New fields for the Matrix widget record */ typedef struct { /* * resources */ Boolean allow_column_resize; /* can columns dynamically resize? */ Boolean bold_labels; /* draw bold row/column labels? */ Boolean button_labels; /* draw labels as buttons? */ Boolean fill; /* fill available space? */ Boolean trailing_attached_right; /* trailing columns fixed to right */ Boolean trailing_attached_bottom; /* trailing rows fixed to bottom */ Boolean reverse_select; /* reverse colours - selected cells? */ Boolean scroll_select; /* flag to scroll a selected cell */ Boolean **selected_cells; /* 2D array of selected cells */ Boolean show_arrows; /* sow arrows when text obscured? */ Boolean *column_button_labels; /* which column labels are butons */ Boolean *row_button_labels; /* which row labels are butons */ Boolean traverse_fixed; /* allow traversal to fixed cells? */ Boolean calc_cursor_position; /* calculate insert pos from click */ unsigned char cell_shadow_type; /* cell shadow type */ unsigned char **cell_shadow_types; /* 2D array of per cell shadow type */ unsigned char *column_alignments; /* alignment of each column */ unsigned char *column_label_alignments;/* alignment of each column label */ unsigned char *column_shadow_types; /* 1D array of per col shadow types */ unsigned char grid_type; /* shadowed in/shadowed out/plain */ unsigned char hsb_display_policy; /* horiz scroll bar display policy */ unsigned char row_label_alignment; /* alignment of row labels */ unsigned char *row_shadow_types; /* 1D array of per row shadow types */ unsigned char scrollbar_placement; /* placement of the scrollbars */ unsigned char selection_policy; /* as for XmList */ unsigned char shadow_type; /* matrix window shadow type */ #if XmVersion >= 1002 unsigned char **highlighted_cells; /* 2D array of highlighted cells */ #endif unsigned char vsb_display_policy; /* vert scroll bar display policy */ String **cells; /* 2D array of strings */ String *column_labels; /* array of labels above each column */ String *row_labels; /* array of labels next to each row */ XtPointer **cell_user_data; /* 2D array of per cell user data */ XtPointer *column_user_data; /* 1D array of per column user data */ XtPointer *row_user_data; /* 1D array of per row user data */ short *column_widths; /* width of each column in chars */ short row_label_width; /* max width of row labels in chars */ int alt_row_count; /* # of rows for e/o background */ int columns; /* number of cells per row */ int *column_max_lengths; /* max length of each col in chars */ int double_click_interval; /* interval between clicks */ int left_column; /* horizontal origin (in col space) */ int rows; /* number of rows per column */ int top_row; /* vertical origin (in row space) */ Dimension cell_highlight_thickness; /* hilite thickness for textField */ Dimension cell_margin_height; /* margin height for textField */ Dimension cell_margin_width; /* margin width for textField */ Dimension cell_shadow_thickness; /* shadow thickness for each cell */ Dimension fixed_columns; /* number of leading fixed columns */ Dimension fixed_rows; /* number of leading fixed rows */ Dimension space; /* spacing for scrollbars */ Dimension text_shadow_thickness; /* shadow thickness for text field */ Dimension trailing_fixed_columns; /* number of trailing fixed columns */ Dimension trailing_fixed_rows; /* number of trailing fixed rows */ Dimension visible_columns; /* number of columns to make visible */ Dimension visible_rows; /* number of rows to make visible */ Pixel button_label_background; /* color of button label background */ Pixel **cell_background; /* 2D array of Pixels */ Pixel **colors; /* 2D array of Pixels */ Pixel column_label_color; /* color of column label */ Pixel even_row_background; /* even row background color */ Pixel grid_line_color; /* color of grid, for XmGrid_LINE */ Pixel odd_row_background; /* odd row background color */ Pixel row_label_color; /* color of row label */ Pixel selected_background; /* background for selected cells */ Pixel selected_foreground; /* foreground for selected cells */ Pixel text_background; /* background for the "text" field */ XtTranslations text_translations; /* translations for textField widget */ XtCallbackList default_action_callback; /* called for a double click */ XtCallbackList draw_cell_callback; /* called when a cell is drawn */ XtCallbackList enter_cell_callback; /* called when a cell is entered */ XtCallbackList label_activate_callback; /* called when label pressed */ XtCallbackList leave_cell_callback; /* called when a cell is left */ XtCallbackList modify_verify_callback; /* verify change to textField */ /* and a draw_cell_callback is set */ #if XmVersion > 1001 XtCallbackList process_drag_callback; /* called when a drag is initiated */ #endif XtCallbackList resize_callback; /* called when Matrix is resized */ XtCallbackList resize_column_callback; /* called when column is resized */ XtCallbackList select_cell_callback; /* called when cells are selected */ XtCallbackList traverse_cell_callback; /* next cell to traverse to */ XtCallbackList write_cell_callback; /*called when a cell needs to be set*/ XmFontList font_list; /* fontList of widget and textField */ XmFontList label_font_list; /* fontList of labels */ /* * private state */ #if XmVersion >= 1002 unsigned char highlight_location; /* What is being highlighted */ #endif short first_row_offset; /* hidden first row */ int cell_visible_height; /* height of visible cells in pixels */ int column_label_maxlines; /* max # lines in column labels */ int *column_positions; /* pixel position of each column */ int current_column; /* column of the text field */ int current_row; /* row of the text field */ int horiz_origin; /* horiz origin (in pixel space) */ int label_baseline; /* baseline of label */ int last_column; /* The last selected column */ int last_row; /* The last selected row */ int num_selected_cells; /* The number selected cells */ int text_baseline; /* baseline of text in each cell */ int traversing; /* direction we are traversing */ unsigned int non_fixed_total_width; /* width of cell area in pixels */ unsigned int current_clip; /* current clip mask setting */ unsigned int disable_redisplay; /* disable redisplay counter */ Dimension desired_height; /* height widget wants to be */ Dimension desired_width; /* width widget wants to be */ Time last_click_time; /* when last ButtonPress occurred */ Widget text_field; /* the text field */ Widget horizontal_sb; /* the horizontal scrollbar */ Widget vertical_sb; /* the vertical scrollbar */ Widget clip_window; /* the clip child */ Widget left_clip; /* clips for scrolling fixed cells */ Widget right_clip; Widget top_clip; Widget bottom_clip; Widget current_parent; /* Current textField parent window */ #if CELL_WIDGETS Widget **cell_widgets; /* array of widgets for cells */ #endif GC cell_bottom_shadow_clip_gc; /* GC for clipped bottom shadow */ GC cell_grid_line_gc; GC cell_top_shadow_clip_gc; /* GC for clipped top shadow */ GC draw_gc; /* GC for drawing cells */ GC grid_line_gc; /* GC for grid line */ GC label_clip_gc; /* GC for clipped labels */ GC label_gc; /* GC for drawing labels */ GC pixmap_gc; /* GC for drawing pixmap cells */ GC resize_bottom_shadow_gc; GC resize_top_shadow_gc; ColumnLabelLines column_label_lines; /* structs for multi line labels */ XFontStruct *font_struct; /* fontStruct from fontList */ XFontStruct *label_font_struct; /* fontStruct from fontList */ SmScrollMgr clip_scroll_mgr; /* ScrollMgr for Clip */ SmScrollMgr matrix_scroll_mgr; /* ScrollMgr for Matrix */ XFontSet font_set; /* fontSet from fontList */ short font_y; short font_width; short font_height; Font fid; XFontSet label_font_set; /* fontSet from fontList */ short label_font_y; short label_font_width; short label_font_height; Font label_fid; } XbaeMatrixPart; /* * Full instance record declaration */ typedef struct _XbaeMatrixRec { CorePart core; CompositePart composite; ConstraintPart constraint; XmManagerPart manager; XbaeMatrixPart matrix; } XbaeMatrixRec; /* provide clean-up for those with R4 */ #ifndef XlibSpecificationRelease # undef _Xconst # undef _XFUNCPROTOBEGIN # undef _XFUNCPROTOEND #endif #undef P #endif /* _Xbae_MatrixP_h */ grace-5.1.23/Xbae/Xbae/Create.h0000644000076500001440000000676606766327621015600 0ustar fnevgenyusers/* * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore) * Copyright(c) 1995-99 Andrew Lister * All rights reserved * Permission to use, copy, modify and distribute this material for * any purpose and without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies, and that the name of Bellcore not be used in advertising * or publicity pertaining to this material without the specific, * prior written permission of an authorized representative of * Bellcore. * * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX- * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN- * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT- * ING TO THE SOFTWARE. * * $Id: Create.h,v 1.1 1999/09/11 01:25:37 fnevgeny Exp $ */ /* * Create.h created by Andrew Lister (28 January, 1996) */ #ifndef _Xbae_Create_h #define _Xbae_Create_h #include void xbaeCopyBackground P((Widget, int, XrmValue *)); void xbaeCopyForeground P((Widget, int, XrmValue *)); void xbaeCopyDoubleClick P((Widget, int, XrmValue *)); void xbaeCopyCellShadowTypes P((XbaeMatrixWidget)); void xbaeCopyRowShadowTypes P((XbaeMatrixWidget)); void xbaeCopyColumnShadowTypes P((XbaeMatrixWidget)); void xbaeCopyCellUserData P((XbaeMatrixWidget)); void xbaeCopyRowUserData P((XbaeMatrixWidget)); void xbaeCopyColumnUserData P((XbaeMatrixWidget)); void xbaeCopySelectedCells P((XbaeMatrixWidget)); void xbaeCopyRowLabels P((XbaeMatrixWidget)); void xbaeCopyColumnLabels P((XbaeMatrixWidget)); void xbaeCopyCells P((XbaeMatrixWidget)); #if CELL_WIDGETS void xbaeCopyCellWidgets P((XbaeMatrixWidget)); #endif void xbaeCopyColumnWidths P((XbaeMatrixWidget)); void xbaeCopyColumnMaxLengths P((XbaeMatrixWidget)); void xbaeCopyBackgrounds P((XbaeMatrixWidget)); void xbaeCopyColumnAlignments P((XbaeMatrixWidget)); void xbaeCopyColumnLabelAlignments P((XbaeMatrixWidget)); void xbaeCopyColumnButtonLabels P((XbaeMatrixWidget)); void xbaeCopyRowButtonLabels P((XbaeMatrixWidget)); void xbaeCopyColors P((XbaeMatrixWidget)); #if XmVersion >= 1002 void xbaeCopyHighlightedCells P((XbaeMatrixWidget)); #endif void xbaeCreateDrawGC P((XbaeMatrixWidget)); void xbaeCreatePixmapGC P((XbaeMatrixWidget)); void xbaeCreateLabelGC P((XbaeMatrixWidget)); void xbaeCreateLabelClipGC P((XbaeMatrixWidget)); void xbaeCreateGridLineGC P((XbaeMatrixWidget)); void xbaeCreateTopShadowClipGC P((XbaeMatrixWidget)); void xbaeCreateBottomShadowClipGC P((XbaeMatrixWidget)); void xbaeNewFont P((XbaeMatrixWidget)); void xbaeNewLabelFont P((XbaeMatrixWidget)); void xbaeFreeCells P((XbaeMatrixWidget)); #if CELL_WIDGETS void xbaeFreeCellWidgets P((XbaeMatrixWidget)); #endif void xbaeFreeRowLabels P((XbaeMatrixWidget)); void xbaeFreeColumnLabels P((XbaeMatrixWidget)); void xbaeFreeColors P((XbaeMatrixWidget)); void xbaeFreeBackgrounds P((XbaeMatrixWidget)); void xbaeFreeSelectedCells P((XbaeMatrixWidget)); void xbaeFreeCellUserData P((XbaeMatrixWidget)); void xbaeFreeCellShadowTypes P((XbaeMatrixWidget)); #if XmVersion >= 1002 void xbaeFreeHighlightedCells P((XbaeMatrixWidget)); #endif void xbaeCreateColors P((XbaeMatrixWidget)); #endif grace-5.1.23/Xbae/LICENSE0000644000076500001440000000236307412442102014314 0ustar fnevgenyusers# # $Date: 2001/12/26 21:42:26 $ # $Source: /home/fnevgeny/cvsroot/grace/Xbae/LICENSE,v $ Copyright (c) 1991, 1992 Bell Communications Research, Inc. (Bellcore) Copyright (c) 1995-97 Andrew Lister All Rights Reserved. Permission to use, copy, modify and distribute this material for any purpose and without fee is hereby granted, provided that the above copyright notices and this permission notice appear in all copies, and that the name of any author not be used in advertising or publicity pertaining to this material without the specific, prior written permission of an authorized representative of Bellcore and current maintainer. BELLCORE AND OTHER CONTRIBUTORS MAKE NO REPRESENTATIONS AND EXTEND NO WARRANTIES, EXPRESS OR IMPLIED, WITH RESPECT TO THE INFORMATION, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST INFRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS. THE SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL ANY AUTHOR OR ANY OF THEIR AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELATING TO THE INFORMATION. grace-5.1.23/Xbae/README0000644000076500001440000000040607412442102014163 0ustar fnevgenyusers The code in this directory is the Xbae widget library specially modified and packaged for use with Grace. For the original package, see http://www.lesstif.org/Xbae.html. Note, though, that it's NOT recommended to use the original library due to several bugs. grace-5.1.23/templates/0000755000076500001440000000000012032153126014421 5ustar fnevgenyusersgrace-5.1.23/templates/Default.agr0000644000076500001440000001512410565431623016515 0ustar fnevgenyusers# Grace project file # @version 50121 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "*** *** -- --:--:-- ----" @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world 0, 0, 1, 1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view 0.150000, 0.150000, 1.150000, 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend 0.85, 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 grace-5.1.23/templates/Makefile0000644000076500001440000000166007505061045016073 0ustar fnevgenyusers##################################################### # Makefile for templates of Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf DEFAULT_AGR = Default.agr all : $(DEFAULT_AGR) clean : dummy distclean : $(RM) *.orig devclean : dummy install : $(DEFAULT_AGR) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/templates @if test -f $(DESTDIR)$(GRACE_HOME)/templates/$(DEFAULT_AGR); then \ echo " $(DESTDIR)$(GRACE_HOME)/templates/$(DEFAULT_AGR) exists"; \ echo " Installing only $(DESTDIR)$(GRACE_HOME)/templates/$(DEFAULT_AGR).sample"; \ $(INSTALL_DATA) $(DEFAULT_AGR) $(DESTDIR)$(GRACE_HOME)/templates/$(DEFAULT_AGR).sample; \ else \ $(INSTALL_DATA) $(DEFAULT_AGR) $(DESTDIR)$(GRACE_HOME)/templates/$(DEFAULT_AGR); \ fi links : dummy tests : dummy dummy : grace-5.1.23/gracerc0000644000076500001440000000114306661401170013761 0ustar fnevgenyusers# +------------------------------------+ # | An example of Grace resource file | # | You may need to edit paths | # +------------------------------------+ # # Convert old binary projects on-the-fly DEFINE IFILTER "bin/grconvert %s -" MAGIC "00000031" # # This one is for automatic import of Origin-4 fit description files DEFINE IFILTER "auxiliary/fdf2fit %s -" PATTERN "*.fdf" # # Save disk space by keeping files gzip'ed DEFINE IFILTER "gzip -dc %s" PATTERN "*.gz" DEFINE OFILTER "gzip - > %s" PATTERN "*.gz" # # Allow user to add his/her own startup settings GETP "gracerc.user" # grace-5.1.23/ac-tools/0000755000076500001440000000000012032153126014144 5ustar fnevgenyusersgrace-5.1.23/ac-tools/config.sub0000755000076500001440000010154211014401767016140 0ustar fnevgenyusers#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-04-14' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grace-5.1.23/ac-tools/config.h.in0000644000076500001440000002353710071615561016210 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __CONFIG_H #define __CONFIG_H /* Define if on AIX 3. System headers sometimes define this. We just want to avoid a redefinition error message. */ #ifndef _ALL_SOURCE #undef _ALL_SOURCE #endif /* Define if you need to in order for stat and other things to work. */ #undef _POSIX_SOURCE /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if char is unsigned */ #undef __CHAR_UNSIGNED__ /* Define sizeof(char) */ #define SIZEOF_CHAR 0 /* Define sizeof(short) */ #define SIZEOF_SHORT 0 /* Define sizeof(int) */ #define SIZEOF_INT 0 /* Define sizeof(long) */ #define SIZEOF_LONG 0 /* Define sizeof(long long) */ #define SIZEOF_LONG_LONG 0 /* Define sizeof(float) */ #define SIZEOF_FLOAT 0 /* Define sizeof(double) */ #define SIZEOF_DOUBLE 0 /* Define sizeof(long double) */ #define SIZEOF_LONG_DOUBLE 0 /* Define sizeof(void *) */ #define SIZEOF_VOID_P 0 /* Define to empty if the keyword does not work. */ #undef const /* Define to `int' if doesn't define. */ #undef pid_t /* Define to `unsigned' if doesn't define. */ #undef size_t /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ #undef CRAY_STACKSEG_END /* Define if using alloca.c. */ #undef C_ALLOCA /* Define if you have alloca, as a function or macro. */ #undef HAVE_ALLOCA /* Define if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define if your declares struct tm. */ #undef TM_IN_SYS_TIME /* Define if and can be both included. */ #undef TIME_WITH_SYS_TIME /* Define if you have the gettimeofday function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the getcwd function. */ #undef HAVE_GETCWD /* Define if you have the gethostname function. */ #undef HAVE_GETHOSTNAME /* Define if you have the memcpy function. */ #undef HAVE_MEMCPY /* Define if you have the memmove function. */ #undef HAVE_MEMMOVE /* Define if you have the unlink function. */ #undef HAVE_UNLINK /* Define if you have the fcntl function. */ #undef HAVE_FCNTL /* Define if you have the popen function. */ #undef HAVE_POPEN /* Define if you have the fnmatch function. */ #undef HAVE_FNMATCH /* Define if you have the on_exit function. */ #undef HAVE_ON_EXIT /* Define if you have the strstr function. */ #undef HAVE_STRSTR /* Define if you have the strerror function. */ #undef HAVE_STRERROR /* Define if stdio.h defines the sys_errlist table */ #undef HAVE_SYS_ERRLIST_DECL /* Define if you have the vsnprintf function. */ #undef HAVE_VSNPRINTF /* Define if you have the dlopen function. */ #undef HAVE_DLOPEN /* Define if dlfcn.h defines the RTLD_NOW constant */ #undef HAVE_RTLD_NOW /* Define if you have the shl_load function. */ #undef HAVE_SHL_LOAD /* If words are stored with the most significant byte first (like Motorola and SPARC, but not Intel and VAX, CPUs */ #undef WORDS_BIGENDIAN /* Define if your FPU arithmetics is of the DEC type. */ #undef HAVE_DEC_FPU /* Define if your FPU arithmetics is of the little endian IEEE type. */ #undef HAVE_LIEEE_FPU /* Define if your FPU arithmetics is of the big endian IEEE type. */ #undef HAVE_BIEEE_FPU /* Define if realloc() is buggy (SunOS4, for example) */ #undef REALLOC_IS_BUGGY /* Define if you have the drand48 function. */ #undef HAVE_DRAND48 /* Define if your system supports locale. */ #undef HAVE_SETLOCALE /* Define if stdlib.h defines the drand48 function. */ #undef HAVE_DRAND48_DECL /* Define if you have the m library (-lm). */ #undef HAVE_LIBM /* Define if you have the header file. */ #undef HAVE_MATH_H /* Define if you have . */ #undef HAVE_FLOAT_H /* Define if you have . */ #undef HAVE_IEEEFP_H /* Define if you have the hypot function. */ #undef HAVE_HYPOT /* Define if the hypot function is declared in math.h. */ #undef HAVE_HYPOT_DECL /* Define if you have the cbrt function. */ #undef HAVE_CBRT /* Define if the cbrt function is declared in math.h. */ #undef HAVE_CBRT_DECL /* Define if you have the log2 function. */ #undef HAVE_LOG2 /* Define if the log2 function is declared in math.h. */ #undef HAVE_LOG2_DECL /* Define if you have the rint function. */ #undef HAVE_RINT /* Define if the rint function is declared in math.h. */ #undef HAVE_RINT_DECL /* Define if you have the lgamma function. */ #undef HAVE_LGAMMA /* Define if the lgamma function is declared in math.h. */ #undef HAVE_LGAMMA_DECL /* Define if math.h defines the signgam variable. */ #undef HAVE_SIGNGAM_DECL /* Define if you have the asinh function. */ #undef HAVE_ASINH /* Define if the asinh function is declared in math.h. */ #undef HAVE_ASINH_DECL /* Define if you have the acosh function. */ #undef HAVE_ACOSH /* Define if the acosh function is declared in math.h. */ #undef HAVE_ACOSH_DECL /* Define if you have the atanh function. */ #undef HAVE_ATANH /* Define if the atanh function is declared in math.h. */ #undef HAVE_ATANH_DECL /* Define if you have the erf function. */ #undef HAVE_ERF /* Define if the erf function is declared in math.h. */ #undef HAVE_ERF_DECL /* Define if you have the erfc function. */ #undef HAVE_ERFC /* Define if the erfc function is declared in math.h. */ #undef HAVE_ERFC_DECL /* Define if you have the finite function. */ #undef HAVE_FINITE /* Define if the finite function is declared in math.h. */ #undef HAVE_FINITE_DECL /* Define if you have the isfinite function. */ #undef HAVE_ISFINITE /* Define if the isfinite function is declared in math.h. */ #undef HAVE_ISFINITE_DECL /* Define if you have the isnan function. */ #undef HAVE_ISNAN /* Define if the isnan function is declared in math.h. */ #undef HAVE_ISNAN_DECL /* Define if you have the Bessel j0 function. */ #undef HAVE_J0 /* Define if the j0 function is declared in math.h. */ #undef HAVE_J0_DECL /* Define if you have the Bessel j1 function. */ #undef HAVE_J1 /* Define if the j1 function is declared in math.h. */ #undef HAVE_J1_DECL /* Define if you have the Bessel jn function. */ #undef HAVE_JN /* Define if the jn function is declared in math.h. */ #undef HAVE_JN_DECL /* Define if you have the Bessel y0 function. */ #undef HAVE_Y0 /* Define if the y0 function is declared in math.h. */ #undef HAVE_Y0_DECL /* Define if you have the Bessel y1 function. */ #undef HAVE_Y1 /* Define if the y1 function is declared in math.h. */ #undef HAVE_Y1_DECL /* Define if you have the Bessel yn function. */ #undef HAVE_YN /* Define if the yn function is declared in math.h. */ #undef HAVE_YN_DECL /* Define if netCDF library is available */ #undef HAVE_NETCDF /* Define if FFTW Fourier transform library is available */ #undef HAVE_FFTW /* Define if PNG library is available */ #undef HAVE_LIBPNG /* Define if JPEG library is available */ #undef HAVE_LIBJPEG /* Define if PDFlib library is available */ #undef HAVE_LIBPDF /* Define if you want to compile a Fortran wrapper for grace_np lib. */ #undef WITH_F77_WRAPPER /* Define if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define if you have Motif. */ #undef HAVE_MOTIF /* Define if Motif library is actually Lesstif. */ #undef HAVE_LESSTIF /* Define if Motif library includes _XmVersionString[] string. */ #undef HAVE__XMVERSIONSTRING /* Define if you have the Xpm library (-lXpm). */ #undef HAVE_XPM /* Define if you have the xpm.h. */ #undef HAVE_XPM_H /* Define if you have the xpm.h header among X11 includes. */ #undef HAVE_X11_XPM_H /* Define if you have (and want to use) libhelp */ #undef WITH_LIBHELP /* Define if you have (and want to use) XmHTML widget */ #undef WITH_XMHTML /* Define if you have (and want to use) editres */ #undef WITH_EDITRES #if (defined(HAVE_MOTIF) && !defined(X_DISPLAY_MISSING)) # define MOTIF_GUI #else # define NONE_GUI #endif /* Define if the print spooling command itself unlinks the temporary file */ #undef PRINT_CMD_UNLINKS /* Define if you want to compile in (a basic) support for debugging */ #undef WITH_DEBUG #if defined(WITH_DEBUG) # define DEBUG #else # define NDEBUG #endif #endif /* __CONFIG_H */ grace-5.1.23/ac-tools/aclocal.m40000644000076500001440000004226110340163516016015 0ustar fnevgenyusersdnl ACX_SAVE_STATE/ACX_RESTORE_STATE dnl Save/restore flags dnl dnl ACX_SAVE_STATE AC_DEFUN(ACX_SAVE_STATE, [ save_CFLAGS=$CFLAGS save_CPPFLAGS=$CPPFLAGS save_LDFLAGS=$LDFLAGS save_LIBS=$LIBS ]) dnl ACX_RESTORE_STATE AC_DEFUN(ACX_RESTORE_STATE, [ CFLAGS=$save_CFLAGS CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ]) AC_DEFUN(ACX_CHECK_CC_FLAGS, [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK(whether ${CC-cc} accepts $1, ac_$2, [echo 'void f(){}' > conftest.c if test -z "`${CC-cc} $1 -c conftest.c 2>&1`"; then ac_$2=yes else ac_$2=no fi rm -f conftest* ]) if test "$ac_$2" = yes; then : $3 else : $4 fi ]) dnl **** Check for gcc strength-reduce bug **** AC_DEFUN(ACX_GCC_STRENGTH_REDUCE, [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([for gcc strength-reduce bug], ac_cv_c_gcc_strength_bug, AC_TRY_RUN([ int main(void) { static int Array[[3]]; unsigned int B = 3; int i; for(i=0; i #include #define LOG2EA 0.44269504088896340735992 #define ACCURACY "%1.4f" typedef union {unsigned short s[[4]]; double d;} XTYPE; XTYPE X[[]] = { {{0,0,0,0}}, /* Unknown */ {{0x3fdc,0x551d,0x94ae,0x0bf8}}, /* Big endian IEEE */ {{0x0bf8,0x94ae,0x551d,0x3fdc}}, /* Littile endian IEEE */ {{0037742,0124354,0122560,0057703}} /* DEC */ }; int main (void) { int i; char TMPSTR[[1024]]; char LOG2EA_STR[[80]]; i = 0; sprintf(LOG2EA_STR, ACCURACY, LOG2EA); for (i=3; i >= 0; i--) { sprintf(TMPSTR, ACCURACY, X[[i]].d); if (strcmp(TMPSTR, LOG2EA_STR) == 0) { break; } } exit(i); }], ac_cv_c_fpu_arithmetics_type="Unknown", [case "$?" in "1"[)] ac_cv_c_fpu_arithmetics_type="Big endian IEEE" ;; "2"[)] ac_cv_c_fpu_arithmetics_type="Little endian IEEE" ;; "3"[)] ac_cv_c_fpu_arithmetics_type="DEC" ;; esac], ac_cv_c_fpu_arithmetics_type="Unknown") ) case "$ac_cv_c_fpu_arithmetics_type" in "DEC") AC_DEFINE(HAVE_DEC_FPU) ;; "Little endian IEEE") AC_DEFINE(HAVE_LIEEE_FPU) ;; "Big endian IEEE") AC_DEFINE(HAVE_BIEEE_FPU) ;; esac ]) AC_DEFUN(ACX_ANSI_TYPES, [ dnl **** Check which ANSI integer type is 16 bit AC_CACHE_CHECK( "which ANSI integer type is 16 bit", ac_16bit_type, AC_TRY_RUN([ int main(void) { if (sizeof(short)==2) return(0); else if (sizeof(int)==2) return(1); else return(2); }], ac_16bit_type="short", ac_16bit_type="int", ac_16bit_type=)) if test "$ac_16bit_type" = "short" then T1_AA_TYPE16="short" else T1_AA_TYPE16="int" fi dnl **** Check which ANSI integer type is 32 bit AC_CACHE_CHECK( "which ANSI integer type is 32 bit", ac_32bit_type, AC_TRY_RUN([ int main(void) { if (sizeof(int)==4) return(0); else if (sizeof(long)==4) return(1); else return(2); }], ac_32bit_type="int", ac_32bit_type="long", ac_32bit_type=)) if test "$ac_32bit_type" = "int" then T1_AA_TYPE32="int" else T1_AA_TYPE32="long" fi dnl **** Check which ANSI integer type is 64 bit AC_CACHE_CHECK( "which ANSI integer type is 64 bit", ac_64bit_type, AC_TRY_RUN([ int main(void) { if (sizeof(long)==8) return(0); else return(1); }], ac_64bit_type="long", ac_64bit_type="", ac_64bit_type=)) if test "$ac_64bit_type" = "long" then T1_AA_TYPE64="long" else T1_AA_TYPE64= fi ]) dnl **** Check for buggy realloc() AC_DEFUN(ACX_CHECK_REALLOC, [ AC_CACHE_CHECK([whether realloc is buggy], ac_cv_c_realloc_bug, AC_TRY_RUN([ #include #include int main(void) { void *ptr; ptr = NULL; ptr = realloc(ptr, 1); exit(ptr == NULL); }], ac_cv_c_realloc_bug="no", ac_cv_c_realloc_bug="yes", ac_cv_c_realloc_bug="yes") ) if test "$ac_cv_c_realloc_bug" = "yes" then : $1 else : $2 fi ]) dnl ICE_CHECK_DECL (FUNCTION, HEADER-FILE...) dnl ----------------------------------------- dnl dnl If FUNCTION is available, define `HAVE_FUNCTION'. If it is declared dnl in one of the headers named in the whitespace-separated list dnl HEADER_FILE, define `HAVE_FUNCTION_DECL` (in all capitals). dnl AC_DEFUN(ICE_CHECK_DECL, [ changequote(,)dnl ice_tr=`echo $1 | tr '[a-z]' '[A-Z]'` changequote([,])dnl ice_have_tr=HAVE_$ice_tr ice_have_decl_tr=${ice_have_tr}_DECL ice_have_$1=no AC_CHECK_FUNCS($1, ice_have_$1=yes) if test "${ice_have_$1}" = yes; then AC_MSG_CHECKING(for $1 declaration in $2) AC_CACHE_VAL(ice_cv_have_$1_decl, [ ice_cv_have_$1_decl=no changequote(,)dnl ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*' ice_re_word='(^|[^a-zA-Z_0-9_])' changequote([,])dnl for header in $2; do # Check for ordinary declaration AC_EGREP_HEADER([${ice_re_word}$1 *\(], $header, ice_cv_have_$1_decl=yes) if test "$ice_cv_have_$1_decl" = yes; then break fi # Check for "fixed" declaration like "getpid _PARAMS((int))" AC_EGREP_HEADER([${ice_re_word}$1 *$ice_re_params\(\(], $header, ice_cv_have_$1_decl=yes) if test "$ice_cv_have_$1_decl" = yes; then break fi done ]) AC_MSG_RESULT($ice_cv_have_$1_decl) if test "$ice_cv_have_$1_decl" = yes; then AC_DEFINE_UNQUOTED(${ice_have_decl_tr}) fi fi ])dnl dnl --- *@-mdw_CHECK_MANYLIBS-@* --- dnl dnl Author: Mark Wooding dnl dnl Synopsis: mdw_CHECK_MANYLIBS(FUNC, LIBS, [IF-FOUND], [IF-NOT-FOUND]) dnl dnl Arguments: FUNC = a function to try to find dnl LIBS = a whitespace-separated list of libraries to search dnl IF-FOUND = what to do when the function is found dnl IF-NOT-FOUND = what to do when the function isn't found dnl dnl Use: Searches for a library which defines FUNC. It first tries dnl without any libraries; then it tries each library specified dnl in LIBS in turn. If it finds a match, it adds the dnl appropriate library to `LIBS'. dnl dnl This is particularly handy under DIREIX: if you link with dnl `-lnsl' then you get non-NIS-aware versions of getpwnam and dnl so on, which is clearly a Bad Thing. dnl dnl Modified: by Evgeny Stambulchik to add (found) libraries to `LIBS' dnl *only* if `IF-FOUND' is absent. As well, if no additional dnl library is needed for `FUNC', `mdw_cv_lib_$1' sets to "". AC_DEFUN(mdw_CHECK_MANYLIBS, [AC_CACHE_CHECK([for library containing $1], [mdw_cv_lib_$1], [mdw_save_LIBS="$LIBS" mdw_cv_lib_$1="no" AC_TRY_LINK(,[$1()], [mdw_cv_lib_$1="none required"]) test "$mdw_cv_lib_$1" = "no" && for i in $2; do LIBS="-l$i $mdw_save_LIBS" AC_TRY_LINK(,[$1()], [mdw_cv_lib_$1="-l$i" break]) done LIBS="$mdw_save_LIBS"]) if test "$mdw_cv_lib_$1" != "no"; then if test "x$3" != "x"; then test "$mdw_cv_lib_$1" = "none required" && mdw_cv_lib_$1="" $3 else test "$mdw_cv_lib_$1" = "none required" || LIBS="$mdw_cv_lib_$1 $LIBS" fi else : $4 fi]) dnl ACX_CHECK_MOTIF dnl -------------- AC_DEFUN(ACX_CHECK_MOTIF, [ AC_REQUIRE([AC_PATH_XTRA]) AC_ARG_WITH(motif_library, [ --with-motif-library=OBJ use OBJ as Motif library [[-lXm]]], motif_library="$withval") if test "x$motif_library" = "x" then motif_library=-lXm fi ACX_SAVE_STATE AC_CACHE_CHECK([for a Motif >= $1 compatible API], acx_cv_motif, AC_CACHE_VAL(acx_cv_motif_library, acx_cv_motif_library=$motif_library) LIBS="$acx_cv_motif_library $GUI_LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" AC_TRY_RUN([ #include int main(void) { int vlibn, vincn; vincn = XmVersion; XmRegisterConverters(); vlibn = xmUseVersion; if (vincn < [$1]) { exit(1); } if (vincn != vlibn) { exit(2); } exit(0); } ], acx_cv_motif="yes", acx_cv_motif="no", acx_cv_motif="no" ) ) if test "$acx_cv_motif" = "yes" then AC_DEFINE(HAVE_MOTIF) MOTIF_LIB="$acx_cv_motif_library" $2 dnl **** Check whether Motif is actually Lesstif ICE_CHECK_LESSTIF dnl **** Check whether _XmVersionString[] can be referred to ACX_CHECK_XMVERSIONSTRING else MOTIF_LIB= $3 fi ACX_RESTORE_STATE ])dnl dnl ICE_CHECK_LESSTIF dnl ----------------- dnl dnl Define `HAVE_LESSTIF' if the Motif library is actually a LessTif library dnl AC_DEFUN(ICE_CHECK_LESSTIF, [ AC_MSG_CHECKING(whether the Motif library is actually a LessTif library) AC_CACHE_VAL(ice_cv_have_lesstif, AC_EGREP_CPP(yes, [#include #ifdef LesstifVersion yes #endif ], ice_cv_have_lesstif=yes, ice_cv_have_lesstif=no)) AC_MSG_RESULT($ice_cv_have_lesstif) if test "$ice_cv_have_lesstif" = yes; then AC_DEFINE(HAVE_LESSTIF) fi ])dnl dnl ACX_CHECK_XMVERSIONSTRING dnl -------------- AC_DEFUN(ACX_CHECK_XMVERSIONSTRING, [ AC_CACHE_CHECK([whether _XmVersionString[] can be referred to], acx_cv__xmversionstring, AC_TRY_LINK([#include ], [extern char _XmVersionString[[]]; printf("%s\n", _XmVersionString);], [acx_cv__xmversionstring="yes"], [acx_cv__xmversionstring="no"] ) ) if test "$acx_cv__xmversionstring" = "yes" then AC_DEFINE(HAVE__XMVERSIONSTRING) $1 else : $2 fi ])dnl dnl ACX_CHECK_T1LIB dnl -------------- AC_DEFUN(ACX_CHECK_T1LIB, [ AC_CACHE_CHECK([for T1lib >= $1], acx_cv_t1lib, ACX_SAVE_STATE LIBS="-lt1 -lm $LIBS" AC_TRY_RUN([ #include #include int main(void) { char *vlib; vlib = T1_GetLibIdent(); if (strcmp(vlib, "[$1]") < 0) { exit(1); } exit(0); } ], acx_cv_t1lib="yes", acx_cv_t1lib="no", acx_cv_t1lib="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_t1lib" = "yes" then T1_LIB="-lt1" $2 else T1_LIB= $3 fi ])dnl dnl ACX_CHECK_ZLIB dnl -------------- AC_DEFUN(ACX_CHECK_ZLIB, [ AC_ARG_WITH(zlib_library, [ --with-zlib-library=OBJ use OBJ as ZLIB library [[-lz]]], zlib_library="$withval") if test "x$zlib_library" = "x" then zlib_library=-lz fi AC_CACHE_CHECK([for zlib >= $1], acx_cv_zlib, AC_CACHE_VAL(acx_cv_zlib_library, acx_cv_zlib_library=$zlib_library) ACX_SAVE_STATE LIBS="$acx_cv_zlib_library $LIBS" AC_TRY_RUN([ #include #include int main(void) { char *vlib, *vinc; vlib = zlibVersion(); vinc = ZLIB_VERSION; if (strcmp(vinc, "[$1]") < 0) { exit(1); } if (strcmp(vinc, vlib) != 0) { exit(2); } exit(0); } ], acx_cv_zlib="yes", acx_cv_zlib="no", acx_cv_zlib="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_zlib" = "yes" then Z_LIB="$acx_cv_zlib_library" $2 else Z_LIB= $3 fi ])dnl dnl ACX_CHECK_JPEG dnl -------------- AC_DEFUN(ACX_CHECK_JPEG, [ AC_ARG_WITH(jpeg_library, [ --with-jpeg-library=OBJ use OBJ as JPEG library [[-ljpeg]]], jpeg_library="$withval") if test "x$jpeg_library" = "x" then jpeg_library=-ljpeg fi AC_CACHE_CHECK([for IJG JPEG software >= $1], acx_cv_jpeg, AC_CACHE_VAL(acx_cv_jpeg_library, acx_cv_jpeg_library=$jpeg_library) ACX_SAVE_STATE LIBS="$acx_cv_jpeg_library $LIBS" AC_TRY_RUN([ #include #include int main(void) { int vinc; struct jpeg_compress_struct cinfo; jpeg_create_compress(&cinfo); vinc = JPEG_LIB_VERSION; if (vinc < [$1]) { exit(1); } exit(0); } ], acx_cv_jpeg="yes", acx_cv_jpeg="no", acx_cv_jpeg="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_jpeg" = "yes" then JPEG_LIB=$acx_cv_jpeg_library $2 else JPEG_LIB= $3 fi ])dnl dnl ACX_CHECK_PNG dnl -------------- AC_DEFUN(ACX_CHECK_PNG, [ AC_ARG_WITH(png_library, [ --with-png-library=OBJ use OBJ as PNG library [[-lpng]]], png_library="$withval") if test "x$png_library" = "x" then png_library=-lpng fi AC_CACHE_CHECK([for libpng >= $1], acx_cv_png, AC_CACHE_VAL(acx_cv_png_library, acx_cv_png_library=$png_library) ACX_SAVE_STATE LIBS="$acx_cv_png_library $Z_LIB $LIBS" AC_TRY_RUN([ #include #include int main(void) { char *vlib, *vinc; vlib = png_libpng_ver; vinc = PNG_LIBPNG_VER_STRING; if (strcmp(vinc, "[$1]") < 0) { exit(1); } if (strcmp(vinc, vlib) != 0) { exit(2); } exit(0); } ], acx_cv_png="yes", acx_cv_png="no", acx_cv_png="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_png" = "yes" then PNG_LIB="$acx_cv_png_library" $2 else PNG_LIB= $3 fi ])dnl dnl ACX_CHECK_PDFLIB dnl -------------- AC_DEFUN(ACX_CHECK_PDFLIB, [ AC_ARG_WITH(pdf_library, [ --with-pdf-library=OBJ use OBJ as PDFlib library [[-lpdf]]], pdf_library="$withval") if test "x$pdf_library" = "x" then pdf_library=-lpdf fi AC_CACHE_CHECK([for PDFlib >= $1], acx_cv_pdflib, AC_CACHE_VAL(acx_cv_pdf_library, acx_cv_pdf_library=$pdf_library) ACX_SAVE_STATE LIBS="$acx_cv_pdf_library $JPEG_LIB $PNG_LIB $Z_LIB $LIBS" AC_TRY_RUN([ #include int main(void) { char *vinc; int vlibn, vincn; vlibn = 100*PDF_get_majorversion() + PDF_get_minorversion(); vincn = 100*PDFLIB_MAJORVERSION + PDFLIB_MINORVERSION; vinc = PDFLIB_VERSIONSTRING; if (strcmp(vinc, "[$1]") < 0) { exit(1); } if (vincn != vlibn) { exit(2); } exit(0); } ], acx_cv_pdflib="yes", acx_cv_pdflib="no", acx_cv_pdflib="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_pdflib" = "yes" then PDF_LIB="$acx_cv_pdf_library" $2 else PDF_LIB= $3 fi ])dnl dnl ACX_CHECK_NETCDF dnl -------------- AC_DEFUN(ACX_CHECK_NETCDF, [ AC_ARG_WITH(netcdf_libraries, [ --with-netcdf-libraries=OBJ use OBJ as netCDF libraries [[-lnetcdf]]], netcdf_libraries="$withval") if test "x$netcdf_libraries" = "x" then netcdf_libraries=-lnetcdf fi AC_CACHE_CHECK([for netCDF API version >= $1], acx_cv_netcdf, AC_CACHE_VAL(acx_cv_netcdf_libraries, acx_cv_netcdf_libraries=$netcdf_libraries) ACX_SAVE_STATE LIBS="$acx_cv_netcdf_libraries $LIBS" AC_TRY_RUN([ #include #include int main(void) { char *vlib; vlib = nc_inq_libvers(); if (strcmp(vlib, "[$1]") < 0) { exit(1); } exit(0); } ], acx_cv_netcdf="yes", acx_cv_netcdf="no", acx_cv_netcdf="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_netcdf" = "yes" then NETCDF_LIBS="$acx_cv_netcdf_libraries" $2 else NETCDF_LIBS= $3 fi ])dnl dnl ACX_CHECK_FFTW dnl -------------- AC_DEFUN(ACX_CHECK_FFTW, [ AC_ARG_WITH(fftw_library, [ --with-fftw-library=OBJ use OBJ as FFTW library [[-lfftw]]], fftw_library="$withval") if test "x$fftw_library" = "x" then fftw_library=-lfftw fi AC_CACHE_CHECK([for FFTW library >= $1], acx_cv_fftw, AC_CACHE_VAL(acx_cv_fftw_library, acx_cv_fftw_library=$fftw_library) ACX_SAVE_STATE LIBS="$acx_cv_fftw_library $LIBS" AC_TRY_RUN([ #include #include int main(void) { char *vlib = (char *) fftw_version; if (strcmp(vlib, "[$1]") < 0) { exit(1); } exit(0); } ], acx_cv_fftw="yes", acx_cv_fftw="no", acx_cv_fftw="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_fftw" = "yes" then FFTW_LIB="$acx_cv_fftw_library" $2 else FFTW_LIB= $3 fi ])dnl dnl ACX_CHECK_XMHTML dnl -------------- AC_DEFUN(ACX_CHECK_XMHTML, [ AC_ARG_WITH(xmhtml_library, [ --with-xmhtml-library=OBJ use OBJ as XmHTML library [[-lXmHTML]]], xmhtml_library="$withval") if test "x$xmhtml_library" = "x" then xmhtml_library=-lXmHTML fi AC_CACHE_CHECK([for XmHTML widget >= $1], acx_cv_xmhtml, AC_CACHE_VAL(acx_cv_xmhtml_library, acx_cv_xmhtml_library=$xmhtml_library) ACX_SAVE_STATE LIBS="$acx_cv_xmhtml_library $JPEG_LIB $PNG_LIB $Z_LIB $LIBS" AC_TRY_RUN([ #include int main(void) { int vlib, vinc; vlib = XmHTMLGetVersion(); vinc = XmHTMLVersion; if (vinc < [$1]) { exit(1); } if (vinc != vlib) { exit(2); } exit(0); } ], acx_cv_xmhtml="yes", acx_cv_xmhtml="no", acx_cv_xmhtml="no" ) ACX_RESTORE_STATE ) if test "$acx_cv_xmhtml" = "yes" then XMHTML_LIB="$acx_cv_xmhtml_library" $2 else XMHTML_LIB= $3 fi ])dnl grace-5.1.23/ac-tools/Make.conf.in0000644000076500001440000000317010340161602016274 0ustar fnevgenyusers# No make rules by default .SUFFIXES: # Extension of object files O=@OBJEXT@ # Extension of executables EXE=@EXEEXT@ # Bourn shell SHELL=/bin/sh # Path prefix for installation links PREFIX=@prefix@ # List of subdirectories SUBDIRS=@SUBDIRS@ # Name of executable GRACE=@GRACE@$(EXE) # Location of the Grace home GRACE_HOME=@GRACE_HOME@ # Relocatable that contains alloca() ALLOCA=@ALLOCA@ # Type1 fonts library T1_LIB=@T1_LIB@ # T1 include path T1_INC=@T1_INC@ # T1lib defines (if the bundled version to be used) T1_AA_TYPE16=@T1_AA_TYPE16@ T1_AA_TYPE32=@T1_AA_TYPE32@ T1_AA_TYPE64=@T1_AA_TYPE64@ # Library containing XDR functions XDR_LIB=@XDR_LIB@ # Library containing dll-related functions DL_LIB=@DL_LIB@ # FFTW library FFTW_LIB=@FFTW_LIB@ # netCDF libraries NETCDF_LIBS=@NETCDF_LIBS@ # JPEG library JPEG_LIB=@JPEG_LIB@ # libz library Z_LIB=@Z_LIB@ # PNG library PNG_LIB=@PNG_LIB@ # PDFlib library PDF_LIB=@PDF_LIB@ # Xbae include path XBAE_INC=@XBAE_INC@ # Location of yacc (or its substitution) YACC=@YACC@ # C compiler CC=@CC@ # F77 compiler FC=@FC@ # ar AR=@AR@ # ranlib RANLIB=@RANLIB@ # rm RM=rm -f # soft link LN_S=@LN_S@ # BSD install INSTALL=@INSTALL@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_DATA=@INSTALL_DATA@ MKINSTALLDIRS=@MKINSTALLDIRS@ # CPP flags CPPFLAGS=@CPPFLAGS@ # C flags CFLAGS0=@CFLAGS@ # GUI flags GUI_FLAGS=@GUI_FLAGS@ # LDFLAGS LDFLAGS=@LDFLAGS@ # Libraries (all but GUI) NOGUI_LIBS=@NOGUI_LIBS@ # GUI libraries GUI_LIBS=@X_LIBS@ @GUI_LIBS@ # Command used to print PRINT_CMD=@PRINT_CMD@ # Editor GRACE_EDITOR=@GRACE_EDITOR@ # HTML help viewer command GRACE_HELPVIEWER=@GRACE_HELPVIEWER@ grace-5.1.23/ac-tools/shtool0000755000076500001440000004750707261364672015441 0ustar fnevgenyusers#!/bin/sh ## ## GNU shtool -- The GNU Portable Shell Tool ## Copyright (c) 1994-2001 Ralf S. Engelschall ## ## See http://www.gnu.org/software/shtool/ for more information. ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. ## ## Version: 1.5.2 (27-Feb-2001) ## Contents: 3/17 available modules ## ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ## USA, or contact Ralf S. Engelschall . ## ## Notice: Given that you include this file verbatim into your own ## source tree, you are justified in saying that it remains separate ## from your package, and that this way you are simply just using GNU ## shtool. So, in this situation, there is no requirement that your ## package itself is licensed under the GNU General Public License in ## order to take advantage of GNU shtool. ## ## ## Usage: shtool [] [ [] []] ## ## Available commands: ## install Install a program, script or datafile ## mkdir Make one or more directories ## mkshadow Make a shadow tree through symbolic links ## ## Not available commands (because module was not built-in): ## echo Print string with optional construct expansion ## mdate Pretty-print modification time of a file or dir ## table Pretty-print a field-separated list as a table ## prop Display progress with a running propeller ## move Move files with simultaneous substitution ## mkln Make link with calculation of relative paths ## fixperm Fix file permissions inside a source tree ## tarball Roll distribution tarballs ## guessos Simple operating system guesser ## arx Extended archive command ## slo Separate linker options by library class ## scpp Sharing C Pre-Processor ## version Maintain a version information file ## path Deal with program paths ## if [ $# -eq 0 ]; then echo "$0:Error: invalid command line" 1>&2 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1 fi if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then echo "This is GNU shtool, version 1.5.2 (27-Feb-2001)" echo "Copyright (c) 1994-2001 Ralf S. Engelschall " echo "Report bugs to " echo '' echo "Usage: shtool [] [ [] []]" echo '' echo 'Available global :' echo ' -v, --version display shtool version information' echo ' -h, --help display shtool usage help page (this one)' echo ' -d, --debug display shell trace information' echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available [] []:' echo ' install [-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g]' echo ' [-e] [ ...] ' echo ' mkdir [-t] [-f] [-p] [-m] [ ...]' echo ' mkshadow [-v] [-t] [-a] ' echo '' echo 'Not available (because module was not built-in):' echo ' echo [-n] [-e] [ ...]' echo ' mdate [-n] [-z] [-s] [-d] [-f] [-o] ' echo ' table [-F] [-w] [-c] [-s] ...' echo ' prop [-p]' echo ' move [-v] [-t] [-e] [-p] ' echo ' mkln [-t] [-f] [-s] [ ...] ' echo ' fixperm [-v] [-t] [ ...]' echo ' tarball [-t] [-v] [-o ] [-c ] [-d ] [-u' echo ' ] [-g ] [-e ] [ ...]' echo ' guessos ' echo ' arx [-t] [-C] [ ...]' echo ' slo [-p] -- -L -l [-L -l ...]' echo ' scpp [-v] [-p] [-f] [-o] [-t] [-M]' echo ' [-D] [-C] [ ...]' echo ' version [-l] [-n] [-p] [-s] [-e]' echo ' [-i] [-d] ' echo ' path [-s] [-r] [-d] [-b] [-m] [-p] [ ...]' echo '' exit 0 fi if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then echo "GNU shtool 1.5.2 (27-Feb-2001)" exit 0 fi if [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then shtoolize -oshtool install mkdir mkshadow exit 0 fi if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then shift set -x fi name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` case "$name" in install|mkdir|mkshadow ) # implicit tool command selection tool="$name" ;; * ) # explicit tool command selection tool="$1" shift ;; esac arg_spec="" opt_spec="" gen_tmpfile=no ## ## DISPATCH INTO SCRIPT PROLOG ## case $tool in install ) str_tool="install" str_usage="[-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g] [-e] [ ...] " arg_spec="2+" opt_spec="v.t.c.C.s.m:o:g:e+" opt_v=no opt_t=no opt_c=no opt_C=no opt_s=no opt_m="0755" opt_o="" opt_g="" opt_e="" ;; mkdir ) str_tool="mkdir" str_usage="[-t] [-f] [-p] [-m] [ ...]" arg_spec="1+" opt_spec="t.f.p.m:" opt_t=no opt_f=no opt_p=no opt_m="" ;; mkshadow ) str_tool="mkshadow" str_usage="[-v] [-t] [-a] " arg_spec="2=" opt_spec="v.t.a." opt_v=no opt_t=no opt_a=no ;; -* ) echo "$0:Error: unknown option \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; * ) echo "$0:Error: unknown command \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; esac ## ## COMMON UTILITY CODE ## # determine name of tool if [ ".$tool" != . ]; then # used inside shtool script toolcmd="$0 $tool" toolcmdhelp="shtool $tool" msgprefix="shtool:$tool" else # used as standalone script toolcmd="$0" toolcmdhelp="sh $0" msgprefix="$str_tool" fi # parse argument specification string eval `echo $arg_spec |\ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` # parse option specification string eval `echo h.$opt_spec |\ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` # interate over argument line opt_PREV='' while [ $# -gt 0 ]; do # special option stops processing if [ ".$1" = ".--" ]; then shift break fi # determine option and argument opt_ARG_OK=no if [ ".$opt_PREV" != . ]; then # merge previous seen option with argument opt_OPT="$opt_PREV" opt_ARG="$1" opt_ARG_OK=yes opt_PREV='' else # split argument into option and argument case "$1" in -[a-zA-Z0-9]*) eval `echo "x$1" |\ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ -e 's/";\(.*\)$/"; opt_ARG="\1"/'` ;; -[a-zA-Z0-9]) opt_OPT=`echo "x$1" | cut -c3-` opt_ARG='' ;; *) break ;; esac fi # eat up option shift # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi fi # process option case $opt_MODE in '.' ) # boolean option eval "opt_${opt_OPT}=yes" ;; ':' ) # option with argument (multiple occurances override) eval "opt_${opt_OPT}=\"\$opt_ARG\"" ;; '+' ) # option with argument (multiple occurances append) eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" ;; * ) echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 ;; esac done if [ ".$opt_PREV" != . ]; then echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 fi # process help option if [ ".$opt_h" = .yes ]; then echo "Usage: $toolcmdhelp $str_usage" exit 0 fi # complain about incorrect number of arguments case $arg_MODE in '=' ) if [ $# -ne $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; '+' ) if [ $# -lt $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; esac # establish a temporary file on request if [ ".$gen_tmpfile" = .yes ]; then if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then tmpdir="$TEMPDIR" else tmpdir="/tmp" fi tmpfile="$tmpdir/.shtool.$$" rm -f $tmpfile >/dev/null 2>&1 touch $tmpfile chmod 600 $tmpfile fi ## ## DISPATCH INTO SCRIPT BODY ## case $tool in install ) ## ## install -- Install a program, script or datafile ## Copyright (c) 1997-2001 Ralf S. Engelschall ## Originally written for shtool ## # determine source(s) and destination argc=$# srcs="" while [ $# -gt 1 ]; do srcs="$srcs $1" shift done dstpath="$1" # type check for destination dstisdir=0 if [ -d $dstpath ]; then dstpath=`echo "$dstpath" | sed -e 's:/$::'` dstisdir=1 fi # consistency check for destination if [ $argc -gt 2 -a $dstisdir = 0 ]; then echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 exit 1 fi # iterate over all source(s) for src in $srcs; do dst=$dstpath # if destination is a directory, append the input filename if [ $dstisdir = 1 ]; then dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` dst="$dst/$dstfile" fi # check for correct arguments if [ ".$src" = ".$dst" ]; then echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 continue fi if [ -d "$src" ]; then echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 continue fi # make a temp file name in the destination directory dsttmp=`echo $dst |\ sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ -e "s;\$;/#INST@$$#;"` # verbosity if [ ".$opt_v" = .yes ]; then echo "$src -> $dst" 1>&2 fi # copy or move the file name to the temp name # (because we might be not allowed to change the source) if [ ".$opt_C" = .yes ]; then opt_c=yes fi if [ ".$opt_c" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "cp $src $dsttmp" 1>&2 fi cp $src $dsttmp || exit $? else if [ ".$opt_t" = .yes ]; then echo "mv $src $dsttmp" 1>&2 fi mv $src $dsttmp || exit $? fi # adjust the target file if [ ".$opt_e" != . ]; then sed='sed' for e in $opt_e; do sed="$sed -e '$e'" done cp $dsttmp $dsttmp.old eval "$sed <$dsttmp.old >$dsttmp" || exit $? rm -f $dsttmp.old fi if [ ".$opt_s" = .yes ]; then if [ ".$opt_t" = .yes ]; then echo "strip $dsttmp" 1>&2 fi strip $dsttmp || exit $? fi if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $dsttmp" 1>&2 fi chown $opt_o $dsttmp || exit $? fi if [ ".$opt_g" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chgrp $opt_g $dsttmp" 1>&2 fi chgrp $opt_g $dsttmp || exit $? fi if [ ".$opt_m" != ".-" ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $dsttmp" 1>&2 fi chmod $opt_m $dsttmp || exit $? fi # determine whether to do a quick install # (has to be done _after_ the strip was already done) quick=no if [ ".$opt_C" = .yes ]; then if [ -r $dst ]; then if cmp -s $src $dst; then quick=yes fi fi fi # finally, install the file to the real destination if [ $quick = yes ]; then if [ ".$opt_t" = .yes ]; then echo "rm -f $dsttmp" 1>&2 fi rm -f $dsttmp else if [ ".$opt_t" = .yes ]; then echo "rm -f $dst && mv $dsttmp $dst" 1>&2 fi rm -f $dst && mv $dsttmp $dst fi done ;; mkdir ) ## ## mkdir -- Make one or more directories ## Copyright (c) 1996-2001 Ralf S. Engelschall ## Originally written for public domain by Noah Friedman ## Cleaned up and enhanced for shtool ## errstatus=0 for p in ${1+"$@"}; do # if the directory already exists... if [ -d "$p" ]; then if [ ".$opt_f" = .no -a ".$opt_p" = .no ]; then echo "$msgprefix:Error: directory already exists: $p" 1>&2 errstatus=1 break else continue fi fi # if the directory has to be created... if [ ".$opt_p" = .no ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $p" 1>&2 fi mkdir $p || errstatus=$? else # the smart situation set fnord `echo ":$p" |\ sed -e 's/^:\//%/' \ -e 's/^://' \ -e 's/\// /g' \ -e 's/^%/\//'` shift pathcomp='' for d in ${1+"$@"}; do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp="./$pathcomp" ;; esac if [ ! -d "$pathcomp" ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi mkdir $pathcomp || errstatus=$? if [ ".$opt_m" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chmod $opt_m $pathcomp" 1>&2 fi chmod $opt_m $pathcomp || errstatus=$? fi fi pathcomp="$pathcomp/" done fi done exit $errstatus ;; mkshadow ) ## ## mkshadow -- Make a shadow tree through symbolic links ## Copyright (c) 1998-2001 Ralf S. Engelschall ## Originally written for Apache ## # source and destination directory src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'` # check whether source exists if [ ! -d $src ]; then echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2 exit 1 fi # determine if one of the paths is an absolute path, # because then we have to use an absolute symlink oneisabs=0 case $src in /* ) oneisabs=1 ;; esac case $dst in /* ) oneisabs=1 ;; esac # determine reverse directory for destination directory dstrevdir='' if [ $oneisabs = 0 ]; then # derive reverse path from forward path pwd=`pwd` OIFS="$IFS"; IFS='/' for pe in $dst; do if [ "x$pe" = "x.." ]; then OIFS2="$IFS"; IFS="$DIFS" eval `echo "$pwd" |\ sed -e 's:\([^/]*\)$:; dir="\1":' \ -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\ -e 's:^;:pwd="";:'` dstrevdir="$dir/$dstrevdir" IFS="$OIFS2" else dstrevdir="../$dstrevdir" fi done IFS="$OIFS" else src="`cd $src; pwd`"; fi # create directory tree at destination if [ ! -d $dst ]; then if [ ".$opt_t" = .yes ]; then echo "mkdir $dst" 1>&2 fi mkdir $dst fi if [ ".$opt_a" = .yes ]; then DIRS=`cd $src; find . -type d -print |\ sed -e '/^\.$/d' -e 's:^\./::'` else DIRS=`cd $src; find . -type d -print |\ sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'` fi for dir in $DIRS; do if [ ".$opt_t" = .yes ]; then echo "mkdir $dst/$dir" 1>&2 fi mkdir $dst/$dir done # fill directory tree with symlinks to files if [ ".$opt_a" = .yes ]; then FILES="`cd $src; find . -depth -print |\ sed -e 's/^\.\///'`" else FILES="`cd $src; find . -depth -print |\ sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \ -e '/\.cvsignore$/d' -e '/\/CVS/d' \ -e '/\/\.#/d' -e '/\.orig$/d' \ -e 's/^\.\///'`" fi for file in $FILES; do # don't use `-type f' above for find because of symlinks if [ -d "$src/$file" ]; then continue fi basename=`echo $file | sed -e 's:^.*/::'` dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'` from=`echo "$src/$file" | sed -e 's/^\.\///'` to="$dst/$dir$basename" if [ $oneisabs = 0 ]; then if [ ".$dir" != . ]; then subdir=`echo $dir | sed -e 's:/$::'` # derive reverse path from forward path revdir='' OIFS="$IFS"; IFS='/' for pe in $subdir; do revdir="../$revdir" done IFS="$OIFS" # finalize from from="$revdir$from" fi from="$dstrevdir$from" fi if [ ".$opt_v" = .yes ]; then echo " $to" 1>&2 fi if [ ".$opt_t" = .yes ]; then echo "ln -s $from $to" 1>&2 fi ln -s $from $to done ;; esac exit 0 ##EOF## grace-5.1.23/ac-tools/config.guess0000755000076500001440000012756211014401767016507 0ustar fnevgenyusers#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-04-14' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grace-5.1.23/ac-tools/install-sh0000644000076500001440000000007606777226426016177 0ustar fnevgenyusers#This dummy file here because AC_CONFIG_AUX_DIR looks for it. grace-5.1.23/ac-tools/configure.in0000644000076500001440000004305011116553414016465 0ustar fnevgenyusersdnl **** Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) AC_INIT(src/main.c) AC_CONFIG_AUX_DIR(ac-tools) AC_CONFIG_HEADER(config.h:ac-tools/config.h.in) AC_PREFIX_DEFAULT("/usr/local") builtin(include, ac-tools/aclocal.m4) AC_SUBST(EXEEXT) AC_SUBST(OBJEXT) AC_SUBST(BATEXT) AC_SUBST(MKINSTALLDIRS) AC_SUBST(GRACE) AC_SUBST(GRACE_HOME) AC_SUBST(GUI_FLAGS) AC_SUBST(FC) AC_SUBST(GUI_LIBS) AC_SUBST(NOGUI_LIBS) AC_SUBST(NETCDF_LIBS) AC_SUBST(XDR_LIB) AC_SUBST(DL_LIB) AC_SUBST(T1_LIB) AC_SUBST(T1_INC) AC_SUBST(FFTW_LIB) AC_SUBST(Z_LIB) AC_SUBST(JPEG_LIB) AC_SUBST(PNG_LIB) AC_SUBST(PDF_LIB) AC_SUBST(XBAE_INC) AC_SUBST(SUBDIRS) AC_SUBST(GRACE_EDITOR) AC_SUBST(GRACE_HELPVIEWER) AC_SUBST(PRINT_CMD) dnl **** Those are for T1lib AC_SUBST(T1_AA_TYPE16) AC_SUBST(T1_AA_TYPE32) AC_SUBST(T1_AA_TYPE64) dnl **** define home dir of Grace if test "x${prefix}" = "xNONE" then GRACE_HOME=${ac_default_prefix}/grace else GRACE_HOME=${prefix}/grace fi AC_ARG_ENABLE(grace-home, [ --enable-grace-home=DIR define Grace home dir [[PREFIX/grace]]], [GRACE_HOME="${enableval}"]) dnl **** option to define config file overriding autodetect AC_ARG_ENABLE(config, [ --enable-config=FILE define configuration FILE to override autodetection (not recommended!)], [CONF_FILE="${enableval}"]) dnl **** define C compiler CC=${CC-gcc} AC_ARG_WITH(cc, [ --with-cc=PROG use PROG as C compiler [[${CC-gcc}]]], [CC="${withval}"]) dnl **** define Fortran compiler FC=${FC-f77} AC_ARG_WITH(f77, [ --with-f77=PROG use PROG as Fortran compiler [[${FC-f77}]]], [FC="${withval}"]) dnl Chance to add include path AC_ARG_WITH(extra-incpath, [ --with-extra-incpath=PATH define extra include path (dir1:dir2:...) [[none]]], [CPPFLAGS="${CPPFLAGS} -I`echo ${withval}|sed 's/:/\ -I/g'`"]) dnl ... and ld path AC_ARG_WITH(extra-ldpath, [ --with-extra-ldpath=PATH define extra ld path (dir1:dir2:...) [[none]]], [LDFLAGS="-L`echo ${withval}|sed 's/:/\ -L/g'` ${LDFLAGS}"; case "${host}" in sparc-sun-solaris*) LDFLAGS="-R:${withval} ${LDFLAGS}";; esac ]) dnl **** use bundled T1lib AC_ARG_WITH(bundled_t1lib, [ --with-bundled-t1lib use bundled T1lib [[no]]], [case "${withval}" in yes) bundled_t1lib=true ;; no) bundled_t1lib=false;; *) AC_MSG_ERROR(bad value ${withval} for --with-bundled-t1lib) ;; esac],[bundled_t1lib=false]) dnl **** use bundled Xbae AC_ARG_WITH(bundled_xbae, [ --with-bundled-xbae use bundled Xbae [[yes]]], [case "${withval}" in yes) bundled_xbae=true ;; no) bundled_xbae=false;; *) AC_MSG_ERROR(bad value ${withval} for --with-bundled-xbae) ;; esac],[bundled_xbae=true]) dnl **** use netcdf AC_ARG_ENABLE(netcdf, [ --enable-netcdf enable support for netCDF [[yes]]], [case "${enableval}" in yes) netcdf=true ;; no) netcdf=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-netcdf) ;; esac],[netcdf=true]) dnl **** use FFTW AC_ARG_WITH(fftw, [ --with-fftw use FFTW library for Fourier transforms [[yes]]], [case "${withval}" in yes) fftw=true ;; no) fftw=false;; *) AC_MSG_ERROR(bad value ${withval} for --with-fftw) ;; esac],[fftw=true]) dnl **** whether to build JPEG driver AC_ARG_ENABLE(jpegdrv, [ --enable-jpegdrv build JPEG driver [[yes]]], [case "${enableval}" in yes) jpegdrv=true ;; no) jpegdrv=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-jpegdrv) ;; esac],[jpegdrv=true]) dnl **** whether to build PNG driver AC_ARG_ENABLE(pngdrv, [ --enable-pngdrv build PNG driver [[yes]]], [case "${enableval}" in yes) pngdrv=true ;; no) pngdrv=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-pngdrv) ;; esac],[pngdrv=true]) dnl **** whether to build PDF driver AC_ARG_ENABLE(pdfdrv, [ --enable-pdfdrv build PDF driver [[yes]]], [case "${enableval}" in yes) pdfdrv=true ;; no) pdfdrv=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-pdfdrv) ;; esac],[pdfdrv=true]) dnl **** check if user wants to compile grace_np lib with support for Fortran AC_ARG_ENABLE(f77_wrapper, [ --enable-f77-wrapper include Fortran wrapper for libgrace_np [[yes]]], [case "${enableval}" in yes) f77_wrapper=true ;; no) f77_wrapper=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-f77-wrapper) ;; esac],[f77_wrapper=true]) dnl **** use editres AC_ARG_ENABLE(editres, [ --enable-editres enable editres support [[yes]]], [case "${enableval}" in yes) editres=true ;; no) editres=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-editres) ;; esac],[editres=true]) dnl **** use libhelp AC_ARG_ENABLE(libhelp, [ --enable-libhelp use libhelp [[no]]], [case "${enableval}" in yes) libhelp=true ;; no) libhelp=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-libhelp) ;; esac],[libhelp=false]) dnl **** use XmHTML AC_ARG_ENABLE(xmhtml, [ --enable-xmhtml use XmHTML widget for on-line help [[yes]]], [case "${enableval}" in yes) xmhtml=true ;; no) xmhtml=false;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-xmhtml) ;; esac],[xmhtml=true]) if test $xmhtml = true && test $libhelp = true then AC_MSG_ERROR(can't use both libhelp and XmHTML) fi dnl **** define editor GRACE_EDITOR="'xterm -e vi'" AC_ARG_WITH(editor, [ --with-editor=COMMAND define editor [["xterm -e vi"]]], [GRACE_EDITOR="'${withval}'"]) dnl **** define help viewer GRACE_HELPVIEWER="'mozilla %s'" AC_ARG_WITH(helpviewer, [ --with-helpviewer=COMMAND define help viewer command [["mozilla %s"]]], [GRACE_HELPVIEWER="'${withval}'"]) dnl **** define print command AC_ARG_WITH(printcmd, [ --with-printcmd=PROG use PROG for printing], [if test "x${withval}" != "x"; then PRINT_CMD="'${withval}'" else PRINT_CMD=NONE fi], [PRINT_CMD=NONE] ) dnl **** check if user wants to compile with debugging support AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [[no]]], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac],[debug=false]) dnl **** maintainer mode AC_ARG_ENABLE(maintainer, [ --enable-maintainer enable maintainer's mode [[no]]], [case "${enableval}" in yes) maintainer=true; debug=true ;; no) maintainer=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-maintainer) ;; esac],[maintainer=false]) if test $maintainer = true then AC_DEFINE(WITH_DEBUG) fi dnl Support for Fortran wrapper if test $f77_wrapper = true; then AC_DEFINE(WITH_F77_WRAPPER) fi dnl **** Possibility to override defaults if test "x$CONF_FILE" != "x" then if test -r $CONF_FILE then AC_MSG_RESULT(--> using \`$CONF_FILE' as config file) . $CONF_FILE else AC_MSG_ERROR(--> Can't open file \`$CONF_FILE' for reading!) exit 1 fi else dnl **** Define CFLAGS etc empty to prevent configure from setting them CFLAGS=${CFLAGS-""} FFLAGS=${FFLAGS-""} LDFLAGS=${LDFLAGS-""} OPTIMIZE=${OPTIMIZE-""} DEBUG=${DEBUG-""} fi dnl **** Check for host type AC_CANONICAL_HOST dnl Checks for C compiler AC_PROG_CC AC_ISC_POSIX AC_AIX AC_MINIX if test "x${CFLAGS}" = "x" then if test "x${GCC}" = "xyes" then dnl **** default settings for gcc DEBUG="-g -O2" OPTIMIZE="-O2" CFLAGS="-fno-common -Wall -Wpointer-arith -Wnested-externs" dnl **** check for strength-reduce bug ACX_GCC_STRENGTH_REDUCE(CFLAGS="$CFLAGS -fno-strength-reduce") CFLAGS="$CPU_FLAGS $CFLAGS" else case "${host}" in alpha*-dec-osf4.*) CFLAGS="-std1 -w0" OPTIMIZE="-O2" DEBUG="-g3 -O2" ;; hppa*-hp-hpux*) CFLAGS="-Aa -D_HPUX_SOURCE" OPTIMIZE="-O" DEBUG="-g -O" ;; mips-sgi-irix6.[[4-9]]*) CFLAGS="-w" OPTIMIZE="-O2 -OPT:Olimit=0" DEBUG="-g3 -O2 -OPT:Olimit=0" ;; mips-sgi-irix*) CFLAGS="-fullwarn -woff 835" OPTIMIZE="-O2 -Olimit 3500" ;; rs6000-ibm-aix*) CFLAGS="-D_ALL_SOURCE" OPTIMIZE="-O2" DEBUG="-g -O2" ;; *) CFLAGS="" OPTIMIZE="-O" DEBUG="-g" ;; esac fi fi case $debug in true) CFLAGS="$DEBUG $CFLAGS";; *) CFLAGS="$OPTIMIZE $CFLAGS";; esac case $FC in /*|../*|./*) if test ! -x $FC; then FC=no fi ;; *) AC_CHECK_PROG(fc, $FC, $FC, no) FC=$ac_cv_prog_fc ;; esac if test "${FC}" = "no" then AC_MSG_RESULT(--> Fortran tests won't be compiled) FC=: fi dnl **** Check for some compiler/system characteristics AC_C_CHAR_UNSIGNED AC_CHECK_SIZEOF(char,0) AC_CHECK_SIZEOF(short,0) AC_CHECK_SIZEOF(int,0) AC_CHECK_SIZEOF(long,0) AC_CHECK_SIZEOF(long long,0) AC_CHECK_SIZEOF(float,0) AC_CHECK_SIZEOF(double,0) AC_CHECK_SIZEOF(long double,0) AC_CHECK_SIZEOF(void *,0) dnl **** Check for endianess AC_C_BIGENDIAN dnl **** Checks for FPU arithmetics ACX_CHECK_FPU dnl **** .exe/.obj file extensions AC_EXEEXT AC_OBJEXT OBJEXT=".$OBJEXT" AC_PROG_MAKE_SET dnl **** Checks for programs. AC_CHECK_PROG(AR, ar, ar, NONE) if test "$AR" = "NONE"; then AC_MSG_ERROR(--> Can't find \`ar'!) AC_CACHE_SAVE exit 1 fi AC_PROG_RANLIB AC_PROG_LN_S AC_PROG_YACC AC_PROG_INSTALL case "x$INSTALL" in x/*) ;; *) INSTALL=`pwd`/ac-tools/"shtool install -c" ; esac MKINSTALLDIRS=`pwd`/ac-tools/"shtool mkdir -p -f" if test "x$PRINT_CMD" = "xNONE"; then AC_CHECK_PROG(LP_CMD, lp, 'lp -c', "NONE") if test "${ac_cv_prog_LP_CMD}" = "NONE"; then AC_CHECK_PROG(LPR_CMD, lpr, 'lpr', "NONE") if test "${ac_cv_prog_LPR_CMD}" = "NONE"; then PRINT_CMD= else PRINT_CMD="${ac_cv_prog_LPR_CMD}" fi else PRINT_CMD="${ac_cv_prog_LP_CMD}" fi fi AC_MSG_RESULT(--> Using \"$PRINT_CMD\" to print) dnl **** Checks for header files. AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(unistd.h fcntl.h) AC_CHECK_HEADERS(sys/param.h sys/time.h sys/select.h) AC_HEADER_TIME dnl **** math.h and related AC_CHECK_HEADERS(math.h float.h ieeefp.h) dnl **** Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_PID_T AC_TYPE_SIZE_T AC_STRUCT_TM dnl **** Checks for library functions. AC_TYPE_SIGNAL AC_FUNC_ALLOCA AC_CHECK_FUNCS(getcwd gethostname) AC_CHECK_FUNCS(strstr) AC_CHECK_FUNCS(memcpy memmove) AC_CHECK_FUNCS(unlink fcntl) AC_CHECK_FUNCS(popen) AC_CHECK_FUNCS(gettimeofday) AC_CHECK_FUNCS(fnmatch) AC_CHECK_FUNCS(vsnprintf) AC_CHECK_FUNCS(on_exit) AC_CHECK_FUNCS(strerror) if test "$ac_cv_func_strerror" = no; then AC_CACHE_CHECK([for sys_errlist declaration in stdio.h], ac_cv_sys_errlist_decl, AC_EGREP_HEADER(sys_errlist, stdio.h, ac_cv_sys_errlist_decl="yes", ac_cv_sys_errlist_decl="no")) if test "$ac_cv_sys_errlist_decl" = yes; then AC_DEFINE(HAVE_SYS_ERRLIST_DECL) fi fi ICE_CHECK_DECL(drand48, stdlib.h) dnl **** Check for locale AC_CHECK_FUNCS(setlocale) dnl **** Check for buggy realloc() ACX_CHECK_REALLOC(AC_DEFINE(REALLOC_IS_BUGGY)) dnl **** Checks for libm AC_CHECK_LIB(m, sin) dnl **** Those functions are usually found in libm but... ICE_CHECK_DECL(hypot, math.h) ICE_CHECK_DECL(rint, math.h) ICE_CHECK_DECL(cbrt, math.h) ICE_CHECK_DECL(log2, math.h) ICE_CHECK_DECL(asinh, math.h) ICE_CHECK_DECL(acosh, math.h) ICE_CHECK_DECL(atanh, math.h) ICE_CHECK_DECL(lgamma, math.h) dnl **** The machten4 (unix for mac) system does have signgam in libm dnl **** but it is not declared in if test "$ac_cv_func_lgamma" = yes; then AC_CACHE_CHECK([for signgam declaration in math.h], ac_cv_signgam_decl, AC_EGREP_HEADER(signgam, math.h, ac_cv_signgam_decl="yes", ac_cv_signgam_decl="no")) if test "$ac_cv_signgam_decl" = yes; then AC_DEFINE(HAVE_SIGNGAM_DECL) fi fi ICE_CHECK_DECL(erf, math.h) ICE_CHECK_DECL(erfc, math.h) ICE_CHECK_DECL(j0, math.h) ICE_CHECK_DECL(j1, math.h) ICE_CHECK_DECL(jn, math.h) ICE_CHECK_DECL(y0, math.h) ICE_CHECK_DECL(y1, math.h) ICE_CHECK_DECL(yn, math.h) ICE_CHECK_DECL(finite, math.h) dnl **** C9X-compatible isfinite() may be a good replacement for finite() if test "$ac_cv_lib_m_finite" != yes; then ICE_CHECK_DECL(isfinite, math.h) fi ICE_CHECK_DECL(isnan, math.h) dnl **** Check for T1lib installed if test $bundled_t1lib = false then ACX_CHECK_T1LIB(1.3.1, AC_DEFINE(HAVE_LIBT1), bundled_t1lib=true) fi if test $bundled_t1lib = true then dnl **** Use the bundled T1lib AC_MSG_RESULT(--> Bundled version of T1lib will be used) T1_LIB='$(TOP)/T1lib/libt1.a' T1_INC='-I$(TOP)/T1lib/t1lib' t1lib_dir="T1lib" dnl **** Check ANSI types ACX_ANSI_TYPES else AC_MSG_RESULT(--> Good. Seems you have compatible version of T1lib installed) fi dnl **** Check for XDR mdw_CHECK_MANYLIBS(xdrstdio_create, nsl rpc xdr rpclib, XDR_LIB=$mdw_cv_lib_xdrstdio_create, XDR_LIB="NONE") if test "${XDR_LIB}" = "NONE"; then XDR_LIB= AC_MSG_RESULT(--> No XDR library found; grconvert will not be built) else grconvert_dir="grconvert" fi dnl **** Check for dlopen() interface dnl (Linux, SunOS-[4,5], OSF, IRIX, AIX-4, UnixWare, ...) mdw_CHECK_MANYLIBS(dlopen, dl, [DL_LIB=$mdw_cv_lib_dlopen; AC_DEFINE(HAVE_DLOPEN)], DL_LIB="NONE") if test "${DL_LIB}" != "NONE"; then dnl **** Old implementations of dlopen() don't have RTLD_NOW AC_CACHE_CHECK([whether RTLD_NOW is defined in dlfcn.h], ac_rtld_now_in_dlfcn_h, AC_EGREP_CPP(yes, [#include #ifdef RTLD_NOW yes #endif ], ac_rtld_now_in_dlfcn_h="yes"; AC_DEFINE(HAVE_RTLD_NOW), ac_rtld_now_in_dlfcn_h="no") ) else dnl **** Check for shl_load() interface (HP/UX) mdw_CHECK_MANYLIBS(shl_load, dld, [DL_LIB=$mdw_cv_lib_shl_load; AC_DEFINE(HAVE_SHL_LOAD)], DL_LIB="NONE") fi if test "${DL_LIB}" = "NONE"; then AC_MSG_RESULT(--> Support for dll modules will not be compiled) DL_LIB="" fi if test $netcdf = true then ACX_CHECK_NETCDF(3.0, AC_DEFINE(HAVE_NETCDF), AC_MSG_RESULT(--> support for netCDF is disabled)) fi if test $fftw = true then ACX_CHECK_FFTW(2.1.3, AC_DEFINE(HAVE_FFTW), AC_MSG_RESULT(--> using legacy unoptimized FFT code)) fi dnl **** check for libz - needed for PDF and PNG drivers and XmHTML if test $pngdrv = true || test $pdfdrv = true || test $xmhtml = true then ACX_CHECK_ZLIB(1.0.3) fi dnl **** check for IJG's libjpeg - also, for PDF driver and XmHTML if test $jpegdrv = true || test $pdfdrv = true || test $xmhtml = true then ACX_CHECK_JPEG(61, AC_DEFINE(HAVE_LIBJPEG), AC_MSG_RESULT(--> JPEG backend is disabled)) fi dnl **** check for libpng - needed for PDF and PNG drivers and XmHTML if test $pngdrv = true || test $pdfdrv = true || test $xmhtml = true then ACX_CHECK_PNG(0.9.6, AC_DEFINE(HAVE_LIBPNG), AC_MSG_RESULT(--> PNG backend is disabled)) fi dnl **** check for PDFlib if test $pdfdrv = true then ACX_CHECK_PDFLIB(5.0.0, AC_DEFINE(HAVE_LIBPDF), pdfdrv=false) fi if test $pdfdrv != true; then AC_MSG_RESULT(--> PDF driver is disabled) fi dnl **** TODO: undefine unneeded libraries NOGUI_LIBS="$LIBS" dnl **** Choose a GUI ***** dnl **** default is gui-less GRACE=grace AC_PATH_XTRA if test "$no_x" = yes; then GUI="NONE_GUI" else dnl **** Check for Motif GUI_LIBS="-lXt -lXext -lX11 $X_PRE_LIBS $X_EXTRA_LIBS" ACX_SAVE_STATE LIBS="$GUI_LIBS" CFLAGS="$X_CFLAGS $CFLAGS" CPPFLAGS="$X_CFLAGS $CPPFLAGS" LDFLAGS="$X_LIBS $LDFLAGS" dnl **** use editres case $editres in true) AC_CHECK_LIB(Xmu,_XEditResCheckMessages,GUI_LIBS="-lXmu $GUI_LIBS"; AC_DEFINE(WITH_EDITRES));; *) ;; esac if test "$ac_cv_lib_Xmu__XEditResCheckMessages" != yes; then AC_MSG_RESULT(--> support for EditRes protocol is disabled) fi dnl **** some Motif-2.1 variants need the -lXp library AC_CHECK_LIB(Xp,main,GUI_LIBS="-lXp $GUI_LIBS") dnl **** and some - Xpm lib AC_CHECK_LIB(Xpm,XpmCreatePixmapFromData,GUI_LIBS="-lXpm $GUI_LIBS"; AC_DEFINE(HAVE_XPM)) if test "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = yes; then AC_CHECK_HEADERS(xpm.h X11/xpm.h) fi ACX_RESTORE_STATE ACX_CHECK_MOTIF(1002) if test "$acx_cv_motif" = "no"; then dnl **** only Motif GUI is supported by now: GUI="NONE_GUI" GUI_FLAGS="" GUI_LIBS="" AC_MSG_ERROR(M*tif has not been found) else GUI_LIBS="$MOTIF_LIB $GUI_LIBS" GUI="MOTIF_GUI" GUI_FLAGS="$X_CFLAGS" GRACE=xmgrace dnl **** Special Motif checks xsave_CPPFLAGS="$CPPFLAGS" xsave_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $GUI_FLAGS" LIBS="$X_LIBS $GUI_LIBS $LIBS" dnl **** Check for Xbae widget if test $bundled_xbae = false then AC_CHECK_LIB(Xbae, XbaeCreateMatrix, XBAE_LIB="-lXbae";AC_DEFINE(HAVE_LIBXBAE)) fi if test -z "$XBAE_LIB" then dnl **** Use the bundled Xbae library AC_MSG_RESULT(--> Bundled version of Xbae library will be used) XBAE_LIB='$(TOP)/Xbae/Xbae/libXbae.a' XBAE_INC='-I$(TOP)/Xbae' xbae_dir="Xbae/Xbae" else AC_MSG_RESULT(--> Good. Seems you have compatible version of Xbae installed) fi dnl **** Check for libhelp case $libhelp in true) AC_CHECK_LIB(hlpclient,get_help,LIBHELP_LIB="-lhlpclient"; AC_DEFINE(WITH_LIBHELP));; *) ;; esac dnl **** Check for XmHTML widget if test $xmhtml = true then ACX_CHECK_XMHTML(1105, AC_DEFINE(WITH_XMHTML), xmhtml=false) fi GUI_LIBS="$LIBHELP_LIB $XMHTML_LIB $XBAE_LIB $GUI_LIBS" CPPFLAGS="$xsave_CPPFLAGS" LIBS="$xsave_LIBS" fi fi dnl **** Final list of subdirs SUBDIRS="cephes ${t1lib_dir} ${xbae_dir} src ${grconvert_dir} grace_np fonts templates doc examples auxiliary" dnl **** Create Make.conf AC_OUTPUT(Make.conf:ac-tools/Make.conf.in) grace-5.1.23/auxiliary/0000755000076500001440000000000012032153126014432 5ustar fnevgenyusersgrace-5.1.23/auxiliary/convcal.c0000644000076500001440000007734307050622311016242 0ustar fnevgenyusers/* * convcal : dates conversion utility * * Copyright (c) 1999 Luc Maisonobe * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * This programs allows you to convert dates between calendar format * and numerical format. * The following command will compile the program : * cc -o convcal convcal.c -lm */ #include #include #include #include #include #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #endif #define REFDATE "-4713-01-01T12:00:00" typedef enum { FMT_iso, FMT_european, FMT_us, FMT_days, FMT_seconds, FMT_nohint } Dates_format; typedef struct { int value; int digits; } Int_token; /* * set of functions to convert julian calendar elements * with negative years to julian day */ static int neg_julian_non_leap (int year) { /* one leap year every four years, leap years : -4713, -4709, ..., -5, -1 */ return (3 - year) & 3; } static long neg_julian_cal_to_jul(int y, int m, int d) { /* day 0 : -4713-01-01 * day 1721423 : -1-12-31 */ return (1461L*(y + 1L))/4L + (m*489)/16 - ((m > 2) ? (neg_julian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721057L; } static int neg_julian_year_estimate(long n) { /* year bounds : 4n - 6887153 <= 1461y <= 4n - 6885693 * lower bound reached 31st December of leap years * upper bound reached 1st January of leap years * the lower bound gives a low estimate of the year */ return (int) ((4L*n - 6887153L)/1461L); } /* * set of functions to convert julian calendar elements * with positive years to julian day */ static int pos_julian_non_leap(int year) { /* one leap year every four years, leap years : 4, 8, ..., 1576, 1580 */ return year & 3; } static long pos_julian_cal_to_jul(int y, int m, int d) { /* day 1721424 : 1-01-01 * day 2299160 : 1582-10-04 */ return (1461L*(y -1L))/4L + (m*489)/16 - ((m > 2) ? (pos_julian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721423L; } static int pos_julian_year_estimate(long n) { /* year bounds : 4n - 6885692 <= 1461y <= 4n - 6884232 * lower bound reached 31st December of leap years * upper bound reached 1st January of leap years * the lower bound gives a low estimate of the year */ int y = (int) ((4L*n - 6885692L)/1461L); /* make sure we stay in the positive model even with our underestimate */ return (y < 1) ? 1 : y; } /* * set of functions to convert gregorian calendar elements to julian day */ static int gregorian_non_leap(int year) { /* one leap year every four years, except for multiple of 100 that * are not also multiple of 400 (so 1600, 1896, 1904, and 2000 are * leap years, but 1700, 1800 and 1900 are non leap years */ return (year & 3) || ((year % 100) == 0 && ((year/100 & 3))); } static long gregorian_cal_to_jul(int y, int m, int d) { long c; /* day 2299161 : 1582-10-15 */ c = (long) ((y - 1)/100); return (1461L*(y - 1))/4 + c/4 - c + (m*489)/16 - ((m > 2) ? (gregorian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721425L; } static int gregorian_year_estimate(long n) { /* * year bounds : 400n - 688570288 <= 146097y <= 400n - 688423712 * lower bound reached on : 1696-12-31, 2096-12-31, 2496-12-31 ... * upper bound reached on : 1904-01-01, 2304-01-01, 2704-01-01 ... * the lower bound gives a low estimate of the year */ return (int) ((400L*n - 688570288L)/146097L); } /* * convert calendar elements to Julian day */ long cal_to_jul(int y, int m, int d) { long n; n = gregorian_cal_to_jul(y, m, d); if (n < 2299161L) { /* the date belongs to julian calendar */ n = (y < 0) ? neg_julian_cal_to_jul(y, m, d) : pos_julian_cal_to_jul(y, m, d); } return n; } /* * convert julian day to calendar elements */ static void jul_to_some_cal(long n, int (*some_non_leap) (int), long (*some_cal_to_jul) (int, int, int), int (*some_year_estimate) (long), int *y, int *m, int *d) { int non_leap, day_of_year, days_until_end_of_year; /* lower estimation of year */ *y = some_year_estimate(n); non_leap = some_non_leap(*y); days_until_end_of_year = (int) (some_cal_to_jul(*y, 12, 31) - n); while (days_until_end_of_year < 0) { /* correction of the estimate */ (*y)++; non_leap = some_non_leap(*y); days_until_end_of_year += non_leap ? 365 : 366; } day_of_year = (non_leap ? 365 : 366) - days_until_end_of_year; /* estimate of the month : one too high only on last days of January */ *m = (16*(day_of_year + (non_leap ? 32 : 31))) / 489; /* day of month */ *d = day_of_year - (*m*489)/16 + ((*m > 2) ? (non_leap ? 32 : 31) : 30); if (*d < 1) { /* no luck, our estimate is false near end of January */ *m = 1; *d += 31; } } /* * convert julian day to calendar elements */ void jul_to_cal(long n, int *y, int *m, int *d) { if (n < 1721424L) { jul_to_some_cal(n, neg_julian_non_leap, neg_julian_cal_to_jul, neg_julian_year_estimate, y, m, d); } else if (n < 2299161L) { jul_to_some_cal(n, pos_julian_non_leap, pos_julian_cal_to_jul, pos_julian_year_estimate, y, m, d); } else { jul_to_some_cal(n, gregorian_non_leap, gregorian_cal_to_jul, gregorian_year_estimate, y, m, d); } } /* * convert julian day and hourly elements to julian day */ double jul_and_time_to_jul(long jul, int hour, int min, double sec) { return ((double) jul) + (((double) (((hour - 12)*60 + min)*60)) + sec)/86400.0; } /* * convert calendar and hourly elements to julian day */ double cal_and_time_to_jul(int y, int m, int d, int hour, int min, double sec) { return jul_and_time_to_jul (cal_to_jul(y, m, d), hour, min, sec); } /* * convert julian day to calendar and hourly elements * rounding_tol allows to say 1999-12-31T23:59:59.501 * should be rounded to 2000-01-01T00:00:00.000 assuming * it is set to 0.5 second. It is wise to set it according * to the display accuracy of seconds. */ void jul_to_cal_and_time(double jday, double rounding_tol, int *y, int *m, int *d, int *hour, int *min, double *sec) { long n; /* find the time of the day */ n = (long) floor(jday + 0.5); *sec = 24.0*(jday + 0.5 - n); *hour = (int) floor(*sec); *sec = 60.0*(*sec - *hour); *min = (int) floor(*sec); *sec = 60.0*(*sec - *min); if (*sec + rounding_tol >= 60.0) { /* we should round to next minute */ *sec = 0.0; *min += 1; if (*min == 60) { *min = 0; *hour += 1; if (*hour == 24) { *hour = 0; n++; } } } /* now find the date */ jul_to_cal(n, y, m, d); } /* * check the existence of given calendar elements * this includes either number of day in the month * and calendars pecularities (year 0 and October 1582) */ static int check_date(int century, int wy, Int_token y, Int_token m, Int_token d, long *jul) { int y_expand, y_check, m_check, d_check; /* expands years written with two digits only */ if (y.value >= 0 && y.value < wy && y.digits <= 2) { y_expand = century + y.value; } else if (y.value >= wy && y.value < 100 && y.digits <= 2) { y_expand = century - 100 + y.value; } else { y_expand = y.value; } if (m.digits > 2 || d.digits > 2) { /* this should be the year instead of either the month or the day */ return EXIT_FAILURE; } *jul = cal_to_jul(y_expand, m.value, d.value); jul_to_cal(*jul, &y_check, &m_check, &d_check); if (y_expand != y_check || m.value != m_check || d.value != d_check) { return EXIT_FAILURE; } else { return EXIT_SUCCESS; } } /* * lexical analyser for float data (knows about fortran exponent * markers, return address of following data) */ int parse_float(const char* s, double *value, const char **after) { int neg_mant, neg_exp, digits, dot_exp, raw_exp; const char *after_dot; /* we skip leading whitespace */ while (isspace(*s)) { s++; } /* sign */ if (*s == '-') { neg_mant = 1; s++; } else { neg_mant = 0; } /* mantissa */ digits = 0; *value = 0.0; while (isdigit(*s)) { *value = *value*10.0 + (*s++ - '0'); digits++; } if (*s == '.') { after_dot = ++s; while (isdigit(*s)) { *value = *value*10.0 + (*s++ - '0'); digits++; } dot_exp = after_dot - s; } else { dot_exp = 0; } if (digits == 0) { /* there should be at least one digit (either before or after dot) */ return EXIT_FAILURE; } /* exponent (d and D are fortran exponent markers) */ raw_exp = 0; if (*s == 'e' || *s == 'E' || *s == 'd' || *s == 'D') { s++; if (*s == '-') { neg_exp = 1; s++; } else { neg_exp = 0; if (*s == '+') { s++; } } while (isdigit(*s)) { raw_exp = raw_exp*10 + (*s++ - '0'); } if (neg_exp) { raw_exp = -raw_exp; } } /* read float */ *value = (neg_mant ? -(*value) : (*value)) * pow (10.0, dot_exp + raw_exp); if (after != NULL) { /* the caller wants to know what follows the float number */ *after = s; } return EXIT_SUCCESS; } /* * lexical analyser for calendar dates * return the number of read elements, or -1 on failure */ static int parse_calendar_date(const char* s, Int_token tab [5], double *sec) { int i, waiting_separator, negative; negative = 0; waiting_separator = 0; i = 0; while (i < 5) { /* loop from year to minute elements : all integers */ switch (*s) { case '\0': /* end of string */ return i; case ' ' : /* repeatable separator */ s++; negative = 0; break; case '/' : case ':' : case '.' : case 'T' : /* non-repeatable separator */ if (waiting_separator) { if ((*s == 'T') && (i != 3)) { /* the T separator is only allowed between date and time (mainly for iso8601) */ return -1; } s++; negative = 0; waiting_separator = 0; } else { return -1; } break; case '-' : /* either separator or minus sign */ s++; if (waiting_separator) { negative = 0; waiting_separator = 0; } else if ((*s >= '0') && (*s <= '9')) { negative = 1; } else { return -1; } break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : /* digit */ tab[i].value = ((int) *s) - '0'; tab[i].digits = 1; while (isdigit(*++s)) { tab[i].value = tab[i].value*10 + (((int) *s) - '0'); tab[i].digits++; } if (negative) { tab[i].value = -tab[i].value; } i++; negative = 0; waiting_separator = 1; break; default : return -1; } } while (isspace(*s)) { s++; } if (*s == '\0') { return 5; } if ((*s == '/') || (*s == ':') || (*s == '.') || (*s == '-')) { /* this was the seconds separator */ s++; /* seconds are read in float format */ if (parse_float(s, sec, &s) == EXIT_SUCCESS) { while (isspace(*s)) { s++; } if (*s == '\0') { return 6; } } } /* something is wrong */ return -1; } /* * parse a date given either in calendar or numerical format */ int parse_date(const char* s, int century, int wy, Dates_format preferred, double *jul, Dates_format *recognized) { int i, n; int ky, km, kd; static Dates_format trials [] = {FMT_nohint, FMT_iso, FMT_european, FMT_us}; Int_token tab [5]; long j; double sec; const char *after; /* first guess : is it a date in calendar format ? */ n = parse_calendar_date(s, tab, &sec); switch (n) { /* we consider hours, minutes and seconds as optional items */ case -1 : /* parse error */ break; case 3 : tab[3].value = 0; /* adding hours */ tab[3].digits = 1; case 4 : tab[4].value = 0; /* adding minutes */ tab[4].digits = 1; case 5 : sec = 0.0; /* adding seconds */ case 6 : /* we now have a complete date */ /* try the user's choice first */ trials[0] = preferred; for (i = 0; i < 4; i++) { if (trials[i] == FMT_iso) { /* YYYY-MM-DD */ ky = 0; km = 1; kd = 2; } else if (trials[i] == FMT_european) { /* DD/MM/(YY)YY */ ky = 2; km = 1; kd = 0; } else if (trials[i] == FMT_us) { /* MM/DD/(YY)YY */ ky = 2; km = 0; kd = 1; } else { /* the user didn't choose a calendar format */ continue; } if (check_date(century, wy, tab[ky], tab[km], tab[kd], &j) == EXIT_SUCCESS) { *jul = jul_and_time_to_jul(j, tab[3].value, tab[4].value, sec); *recognized = trials[i]; return EXIT_SUCCESS; } } break; default : /* probably a julian date (integer if n == 1, real otherwise) */ break; } /* second guess : is it a date in numerical format ? */ if (parse_float(s, jul, &after) == EXIT_SUCCESS) { while (isspace(*after)) { after++; } if (*after == '\0') { if (preferred == FMT_seconds) { *recognized = FMT_seconds; *jul /= 86400.0; } else { *recognized = FMT_days; } return EXIT_SUCCESS; } } return EXIT_FAILURE; } int convert_and_write(const char *s, int century, int wy, double reference_date, Dates_format input_format, Dates_format output_format) { Dates_format recognized; int y, m, d, hour, min; double jul; double sec; if (parse_date(s, century, wy, input_format, &jul, &recognized) != EXIT_SUCCESS) { return EXIT_FAILURE; } if (recognized == FMT_days || recognized == FMT_seconds) { /* the parsed value is relative to the reference date */ jul += reference_date; } if (output_format == FMT_nohint) { /* choose a format that really convert calendar and numerical */ if ((recognized == FMT_days) || (recognized == FMT_seconds)) { output_format = FMT_iso; } else { output_format = FMT_days; } } switch (output_format) { case FMT_iso : jul_to_cal_and_time(jul, 0.0005, &y, &m, &d, &hour, &min, &sec); fprintf(stdout, "%04d-%02d-%02dT%02d:%02d:%06.3f\n", y, m, d, hour, min, sec); break; case FMT_european : jul_to_cal_and_time(jul, 0.0005, &y, &m, &d, &hour, &min, &sec); fprintf(stdout, "%02d/%02d/%04d %02d:%02d:%06.3f\n", d, m, y, hour, min, sec); break; case FMT_us : jul_to_cal_and_time(jul, 0.0005, &y, &m, &d, &hour, &min, &sec); fprintf(stdout, "%02d/%02d/%04d %02d:%02d:%06.3f\n", m, d, y, hour, min, sec); break; case FMT_days : fprintf(stdout, "%17.8f\n", jul - reference_date); break; case FMT_seconds : fprintf(stdout, "%17.3f\n", 86400.0 * (jul - reference_date)); break; default : fprintf(stderr, "%s:%d: internal error\n", __FILE__, __LINE__); break; } return EXIT_SUCCESS; } int string_equal(const char *c1, const char *c2) { return (strlen(c1) == strlen(c2)) && (strcmp(c1, c2) == 0); } int parse_format(const char *s, Dates_format *f) { if (string_equal(s, "iso")) { *f = FMT_iso; } else if (string_equal(s, "european")) { *f = FMT_european; } else if (string_equal(s, "us")) { *f = FMT_us; } else if (string_equal(s, "days")) { *f = FMT_days; } else if (string_equal(s, "seconds")) { *f = FMT_seconds; } else if (string_equal(s, "nohint")) { *f = FMT_nohint; } else { return EXIT_FAILURE; } return EXIT_SUCCESS; } /* * expand a line buffer */ static void expand_line_buffer(char **adrBuf, int *ptrSize, char **adrPtr) { char *newbuf; int newsize; newsize = *ptrSize + 512; newbuf = (char *) malloc(newsize); if (newbuf == 0) { fprintf(stderr, "Insufficient memory for line"); exit (EXIT_FAILURE); } if (*ptrSize == 0) { /* this is the first time through */ if (adrPtr) { *adrPtr = newbuf; } } else { /* we are expanding an existing line */ strncpy(newbuf, *adrBuf, *ptrSize); if (adrPtr) { *adrPtr += newbuf - *adrBuf; } free(*adrBuf); } *adrBuf = newbuf; *ptrSize = newsize; } /* * help message */ static void usage (FILE *stream, const char *progname) { fprintf (stream, "%s reads the dates either on the command line or in the\n", progname); fprintf (stream, "standard input if the command line contains no date. The following\n"); fprintf (stream, "date formats are supported (hour, minutes and seconds are always optional):\n"); fprintf (stream, "\n"); fprintf (stream, "iso : 1999-12-31T23:59:59.999\n"); fprintf (stream, "european : 31/12/1999 23:59:59.999 or 31/12/99 23:59:59.999\n"); fprintf (stream, "us : 12/31/1999 23:59:59.999 or 12/31/99 23:59:59.999\n"); fprintf (stream, "days : 123456.789\n"); fprintf (stream, "seconds : 123456.789\n"); fprintf (stream, "\n"); fprintf (stream, "The formats are tried in the following order : users's choice,\n"); fprintf (stream, "iso, european and us (there is no ambiguity between calendar\n"); fprintf (stream, "formats and numerical formats and therefore no order is specified\n"); fprintf (stream, "for them). The default user's choice (nohint) does nothing so the\n"); fprintf (stream, "following formats of the list are used ; the main use of user's\n"); fprintf (stream, "choice is to put another format before the other ones. The\n"); fprintf (stream, "separators between various fields can be any characters in the set:\n"); fprintf (stream, "\" :/.-T\". One or more spaces act as one separator, other characters\n"); fprintf (stream, "can not be repeated, the T separator is allowed only between date and\n"); fprintf (stream, "time, mainly for iso8601. So the string \"1999-12 31:23-59\" is allowed\n"); fprintf (stream, "(but not recommended). The '-' character is used both as a\n"); fprintf (stream, "separator (it is traditionally used in iso8601 format) and as the\n"); fprintf (stream, "unary minus (for dates in the far past or for numerical\n"); fprintf (stream, "dates). When the year is between 0 and 99 and is written with two\n"); fprintf (stream, "or less digits, it is mapped to the era beginning at wrap year and\n"); fprintf (stream, "ending at wrap year + 99 as follows :\n"); fprintf (stream, " [wy ; 99] -> [ wrap_year ; 100*(1 + wrap_year/100) - 1 ]\n"); fprintf (stream, " [00 ; wy-1] -> [ 100*(1 + wrap_year/100) ; wrap_year + 99]\n"); fprintf (stream, "so for example if the wrap year is set to 1950 (which is the default\n"); fprintf (stream, "value), then the mapping is :\n"); fprintf (stream, " range [00 ; 49] is mapped to [2000 ; 2049]\n"); fprintf (stream, " range [50 ; 99] is mapped to [1950 ; 1999]\n"); fprintf (stream, "this is reasonably Y2K compliant and is consistent with current use.\n"); fprintf (stream, "Specifying year 1 is still possible using more than two digits as\n"); fprintf (stream, "follows : \"0001-03-04\" is unambiguously March the 4th, year 1, even\n"); fprintf (stream, "if the user's choice is us format. However using two digits only is\n"); fprintf (stream, "not recommended (we introduce a 2050 bug here so this feature\n"); fprintf (stream, "should be removed at some point in the future ;-)\n"); fprintf (stream, "\n"); fprintf (stream, "Numerical dates (days and seconds formats) can be specified using\n"); fprintf (stream, "integral, real or exponential formats (the 'd' and 'D' exponant\n"); fprintf (stream, "markers from fortran are supported in addition to 'e' and 'E').\n"); fprintf (stream, "They are computed according to a customizable reference date.\n"); fprintf (stream, "The default value is given by the REFDATE constant in the source file.\n"); fprintf (stream, "You can change this value as you want before compiling, and you can\n"); fprintf (stream, "change it at will using the -r command line option. The default\n"); fprintf (stream, "value in the distributed file is \"-4713-01-01T12:00:00\", it is a\n"); fprintf (stream, "classical reference for astronomical events (note that the '-' is\n"); fprintf (stream, "used here both as a unary minus and as a separator).\n"); fprintf (stream, "\n"); fprintf (stream, "The program can be used either for Denys's and gregorian\n"); fprintf (stream, "calendars. It does not take into account leap seconds : you can\n"); fprintf (stream, "think it works only in International Atomic Time (TAI) and not in\n"); fprintf (stream, "Coordinated Unified Time (UTC) ... Inexistant dates are detected,\n"); fprintf (stream, "they include year 0, dates between 1582-10-05 and 1582-10-14,\n"); fprintf (stream, "February 29th of non leap years, months below 1 or above 12, ...\n"); fprintf (stream, "\n"); fprintf (stream, "The following command line options are supported. Apart from the -h\n"); fprintf (stream, "flag, all of these options can be used several times, each new\n"); fprintf (stream, "value overriding the preceding one.\n"); fprintf (stream, "\n"); fprintf (stream, "-i format : set user's choice for input format, supported formats are\n"); fprintf (stream, " iso, european, us, days, seconds and nohint.\n"); fprintf (stream, " At the beginning the input format is nohint, which means\n"); fprintf (stream, " the program try to guess the format by itself, if the\n"); fprintf (stream, " user's choice does not allow to parse the date, other\n"); fprintf (stream, " formats are tried\n"); fprintf (stream, "-o format : force output format, supported formats are\n"); fprintf (stream, " iso, european, us, days, seconds and nohint.\n"); fprintf (stream, " At the beginning, the output format is nohint, which means\n"); fprintf (stream, " the program uses days format for dates read in any\n"); fprintf (stream, " calendar format and uses iso8601 for dates read in\n"); fprintf (stream, " numerical format\n"); fprintf (stream, "-r date : set reference date (the date is read using the current\n"); fprintf (stream, " input format) at the beginning the reference is set\n"); fprintf (stream, " according to the REFDATE constant below.\n"); fprintf (stream, "-w year : set the wrap year to year\n"); fprintf (stream, "-h : prints this help message on stderr and exits successfully\n"); exit(0); } /* * driver program */ int main(int argc, char *argv[]) { double reference_date; Dates_format input_format; Dates_format output_format; Dates_format recognized; int century, wy; int i, j, converted; int retval = EXIT_SUCCESS; /* initial values */ century = 2000; wy = 50; if (parse_date(REFDATE, century, wy, FMT_iso, &reference_date, &recognized) != EXIT_SUCCESS) { fprintf(stderr, "%s: unable to parse compiled in reference date (%s) !\n", argv[0], REFDATE); return EXIT_FAILURE; } input_format = FMT_nohint; output_format = FMT_nohint; /* command line parsing */ converted = 0; for (i = 1; i < argc; i = j) { j = i + 1; if (string_equal(argv[i], "-i")) { /* input format */ if (argc < j + 1) { fprintf(stderr, "%s: missing argument for %s flag\n", argv[0], argv[i]); return EXIT_FAILURE; } if (parse_format(argv[j], &input_format) != EXIT_SUCCESS) { fprintf(stderr, "%s: unknown date format \"%s\"\n", argv[0], argv[j]); return EXIT_FAILURE; } ++j; } else if (string_equal(argv[i], "-o")) { /* output format */ if (argc < j + 1) { fprintf(stderr, "%s: missing argument for %s flag\n", argv[0], argv[i]); return EXIT_FAILURE; } if (parse_format(argv[j], &output_format) != EXIT_SUCCESS) { fprintf(stderr, "%s: unknown date format \"%s\"\n", argv[0], argv[j]); return EXIT_FAILURE; } ++j; } else if (string_equal(argv[i], "-r")) { /* reference date */ if (argc < j + 1) { fprintf(stderr, "%s: missing argument for %s flag\n", argv[0], argv[i]); return EXIT_FAILURE; } if (parse_date(argv[j], century, wy, input_format, &reference_date, &recognized) != EXIT_SUCCESS) { fprintf(stderr, "%s: unable to parse reference date (%s)\n", argv[0], REFDATE); return EXIT_FAILURE; } ++j; } else if (string_equal(argv[i], "-w")) { /* wrap year */ if (argc < j + 1) { fprintf(stderr, "%s: missing argument for %s flag\n", argv[0], argv[i]); return EXIT_FAILURE; } century = 100*(1 + atoi(argv[j])/100); wy = atoi(argv[j]) - (century - 100); ++j; } else if (string_equal(argv[i], "-h")) { /* help */ usage(stderr, argv[0]); } else { /* date */ converted = 1; if (convert_and_write (argv[i], century, wy, reference_date, input_format, output_format) != EXIT_SUCCESS) { fprintf(stderr, "%s: unable to parse date (%s)\n", argv[0], argv[i]); retval = EXIT_FAILURE; } } } if (converted == 0) { /* there was no date in the command line : use standard input */ int reading = 1; int num_line = 0; int size = 0; char *line = 0; expand_line_buffer (&line, &size, NULL); while (reading) { /* input lines reading loop */ char *cursor = line + 1; ++num_line; line[0] = ' '; line[1] = '\0'; while (reading != 0 && *(cursor - 1) != '\n') { /* trying to read until end of line */ if (size - (cursor - line) < 2) { /* there is not enough room left */ expand_line_buffer(&line, &size, &cursor); } if (fgets(cursor, size - (cursor - line), stdin) == NULL) { if (cursor == line + 1) { /* we are at end */ reading = 0; } else { /* something went wrong */ fprintf(stderr, "%s: read error on line %d: %s\n", argv[0], num_line, line + 1); retval = EXIT_FAILURE; } } else { /* something has been successfully read */ cursor += strlen(cursor); } } *(cursor - 1) = '\0'; if (reading) { /* converting the date */ if (convert_and_write (line + 1, century, wy, reference_date, input_format, output_format) != EXIT_SUCCESS) { fprintf(stderr, "%s: unable to parse date (%s)\n", argv[0], line + 1); retval = EXIT_FAILURE; } } } } return retval; } grace-5.1.23/auxiliary/Makefile0000644000076500001440000000171507505061045016105 0ustar fnevgenyusers##################################################### # Makefile for auxiliary stuff of Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf AUXILIARIES = README convcal.c magic.grace PROGRAMS = convcal$(EXE) SCRIPTS = fdf2fit all : convcal$(EXE) clean : dummy distclean : clean $(RM) convcal$(EXE) devclean : distclean convcal$(EXE) : convcal.c $(CC) $(CFLAGS0) $(CPPFLAGS) -o $@ convcal.c $(NOGUI_LIBS) install : $(AUXILIARIES) $(PROGRAMS) $(SCRIPTS) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/auxiliary for i in $(AUXILIARIES); do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/auxiliary; done for i in $(PROGRAMS); do $(INSTALL_PROGRAM) -s $$i $(DESTDIR)$(GRACE_HOME)/bin; done for i in $(SCRIPTS); do $(INSTALL_PROGRAM) $$i $(DESTDIR)$(GRACE_HOME)/bin; done tests : dummy links : dummy dummy : grace-5.1.23/auxiliary/magic.grace0000644000076500001440000000136306661400534016531 0ustar fnevgenyusers# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE # # ACE/gr binary 0 string \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003 old ACE/gr binary file >39 byte >0 - version %c # ACE/gr ascii 0 string #\ xvgr\ parameter\ file ACE/gr ascii file 0 string #\ xmgr\ parameter\ file ACE/gr ascii file 0 string #\ ACE/gr\ parameter\ file ACE/gr ascii file # Grace projects 0 string #\ Grace\ project\ file Grace project file >23 string @version\ (version >>32 byte >0 %c >>33 string >\0 \b.%.2s >>35 string >\0 \b.%.2s) # ACE/gr fit description files 0 string #\ ACE/gr\ fit\ description\ ACE/gr fit description file # end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE grace-5.1.23/auxiliary/README0000644000076500001440000000075507120011371015316 0ustar fnevgenyusers Contents of auxiliary: convcal.c - Source for a utility to convert between different date/time formats magic.grace - Section for magic(4) so file(1) would recognize ACE/gr and Grace file types. If it isn't already in your magic number file (probably /etc/magic) you may add it simply by this command: cat magic.grace >> /etc/magic fdf2fit - Script to convert Origin-4 .fdf fit parameter files to Grace format grace-5.1.23/auxiliary/fdf2fit0000755000076500001440000000570607120011263015711 0ustar fnevgenyusers#!/bin/sh exec perl -x $0 ${1+"$@"} #!perl # fdf2fit - script to convert Origin-4 .fdf fit parameter files to ACE/gr's # Version 0.3a # Author Yu. V. Ralchenko ($input_file,$output_file) = @ARGV; # read from STDIN if input file name is '-' $input_file = 'STDIN' if $input_file eq '-'; open (INP,$input_file) or die "Can't open file $input_file: $!\n"; while () { /^Function Name=([^;]+)/i && (($function_name = $1) =~ s/\s+$//) && next; /^Brief Description=([^;]+)/i && (($description = $1) =~ s/\s+$//) && next; /^Number Of Parameters=([^;]+)/i && (($numb_of_pars = $1) =~ s/\s+$//) && next; /^Number Of Independent Variables=(\d+)/i && ($1 > 1) && (print STDERR "\nMore than 1 independent variable!\n\n") && exit; if (s/^Names=(.+)/\1/i) { s/\s+//g; @a=split(/,/); foreach $ind (0..$numb_of_pars-1) { my $cin = 'orig2acegr'.$ind; $var_new{$a[$ind]} = $cin; } next; } elsif (s/^Initial Values=(.+)/\1/i) { s/\(.+?\)|\cM//g; chomp; @a=split(/,/); foreach $ind (0..$numb_of_pars-1) { my $cin = 'orig2acegr'.$ind; $ini_new{$cin} = $a[$ind] if $a[$ind] ne '--'; } next; } elsif (s/^Meanings=(.+)/\1/i) { s/\(.+?\)|\cM//g; chomp; @a=split(/,/); foreach $ind (0..$numb_of_pars-1) { my $cin = 'orig2acegr'.$ind; $mea_new{$cin} = $a[$ind]; } next; } elsif (s/^Lower Bounds=(.+)/\1/i) { s/\(.+?\)|\cM//g; chomp; @a=split(/,/); foreach $ind (0..$numb_of_pars-1) { my $cin = 'orig2acegr'.$ind; $low_new{$cin} = (($a[$ind] =~ /--/) ? '' : $a[$ind]); } next; } elsif (s/^Upper Bounds=(.+)/\1/i) { s/\(.+?\)|\cM//g; chomp; @a=split(/,/); foreach $ind (0..$numb_of_pars-1) { my $cin = 'orig2acegr'.$ind; $upp_new{$cin} = (($a[$ind] =~ /--/) ? '' : $a[$ind]); } next; } elsif (/Formula/i) { while () {last unless /^\s*$/}; tr/\r//; #chomp; s/^y\s*=\s*//i; foreach $key (sort keys %var_new) { s/\b$key\b/$var_new{$key}/ig; } s/orig2acegr/a/g; s/\s+$//; $formula = 'y = '.$_; last; } } if (!defined $output_file) { ($output_file = $input_file) =~ s/\.fdf$/\.fit/i; open (OUT,">$output_file") or die "Can't open file $output_file: $!\n"; $OUT='OUT'; } elsif ($output_file ne '-') { open (OUT,">$output_file") or die "Can't open file $output_file: $!\n"; $OUT='OUT'; } else { $OUT='STDOUT'; } print $OUT "#fit name \"$function_name\"\n"; print $OUT "fit title \"$description\"\n"; print $OUT "fit with $numb_of_pars parameters\n"; print $OUT "fit formula \"$formula\"\n"; foreach $ind (0..$numb_of_pars-1) { $var='a'.$ind; $old='orig2acegr'.$ind; print $OUT "#$var description \"",$mea_new{$old},"\"\n"; print $OUT ($ini_new{$old}?'':'#'),$var," = $ini_new{$old}\n"; print $OUT (($low_new{$old} ? '' : '#'),$var,"min = $low_new{$old}\n"); print $OUT (($upp_new{$old} ? '' : '#'),$var,"max = $upp_new{$old}\n"); print $OUT $var," constraints "; print $OUT (($low_new{$old}=~/^\s*$/ and $upp_new{$old}=~/^\s*$/) ? "off\n" : "on\n"); } exit 0; grace-5.1.23/fonts/0000755000076500001440000000000012032153126013554 5ustar fnevgenyusersgrace-5.1.23/fonts/FontDataBase0000644000076500001440000000153106626627166016020 0ustar fnevgenyusers14 Times-Roman Times-Roman n021003l.pfb Times-Italic Times-Italic n021023l.pfb Times-Bold Times-Bold n021004l.pfb Times-BoldItalic Times-BoldItalic n021024l.pfb Helvetica Helvetica n019003l.pfb Helvetica-Oblique Helvetica-Oblique n019023l.pfb Helvetica-Bold Helvetica-Bold n019004l.pfb Helvetica-BoldOblique Helvetica-BoldOblique n019024l.pfb Courier Courier n022003l.pfb Courier-Oblique Courier-Oblique n022023l.pfb Courier-Bold Courier-Bold n022004l.pfb Courier-BoldOblique Courier-BoldOblique n022024l.pfb Symbol Symbol s050000l.pfb ZapfDingbats ZapfDingbats d050000l.pfb grace-5.1.23/fonts/Makefile0000644000076500001440000000344111716541776015242 0ustar fnevgenyusers##################################################### # Makefile for the fonts directory of Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf FONTDATABASE = FontDataBase FONTS = type1/n021003l.pfb \ type1/n021023l.pfb \ type1/n021004l.pfb \ type1/n021024l.pfb \ type1/n019003l.pfb \ type1/n019023l.pfb \ type1/n019004l.pfb \ type1/n019024l.pfb \ type1/n022003l.pfb \ type1/n022023l.pfb \ type1/n022004l.pfb \ type1/n022024l.pfb \ type1/d050000l.pfb \ type1/s050000l.pfb AFMS = type1/d050000l.afm \ type1/n019003l.afm \ type1/n019004l.afm \ type1/n019023l.afm \ type1/n019024l.afm \ type1/n021003l.afm \ type1/n021004l.afm \ type1/n021023l.afm \ type1/n022003l.afm \ type1/n022023l.afm \ type1/n022004l.afm \ type1/n022024l.afm \ type1/n021024l.afm \ type1/s050000l.afm ENCODINGS = enc/IsoLatin1.enc \ enc/IsoLatin2.enc \ enc/IsoLatin5.enc \ enc/IsoLatin7.enc \ enc/IsoLatin9.enc \ enc/PSLatin1.enc \ enc/PDFDoc.enc \ enc/WinAnsi.enc \ enc/MacRoman.enc \ enc/CP1251.enc \ enc/KOI8-R.enc \ enc/KOI8-U.enc all : dummy tests : dummy clean : dummy distclean : dummy devclean : dummy install : $(FONTS) $(AFMS) $(ENCODINGS) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/fonts $(INSTALL_DATA) $(FONTDATABASE) $(DESTDIR)$(GRACE_HOME)/fonts $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/fonts/type1 for i in $(FONTS); do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/fonts/type1; done for i in $(AFMS); do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/fonts/type1; done $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/fonts/enc for i in $(ENCODINGS); do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/fonts/enc; done links : dummy dummy : grace-5.1.23/fonts/type1/0000755000076500001440000000000012032153126014616 5ustar fnevgenyusersgrace-5.1.23/fonts/type1/n022023l.pfb0000644000076500001440000012656407056046554016427 0ustar fnevgenyusers€m%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Mono L Regular Oblique) readonly def /FamilyName (Nimbus Mono L) readonly def /Weight (Regular) readonly def /ItalicAngle -12.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusMonL-ReguObli def /PaintType 0 def /WMode 0 def /FontBBox {-61 -237 774 811} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020947 def currentdict end currentfile eexec €ߤé ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>j …ÆÐÂU¹¥»/ÞÛM9œlñ”ÿ¬#hƒv|hôï„îikg}çì; s„òæs¡õ’·²`i78Ÿ}ÿÛ!ëq_Õ¸OÈ}º2åL,ìjMk³PU^¯òìO„6\ÌÛ³½? Ÿ…†GÝcw%ÂÊùUß„* ¦ ÊD.øîl¿+…„h¤f¬XƒË½8²ƒ4;9 XÀ,‘}‚\ â»`Ÿ£,(× ÀáJKÔñ%ÿbÿ2M£:VüI˜zÇÓª e@ørsÿé£ÚÏþ+&=¹¨WŠÇÕ2ÂïÁƒvôsû²³.öB±œÞÁÖÞƒd7#ãÆßÈ—§{`‰K¼EÉU·³b²j×£ÐtYϳ?œT¤ 6 ¸ý ,Ž“ÔÛˆ‹2\âFÐ- «õ\æFß´_Ë„„äp6/€ÎLÙØE˜ws'DÌÇõfŸwï n¥Zÿ˜ª>êï¹qs¿7‚æ«r]Nž5²–†‰è|Œò[jæ”Q¤sy¬"½&V”*#>R×sè>¡‡NÓ².rû-q¯Æ˜SɵJ%ss®¿MâÚM¥âʈ”êàã-˜ dȯÝzš` V×6¹F»÷«V‡Ãáæy.@ù*zFmãR)@dSuîóùÃÉë”Pm°,úâ‰ñ¦ä--ÎCszãhVK)ƒ­i‡öpb9[Àü¯(z+ q÷2_¡é©€‰y²þñ–¹‹Š r޹+£Ó;Iã 钂,zÌ¥´äÑ Em}ƒÅ~Ë ÿ!B€$÷W*p1|¸ËÈgš—NØŒh8ÆŒšÉU—xONŒ.aò`#¬ôb2˽óÀ¼ÅX;“_éú ¥bš‰'®s˜°÷ç3ÆV§ÉqmÊ›ˆ ŠqQfòúæÕïò‰©²íÎ4¤òCñµ~íçØÂÚ@e£+É*8²EshîÉÃÁr–Ë žžd-seù¦ïCÇÝa¥ý½íúrcJµ™ëfj]Áx° ½«'’^ó¶",AÜãl³‹sh±³ËHŸížS1USóÅûÎ@EG·êSý=:ºlà­"]®ç4½ú;ñØBÆØV ] $à?v'Åë$×ûê;ØW –V€=¾ní_Ü7œ¥,ý…DÊ|S’¾àd‡ëÜ0ÿ;(è&NÇý]§à€e°©sDÎ(ÚQ‚3Xuéø²4zDã=ú¡g#*\>ièŵ‹|rSx'É6õt‡ühu>°Ô¤f–PÛYß1•½3yõdŒþÓ]©R×Ï-íEëD-¿é’q"ë"‹Ýók}º'-`Ò'¨èA/Bµ[âoðoY‡/äÞªº^«IºPŸmQ|n‰sÝÕq×i¼GOÓx¯C`è±ñªuô‡!¹àºX“á]t¬ ×0ÃïpŒ|PG‡H?N¦)p—´m&€ÿŠ¥ z%UcÈYK‘/UtVJqF6ty>H4¯ÑLy‘çý³¦«øRžOÊçœ`Ót)W“ÛÐA쯂MùÀéoEYZRK'ï‡t¨:î½:q4«D5È DÞÿ\º’ A¹ehX¤ƒK<mMá<y/Îí&§*ÜMž9fˆÝµŽ²¹)Î1üŸP¦”k¬Ÿ>ïSÿÛÊ3”¿8ó™°"9Lu ÔgÖK‰¤NUÞ×ÙÆ¸ºk ˜ñ@ÉÀ ´‚ƒV¢Ö¾žÁÕRK ÀmœoË^( 3›^_ÔÝl 5¤égE Ü­g¬ŒŽPŽ`x×~Ò%óa¼†©‹a ?swÛrà-Ã0õI%´Ýà…X×][Š¢Õj1ÜÍ%~én4FïvðÈ‘lLâaB^ÙÑ[XÎÑ(Ú¦Á0fç±R¼û^oª²Q›Š˜òk)ù3¯ˆj §å† ½¡Üa Ûµd…Æ ¨½­îþ]àÚ[u¨¢ž’Q^†çæk²•坸ËeQØÑ=ö UŽy‡æõa&¡=²É H†ÆUNh ¢ }âM­"»þá·ÃÂÔýjXÞxÖ ¦nýî;—Þé@i©ð¢³’¢ó‘ÄÇS'€;SòRÌžð2?„’›¤qlP8Vÿ[NÕI)‚”ùk|—”Œ?ŠpLà—`S=¼lô±ŠûË­žË.½ÇƒŠ”ç²'’Kíq#”Fu¥ÛÊ8‹qŠö‹ß·øê;\Ù‰ê —YȪÞ@8U]y€Îbˆô~ª7Á }3ñ7vð‡yØ-×Àò5½®[²Q¸¢Ô±Ü—â&MÎ^5û­Þ„÷7êjYÂ=dÙcæ5v’3bOv‚ê4ckY\ÍJ¯óˆ}‘hgGW1¿Ë÷ùm^^¾j«ôTÂõêN޳‚‘`R•Èw“Õ÷sš×ìqvá&A<ÔÑ޽}n¾áK¹JÏ(¶†A‘àssè‘÷ŒL ÒèÙ ŠâaOÂc§bÐô4…G:TÃ&øTwÔ£ V^ÑpxG®ÙÈx+„~fŽV\º§+ ©ŸûWÒo¢oõyÃí «oì]¾¨¨ðɾ†•¾ÁËye}‘Öpn*? é’U¹>»®+M ]ö¾b,•,úB®Û÷®dž!Pþ‡Í¿\&…ï6€¿9ØdW:E®&H­—f+ixp1¹¼CQ¸AUìÜ=‘âG]+ÞjR¬ê .˨¡¼KîÃ5¥Ç)cèK—¾tDX¬Ã×*~S±ðŒ•_3íàÜ>s' ø±E™…sÌDu1TÚ÷ôVÿEø—) ©Kó²Ö^±¡Ö¿‰ÔÌCzÚß?n©Ð]‡kÓªVåî„ÛªM­˜$Þ™„½E¯–ûŠVÀ³Ã£ÆXéÖ‘ ÛVUêÖE$—„ šé tœ[c)qoR§­RÛи¢[™•áAfóÛߤC‡›\L%ª)àÜÀ}è»6×nò†ìˆÕ|t¿DÛËOï÷qÓ½‚Èôâ35|HåïãÛž`ïŽ,EµFQßšZË_÷’›ËÎ^ŸjC‘šÒ‡ÛÈá-Ÿž—åÛªY(yZÓ%Ÿ<âs¨pjd<Á†â?]*5Þi&=Œ„¹@³bçÛB¹PÙ»¢ñ[^YçU˜úä=\ñTerw ºšcsñÍÆ´åë¾ “àå†^3?i ŽI/+òRÊÝ[sçÓëµ>u“Sñï<›‹9Â0Ñ:·Š]’îLE/ößÁˆ(  #ƒ/ÐÜ´‚ÎZöÉR¼?~XöA}iw_ÇÀÕ´ªÆ2…w6¬ó+.àò¢Àó³ÊÔƒÆP[éG2/*(0üZµ’}‘ís7~zaX ,Û'îÉÊPa ’0€E̵¡i¶ Tgx¸Ò€ssg`IE¢*¹á^:]³µ£°¯ßßo4$·SmG?—VÊ6”Þä0±«äq(øÒ´aÀQÁ¹™Û°çÑ:ü»¦÷Õ"mT'ñx¡U>ïv§â‹O݇“¢!~òÿŸ™‚éêp­ ¸b×ÃmWÅÿŸ¾ªµ`@þésïóMƒ`ºiL·cZà<ÁÍ| R*zy £@"£õ† Sm•Q½ý¿V ö:¤æ‡@~^HXNh•‘ñµ&q!>C pŒ£M.QϦ³(¡"|µë&;–wF–ÏÈw/…Ý•‰‡$«ói°‡3¡gó÷<"œWWÔÔoÍ›JþÍ =ʾR·2Κ¶"\š4LKøÙo,PÄ',¹ª `o;&BøÈ€àŽ¢‚,Œõ },Ûd“/á•«Õýóm;á#®Ý‹¢ø*Šb¾>ÖÀýľPÕWJäþÌe.pôp;þË5êÞb”þ>¥y8gºmDôL ; $9Ú“À°æhø’ª‰ô5äMdõH3¾³8g Ø ÙAßK1õ‰[íø3ùÄ<·am¸˜Œç/ÓÁ,}I÷@Ï…´vlÓ˜ëƒv•ÑÞÁn$·GZ]ÞˆûòÖ¹OdÈè6+œÌR؉Á 7ªÌ"bGËຶÞ*—é)+àNBæÓBU”ßV“aáùarjöæ‰c²@æçž[ó  ‘Öº@˜tÏØíÃî+ã1gn1¬ø‘Ñ›·‰ÊOYô‚;*óXHÃR»gØßüÑžï`R30ª,VbÞµ^i¬/†6Ÿ«ÌÒHyTæ© ’i¦]ûß)~½)ÃÝbu_(œB¥4õ–Ph_…vê/ÅÒk™¸ãÜÓñþìsùš©†Ž©ºÀµm®,ôm¦ÌÀ«w¾Ï÷¸™’\º."wœÛõ?õ±Èþ•ád™}” ,7^V,†"˜›\ÜÞ4RÀd'CTÕÛ}ZxÔŠÔ¡¹äuÐŽÜ|QÁóϧô<6†£ÂJ~µ‹A™aVO‡âÎ A¬hÖ‚,z¹ýh…õв¬$œ·õ#SÌK j$V/VO»Ç ?ß„«Æà³ûá2ópȦ\O“‘ ¤»€ÕËpÒáÑi#Žo-b¢ó: Äï ç÷S߀¨­””ˆZšÚæÃŠÉÚo°¦–­:P&0%*×µtÈA}4½ ½e!}—{5õÐN¹3áèO\ f¯HMc&](Q{§Kêˆvý£2¨JêæÍ‚¹Já wŒÓ¢«À„•ï1Ÿ­oø­Ò7ÙøF¥ý¿ªŠÈટ€ñæQšKO=ñ¡}=!t"*_ú‹9ò—ÿl¯% jÛÛõRPpÈÓ‚ ûP"?I=€ô˜bëÌÖïéñk*C]`À¡¤S∥=áíÊ}U¢j.äznÖÃüß5î£ß°m+Ìä4X¦sT¤í¶åÅr3ÞO¾Aíî^Çz]úÜ@2©á·D(ÊÐ*‘>@/€c§tÔýÔKŠlŸš÷Å)Âwé]·`ØÆUßý²ƒóŪ‹µ$v¼y{(’éD«¾–ÔÛ“â€Ï}â>¸RçÊ•Mf‚¦ñ¤¾ˆL*¬†=+§?;Tfƒ—¶ÅMÂô10«AHuóÃØy+÷åüM"øwH¿ ·ãÿ·‰p • ×x°•Ú€ä€SD-\>Þ·¥Û„fÿçç«©Ãd£qiõ…ȃ¨7¦œ;Ù3jf~¤ãÛ_Mö¼jU+èÓï 69ìgåÿq‰Yù$wõª‰NÒÑÍ1.Ø.äÙ\IÉfq²?°ásމ*ßþbì=L¾¶Íœ˜Þ$}÷íߢ•6bñè8mu­0„€SiYøæÏ,i7°Ÿ.7È2}kZ¾FÅ4©UþƒÑ3øÂ£Fgñ:‹¨1Ìõ,z!Á=¹/>wµ\â‘ö ±Ñ”£?×1QÃö½-Š ›Þç–½™m-”Û+é†WçQ½îþŠCîE¹ ÆØ”8‡*`zŒª9‰50£åö½u»Fk%W7É9¯óêY¿ô§Û Â¥³kŠ l^XpÇÉA%‰‡~ôO„(KŠSµ·CÎrÒêücÄÌ.[qÜ•‹ZcPË_a\:Eésb.>;iW-ï0:7^Ö ºÈ¡yú ò!¤xþ®85…ûEÿM_;³ÐöØ¿bé½k«<š}8È¥« åzÍ­ËÐ+Ç•-s®÷Ôö'’+ê–¸ýɸypŽyH‘Ç ¤/,ÍhÃôÛ Qxã¦'Ãçv!ÓÎN¾\Ó‡rúÙ'a¥9kgè5"& ø#r‹˜xWÏê®!ò­^©ØA!)“P€‘¤¢Âh¿¡ÆPö«“™^|£øMµWHÆ&ý ÀÚ3%̰¿ ™bE¿QëHf€+®c¶QkŸx¯7ïSoÏ–\9zñ·ùŠød³óô@·¬÷µ•@E6xýlQ”‰8>/G²eìO\ò-9ECØLÔ(eËë4›1Z…Þ²Ñi•°ÈÁÇ&bê)YÄ–/ð“ª^æò‰³Ì°œïïU¹¤(»64À¡ôêuÃØ€alXÈ%6oFJ޾æÉp)ñ_ABu£›‚‹Œ…BéH5PÂÓ‹°ì7Wq( ž¾‡è'ï“å.÷F‰ü³Iiý}êLçRMžïò´k팲à.ü$d.®¡ÊÁëHAà S.ˆåšÈæÃôG4¹—"édÑÐýø\TìQƒn¿´ŽŸ¼9!C,˜Sɺ8¡“cí Úð/ßN|É€ƒ!Í¡´Rp¿üà×Â~xÕÞ΂Ç.Ó†°-WZdGT~̪Á½ÿ3,’˜GXâB%lFVÍÒÄ]FæzìoƒŸ•×N"*n®覆#§ÈÔä-NÒrZyGCöu—óÛŒÍÞEº«ÂW&¸Qà.V4¾iäÙ*#5ƒìo¡ÞËÚJ¶“ õ^s6ϸ¬-+svu´)ŒKÃpËL"¿ì_ïé«)‚÷±S𤱮VŸR7CF§HÝà“6ÊÑõ3Ã×Ïw YH ±P!à#ãV°áºÆÆGÕ6%ÇÃ8SoM @s:²â)†µ“q|aE‹l“¡`'̈jŒýÀñœ4ɦ¹Z„¶¢ãT¼Á¥\Ü·±ë}ÁjÁé9¤mì×çð8ܬV‡Di¢Ù´\¼9‡'äí=µÛ1–_5yËù4î,Me,œÂ€ €ã¨"+L1ÿìûžàz”ÉsF"T¼>æù­‘RJxq)¦?΋E»æ…X&u Xkk#¸þÃ窬•v”šô"ü,‚kÛx®–^ž, ²ïöa .¸cZÊ·ÅÅ휟ü&ÍTÒýL¹ä)NŒì¡álÈãüQ‹ÑoMc®+CWSSˆ4ÍÙØ®}æ$l戓€13cQ¦WŒ0L.T€£ü´:‹îISÚ¼0U‹wÆç¦ðùÿ¥WÅ@zÆ Ý¡ç6÷ È”Uü)4S=°ªpsLŒ& s0ä! " «™ø§t‰/d­¹êc;u”€Pæg'jU¾°ASÜk½¾ ¹)ŠÇ™©C×*ûv›úˆÓ¾¸j~É8Z®Owƒ]ÿä8ž=šÞѰ‹¼+ÖK=t£&Ì¿8àkÐ&‘‘½½œ0G ·yPþ È-ÿÒÞ×Ièrë~¹Ýõ Õ1˜e ×hFÃNNCiô)ª@ÛKòÍÕ 'U‰˜}€÷Å F¥ÑEZfx©J  Ü¶œ<ëõî&ÖSOo‘—•­jE*ó´Ë.¥M`ú€‘2BüQN":¶¡5–A—#’1°PÎÚçeœñhÚêœiÂÍ7ÒT’Îà–íÖ=Çd;fßÞ[Y]ÅO rÂeF™„ÇŠ\ï›ü<_ˆÏ°ÄœÖÊݺgQwÖ’}uÆ+Uªíž<µ*W|ˆ}X<æ wÉTlîZ¹)c3+ùõÅèk„"Xc‡FªPôÞ…]åg¿*·9DíCÛ×ô»Àáb1€|CÜ´{.¶”æþÜûâa”ÒÙ”:þ2ªSõãAê‘S!b—ѸÅ)Z^uQâÞämÂ4|k2zô0¯;¶v¥;Ê›ÑêˆgƒwÜ š†â«mâž>&ýUsÆoµh{©ÀTM‰Ju˜f°fáÛ\fæ àqÌ:Jä—Íäìr?{€vÞÜ™¯W¥I}nÁÉærçOHö£Ϭòiœ®r4ZQÇi4å¼_D>ÀêÞv¨£0f’,ó†ž<&£³NT ÀޤÚ-Þ>ëÁgÚNñ£§mqÓKxЇƒ‹ò¥£ÛvùÀ—Ò2P§ž¦Ä©I&Ú«ÍÍ&Û ŸÓ?0®í—~‹ZÙ(ó–`v(…”)Ü´ìì}£AãZ…µ5˜V2c7ŒÜÑ;þSzIýž¶ß:¯\AëãW!úh3Âþª<ÿÃG~οžùôÚæ/÷1”Ãñç)™È¤“ìnâ•1kX¥Íbÿ«bÈ–å!¶x4/¼áa<÷öwŒ¿R'º PE×C'q•:ËÕÆXd2óúl ‡ºÓ;ˆ¼lÒœK<ÅJ×*#Wª[®²Ë|Üç-È ÉŒb±jÅ LjvA7›vlÝùÛ²üœÛºu[n=êCÖiœ0©š‹1xæÖª“ ƒ^Qt1Ò¼¡«t\þnR­¸+=S£;ÌIt “}•1ìô815œ\“Ë’m´@±9ã\Âài±Ïm–ïh@2ÛQrBî Ær>V Eü‡¥äNQÈ·ùöiÂJÕÏøO°;¡!¸k”#M,œ”ri¯–ü Šx÷6äàJΤL[ªýã`üغjYrL¨a`¥RÕdF#ÓÛE<!kÜ[m4±?½»ÓT“7K3Wï±1Ê¿åz¡ÒÇG+wk62È sƨF(\ÉS¨òŽõ‡³RîIšµ{<àhÚõ]ŒÁw 0™œ¤ýÅÖ{äçæ”ö3KÆ‚‰§C|Íù¦ íp-YhñàO~OéþÉÑ锈\¶$[¼T&ËŽßV‚Žîu¾IEúÁ’¤ë¢\ªOLfÀÜ#M{Av(ÚRvÀ‚`¾Q+$2%l@f㵃æ#éý'ŒÕò…DÐT¹´öˆ¤rŠòÎíÀŽ 1ÖDèãºN/Ž0“kËœjëTã}´kÖO.Ì!3mdß妶ºG3ØÔÝypn¦…¶Ø§@W ûxã˜K±UÃ\i¼Ì´µuî¡Á´)LµFϰ=Ãønü±—~”§qʰá*‚ñÖÇ‘úx墸œÍ§†"«ç[T®êtz¤òmV2™.3r1¤0|r ÔO:ÖÏþc²ÞÓKÓáQùUxkÜ̲Ä'ó¢Yßv7/ÁwTJlB\«ª«1bŠœù×RW¯ðÕ˜C˜œð×G7Z&ÜžÒ›f¬!GÚh0lHÂHLpÊ’ó< ’òvõêõê0‚¨¡ËÛf3Â÷;i‘P`¬”ŸÍRÃd˜¢«·}ñë3ã¸F§Á»Üï]îÊNð­% êœ'Qá>÷h®‘ϦÁDÛ¬Ã9çn±->éÊš§}'”ðÄ34[[¦2õD+½ÉGŸ£®Ó§Ôe«qX謗ö‹¼6Ž#PEÁŽüÊÞé‡xØ”Ùcù(»ò¹R5wŠr‘N³p~§‚”³£¼JËþ‡Ç*¡Ù‚ä¸"ð{\­ôÓçî=§e;ìo 5* 3%.Ðcrt––Ôaî‹õ#Õ‘¬ŠÇcåûýÒN–u–œTvǥ኿šíŸ#6Õ0;Ó!tí\“>Œ…Ö'.¢R¦÷⪱tà–_sàï‰éºû¼ø±õª Ñ,bru<jþÂ쟕A¸uxtÖòàa«¾‹)(w$c³ÄA„&Åuº¢ÎãÅì)²ýîwÁOß”’ôŠV®€ª3ãp°7Ë(§7?ˆ "¯7&¶jŸÓ³Pt¨eÉ}3R¬ÁV™,Þ&­!É‚ÇÜþ¶“»@ú_,ëòåbìŸeoóèò}ªœuÛ©Fý˜+µŽ ü I¤­ŒÖhI?ËW<„žÅG@I¦“ËëÔךÇQPGÌ4zšupÉaóìûW¹õ:¹ÀÖ°\ŒW <Õ…U¤U$Éð‘¸ø¤"òàéå§·ÿiñÎüä/¢v¼Õ„Qm&k¦ƒ^œ©é…OPÇÙ,®Ö¬¯uŠ|{åœ;ª‚¿2¶‘¬£èë­"ß¾XjTæäÞ,Øk1…F»¥ƒK,nH8TzgæQ–NC˜Œ€6“ˆK»Xœ©çë¼ L ¨ Ùäh(­…–ýÊ9ÿ¦Âz5“7ùs€ž²éãÔ;1FòQfgæÿëšÈÉZ{}MíUî5aÇ ²Öšº–g>9ã9?åô‹«ŠÖàí‰ùlÿ$è µÜ¬I…ÄÐ3ä—Á$A;"'£&M¦‹Ãù5x¢ÐG\ŸC˧ӠÕi{E2­,9K q6áákAyIuè>ò²áÃ?‡ÏrÃ%ÁÀ¹/Ó‰ Íö R£%–v;ßÍʃzÜo&ñ)²<£/œÓ›3æEv— óÀ[ÊKþ/æÅg‹„Ö””ñÛ©þF®jþªòEÀyÇ·VžbgÄ+E”5¡ÑÎÆe³ätÀ¬ÈÝék ‘gÈÌ}™Ä$Y-t\D(uUëG4 /Ƽ![g‚?iú”œµì˜]z¨|šÁù¼È™Ll¼æ{} "¨:]æºÔ¯h„É_Fº%> #7ã‘n<¯²ìVÅBYþsîSä+;Ì¡Ïd/°Å«Õ)µhé­ÿ†[Á$ ׊Ò&íˆKí<([L°ã’ž€\gñ1eÙ …vKpÞjµ«iñ½¥Ãb4˜ÇfÏl%àe¬-Ž¥Ïž-Dâ· }Ü{’ GÄqߊ ‡Ñk[ب0ìS"<ãÉnõnUAg†êXÖ–ì5~ÅW™CŒk¿+ ÕÉî“"wFeN×>¥¹Ê¶¬[Æøœ‡þÊù­½9ä8ô;ÓžàB/”è°–«8È‹Âá CAÁ£]Ó¦Ûä è<ŽÓ£yÍ€Ôù¼0A»D¹3ÚÊ|]D'®”¡v‚Ÿ$µ–‹q41Ë‹Ùõ0€ƒ,kxLê›QV‡ñ!˜>¹ÙÉ΋Ôú;ìH¯æNd;{ØmƒƒÐu!þ] ’¾LÌ‘68$¶†˜Ž|ƒ®¿@m-¨ÙRÐú“'ô­Å_í¿¿§nÊè¡vÅGšáFq%·ë<ž|[;ÀÄp”cFß'Žá÷ãÿtxÃ^àY)Kò\{•™;æ .‰wv•*~Ða:\¬¯§1ÿÆ3ʶ)c†í¬y`&Îë#[ŸzTà°Å(gŠa+¯ä ¨ÂÚŽ¬^ß:5®PsZM* ƒNÆÁ) Xÿ4‚ðàyñdzVo#6ê¤[÷+ψV™ˆÛ_eÔÁå›PóAäZ‰–V µ"„~Õg´œÕ(Oå_†Rͬhò²_jQíÝIA.e ÒÛÈD·^-÷—vÙùzLoxnÿ뇣ûk‘+¶YÜ+ÌmPšŸ½è}è× …Q¶ÌûwC—ŠÙ’ÑM+…Ê.‡2a8Ûl$Y?~ÍoHo…Ñfk⬦ÇDî6"5$fJ'·sùê&à¤Íýp™B¤B˜¸$•ë›w¼ˆ}Àï”}ÝÇË<ükHð`Ûð2¡„æÂ&ÙÔG¥¤XË£%Õ~Lm•&'cç»ö ÊG>·fàèâ>£~г8{žTho>Wv]@gå!¼úå#”"w“Ç7Á’€?/-© µSâªùN¹’«ãXÁ\ĪŠDMõ³çÍ“|ð>¬c4'1´XŸ“èä—§LÞV†õ)éI^×Hu(Œõ2qÛ“¤QO€±yüòU‰p éE(ó®QæhÝmÙèQRtV, ·]ÞÈþŸã°õž€(ˆ§¤ñ›)•J1/gÞ½j¡ÊØV½ÑB~žþ‰•oâP Üj ¸ v*мgX2CñÝ€ t›%~ßH¼ªe?ÖØ¹™[¥ê>é/Í6|`kŠÜíÎg±lYl] “¬_¡]LÆÎ÷§Š’^™õSÖ­%Á»ªÒJ¶bÖ90©v1š9ÎäMÉED«G€BT@øÄ™¸`µÓâh—AE~ØC±q»ª„à„§Øà{™y&uÕÎe4ÜmÛ`Ýéj6tötbïx_ÿtûX‚°yÞãé(ñlá§ u.¢_¯P­÷›¾}ëÒù¿lÛ¶ðxÊùy†D&€¨üA!†oœèl8]ãN0عvŠ6Ùî÷šK8î™Ë¹¤Ó#VLV™n%•u>§ïhH4ý 8»#2°&°F1jS' –Ú².™N‘&/°=ÿºÖ#ñh’(@˜„ùº00‡ {ë,~âÞÅu±73·’AøÒ:”KÕMÔ¼›C-ÐÇØ9ômhoúÓš¯½l7âHÎHò>FMSy´®ÐÕ ZAW~nËu'šÓê}À«'±‹QÜüiñ]rTnlQŸ4%­_ˆý-«éð—ùÖ v³ Œ×w±ì½?ÚºYrê¦<‡é¬z+?þ×Ô1ÎÅ{ŠX‘‚üe¤pFa©ãQüËÇ1Z‡æ/eÒNëœî—œnÛÏ\*Û’nÈÌ›ÿãö¸£¬ Ñcê)8sü™è꣛Ç]Û:9ÐØð¼8ôÖt¹¾éö÷¾Mœ‹Ù~ÿ3 ·f¡ÿÒ[;ážJ Ì…’nÕ1Œ–ZÒðåo”3±$|m[ríóÔ£àgJP›ó è¥æi×+—‡”h<¨¸^4iêË|0÷fmµà¸éžÏ¼¹dk)ä¤ÎVTÊ„ ­ÖEßÅB%½¸H^9̘ËÃóЧ—åß ”R¢AŒf6½-_k$4ZϦ_N}½-  ÁwjI ´FlP›µ¼}f'”lMË8¢p˜·µ¾í³ºù'qã†DYwe 7b³P»SiÜÌ9Tnd8ýƒ“ݳc DsðmŸ¹ä"ä5Vl9kýÍVßê#!qÍŽò˜xh雄Yœ&ÔÇØÃ»FeÍÐrâ17*¨²&‹?ìˆx¶B ¨)¼ù•Ü àgîkŽDÒ†Qº:íÑv?,ûŽÄnž)ÞSCW– ÅTk¸¶Î¡Â·ŸºDùx=V¡lUå‰ÜØïkÆb2ôzG9s£V y¸2X·6\–‘ÝþG±n번(¹Fû]oáÌjüN¡÷bé 3 @3‚ä*ôˆ[:¤µäßÉ¥N Oû÷Ân±zO´»“#D4ÿðUIçX{ 7:Ë>1A‹úôØ“ÆFk”'=50j¹ª±>1Ú5AÁs>*~M¥¸'gÓ0„ªz|HŒÜ§«ïwÑžB´DŠ»ÓFé¼(мE@À¡ÏпFżtT²^'éj>l¿g‹þÊѱ›NB9Š! Õgì5û]\ ðîì哘 V°áÑL)/p³àI˜OˆÈ´w•jÓ J¢"VÚ¬ Ähµ¹ù"¼ÅòJwÿ5.,b9A¬¢U iÄ›‡Ñîo/— ðñ¥jÄB?Âäì€9¬œ!-†OAŒ»’”½X‚(¬уppQ#Áðü?¯æáRœ+ÐÝèh©ëå}ýü\£Ð€¿â{€ªÖ¶õÅÀñ±îÓÅR‘œš.— J'ù{f`~Ï´{©^òµ|);/jcœ ÙÏÍSW".[ßÇ<ùLùµËêðsé¿%>0à›P4W¿$Ztn£ÿаÃLðˆ½¼›§Ô ¤ŽShkY‹í³D™$ë¥]±±°âº(WXÉžþ8­Î÷±‚ûÐÐb*n¤—¤çÀ })š'eïØÞ7l!M¢EÀJwì„¡Qÿ“=aÇŠ·ˆiãnRnØU«Cö(œ"&¸ï¿x+7JÁ倶éc@=m QÛ…Xòæ ”vÆÞ]HaX\õΕ2ò 2–Ÿ9/¿ÒB¬Ô~ SÔgÐþFV¹Rl…#H°Cw7Ë)ìùµJ^R6Ý 4œ4–ó«¥iê ãCö×q! 9Ü“-Æ^ÎùEuÆçiÍöÈÈ6œuz%wÚSQ‡ýRf™‘|þ Ô8§Xr{0kÇ—•Gæ‹”è~Ø aKÛÆIÔiïkNN=Òêë_€²/åvÎÒVITgÇjuõ‰Faà?:Q!¥«ãâÅH³ÝÉö$Éx‰ª÷û„±XÀí¥gFÆ5'°Â½eO+ˆ¦C1m©W+ã˜à©’B³îùQ#ª¿Ã¬‚·´ö‘!šУíÕÀNc¬½çB5"S%aô·p(A\47ãF¾rŠAU–«tÁÕ›Ø2Ž9¨P˘[4µµ-ÑÑTùìI³®¿Ërv.M*ÏxYß¿&%Ãcí„›)Œm"käæê*¶j(}+©*lœa*_„›<³Â_Kâ†öäõçäÉë¼hª^ð dijWBáٽѣv’RN0ä´Ãß„HÎÆásæ]éÙ™óú»?Ovk¸lÉ…”m â‡vs†Í„aa[W Ú_^ú#ÑŽƒÃ%îDNÁf¡£-˜¦Z -DlÓý›’E ŠI»5)ݬ}•¯èêó7wû²eþ¸¤¹¯òÎÎÿôšûÜöÄt—Ó´H†mpï(Øä±~|é_CöK´ŒJs넲fPö->Q™ÖM°µ¸weиPý]ÈHЖäÇæÆ;*>ÏÀ™Íq>Éew¨oUÓHa|zI‰ †êâWµíR±(ɱžá)åþd˜Ì—kÞ–|Μ¯udnZ[2¿êÙ6*R"=tiC¢ÐœSlú÷Ž`ÂÒð·c­r.:zçeùò½írxQ õêA¦ŸŒ*-r ;$´¾aÈ?ûïúâ`¦ýDå>BàÑ“ô!¨§ág»eð×ñÝ‟£Íý“Ìi±È28ÁÀÁØç«°.Þ—<ŠX`72¾9±Ã—¶“‡oëCŒ(ŽòãÜÑ‚¥Ï»©”©Jø1,Ø#BüÍ|$ ¬¨…áž]}cÜ/SKª%êj_5d†åú ãÆ˜ Ÿ^Ž™ç®[•¬B—u—EOÉQä1šä±Ýɰ} ˜7, •«¦˜ZM¾mÆ3Oª0¬æ‰ÓjòœíÅŠf’¨³°¥t.lì/i²U¼í§bÞç/^º˜‰ÿMˆªÁAˆ¡BIyÉžD‰ ”î ML­ÜzÅöy«ˆIÌ@¥y«ØïãªNâ÷£Â€l±ñy@¾s˜I‚ÑÀT3©½eŽ£ÈÚš¸tu»V\”¶óþ?wRí›–Ì*{¸Ï¿$‡ º8ÒÌ÷†ž“cÜ ÙO¬®Õ’+2Möþƒç³Oâš¼­b´ŸûËÛµZÂt>:ƒ†o­«oðq¼;€#ù¶ÿHÛ ±ÉÆt‡ÃRÔ •á‰,‹f­lœböøµ±± ¨rZ´[D7µ¨Š–¯1xØVÖnb†ŠƒÚdäýÞ½ÖYêe 2Ï/ˆ³ýlyÈøšÆÐðίÙZÑFæ® 9ç Åäÿ¦Ö©q'ÊZÏçÑùF¨×¶v!ÖSAó,¦ï°:å¬Ss£‚ÀD¢vö´= ª® äÃÌqì&7"\ËûÔ^«’¿95|W[At(5…±+’d8¬r¯­ªÒÐú,ÊrŒŽ†½?ç]G¸¾¹j±;T€÷£Õtµ>@Âòí}’!Ù‡|}Œìó”ä?ÏŒNý³‹ƒ”™ÿ\ÙjF«OÛFó];H¹WÀ“(“Ï'9é6â‰ûG:×öñ­+Ñì6I†¤ÌT} ¡ûÁ §¶8¦uHUtEaÛ4]ÚhAQFªÆ2ߣGi¶í}}F”é,¿ôï±kUIY.…è'üb<ñ»æ¡<¿dèxᢡY”‹U)·^D¥ðå ñŒ ñÎ3øÉYÔÉŒíZI*æõm¥{I]¬±0f ÎûOØ0–Z¾+éh˜Á·£œ»ãç] ÿïlÔ\çm£¾‘UFþŠS ପš·<~S;KÇrFWªd›“ˆ·‘ªÅê¿ÍÝê,ÆzЮ›ã}ù­@ce8îU¨?`éà&ÆO½‹" ëFætJRά¢RèTHøMŽ ƒÇ“­ ¹ >è;sþü3eÇ)ãÇ8‰KŒÂø®àÌ‹Nuï´LÄÆÎõÈuKÇέ‹ñt·[ÊNˆ¾•ž2!jÓ?gOI« £TÏ9iña•Ó“Nˆ1®|§ëãÅ$Ot>f¨.ÑlÀŸ”êzYkŘƒ3«O}¿*¼åCä¶IÑoHaYh=ö?ˆ›!ëú·~Œlüyø›¥õð¿|<ÎÇ¿;|1•Ϻiã ñ ö‘cÉÚ{«ÀšX§ú‘½G›¿vû€hc ÂÒ’m5†žÂÏ<ðMOÆÚïîíÿU“æ4’ð)â®KJ,P•Nú'’ó+I4§hø’E¡âð4â¹ó˜3ñ³1¡š8kªÏ쌒›¦¶|Ø’+¼Àì9vW][Ðq|kñ#ê6Øý7úw¦ñõª„Ô­%²Áw¦âù·O;X)úïÔ÷ œéxZ¦ýæ†rUJo)Ø¿þŽÙ Xi¬9šŠÓ¢h™+ƒ(tݶ)XQ³2\ÙíýIèê‰YÛ“}«ƒÇwò¤&¹g¯XˆÃ:65·dzÖºD",•Ž¥a”_x~ô w‰²B­}ÂïY,¿A<_ÈžÃÉëîKÆ7 ®3¶^ã ì¾a „~ÅV¢yȱÃä`‚-30­ýr½iõL¨HÂ*2ló°›I 5®å‘yá`NÎu»è§®Š÷êœ72-(íôÈ“ýê`~pá¶öaIG2aêïâ›àU}*’ÏÁP^‹CKÃhÎ̪¼tø¦>sû¼ë?@RF*©ŠSñˆÉêã9úºt¯ÖÖG(,Ùÿrd½Qx<µ¦Å¥÷†qõàG mrRúF_J#ÇÏ™ Lîñ;ßÃ[ta¦SÓ¬&ÜP¥•l‘•¤õ"cˆà•=Ý¯Š˜ð;ß `,»ª «žÌßrU–*3.Ô8bä˜ý¤ˆ\dÿ_›H ¤‡ÅŽx”=ö&æâÆžìˆ6ßÏ©ëõ‰8¨xóç’轌]mõW¥Ø Û®©ÆK¥¯Ž!¾f€ü]²$"" wn› ¿Ò·!/‹ñ쌌w²#À^µåñÏ«ÒÐ7ôº•â̓ôQvcðž0ˆƒõÚR(ø0EÿA!M"s²þ ÕàU{¡˜Ã]~÷–TDW`Ë¡Óð^¤¹Xå?ß#½±PÕ§\G9Psؘ 5ãö}³%žNç:‡ÏÙo„â!yes•6JQæ5üUGŒœ¿šê·ØÂ_!Ïä·õ˜TâIhƒ; ÖM3*fmú*?×¢k«}£‚{Þ €‡ñ„Ób+b=~ ¼2¤öê.m¤P©êÓmSýìƒáþó/O®Å°hm† Ó†gñŠLFGõ—„„Ùã 7¾ ®„À…F¿’œfž“fY &'¬˜7º§WWõ°¨.ŠéÏ!“8¿ÉGDâýãøqB¬aR†ä¬çòit: Tc¯S}”#̨YØÉ›|np¾á¶˜X›éáÈéX*Nõꔵö( É ¼*bÅ6àl¸¾u&§‰™mt­˜€£8¦þ’(lÍÉË@~³¹]œŸJÿ8³p‡¬X,{d§ÃÒ +Ýb鮳Ê…ÄÏ2?Ú1‹‘÷Ü &f0÷DNÐhµ\F—U#f¨,.t<ì5=QÜõ@;;tÓy¸.¶œC€í@#ž¨k.\†‘âg̵p^;|zñ”`Tµú_ÅOкCfn{«ÒÉ…Ÿ9>ÔŸq#íûdŠ=aRòÁ~CŒ c‰h¬´û?wöO5Šàc‚ Ó?È\@äÙ~Ñì-¡Âáê%‹ñ¯gZ™_`¿£r"¹Â³%À+¸S}+'ÝC¡)ÇèÿBu{:É´Gp=8!ÚR ‹;³èÇ)[wkDí(øc¸áø ÑÚîŠ%Ð& ÀMÓ!ˆ .Ìy(-×±w*œ»Êpi ®‹ÇyŽnÇ7Q‰¶ÏΊ‡XInY¸Zûz3ÊK[@X`<ñúy¥hV´=SŽžÎ}™¯§;Wã6OU6DÞí´b4ï¬kn~Ìc”/ z׬ð¤\©RcÞ”9¨€ÖµÅ!M) T×þ›.b~ôž›YüLJEèxä[FÀ¦H•]>¨É5=”ù.ÉcölóÏ:Rk§ß<ÔÊiï«·8ž3qh’¤‡+ÒÁàˆšB×ÿ´šØN¹Åtæ°'¼uào_”½7x¾˜^† 'ä@ˆÃË*ëÄ Üã¨ôz•HH^al@šÄÝAä¶¢)Б²SëhðnCQŪnÊMnHÖª hÚïÊ7v¿¨µ!Q‚C-Vƒ)Mg§ÁývÅ"3|¤ICìr€^“_^zåÁƒdá³gAéd|MÁöŠXìD Y ýÏS/`7€÷„ ~õÂMcâ`@ÍßøßÖ]‡¹Cõ Þ„ rï3ýйˆœ‚ùOa æ„" óžÇ²2ËøħDó1YC.‚pÇÊw䀤Лj‡aXŠ1ãùŠw»Ö*:#Ñ@Ó”s¿|»¢3ó{ž¶@UŠ#è‚NŽb1VŠ›vô‰q˜§ ù1?JÄ'ØÃ§*¿ð+ýWÓ /µÃ›…¯T Ú Ü'¨[1iN{aùÙ´vW"Ù-v‚FU ‡r“óÿnÙ¤˜Ö¦">a‰ I¬û`&XgΔdùÃ,YéOvAÇ?´ún²7øí”W™W' oÖ@½•Cæƒò7,Í{`ªÒià:rÅÍ·2±(A¦ÝÒ¼Ÿ}9ôŽ&=Ô®ŽLᦆó  ,¿H—†1Í$5fâ.hø×9q4£S£t^O¬´Ö¥ý„Ôóus÷ù# S’gÔx k %{÷­”È?A ,}Ò£æä±NÚ/Û³k:>D•ö&°î¡FÒ*Ã4WôOAgYgm*fì+rm/@«ò%3ŸôÔç¦.R3Ýò çÈl ÍÕaóÞÐ5/ÆlowA¥B_Jœ×x¾V¹I,ÙQÁ a‰¢ÏÒærYe¡=ésvZMšZKàaZø¿j^¯øDh¸I•M¾®ÝWÄ5x‹3À!µ ±„Pj ïtc0¼˜éÈšª/€C¾¶¦‚š‹Œö{/=zôØ»à†%LÞSv^2&º/•®€cdŸŸ”½•A¯Š‡0s5fcˆ┄¤ÿ¼F±€±bÂ;À´ÀÝLůã@$1²ÈÚ†ÃKÉܤâÕ††ˆ§x|Ñ »šÊ·iÞ‰‘<ØúµÈEê*¡NT·¨ÎGO!>Ï-âèˆ =îÉ7Rh·–íuúž.Üžn„Vœ»Ž9ªí¿Tf0tUSÖOùROìjrdøŒë~Ã5Ž’;9$t㤈eVD1f)ˆþ§hÎUZ°ÚH½Rj„°Ë´X@fÁd #Ùxiï Mpá!¦ãÈ2'IX®×¢³ `(ò!Z¤N†ØRýÆ}¥Ìºyî¨cºÉíÂS[f«TìMD9Þ¸ÑûÁt?öÉ*†Y稒Õå8rêQïQ>‡Âš'éǹÏ7D…Ò÷:å…PM›Ì¾¿.9Í;“Ü£úÃíÝ‚0Wfà Œò–utlZw¿ãÍuÒ\ñ“Þšð*ø÷¦èøKT€XÍÓÆ™ŽÑ4cúÞs‘&Ø=<âÇ •S‚ƒ.2Á ËÌ£X5˜[š“øã° ‹æé$(x|GÓ€Šw¸ñ×nkö¡øÛQ€à8 Ð680{׿\í¿dN‘ȬSy’‹d€öã½îG,º˜S á±¥ò>¯2½V…æCn«9]¤wǦ׈#w³üAi6ƒWØ€Î|‡^•fÛ}›5Ñîf¾GnØLÀ"0'h)ÂÀ ˜ðQP.‚РŝØÃß)=¡PŠÄÒXf¾îk½Z#œ-ÍÔðhƒ“côvÝ͆ÌþÂÎ<2CáHËæ¸Q:|禑 f© p‰åÌÔ6‹ïÿ+ÏŽ‘‹þ š²©Ê{¹ óÀ°`úö^‰åI1X—ÈFD–Ìmê~:ô?úL2`gX,¢U±Ò虚:À@+½‚L;µ$[‚¤Ru€{Âó e^¢ùh²—ùŒ6‘’Ȭ¢kë§ÜEûÑ0^.úM¾Su(ˆî-oÈÀ§Uç)4´µmÓ½¯qq¤£ÇvWg5$’¿©§u…u ·ó‡Th;péâ“Ëײ;¦+×9z»„×í².öÃõ‹>êöVãat~Ð@ 2SÑÏ?[^…ø?ÿ0«'xÊä7f|eÈý@Mk’©ž§jù®6cP¶k8G mʃ.¨ÜJný¶tµ¢eR§ÇÕL'™ÇÔà<$öa©mã© wJiˆ4vV4Lû `e«"Gk°Ÿ¶™(À_'d¯d<þðQm‡ýæÛù;®()±vËP{¹˜5à­^UÂøyŒ“ú5ë?ïÏ£=!°0T†Ò{”HÖŽ+ZeÇB½)™Ú Ã®ÖDG¹Ìg÷¯3¶:úò_<÷ï†eèùR(Œ¤¶‘Óièñ“\ÚD¡€¦vu`Âí?/Ì8¶½y‘Ô |Vmi Š%¾!*€‡ÑŒÎÿ$f#æSv1ò’'ÖGT² øNTw™æ‘ÊG7€ÝÕjæ Í•=Q3Ñ5ãÕ#pxþë·7Tîc<þ#Šêcù™ž2…lv‡ ìNYÒ¡ŒSIb~3jµã[!‚(`:KRŸ^èIÕq¸8}ÎŽŸéO­ï‹¨;Ý$_Œ'Á.Ѩ«-m`&„,îtNçªÆ¶ú̪9Ûõ³±Ôs9óúV&q©Ï}Þiþùñ›>ŠFMÓP£­m$sµ*J‡hùvr>nGÀ`EÄe‘¾òl@x›s31¨@Õš¾Ó˜hø ìª!Ä ½ Ã&цÿùë7hÜ2¬xù’€Ð{_òãTþÕEŸ¥ú=Cÿ!à'`/Û%"ðI»T_ôÚ`$0øN4ƒs/1HÞÐ8¯º&Õ´ŸÀ-é€ ‰N’9ÈŽàíä1ø6—Ë ã´—G4såqGÉ¡©&s $”þ¢a^÷+Û “3‡¨’7wî¿bÒlÕƒîd;ã#‚yÀÜ–dÓjãÍöF¹]íÇ×ý(éPxñ-ü d³'·CÅH £QzZ~Ùcíukzç~$Fºp,Ôân-ÍÁ¨¶—‹[^éð1ò Ç-JëÅveˆ|ŒydŸ¾”$ý±MvîøÆ÷£ á®Ë“ÒáKÞGô¡Ð^Õ±2ª9‘’ÒL“—jηïYzu#§;,ÇaxT“Ðîܵ¯é_<kACŠ…Éb°pÞ+ЖËc¸GÈu9ˆ £Óü\4^ ’×¾wÆÏô”†ýÚxLÅVR+×uœN¤$ZA¼ó‡[ãÚâÚþúé Í+ll v/ˆÀÅÀPS\IÛC`üá]:Ž0íZtúùÇ{Š«Ýo½Z¯%]² ×ò¹")kVû^,É\¼_z`D‹€D­Îs¬ý‰awñ÷­/e4Ü:×U«+¨q&Ö<¢éÄAß e½Ýkä”åkPW¥aÑãÓŽ’ËsÁFZö¹À÷"Y¼¤HGÑcžN/sdµeH¿ÐëF1k$IŸjGm6Ö·ÀÁlòé¡$j;[!çÈúÆâ;‚ã:wƒäó@éniÉDN}z’†6ÏІG]ñࢄd8{²U¹øD™´Z®ÜÈKÅÕ«6t`»¶QíçµßȤcÚ´ypm(\Oc™zÈÎó\­Qûåõ»?¦Ú,:¿+>’U4—(ÖÚ YÁïdDS—Bîš#¥r Ï“wôøMêBZ0ûc-J-Ñ»ü:„üI›1V¶u¹Ê<ʽ‡ý²I|gúpë¤:ݶϖ0èö«Ÿ„áÝm³1K4·÷ª;¾Õ½Ç^Êߨêáž³‡¡üXo0ÛiY&vKT ‰ñØT°ÿ†RŠÙR<¯V7)IŒ¯²ôÕ &pÈ4é0?4ˆ$¤›ù;„ý<ñ žï}I”È0$6ÀyD—Fõ¸º+¬¼ÀŠø¡_JMóïûr'Ê—ü!ÒÐ5l“9 tœ¾—P¸!ñ§¼úâȼmš'øDØ­ƒ y«ðêØìÔêr„mþíWó<ÎL¾É˜¶)LI3¾³u¹¥= ù&þn‰ç"Ç,²Ý¿±kïzOPßx3XLj½})I3;")¿t¢(†Š³¥Ãè|xÃð–!™H ¼­¾õ;ÝäXIÚ…zOØ[–h/Þ¸S„’îJúøLQ Ÿ]W'g=ˆPp0?ÛG܉‡N:ž|‰AßÝ­TœsuÔ®ÜÎ.RÁ>Q0´ o|ZúñùîƒÚˆ× G2iÊ( jÞ…0 “ؤö´û]õ'G áÆ>Îòïª9jf€¦tj 8-•)µŽ|愳šÀp†¼´|"0ßC¾Ù¹*aÉ‚jïž¡E-‘0\ðTÔ¼ ­ÉÆü¿©?­Rè¡•hIuWÀ‡>½ÏaÌÝ"5JOV!«3±2\™ ›h…ƒ1îxuÊÈUù…c±Nùá êñ•¯ÿ”rŠé5E48Ú³Q#Ðâi”uˆMÚüs¥Ì’54(ØYeõº†òaÏü±â›BŸ—ipÔ-æ¯lKy+C„*ï$Hâ*XÓªwCÇ$êÐhþÑJÁò*O äx{ÈsŽï$wWe€NÓçH×.‰ÉKo1 çHúê1î$hYÊ÷¡ê̵²FÈ~«w*ÅÓxe‘ÝÂÆhxãvl² ÄŸc'C§úì¾¾žZ<µ}­ò¿õï/Î#¥b˜£ ./êï½iùÛ™&pf“Ëúöö ‹µçÐ¥ 3’¹ƒó£¨FÍJô1éðüÓ¥±c‡U-UÚêh=6%tª ç¿Ší{«M|žlqÁ”k×<BáéTaQ¸S¿®1næ§Þä˜÷qè ÙCYiÁdr^ô àƒóìnÂ{ŽÓþ2ê^jÃlK¹¬^Ñ¡x3—ñ¹)“E®±òQüę}Èb´F=U#¹²\[i÷ ¶²œüñì«‚'ë>Ñø‚é àqM@>Ä;{TIF¶£Ýn¶Aï¿ï Eèsç9€%±ËpeDSoŒI©hÀÕ˜à˜êÜ–¢ø¶ýniGd/“â$% kY*Õ 1{iÀù@G8jEåëÉPOåTQ ²ßšAÔºØ_ÈL‗ƒOÎôœŒ í,êȉñX˨Àpx€Lÿ7̈ ª(}ƒ‚ƒúAÿ<òò,²DÁqä] l"ÑšRNx ìׯcBw‚è^F=Ë37‰ô–4ŒÿˆZšBP‹CœqƾQ©3‹â’QªyNÜgÞìc7úcÊ›ÁÉ÷^s:J‘†Fç¼—’Hlµ¤¼ÅøOº½þ3Œ7’%J>ê=ˆ<,G¹bYÜÌ‹ÓÜ©ÌÈ2ÀœEbBkþ0)¥bÃîÌÜÔ\òeíœ=傈N¹‹:÷4±³'jÄC8N¾s=Î9ÿÌ•ƒ9GCDù…Pá8ùlEd´”åHGÈS½Ò7âsõ^B£¾Ñ­¡RW+{FZX¿çÛ&6\ñmq¿ b¹üðKøÐ…švôn{Wòu~Üã2Ó!;Š0¬,ç×y~ïo0I°€]ú|£m2¢ ˜˜XIzfÎrI“Ýy3 Õ\ ZZµßvKåÀAú„&=`NS {kIbEÛ¾éjcñ—™æW1(h“fþ‹ ­¤‹P[†­ã`"ºÔ'O%B¶5öÇ”KïütÞñÖYŒ´ï.­çëí·ÙºýÏ&5S1PZ8m×9Ÿ¹™S]`aê¼aÝvï>´WDo)лnÂü «¬ ²z<<'¼'§c6Р¦ÔVÚgM•šJþBŽ"¥¿È9ìÕnuö—†Ú €„ØfdMÙ‹`hp­à›Ù¿=ÖÕР:âmÏRTžEŸá³¨wk,„hÁL¨±¹§¯)VPz;pZ×Z î§þ’s5<ìÐ{¸V4eìì ëBô?ãfNµó$U9²P‹Í^ÕvØNÓýc}Woy'#D¯°%Z‘ÿÆ”ŽN5ˆgéüv©¯úÊëÿဌ2¢»°Ûï?EÿÇ?"(ñ.˜G‹'9}EgížqòéîËÃþa÷I?ßYFh©å/“ܤ»Ò-î£9æí£Öëîß•áÊIÈ9,YÚgdˆ.ãf?b¥Zå ~‘´þ­þ P¬Ì]uñ¥ðÅ6¥ñIßÐâG~@*°ÏŸgÕ¤Bbœ…“í]%§.Û—F°/+YÌœÜ´ÉØ´QœŒa~V›C/ ö‰rª‡œ§ÞFáÙ^# ORÏeT6]ô£ä ž/Óy´}£#= ïûέ‹ª8ˆOjiþ\7>8®Ð$€ò¾|ͯ…‘m' IwŸç9Ä}4„TÏò.³þÌF•x˜µd4d„TEÂ\ }h\°B¯]X‚Ct¬éƆx›Ê–¬`.´1{ÖR)>æ(•udaì†¢Ä Bèð:†A õŽUCe é‘PF-µîð æÕ[ ×ì[®¢NÓé }j‰v"¹j‘:íÝ;h%M‰ì÷gÎŽ'ùfBj‹O±´S„ý Ö>(„·ŠdoDÈ~î"ÈYk€…GŸuö==—¢œƒý }¿Óíðÿë}Ø *2’߿֭ñ³>…°0ž>ÀXüÙ"±2_îqïòÛ¼.hÛRÕà$ÀGÏe{¶—4dšJ¶< ôrÃïÍ‚Ý<¦è ¶;Ïè ÆÅÆ;vþhÀ²††{áBOÃI7‹o2=–XoÂ1]”ž}€*C øÒðΙò¢7l)SïÄCUäÑ/B,ž%Äß8Þ£4ÛÈ›TÆwi×qΉhûv²}c΢IgƒL$ÔÌm¨„ÙSÚ?›:ø“‹Æ¿& q•l ~jU ê/]€åË똬v vîu´pÜ ª;£ö<(vë(õ;´ÖVQz¡±ú1@<Ê>,¤ì̓‡MœüмLÀùšúV„‹ò"4 ÅVÁK4‚H-Î] nñ«R*¡+ÝÓ9~2~Á'HüHB›— .$áÞ | ',k§;7Ó 0ÅÞZGÙiUË]í:Ù)¨´-(9Xõ‘ “ayíÛ'‰Cßá|qmeùe‰v“Ió¶j·¸ÀÌÅžöˆt^ǘe§oœ-F`ÌûM_A+£7*'Ë^e÷YW\ñJX™¨Óð9¬ÛØ93—BŠÀÕq|Ry…5HÈ…›é‘Ol¹Ætñé©d†WµN^RulO˜-÷NsöäÔÇ$ ûtbþÉäWÀAJ–äuƾ,Cp–ü ÉBé•©­§‰«c{d‡Ó-ûhæ.‘ÂÎ~h1ìøÈ$ˆ_§a‰Íû3Z¡´ Åžã7ßN_Ì’ _ÀÖ Üò ­côÿ^å¢ó¯2+§x!)å¥ãí—¼<ÝÝEnsœ§‚í¿KR6ŽœsK x°¸ãø²Ýx(b·C‡±ïx(Ì={˜üõ˜¸ïÞM›ÅDHHÉ€)ÈTó®FFÝ­ŒæzR<£–Ë€óÈØìˆ0S/·ùbO|®Œmøu33Þ²Šªªô†«Œ“%SÎi{ˆ^qìŽ@ǃ\ÕÕš,i]¹åÿ›w¡[ ¦7ÿ%°[“žEϾIQé4B³.\-áMvßÕ„PˆÞd[u*aØ/±uZ kh;ÅŸó.ºÿ÷쨵@ð“~ïóƒ®WF,{ó±þ$Òºþ„QRpàcÎ<€ßI5ä ö.´õJñjmC)—+›ßûFhŽÔ™(B’&ÊÙö|cmuË·°ŠV1•kâœÉï¨×\žIÈÂÅO@. {û¤ PÊâÒÆóêX3ŸcüL•xvóì,€läLøâŸv`lÕƒonZ.B<ב¾Í?/%e}þÙ6oÄ­ù h\ÎJV˜åþ×T+‘?¼²ˆÝô=²±íŒË€½É 2]øßT|HQÊ`oMdwA&„[Ey7xx'¨ž7Í k±‘fšÈK†êá2Ñwóü8I€ó¦ä9°H£ kœï óò×2ªq½iÖÐøÉÑFÙÚgtuY¨³„?a´B~xGjØðøŠk €`ÿ}Ö†P?—-lBýlœ:Ã×.7Qò.D¥rîÈîDɪzú¼Óìë˜ý@höäÞÐæÎÅ#É M¨ÖJ&ù¼% 0$’J².r"—ˆ‹…¹Á/ý*tL½?›%ÁËéˆÙËNwÙ .ý\*RƒU£_|Jð9ÇÑ×V0Yg¸GÔ¬»&=I’Àâ¢b¹þâÑõ+å±^g¼R"sDî‘,Œ·>_GÎÕOÒbww»wªÏ>æ²'û/©+î‡â,Ò€.w2&HÚ Æ$êˆT0_tnSošŽa Jv$„&ÛcÉ1šˆ£úDœ?¸¬”ÆÝÖûëSJñ_tönøÑN÷}Š](L‚ÝZ`SΪ`kù%™#‚^ôïú¨Øxe*L¯.ä>ÒkóYhl‡o†Á®•nRvÍÓÄ)½LÃùeM,vÝAG÷FúŸ£y±mùkþ86Ô?Ì Ž• '7I¬¤¬1>P×-òVk‹)úœœ ÐH‡Cr*vd6wgƒ¹9ÿ €Z‹X!MOO{œ<Ît†®¢¼È•ìÞ€•½åy1Š“ò0ðV¤!·3ÄY4«»4¤¤¶¾ú¡ÝÒ¤šlDCƒ3ÍÔŒ…ÍiŠÚóý†vsžD@ ˜µu¾5vùlúTÔK¤uU¸Ñ#t¸m_¥ô¾/õ˜™›H²úó!.ÕK.7ZtÏhѰåÍ'›¼‹ºïiJ‰¦Ä?Q»N„ªß4én›?Ì«L¾¢t?Ù­÷¯28wq„Zù™e¦M£5ï¤6¾6>3§CÁÀ&s òfÝDú™Œš—丫•.ìþ*Àœ‚Ùô—SqÌÂ}£xì„1“1MŠzp|!ü•T~å¶Ñ·Èí…¾½?K› jxå÷߈É1ãó–—9tENY4 ¥¿êÞKdc&ÆÖ£Y;‚ˆâ}°kò¨~ï&Š¡±5¬ µ,þS¼ÈŒìVW½GöÈá¦$‘ahOÙJÂyõzO›½ Tj‡áG¶*È`‘i¢›Š¢:ªÐdæ¿,èðÅL ~@3X%¶,júØ ×­)òÎÊØ+Þ8—SvŒ}:¹xí³ÄZŒkw%ê…–¨íP¸5_¸Rû‰fGáb#±æR:eû¨Ñþ%Os q‡h«Ÿ÷qJŒ6; ݧ<ÓøùÀÍ; €ló·»ú·>FúÊÒHë©zæŽÉM=yªì g…Žÿ©×·ù—«ÒÎZª‡åIž…€ÄhÆ>êS»Gå^Ì[¢§£ÅG-ð4°"ôUÆÿ—X:)â¨qc{ ƒÖ–µ†éCغ¤Q¥íÍ嫚XUÚÈßÛå‚«ÙEæ™­ÄE)ˆ©…ž9É÷”ÅÄæ)—[z ÙІºZÖcw4VbÚ}¤ØþøGî]Wã¬T¹( •|ÁÉDçÿeä¦AÍ&ÆÀñ6§YPvKiÊPž<5Ek"È|UèÜĬÓáPÙ63?ód™­k¶@=àñ)0Ë.º2K§+X j¸ó{ ë] ‡œŽ¨¢ëpè\•CEdº=ÿH‰rX~ÿt±O³+Š„¸üBëì¦]%èÃ,ÊYbƒ+ô]ý¤èqPŠì1„• m¾‰œê)ä„Ãn3×kubUSݲL²¦JG½º?ܱõ¹oŽì¶ X4«pt˜r ûnÀ4EÌ5µy‡–ÆÇŒ¾0A¾Üi¶ûBÎÅÈh;UŠþ0$ï÷¡-ïY§.mñ3« ŠŽë%ÙRœÐ­Nô{oñeB6G=û“õ—3^&ÇyoReÉOà{;OMÔ4ú Á‰ßÍÿpÂñÆÓß0®>*ÅÏòd«“LåÁ–“) qÉ;Õ8> 1àMݯ¶(õ×G.E{ø`díúëÿ‘pP8Ë0†]a"j3g2ÛͰ¦%T‡sÐ6H§o»Üœ(MŽÇ¡®7¦"yAœ:/6 ztÖýÐãmÊ*‹Õ™E¤e˜ö‡„È”…,¯êKã¹ö¥!žf(ÆfiÛØúš ü-Þw£VüO²qØ¢ÍÜF„ÞDsU¼z(}ÅhR¦8Åwx&ën·/¬Ì†ø íÝ dšˆ<þïMtur© ]Ø%%’üþÿªØhé•bÚêçõÞ)n÷µ~o77«¶ª1yVXD#~fJg8‘—­Ÿw¥•Q˜Éî@ v9æ8Ή ôhd&p#_sÓ¬kCµwÀ©–à•蛹ýbaMäVÎzýk…Q6usýŸË½JOœgng-bÝÓJ›þƒ¶Z<ÑCÀßäÀ´ŒsTnH®íko¢Ùô „!]ÿ(wN-ßÚwJ@ßĖU>•¡Æ]ñÖ{ÀÆ ºM \ £Ú€"ŸÝq…Ÿe­Pk0Œ+x89óþD%&2$ðŒ\~˜¢ÉÓÜŽ¥¬ ôã•A2bàƒkÀ ’ ÞÊN²ßkc9*èâcy åü˜°¶˜`þŽ1ÚµÅßxÑ›ê4¬à«ÆöQœQ${MçÙÅ¿nñHümøEéõþ»H÷/ñ·"½Ã».ƒ[.|Æ2K9–¸Ü-MÂy:OiÁŽcÚðJ{µÀ©n-Z4>LÃÈœGVÿÂᘅ&Ø Ù(亊µÐ%æ:„k{ì³F!,½þz˜¾:$‘óÄiqŠXçƒí‘ù'O´—‡é*™¡èñBê~,F¯ð¢ûPôÑ èê0›H Èø Par¶ êK´â»®˜Øˆ(û'>i ©¶ œÚ ¢A‚F½®gØF úZÂXXZÝ¡¦wЇåš*¾0 }¹»«1Ë[– ~NùFˆm‡•Ü6½ÝÞëÕKAô&÷úƒ™' /Tɘ¾’ÑF"rp¨èšù HºüNÌÊæ2*üWCG^u/9½®Ä’—)ÿ¢d4* þ)…ø]îÆl6ëJFh>çÅ‘¨›Vš…f¯¼¢hݰ—w§nÈ fb&°ƒÛ.lg2YÇ67×sÑ¡€ªÖjÚÚ*e•µôåõžQ˨vúÒgLú´jÒgâ42M‘ç„|Æ›üUòê÷SrkΰÞìô*Ú–Kùäu•3Âü¨· w”‚Ü“´àœ–F áÁš-É¡8ÏwX÷çu™tMd{ ±n¿7:‡XÄB“6wD5UHQéQ›o ÃòklÙ—ÚúÚ‘ú—Yñ{pyL[G¹œËz‡oº±ÐÕÑá¢h<Ö‘Nk;uY9ÎñÉ0²sŒCIe ølÒT/ɹ6¤”À5¡Èm×J¡nkžÇª±eT¾Ä6QÓ «ÐÍIí«–÷NÒdütŒ½žáî®âM£ ¶øsKR‹:^Q ¥ÁNB˜>~6Ë©¦@BÏ”§NKRãzÀ'ÀÜiºÄ”LÎç­®ÜæBì4Ê#ãÿ¸Í5ßñŸ3ÈÔÛµjRSOŠ‚{äzԮܭƒ²s8@ŸÑMÿ?Óßy­Îe²ôEÐYÈ‹ðfA>#Þ'Ób¬-ÌŸ6 ÚÐô±¦èÉæè­µRáë,K*;s˜jÕ>Ùí‰ø/u ð\Òë£á°ß Їû^ÔL2–¸ˆ—vÑ3PÍ)Ã÷𵨸UxK§i¾e‰ªWž­±öWq-òWC×Åÿ@ ÔÒ2ÓT}ȹ.ÕÄÛw·bUæaÿ‹,a‘K×–ïŠs÷Ÿ–OÞ(·’º™¢ ?^ÑýŸ±†|„ÜÖ¯CÔ” ȱóÜçÛ®qÞ±äVDÛ$OD±|vŽ»rTôÚÊd麇ª|ÐðIJ"ûž½Ï=ÞMÎÓ“™ÿë4ˆT}S ¨‹H C£9âÍ/£`Zªèy9±×e¡‡›ËL[á¡yçãqñº.DøŠû®›xÜÊG®Šíõ½=EŒ}Jz¬Ëø€ÑñÜiÆ6bñëÜ\Bÿˆÿ‹f5?r×å/<éNu—S¥™ýØcxŽ™…„˜¶k“å;ÃP9©º’‹ v<(‚oÒ7éIï ¨\Êš¢ @]¶Õa-·÷´­1ÒS®0nM|¶ÅšæhÓG¤æÿ{?‹ÐçËÛ*v;芴ïkÂEr‰0­”þR¬¿WÄ|Ç”'«ؽšœïkÊ}¹*§±°«µªè·x“ #ùîîÔ¢¼0ù"(*zâñ¬ÿdÖ¸¬.ªåq¡€¼ûµÞ"ëæ;ø0@b#×LË«?#Ϥ¦s^úŠ&¿9~&óºœ&)ÏڄߣÑ~»ݧâ×n0Ü.¸‚R‘Úýs”U`¨¦Ü‘¾uã힌¬…¬ v†ŒÒÜEÞ­Ì‹Yª¾nå²ø‘à×Ë®‚ƒG“2¿—Hf˜þlrïrµ/T1C)üIqx+ñ`á ¸ Å‘ï §öW´:|ÆI¨H‹uŸ{iKOÏyÚëÁÎRÌ€ó$ÉÔc ôNQí¦Øa9ßÑÛLóŠ"¨Ÿ«´÷_¸–°v˜ ÷cHn†f‚SÌFl)¥©$Ì3|HDˆQ£Üïc £¶RÖWÑûÀýjïH‘Ip3œëZHþD"I”Å@–ñÐòCmž`I] Ïùg§A³gÒJư"fk•ýE2I‡± ïJªñßh‡7zpõUß¹ÿÆt8¡g  ÒÃpeeQs§íšãBß¡I±òþÖ ‰$š]1¶m»jÂ^ñlk oóGÍöd4Ü?Ú­è ”-R,ÕšôÃ!W³Ð¹Ë†âª{J[óŠ ZŽª,g—ª fäÃENßÂIŠ×n8šö],šm†u)ŒF¬ë}¾iÃsÀn_q9›.Ú @«–è¾™Ü9ù/$yžÉòúâVi´7TâIŽŽ¥ÄKl?³è÷§¡Hu¤aòTšüLÇ>(A{ØÅ!,^«–}ªgšè"¹·[7*™Çè-kØ:¢º1M¤¬Q¹Ê£ €Pu¾$ºÐ¨|]]s6íö ÊLì‚ÒCÓ/tÑqâ@xš­ §»"ûmë’®3ÿê‰|HMt9óŒ1~£– û¹ñZ'ØËàU‡™º·2¶åúò  trN¬‡ØfÛÁFLõÔ™BˆQÿ™$iDQô,?’HQ>žQY?%=‰Æ8Š×-jžØˆà ¬‹¦òáë¹ywåØÄSe=9qÌŸœT "¡æ[¥x®rbü„_Ì÷{3ó>ï&d‰¯‹¦Ö¡4d¼¥‹ìÂ?1ÖxñJ“‹ì1'-¬<Ë-®Wz&¾ØRüY„1v¥üüú ·ûÒ0å\‚ËIôO¦12§cÄÏRšDV—$–ôjœ×• ‹\@a…0@<1žh³ˆØdÆ•}ø³Оj±&òï\rÇz«ºsá+ZæAj±ŸecÎkq[ÔË+M1_BÑtÍíè+ÍÕ$¡¥F !„ÏÚ¿ç,È7Tx´¼©5–Öü/6åøu8_NËP÷1'N½ë¥ÛÙ¦$`Bãy›³¬d|ÚrD·™Šäó¿¾\vÒ.HQŠBYžÂÏ^†ÈÂpÿ‹ùIîjC›ËKÇ×÷È|:à§å–‡û‹öó{ê¡dTޝÙ..?ÐôÉœÌ4üتEZ UÞÈF¥‡K”ü•Ïñ»8k*"Í9&Km[Ñtir…|’5-w¦ÀÝ0ø£ûîc£ï°9²$‚vÿ¨@!ñ¬[t\Ti ?õ‡´±q ÃS:g¼ïÅ­ñô¶+)³eãdîÉÌC|ħ2 Õ+éÅF¸ñÜ‚C!l/Ø#.+¸ÔâãTÀ—r£‡ùR3VÂiõŽj½Ÿ¶¦‹ý_Ur°»Ò"{‰YËѽJî« MÑŽ‰aû“< vMœ dEÓLÜžØ^°†Á;â}÷4ë¹ÏŠÿeC…IËé* %ïä¥'Øo‹NˆpǬ]l–C£)€yÌ 9ƒ$ʇ';†í€W×—ÙÃÏ/–ÆPîfÍ<øelÅwÓ‹ƒ¾qɤ”&w¥•Fîí¿–¾Y61eKcŒu¦º¦HÍz©¬¦LÖ‰ÜÏø³ä0¥~ÖÞŃ~x•nÙ‘6F!›êéNM“£=HÊ›ñ+T§?øiÐîí~ €"•ælÝ€‘sÅ}_Ί7 ÔÄGSEé´6;cC|7LYT]=(BSÏ6©Í÷%!ñÀ†Îî±…~©ƒö·\âEØu¾­ˈåFEàG·‹Öã5ð­w¸2¯V‚**Ç|ÕíÕÜ7.äVÉm8¿‹óHÚ´ë»$@òΗ´³7òâ2GãèB;ú’7Êlëo¹?– ­‰J–ð7h£2"-é³¾°"«•ÀÂCHn5w!üU1Å_‡¼rЛl” £nf@®¶l9JYI¦çñ]Î:‹´ï(@£WóHD;MÎKLåìRäHÉ…ú¡ÃÖRbp±Ìi •šv ɦ &¡›äÿ{Õ5¨²d ªEýË+³Qbd—裗ÔùàGˆ2*sÈ|¶CÏcÉX é ï÷*°J¦à.Ì÷éŸùóï"X§VVŠªÉó¢lA†-RlÁN’¨Ö5ùYn Íeœ¹µ¤V=×p9¸ÅÕ±5e𠕤7Ï—Ÿ98ã–Y¦MÃÖmžöeDÊø¢c]ô™&£îóý¼Ìê(†ì…_!ĹΡš»¾ô:}MSgTŠb€/d¯0»ËêŒ~U­VÈØ¥iÈ6§ŒÓ“ÊBÁñU”„WÃ5ô¬üx +’©ƒí$»…ñU`èò|)u+ÜÛ'@rw’SÖ×ÜÜbjWJ‚¨£Ow²üŒ÷Á§2/"ßËEYëE R· óXJ|TÈÛAãÝ%:°+ÂR4jð5W—¶ø! E=×áçVÿÇæ¥ôøváßóZ yŠW·­ÙJŸãðUÏ—Nº ¢±=îÊ.êŠX¸‡CFFÇta¼a¸jß-]ŒE¦¥F³D—üÍ çô{út,sø{%{Só ¶$ÜŠÆ|$•¨#n¢×˜Z^êÆ™×·æÓŽî.“±‘º¥¨¢ÉÒÆ?æ4'ª¯í+W„'oÂïò×GÈT ÌÃà4d+p7•Í7câ©:!‹a帛¼ÿøOV~7£›4—¨Í¹É7rºƒ÷F›Ä†¶Nò¶Ù%À¿&ãe)ô@‰õtøoãÞŽ!âßSeØñšÍºHHM0êÓ¸NЇîGŠK$3FÓÝS@ÏnG±…æJ½ôOŒ¼Û‚”I+‘’›þ¹Ú+<:ÎåTðñ§ø¥m÷Àj5ƒÁéÅÊE@åPýóâò羃Õþé…C8ŽÜŠÊ)ñ¸+z´­«º?,3ÿ5!²¹/™Ä7z¸'©‰´#u 6­Ý.(n;iN)¸¼@6“Æ÷ʵþ4ñäŒA´x1èÃõ¾^Õ.KDÙ›¥Í3T4 5ÝÔf«êNråü›ªå#3¨Î}— äÁû[ j=œd÷}ɘ†ƒÝÄònŽ8»Ý¥ô0Œ•œ{¿6¤--¦†)7ë Ôú.Y'tXÚ\¿ý•S¾ÿ½’æÖHqز]Iôçp¨ÿUWÑÞƒÝ$(ml>Gpîù¡ °<™™JìuèMoœH„4ÑóÜý ‹îžØ%|©~uè±(WGMm"(ï•Ô ¸Ú%#«Ó\ƒ˜üeh²”Ù ³§g_Ÿ@𠌈­ ¡Ê,ø^Mú;‡c_˜ë}¼fj%ŸÛgAÑ>²0]ÖÝdÄ8@šñ XMûŒœÖY5ÄÌ<ÆÞp‰n#ãfÁ¸"‹&¥Yé—øíØ†? tîOò;å…º÷ ŸŒýëBûŽ·L¶×u~—>MŒÝ'Â?†Ž5ìÙP»C5•‹Á/ÚuîµkáDÁ÷jˆÀ!&÷QË¿ë=É™ú6r¡ïuL\·‰bº«vìHFI/¨˜— èW̃tȺäÔÇŠVp$sJE_“¢|«aJ÷G»ÂŽh€ÔÐ ló¡Þ[µ­úK_¿àÅu˜ÇŸ%®W»yzHQøZ›œø¾¦B“øüÄ; T„ß™Ûá‘Ri,çVöûèÎX1ÏKŠZôu$ârÄ\b¬¿½þ~`°[±¡¦¯’ i³Û´žÇ²:6?¦„·ΧJÊ.6øŒmÞûp ]ó«|tÏeÏÐø_¯™ñrh—73Llÿz)—rô‡ûö%ñ{ÚØ›JÀv”‚w´íhx@0·­LmøˆÇ[z×$â4ãŠ8&“QX"Eãa¤,u¸%jýV$µX­¢– ‰kºç¨Å~vÚÜ)替:¨bÀ¢{9ÁÑ|T¥`†¥ÏS籉kðªé8zº›.±é-ÓuJ7>IòÆîÏGë¬,üáÀÅË6rÓ'3V?>‰`ss›Å:ªCüEéA=ûÔTÓ ¶íp§D:#=yãð8ÒiuXn\Ý!ªaG'±öÝ@$¸\ÌüyÑ {júx³{ÐèÄ#Á¤¨h_ó©úa¤nFıƒm¤‰&JK%žKìß7[ÒjA/à½À3hü¯Hª‹Ö¦ ÐÚÞfÑL›r…V’0ú·h5¾Cä·Hú™ú1ò9‘`ýÒ }¢’U6òUŸ~ï?·Çý´æQÃÐ:L£Wµ‡$R6ôÿ2RV?kàŽø£ì ¾+ò{‘ ÷Óxö™žûŠÑ †˜ÌYή,üÛö½”ÞÉO~¿3¯õ,…v c• EUÆ«“˜ÐšÂˆï žcY°?»Ç[½¯Öuÿ¬Ìø­÷ZJIñK÷BÛ sGµ(N#L$!wÛ½WdŽ9¦µEq£{¨É‰P5”ÐxÑäÇ4öNâñ,ÉV,½ócï¯R¶s­X?ñ¯ö¶€U¥ò™E-nªû’ÈOLŒ" ^­ed£7 êždcÞ—Ôácð‡ü$œ¼ ->ˆJEbÌ'7 —8Žý#~dJsp¸³ŽÑÃwõ"Ç_˜‡Š^‡bùØ\r»å¨|Ë`“¢å/fÈ:zlæÐ´¶*øÚGÏ—Ô» úŽÿ©Àö2Z—­¦”Eò:±þ'¦l'9ø9 0@ÔKìÆèûèˆC³LOÕ-]¡°¯Â7t±œžõ’õØ„™ a” ‚“¨mµ*á~ˆÚ‚ š¡kÒ›‹/ý`ª%üú—Eõ|‚(<n¡ÁË›WÀRÿ½V9Z>ÂÓ ŽÓ8žü$ýUê3›8’V‚)ØÓâ¨!è!ŸËwüóE‹ï—l ¾ÊG7jŒ§=ø[4 gïäSME–™e&µåÓÑžÌTIåï+‚²ÄÂø¡ŸÏ框©„ ‡-…Äe§ Ngî&¸¼’Ã[DÈø¡¯Ã†}–ÜmH½E;â[ˆ.›ÀДŒ܇i%Žá}3bñtëDõÀí7£¾¯¯MFøWg(¾Äa®dhØzserôÿ•µ‹VJ<"uE‡ßIZ1‚+ƒ„avKsH<|¹0îÌot$„á@‡éQ /èŠ9uÉkìD€2ŠTt÷A[£Ÿ€8#P{ˆ]FŒa²¨«®t€ã›¥#¡‰,~ÅqkN€vü:Ú"&•ß7#…Ú{z)àLÒ¸ 2maÉcûÚþ’$å7|Iè.@Q–ª¶!µþ@áx*t~ù5틱Ú9¡AÌ ¤-®3ƒ¼•¡Ð:…©Dùa0dÿì§a—á ºPóX7í›Í}åæÙhªËoÉx ¤gïoÞ·(ár“܉Ýå¥&ª•¢°ÇPç9ÔØ‚GÚFF­Â³:a2ÙjÀáÅd8_ûö$êv¾¢©‘`c-Òü+™>Ÿ/Gr´]o´P ö°lÙK£€]¶¹Åæ©Ç‰¬çjéÇœÓD4é^PÉhc:ù?ôˆB§% 4YË6î4 ”šõüô‡Óßæ?­ ¿ û`Þí¢¬Ê5écVê½%?ùÑcý¼ÏÚ=¢å Î<`\™21%Šqt#öKþëÃF„ï¦v5‹›T< B¾ùT‚Ÿã$j‡˜E³ºËCØÝz üþßv:ÒÅÒ y‹ià‡"Üæ¥v.$šÎ0U¶PÙáYž£ åÄþrÕ¨ÚžâhcPÐß3HwйöRLU- mÿ®^ÄÁuG½QÁBˆä«·ø¡ XYl9 îæú0ŠÁ÷ˆúã ‰(¯ÉMæ5- ±Š±"·7Œ³yž~<â’/ægê{]{? QÇ¿ …øzÂó`Ø,8–OM«Ì‘³/¸€"5èèÙ¥™}9"YL¯,áÒ¿{Žââ¬4\h ;«‹&wx)+"rE×ÿ†pxn?to†¹ÔÑqÛ…šK*a欒TÞ]ºï âéÛ /öT¹–ébõ^F]Ò8½CÎYÜ+ZX±æä®-Ü-tךÿ<4äå“àQý¢6·œÀÛ&*‰±‡€Q";¸ó?ù›¨zHÀ³¼ÀqЧ1ës.͇IÒyRÂx†²RùÃÑAŸÒ ‡ ¢U¹u?·ªpÃtbLFz,Ky ¾Ùùèo˜¹m¯‹¤½_ Ù©¨A`ÕTýõË]õçf#XRÚ§LšÖÚ¡ßÃWâv®UH±ÅÍŠPèM윰„ ×§ù§Â(Í ìvI¹‘óŒÞ)\Û`…òOÏ“~ŸMЄûÓ%%2m.¡GìÕ¶ÉÙô§fc­¿#Nœ¹/÷!8¨¤žså'é¦HŠL¨®Ê¼”Ö“Í, 5}(_eo¢ùaûÊnð{>+Uе1Òý' î¨ägú¸…é X„„: Ž+¿ê ¥ud7'º¬Ä™ÿ4ãC†E¾*§¤‘åF‡Í0^»ÉO®ÈH1èI[;ÅZ-*åJz×É[d5lµÂÂŽ:ƒ¹ØETÛì›êšf ÷ẉæÔß³îÆ£Þ?Íí›-aAVí®Œý­_ðïî1Ú>jTÙLéE:ªÙum‘¾…1_eºûÈ!î µØá¸ð_dó÷,K5Ô$÷äÜ:µ·JÞ¶Ö)|Þz¨'‰ òiþ×›}ý9±À3ŽÕVÄÛœ£¨WŠÎ>Ã×CíKœEäR^Œ1_z˜XK—\pðÔpŒŒÌøH±ÓjÈ$›sc•Þ Ò|~ûR¾Ô3ž½¤%d×§tÝô̈ϵ-¢RØ“SÆ‚l¡ƒ*2B—›lîx:½æ\‹@ÏN§´+¼Àà$#Ýi1ojJëðS¶fÃËcц†ê¬Ô;¹»o,:)<“1ÒS´Gu~çËôQ‹«·:D‡M%æ Æé‘´­©­³g@Ò^>5´Y´"÷7 Lßÿ?;ÌL2´éëö¢G€öi3¡ú”¢ñÆ2ñðNß•í3ÚÙf]TݲVNQÚ{e—Œ«PÖÜh—nƒ°Vë:gXQ‹néëþI·.±H´rºKÜ*ÉWDÉ¿Xð¢ätp«ÿᤑJ¸ÁíkàhxRpè ¯*ür<­‡­¶-99Ó¼ŒÁؤà~sOTì£=“m,9ÕÈW9Ã>S5›ÔWlé;KL+Ûɱ»ôBC¯O ͽúÞhÅ&µÍtâœã÷ bºƒÄ‰AþŽM®¢ð“Š»S-î¬2ŸBE?õÁ]ì*ꌃ#Éèþ¥[?]Äu..¶N*ÝF†œ§ÁÉ€çê«Qé%ÞíÖxîb‚¯óŽ<ÐæYTœ— ™U£õá«ä…åd£Û ›Šýİ·ùÆÐîжšÖñ‚±Ð(­ÒòDcƒKõÁ0‘Óc‰$èå|ýRødÓék;èœId¤mÃÎàÞf¯§ÿŸM¯ìÝmôÙ7„̉›Rw„Ûàq€Püá…½ãóëÍÖ`²H#«ÿ‡°Tm´Ž{w$Éè{q¿4µÖdnÎG±‚Ô‰Fq(IÆÏÛ~?^¼ÍÑ-e¤"º6*ÖʬQÌÅ«_ÀJFä0šÊÈ=eÝ¢VÌÝÑ¿ù«6"E O¼‰È"ð Bû¼±·"¦‘태¯$ûqñŽF9Ém„qŒf:CAÞÀ7\k½(‹¿Zx)Œ§&Vz›tÃ*Rs9Æf¢”¡h!ËòCÑ>¤±`<))S0‹VfSB>s 2åÕâ¹?4‰63ÝPÑ'(µ¡ÙÓf5µ‰ú.@µC×Åäi¯®Ž€Äüœ¶Ã‚<Á»~ä 쵌¼ey"&±žç’5_j:þùŒ]¶=7-×ÀAÍ”OyòGMœî 3O J—Ü—sH•ÏÏsñF„ðnHôFŸjë,»Å)”ß«3Üã ÈÂï©bt–øÌ„Óß;ÜOü¶rx)OE2x®¹&.fHhVÓ{vG‚àI6NÓÐ?’R„£ñú=ßL H³þ"çßšº#3Í0úÔ¹a’½V±2\ªŽÔ²u'A{HAýIä§!pb<Ȳ!m€6±_© $ö°¨'MùßÍŽ—ÈUhçm4­]±w›ð4¦œÏNº¡ˆë0îõ²* U&–¥tiP˜½ŠHIÕÈ1”GÍz<ø‹‘®À¯ó 8©«5`Šx) z}$/n§Ý¡Ÿ^L(V BÛDwÌ _Xîè—>Ê ÙDã ¬&U;îxRê§3½ßvV²õ½C¾Ú¼< S×KGá€`MmøIý2#EEåµáÑç8SAÓš‰U€Ü-êí]]¢¤¾PÒ—2N’¾dÆ„(.nÆTÝKÜÆd hƒ_ø ^ –¸ÍCÓ¯+/á ŠþÞŧ øPöb3Œ¿m”RÍ63X¬OL½~ÝRšÒ}Å%i‡ç ò—DLO1‰EÈ«ÞËóÄc¤ìO¹p<‚Àûæ\ÍEC«ýNe¿‹(Ì‚Réóç—ê W¸r”ËÂê`-òÅ~‡“Œˆz8-&Y"dc¼}j¨J4Y¾¤X}?Ñ!59Ü0nþüö’h¾Ì»t(~ œ,ZÛ*?—ðΫwÿ<zŽÃîvÏ\˜n´|¶aÇs³¢ÚGµ£S”â“sÛÕÃÿL’¨šíwÌO?ÏÄžöìuWÅ!—šTiƒÁ³b{_Ò×ÅðŠ2¿I3*‰ÅÚq¯¿¹L”š‘" ±ø…ÉB:ù?s¼¤Ù-ºãïæ§n-ãÐ÷OÓ%X cn?k|S#Á*ù ÜÒÀ§(R›cž¶4]èÿü;Ç.z“‚=þ1é绾²Œ·=±!®Ø’ GØÌê.G.9¤ÊÕˆ\Bò·2¯Q‰ÒZ¿A<LJ˱ØÊUeš‘ÄöÒæI ëÅÌb¨ö,2>»Uí5ª\o‹—“ \'ÏH½©”ü{FžÌ_^ß V@Âåq„•qËÒd±ë€?ÏB3E{›R±>;NŒ³˜K’^¿þqžÔóŸ=3C1joÜ&½¾¨ŒCfÓ²øQÒ²DÌD%âÇsHÌéÝ‹¹È˜µrÓŒ]ÃLt î»]Û ‹²Qe_¹‰„ # ]1ŸÌ÷È_mÿê—I*Nzl Ü)tZ¬*¿®º°ç®þ¹+¦:°ß„N°P\=üXÎBÍØ;v9„áÛ†/ù÷lè¼b`¤D<ô”¼U‘=Qt[ôZß/Œz•F×ïO±”äS–2£–ÐD€îE”×¢¨i€zLˆ²)j@+^n =ƒ<=ÿ_MÔ&뇱¸ÞÁFÞyõ/YCS1î¸R€œ»Žd`¬Moéoö̲*»º¢|D—ÙÃϵ»‘;1NCÒìj¶‰{§ÃLòʦÛKÖžµßÎઑ}iPãjh¤Â*`ÜÆ“yÔuD¥d± þÊ„;XŒ¨¹Oxiùv ¦þ¬†ì|êÒ쎗}”nEüþþe§¿ö~fõ÷ŠEØße¯Fßtà$ü#(ˆlÁÝwyôœÛ·P4\ø<Öx¦¨‰uw)ë8­f]Äòá‰*ÂVó}Óé$\Ó¼“Î÷·¿~3ìš?•2Q&£Ñ¨4raç F÷w:„óÔÑ ßmÒ*–B“IÞ áyU±¿S"öH=ÆP¨ÕÁmcÚö\!­Íl- ]JÞ²õRj¬÷ÏBù¨¿H2û-OsóÕÿÙ„µr#/‡½>Y>ÓÒú÷…jØQ\t÷ØQW@Å2Â_Ž>Y_ÉÈ>>‚ <¿i ¦%x©€üëm¹±é2V½FPj¾^¨læ\.´ЭÚ_> NªŒE6ÌGÂ6ænÊ6ñaß串8l0ë¸jzÙ0ý ­òÚiܯ&Àöw n 0ã±[6bÀ­ÛÁcn¿­/,7õú˜V°Œ[€¶œ^ÿÙLàqQ5ÆIÂk›¡&k [' ЊpafÀ³ ‘\‡²}âë]~Höç· jN)¶)Ë@vƒéÊŽ4èi«ÐMÚ þZnè²-~Q„êXJ„!'¯‰ÜZø¡ÿ-6 kãÊŽfºLÒÎj%çè”hM¨?ûÌ̿ЄOã¾Í}æwdÅœ-±X_âPsþãÑßáÊÆ¯Ëò ‚ï‘x‹kЖ„Þ£ J‘«—fù{P þûñï ÙAe@±èð²êIPi¡ÝñÅhWÒ•3Ü…yX´ys(ý"ä7KÙóÄòͤÑ,¡D1“z¶:ùÀ@¯€6z½ÊsáŠPÖoºZZ­Dã“<ß'|×7ÑÎõŸéhBR¼ ݨ;ˆ"$”ÁÈÀˆB0«Ñ2%¯ÜÛÁâMJÕú³–ÒãpäJuq²0f Q PvØã_}·,fßÁîŠÃÀ@iP£Ä¤Ú6½â— '÷S¨~lÕ“Üké–"a©šå”“@ÅÔ\”©ª=Ö6΋I{»#E|‚OD:S³îY\8˜?ãà}½Æ¬Õ\®‹áýHW¥õ*<’QCPz<7ñ™,÷.ÐÔÄ”®l­Ü;Èzãï^xDžK;5è'd@QUâ굇_(üw¾ºi#BU!ƘƷñ3°ö‰ñýºÃ ŽÒòŸUÝø 7¸íðËæ9ÈÛ”ÐÅÛ’ÓMfÂþÖlø¸•¯ÄæYЃˆêDêè<äYå¾0gP¦‚¶'€)qW3›ñB¼¹À¯Ü ÌOÇÊ!âÃöÅFÍxÞãHñ¤ÈËTŽò –x‘gqØ:Ì›{"xJØX4Geä£3 ©Ã~ž´™ßZ4-‹¤À 3Ã4|²Z1¾>Ëù„ò82>Ó¨*1—Á‰2®,†¹Ð°²‰„§éé¢ifàÞõMà¸]ð„¸ÅDK¯`g¡*¹qY1†$ò¯^Ç݃Á:™9!C¥-¡< ³V¼žÆ;°¼-LB¯J‹œŒMX¡³.—Æ;?‹>‰;Ó¾Œ`#8ñ¼xç:lŒÝ^)ø—üŽé›ÿÚs8¼ïµ®ùPåTšßÒ®±XFµ üW˜˜ƒd$˜£Ž\ÞiÀY$ï®Â2úLï0.ã%fì®õ}%Ï£´©æ9}™oB ëÏs°8þ{ý r¬/@Ñœà°/θ¼GÚSDË“<ì•„÷ŠË2ÓåâèKçS¹ç§¿ÄAlÏ)Ð#v ÍÞòPX¦^™)$PY¯ÓÛfA½r¿z€©ßf¸v³U?ßMÓ(š÷¡¯¼SÿÿZcHÝxJ´*l j£0°i`~-óËïÎyÖö>'Lžs£>¸RFÕ빆¿©#ßh²¸Ï‚¯l3ç…ó[%±ÑÖÞ…¤ôQ ßä-uµúT¥š¾S…ž(³Ðëœj}/gÉÑL‰[¨{œµ{…Q“ü¤C¯…þ(ßo9S# X¼øØÀL²ÂP@0LU—^…mËN!âµHÜÀV”/²[¸¦¶ù>,*3ÍG‹DeVWÅWë°€žåÙŒ\ëà²[ýÙRÿë%€×¥¼KÊO#»§öÎnwv:#ªÇ}¨ŒŽú{»)‘ärÿ uû%§Zϧ ‡dô®L%± ÊÒãM£\”]½i± áG2»ÜL陂¬vÎ=30ä³ûSôœ¸Ç¼E!­×Ø–9]&ÍýЄë:§8l—éb’–QA5À”Ù»›”^ëÓ»ð,˜ÈÌ¿²<,&!Š/Lcš‹ÿ,)@`7ù8¥á"sr„(µoHŒÞ³;ÓʉùG'ƒÛwk+È—£ìò`㲦ðá59v"ªÁòßR<ææ¼rËS ïJ¹È';ÓØc¬ŠŽlD¡•-¯‚Kǧ/ÍÄá)¤€q{ë]îeîCDдÀ¼ß„%f±Ùõ5;j?úlÛïcL‹Õ§¦?™VêÊe=Öv…ÎIéŒuTtZJÅ3!vbÒ>i7]¼"ëPV +ªÃß®G‹k¤Ê^Ú "/›Û2Ñf[T£GÞ Bé÷xBÞMŽ~‚N²ð×­?H ©œZ`;¼]¼„7tÊf艹EL᤻2Nù°#ÂË•ßÎ’„‰x–ÌEº¹{äIøâõª’vÀWéxŒFç÷‰U[üÜ?©í¨­›¤‹:à”fC‘æ:˜žñâK´d: ™äò×–ãRë'qØØ¯/…bïF¼ýG茽—0!Ü‚ð?? ŠbëÏ+öŰüúD­%ý¸4ùCÝG¥¤.³é¥´–A÷—ˆ·™¦H—ñ4`pFmS^ NЙœ8z1v®Ü}§çÙáåUe *6÷ÇJ¿( ÀNO7Ô”6FlaÿvN0CئÐ'ç7OyBô¬¤+²Ëawïq—çoI«@?tùþ¼GÖÆ'BC ¨Ã¡ðL1 Q?‘Ó}šÏE™™ÁŠ3òÈRì8Ê€e™Ç(ÅCq@Æ^,_Cbp¯R­qí8;`DyE_•)¤¡b<¹õB+’ùͺ‘;šÙ]¢%âTèP f Ð:K]~2ãÛ^Yb©¢wÔÃâœØ@W÷Ð×è G¯è–øR2S9.ÿþR3f°\S-V)©Aê³Ô§1ÓöÔð?ù23Ýø‹±‘:º"뚦11D8®)¼Èc™XîåšÌúó]ÌÆ> õBóî]û÷Ê?2„Uroeâ:Í—@I"Y˜7cãZéÅMƒ)¸Û ú¦1)íâ‡v˜M @À–éÍÑ#À=뢗䵄´¼ ò_]ÎSÂÜ>aù›ì«@y”x¾Zýhâ>õ Öd\–~á¶ç‘v”(¬Ü7 däò³—.OD"—“Pf=nw/Æwz›â'=,ÎN†xþ™HÜ[EœÐ/E¬V óW@´Õ¡}õÏô‹l„=Þ«^¿Xþ×Úèªy’H³±QÚX1Ï€…;Pþ½í¿µ °öW(É;ôŒè¯ñúÂ\Xá­0'JëTÏ/žÀ ‘œUGKši6®àût½_ç× ¸G†™}4¤&§CV¤¯®æ{k&ÑÁ§¼ÿ†—µ\lÍw1,3*U1]ÅO›À ñ%à§k96)*=¢ÝõªŒ»›]Ã.ÚÌH'Ö„Òtæ[‹vû,+÷Õ`u#ú•>4»9,±Á$C`lUf <¨`~vN¥°=·ü«\÷xŒn`ìŒD›Êý¼«¤+l¼Ïñg„ûY³kwÏ ž¥räÊ Ç%¦Ï.EÍß[¬Ë”Ô‰%COAÏÜ&–¯_ÀʳˆAí¹½àÀK’¡øÉ›üJc`²D€½Y߈d™°ô+µ‚q{§ìþáACeKSqȹ²Ø…­8Ø—­d‡\(Ç „û³£»îa}Ë›È"·ÅœZÀÏ~€:ß·ª·ÍèI|—Ù.Ù0•ŹWü)NðãAÛ3’í† ²àª )=™®žµLv¢ÛQáή«'l{ÙÆ…×-šgF‹ ³Ãšxb±&Íý^ÿYÌ„ÀÓZ[Y`ø$½T•Ý>±*N–Œ±;ŒWE0>fφÿ'Äpœ…N·–å/ìQ§L^Þ®¥UÁ˜ü{»¸ƒ^CPw®KÍ¿r#TöÅr¾±7m>4!•ú€¬—"ë/FäMà_Z"{sJKnÞðJòÅÞÂîøÿHű‡­ãÛú •e¶ÚœË|»ƒM¶ÌuIH…]ƒ6pÿ Ä*Gsþ¨2+ìîÊt¬-f…Q2ÑQRDˆÅGqµ·¥ym}zàùÁûÉËÛ ƒtôÒ4 ¤7¹$–i'fð ¬C¬Û‹*¢ï©Ò2¾:1_lª@+²æ@ÝëÞ'mÂÆ©5Áh¾`dv­í}T¡LhîË»µ’|Ò‘É(S4Ë €í½9+ÞMS^¶ŽvAõŠÁß[Z]‘ãâ~Ê÷ì—ìðÈ[d%z¨VR×宸*R¨½}É}[?µÉš]øM¯ør’% ×kÆí±\åùëAT¾áè $ƒ½È:ŽIªš&I·•]\(¦;пçêÎÔ¤cĉ¦&'zá$or™&⢶ÃEûÍ#_<Å‹ÄÝlWþ™Ž½Ÿ¥FR¾:…¼Ò漢2“÷B¦G8"ú¶'’~¬Ía³éœ0w=-8+ÇîºÐýä‰`-ZÛ¼ùVitUG| ”ˆpSœ?Y•[äÞ‚¶XÌšáV©?ŸkC)àæ*˜-³/R)qNú‘§²JïáëÂÉ=þP³öAµÝ3Ú8‡õ$<P-®¢ÙésN€©gˆÔÏ[Á*B¼8abüˆ§C^á2ÁÂÆÌÅÒ”´Ä)ÛqFί'»$WÕí êZ\â}Jƒu¿À]uñ §Jmã}}á\Ú:Ã]¦ÍH2=NqkD^^ oË7“SípÏKo¬,v'žúñ?·L›G¯uóö½¢¤d}*´~ʶM¦ÌGŸaŽ- 6ED^‡Dh<»Å`Ô|˜‹„ n냛Ó|…+Ž(DcÔäØ <=[ 5!N­k×ôV¸áÛ1©Ô™å.˜SØg(±¢åôŒ¡ärJ ìÖ@µ/öÆn(i=‰v_Ña.X‰çt#ì…ËР8¶º˜¶pÀĶk;(Çy ¸ÐQܘ'mÙÏï«?eÁÉ(äŠ ™+9*Cånªmí‰mëÎqø$[äh/Àô>ΰ½ °\ç<¾3`# Öah³J•´°§P³¿~<,yúsx1¯yŽ”)W»—~bX$N„p_ù`˜ü=h¤î[Õÿ8¶Á„ö‹‡_+LâÜ{7áE-ýÅ‘£å®‚Çç¿ð =½aj™?¿‡°;lŸ U¢°•Ò“aø%<&#e6‡þ ¹€xö®åü,+Þê¾Û:3ëËh7bEñÆ»¼ÖE"±/çùÍÏ ¨¡š{¼JÀd´•DªÚ#ƒZÒŠÐê]âó•8]Ìûâ&Ũš#¯`j9…凱þ @¿%;Þ:ØÇ5I]IŸù’uxý!'¿|íÖµ½P_¾›Ð[JpÉÒ|Õ³l:Ó>1ëmDãu;Q¹ ÚP½!„³Í"´2x±D¾x@n¯Çßklb8J«ssk8áhDÁoš\ö“¡†3¼C׆tÑ-8Ì—Ÿ|ªÚnþ€|êIœ¹þad–h*fàK½¬áÜ+!V¹°² X¨ËCÿí¹˜#KšW‰v*ÇÖ_Z1œ3ô÷CŒÑ^»€§©~—nŒì#ôÆF¥‚€¨+/Âwgð™~‘H‹úKp/†OÎeÖÎø}* µ[¡‰¯&˜㸸PÈ@9À€Ó&ÙiŠvg2¤ ŸÅ©N[Ý£Ð(Ø#Ö¶¶Ñ}ÐFÞىꀴÊb÷—>Mõà2£æ¼\ÚgJrx~¸%>¥ˆ,3|ßš£áçÙSmЛ|Ø–.w?röAŠ:ïZ(›4ÁR¥ ç½KI?ÿÂj¥/yêgãbý’Uš¤ùJ/xls]úÜòðŠ¯˜¸ SÊV©O%ðJ¦Zp§Y7„s[=eûLcâäŽhHŒ“¡>éIà>Fr<Ìu",¿­.‡Ê×y²=8÷âö`ÞˆêñÏM™MuÆÌcñ‡ý¹I” µ7 ¯±*Åö{ƒÊ^þ.vLCiK;I DÄ`…È_.ÉÛ„Xb0QÈ$ÒÍóÚûôušwV(‡™t)kĬƒR¦Æ˜†‘ü¸1Ï•Á ®iÛ;¢‘‹5’KÕì­‹s—± ø+G˜þÔrÍ ÛÚ«Oˆ*IÏV¸Ë|£.Á)Ф¾l¹¢¶_Dè ˆ¡'èQ§üù'骢Ö&·zÇ.7ðX£¸‚üIUÜŒ¶1$4½;Î×W€±5¿OèÖJÏqùû6XRª¹í¡ É—Ï¥€RÄTýElOM61ãöÜ5»¯5z2Í =ÙeAUBYˆ}gzÌDøš¤Ê'(-÷Ü?/¡Ëï%XÜÎ(ºÂØ{[qê’a—wdø‚bmJ³8Ù\”wÅNœ6*<ÿ¾žÈ ™Ò× !ùÙ 5NN¬yG™Šnyj¯oçXʼ«ß½‚¨çH£åþºW 6â¿GLƒ"šcùa#!²ëá¼vÝ7$ÄXŒ9Ñ„Ã2úêôÆ)ò³²ô™–äj¦Éô—B‹êRÕˆv°Ü´`$‹È\Ágs¥ÚÃlÞ‹-–Nú¯‹Á"…w6€Wi›:7ŠŸllÆ ®‚ zÝ‘Ò:mÍ­¯£$sI¨ þò§~$Î(&ÿw±‹†œ3ú)/àdwvPDÇÑJT‹(±6%Æ“?Å‹‰97ÍÑoŽ–~ 8W”IßÁàs‰·š¨YLQF]PAÌ’’hÞ†?­¶’[5 ©J'Ô!ûÌÆ³_o$kzQ@Q—!©½h1¥écþ‹éa3/UxHê×^†Ö ãú$%®„9ì¹+Ãä×7GÁÈèzd™‚pIƒ-°¿m¨È\š%’¬(  ì­R¥oýEjþe iN¬WˆEk Ý|-2Ÿ¶ªÜ®ðW"ÍJS"ûΩ®¶”•Bbp»CÁ¦}ˆU*ss9Šì]§ÉÊ©ó³EÆéhÚª²uÀØ—´H˜lÿºäÔ¿žËôgBqZ•i“%%;:T1Íp(ä/ÇQÄ4â·Ç +ð,¯›Š uÞ’#"ê|ú`\ƒvú•‹¾C&ûæj7uöCêgë½—ò9ûÇ«‰ãM`Æ›'/­Â.Ž{ÜbÛ ýÙâ ôŸÒއ¸P‰bPtl£²nÚæ ("õž‘.bk“àÒ¿³# ýTéº%¦ ¶MA«Ø—¥ÒdÃQè_ž‡¾«ždQI­2®ë³±2ÇdqùŒ*®Î‡bÙ2¹>’;Þà ’‰z©#se6âàp=~lX›ö`)×”ˆ>®L‚(”éeeµ Hˆ{S¢åSyYc‚"¦ÊTÇ|º½F ¬°cQšäõ “ÞAv;§Ï¿Lw$6uxëb‰!Ú e…ƒA•ŽO>µ–lm×|îìßK_lñšµX›B7yY½%ŽÉ!ÃOáÛ?}ê>/Öõݰ¢Ö,¥¢Íne’壷ŸhÉm‚Í6Ï5tL=7By#mê®cwWó¤{ͪ‡°õÆ´Ë‘ÔîGð8nq.!˜^1&Ù:K4!}ÕU°¶qR–…[Ѿú'n„¦Ï×_šó½ó’§øÏ£âœçA™{ûÎz /¦ Á•¼æÛQΨÅ6yâkÈwbàÿõQ\e@¬Líoù÷ê"ÃÇ€å*¢ÆƒWœ0KËD†T™§Z~†ƒC25Ï<°+cvÐnÒH%›×ƒ¤‘^׋¾½ò (´¯ö·6Sàc|>T Ð+Æ„¬çªO#^-Q:°ä¢N0ºr&ìÅÏÙÈfôש .4k wÈ¢2ó¢ÉšfSLjï-@?¾ ËgOí b¬˜›¶¸œÈFPæê–ôÏÒ'xº­„ÀÜx÷”ºïåŒÑ…Ï–˜ûhçƒIæL¼"VøÝ$½€ÕGMÚ¡G|h¬¨òzÅg!6 ádÕTk-ÞïÆè– MƒdËò^C“66(ý’¿ÅÅÿŽ@Îî`—{9Ø E,íå|Zsùo¥áàDˆeŸp©rÍ™£{ÇžýªúÀ7[ÆÉ'—d˜H§‹´0=$‰€ý>‘zF÷û}Hf )„, ›ѹÿy^z¦¢‘ ½³x¾ó€‹‡ÓÈëÄXÞÇ,¥v5‰Zº`°ªõÎzÓJΤL[´®^ÛŒ Ü áWtª|R»ƒköûßãôá»éé¾m^â,Ò\½CËýûŸ¢Ñ;Ñ•×Q ²ÒuÁ{Oùxgû¡jÆw¨œ °îN™S ‰ îޤw zTdkSluŸ&ðD÷JªRW"¡¡Ì®HGâAsÒO «=hd•¥ ¼â;Ê;“§4f¸H¼OÿIŸ$8±iù漜Xº ÖÆygf ÄÒÔÏnÖ<ôm¬»¦]ÿÉf¶ƒö夵<š¼=BRêB)¬Ú¯,ùJmþ‡×âš9ÅrйË`õ¥„g2.¶Z/‹ÆkØ:3Âqe3ÆÃŠ=vkHÒ„¥’äYÜw‹1ùI°~ñ½FmijmñeêÝ1Ê ê¾!9Úï=Ò{x xUžÆúiŽ·÷üœ•“M­»gï—ÍÝMbHþª"hãe°ÀåUʤœO©)ýÚ±f€€Ô/b›Þ‚¥¢7ülU…Ÿ=¯«¥iiùš€Ê¤âã jä8×S²g­ÙÓEe íÿ ñã²u˜k¸1m&¯ë˜>qWWÅ”ü^ì¾€ôð0z6‘”Ø^²?d[Ž“':ÁHí¶.†äàkÏ÷¶ÜÕÄ}uUHð •Æ„&Y-c}ÉŠ˜£p9ÿ“‚w®„ÔŠX€=‡H®A]ÿâ-2K =;Èt”U´€”Ò’fÇËIýŸý&V?ƒRþÍ=à›¯("N XŒÆþ&ˆ@@ †…ƒüPbär?ųG/ÄŠ•ÃîÈ¡¸ItäáT¦É\waW²dL$©Å\ìë_*Û¡xO|Q¨ Ç3%2C µ‡@Üĺ˜LÂv<# ‘áGÌZ”ÎìzlœgÉZQŠN£D¦`ËÞÜI$ôƒ;6 ö{˜–8£x—ªv~yYnÊÃt¤ùT€d- Œ-’jqNZénì8¤×LxöU_ˆ©ZäŒ]°­÷GÞDV Ë}c­Gkî{ˆ^ºaž¿ø™¡F/††aÃVÆ©ˆx l ¸yÔ\åL’ÖÜkãý˜Åï_ÿ± Ók ùŸ&3$éF§óªjP!õ­ŒôP\E£[8ËÈ]«’£±¨voP¶ŒÐØÊì]Übƒ1;jÜÌB±iL9þº¬`툻¤Ðñû°Çö¶‰EÐCÌX¾µâƒf ƒÀ,×Q`óRp9S <› "\®„¦@ôîP°/=?bÑÔÅ'D4Þ,-N(6«{€Ü€8BÀwÏ ‰±=ƒËÆjmýÁ¨¼Paó6ò÷‘9¡-9ñ”로œÖݱ xl_—¢å…PG~Ý™ØmÈý_¡ÕÏ<®‚@wñ>}ßvc0¶XLÏEdÐ:â‡y’öm.uä8˜üëq•ö '†å„} „rú:ç"I̲læ;Ί“cÒú{ó‡Õ)«c…™d'zšý#9½P¹=®¹š;¿7¡]¶,·"þ*\Û»CTy­0ˆ7r¬k©®Ï”$›­€CàòØ)g³ƒ5^îƆ&á‰?Y"Ás,Æyºß¯m0ÉIž5A(í~è÷ÿmŠãžjýoG»ÊŽŒš³qL:»€ˆem>ÊË·åpçF­û¹oÈD§q »'vû´;èÊšåD¼ôÒ´{—¯€Ni±­ L ¹#©  ¸»?ae3\.ß$BýúåíŒÄ¾FJ5-K?ϲÉ|Þ(vxˆÒ;*Ô&“8ü|˜l„ñ5¡k…@lı±åîSÃ:^i¿âR†Ù©T;zùHÏt§#ÛѪ./Ú`FCôÓ›m_Åá»Ðë®+³®)cî†ÛŸ^ø“·Lƒò/÷o‘¤_þ·nê¯ÞXCFÛ–‹SVVã—'ˆöþˆÝ¬È ZKåJÔSVûZûñ ˆ˜ƒ ±ºÊ2ï/D`Hwh?(_™Faj5az¡Ù5 ã„;_Á³1¬ú×UªV7€ c‹NRXXUJF¢7:µMË·I’³OûbsïO}xÛ¸€-¶mO‘¬ÙÊ:ž5œd%¥ƒ©Ó9ÁßID—HbÏÓ.kçÄ?_R1 U™e•[÷?86àëFl›=“Ÿo:*úÑ\$çžËó30mM€ïĆ6–þP}¦AlçÕ‰øçñøÁ‡?¢«ñ­42L÷©D?5‡½ÔÍ–îê¨ú9'æ1±óJÔDÅún#¢ë‰4ãÞËÆà¡›ƒ°ýtùUKoª+¶y¨<Å»ÿ_ÔEîãµÎÖ!vü Tõp)ÿÄÏ »'~ÁØu™&c8èn‹9øFG1œ?¸mIÔôÙ/}¢;Ï´ûZRy>hÿ¹ÞÛq¥Eµœ'ýÂø3ÇÖG/BŒ…'Ò ƒa¤êÑ‘—”›iîtN²˜¹¹j>¯*òrj±n'ÂÞ•uòè{]¡s‚À;ý”?mxSjØçÚ«G1Œ7iÔW7u,¯¹¨:œÉª²#0ÉÕg8MVvù;¾ÆD&¢ÞÈJ¯½’r÷! öôÏ€1©¤ë+Ü [’Cì·9Eè)tн@'™\‰ë>D·ŒP1lábW‘87~þ9ñÌÖYº©ÜeOš#E¼¡Ç"1ðÄèXu)ŒûŠÐÛc5üJk'ÃÓX&TÂuIÀ8°ËeþTò‰M‚F·`FâVðÎqžÄxí ‡p\(ËÈË9áàA²Ÿ9½´#ý¤SŸÄÕD¤]˜YÒ†)ÞÇ]*‹!J;ãä1© …\Ód«!úbÍT‚e&©«»IA;\ÄìîÂJ„©ìƒœ&² ¶Ìz_˜KuN˹žB—ˆ|X5d|Føqã~j Zþc!q.˜‹,IsqdtR ÏêLê‚ZMÛµhôE¬žId( JÏÊ“m‹ N›ÚܱR~p’ãÜx¥1aËÖ®0OinU°‹g*˜žÃ¹c¼4I«É:u#–€½¢„£H. "ó~ëÔ2rªrô{Ä4ºêLMëü@2}‹.:Žÿ\x c›‘,.!²Ää^…þŽ Í´ŸW‡7r‰¥?n…CÌ t…ž´“¸èתm @TV>FÕ¿¯²‘Ø~û‡~ÿò #4éÌSUù`£#7±_ÍûØNz&96t[§ŸËwbuÚ4Û˜‘úÆ£•sæÎh–ìH=MÍÝÈŽáÛÅ=Ĉ2f ª_í¾d2uO#ëw) žt •¯|DÆ9ã!Ÿ-yœ3Ì•@S < ™Þ·Ÿý¡Sír8ö‚w‡»Â•ñf æÿe^uîˆJ‚HUÒqývþYמ$ïÖYmþ—UWŒ4xÝ_‡)ó¨-HÊ‚šíÞÎÃÛ Û90½½úbŸ~T9÷±¥VsH~ù@iÝóô¬¨vV~ÎÃØÝWÜ% 2°Pšb–£§fTÝzÖ’s¸9ø=£É=Ó­²Æ½N&F¥É ª¸‰é@ŠU2 \Æ„ärßT]!RŸM7}M·G4úÑPO2Ü)Õ"+wµ”Ù´§“xXÐòL²µE†:2MŒŽHªÃ€_ßÎŨ¼Ô)Ç!¿›_:~~ÏXÏ;Hå[¶W<¿sòûÊ$Ê‹hŒd8ÆÚ,ŒŠÐÕo3$éh Ò=Ç f’ð*ÎQžÛ¸¬!)ß`ga€Â™'â.3ÌæQÎ$U}£Fý_+‘EA\!È­¾;~¹gÕÃfLYò娟qEÖ-Ø´ d?-ˆ•wŒÆÊÑB!…ò^*éˆ[!àôþ&à1C¦»¾7,TîzÄûxœu1ÿ_pßßfK¦ÛuS!Ó MLGpg¾3îïüùFÆÚÛÁ¦— ÊÛY·|·¨Y+€¦G5ºÆQ‰º Óf•­™ ÚUhmY¾µ1 vwUIlÍÞÒâox]ú~–ˆ~øçðÆ‘ f§‘ jù…G"ý‰“ÅØ%Æï˜ß•X%¤Í¢ |J»Vé·´å·hêKΗ†Xò)¨YÌ7“»ò¾æ­q¨ÅlÅ"M¶¼W•à¤8GI§ØŽÖ EZî³ Ýnaú¸WÿåñÇÃvi͇@œr}à«V`æ‡Ã¿‰Ï±÷8#âÜÁÆË]1 ºÕ‡3)²J&FI_œc,¿Ž%À=7 l»†Y·&ÄÄ©Ljü‘Lêü‘¾ÌVql nwõϰ€¦Ø/ì“)ú3•†'qfèÞ¡bâ0•â]u~「~V!†Œ*0ÕPBʵc¿ˆ¬ÒnÁ›y@±†Â¡6ÅÇU*õA[0±Ê»n é§„‡ËÅ`³%w}R¡@Ä“ç,ÆyÏ´Ýô9-ؽ·Ð2Äéiqæ5E{ • ËÕ©ED~û¡öbÑ$4U}#î—£eM–wj<×¾xl¤m4±GMê´ l‘¶e~.F-àGsš ’ïnǾwyHäG¨Î>Nóù7JwRq#¸s"Ü-}íµƒ² MuH½ Oë=Íø5Ôšn3~5Pm¿oB›k”:,q(B¹S`&(úêBÄ ‹>ÓÞ.úÙ;»/)½&4JaÛ®©ŠæO­/QÒ!€4â_×å…¤ƒÖày÷=o¶éà+ ÈçýŸ«¢"­Ñî-t~QRA>ñþ¤ÎÏTÊ ¹ƒé[„ˆ=̯>¯%v/‘Uý.†!¢EFLo½AIÆVgì«V`æ‡Ã¿‡XQ>¹g+”ÙôÊ9¸ÞÄÅHÊ÷Ï›­akl°Ý+…ŸÏbzÛ÷9»/}{–IÔÜ‘"·ËV±è©ÿ(4¤©ÿè´\%þ6²†~ ˆšªRË} «RÈ7ë@N&J{ÏÚ0e¼<ÁûúØ54’¶´ÕIèÁ³x©‰·Î^§äxs¾­¤‘Þ}ö8-øwPøltºJr¼‰þO_”rLBKÞˆeà¬#^dñ’{}ä&çÂçîæÑN¿¹Ál‹Ý^—c¤¯yž±¥fX€tÿÛq#h…eebQ~,y%•¥,›?º»æéÒ° °Žßk7`€C·¢#wCýñR]ÌÏØ¨~ÇÑËANÙf±/#76y¬Ž{g)Ú¸>ŒˆO¾åçÒBÞ~ÍÒ.'{¦Î W:„‹R1}vûë¡Ý Ñßö¹¯ú>™P‘L°Ks66·Üás€ø¯/å# ¿ J,2kDÄð»Ád–ôÔÆµ6sãóŒ5{¿=D¯T¾jQÃýqÌþ ±‡Jó'ÌgÁ0¢ÄJ(싌%ꀭ§Žx¦TÛz/Æ~ºt³ À÷•8ZV²¥{U¼¡ ¨×ßžŽ>΄¾&SÉÇi¦~„(Ì…ã4'²%¸v§Yâ­;“Ô›GÛ°º­y±ªˆï‡µ°Œ„³¤gJõ}€€ûx¼Øîòb{¯¾P®#ÍÖ¼e¿kSÃÈÙçaÌ»ihaïdN€å}Ié\¹…)õoµ'£S·‚Ñ¥<Ïž¹›L âžmÒÉÏŒFÛ#z¹ŠúgEØ##ýÆ@BŒs8öå Õà/“{°ä­e>Ÿ¢ð„¼z»Š¤=‰¬Øí꣔]ÃÞ0­åöÉßžâ–?“mÚ»Â|;üqYÌæhˆd­;æûvñyÇtNT•·=ut’Ü'¢ì߉yÂÇr‘¤¥A)ß*4ÊœûÛ©ÏâÞgþ¾L°Q|ÎÒbÓ&‹ÿê¸È&ØrŒ±H-VuѬ®BCèæë§¥†ÌH üÿÌlÏEÏcÖ¼[ë)ñôìÒÀY˜½«¥ž{FÊÈ,`7b6ÂðÓ@eÄBÆ}iÐàÆØ ‰àêç»&‚Lͽæ¬SçÙ…^€:.ºc)sÍ(å½²šš¤×¡Ùt´ïgcµÆ$ؽãoE™¼¥†ÊÍí„kŠí™@¨+VàqÁý€Â/ ïNõû1aQ Qä…‰†a€DDŒ\‚‡¾Òá¢òÕ}ÀÜ—nÁe¨äÓW渥Øx§½l«^¦*.³Ñf5"¹„•²d϶®9îÊ7µ£·(#Þ|fÿxMÃúÝÕ#þqöv , ½À_ÏÄ~»]?’þÒ;aðƒ*FY¶ âòN5&a”Má¹*>ðÁÉ’®we{‡0Zg§­f0y!Eܵ^‘=18ì/y–{í¿®¼ˆÐŽo¯Èð’Å;€Émõ´ê›+à‚É„üØõŒÜüD¯šÔ-鯶’këÍ®.æê¿—Êä‡NL!º;/Ùݹ8úŠúhL%*¢çÍÀúK8QR„JUR¥0‚Óô°µETbþR½ÿÁØÏ*¸V¢1.CS±"Èáõ¢.8ljC‹¥©Éï¨ËÄÐ#L2D—I˜h€&Çiµ6ýúOú5¾§ÁãØ d$›ÙoZM u{`;У",=غ‰…í½°w|1e)µÁOLûvÈY ›³æóìö ƒ¯1Í-Ưeä!†’ì4$>ÈH-è½½õÉ—}‚pË`5vþ1_øbZÜh‘©º€i¤ksx×QTd˜ZZ8©ù>JJ*]@žÎfHH$ÆÌߢQe"?°3¾øå‚{¶Ž¦ã\P®<±¼ÝA ã*ƒˆw×Ùœ¿–7±«Ò1iAãÓסäù4&œ­›yoòþ˜$-¢[UÐXÐQ“N·¡¶ƒ…±Ä¿ßè‚…ùeV&‰«B7ÜUBK§mĤüÌ)8bTÞ&`aD°_ó œ)ë»ó+åöpöH8³3ï¯Á„üMp¨S„I4ØCúÀe@+fï¡àí]Fuc§{Ò£q-³;ävw®r$°Êˆ¹Ž@i› =}P-qœó óo;¿J“oXt®‰¼Ú|+{Fè l·Å*:ÍÈú ÿz…›‚¤ØiWmD3%äÊW¬eIˆ9Ï׳ª÷) 3Å0ñLDæd8Üæ Êi}Ý(zKŽ¿óh¨] Ö Þg ¿û|Q±EfÛ„EºÚ@ º@­ÿ—œŒ»¤_ƒ.4…¤Â8ŸA½ dáçOç×É2„ÖÞÌ vyKþßH–Gúÿ6M'1»H"^@¨´ïN©S—Wg}“­áEÎ`ƒÅeÜÉà"ŠÔp€²à.uå!Tp\„³¨,Jˆ·f#ðz5Ú:¢±5»çìÝÚn0æpý¦EW’û_:Hß^ {Ç ‘ü’`9bÕ>È1vúîŸ Jé–ŒO‘¡ ÕWФ]ýÆŸ§YEé5U% F/Ç@E»‡÷DÙeI±©«H–‘žû`KÜ=y$Jh16Že9dæ^-žÇ¸a“™ŒšöFáœã©ìL”?WDWCç)²{2ÏÂr½~‰‹£¢5ç•¢Ó!“Ü®¯Le=.BÅs¹wz]aù[•سQä×à'b¦VÀáæ-ÉÚÄëj¢%6P?¡çÿÎ2ßÿbÚÕ`Ñ CšæL†¹ÂûË_Ð"¨G,(®.ùŠc-¢ã¼'ùÇ,î?ç„–’l˲©;=|Röp-eÇ¥ÖÈBJ«‡wQá¿áÜÕº'dSßBHm|Ç,üËÇ&¿9•†š±fÉa¿F%¨(beø\F¶×°ûÞ¹A|½o±¥‘ßd˜ªØ[§¯n7[*¯ŠK¿¾îº¸ö?+5³Lu†J¨¿Ñœ9±ŸV-µoCÁ£§xÂfçá¢ÂUÀŠÉ£)øä]Z êÓÍ-…›U¹#±o™šËâ+Üw»× •ß;wìs%ƒ3í^rSeð挳S±‹\=/•-¿wø”Ð/W‡·láÞ,yfX)7%ÓjåXw®Çhnr9®˜+Πdgÿœsü—ÌûðK¹`‡ò6°Ĩl—X–;Ò–Ø!­^°‘ÖZ^MsƒÔ´‰›LXæGÀJ AS¹J/æÃ’4ß[Ö#+ sK×¥\Ì*íÞ÷û¢Tj²×éÞcÐVÍÁúž¿`+>.{¶ÿ²"”UFÐG*þ“êÈ’F2†â£‹ 9AÕÙÌë½}ó/aü—⟦˜´…]ËóB¥;>\° Bäi×xÍXÎÝ[mæ7ŸNËv%…õó(OšöWôX‚Φ½ céú;ÓûZS3¡‘½E1‹kÇEù*Bñ23Èu>} ø*»‹qê­=žóĆ™3»=7:íÇŠÀΙgÙç&_„¼h³Ò;A~hæÍöñ`[ò—‡wï!ô{¨}UÅ$1}ë«,ž›ÖPg?á«Ü ¿T†jLÓÔÓ¦‹x"ÓÝÛ.Õ‚±a()‚É`óÌëúA¡>óäTl¨@iÖhé ¹˜_±Õg°1ÂÈŠ•Z`TÜS„ÊMYjè]Þ¦CUÈ]‡€•@Ä ½ ¾Û ê:ø&30 Çí–²×*<¥âw±ÜV‹ªâl爿®ÿ XOkÌ ›²önÛgFy£ž¿â'{‘iÓólb–šgË}™$z¨[¼äÈÝô"2P–&yÄ”Ô$×du[--Ön²AÙ&·lWrÖ^ŽQC »xmX ¦Fú­(¨Ÿ¹ ˆ ™Ùµ+ÛŒßúàN†‰èËÌû­q-g²¾#sÈP{y²05šfiùéÝ8Uñ¥‰²A…XÂÂ)·CŽ(û|ǃ õÂN+6^SA·VyâÃQdÜÉà"ŠÔp…%¶%`øÀ²_r¸ô2]G8i^íBà,é¢~‹¾r‰äð›Ï0°Þ@Î)ûº¸ÖZÙ/Öb A_5E)Lc— 8+йH‡1¸ËG·G9ÙåiðLTÕw¸‚zòeÈÛr—ņ$ô”^D¡íY)’Êê{8TþM£O'pÀR¸³Î¯\ê|EÿP ^“©íþ‚î3ñ6Ú»OŒ¿¥tX©3Å»ó{)#~Ʊ³A†UhvahÆW,UÇê°>#i‚T;©ö ê(Tå1ÚÍ%ª­‚y»4á}QU{eøßÞ¸K%:R'…÷;Nì&QÅ$ ¡±€9ÒÕi#É-Ûò,×…r…ciî®)²n—ÕÊ=={ùÜ2Ž¡¯€õð‹ƒ ÉI6~d Qç' ìÆWt:m† Ty§»äÈ ¨·ùþ+•6,[yv±ªô´Í¡Ž÷Ä~q¸èBDÊËΚÁÿiøï”)Y-ÀÐ7öçü¶îÝÛѧ^DêŒ)+È”/ð‰ë’}ÚÞ/ZóÚ"~Ç0’Õ¼EüÐvV‚b²(›§á)í‡ú1–ÀO{Z¿‚·-~6÷èÒMä‘„DDIÛv£!íå•l ±x<¥û…tó^)Ôêù¤^TT†I”‘3TÇdoñ×XÚ€*^‘!†©#Ë鯉Tƒ:7\a5JÅ÷Lç“躹µ¥©p+ä%øb$ÐãZ¸ , ‹{T’Â]³mFïÐÎ&=jå¡„ôdÐ}nowíŸ^“©·Jï?]8 *P¨‘-êuÍì¶¿¤ÈpyΚ0„[QÂ] fJaj6PŽ«ã}¤ÖJ»Y¸TS$-o5{O†0lN^Œ+€áËõ¬wg²vž£³Â ©¬ÞÝ©[ª3¸•hz? ê‹Ñ±‚@©  !þ<óø¹]h/±4‹T!26ùxÓp‹t€ýî>FÝXOª±½¶ŽE¯ã¤ŸsÄPsS²ûd’×¹f™ô‹mT á™YÊIÂöÐfaì¶Æ&ò6¸îò§©7*’Ï»1ÙC).#1Ï8\²èf ÅR(Ù=úX7Én~+£¯úW5Z²Õ²K¿5¡šÏ1«{ÕåZG|]ã€!b$W-?l'ùÊ‚s¬ÿòó· ‚ó,· ¬>[›ÂÕZs*¼Æ‹Ø×_3hA€ß³©N­jáÛe“5ö"g|XÈÉËÓÙÔÿÚ‹ °AE$Yú{oŠÞœEJ úæCfã2õÕÿ}ïÕ™œ{Du©Ì È+×QPϨ”ʃPjZÈ÷ê/BýoÈŠ øÚ§ˆ=dzÿßëq±z¶lºÅI ~«Œc¤pˆ¯eZ¨ ‰¦˜®ã0Ãê¡–sÚŒe­VßôM6µæ_ (NÓqX[}™þ¾ºþæ#‹•w"´g mv ÒæF¬~·É¿´G½›q`A_mló!ÂH¹Ëá:ìE£B¿|c|pì¶T ðÌì]ÌúŽÑÄàªpk²ÂÇÐ]ëp:$@Éçï“v@.TÉò£r$. ðýwˆ^Fp ÞU‡"­õKýÌ“mc]t–Iµ‚ÀcínœŠÿŸjxÖ Í)<{l__øC½þ_²K(ø½?Á˜¡12(báÎPQ5çX¯'¶FƒŒ¿2Ø9Φ·ÐÜ š^r_’ ¥±±›þºRªc&º04ž £16ž$öñï¯%ü„Ìb»õÙ÷°]Ÿ ï •.ŽÁÜÅB«?¸OHùÁâ€8=¯ÃÄvóXŒU(M¥—W¨ ¨ôV/2ÛšÒ·zó6àÅù £FxåDx·´/+Ûj9²p$NjM;8UŒbV|þ7S ‚üflèi¥±käd:¾¸~Ò˜íH‘Ú².2a¦¢Ùà€ž‡ñêS™[á§üæ(&eœz‡Ò6Êv_‚åqÛ0óØZÿQNT /»ª‚ÅKÒ ðÇÜ,¨ù}dzÔˆ|W ²cÐu«’%L´^„È×LÎÎã•k!Òáæ¾i º(1 \³’™F9( FqMï7œBÍÂÉPå ?w5M-(Ҍ˷* í°óª¾(e_%Èže›Ú‡^KZ`•Ãñ6,Ú>Ú`(ÐÜî‰s¨gf®-’?dX®=åÍ“HNßãbË&Öåå9­h%ÜaœpòRÑkÀÞ«¾6 v°/¹>/èÛ>‘Ë…'ÓùòO›`š GtKÍe³|}ÐÙ]Žÿº•%M˜;†YÝ\èÆÂh½W ½Z<Åš˜0ªÙý”‰ÔÅHždSßÐ)’^]ˆÊv.ÊÎõºAÙ/ç2"ØŸºÖ[bE°º54Î/÷•å)0nwð;z°…W­HšZ9~ÎËyà%ÃÕGC£q’ž,}XàVüÑ·:ƒ‡ƒÀgˆ {~³{Þð§æsÄ8޽胬¡Ir\ãQ×Ðæ¨>¼ÈQŠ$ž<‰ðä@”# Ì¿ð.¾Ï_wöŒÏC¹gˈÁA0fŒ A¶ ÙÉ| øû단¨×àBF:3Ð…ßj4£ Ç¿E§$tjs¯8ŽÅØ?Ô˜E#ï”á~lQ˺q=ã3;ªw Ûë‹‘yÙ…\_ I.qÝ­‘Ä3¡öo“ëk»¦jÖ³²Ú™@§9A±ÐJó_]¤biZÄø`[Y’ŠåòWŒM ˆ25V¼Œñ‡aÍm^"•™QCÆ$7ûFÏŸÐݳÁš{šIH2‚F2ö»92ɧ8\œJ/C.u8™9]jÛ‚:ÓûMÝ à’zšý«FÒº={x ü%xÞÆÊ˜…˜Q‘öªÀï=x,»Zš­idžˆ}K¦‡ÁBÐÆãQù’_¹cIïÜæÚv9E*d¢‡Üýñ³dËB:.ê¢h^¤ƒ}ÑAè£ðPMÆ .Sù'ƒXF5Bée¤ø¾_[S§®W¢æhóezM‰ÁŠJ’&˜½®ÝûšÕ+"½ò\ûV p£—$uteî`ô Ó¡!½›c½Y„?àˆøÄÁTò1ŽBR?}˜,‚5ŽÕqº fø¿Ü™im¾s–ƒQU€åv뱪yÅóó°WßzÔ"u~ÎGÃüÆÐÀ.áÅx©s–©ÐvrõÑ…ƒðã®ÁÃÌF\ bº±-$v¦Æ4BZcÍfåœÅm.ïŽ}iEµÝ—)¹¤p88¬I~ž¯¯Í<‚xb†mc÷#^äPÅ*CÈ+Α_”óQÞ¯Sõ(gÕ_཭а¯Î¾Ê1nµ~iOpI4'Ý:*kc}¿âª4£žì>/8ÿ,˜Ïnè¯Oo줳 ½¤[üuº†6„<àÇà .y£ƒôçWJ¡T-{#ÓlËhB—(ãVÍÚšvK+ëªÏ;Cqƒ0@"Q-¶"Ý!»í—Ùw[v]ëD4)$hþŠ<„³w6ûEnnÖ§pg†zZªñó¹çV?ŸЍAènïè4Ic½”.ˆ©Àí™3ZeݶMòË~¨ÓGl Þì§ò/½Z‡Ÿ^Üó¨ÜÍnµÂÁŽ •o”A%›ˆærÏÍ­tK®u‹GŽ"›´DPéb$d5¼CH|^VÑEÇ]-Þ^š‚ ¾»EíEMðlÙj&ˆ™Ž]­¾Œ„É8Q†ê´V³ ï‚%<8W K¬¦æ’.óí¸`ο*j $ýŠ!CE•d°Æ¼«³õŒêEþÐ.!û"œ"&F(ôÀÏì,Tt)*²wÔ…!ÑT°â™–í‘4‹!÷x^rËì>²l›5Q¤fãˆÇÁ“ÈŠLó?¶ì¬ÔèKêa©ðrJr¸¾‰yf=ß*!ãPÖ:ï –pÑÒsël^tȱ,ÕJ˜V|ܬM<ͧêAÐ:XÃ’Ç×£™½¯Û—p¹nbÂüZº‰‡™—†Hl(ñ¾ª‡M _¦ýsÃ…vþ5Á‚°SëØç{Ô·úíÙ ä—k tßœcá'»¹9¸Xó3ñÀƒ‘Mæ—­ä¶NÓØá¯sšáUèã\½Ú”^8¸\·&²œ¦_ä?ª “±ïÂîñâ*å8¹¤K` óW Ðocól5*©E¶òhøïÌæeÒýú; Ïk 6ó†`q» fï§?{­–HÔGÉÄûˆ¾,ª Hú“™Öo tcѧÓêJb5yêð3Ë•E7Ÿ+‚®Q.•¯Ýhù)¦Yuj"„"Û˪‡‹èò·Ñ,HÜé4GÅvºfãÍñ‡a° p&–™ZBªA´Gæ¿ô`‚Åý»wSµX?“sŒûõIˆÖ¦ªh¿`ÀÈøÏþV©aœ!̈Qr£ûÕÄ;Ø¿WÁ“^ú‰ƒÊ»°oHœôii…9Óš*°Oºûê`èôEBü©¨W±Óml<±+* Ѐͬ({³îåÞæô mr¯˜‚‘±äÖ©iò¶Í«†ÌM1»ÃÅÆã¿ ¹}_æ ÷«UÅ›zÏsî\I[ŽìÓÿ ß‘g^O€*Þ·xŒÝÚüv{óƸז, _ñÄU¿g+£gCO²dNQQ*Ãá=4vìZùHºš‘®1¥Âëk¾Ø(Üv•Ë/ñ ‘S~Î&GïææòwèW=‰qש|y’Kã&i6:Òθ›à59$§L |q,goÞ æ½Ö…j\BI“à=ÓkîÀQ Xݦ «ÑU×lÉPÞ*Â]Á´º·þöÈÈ2à£0±>VoDKPÊó=m<º»öñ•9.8°b •3¹Úbv1?Ù:;冑%í–~(Ò„ÒUÚ«­r TÖ0–"ÇV̵»†r¯D‘V‡Ò6—ìcÔ|[ :8¸wL»’¸sT`Õú“DgpÃÝt1)ëGïq ŠÏ®(OJšr¼`/ûààÌj­qjLoÝVdÛ–h™ 4ShRF0hÅÆüÊ׎)ÝØPNVIm r×Ð<­E“ÓO¢ÿÅú`ÿRòÜ]ÑèKçw¾&¢ùoÒ¤“^Ù.) bªåjM*ÖË2]œC¿WAYq`ùë{¿‡¿­NŸÝG“keÙB8æaÜÁ@>©L›–Ì$Oµ¬EO¶¯iØÀ¡3Ÿì¢œ÷ŒeàfàLñ1k,Œ($è[bÁÊf¢ö˜AkWO’.¿Û’)%HÓY*eêøq7\­5gĽWÄxAªÓ’ßó«ÏÌlÈÍ/n«è%›Ž*¦OŒÐrQsƺ®5iªé1ïú¶ÁùÊÛrZ–àã#E… ‹œÚRîë5‡œ8؇ʂ¬Ÿwþ¡mnô„üÏɾÄþýô;ŽÈiQRee7m» ¿˜1³¥Ù*Ñ{cåCDø X88…^X¡]È©æ‘íQ[Gh½‚ôîÃq¾%ÈÁœÍ‘ÚoX>1íISçXŠ ‘d6ZC g¿³ ±¶“°¤É™}•£8àñÈü(眊0ùæG'µÀ‹™ÎÿíÊ& ËKMC ë96yNTò5BB·1ó²™yíeøM– …ßL “ê?6òó¹¤òõ,®×ShF^>Cí=à„dˆx•6GëÜâßK4š]ÂÖò-\øÁ];;㉀’²#Í{QCÚ5Z$j•ª@Ü©#ý'Ù ¨A?âs ‚|&Þ¬ñ¥>³%=“È{:’ù»ÆÍyʲ’¥ÅäO‚6õY8ÃbµþJâ+…=¸¥Åìrì²÷ò%üß2¶U~Zà&WÐÞ[¹ë‡rßÅBäq çxÈU†;x{ùU>æ}7…`o0'ß;ýÕ—GŠZüžGx Á¹"!ÿŒU¯âÇ5ë/¶ý¶µ”ΟѪŠMh{˪æJsx´ôÀé N|C åѯ•yx¹2ç vó˜»&ìl–@ɬŠ:§qb¦J0ô ' Îô>Sžómš[Æ£ÀöUˆ5A ºw·«fÎJúq›‚³€¯£yój´ê“~Ý ü>lõÉ,ho-óµýai¹Á·:£ÂTÀ뺾ô£šX{¥dþW€q^*³§I´6BãÛ®08³NÈV˜;Ç­‡iÃãÓç@d ½[‰þøÚ¨r¦¼D¢¨eHxaM7+7Ëò: /ÝWfae8hº¹rówÀŠàB÷Ý?,³›õ'ˆ!°*L)ÿ_Ù‡ ÿßa-4\þÆã.,Û)ØßUé–ååm7œe~ç#¹´$’d —1ô¥5ÀíC6kë­ÊÄYg¡^ÎC¶=Žýž~¾ Ç 0ÝߺÚG­þm7Ô¾ìu#NJ½‚òaÊPPÁ&/ÊîIžSVwz.®í¢-t:cÒ¦Ø.Ÿþ|vÛu¬e(­è3ó—$ÅîÒ)Ç#ûÅC§ áü™ÇéÔf&Ôͯï³ÑÖ·£ æôdXS1Ñоi:PÖÙè:l@Ù£ÖŠ`|óÌbÄËZ(‚¨ÜþÇ"Ì™}]b£ŒöØP'Y‘œï--Ãi ÒÍÝ»Ð>¿rwéÕrw¨ÜÒòaÕ´[jHî0eä4ÉhE!Ó!4¾Q·Ù$l’6å£Ú—ïånI{J0©¶d¬î¸I­‡2 “†‰Fmµ²{[M¸Uf`et#=ëC@c åÚŒ è!qšXí¹Ì%„ÞJ2G*c‘ ‘æß@5TðCWÿµPäK1²'MËX拉òǺ’M£Í¶ñ5uXÖW9¢ÚÕpýßwÎã3YeÕ&6Ò'8W ïË+÷’fô¾j¹¹]É®}xŽ; ŒÎSßfj'ZeÔIÚzuÂ&ôR¥QPkìj© fýAKüÛî¨W`Ê$ñ]sž=iWô æCýÎ@¨«—€ ‡ÊV(‚Å`*•‚œ‘Ä1N8ìÀß©` =œWØáÂ_ÇEÍ9q¾Ô³ÉÍNý…L€‚uL±ÅÁ‡áM^yšÏÝV){lAP‰Bäsù7¼\ÑýN‚28‚ûwáõócäòï!uͦ†ùYBB+XSÀ¬`\*©ß†¿Ot±5:µœ¤Ç¢3‚amÑÇÙ—‰Œ.Ïêàn‚Ý)y«naËþ­ù>ËGI@îC£œ[ןA‘I:5ÉÖFß,´ËÏÃ8Ixhù†8ñS6`þÅó{ñ›=P³d"îÂ(M¥÷V{çöÜ^¢nÙÕ"rbóçCL·ó>ªMŽ»&â /<´ÈÍ`¶¬L]>õ–»¼‘­·˜äš]dŒ„§ç°hÂ_H>i#en’J±™¢‹ykÔl9ú7.Z¢Èõ†1üæòàPP(ÂkMÓ2No:õ~Ðõ¶®>uNëÅJN_:|ŸªÇF¨N”^Â$šºùÆ·=°Ào´•›(9WœÁÙJÕ›dïƒñOœ`M³½6]SÖˆñ)ãB›Ž’ŸKXHp÷ýfÌ‘Êuà€{ܺ8÷.|î3Ï(dv"«ûJšÔã¤%HŠëÄoÑ Å1÷ýÙ—’2p £qηM*[Ŧ]”Å`Kñ*­–$z9Mu/ÎXˆ)ÀdÑ—¦5É,—ãïe(rñm5.LôLèäÞQîˆÙϦîêãc?Ò¹Žƒýt ç•Wþù;I/îõiþµ³ŒË·.¤g?áJ9‰É¸MŽ7€õOÚ’í÷×ÒÍä ÚyzõÀ…ú‘š,Möª'g#ŠÈ ‹_¯i©•ùÓvd› Úg2n“nÖÒj[ÐwO Û?—Šix†µ}XqšCï{„\…ÏfI¤ Âu˜}UÚ89|~›wÚ†+.ò U”í) T"ŒÔ iá¡Y« %µÄ=·‹Ü»¯ú>™P‘L°µýÚ~bLiÀßv¿äKWýþæÑŒ¶×!—2"µŸ‚4kç7V”Üäža5 û¹GPÊOðŠ%¶²BãmoÉÑE.ž<\A £ör飛 ÅiªH!•îIäçX‡1À€ºWþÍmP·Þs½¹w㘤ŽWaÙ Ðó³ÂVu íœÎª2NzÅ5YÉ—{’ÉÔMƒp©Ï.É´´oä½Ñ¾ËOXàÙ¶@ÖÑ\òð/î[ºz_Öñÿ–§-ˆçNhõƒpoôI‚às[LžQY"FÓŠs[ø Àì_CÜ’³›±HÀZ2âì»ÑgýRáû ¬af3ý©ú¢váD¬OnEv ñ-iE¯µQr3ê˜sZíˆu2ÌÌAÍ,mrî4Ÿžœêé•3e°»#U’zÞ39h}©ûñîô§# ¡ç‹u2ø ÛLpÚ„¼s¼Ø@`—^a·ø¿è°pl)²!I* ?õˆg1HðL ê² IÎ{@CœŠŸöº5Ï@½¬µ™«ÖÜc³Ñ%À€k"{F¦H¡QJ¼Ä¦ËÔ«Š&Ý. !•L{ò¹X\øa>1¯eE[¿üzã:êƒ\kCÊÙjTÄ.l½6SVI½ ÀM ûm05Y–RèÅqp•8ã²áêpƒ¦#8ߦs}þ=‘q½.M£¢³6¬ÁcATþ¸a+E°*•bu2ö£ÈË‹cÒ.è>Áóî|Àò‹GdC¿ìÂшÍK4ê:é" E1«:œèÃd’é:ÿ'»Ú†¦´!œiã>ÃXp òzÕ²¬ãv˜+2©lzSMFoµïÉ‹FæÝ@¤œA·®ÃžœùÉZ"eÅò‚ذ¼rÌIÜ$|޼KØ4-…åÚЋ%ß­þÓ&T½ ¥ßÝÂ¥Uáé„‘ð‹˜ÉW=Æ$ÈŸùË0m…~Ñ ð®ã³\m$;ë)a¾ÕkÜ ß<\×' «—_9f jÅŽå˜ÑDíQÌ>9>`Ùá<Š˜‚Oå[x‚Ö£·$Ùq¬g'/’SwÊQ¡BÜæ`«~;+E¡ý„i‚ý™¦ÂüO2ò`êÿ_Lã >5J‘ßD# “|‚òQ¥–=xbü$ëËA¾q¬mfº qCÑGÌÓï}ÚF&[éIcÝÚœCßAGNWò‚¡Þ Ioâ¹7KàP=¯Õ£Ænôô|îÖÃ,·v}·Ôß{?YëµyŽºˆjI†Q˜Í\æ(2ž%âÀ'”Z,,–ý\ØÊ®6:݇ô±ÝÚïxôOeÛ¦Ý!ÒÒaòæVöYÆ”ŒÜ›'º›Ë—¸ÈÞøÆf!uJÅzİfŸÉBtãøn2t©¹­‹Ýv˜xÿ^nõ’Õ#kxî.¬4(Í1# ®æó0&™ëB(¡ bã¾ø©B¸¤¸ÀvâÎFT(]"sDŸçÒºÓA™$®ëQýNöC¾žÀ}g„]ÅíeCLÜ©À¸tk¯†>¤’ð…lÜï„ÌGâÅŽ}õ¼–é ÖÃjÂ,7ÄÂ_ÿõ\öé|¨{ºÈ·qŒ4L»W™Ë_A’!IKM¢ããúI¼„Xk@-±¶,u^âì âd÷iì—BÔŠŒ„€Ùåÿ÷3h¦0Šªœ£ #*\Ço7C—LŠà«4yìÄôT'Ã;ŒYhðEY°­vJ½‘€× Å}ÙÈ.H])Ùêp#H­G#AÆ1œP kÿ¥ÖIGÛ9ÃEšú9m6oÊ®¡©åñè«yÃåóÍŠ\êƒ?´n8²=·_OÌŽ7~˜Å“ ®J–¡žñu!N³’ªÒ!Ö¨ å e¦–±7JÞxʹ9VÞ)ŸáeÚ¬‰ÄVóØIXÑMqjåÈAê·n¼aÍÔËß×3,•FS-„âðCyQ cÛ*YGÿR¹çúÙàù@ãœÓÔÛ¶7L£÷ñE}åwAåô¸RóNHb+mS^q€{E¨ñø§j6{²êƒ,¬¦/¢þ½¨Ø¾bź×n©xÛm]ZQên%³Ž?fã=  vð¼tİB«¨*záF4løuN³Æ''´}Ðð¨v…äøó4êh©©ôÊfø9FÛ¯:åoåuF§N84Ζ `91T×M¨îë“¼ß ­•ô}Òq¥ïvÇÝÒëºÞlTê“m‹1æŸQ§šsÖ®$ÁQ®è`çí¹6.S²£‡fB‚ŽªUÇꎟenCÛà%6ävº{—Ϫ–¯u°‡µ}ã[ÁËûÎð(DÕ o4Þ#5bòn¥…O-¤³Z½'šV³[Ü2ëœ{NÚŸ>LÀw6¥¬Ô¸ó)õ_|Ã")KçÕçSúƒZ.·÷Ì|É¿£Ü-Š›Ó!Ô0š»0TB*n8~’[‡ $¸;€æã,™Å8 "Ì'“’ÛÒÉkN.å¶NÓØá¯s«yd[bñ]9òE±w0øÃo,iÎ^‡3ù íÚ#÷P&:’ȈŠé7”CLcQ. %tÙ­éêöK®mã¨'u‹"ÛIòHÑzÅètÉq#|ñóÃ.[n 5HŠÃ»HÜÐaA‘B¿¬pã&>Bei/å*– –B…CÐd¥|>Ó˜Lùgí'©‘!÷A/*‘{—© *·é7‰Š.Üš•ù6¼çµ€ X ‚z²atñÄcË{*A®ô:ο¼È Rø”€l¢ ê‹«ìßüþàZc3]ááW«ÈQ$fÂ˹÷#fÀL¯ 5­Š|øõäOýݹbbÇïË6 d߉BjMë‡î˜î M‚1 ð¯šo‘Ú|+T£ÓžÈ{®Mæ J®ýÄ‚µN¥#•Þx´¢Ic„˜©¤y|Ætz'…ë+[÷~7;.X"ñ(ASU`%ò×ë ØhNLXɨf Ç\*!¸¾gM ªÿQÔ€ÍT{:!§íäg²ÿЇÖK‹Ð™¹'˜/§oÜsNS³ e>Ö&<Ñx.Xa ç›ê·Ë»~ÛŠ«ésBªÿ@yZNBHBY<6®öJSÜfE^F%>¸¬7ìcÞ)]^‚ú_õ!t~t–ÅhjªæZînB…sT?}K}ÃqƒgÅŠSx7׃Î6( гÒÎÃÙ •HÏRÏ0E‰Ì9È:ÀtEGŸ€„S¼TÐÇ OEÿ ·Y>.úª:ÈÙÆTŸ­<¢ùĒȧnqêF>±.M<3t6ÛXø´”#ÌžúçU‹¥?Û< cýÄì•N™Þ$v d‰š-jï@%…ó“(Gw„õ׋ºB" Ü7[ðÅg¾®{÷Ò|ÝÉÊsM_õvF` ú‘\÷©7¾±H.«-¦_‘7J+rwn#<#ý';ûWMMåAþMgÅìcä=û;Ú£8£àÁ“w±Ul¨nÐáFÉhÇãŒÉ¥UûðŽÝÉ4•ÐÇ67~|Ëõ›çÍZdö¡ŒÑÖ>\6 N¼’ì$ÖU™GuS¹g+Þƒð#*«sÙm+ÓZkÃ}8Ýâ±½ˆMÚ• =KiŠ¿BF/RMË©ªß™°;x¸¹è>7D=É,•qt1(ѧÝu¹§ÆsƒÊãh¢ÎÂ}Í5â7X Lš‰D«°U‰v`,xÔöî¢:U·§Á¯J»IÓyf-§&‘J»˜}#NPÓ?wU{Èraî˜@¨ßÅÄÅàå‰ZJ.Œ!ÞûùŸ½¤­¶•g•€–¨J184éãIÓ:Y>çÚtb(ŽÚ`„ TœjöšÒþuA9Õ5Á‡z‚y´ÀW> tµC¿ W$¯Ù˜R”gÜûïbl¸´Yî{-šC•OÜ뤟 Ûí¼ìU™Æ‘7þN³Öz%žï:ZÞ¦@Øß‚Xô2{w£œ Ž’l¯3F7è ‹ú®wiìª!ox¶ ßt²€^3óák±ÒÿVц”¦K1Jm6F—)ûì[ ¾·ç÷ Òç”~OaçìgÏԼ鶚YVr1}‡Œ ,žº'‰ã>ÕŸ`°m¸BÞaj’ÀÇeS‡Íô™!¼ÜΫíBw+3*«Î$þ7k¦d*ÿ‰ç¢5ú^aáXs"vŸíäBÖøîDs‚¨üÜ,»[MóÛ󶳘ºÔíŠÅ4eÒ~@Î_…B:åqÄÒêŠ}T¶¶póõïÚ| GhМÀÖ$mHÏ7oGó꜎Ä(O¡aGXš-=­}M¬¸‰^\Ö +ýhbuܨ{NÊ垃©´V°´§Ðâµ1Õûæ(Ñ™çqzW‰BÂ&x™rneƘb4–QN UÐ6€ ð{Ï»Á&ÁBâsŽpÁ÷ˆ÷ò‹JªjÏ\Ÿ 7ŠêÒû^ü¼Íš)tzÉ×VsCÿ?Ó‘^” q9´cV ¬ØÉžx¨ÛQæ@rV ׌¶ÑÍÊ´îÏ}ìýx#§#”ÿ±“?ªÁñ¢9¼»¼ Ç@Š9^÷h…ùßJX‰9û@6$P¾f)>]M! áõi¤ÀèžYUõ¯ø ¨8Ôð>M ‡6é?+e?×%‘ž+`:éÏf¾K½Fè\_púyà˜¿Kä¥{Û9ð/hÈÏ=iûy…BÓT\;±6^FÜ`ÁÓBÉC"î–üÏ’…WoOGΡxj,ž{ëCßXf8µÄŸVAéþòB2B}[B=Ë—×vÍèD¶‰F>â\-4ϯ¨ Á¦Ëôn[Šß|Q.ã锩-VM­¿¨3#¬ò ±™O9¡ g´³-´«ØÎ÷ ¹Ñ¼”‘m^ò©—ãu_Î%~… ðØý‰·Û8ÑeRÂ3;Ä¡§2a•_<„,ߟéÈ¿K«/äò¶ëe ¸Œ’ÿý3§{ỡÛkÎ3jýaJ˜oSJ¹ y¥˜¬Ü4ËÛ/­tHîÓ¿´Kð?ÔW ]»˜™û=ñ‹7\€%ƒÜê¬8>D‡ƒ[Û}ª“pÎÓý⧺gC—cøÐôš"ÄŸ•‡_4b+±ÛÂTAž6Æ6¼2<v]Þt)Þ¡P rWôµ<e¿UÙXÐ,æß‹ç.àt{¸…ˆ„õ8C· ÄI»•,wÿK¶yO7ð­ÅêÝ÷h‹œÑ1·ðKˆ‹k@‘oAmù%;CíïÙ°/쎠 ²)^à_!¨O‰`]ñ´Ú×w†Çþ´P(U@è üÊøà½ýÚ³ÄN]%âkæ.A)ácÙ,–‘…¡âÚ@ö՜޿V¡¥`ç(šúbÌóﲎ”¤VjöT©ÇÃK|4ׯ1ÖkªHëåFüÉcÓÓ궛Яs±â¾?ùµm>èǼNN)r0‚8Hú«åPcNWQ(Y¸LG`Ùà ™øbqïMÅñ$ý÷AÍ¿7,Æ@Ï©÷¿-~Õ|1dv;°Ùõp3Ÿ¸“?'ðöOö‚¬ŽÞÃó°CQS`S¬ÅÀÿbŒžëq=¼µµßÙO™óPþlCF9ø”Ì\¿‡nNßi5³²â»W%ñQ#ÕŠ +M]<&¡(ã®[gÌ݈LPzZ7ýoØöuŸ’zýŠ‚°ªxIŒà™øç ±°ˆ½é ìpOŽ„èáVé`¾Õ³¡VÊùbÖ ð0iö &†=dÇ&Ƀ³7ÿ Gö9‰Ž =ÊøM oâ›Ú«ü±¶5dv›ìöÕÝ’¢ˆL-´c•-%áSœÛ&dkŒ\¯D\Ó†ÈW÷aÝîÓ|*£p-Bíϛ¯±K Å 4êTŸ{…‹U­M`…í³e.æ)òþë2Õã¦n1y’d¼œV_n/&²7d3ú4|:ç‘®5®Ä͉$Y65âªZzÄ„kÎXxãNìþ쉥IªM³ÀLTd`"d%ûs»!ëƒ**â_Ôùñ£g%óõ.å·1¯mW°Pœ¥\@úøÅ˜RR8¹‡!åï2`…òÙ¦O’¸ Í/ø…¶5·‚ÛÅ™îÖÔVí˜{ úLƒ¹g®Él“ø¥äí>k½a£Á1ÂÑåg‘bej^£ExW|ÎÑŒÕî ³÷ݲÁäqÁq9aÓɶd©¸Š ‡f–$ ûíw°Íé¤îkzss¯¨,>²Ýoÿïÿ’le2](—@ñ™n:!BGÌ(JTZÆÃÓbƒ3¬ý­RÒ4Œ¨8³dBÖ›)k€æºæ2ãðXÛCäq”L¬©fÝÌ}¸Ë1¿¬G0†êëhIÝë– îM²­ÇºÈlªªÀŒ†-áøqÁ#÷W:þi3­ó0õÒµÜr')håË|ºÔ\ØD›×­œµî€©LA­8žg˜ÕS§A¦)ósÛ’âI›G9_6B’'âtÙz4…=,ÏÓ|­¢ Ñ~ü ."¿ÕH¥Y| ‰Õs¯…H-öÙÁd»Hå]«ý³‹ÕEóáÊÓ"¯¨DˆkJ?”|±QAš¹0&ýïToš¾VpJÄgèVÿ¡h! X\W{í':ËkC âK9ç;m«ý¡’öÆ4aQ´¬HƒWo½?ⲯšßs aÔlà:)‰v¬öUÿILx7û…±¹4mtÇV¡«ÎÍGf1Pë¬e‰ÈIAóeW[ì žgïÀ ½+…,KϤ+ J¹ß™ãÞV#èªÖ—¾%¼¢ºž† œ—Ž€Ý¤ˆf?¯‹!P×h8¬ó˜‡<Ù´lÙ<›ê-Wl«Ý‘¿<ø6›ÔÃéßàap‡ë= d€a V±QÁ_‰[lšÆ?ÚÉAñmv ÎÔÑ~„KÆ¢XsÄÿƒñµ¥[Óëöåešú#p a1¹›š’¯1æ€N]ˆRJTedg¢zkÓÀý¶P¼wáÖ‡Òé±w¥mA@ ãŒš´iö©Y}/Ùq…ÈbkìƒñdÁ6ݹO¸n 4,HÙsÕÑÜû›$QÛD¼cÅå _gð]_hiP_К&³%¸@Èþ—áÊõB†e»ì¾Çhš­E|`_¥±D)™gdŽ¡oYË(¼Ñ¢ÀwÓÅÇ&{ïáôc7ý#KÈ+ƒ kWË÷Au®ðÓ­œ0§Ÿ2‡ùÿg?C¥¶ Ÿ!ëì.=y»ÉJÐ[Wb4â8ß“QýHöiz¤SÁ,I¢mϪ \÷i«¹9”Ã2xý"J§o> P†•Ìzü ö”šCd,‘¬Î ,füµ8>ÑõÐ|1mØÎ8¤îä)Õz˜©íp5{¾­ûÐøäÓâÌúÌ :÷µK¥¿¹Û0T£ŸÖ‘=ØÙúD3¶%i¼5cýŽ)óêÙ ØzöäKKÒÝÂT'×Vó*¿yÍÏ37a&À¹'Fè&§‹W–] #}äVèK2NØ]õë eœ#¥BÕ?#Ž2ÀÊ]ýÛBïEþd-üƈyªH¡ÔÅ·dX:™Ö¡ÿÛ}õiçË#ññç“åaˆ-ç4Úw—±-W'kmøYÑé"×òj8•åç‹Ê­TnÆLê–‰+ï‡ñ³%#vnÖÀûœˆu¸ œø'µˆîÚËKºïã`1‰Ö;¥O°2Ϥ.R4ÍÑÚ |ÂjГå sÁØ<”sÝö%ïx^…®ÎÕ–²Áê‘€º¥L Œ£ì9c^ØÌÅAáÇ÷ÃCËþ¢‹ ¥àn>x㬣ӹsubó$5l鱤úŸOj—ÞÒuu»× ÓS©›Ô*ÌkžâfûE” •÷»^DY¤`+Ý.¾2£6@}°n…ì:ù€’1Hf2d¾6ANòünþý­7—•Þ\n¡ƒ©¶Ð¯c,(ÂêÇZP¶ªaC¼ÖoÛÞdËë Pʯ|õ9•Lç>U¶0Ù¶ñ"Η‚¡]°{òÇ’ ôGt‹?áJL^o“ye^±C{ò†ä}Œ‰˜ÊA¥µøÐeÏ]÷„nÜî…â.–„Sœ¢D¾³ÞöGÔy¤Ô „È­¾¤1¤»TkÀþ ûSÊta[à|,‡­g ¡š´ lºÉ»ðb„šbà9‚°ç)ì…H}/",ß…–ËO‡ö±&?© O" eú…RÚ3.÷™¥²šçKS`{ T âÌ­§17*×ónð“lÛ',ŒÈö♓__ÿWÙ.xú޲ÐMCpùíCÀÏîḆE¦õjÄøúݳ@ã ;>P¹WNëUçˆL<'´Ž&>l˜žÆ£H””‡¾OJˆèXYï@”ÀÛm'LÀUª”dx·‰sàdŒuú Ft FÏØ¯¼û³ÌQ­­I;OoP±SýHa²ÇBõÎÄî{TÍßÓû0Tßôo ˵¯,]î}öxd·{Èè.³þf]ÜÄŽÈ+ÐÞZ½ ©3cª-òDM®;æT£¯d¢g¸ÑFß±a|ùÊÈ?ïyaW?ëæ×Ïà–V´Èz»â1xú_*kE™ñLï"ç›å¹ëÐÂð^üH¬).jJ÷nÑL´êoÜðs?L%žõ-r¼É£äÂß'˜?jÿ¬¯WïV¥I/tÊߚ؅[ªë•± LcÉ-H+³#Ý)#fcljÛœÉË ¢™íñÏ&ša®ÄRÛ=Ô W®¼²ŒäwH9u|S¾Ò‡êÚµ¨³$®éîøŒÁŠ˜èÙ†H°zbP‹êúLgÉ)Þ²Ìîï=ì?{‘oÁk0mµ9‘v¦èxqߤ‘„/x>(u…ƒþ$u’.V×n nª­¹e¾ƒ’cmò˜8Ï2ý:üTY]Ë*m§XônÌÚÛÎòÛ‹§ ”¨ÐþŸ~«à&*ô•‰žï˜i@¨AN^ã8+¾ÑEM h±ÇÛòhëÑ‚‚ÅØÇg 1ºœ—%!V˜D+«ž»uõí&Sײ¹õ%NN2¾¹Õ·W’à‘ÎÍŠÁ—2ƒBÛ¯>Ê¢ÿy¹“öµÒ©ê<{¼âhö¦é"dNJŒ…9öÀ½}®‘՛ɩm“K*[mû{ÐÅ‘ìÒ!£®¢K“i80ÀÇúþ®OÀ‡¹x€dð;øÆ;UŒ»M/ÕCk ¼ßÖ<7&gqz[ÞÔo¼2‘2¢áå0R=hv@üÇæ|”eöÁ+å&xOíŽkU:_hº&–[>ì™ÿ`ˆN_êq‹€¹“ãçë׉#UÔ¸%šñt¸ o$3¼ày,§>ô\q5à ,U£¯œ:ÚŒs•_~áÖ!µÄu ¶¦œ·–÷Ñí5ß!‰KPZW³ÚÿöÌ kÇ3×G`E ÓÆ¥8J@`7 Ô ´1Å 3@)€ÈïÂ/@ŽÉxÀâ ê¾2¾pF6auŽÒânªÄËClT_¡4пðM­lTÄ4o+4n@å.×0黚iݳ¼ßìë©!hœÝêÁÝÐÍ|ÝbSç‘‘ óB_zÔ­]‘EöS˜ ‘¸,àÞŠµˆö‘sTMž ޡė¬FpÅu&ªƒíJ`hfÏ+­ —Ù¿´0ÏËã–·`ÂTôÕbñ¹Ó5ÛèCÞuÆŒY"ËGcñšØŠgr´ÙMݰô‚çéÍÈñúÀ[ÆÞ=]χ'Cã,EtŠž …~Ъ99•/'ðD­6w³jœ‘ÍBþÝêª3]†fó×HúNÓ\ÚÎ&¡-‰ÌÌ Ü m^ˆ+%À‰ãTšé)ƒ»¢hI”„‘àô8?w–•É©iDÁE“‚åB§ížC*…h÷󸵵𛞢Æô>:€%ž&‰ù¼_Z¦#T¹·yL@!æU錷¸“à Ÿú¦@­MÞ e¤ÅÒ„)°×Ì&ŽÙ˜ysS‚(N«Ð¾Qðµ_Ÿ>Î&ƒŽÖíNVÖd0 4󔇺Ð*¯’Ž"ªöóÔ-O­P¥bõs„MÒ!Ȱ왋DÞ®<õ’É=ø7ÈP!wîç¹{m”û&“G^žä—.•¿¤´uõÍ™²»ÝjøðÙ賦™¥Â,ˆ§ nQÌï]1žá& ðg mâápn_1hóò%j×K_ZŠùv+‰Œü (E5…+ŒÙÅ”ly†•KñÓУÊgÜ®Z%ûšvœ9afŸü´ôoΜ+…hË7ÿ|Øgn‚ÖrHøØ‡4:vXÒå)™Ì5s·ŠÍ—O$÷5UÓJÅZ­é©]ž˜¯ÕPmws->ý(¤Ÿ)˜‚8 f·ïÃV\XÜlßs­'%8šzãƒ-<2¹Ñ§›MãšÔ–Áåâ«¿n†Ûl­ëÞÝbE¸:†ˆ–ç1~qôÏëR\lÀÚ×ii±ïž-¦§ˆ.ä™{‘Ätßá¤çïÆ³ËMk[þäTÿÅAì.+†žÎÍцzãI®¯æ5Þž¨-¾_É=HÖq¢åÖÐÆ/ @ å=zkfÈ0óXuLTð"öÿAÛ•†XÉO|ô f±gÛ"‰O“Õ^ÇþUÁ?Ú\jv£»£ÔæíÈ–×¹ §øI8)©ï[%=›]tŸÐÁÇŽð)ÓH}÷Œ)ýÅI$½Œã¬¸'?b‘'ÚÚXEü M¥'+±9ƒL”ˆ²aªñ›ëu–GX~4º¶Ùl¨›èMŽð„õÔÁýæKæÎàÛ;»YöZ‡G³ªj¸£pѹ2âf8Pl¬7˜/ufÐKÉÌ ˜Ñ`]̬v§U#OŠZY=´‰tâŒIòVŽ'¨HK.hf…zkß.ükí=èûþã”D–®ý ñ¿É¼Ç–‰lnû¦… |n ö+ÑDÕš¢:&]Ûã•°dC¼g h1­3ëvZàœœÿ{»·œë‘+Ù·B@DÀÚè6Ÿ.NSPuÈnCøà QHbý5•8L5èðDêÿÎT®.¦¤Yƒj’NKÉ×,N$¿èCÌ!,i}‘úcÖ ,ý)޹PyC‡)ç^“+Qmù Ûœý{eQm#ö×ýï$?9w¶To7duÌÐÕøTØ=e¸ã mÎeBi³Lº–•v„øm“ä9Ni+ŽÚ±<õs”•`Ñ¡ yV6'`£ã!?›·ð›«<—Û«ÄÑh|_ ¼Ê‹¦_]D×鋈ÅaLUC·þL–ŸÏéÍ],ÓL1L¶Þ±“ÕwƒµÒ ø’® f\sfNäˆ8æN3¦Ë7k1a«DlðÕL§þONxâúÀÝ^VÔ%×L0~¼Ý»&[ÌåúÕ¢ÔÊ—õÊ,éåYÎÿ´÷ÍU[ä8赫r5”ú3GI6ËOÝ[½ípy¶½Ï|õKºòÏ*;™ŸËYVåyÍq«&10‚³íiž€Hð»¾á'øÇò ¢±±ZAX) i(‰‚n4öDZ’„¾bþLô9ȹc–椋æ¿åX}w×”n‘c憡æ©7`5˜Eñd’ô;ÄXŸÕv£%°™*™¾×˜YkŸêÅÆÐO#5'½9ÅaëyµET[¯VÞuF²ÆÅ›õ·P¼‡ €×ujÚnИ/O'¡Úú+·?c”@'ŸZ^i½ótˆUÆãh–³y×þ’"µ C¥‚$«úÇ›ò –† î0o›ÏåbÇ­{}È!uröçëC{/UËJ¶Ç›bÉð·yøðjÞ6Uèì¡ö|¯'†(Sû·ÐÜù*®:µ¦åÞd:§ 4‹x‚'öž;Ø ü©uMOŠ÷åqžbü6 0ù¼ ‘F Šm·/{ˉD]ÏÄ,<€K›¥·˜’Å3¢Ÿi´e¿dhG‚äÖØó7n²ôŰÓfÏ ÿ$¾ Ã]Wœc‰Ç”µdj¢mžgV• ˜àßu8Mç‹èrl-§Q·’kC“ D¤ö䕯úB¡º__®æë`óç”;ߎ­ŒË«™ª³#މO–.#6†Ë»“n†iê¢!=.7Z7EK‹Žõ°@[Ÿ ¹@äRŸeê oO?7¯½oAŽ0f£Ð=ÔØw" 3s?”Uн.Ú‘©âCº2~ÍËV97ÿ0VZœ2ýˆOÝ}&N”’TGƒ®ÌmŸ/ÐW1¹ã %#ýX({dÐ{].Ö2ž¶^ÐìVoA×ô” ñî˜!á›À®£û‡Š`Š÷yäÈÄŸ'F”‡$wÞyØÁ9µÑÐ2+ÆøÎ’5p`(øêóRn€¢°!Ç茷øJ <ø· ¢¦õuö³hÃßC-!z †÷¹|OùÜ¿˜y] þŠ‹¢:æ!ÊwÈZ´°Q…~ŽAìeÔsô‡ÔÁeñÊÓé6M-:Už©ç¨Ýš…ù¥{ð)B— \óaÑØô]a…Uà-Có%zˆ±ÌÔ¬¼óŒÄ¡s©­†OܳJ ÔPð!d¬„¦ÈT¡;Ÿóçl6JÝX†iÀY~”éÈð¸âñå àðõ (üˆ:U ]¤aøå;K¤’§ÈT}e—ˆÓFîâø=ð¦¢J¯ªL&[ŽXJL¥°°^žA]n(AäMɇ=fûº)g[€Î…ÀÕTæŽ}†scäáoòÒƒtÏ­V(oUïðV^ˆÜfKþœÛúVÃñ¿<œYdÂcÌB@ƒÂº›kBÕw'Ó‹žâSó”yž°¶›3¶M3^Gø@¬Ž ñ.åRxh§ÂïÞ\E?g’ƒ6ŠŽ}e4<øÞî–ÊöŸºêW¹Ž¯ Ö|XÎ]¦™¤>†Ä`ÒOj0ÔZ&ÿ³ ©¨/¢?ÎL¶>;©”Ïi‰3[¯l½ã¾½Y²ëjVE¢å~ˆ‹¢_Ž’D½SÊj_’À­ÇÖ´éÝÏ—~ƒI!m~Óψ)ZÑqxf $½RKŒ2M9HÈmuês`Qºµ•Sw,¡É²<Ô4LßûΪx©d,é/™ØGfë’YæI17C)‚a „Ñ&lÁk ‰™/ÞŠòøpLBÖŽ?©Å) é‘j7ÿî3p˜oCÉ»)Ûõ« –÷a²¹g™ä˜¾†mÔÝ.ó¢”þÇÚUÎYÜ®]§„­ÿUýÞ~#ÑýÄsSF~t2À2E‰½ÊžT!(F wêTZ ì-,ÅTÐ w¢œÂ~‹v¾KtvJ·=‚Ÿ9ðSà2u;y=lWåèäy*L}CO„ú)Óš" h‘6kö@pÓ@!+_ÿ¡œ?¸ÎÂihÌ+3J$Èÿ$À9³a˜›LÈêJ:zt›ñšã0=7?UlMöºm®P­î(§ÅúJ¹9"øu‰ÄéT¼'Cjç£Øø€ PøL ãG:×ÈaBãD} £ð·ú‰Ž*5 ¨:t.ªmâ3ÊvÙŽ]ê*Ešm±êØÒ “˜F‹Pý£]%ë|®üÎ):û‹âÚ?ëÅöú޳”ħiþC Owöá-«!¡‘#àÒf5CYžkÛ3”Õ‹Ð`ˆyOv¡>œêWÏüÎÄB™×Q*{|RC “Z'Ió隥í+«ö±ÏÙƒ6b2Öçèiïñ+}ƒû*? hFÐ^¿ùÀ‰F·CÿÛRcÝ’d3Ü¬Ãøš©«ŒÐuÑ\ŽáÇÉ7í‚7…qPý÷%ˇņïÿë±aK8Ò“–Xm¤Å ·m È~ Ô Zß_5ÃáÚv¸äèå×l†\ 6È5Æ”Ž–B`ÿxb3{´¢u3 éÆEÅ_Hr—„/¢ž‹nRjнÈG! žL®«CQi3¿ â@û¹rƒÝX¼Qâ_ÞÞ`Fõ7ÕRìñzÒ‹ô„ `ü:îÅîû,üö'£{b–3GÅUa© "Pk:zº½Üà¢v%vÿŠ(*X"®iXÓK%C;‚¨l±²ÇÆ·(Ö:Ü‚ç,«‡‡qÁÓˆGWºök€0¦Ã;‘ÁW™sž´OÁC*dzڔÿÑ!àòÖ”ÍÛÑ€g);èʼÎ6ÿÏšw=ci¨ ”4•#"9¤Ц+ðêÔ4†°1P‘ó"þ,o ^òɱ.×w¾›ƒ:‘ªHlQIÆþ±dGšn<ù[Ž ÝÌ7ô¦Íªky”ÿ‹Ü’0êá‡?¸<µY&¢5ÿ[.eÌ£¬Ä*ÍÒÚ~]žÞC“®âÊ~p¢&Nrs±ŸÁ5eoîõ„{²¹mŠÄNÉí\<làŒÁä™lâ¼£w?ržÉûwÆS®¶dýŸmÀú!! ÈK;–§ôÏY,B<eÁ ¡oÊkK3;_¸Õ+ioχ¢1OrTÍWuÄLÃé9a@ýX¶%÷HèêÜ31ùœÜ+Vÿ‘ õ@ÊPûÉD W;°wP0Ñò¬ÕÁ®&Ô53 á Ë%O¯¼ t¨-–Õ275EéL4C£Î~£ü;àsþ.ëà,5‚©úîb7@Æfñ ¡•µ ¼á$‹òÞYÌ)kØÖšãRŠþ»ö¬pGjöiн¨¨|Z(n}±¤ãÄ‚.Tb|Qƒz«e—ìÌo(G|fsåÏ6=¢€Sû·å¸ƒä÷XJÎG0Š8¦ª%:®åiè‡w¸Ló:ºçÄ‘’³R“ÀäÁÈ]}ã~øA˜ö›¤Äi¯HåÝ^Sï®GÀ>˜U¡ÂT;î^GQü° #kqü ÷Ë!!b'‘hB3˜äƒui%§[¯£Ù2Ðö·»˜Q½Ó=waaöëÃbò?Œ7M„îé^ý W®,BÝsýxé¾i}+ »¨7Ð#¸»”ö¿‹‰îÈ‘K‚">÷MéIÕãàRY§ÿ#îtuÎ&–Ç'¶fX—¤AÑàÛ“½j-‡ìÝLâúå+ÿ{bû+†;ÕÛ:›9:¬~Ö•™±Ö6ÔG袺ñvœÁØ~Ó¼TÓB/;É®šVš‘¼I™‚²ÎÒÖ„çÌycäÈtûo#n _!LED±%ºUC0MO÷³ú/¼0Äè0üÙ«VäóǸarÆÿ.{ž¡Œc¹‚ºŒoã‘ W3õ˜(Ù8&]ˆØ«stä…é‚q,å܈c5 }ôgÒ»(ÕúÏò¨§`ñ|ûbLH»÷q;ÄŠY ðDnå(û‚|œgõFñâþ!áÙ€ƒ‰z®÷ºë®Î©õÇXð† K;mÄD?˜-ÔWc4—ÚËÕ²£@¯%`—ÍDû6݌ߣ¬††DK€ßv†F›ö·½¬vª^§6à³Â¾v&éÁxúï¢SÒ]•/œ-#l#N\WNñ› *Š´¥@ŒY­g|HÖÈ´× ÔeñO¦¯%»,Â… Ÿ^»ÏÎÿ´£>K81?€p N-WâÁ“ò í{l¸e#””2V’kå ‡Èà(1 ¡gx«j ÷{s (˜\C1aÑä½eŽžm…~±ƒ=Ò—;>}DO"ì‰2€€T[·¯ÝJâœO Þ‘ " ˜>yé á.=h–0ˆÒ¹ÊÖÜ*"Ø5Ø€Arº_¤Ó­øü€á¸€D=¬‹¬ÕeϪ-ÁÊNA€De;q4ð~Ò“ÇÊ!6ÇQòcüyfýŽeÉOà{;OM‰Æw-=rýØ‹ž+©µÊÛJ嵄ÃK¾²ÐE3åå³}×ÀèRÏä•0óР9K6’k“”º[y7E2NQN/ièy”7û”£tÙ‹‰­“añ€ <).·^3“§¹Xûñü2zŠXâ¨Í0 iƒÎ¥ÎñhÊïuÒ䥠kWlÃâÀøNÃb~§ñíà*µ¤ÕùL˜p®šæRIm¦‹Gøós-ßè ã|ÿÛ˜>@j™tùÖf]õ±&TÌìáÛ¥NЊ½ûì-‚#àu`s iº(œïÅ6‰zBh°Œ¶âT ©«Bñ¿îØ€ÐÞõ‰Æ€÷‡ ¥…š»P^ÔYY|Ò»Nü¦…a›«ó*D¾lœêYß)N9ŒkX7˜Ÿ¬µ´4!‡«f Š ÿÇV¿¢¿@`8$…µã#»–ý"Å¥¢GŒFñÕ«ø­v³ê´œjcJ(ëbã ¾)#b+½ÃÞÝ;¾B-]„í¢Ö冷ϖDÆ…#LšàŽ.åÇç¾z†£ÄÍkÒß®ŽR­CR_Y†´©¥ÉßȆ޵Óá¿ó*š•4Ç¿þ­é’›VXÿ¾ëöoz=gZõZ«n¾‰$#Bûº'„Ç€¼Û²úÛè\Ù/ô'éfïüŠÑfÛï?7#˜Ì£BNùîªB¢šõ5½PB‰"•záƒM´° å÷¸C‹éÆ\¹û ‰?yó›ûçÆw öLiˆl¹Í§Œ[C€LŸÌçÀÈ®¶Àדè7=~¸øéXÿ´$âGá|³©fwýì”\èã÷“Y3cñÉÊVõÇ GPö…°ÜA'×R³= =1î’£}«ÛDLé8½Þx?bð2ÓÁŽ„Þú^$G (ÍZÒ¤rHºª*mÛ#ßêŒ)4Õ÷F÷,+÷ÒÅÑÉÐó¨_*ßøÖVD¸¨?ANCÒù¬³­u¡V¦‡BŒE‹S¢$ n¡$ý¥X½¥AÔ«´;1§¢½’J@•ÊÏia΂æ|ð–£:ŸúÙb_òÝÐR”öýõ›Ïï„…¯é'Và 1ï*Á°é˜sŽ9˜…[Ê¥ ’eZ( á[vr7?™LTÔìÑùF¨×¶v!‡­7ÔŒc^432˜‚Èœu³Ù?5yD³ ï-fþþë`Ò¤˜rT¦ƒÁ?ÍYìð1¤\n^¸ïQ¢FXŸgµüï )pÕ„ERö úBοÌÀ»°( "¢å8üŒCGÓšú¹à:픑£™4-Z­âr‘s9x¿G ¹|E?õLªs÷›B3,HH.ô“Êaпµ>üœÕrÖoXïlÄÊ>b΢‹nÚ¤¼~•8Xõèå°²+tM…”%|‡MP³Ä†< {»‘e&§Ëš‚çQ(P8O+Güƒ¤(»+Iåγ„lKÜÛàwKy ¶".ú|·. ø³&ø¶É_zjÏ„2©‰©Ð´“uЬ”„;‚É ”fˆwœ1 °¥Ê¢ŠnéY7ÅÄ‚I;Ó¿#Ô‡q>ÄRjhÐ<ˆ¡-&÷ÑVøQÁ£Ö$.©vc=¸|§æÿXé¹íõæ˜4tåâ‡éò>iG܇©÷ ë¡ßª¡Ö˜ùb¦2ÑO5>Íæ>ÂZNE圷bMl<ì±ýn7éQ41à¡Ö¶3Ï*б'ŠÍ‡Åu¨¥-ÔõŠ»¡l_ëáœQ|d[¿å¶ÁÃÔ!W}7vÀ·Z6¹|$Æ$d•j†QØSV´j8´Kx ÅO2¾Uâ„Ç,|UÒ f%0C×n± 8¬ “Ñ9^.eߦeê×U Ôm“Ð<_ ½ï òt-s°5×Û{Xâ˜XlÛoSMYÑ)ƒ–y%?eÓdV‘wJÈèþ®f€ž4Æ)fo Ì™qWÅÈ…ãa“ÍÚBñ}ìâœBÃÑžÐcÄHÍND ŠPÝI3޽VÝi?È>ª˜­U¦““‰çò¬¨Ú6%'ðµ7åÎîfòž}×þ#¯|à±&¿4ÁLþbøì œÍJÈhxÉÔ¡ÆÍ]‘³®µ3c˜Î‰>aèÔÙ£C“ X'!ƒwEÒ"ݵżo˜¿ÕÞnÚcº‹tO„ÅK,õK>±—lc³´ f븒~„ éHpºGOd‰@.gÍ_ý4%EwáÕËPÜ,š-*[WrƒÏ©2ëaì;7çÎÏ'Õz´-åslR_B¤ÌVÙ´l}øÁë„à(9r<Ùͤ€Ÿ<ïjo5yëü2NŠ9s:’–l™E—­áçA°,¬ï®ûttؤPW¤m«²æf?ð;€¯ì4_TÜ}‰¸&mRvVòfð/;g£/e=CqÀm¨ø]naAÞ¶Ä{Ne?§+.|[úíiI~Û’SmžÉó¿4’çsœ±¬§£*ZÇ©› ?˪`Y+Ȳ= ³§LÎÇdÉå<ƒI5­'=ÿŒCN?òM¸I2a™ªÍbrKWÙf(­Bc¨X¤o „.x£~‘CûÚÌd4„j€cºí)¾_ öþ jåH~#þèµêŸ©±‰ ÊÊEÉhoÔ¯^fŒ]'4Î×Å‹ yf>;TüÙ«++#)>¢ßMu=}‡¾,ujžëýÙ¥,.ÀYkÔ™=ˇwqm £÷Ѧçg—zŽXä»Á¬°4Lu÷‹h›ñ•ÎÖÔ߉Dõ;6AÞŠvt£uÐJ*ËG·ŠÕ&VÈž…ýÞaDœç¬¨è Ql•”·ÁÀë}gk°õð!h@/ŠRVèÀßÞ a½B œ¹ªug«¡ómË•k¸™ [Ûs6ð1}¸þ«Aþ«‹Û5¿¶’ˆñŸK ±¢þ-s²’ŽÉÁÅ0ÜíË(€ß.ÎËuìËIðí¹¦Uî£éŠ_¢´7Uˆûð^š„Š:ýDr±{ÝÄÀ³9žQ0ã™ 䌊Õᮥ»$䯗@Tw^®RØY付^;íGUÐ1/ŸFä©‘x_NŸ+Ç8L˜þç@XùÕÚMy ¥ýÏ ˜‡­¢ ’I[ÌïjÇ7i©Ô+¯Ú(½+qÆÐáJRsSoc¯q2‡|%ÄéT~¡6Å ]RDÑF®Ó¥ŒA/=šT ÛéAAF½V«¨j-í0~áf@{Ã:u ڎ঱£u­y—CIša¤˜âæåš‹·³ræCüÒ€ñÕsZYIDzs×#Œo¾°B„4qêv´¢\támÜÖò’“MÌt»îʱû’ût‘Ìdˆ¹—uÈæI|v8w†ºs¿-bm!ÕxŽ0åK›Ÿ–?©hæ“šÔ (²gA|S°Ãâ{³,u@“]±ÃdtkUù¬÷ÊkžÃZÃ$B¨ÏQ¡Øù3i‹’ÿq~ðàr`P’ÛG««~ô‰¿Ã^ÆŠÖ=•ú¶¢ð>\;[ݺ1æ‚&z[òÞ$DRý×ÙœBžvÕÄÖÈRøíwŠÆ¿&ð˜lf¹?Ö ¨PX­c©Ž†OÂJ%ªÿ8“F¾8dBxô»Û N!!_Q­ @Øñ[`ë/Áˆ>$äQžïºœÑm®~ExD·Æœ`ÇIMÀ#ªV'±rŽ•ËÞ4øý! ‘df]Ê¥|‚vgqžÐ|#@î¾!õ˜€Ë‚×q@÷T’§ÞÍ€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n022004l.pfb0000644000076500001440000014247507056046553016424 0ustar fnevgenyusers€U%!PS-AdobeFont-1.0: NimbusMonL-Bold 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Mono L Bold) readonly def /FamilyName (Nimbus Mono L) readonly def /Weight (Bold) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusMonL-Bold def /PaintType 0 def /WMode 0 def /FontBBox {-43 -278 681 871} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020946 def currentdict end currentfile eexec €À¼é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>j!SÚ®ZÃDšE2V1²h„ÃÛ¤ÌO:î ­)u|8tl”~"yÏ5¿wË(½¨*Ô·¨vb¶’-D]p.+Át|sJŒcU}ÐB÷ßßqEi„:l«}Ažþº­zoÀ¥×‹öÌ¥-è;kŸ)|ª­ò1ƒê»O´N 7†+èîõ‡#ËZ‚-2! lt#ÙÄ\Z¹ÆÖA¿;ì<Ó÷»Ó1Ê©2By”&¬1ÉèXŸ¤À:J˜ä-Sò Ÿ)ø·/YýdqÂÏà;a‚RÚì\²ràÛ˜Vl4¦ésŽÊg¿¿Kÿ“†NXŸs¼$s|KºUAÉNÓœï?’’Ý‹ž_«{9/€&·*ªj ñÛ³T‚e Þúzé;KÖ! ‹Bžš^SÑÁÁä0oƒÊ6`«ûq‹ÓšÔ‚ˆo´In1ÚÁÞáZÚŸ¨thÄ¤é„ O^æÎôÊ"8E%FÛ Žü<âsVßô{"É.«[mi‡Â!MMl=nE•y[/ïì24«öÚlå•Ç;@ðHz¼%²ÙÆø*BÐ|õ#f0ƒÞj¢*™á!{œa‚@ò¯ŽOR—ïû9/ªfáãW‰ü7ß'’ÓÇÞZô9@q»LT¯¡Å³û6ç¨ Æ¶^ññÖÛžH^ Å© `”%©…û 71 ú’—´ÝSYøçÊqF¦î­ç"°%Ñ ŸÌ[.Šú™ £¡!Ÿ†hVÙÎ ?eœåëf6ÞZ`ƒa¥Åb½fÇAÕ)ÅÁo>#SLoeÞ‹xJj„‰9­u€ÿ~ºçé$P¢Tà¡­êÅ"^ô_šiÚSMÖIÊ¿9 ÏØ±ß¬OÁÚoØìp‚É{0¬ÜvËU5 WÖ‰0é¾XÃ=«eÆž¯ ¢ ?@h2¦°©oˆ‡鯸™´‘Üt‰jD¹ögÞ ÌÇ‚¿a;ÙãbÞŸ…Å¿]Žßd¹÷}Î%3öNÅßþæ²~QqGÉ„tÈŸ]ÊâÌ+“0‰x99!|*ç„^çå- W˜×9ˆÒÇ~äq×/± ï—á5<ï&3á…Z.òœ8HÑpYCy2H¸¸Nãj3ÃþçèäÀ(—Upbã-§œPò.œžŠÊûEׯÿPlô3Wª…¦‰Ö)B·Í9ôSš\R¹aF9îMr8–0 0ø^']Oó•ˆ|ælͶ〩;âq3›™;tç`Býi{‹¯ƒ®˜¯:à¸UW®ÿQx×>%è·(éNÚÇ9±ls—Ž­Ä¥Ó 87ü1°?»–×íJãÀ”‹'À,¤ÖÈ R–Ã.Ýê'©™~u#v‘UZŠW^T.-@Ü ökòŒ; ¼F¹sc Ã&ØÇ.þëìÂOÞ°¸ÕÉ”S…¤uCæÄ– ªÏ õ°ŠfÇÊþô¸î\y§k ”œ‘âÈp³:YÎÅ/•öë~ZîÂCÀPÑY¡¸ݧöÞUžÖ1–èu2d.4ù±=Ñ  j‘”;6¯Ûפ¢aßíœÇ7R˜.Ïż¡Q<î—™ à(EòâtW¢º÷ç³!ˆ_Õ‘ÏB™%3®MOÜ»Îe9¤òoNðÕx„ÇzÂÀ¶\Ú6ÖŒÅiíÀuêßpyà÷H_2àåF'Û9ÔI:_»¾Èîiì…("Å„¢õ,w»ºgRÎïh÷Ia䢪ã>Zc t»mÄÃXá-?•Í3ƒÔ›{¬ç¡6”øÿjµ§¦ƒ©N˜ þpt`,Zð«ƒ\s¥_hB’å|öa˜ñó¯‚Ï3l3 …yjr”: 4f´"H×öCš22¯Ðü¾e=Ê;ÿÛPžÏA\V¬:õ'v;“ Òèn Ò6„ïLx™î\ò6]=Þp‘ÿ«"R†žÞ“üÎ2 Gýú²1…Õ²c‰©³‚ó<¦Ň¥}l]¹zgX˜î$®ÞS²‹ºÁàÇmø±,b£“Á®¨ü0Ö—“´k¿2áð_T*ò×ÕJwﺞQ3Âê1׋§\-jzá¢5+a4xQC`ñEµãéêSP\À"|Q¤6¬‹é¤è4ÍÞ[ Fª¤i=ð7 ˜®vCÑÞ<ýuËxX„Ö†‡è„”"PNJOLäÚle†ÛåÌï™§ãc¡…»u÷ #‘|*câä>•BÏ.K5§´.%Ör^q9ÁÏ£Ϥk™†6½Õ¼Ó¨éH€U^üH…ÖÜdÇ}í ¨&I šäÑîøkØ?žeC:HÛñ$ñZÃÚ _ªlmªÁÄþ·Û‹„C"ÿz-+Æ­Ô;5DTÓI£4K)Snˆò‰åDŽ[&<àt2c+RS9?fyh3#‡¡¼Ë˜P?C«LÉ á|d5ªÍbüŽó/³}ú ñŠâ o//Ö9MU¨úÿ ÿ‘«Â&A+Q‚´´œUаÒImº¶ŽfSÛ·M!§„Wë&ì¯Ëì‰o¥H8}`z#Â"´Óó.Ò›h=ìy'ý“¨Ë  k.” _|¯ÆåíË1¨à‡î›±lê#>-C·Æ«½äMÚÓ¡òËÍsµ¾6‘ª¯.þ”¤snlLu:ûáÀ™¤åDk1ÎZ™ÖA%É`°¥M2A«!îµÄñÏöƒf³ËÀËÊ'rÛ}[:v]ÆÛ‹qŸ]ò¨ ®®AcgE4MÏšá«¥d¦©ÅîØ€é>Ë-ùî…‡ØúËÜN'1]ó¨l•_A{õ®$ͬS¯aœÙ8I^LÂki ‘òù^OŽ;•¦ú¦×rKˆ9.k^ÛŽœ3>&.Ö‚òIéß9[”çÛ™CiëõY?›ÞQê«Þ8T­^g»§êäÕ–‚S‡2Ö@sž ÕÀÓÖk9™ îCÏé‡.ðé‹Ëé7t%_ðWŸsÍeQú¬Š®=Jj¤­ÅHy˜Ë¤Ðñû°Çö³w2`æv¶g_^ĈJm´9ë%õÕõšq$ð²í™>wœ¶:â§ñé  EЗ¿Ü É[Çü{2&k/â/v‡P-m¤ãQ§wŒ¼Í1³È2PÃÒQ·zy*µ _c[-“,1.«K½ÿÌ`háA°>èØcŽWÕœ¡Ø¸Ì­êÀWÎÿ÷ý'e°…vwL?õˆZ¨iNÜ[ÿy$0Ù)‹GNÛ½K #AûÚHÑ-¿Ù‹Â7á¯ñúy5&@n s‹ýʵ„.*².IH¼K“ ä¾Å€(ÙØn~¦Lþ:”ø ˆÿÜßS&½†ƒ³îE Aº@de…=†=×ÔÏ tæüùivßï]&Wv6¤hê¡ô®=‚÷`Ð+(³ª©»tVt`¨ÍCfw†ö–9½¹òµ¨Ž{ná”°ÿÉI.Äïéf%ýG9¥•Q²‚„LV&…šö³ó¦þšïRÔ*&P»dÚØ”§ÖÐCg)3bXVdèçŽLûø ‘›®>NÇ aDOŽh¯¤ë·µªöhf§ÛàjQéæ?o°Az¿2«"°+Ï '¯‰…3_®hn¯Ê–(ºÒcòTÝTèvslë΂}áoÓO-ö¯Ç©óŸZÅdµòmÚƒ- à÷rÙ1^¿X•eŒ×üò)‰q,1ìÁ‚ Ó+ê+)½ˆ *»ÍÊ #Ǹ†¶u°Ï‚PÖYš÷Áò:Á«&Mœb5*,òÛh…«w¢òÐ7ƒ4TÐÆæ«žx„ºÑ)YùÖ“X42Q^œNŽ…)+XYv-À“úÆÑÄ×_ƒæÄ|÷;_ã¡aï )Bd†ƒÃ<¾â’ªèËΉâÁèÜ™ÝKÌšQES…ÃêÌ•–æqÌâÂèjM°tb9f Án9R»5‚@{GüV“¸˜ß~±÷§ß¾hd¸$˜ç¤¥.]xâ´ãyÌäïí߀“gxí´j°ñª{yú GÊæûâµjtãim)i¸:ìù›«6ú“ýš.Y ÄGÍ$Ä)•×°DT¨ýâå‰% '9#C¡…x Þ >닲 cѽa¾"™òd¨Ú©>ÑEñ¶Q*u£îIÐë÷?ëkÇ^Ìte¯“0‰?Tåà¥á4p9;ƒ3T´ÉD±m¨H%é­ ¾]ŠO>ìb9÷±A ;BE¶ãÉÃî2 eòÑbâ[k·žF჊¥ߌqóÞæ7©|E< &êŠöŽ<Lé—¦õ âq:ò}˜3Æ¿^õÁå¯bÎn©Õ˜«½5 Ùê„sueÏÏì—CµÞ~åIUU9 ØœàZÖÅ:#Z£Øœó)²ô5 ˜ÚMIsËYTÆÖ9Î6~hwm[¨ßžy[ÙQ¢^±?ó½$FÈí2g ÷Ñpi”úÙ»ŸôHf‰QÊí½• ‚3[¯ñvФM¨à^czkËQ»d¯"j?|~¾Nú9YeÔ›¸ª_AúâM‚ ,l%ˆ³‚‰9×/²P‚ycÖÎ]È“³««¹šksì tÙÞðÝ™/áÞ86wÐ'’§ ¸>¢³Æ1É÷Žit“¤ ^¯½‚¸ß!žS$?|òï³Æ~Ÿvc¢Mj¶ÚËݦ|£iª -"bÀ:Cv=bÒ¾2bѯº‚<ý©’ìø Ý6VP\S™Œ¡5Ð;, ¢»¿€ªfBw:bU_·ÎåÞ»®a²ÔCòíÂK±SÜcL¶Ö³rIrD[£­ùz°u¯*•Òñ»tϲÛCQ0)l~¸Ûp¿\üy51Ó®3UJNß sÈ·ÇJ„»;àò¿EV Út´Á-ׯ(ûOJº_èo|º¯Ïä»Q€1ÚÍê*æÈÐÀ;ö › λHXäÏá'1k÷¯°WÂlú‘½–Ðb-£Ö%S;%Nì#%{G…ôð/?D°Â¸;¶B݈Rî7w•n˜G5õÑauÄ¢~’‚¤äÿ «y8Ù!Ó=Çè¶*âJ±&F³¥þˆý”Mƒ An³»gü›²ˆšìE‚ V$7s´HÖ[½­ÁZ^[6Œ½—·V¨•+BŠ5Œ9†0´nŠý®#…“ÃýXžÄkw¸Ø.ÇáìZPËÇ~ÕKÁâBlaÒ:XÁ× ÷u©$vé÷V¿¸`#Úù§Ê Nÿ Eª•ÏÞZ¬w‘Ʋ»GT~;[ó2~•÷ᤆ>[Jô³zR~4(,¶Y¢/…º@k̾0pêSöZ‡kš–A/t1SÔܬ¤ ,&Zr‘!òÓüžþ \àbo0#¥êp[GÎ\Sq"çÃZ÷¿1ömáª3bæŒ%ŸÊÍyü§ïPTtN)NhÊ;­Ë®¸D1ŸºBâZ‚PYšŽí^ ½Ÿs›}³;vPç,— 0ø2^\ È^Sx}¸Û Ê&×@<*dŸ™‚Fòd"7HYÞCT v´Y·ú‚'#$&%2™ý8†¬HºrlÊ´zóÍÆ¶ÚeÈ> w«ˆMEÿ9vSj­ø 9ϰ¦4šOv¬&t­I¤nñÔ~äúq|I11à¥!,=K¡4§¦Ì¯ù˜*¾Ÿy*‘y‡åÍ„µ™LŒ‰³ùð‡ŒÃt‰£¹´Dg;²SìÞ²?B“í$"<¿ï&ÌådI‘XH)‡‚€m©™«<²¥Â}`'F‹ŠÿKUû1ŸÞÔî-0ŒŒ–ûì +qˆºÀÝÔ¾à:W~‘ÒXêºØ‡¾%çL)oc¿Ú ¦pš¦kA‰D<‹”+åWò``n,\"­J[3úÍ+¬‚jvŒÌ7ÒYÒ`2ºå‡±(IÒùå`ãøÀ|Å%oò Éϳlù!q>yÏ(>å,Ü:ÚØ-*Ûúo,,¨ù¶aøÅŒ-pÅš” ¼1¡À@A¹Áåno-DFÚ–Ój LÈ—~fZ®\CW9²"k¥˜¤åOéž=úõ1ï+)9-ÂOÒRœGDiÊÁ|,öp4…E‚aè4eKì™ È#ÄyÊð¹ÿqùƒE{䈣jTÙÜä ƒ(‚îô¶˜»XZ²Éµ´-™¥F©Å V"~vxm¼Æ¥r€ §¥Èße¼mGB–©83þ㉒ÞÚLîb:³ærs{èé„ ç)©|ÿ¡¡"Ù« úX}¦{§_Q'Ž:§RømZ‹/ z‡¢š,;r`ûbz¤JimYÆî‘¡05[’4Ì`03ÝtWr—’ûŒwEßEÑ%O²hKÔÔdvä7ecpá57K#W]©«œWÍ|C†PIÃûê›*ÓX}¤µ°!8A†tflÁ¼~4ZñÝJ%“·c5EWü!âq/¢1Äìü¯<ÜXqÓ’ü+? íµ¸q¶ÞKòeH’\¿E•»$)³GXkúClÒTäÍB­Á÷, î³âã>Ô/¼éÑoºä\{ѺZ[ôôV¤ "Ð2o?¥õå3_{Ò×LFÂ2M @¦ßÐf}Äă¾‚«øåíÛÞõ±¡Äò ©ý©z¥¾*c{ªè:àÐzÊF/å?«2HLMy)ø0¶ï׉²#¶¢’–˜ÀÀÉh8'‡L€¹~l¯Æ#øâwo45j2Àça>¿IϪ­Ävì.¹Å.:eÖÏM;ªöØ¢ß;k™X­`m¼e;ð;¬Žä™4’‡““ÞÁù“ܺUBÂ*ñªMuOe=Èä÷j’˜à®…œlø«$³4œ ¾Îž‰U…^'lsü8Ñ”ìLª³€8 ÆÖiØl·Z ¢_Ô$¾‰ÌÒG™aúM°Ö&ã/þŸ÷“%L,(Ì2äÁ;óþï]èC<Ö0É~Ò H.ú8&~ ¨§•Æ óM2tÞßÃ’‰IñmÑ[aÖ‚ÿ0< ãɱBä4‰~,%Ék›1;FBæ)X¥¢f ®&r@èý㤵ú¡ ª]ã§0Hg'¤´G ”bEH\îÍ¡œž»h‚R—¬£z£å¾ÄÄ—³]Á†»¹2Õæ ?• ô\±šŸ\÷#O‰~4‘×3µQëU´-‚Ò3ÞFVäÌÁ\pÓÁš6|~ŒÙwR1ÿ0.YÆkÖ`’›ñ%‡jMø@Lt_6¸zº¯´ …KŠqAzE¾šmÿq¬I5ç0æe~w{ÿ6=lXˆ)¯VK'xKùŘí!ƒ°ËÔ¾rW]Ô„¿mÈ©#OT¿YÕ¸'–ÎãŽý¼0ÙóP‚òZrš†ÜàtØBÐ_!ÄÖõÐw|™ý™õ½zëJ‰—¶®¥J<3lŽhXZµöTdŽó`ó[Ô³"‰ww€`& Ôðê«“aØÖuOfî •ó›¥öû¡Õ[38VtGkÞé‰++÷U5?‰<ÙÙ»ŒÏ 0Ì¡ÆòÓÿU/V¬uÃÆè’()Ú-öPr?7ZhÜž¶L§JQ'AĦR²#Û-%Ê)Òrí$”L/3v™&ÖŸ)*F-\SÞä9‘rÁ v=H@R콜‹«æ´Ú&çùb3Uä0v‚„ú›Sfz¶{!lîTX’ÕÌD5 åþ=±i ŒpC&ÞùéãešâøÆ ýf?‘h… œ›{«—á¿_$ý¦í3”3¯²9E¾ÕIéû‹Í3aÍÏÝö}vzBFÚÏq7[õü“u31á ‘ýöÊ´lHáçWà~± 0ÆóP¡FÎÀÓÑÐéD¦ž… ’Ÿ¥OCw­GhûëßS4Èñã&ì±Tî…ƒB¢o;X©àW øÄvkã <ík$ú*˜¼£‘¸[W-I¬8äH'3roVÕïBÓÉRÛ¸-‘)Üà K/ÍÒÊp6IpÑ(b*:írVœØ0~#äŽjðM¢KÀF ø‹uÞä7š|:lº$8\CŠF‰c«V6åœgôbRŠ!=œ ý9u£¶A˜žþ:háeú æÝœaàboQ~ŽÙüL×f)=øå.³¸é'G˜ó.-ú=Z«¶aÔÊô\È70—Gß› V[4ÐÀJ/žÍdðßB,sí'§µûŠ^]qÃ9d=%ˆ• âñ6À._Æeîlx"ÚÉ?Ž ¤µ¥/ Âô{šq’¢/èïÈõ-7‘ÓáˆúŒšü/ÅhßÄ š¹NYÍF{› Ùù@²R,µÈ±‘£rïUƒæoR¦]<{ªuÕ›½TÝš÷•·J+§K‡Û)¬xñ¯¢+XÊÂß2ŸZ>ÝlBƒ±pËûüW^ñr³œY‡%} mœ•þÓ¸À„k€À~ÕJß6­z÷)ÞÀR²æÆ !åvEJ† ÂæÊ lñÚº´‘C‹2`ˆÑn¡ÿ2æ˜qÍ?Z\ï8H·4î âQ —Åu;&)¹ë0,Hƒã„lY%~°EJö–‡§Vš\‚áÙñ¼ØCy¥´´f¦~ÏôHÁÑo;È™¶RþPE˜:Çö·Ö;S9ú™Îõˆø"QnZ´Ï®éw½‡’ì;Û_åÿ®x9 Ü?}ƒauû9–ª]ý3›£o)Æ_^Jl•©@ c­t^h ørŸ#¿à±Œt¶ 6ÂþÒëqì_¯M®–!3Á¸wmW»ôoº0¡_34O&Ý…ATnÙcñ³4lÛ «—=¦8GÓ×5uÓà9ð½ðõïѾ²èWø „·Cá‘Ó7E“º”Mî—¿ ×V‹E©Z$ôŸ ¢Ù7…veêšÄW© cWr“üÀÕ½Ìßa ¨#÷ÛC’cýY óöÒa$¿µx=³À†^ìÑçÂÊPÙÞ ºŠP¤¦žæx™¿¦±Å‹1ÉŠkŒÖ63Ýk¦äÿ}æDIiB·èÃ3 Â? ª˜ÕUß›ökJöË£§Éý°¡”—êߤs¿ô­k­¼m—WΘþ<¢¥qù6ê ô `iÑ[["O2÷IeÙÔô:×M°²¾ï¼³ÓÚ¾p}¢(èÂ'4%NΘ­sÀ€Úú ß¹4 „J-¦™/í6tªšž,M@5;߇í·>a1Š ®{8éøeoßW^ r}ƒ…å ‡ÍüÔý€ýýs‡H!3~˜¨Æ@ƒ¤¹YMì8¬œnýÒoÌY¢«Óˆÿ8Å‚Ó*2Œ:¬ÊYásÕm;;òyvƼ•Er‰ €’é>5ñˆâ%]L"=]ŸÊE½ô3_‹ÛÄñÀëΡ†Ô×ûÞz(î壥zûc[öc_Ë )ëÑœâœÙ2J< "Ç "ˆò£¡=¾8Pjtmˬ÷Øš x_óØ…‡™P®4튘µ74¼"ÑòѨÜ‚KBƒÂ3ÈtOÕl²Ö¿ ßvþñÐ쥨uZ/ß)И2ƒfJïàÅžÚ’»%äh‚â ŒsùÇ6qß<\¤Ìpó ” 2å½ ô‚éHH6È5Bñ+ì2üëZ;ý»81Ëu9üñú¹[¦7˜!© '‘Û£²ñTÑ7ˆ½$;”iß»ŸýiÁ4wsÇU›§PÁrã-×zÞd .¨›"Ìÿ†ñò!tLçîqœ"8`De9HŽnÏ~ìŒqø+*;TÚÑ‘ÜyrîÀ¥qè9Ç3®¾,U{›ÿ¢dÖ?mùúåæÚUùµåN)Éx¦†Œù6¸œ‹ʇme•†)?é¢Pç# — À@£ÿ«7²6ͳiÚþ–~r¦›‡ö¶é2ÉvùD…uFLô6fÎDv„ ‰È€¬ÁYçê–#ÉÄœL®‘­Úñ(äã6ä\vÔß”d÷¦jÀxr€ò{.¢Ìc}jž*ÆÒ‹ÊÚ,]ËB_™ ··g{+yÄõ”xÁà¿ÒJï–!²!ƒÌÁ´ÜVÚ$³™Ï¼F¨ ÑÑrÂZvµ]  ¡}ž"ðlî(m5‚úñKl׊å+–gÖÕ3No)Å´qHtÐßàû$Òdé÷+Æ{cJÕXì#G5VbÕXþR—ÏõÍT’É0VÅà§&Há>[º(±”üí!1îEï³~ðcƒRêhŒÆˆт٠LˆU!¿‡øŽ»¥®–y5LÚlˆˆ±rÔf5"¹„•²di,°WZc`Ķ–r¬÷ňß{ê^Èž†^Wz ï€K­¸Ô.õÆÖûpëý?I¥²¾ÚËz¶%5;ÕNh|Fü¥ÕXÆN ÖXO=OÌ·¹ ©È…°(ÒŸƒŠR­R3¨=a§>r©±.éAÃyã{^?Z*«2ôV6‚¨Ï•žÆ=–¸Ÿß–§Š°K#nPºÌyt÷Æ.ê¢E¬A•Œ¨þ¦­?ÎS9ásšSyd,ë¤&îMÚù"'RLLÐŽÞõÛú9ä—(Dû¦‚‡ß˜x7t÷ §eZŸ‰ÖK«­;UE´«vcâ­]üx¾ä.ˆz.vµ¡Y.H‘Y¬Ê/ $šA+ä© FÜŸø2RZ› $JÃÎY“ávtÑfcÆÕMfµÝæ¶J§o?óS:FîV»‘;nþ¦úNS¶Õ>}–6€\øÃ³”{ñ•ê%ÍåG´E ž¸¬„nõMv“!0a‰{ÉnØ!úWÀ½£$Oä¡î£Þöyô^ùö~µÞÍÓä¾È—õS»KÌmM¸É –a`Y±¿¿àMkt¥ÌWä qˆIôRÃ;XËòÆþ>q¿\±>u7Ùúmeê“^Õén÷#c¿x2*‡¿zŠëq·òFªglÚR$ tæéÚDÖ"äò¤=u¸:&²¹- ñ°(vå#ÙФ’µ¦=–±ô~–.符û?šìG­Å"Úèªq‹Å@Ï]p1§ÓÑooó:—h) ¥ü^h•ÏùÛ«B§p½·‡µ³Þ‘’<.¶êça6¨¾ãn·„xŽ£â¹×¾•æÔ$;lILKuLmÑ` mºó™®IÓܧBOm|E]V #F] ©ÞF f×¥+Z÷N’=/»IÄG žI{Ó2óeˆíÆl]ÀмÌ@ÝÒ Óf'Õ9O8œ„u5ZŽHuLmÑ` mºó™®F›œÇ½Ž=y§*_÷-Q¤Hýÿ9׋æÿÀFåÏdL~С¸\Â9:ÕBÑ=-áó³A¾ÇÒ†t–k}1;…ùòOM ²ÄlaòU| ý¦vuR ~´É~9ÝQ0 TÏ0ó®“Ý•B*Xæhé±O²•Ö’?ýe¢Úšˆú?çù­ã×3ùîµJzðǑП±/Ð&àš‚2ʾȚó„þ•QŽÈ¾«Ëž)IÓÅ„VÿÝ{ÉíÞmj*cžÖk \¨æšÞ·Å\„­X&²‘ž ½ÙšS\’Cz©­~Î-$])© ÕOöìxA»æÓ¶Î;ꘂ> 1¡‹ÅdÝâ¹$㋯u)’ ²Ê¾ ” @M¼õMìÖò.™éì¿ÍŠ^"])ÔS[ äûi¶f*:ñ>ÃLX¸hJ Ç΄öçSHa2Š^FsÔ½lÐY¡j¿ØáW; j:ªê2tGO³©}ûx7£}ò»iôÕÃɰEŽöÈ^QÏac¤ ÐgQ©µ*q¡¹¤ýÑ‘Rí~%É^¿ðçÂΒř჆í>ãšH²Ú’P‰ËÁöPAègø¹£4 «·©++ã¯Þ7ˤ‚?“,'yð¯¶^À>Üì„~A*÷xpÇšÈLXNAdF³jPÉæW&FŸ9šaC‹Óÿgr:£_»e 6cº1¿õX7_tF!kÿÔr˜oó{îJ£gVE¨>«á…: aû6·ŒÇ€¤qÃÀõÚ7Œ© æ!${Á£½NJÿô9ü‹š©ÐèP±PƒU¿R"Z,"¯ž]íð8òŠ¢¥SŒ”P†èKJf飡oªH]jWI§zì=-ï ­§Co±á…¼fÐã {³:ôXæì—¶~ëâwQ¦õúÁ”ö`\¾cš˜«l?l1%¥}ÅQXÛ¢½M6þ¾ …è ü»@ÅU:fŽòÖõ´0Z8¯½WY Ÿž¹Íî¾Îmç­*¯ m¾G/ƒ8t? z­Æt?vF÷¿:Ÿs¢:Có}G=mÞ„è=,õ´„ñ¬ÀËÄÍRÐÎÇ84êÔ{Ei*I³eëŸn=’#©_ìãÓí~ÈR'ø!r¾Â“?tæRºé)žpŸÒ[›Ë‚è`ÀÅkÎxq)bŽ$™æïvAŽÚ|ÆH×iÆõI„Þ©*ôwnºÛáaÑ€Úž_=eÊħ¤ã§ÂSX—¶žu&óá ažaO -Äöþº7Á•%þÁ9ûÑ=Ü!ýìʯ•ʸ×֞ϛWMåÂZ‚ ¶‹ñ@¹4ëXZ÷¼øÈœÝt[§á´@w8¤í’Œƒq€¤·zVb+lË;&Ë_ì_º…°¦¨ ŽuˆóW×­U’Ó|~ê½r ¯qíògvqÍ>9¯2 ¿ÉÝØ>ôÈB[2Û\ÆfIZáÆ¼F‹ÜÖÖ<ã4зŒEx]ûpŸù§zF¨Æ`ö„Ö6C²¼ƒ‹n˜=IP® Casé=³r!ToΧ¢C$q71;$$áb~52½¹ÊîQž#íg -^ógO"]QáíŽ,_Éõù¹4À#Œö[=Ód´f²®®£Ó$YÉËÓëùêš}ú.ê›~èo~%lí™7Q(aPæcX »TGƒ[Ÿ²R‰™ I-žt°UÚ²Ââd?_ °ôìNŠ:-ôz8ú6×U/û4ÁÔÈ.)·#UàyÔ-º€~Lô¥ü‡®õ˜ìô2,ÛË#t‹º†¢¬Úæ¹0†¢âmR°¡ƒÿAÍ)ÐG æ*y»uáŽh æm¦ó²¥jaÍÁßœ­ÐCpÝ‚d±aØ_‹*šQÞº)zPÞÊö”M‰·û¢óï=au}û|(w9;#ƒ˜Ÿnîi_–~þ~îyí“j¡!«G¯Àð€™¢ ü¯Ò°ûlüžÑ·÷¤”#$Áܶ¦hÌ7bï"MÍ×µÖ!Â(eF6}O±YY¸mìPa£Ê{Û-×-ûVunÎyúa§ÈE3jĽ¤4|X*o^%ÉÎËf¶Ð(Rað·ÆÒ ÁÉF/Íë) [ùc?梒µ ˜øP;íTŒØ6T?s)ÜݵÊ×ø›òmÞþ´‘-,;Ô’ª²æèÃu¹`ùžIšáL¹*]Ú¸~ôÔDP¦€ÄTŸ3ò¶PÚ»ôûb»#L(wê|Vn0°Œ´ÃÊù„§ß¤éxJ´T< ¡ƒ.cÐóbDŒÒîrù¤Z ×Hß³,mò‹ƒÂ=Óz!þU5NB Ó4åãl¡¡ÿ½='Qµ "Tã»Üäÿ(…ÒÅäÖ¥z7³J%“õjØœÂ%ßk„eõ{lÐ4Îfåèoþˆ P}r“<çÉ9d¾ÏHï~džJùmx5}úºÃ³5å땾_'ªQ¾Ð»GÕVAÐdºTÿ•1ɰëdV¨å%DÁ¿„¨A‡gl÷&‘b½#…Ý`ܽçÅþiÃMK*(Ed©Íäãˆ~§V˜ºyq¾’ǘ‹63ReÇÂðKª8Uy?âyŽåóÁ¯qryí†d™k& U½™È§*çë´Z×JôMk¤Z$Á•äOîvt4¡.Ö»€ph¢êðÝö2 Yì¢Å8ñÎkÚÞmšt\!š1dj;œDÜÒ&ôìÌ$Ÿe:­í(Mßȸøë37R(#þ+’uâìG!R*vè¹$ï-ðžCã˜ZÄÓÔ–ñœ¼v§zv«GäéÌÐ2íp<-Jö‘lQñ|[µwÿÑÍœ?X>‹ÀR‹‡‡F8b…ßUM‹ÄÑ>q¢,w,6-½'˜ ,<Žä…Ñš o ®uM8GX^úÍâ¡õÍŸC^ÛÀm¶?ÌB¶¸óÒ!‘ûtãOs±¾9¶#ç#1]çA3±äR 1ì Ol8>«Í"«!évCÅÿ2–a;ÃÌØ`@ex¶yz"ŠÏfcy{zu’¶eý²ƒ(˜É[[O³ä_gŽ7· ¢:]ˆÉ™¸îG4`ãX÷ÏŽç i¥#ÖÇN|’ÝíÄSZBcoSO+åò±YB™z›Ýü(ÔO!]¹.1ñ˜Åæ°Ò_²êw¼œŒ¤-oö|´3è9nÑh¹ :å€'”FežTò‘dgnžþ^Qéë ä“Þ>éEa¹*°>Ôðßaä‰ïÔ±°á†ÿâÍUðàQ ¯ÈGo–ÙE+¸á‡…ØÇƒè«£…,¨ÜÏÈȦBüž³f)nùó;BX+ëœÆÉÒ|ÑšÓØŽè¸0xi¸'/Ë'±Êýι@Ø%ù·¾·ê¥pÛÌ8ޞ㲇’ã !1ÈòôyÛl¤±µâó>hjma&p~ÿ `¨·Ê… Ÿ‘A@i5OðÊ(WC³û>pª?>XÎÉк¸bÑ…m,ÆYѸP*d³ù‰-p =’ KRâ…ÿfÛÁýÅ`4\m3£Ä©”ãkBzÌs2f%–òÓo$®ÁX ÐüSáe’op™£‘&3xã]ÓÝß‹ PJnM½ÔSc êÌç%Þ…î -×YDJ^uÆQˆ­ ìq×ÊSú]m?öHc@Ø7ØÍÐ@Túª5 ¼#.bÇ•:5IW0Û¦(i¢| >…ìZ¹H¥­Ì•uû`ÃÒjÞ-rˆlë5a¯+;±/.ÿ“XÓÍÎ"ŠF¥fùZa˜pr b«Ö·¹Í,µÕ÷Kèà‘Ë`¥6K5Ó³ýµŸœ"ðb/ó‘)L /í;Í\“/ {Ë,ko+Ta?0î™Ïà³·ÏÝeºßn{ AÏn;:Ñ¥À;ã1`3Ú  ¡ts’^yçŠ?Hî#H²¥îkÛâ¢"D³ÿØâñöë!£¯è•N€Y‰7ìªÐþ 0&ŸšëCPƒm¤-ø"¿5TM¯=bÿ‡M=bêXhn^-“ -ÃúÂX‹I¶`¢,:U¿Œ™ÞÄ6g‚ÛS\³FðËšŒ5²–Rçc0v(~ѽŽä@Xo,'óÁ|®ž±;Õ!©$Å.Øùåá"±YúrG¯Aš#xê ¥rs–7*}m}S= 9ÎÉ¢|k¬ÉKøë¦ ¡ƒ°œ£ÊA¦Â`n )óìa*üÙå0&€ÑüŽ¢mƒU1ñWéÔS É|¬)ÐÞ;¸y—³×¢"°°úé~b3üG×±”ærÌQcÄ.눣³£ù¥Ÿ‚Ìrž']µ6¸Í•ÏÙ‚h„®kž—ttz ð9§|zÈ4¹Ò:÷–A%PRMô‹¬Š$ãÇœFJ%?ã2£Áƒ™û¬ôâ Æo,Ÿ‰•zb‹5pÇsë|{tP(‚Zú°[ ‰¥˜Îë4¡ô ÌaàRp¾'žPí‘ó ê¸ ðSµ6i3nïE ]ƒUòÅ,¤fÍ BOÀN=­n¦kóóª¼Æ<Õ¤yzv˜¤†êõ"E –Ö-' W²;«óz€‚¿›¸¼‚±ŸÙ„Ù¬#¬sŠðæ$€†S4ðçu­³aã0Û—W¶rá"ªg.¤‰éóu>•cÖuºçy |§F€B ¾ór3š^5Jîþ v܉bßû´C5¥¿ÄKè¨ë}  ø[1q¦›-Bÿ\ø¨‰¨1àÿRÚôO%÷àFưk±°ww†RÜö…RSšAˆO†Û‘.W×Äàm}È¡Îe¶(9œ²õÝ”¥¡TŒVS£>A+SØ2Nm³ñ]ø>…ËL_-߈åtŸ>ú(ù">1Œ ƒ‹/’÷ò%Nd›{xu~”mö]ðLGç;×õÌWrÁ%?gïT5‡­Ùò{a5Æ4Éwaäƒ@wæY¶àùÓzøU`ÏNª@ ‚ ‡·/3~²ú;Œ?o!ÂË” ©úX’CÓ'•Z®ÚÙ×κ9›¡Qø¯c»8 ¼õåœ+¬^¸¤SÈë¨jæÈFÒù(‡Š”¼œuÙQËI´¤ÈÔq»s&˜L~ ­ÏDªËõ˜:TÙy› )Œ$!fÄG¸.uRJa]! 3–[L÷g `Îæ¯äÑ(¤áU `|ª€ “Åf‹áÕýT¹Ì].¦ÂÙ(5ä¾>ÕÄ„¹Hª³Ê9oLºµ¶Ò”=zQ­ß}ɾÇîO•+Ë ›- ±­Vº™™K­&ëÚš¢bklØÆ·Ê}Ény…פœ~éÐ5»Ý?ø›Û-YÙŸÔEÉg¯11•£Ï›½âB#8w?\´»÷û7#;Ó˜£ŸÍûˈ¬°€ÍáêÛ€ñQã±úçhGɘzûMôe4Eô} ä~Ä(\[ø(ú;¢ã£>¾´„ôþ¦ªÙ'Ac¦¯ñy& i™ÛrR"±¼Ñî0öÒâU™µ6ܱ ç°ÂƒòT<·iW&tG~ ±Ñì_Xæ¨ê‘à^Ú0ðönÖó§¾qCÍަd›ÏÙÛ" ^Œ&LͰÞжæ)¬L@C(ið¾C jßp¸õnÕ(Wú Œ¢¿ž ˜œJTÇI‹ï[b{ð´-]Ì?Ž®Í92•gi6|r @CÖKhª™b‚îâ–ÇôA¢&íY±f᪙m$¬¦^΀¶té}o~9*Ö¿Y:´óŠ; l Ì1(ØG„Xs½´)0C¢)RÚ·˜5-rÎþøÿà,¨ö Ó¨«#Ša‚ùøìŒÊú× |ä~ósÀÅ]{®›!‡÷¨ÀçÌ‚Þ_&×6=•=ᇥp˜ ã{¾­n€$aRõ̆[)Q+–zD}˜ùqôÄÂŒ)yÐ|°æì@)ÜdªãÛW6!&ΠΣêDNA SéåñÙÕ"ªæú4ƒËÕECÍÒ?9Ôáæhe¬¦$$9Í›M>ÑýµÀu+^dâäƶM#ÈäZñ´X–ì‡|-‡øOJ…Ф±ÑSe Fid˜ˆl.°Ií×ó¶võ#Eúnù«JA€fàŠSóªû_»uÑ,úÇÙÝ«ºÆD”JDioiÑ0ã'šäWÜ™eâ}ΊG–m«]èáÒf·üÖîòØ À)ú`Ý2€„úø®;kÐõp…[üU~L}I1ºm.J«¥'àИ3L£ŒšxíÝÀ†Í»¸å¬t a@ö}t–T¯éMÚžÓ¥\MY4ìÂrwûÖ!««|–™ÁˆÉ{ÄmѪÖO ô,%`{U¸…DEZ¨r’27%QoqÏË\r´ïß(¾â˜"Í»êL¯†':‚ÓðPáBáึ(ãO(ô=W÷IFÛ³âÏþÑ;u„WTh¡M s¹ÚC:اÿãƒHÎm•ö%ÈÈr‡ŒFØ| éÍ=,B"Ô[µM>¿ë0å<úgµ*%’\ïÑy_xß;«Ú+êæ²Á™WQÃ4úÞË¥˜U¾½×`4‡Eqö‚æxPYË@F­ ¬˜Õ¡åfŠ/ÇüÊ;‘XuüÐÕ)¦5ÖL³C‡Í”}<Ÿ=2Äë@¦0Ãáø½Š¢ 5ÛÃݲiÂbp$L"L:“ºCP1lfK,ç; ê×Ó›ÄnðLƒp>‹tæ #,A *}àZþ”ÚÚ‹æ ¸~ïŒeÕ‹Foö—ÖFf ?4(NcB² %¦¥V«LŒB¡ÿg]•Zu/$yÎ>פøDˆÓŸb.å:Tà -N`ƒ'ÔS8¨ÖpvBÇn²\kcsôö{ÖûÁ¨m8ûÑD…ǘJw÷ ø\õÑÒ;òSREay¤½X‰AàçÓfPüài‹°¼ø1Ó`o>s í ‡¨Ó(,Ì_õøðÜqÄà÷Ü[ŠŽ·%à›i*Úæy? ÖÜÙ/^ÃqŸ a·át—wf‘ ] ¯@&NU5è÷·{‰»Ýì^MÇýT¸; ô_§å–F“SA½8r±ÆK‚G,ÉVÕ­k]ù@ˆOetÐ0N[Ì(‡ZŠé~óþ4Ž.6úFª\½=Ø’î‹V9”¡OPúÔ`NFÂq ¼ÿ%ãÑzœ v—ã±D§ 9±ûéÌ©¨Øc,òÂ…Õ«M -Î{‰¯IÑ¢(uËz¦ØÀ;TN‡+¨­äaÉëÿ‡FA»{žhÑ:ÜAâàŽy°Ü0Õ—eJG¦Kj3;™”Ô+v~D¡§~RAÜZ”d‡+“ß1‡Æ'E ´lM,ÐB„µç7G4DNí9‡GÚé(¸±ó š³hLçØ'¦£ßIçaôÅž>w¡¸¦ 5›ðvèŠmØ:YlTŸ¯Òâ]ÄNÄX¯^&¤Å;~¯œÇ_‡­‹Ž^˜H<®~†…8×EˆÈpxÅ‚7ì—ÛþŠ«„ˆ„ËÚ\‡kC€ï³W4!x!xyþöZ!—œ¯ø0gYØ´uÃß×PtÁ…ä"-ëxÊ.{eã×¼xŽ«Ò§EQżÒÐv•vsȳŒSËB^ä&áÙˆÄrno»˜Ž¢‹ÚÊQV92©Ë&ê®{•4âÒPƒ7ò¿¥tPJOzyF~—QàRXbˆ²à•Ä ÎwMRêßÛóð”×Ñ_=½¯?ÝñÔJQÔpìg#ø+Àèt½\_0ö^kg_ú³Íñã¿j"n>ÏÒµ…9_¿»åˆbß.RáH7”ÄLeH `yñ¹˜¿1w-µË¸Êö“"SsØ‘ášOæ,ø¤0•a'J2š;ë¨õ‰¿öËÅ¥Ö-,à8Ó¶Kï– A…yoPlšÛôw8Çl0ìÊa BMjÕíF¾Ñ2 f\H@µi/škÐù£e¯%¥Áë&±; ®¾# ÈÛuìÖˆ!›}³¬ôå]PBäsDe¦ø»f÷0ò‚Aó™Sê<¤¯“9[¾ŸZ2!~ÔÌáÅ õ"»'IuîØ1 ö¦v(m°sŸ]žú¨=8ÍìmöìQ3²¼n\ˆ`_«Ïë„-áÒ|È‘8wJE³Â±t¤$™Y«9Ö7*ÝÒ) ÿp¥ü<Ê¿¡f8G÷>>ø55aà7lÔóŽRZîœü¨bÈÌ ÅH¨F’‹Pä¡¥¯§Ê·ÝT Yê©0¿ÿiÍg)MG Û }ÿ(zìL•õNλïE®hà{ æÉfo²5Z—ê¯]wG‡ÕysN9Â" Vuo} yçÇ(Ø®ÓN(´úíµäK(ÓÞöóQÔ«ä +‡ŠGG±­K´:”Œbã½m<£,Ž%R«AhŽØ8ÉiÛèC_3I©n/ kœ}±٣ÕyjfN¿ aUå —j•ÆÚJ€Ê|®nFo´ÎNËÉÏÌŸFó‰FK¢QH†þðU1tÚy a/óÛA…W”Už§3Ìðùdbm£)²Ie$­7Y_Ò§†šÓRBÐó9V ¸+2äÛy(U­ð(¥|`Ìç2>p$?éËÄV9%Áæ“’’Ÿ¯l;QnÁõ_ÖTE•Ñê•)ZÌp’Aã[iXlU_Ýútj&vOÑþÏcÄòZu²d’ü\w=…%:û£Ò¥¹ D….æ¶‚~oqD½ïìzh²2½H5eÓ£èav²Ýð¤/Ép d<¦i8{„+¥ ™¾ØwÒ¢¿!¶žšÊþi¦„ôú)I¹²Ždý³xàænçVqB–œ\¹/é¡[ \5Jí÷¶. i$‹m>~ï{&Òeua¤Ú\³Ò|©¾Œ(># S¼™’êX:9¦)©MÏÚ{úGÈR£­¢Ö1¢÷MÑš–¢=a§>r©±.¾EóÀQ÷¡Q}_Ô< Å–ËÀ˜‘‘úŠËý—@•.hê̽×9kkk9•—oØ¥qå%>èÏÃõ#Ý"=Ô®bé2&Ø4yÖCR×¥s¼:X¢OÁ :Ì^½-4¤@±ÝwZ´ÝAY&ìÕ©mæ 7Ïg*©B ÿO“Žåq¹ šCa;'Xo@ ¿”Qa6:õ%¢C>í0„#Ò{Ö$`w®dÓ†%D?Ñ>x‘_ˆâ„ V‹ž* Ù÷P¹.µ´Š`ÑÙ®"{¤|¶þI±ÅÿZy}æÈE„eÍ3X»ÛµOÖ&<ºÆ—¬8tßâSfð§o¬tÂI.RO·CûaLÄŸ‚¿YþåB¦Þ4Ã>½ShÁKw½r°¥y/ PQ˜8„ãFÓÓ¨ÚG¥ãA5c¬u m-c:\«kðôÄáÚUUpymׯoO¼ÞïçuDÕ‰ÌLÂWüCwÌN4(¨tûÍŒ-Þ5Y¥ëY¦q’¼©íIÿÄ›`Z¬¡”ê\QÅì¼³§ ?¿M+—@úvwíuõŒ{“¥5¿Cú{ikl;øü‰ôåîØ #›Ñœ•4’,'†ÂùÿÒáà‰na‘ŠLJØø·ž)|ò¾®Èzû¬©Q]ɇâÝÜ@òZpÒ©= bnna„¢Ïè_†c Ò7ÑR•ÃÅo{Õ¢OY¨¼®€›–ëïßlâÅ‚;Rõ§j߸jf“Ì,¶T­ Ï«¦Ž#8õÎvü\u…~C¬ °$ÌQF)N ÇS^¥ÂñjüuöbÔGZ/ÃA£È.ãD9Ãå)¹k-å•JBÿ0ìwê£×Â>M¥Ð¥;í«ÖädWªb’X]:Š1ðUž…Ud¿.ž b ²Jå8*m%ÂJ]T²g,V‰Ãÿt5Šm!MDá…ÆKž•*ÂÖmœm^ÖbÖï³€“[,Ì£fýxù´ÓÃ}JlØ•77íüõéIñ¼Ã¥1 Æ¢zÒAºõМqÞYCœ{‹j—l3ÃC¸s—ÜZ“„˜&üLó¬ÜÊ:,°‚تE9Ø$=¿6<ûÞã8‡¢d).ß~ßwv¨Ñ+ô•?ãv kbuÛNѲq5 bëKzϲ½¨²Ý+©RM‘Ä>üùàŠñ¬¼ðîàXì[ì°J­éÂ=^Pß÷¨û,?O’â©d‚é\¹vÆãKêÂrê6)Ð 1ëHT7_h†m¥ì.Çþa+¹ø0Œ. óHÛO—øÕ&ëÜWÙ¨D)gQk}k¨”X>tÅÉ¢F#ΤMñw.*Ê»\ÞÅ‚±C sXÕñkxF‚ÀÐ*€. Dÿ®«5€óä %t™H2Er¾vQ¸ï×+H_•ÔÆQ^ÌíÄ[›¼v²v¥ö©XPhùl°¾eÞöbͱž¨îûÏ@5;pYGj¯£;¢jù;`•jêmxŸóØÓ&j-‡sî¬ïÓwm¦^ÐÏ›CVÂjS‹ða»;RO*jäÝ.›¢ˆ²Ó_îÑ¢ó%Â"WÛh@MÕ¹®¶=DA­8_ ÝJ¥Y)jÏBfÇã»Ê[“n`(«ºJDÇ›G²Ÿ¢íeØ'KTÁ}éôñQíÅwLÅ6Dwæu5]«^T±1ÖK»ª¬y%àö+½©xÆìé·Å"W7»½!†ò§ÉÈ««&+’M6­¿Ï6e–õãOYùêÓŽLÂNødW˜c™Ó Î,·þ,©!ñŠ‘vnäS€õGwpx=¬éÞÅ™"aK؉ˆ|jßÌîá8ïÂ4cüˆÑ­øa~NVÿ§ ’‘<&5„›N!BõjôGgŠEs >Ü;d8À9Ðk±zº˜õç¹ËÌ­ÿh³jÙA™bþ“\gÿžJ¤¶²…ZÒˆA²–„Ÿ;øož;Y×ç{KnÚ1¯„Áõ~P ÏŒ[5/ÔN4VÑê?ÿ¾$¨iq·RUODâ`U=ÖYx¥ë÷îfǬf羕ҹèi1º‰i‡ù|®¥·ëáÅ@iÞ§KaWñ›ü¾¢åšÕu2‘ë6’?14ÄÎÜ>Ð8?æÝók¥&RÞè"V‘  Iª?¢];pf3E&?µ›ð×g¢x9Mqacáø²3r·/¢–i­=B©8׿ùéòc D:m—|da5ƒ ‡Ò‚Ù'sŒÑd8Kôžß¾XYpRH:8_=l#Èì1îžÅv…Öp+ä#•þ5{örqEM‹¥A)õ ’‚=X×ÔPÉ’îÜ+Y§ ÇWDÚáG·`ºœƒön'tÃcRÊ$-KÆß°}‰nß]b¡¹IÄô¢ìâ ÄN¸ó¤â¾‡ÈWóúçÁ³)×U:/[Œîn3ž\2ÇZ‘NÙ3ÆgmÎuñŸv—7VPüq ë|ˆÏ“°‡‰ß–-”šÀÆrÊZcû›nŸs\º¹)~Ò1€™½ÃÒë&‚ù /8ŠibÁ!›óMãÎQ ™/0¹øèµ *Ð=Ðà…ÌFGÙ³(Fì#ûÈÉkºzI<³¥‹±=Õפ;¶b*ÖŒ„6ø•±Ô”–ˆzÇ­Ä”D€:J ®Â™Ú¹dûu1K¹×Ôªÿ³WVA÷{Ý~x·ÍÁzˆ!Œçàø)jÞ!ûß5ºè ¦¾ÈŸ*lm¯?º„Z[ˆÒÀ3[h{@0@–ˆ–?m¬TE MfÓ=x§c¶õýL›È€M@õ,ôºëÆÓ]©Íîz0·ÞÐñ…‡¡~@p°£à5‰ôKlÖfبhDù ˆË%zJùÆP6è3ÕõÐüxÉ‹Á·LB‚.tvSÐfgÚ§ªvTq’žÔãœÖ›Ý´p±Ñ7³¥LøÁÆ(â=éîþÌKÞB—µ)u*:„¹Fuiê?o@—ˆ–¸dÁ$Í£4GõÂßfÂ\UêBN:mÜÒ0æIÿÈ+;À‹¹™¼Q6¿æw®«lÇDÙ”{Ũ“bÇš&ŽiEÄ-ý‡·}œyAÌbST}©0†0ë{ÓáÀòŠÂŒÌè  ª`òkº·W«`/ûÙÉœ8ØRñðx–s›$n¶N Œ^Ñ—«ö&žá´­üöŒ{>R1xM«=C¡Š‰ŠãÓþ@SRHÄÎr¡Sp)‡âËûÏîøjí_Ðfÿ“ñôxFÌ¿!mBC’«¼•äVÀt‘§Áäo -€fIüÒ4ß/‰³¶ÀØd:Çha§@Ë'™äeR¤”¾QÆFÕÝ‘Ýèsj—ˆZC/%D¬ªì£tÅ vwªB kM¼G{Ff‰ÿ þ¸)«ìÖÀo¡­·o'þS»›Ð[«4j-e-$x°¨Çj¦É˜Érn‡ËÚfù¼büDºÇ4p²n„óV¸rKê¿vÓBcøäZêV„»`RÀ‚mW§0‹á'k“Ákÿ„oµów4Äg¿¦N“X—·‰Õ˜\ãÚšŽ¸ —6]ò^^‡^Ñe„Vjú9)Øi£úœ×ªô{x“˜ûá)!³“׈÷[ððÆ*[ÒQ$̘„NNÞÌ%Ù7ßVp exÄÑ‘£=¸ÂOû/õPJNaåû_fÛV»×Òô3þá¸ð×€ìOv@´ÿÀ5.³˜·Äoô?“¡àVÖØ ¿;A§Àž­ÄÿRBiÅkE™8~°u ji7°lÊCR£ô–ë9ïY-r÷§€•¡î>—‚¼•êh2ñ²q^ñ® ôr.…ý­ô\Òa!ç‰*qøl鉔ᴵhYÖzQ23Øm6¬M¤ÌäÊ×xãf' ÝÅ0Le·P¸½¹5Ο µ3}.PqZ!ÑÝ’ ýºÛjAi2½Æ—ªåÌó.™pÿ¡ŽÇf„Ñ%`~&Óqïni+ðf÷ëoRqx ›@w®þ¨¿ Ÿ-H6‰·\ýWSCR ì™^l,xŒ³h}cןwÏô!Móæ<ºYÁg‚3ubnÚl£ùÖL#ÞzŸ.#½2¿>eƒ Ø£düS<쨶{Far× ‰K?ãZÜö>wq£’K{¾€C¹_—w¤ðy-mo™BÐ$E°Ü´Q £5#Yª1b2 4pÐ{h¸©àߌ.ZvÒ½}XÈÂ×@>u_è–ªu";L¸F½ ¤éµk—©Ð‰ãçAnkÐ"›ý1šEþ0’æ¾$[QóçdÿûÒíž´‹ÑCBÊÁã c?½k‡Ò…)ú)¥Eg™¾ÈX<è'üÚ!A›šJö€”\1O€ô׫óosãçRyS6þ 4N˜Ãh$ žCfÙæjatëîo1̃àTJÓ!Ï/bøÅ0¾Ìú‘ÅóÅd]bË5Þo£Ú×idÛ:ƒè’Œš¼·-‘Ÿîpñ¹uˆÛ\ákÇE5—¡ò z‘1°¥mL6köž‹­N D\vûà¯*÷ÇM·š¸÷gýìïú° b ÞƒA­h‡T‰HhA)):?'åüÎu)»J'råAW,"S+õ ¢ü}KM¹¦³Ž&hÎØý_³K&÷í_)ßC¥±Ÿáù3ã.ÌØòU`ñ`t±Ü¢\à†6=>½a9Ó%”ÍY¢Ø¶¬žçÀ Ò+JÎvb³I‚L’m)ª_ÜœÄü°zÿqûÍa?û¤9(Xb—:•XjC(¶éJ±…ÓþéÈÊïßü•žçíQR{!Ü¥ºBº.:ŠwÛ¨ndÎ ²~›]°ÝÈÛaàY‚|pcÛenŠðZhÒod!ú†ä®be'—³…ÈX\r“.GÒ=„­÷æøÏB ¤çŠÑq¬RôCÇi‰ïQ wLqCëìTJ+t!r‹yP.‹ú*9LÐ̯q;\à»x牢»æÅò[fæMÿe 1?5($`äÉLÏ…V›å„Ö8ïQOÚè±±èwWœÔ{‡…¹‘dH ïFX ŽÛ”N'ôé)5î~*Uû¯ù’÷ž÷²Bh¿“²K¦Æ5-~©³7ÐŽÛÇ_ìP­HA®eQvASæàŒ„¢&O* "%ú9¬3ƒ»QìÐvíÆz€Ù®U—[`vâEðŽÃdEØð]Ñ7H™Zö_ÿçU—醃戢@SÇišáaÜÚƒZ*­ÍôÙ¨'P•Š9®hPXÎtø‘bn™I{È-bÒ5IMØ?‡äj7V‚>#CMG®O5¢Þè1F€_µâŠùâßxI~ö¤[­fß{)ä•€1Í–VC#ÇZˆ¹Žs3öøÞŽu&û_Œÿ®KÌþ2å2ñ"z Og³QŽ q‰NÛh‹ù—Q#ËáÞ•ê ˆ'zi¥×iLD±Zäµ’Ï:j¶éi=€Ù±¸›Ó\؈·d’†^~šÐè&oNÖRQ‡ÿîÃdB/Wbþ© Œy]D¦Î "b:¨¯ZË#ó5ç6Npml5}ýð‚Óëã°P?H·J­ÝSX±íXÖå}~nc‰È2k£.¢·.$š²Ü1ç:#ºå–6ñc}Áù÷wÇUç%ßN†À¬¸ûÚ?¨p„ýqSlí% 1… ›AI¤ÿPnàÖµpeW¸1àœh{«ÎxMʰĦ,óò¿‹%è)øáµ¡ôóëV¿ŽG1–wè0de}Â"ô¸Ÿ^Íoù,“ÑbGÎq®çÈ´dw"ÿ§¸ìÉ´ü Ã-ë`^h_nçÕJÐdBNyâ¡ì-B±Ò“ã–î „2¥ Ü2å)š§‘ ¥Ò zô+K.a}€¥ªK(º„Ðårìÿ4ý¶rc²[Š Jò'/³ˆÀÁÁÂ:Š‚o³5;öl\©Šþp}Á¸„a¯t@¨›æÙîH³b–ƒb¯ZÕùø{³y!A.N1{ O¡ø¡—1R2Ü]MÒ££±l‡gú3âò'Ì·ç_¾˜Qâ2$&ºãZéL¨sVÅÏ!}Þ­ðbS†èOÊ!x!xyþ¯u3´¥ÛX#zåNioÎPIŸ»OA_2ÆË¬¡àìàŽo56¤ËÓj·çÖ\ž~h(Ç ^óGì*C?Mî×àiV8øÃëƒCm]GÝeXÂ_¡¬®upqÌ–‰idrPË*ëþv?SHP­{ìÆœˆÃjåÞMÀ1ÇK#¿À¾ bÜ ô 6¹†ÐoujjÓîQs¹J!e2¨# fÞ¯ÅÝðÇ»ÊnÚN #–ѷ×X9Uw¥Ø4΀Œu×AØ4±„ÈeÃØ¦\xs©û`—wQRjs„ÁSÙKj’²eŽàë}©Î±_y3„yÈzJ+çeQŽ’ÅÍ%}4ïÕñVE0¯yç dzïÐáûÏ !6™Hžgªë9Y‹q‹ªØf0;VêVÁx,%µËX^Á*3k÷K³æU•žo…žcìrêÅéIfû,há`´oçÚ`~¶ãqâ¢=.¤7T;Ým£àÚµòÌÝè]åög§F'ÛÈÉ2J2\ÌRÂÎÓ f½p¿Y†œÉ¢Õu{j¼%–¹I¾uÃæ£8íñ±<ï?â -ç)ßV̵Ï%véqXJ—'¸N®nÙÓSõB L;üšQɆó ÓZZÝž1Ќݤ”$G¢]–Ç‹÷cÕÔM⫌•»8tŠ“ná¸Å¶º·É•þß¹¶7_êgÉ(=lj%/>‡ ™T¸ßfd#å&² ¯Â‰ŽÎ²r î’ªbwñ‚rgï=þàªJ»2ÄWDvaºxRatO|Ufý«]ßO¶ÀŠ ·€ŒY»BÞIÈ­Ô÷Y5 Î׸óµö„Šç¦– ´²¼´w—bdâ¨JCÏhT¸(DÕ nB*9¯ó¦ö'Ľ½µcgóEМÎKO éÂùÏ6§ÿ±/,Ž£iEÀ‡ù½é~Z§àxLç¿^úúqP×P[÷A+¹2 ’³qSœäDr>¬™ªPƒ™ÓíÞ¿OL©d»¤J¾s¥bì&‹*îfroüâ2ÝHhÍ…`d¶1n®Òôý»ÔËu_Ú‡9kªnXxLÚ m‹Ç™®Ò*…ô³êÝFÆœÂjhs‹² Ë&˜ù|«I9iüðqN7bœƒQ2h;O^MÏ+x¶Èòò Äï_ƒîwÕ2Öªp˜È“æñK wz¿|éˆLîUi7ƒV½ùœXáa”ü;+"¼ä„.ÏÞhGÛæ•ß%ºp ×\.ÂÌ—ßâ¤ç\UŽ^Rp×0^Sy½°õ¬0ð‘§|d·»ÙOÍH†]†oM$!ïR‘Ä®s‚FÙ–\¡…Ã[%ƒ„b¹7ÉÙæIÕ,ÛÍ ÏjŠ02\— ø3ðÄ#eðãtƒFï‰_é$S˜‡nD‘@¼Mv' ‹ äf*¤[—–¬¢^?øbOî|j†7y–¤ú޽Kå2/ìÒñÿ…dZšD]Ç2Šzi¿õ&:÷–i^J£¸Xóøú¢ÎFY‡±òV‰Ø´ÿoyÓv£êãªÇÈÌd6åq:a­ÆÕŽŠžž—‰“‹óÞ5ó­]/a¶»]5'}'Ð ¼4«Dîë™5ô×qƒG2ü2zc¸v—Ûùê5º —a#[ÐûÉìíÀ*Vò2€¾öÅ|¬Ïþ.dymA…íÄi§–ˆždFÄ p9›‰_ñå¼ôjÂ0y¿~‰_¿d‡ 7îfr_,Vq-¤Ô€¸¦8,1~ï &‚fH7À®Hæh†àI øe mêá6(ú;4~ÑzîHãø2@–»äîN0ùדµN÷.ðo½é×®hý®_nzÜD¸™d<ÂÅ>Çf\êA2«È‘jÒ÷còhˆa6«&Q]¢“H¶»M! >`øPI5Θ·xìàe¶¢F™n ü0ï(­¤Rø —í]¤‡OÕ@ŸpV .P•Àõav‚­•§@Ù_ÏÇ¿ ;_ïè­í'u Ò$¸6;ç´ïöìrÄä„Uj]}bÞÆO,·ÑZÝ-|õ¹eSq8Lì§6®‡„—TÆEü çÞÔãȺKŠ™qnvz/BB‹aú*ÂèýÊ!­¢Ž¥«¥2Ía]G’lDçÔýkô`c®rTw»éÿÐÊl].5Ë‘Ck ×énáˆ!|¼`<:ÄSø>•€c®ÆÕ&ÑŸ eGçÄËZ q¼]ß 6:æHÔL·qfRYåsÿ”[R)‚%"ÀÝ%ZÓ­BGeŠÁ½÷,‹¶/CÂó™D¸˜„‚¿–<¯¤XšAŽa1Ëù¸~ò6rL… Bù¯/6¨Pr»‘xÎ5µŠk:—Œnî³y¾DQö&#¥ksþTÛ¼O4ý_³t¢ô²íx8Â$wøëLÑÅ;L¥­txšDhϧÏÝÝÒ=²+¤1\p7cÖ³ÚWŽÜNÀ@ÔðHBxïö²ô±ã¥uÜS½­²KèŨHü—ÉcZWò¼‹‡’+?\«å·Ÿo¬;¸ZOö Q'ä]›8×f æíÒîU©šì‡™_T€Ÿ"a{(Ÿ0:Çh—ÎùÕEozHZ¾LÛ\þ,Ç”•¸±‡µ?t¸.ªÜ©kعÅŽÑ»^އ» £TËíƒu:ïÞõN2Fª…÷–þ;éÍ]¶™,&GäÓ+¡Ký^ðË_±÷]×T¾+àêll§P$ÝL€’Äe‘0̸ÙIâÝ\Øzf@½ö@$ÌóÊ·ð"¦ˆ¹Æpæ´ûû z¥O5-ö[0¤]_ïær)óO¸e` 1ÑÇQ«ØÜ¨ÌnÃÇç5£¬Ëk@~(º”v¼Òâ!ðj¢á€ ÈŠuà,‡QPX¡ØèݤÄįײ…øw‰ÐèO‰­Ê–_û7ÇOcàžZËZfÈ[„­Œ>…5MàT”¿¯’ÝN‘ï¦üSþ’·ÂËÙ<æ›5ÏDºÊ£:YÞ€ÕF¡$ âañû5^Iù±[VÊP2z,bÀ¹Dï}D‹bûu€Ve¥ Û0œßÇËsh*uBú·ë8`ˆt“ B7QØ\"ŠÆl¡Ÿ?{_+¹3²Ý2¿'æ†9v+œµ%ùÐGާínés^v)²Ó,®AYÌþw=šÌ—&rð”>+̸̿÷ÿÓ‰ÜðO‰ä!¢èØ r¾ž(l>‚N `O‰W‰†lÛ&êÚÔ´o¯8ô¬—ÿ*bkÀðYÒ:°Z­”E‰¬µáT,“’Ø#Àrª‡™” \˜8jִе6R^0V™ôs$!»X§Uh­NÛS&Œhù¾…,†êÓi1]Õ’69ÜF—)ðñ¿úô¥Òžç ¦2¹æ=ÓƒîÍN£!d,¶È—·•Ò“aø%<&}Ëe/`Z–ÖI-ܬ+¿NˆÉ×^Çsd»u® a6&J”Çà3»†ÔE—í9±­;{ÎŽeœ­¿ž³ûñ¨­Ä·L90j…Õ66í‡)œG̨G ©÷q‚`o†·$y)6rUg}VI_"ªu²ÿ¯ïÚ:‰„ÆÔ8Í|·iI{šö!”‰\ly“W&L} Lç¢YÝ–çsÍ"âŠ[êþ&ÇÐJØgˆjÅÙÑø=þ—öp Î…ž eF%ç|½ å‘”pųœ0˜$‹9æP7k/½—P»'E´Êáa]{jÞDÕÔ¹°„’çÒ*ñiº ƒ3v›ù†*ÔnÌX¸÷+XþÆÝiÁJï]z4?› ê¤û¿Õ0·<ðþïLE§ÈǶŽSà“fr‚G]¥ÛgeÿV`i![ÀШålÂÁ5wµn±:ê`5ÒÜ:Ýzá_𩵠dÇ·ÁßÕ[Ûÿ¬Ç[„%H¸¾I³/E®;wL¶:›£E¤C/òRv†ãͧð5G´½ßNNÙ0žp‹àCS)ËLnx&{V‚!ÏdXõ¢îÎ˨!Ù¸rµ¹…¤]°Ë³ ”2½¬-·<)™ÚÞJÁa¥ßDÁ¼`ßÌáu¹ü¥þÜ4Ïzœ‰{7…}Œ±ç¯ôXj#¿É† ˆ¢‹\Ý¢[t´»%Sèíyk#åÆô»nîMž_>‹KxÕ€š+ä¦ ãš ¬»«–aš4ß–ªô.Å»É.K•% ⪜*@š–oEKÅð', ôrª;ÿ-UsOž>“Éïƒ×ÃS³4Ì áè°ÊÔÇOY“Ê·'OÜßèkÛ»óêv.V“yÝô ZT$3rwøäñ¿ÛeD¼`Žý¤Qw¾´± ž;a!Û_ %Þø¡h‰°ÒÚÇΞç31µÝH²â"LÎfj[!úí«k¹Û£kkXŽÐí8…øg.¡zk& öSÙŽe‡dRʬëÔøÓ™èXꉜYåõ2ܺ ¦ ôpGó:¢ U1×Ür*&"°;~‚ÏLü‡E÷·ð@¿ ò Û ùóR#:ËPÑBº[è©Wñ²¯O>e³? ºÌ“HcÒ„^Pqúá㘞ò( V¨/yîàZ¤ëßkaÂY××÷m }¼ˆ?aO5Dà%Iœ–{ÆmÕŸÇþý›­>ÂIE¼oᵈI¨¼TL`Ôß +ä·eLD»Â¼1¸gÆè#zñ&(Sl}B‡çË;ü`ýÈDo1 j­EB ¦Út’mÉi×RзÏo6­ØŠÆg¿I¢7K 8ü¢å ùi—ûBu›!A Ðm]õf4Dì@µ‚‡"ðúu(T¤ú'òáz=[fv–¨‡òüî%…R3¶pçŽ@¨e¦Í·óI.мM#õñšå±[±Cª¼Þ 9‹ÍÈË3žãúH»/ű¦6³„³BÄÑeº )ê¨Ôøz¸³kP¥¢0^hhz[KÈUPR5J©¦ý¦¢³{²H#~t!l8Š*jòxˆ½-W²dc³½)$£˜h|ÝGäêqëÈ×\rE;rˆÈÅxb³+ «¹ÎkÖíåc'Ó7º<™2)-wê µÓëá;[·ÆfXc¬OëƒLUØÍƒ‡÷ѧ‚¤#¹öp¥œÛ0ìÉM*OO³”c¢[Ë–{]Z¡¨—£¨<ÖK±\É¿1Í}M§Œ•uz`zm<äÞN„þy ¹@R £ªuàÅV} 'ç°ÂÊÂÞ ”í®‘]ZvÊj¿_óRñ=ì&ÛJÆ·(k¤]MåíÝ8b­çö¼tÿV#ü'IìK_ØèÞÄ‚QIÿˆªg§izA·Ux¦`T«?øß`ïƒJà¨j›PPãÝ2$µy~ø+°Ìr£w)ŠqM€ì$¦dcèÑ Êf½Ä¿ôq‹‰‰ Lâ£J­™IÛf”®çÖ;2y$åLÜ5ªNøý·HÒÆ…ä"-üð°=<XC‰V)$Pç¼`à 6óºZ%XÁS³§³å¶x™AøÈ?e°æ¿zbh$°é0É›mlróHÇ%„¦~†-„4„²µµ†H⃪bæ âg;Þ$¬±váíœùÔd9ÝÏ[ è8M¢ºîÄ<ûcÿ7ƒ ¹¤çì ójñu_û,iðèô€z)‡×£Œåÿ=ißⱚԸ¤ÃX/ô¤£ƒ±^±_åóa4¹±k#¬ôz½R«W Éd—ØN‡T¬µå¼'spï. áDhÒÅæÂ2]%áy°Ý Øˆa§ÐC‘ eðnr’M–KÊTƒ•ŸoÔ7×ïàFügMÛó¹ô­Ò±L å"® i°±Þ‰³§”µþ´ÖFKÑ8Ýazµ:¨ñ»–$RY4V1lö©­jÈ“0½¥Œâ­[0Ë6ÜŽ+b„^|–[ðRîÒœÄ:ˆ°D`D_;-I5ÎMFù,™I‰Fa©,$&§D@ ïõ\¢Àìh ÅA.u:Vn|²Ò0=µ_3qÖº|ô¬Ë:N¬©#Õ¡#ò•Ã}ùJ†p0TdVtiÕG"û‚£áŠel­C¨r–=ç´PÛ æ—‹„娘‡ºÐØó‹º¥röf |Å&TÇð¸á˜)lÂÆîea{8:?IV'Fü½M·&¥ ODæNÖÕäõˆtÞÚÒÀ;œ©•ôž&Bç0}|Í6êËÕ`fªë#&`¢¹_n|YE?]lèE ŠÛ:7+@·e ~°˜ R èÚ±”L)e‘D¯ï,ß_À_1Ç9D×nžâý’k%¶(W´’²:fÌÿ U•_¡g·ª~¿_¨sf•QƒA§ ¤DïÄ£odr\†ž(%™`8GŦÛK/Ù¾Ó›“Ñœûä¹]dƒ»øÓ|·ˆãµÓë."ì{H6z‘m÷rdY»FL`–/x0P(‰¬,“D¸úEìûP™UXK'Àä‰þ~Åêm üãP€`sr¾Öjã=±®f¢ïW;RÝ)´îÕ6îK X{‘ Ì=Qr´¬H˜¦ì½ËïòÉhÒnÜ3šÍû|0ä±>›Sb@&KÌ*4¢ê½džšípo&lIjÆÀ"²?ß å€Ÿ\¯˜‡k©+W{Ø ÿĶª›Œ§G·ƒ.Q@L¾¶99µØ§=}§ò?²vÕP Y£”¢¨TÚ6Ž@Ñ ôÆ}Q4 h|+ëÍ¥»¤iLÃ’0(ãÂÂ>®ªôIpàÛ.DæŸ7*ÿg÷5±ß"‹äßÓëÀ’-õ¾Î,±¼ŽxC1ª-@_G+¹í´€Ç„õ§§ó»Ú…h·²êË¡ úW(õ¦`šÂ¥·Hƒ ±ñ-Ón TÎ8Œ\04ø…¢™yYŸæÕž“sŸù‹.¬yx_ùVB$Ö´TüÂC ÒŒ7”u¹ßÙ•^O&†£zCzï>@ßq5>“%Fÿ’¹û·ÄM±Sp`éJBdèÞ2ÑóÔÔ4V&¸¾ãˆ–ÿ3PFª)1…IÌÇ‹~Ë-Öü%[iÉ'ù¥aÝØ½àŸÄ7L%|˜âN.ät¸`"ÙÜÄI·0–Ï›e¯ž¯Žß{Óñͪ^¶3@‰Ü†.?Þf3úÙ@¿ˆ\—a…­Vg™u¢Y08üŒ^ÚÈ/°ڙ p"D›vza›¾éžeÙÊSΖm Ô ªŠ§Æ Î&^ý’Ý«¶À«¾Tñ‰ @EH]O ‡KR|ÒiU+f4`“^÷‚Lì·×¸_fd§¿ìDŠ~Y¯h‘øø°ÅøÈ$Õ,žöƒ¼…¾N$ä ±â=NoŠ1ôdñ¥Ñ9‰Edÿ:PÍáIVÛ;$àj÷½µRz*…>•5‘MF$Í9ê¤ïܬ®x7 0žó` yöV¿Ô,îøò§¬ofGH$Dõ‡‡pkéÇ«„D(ª»fy丘'¯ŒùU“°÷êx¥<¢KŒ‰g ®"0… ,[\>I3 +lZ-NøŒÒF—)L×Jz0W2wpTLî}ØT ÁnÅôÞÔÔ=Î_#+`}w(£zLч“%õƒÁ³pÑn¿º•€j¶+ðþ“¥ŽhüWÌá¾d‹©jöôòˆ¨>uÂ&=Ã*«“Ôí,Ùù-Ù}Ó/‰Z~v l¼¨ì(l1ÕˆP¬·ƒä"~æ¥^µk¹ª¢_äd!šˆÃ¦ ?ƒ‘¬‚,W¤Ø?ŽÓ9Õ§ù*GÉQî© sh“&AƒqÅÍL¶Îÿßz˜5…_SØ¿áåJ˜TØ÷XNÔéw0cT—`JñVB»{¾…L‡uUo û<Ï<Š~ñ®¯óq‡ZÒ0àåÏ¡ÑìÎZÄ+·/ôc3<ï²7{äÍqÌT}Ît‚z`»=,’ ‘e°ôíCl:9˜ye 4™r ¤£Þb³Š!h‘K'œ”U•œQòÜI1-&ó‘ä,üx|Ӟ؄†u)Œ™pÎk¤9®ÓFñ¡ÄÅAÓ¢…õ›¾#€r`Ž!Ýnµ(%5$lxÀj¾âމh#om©öÑU.ºÒ¢†3¬óòk†ÞeZ54’;õGXó”FýŒ– Áÿ Ȋп”òOŒDIa¿BÞß4ƒšN†–Q)LŒšƒƒ)[F¦ÃȲmttM;™¼}}ù¯æÂ—.ÖÙ¾Bá¨RrÙj=ƒFÒ³ýló¿ëušvŸ<ƒ£r±j¡}'SQU¾óG}ÑDØPšV\þ K]ƒ%:s‚¹ê[®Ø0;zµ!ZLÓ¬»ÒŠ?ÂOØæëY>€ƒGêÉIΨöžnÞn·•ùÛü]…Éõb[~©‚«¿Yçà¶eiSUHmF£"-Ì÷žú%B N«°{Åâ»6–®°â¦$qfÒ~VC¿Àjı8À»Ý íÑ\FŽ®÷C$eÊgÀ÷¾B&Û¿²ºí¯/æu/Ùß^0nS”QÞmpŽX2¸$èï00DøU+[¥³±úíÜš™ðÔnQ0µæ=wÆ=@}'t‘û¢g$åÍÁZ8²g#"?ûE_}ø»!ùeCŒ7G·ÁðOŒZŸ}«áêCs38#%gÄ¡#J¨¯˜äEâgÓš÷ž¸Â¦`¢<Î3«äu³¨”â<1ûÀð«™Lh›_Ü+m§š÷ûOø³ãL_â–‰iñ½ƒK«Z&&ñò[i'Æ€¹Cy^O1Ä«ñíæ.¼FºRFІ¬Ñ 2I*ží‘¤³ßy*M¿ÈäO¼kq×ÜÖÞ‘Vò (Ç×ÁXOôõ4ò!7}‹.t߀Ë*½ÌhW4«„fï¹£aßÝ…œ¦s„vI!Æ=ÕVÔ{Q:¦¿VÜB|¦ÊÂ( gù ø|'H¾äǬMº@#”0o+@âͿϲ.|Õò|T< ÅI–>”Ù\ ðúmJýþêR‰ç£:±£î®Ó+¼WmñÕ‡ªœ$¯5å4Ÿù­üÝë—¨¯UV´Z‹|qB ΉúÞ˜—’W>&#, þ 8~ÔÔÑ" ¿z&Pq[ œ¬S mnß%‘þÍž»ê©1õLnƒÖ>6Ì6R`ûþiv…Ucvf5MþÏÑSü‡¶ºÍ±Ê…7ÌxŒF'¤sZº$¦úY–~ G±#¥¦U. ýtާ?"þ[]âïÀ%§Ò‘|`ÍíÊìcãM-¼zž;.›çòVcÞp‹t’몜zzŒQFq£ø©×ýühH•o`3é€ÐûS1E>Ü8T<¥I@Ý&ÛVɃšñβ—¤Ñit<Œ†à¢³µîªN«YEw·lóZÚ”ië1œ&hº|W´ì{€Ä£„{¤¹)&ÔZcÙ‡ež¨pÇcÌ#Ëtÿ0 P»»0šõ°ÓïÓØÏdk£`„ú|ï?M]O-‹&…L7wGp¦ÃOý†¥ kaÎÆâ^Ø\6wjÑÕ"ðœoo± óJÀºPšBƒÇØv#>#Áï¥W`ÊFIi£ Žc‚y¤8[3Yε¼Jaj>ξâ«ByÅ̲ª[uvÐwr!|¬?Ûsû&ÄÉ[Ûf$HÏòKH "H4ø²³äžBç¶hÙT(be;@kÿ½|Õþ®¾ÚÞ L†¿Ó£À «y YÙä~w˜å€qÝ»µƒâÉl'‡mý@ö­Ž!&~O WMŽ^hLšE§™ž>Þ‹ÁPk^ð(3JïÑö0œòïXûSyÚŸÆ Ãн3ß®]ä§à(†£ý¢,T½âÇeˆbºßêqµLK-Þaµ†¹T×~\E×®öT£J4Á˜ÎV¾?™Óƣ͡*oH‹ªÈÿ‚·Î+*4¶Ó!üà¡þï´Á¡$©?b€Û~þðCOÝœW =p…\kvüß7#~Àmðº(—±¡FqB£"ÊÉkA¾°;öB?©*D`%›­£p,!â»yžp>¬>xuös¯È§R“ê¡o‡FZ „äE~–{§ÅÒeòÙ—îüQ~'f8!Dg1bÖù7¼mZyèõG#›Ø¤.€¤e| ’}>zq͸ԕ4Î%L oI‡fÑ~@»GìŽÆö(%5ÇŠÎ?ÞSŸ÷m…D ¬þ&QcÞíóÌÑÕý]T),Q7ó‰ÚN·QÃ!—Ümþ\ËM€ݦÉ$]m€ý¿ÐNW’*é1):’Uža"àù¡«I:O‚¬bô Á$(ìLÔ"lÀoþŽN3óéÕ=7àüxÎ…Ÿ)câ¾¼Äzï;‡}ø:Òç¡ã¾ÇTž×ó0ö„ÜSÍ#‰þ§%Ñ%0õ\Mr®8[nƒj8ÓçdêÄl  Ä©½Ô\×nEÜo|ÌÎáXêãp»íëÕû ÂåøUå1CÇ&o8JÿïŒì~­=á”Üÿ¯wX9 !®c»ü±ŒM³‘8CT’xGâŸâšòÆÌ™úÒ¯ ðÁôµ”NÌ@/™×éêîõ©mA˜½ÓÜQ@³«Ðµ0 ·´ 9†×«ßµ™4×ÝêTɆxºj)öý˜s×­õ#™ÚôSÆÝ½)c³Ûå­à& ùüê:ˆ´L±¸¼ð^iý•ûÅ9Ú¬²†gYèÈ!-g§ëJ­Ö¼]”øégs <Ò»ÓÖÁqL{¦Aêږ݉ËoáÖUô¶sT¡pñ[ƤREÕv•ÍR7~Ó㔩ÄÚ z’:h|^èн+r\•èܵ‚÷ž¥Õ§(Æi¤yPaLxÄÃwÞûÆå ­eñí ̯Ñ#eç HÔKùù ýè"–À!ª#d6”WV{õ„—ìé£o@XÈë–’tÒ˜h#pMN¯ RàIuUkXÃêcåD|t$q9ˆÅfc!Õ5¾ _àa¢¢÷Ãl²ÀMvu8¦äÊâ(T¸:wøeÖÝD/‰ÏÊÎŒ½£“!ï¼+yÚEû³Ÿ-D‹us(;ûs¹~ë] ÀÑxë8h¢“¾wä¶<L ¿ßñ‘<ÕH –Ѐ"Qƒ8ñŠçև˥¶¤%M"Z,œ¯]—od¡Bvê°ÿGhŠY@Ã…$ê“LÕ"iG2Xz[kjÞ0¾(‡¸ím-ôÅ9Ñ 0‹ w æÛ û ’o9šæÉÉ7@ u¨ž‡ Þ<ô–Y}"¨¬gCPxA®$º, øüüŸ»QïkP³@† užát´¼Ê‡õÄc„ôô­¿½××7YÌA©¤P;ê&Ñí¾ÓÿE šÒÀOOiöq~ØžùgbÛ…›°×í+¥äÕº QÙ‡°P,¤²nþÅÒôqhO®q0êãäíî\±Nk˜ƒb(r±¾Uà›áäŸ;¶¿c XŘVò=`ÔE‰çÉY!÷é úzÓC?ÝI(ÉŒÙúJ¤=N0Xz NäÿDÏÂÿJ™u¹jø¾þƒ¯N-rúeºª–îWšµHì"ؤË,.úµ)„Çs Søf¿ü1¨@B}ÎÅ)£¾"÷w.&ì¼&ëÄ£µaïué,wv„ê{8Ó=™Ø÷ÎN»áï6ÎÇ`Y!àÌB!s‹r¸°n,ijxcy¢þΠy‘uVŸçvý?¦aõ騿&õœ3ÏSâúýhüåD/Ã¥[„®çò»•0ª;høÎ%Ï/Š ÓsZ žüGRª?è"":r''cÖIjN‚cK]fl"Èóm?¢\´œØËW¦¬{HÖ—W€]éPÝ_­™™™{c†;s»–”Y¿âW±ÝFh‘ U¥æ‡iD5ÜÒ´ÀÑ ÜÕÒK8lAâÐo><^ÚÞý¦¥ÿn¾9º^õy>–¥ªìÔá¿K…¡DáGíìÃmýì‚ T¼Zá{‹ÿô£ ]³cÍ”I5¿}>À®ƒ–ñ½ðhµQÒ§Þ¬ªÞ= ®Å Ò}2mUbƆ*‚–`®–~ÊëKþÛ£à?¶Û« ìÀf¤Kút3 H·AÙŠ÷ê^}1äÖ±´,ó_H!ëg2ÆÞ÷â°gÉî,´¬<¤Ã)Ó¡§QÌ3´»KÓ&s‘º^JˆØH)ÅA8-NÄîã¤h?| ­?!š:µÐõ§Ü;ãÝÔ4%]™ v)Ç¥[s.Çe_¦¼l5ãò·âö+rÈ}ð¦:¬ã¢Ç? @-ƒZñ4{™ ÐŒ T{fCFmŸB– OLï ²<½Ü|öè¿#c BÆM‚4¾´»Ý2b ™¦\V'w€ÃCµ„)ïf±%¶S‡ˆ[ÁRµfÚœ‹qÎ6}rH!Å o˜³Õ@Œ!~H=-@;Ò¾|D¾³˜àPæÒÛüŠè·QmV¨W…¦¦;¡ÕY—nŒi™8cµãI:Fí×ßBšu)2Å»¥»n˜Q ÞÎFݶ&ýJ[‰DD ´#4çÖ¥‡ƒm°À–); Ïì‡×=Äéù Ü,1*ð[•ó+ÜK–ûm±D×j*)èÍâw§6 ˆ§m¶A<„a³ªä^åb1Xl!øÿè|0Âð k•Sp”—?T¥ÁSuæTŸä^. oÅö$èé³ sУ—å£-á’ ™{"vº;p%ZˆEU·{Â|A¯ ôÖlŠNÍ»†âíãÌk( q¬\”^Ylš…F«_еûÉÌ÷ZŠ3J«×pZ-ñ\—Á~Öx¡ª@ýäô¦+P0™rïZü2€|fÊo'¬G)¬‘íð©„n …&ì is(Qèu0Y‹lÖ›D¤Pˆî,í]Sà^¥c5™""ò:X¢kâÜìCÎâ÷‘„ý¡ÉäA' W(×Ô iàõ(á-‚¦±u㛺´Z–S²´»äh¤“³Áj ådv†¾[çôI¢dKïâŠOõî4_sn!oãè}*¸­‚;Õ7ͽžäqȳ¯Òʪ6Y_ãS¯3ÓÛ™/MÌŒtáÁµê´r/l ·ªNDædêœÃïcz®T - ÇÙË-«±£¾4c6¥- m³_tñHTÍîòÿc»1ƒaÍ{-R|þ•{“y&ïµÄ{í†O]ØçåX:Ök4îQ3ß׸Œ–Uñ–ÔÕÂÐoGŒ‰\F¢øõdwú@€ÔÒËU›ŒØr'/ èŽÅêFž7Ëzùi؈hQBjãæí[ÄH_ÌX(/²8g%c©o ÂÓknC÷ïå”Og\ÑižÌFDE‰°´«AÅ8{èD9œË¯äÍwrÙtHê¤Ëߟ}õPªµMGâö}uòÃd1­ä}8ǯÖðé)XIø æê¡ˆ;^+§ë?š kUžgÀÀ…þ|éÍîHŸ¼ f-/ñ¦Õ_Šè} ¬;F»Oµû,ðFõ0s*ñË ë½¨ Û¹]ÿ~‹W5_ýÔ+ª{³k'~lvñ±Ú9 7ˆä/ÝÓ“…bmµ.”؇­Ìî¬nç6¼óEJ‹QýBš>Ü>ÉÞ{Ùæ†e{Rd|¿7%v{?ù½À§µŠÚ”t^u°L¼Ýu^,&°Öø§# NºÄ”³e‘®¥ÈǨ8¸>$o˜?Pš‘Ú ÒxÿòEµäx¢·3O<½ÞðÒ ‡ÂÉÝ Y8 óö•m{eÜ¢Õ†Ú„q:å[tXSª ³óµ=ã“À=LÝØ)Ø@œAég¶Zi•(˳û”µYÈj‚’勼E®Üë¿ „ Žr˜̦˜‹{ë“ècKXaޱÏòkMÛR¥jÄÃdãü !o&"¥7Œÿ• 8¸…$#ë®Q¦HuQäΙHM÷bw‘{î3¡"o¡kmtW½6’€yÅü+Ì(®É–gÑ¥ ÇèB[ߺ‰Ž5*ª L8dzì`§r^•Œ t£  û„ ‰éʺ=›#%­Ï%.¦·<ŽbXëjE )¾Œöön!Õ0Ÿ u´Ÿæ««J°~HÝ÷xäûá—HFÖ€éf|}Ñä %}·bßþxvöøãÖhÏDV¹ ¸ìÆàùsOU'¡æ]/g—ü:̸Ž^RÝâ!FO×x#Î÷ Y*@ŒÀë7r[³9î ÷’Wˆ²ÿ˜„Ö”ºQïãêÆÄ¶¬ám_–îu2Ji§|øÜC&zVËß¡V=#’9:ó>ó?›š§©ÙZß#h£M,GºÌ“²£© `ü:3B¿ìÍíA‚̪˜yöàòûp áÑ‘]O±,ò•RvÒ~Î(eúöÛÑ[´4àq—¤¡Bêeœ$ €ˆ¾w~¯»å)Á/o¨ýµ|ä…$B¿áj%£®šó$†ÌHS/Sø!yëÏÜ×ë6ê‹z¼½•¦æzî8‚=Æ28b)Ds˜.îóû>µ:~ãø{,H^¸ë‡`{½êìlÚµ2Îªï¾ ÈzúævO»®ç !ªšêF¤€@êHæj†t}Äcohªò›ÌQ”?°›€\¯4¦[âg¹O‰­n¹íºÊ‡ÉYÎ(¢øN¨„qîµÓ±üÙ˜Ê>C‘ÁˆöÒÇÌn‚GZ¥ÃuÒÑX/˜û¢ŒKò]Èâ«i¥/¥KQ™üßR´ŠÍÉadÏ?äËw·žÇKb>]Tláüü8< ­ÏÐ ^l5ŸÜ*A‰Ö•NÇÓUë ÕÓÉnH$1P\‘sK–]w>ž7yyQΆÔâÛvWt¼”Ú5@ÕfGgŽ’ËÉV|Ž=¢žr €}’G^¤µ¨°Š{N¤.w©y°8¹ÑhsTy\áG ³é”ZüèZ'0G™CKu¶mq+›’Ø*³û‰ÅÊÛuëYs0ú~íÑdRp¨ `**î c ¯0TÒŒ«4^%Æ¡ð` K{±ý@ä®ê¬‰A` 鑹ÅIÎ=ž(úX3ò5«|ÙMF±îK(XÏ——¢ƒ©ð²É³i_¯„]}¤õÍUsJ×M—C-=˜xísauDˆ¥ÌN?zá£sü+³ ®¸ºô(díË@"¯©* @{§Ó^O~w üÿ@‘îšOï.Œt_25‰ð'‚²å &\hE\q(+˜ QþÄú~…­a˜b)\Ù §ïÀƒ=žp6i¨:S%Êà,nûAoÚ&EóGùâŸ~; €Ü2¾¼oý\E›Œ­ÐîS@ø4}¶'Ç nh G¨L6MJ3©£ ;Èø©lÉÅ 6¿u¸³ß¶üþPOû7B*]+¯ÎR—Ë Á§ì>5pÁÞÀŠìy‘º,‰Ò r'.Û.@ïÿ•8Ϫü¦¥ "Íæ¢œ:Ýt:r¤Ø™v$á÷s,5Fô¿ùðZ”èj+÷¶u›(xªOŠõ[6¤q¾ÕˆJ ¿‹‡fYÌó^ŒÍΆ\NOUÊ&Î/¶gßÕ`cé‘Mƒ@ÙS;ÀÌÈëÎ9ô]>D.êJ™§>[Tè‰iÙ×ï)Œ@ö»¢t©ÏS,ÐGð]BLæTE†aÙLÜtr$é`œ?¯D»)ËÝš—[G^%ïFDC€›§"’T øæÌu©e'%$b‘„OœjE+Ú|âžöç!}ý¨ÌË@0Äé«J{Åd/‰…güÉ_5Ø…+åø|ªòGb>¶ªS4-#PGØ-Í3Ék‘—µ¤‚¬õSóo«^Ÿ²hÈtÒ6É8/þg-Þå3 µ¤jžÿkBn!ÝÓ—„¬£ø¹ˆ¬›¹“S4ƒ¬¶ãZ]Ž•e …MÐ8ˆ²op|ÁT]Ä£Íò—0ÓæÒ›`f1I¾Poº¼°(y›t÷ñ\G¯¾0áKÄ5$P³ü‡A„Åá()„[›òß⛨z/%¦kïdòÐd±ÍÜ£Ó…D=öÖmÛËù­—t«ýÿÀ_'›ŠÌ¯|Çq>v:È™°fh:?ÑNÙÇŽþˆ§’j;ãD¹ë´Â¯Vž‡ ¨ùd§‹F*RÉ©qÏôV šF/•ÔŸu—rïuÌiüÆÝlæ‚sá°$“¿8ÿœMuç¸I%$˜a'^%…j†ßŽ#õòå¡ÒûÛsÿ£]Ý¿»,“{©nÿË‚Œ{­nºf®“7¬R7Œ4GÙ³X¦ÄIʨ'Ä"8“¹`Z?ª’”nÚ²¸ÝŽÕôåÆüß8©'9álá‚ÿww)QK52eÎ!û´‡3ƒ1îrB „¦}ê.ï—ÝùU’QïùTŒŸ•c%¡ïÇ]pô*ÑO}½ ²Wƒ2¼p°îŠg]ŒâEuvª*(Ø&†w<Ì|‰B<ªdúYÿàðK—³"½ª~ ÿ…ùçÏ3umJ~%B• â®:ʦ,[OrF#pgl%ı8ˆËöLÉâXDã‘éÏ…M¿mÈ•/jbžÀŒì•ÜŸ¡ëjPÑ5Ì”´Ù¾¡ù Œ‘Oƒþrh¾T’ƒz½!ø.äíù…á-øsÙ PÔoÞ.º#´ŽŒgøãE&Fk㜛 µêU©¶Õ°%á™Î³ÓîÙ÷±-HÁ7a€õãR{2lñÑ8¼’\g´˜2Ün,Sà?rú¶ðœ’¸è¬Ï.×j_RAÂñhdIIMæmÐ&›DVp<.‚Ø9 ÇÔk‡Âð.e®JGH¿Íã(½ ï½1ÿ0Ê û<RKÇöòé|ì…[øê– ódNç~ðõóØÜðpÄÐüÐn{ ¡xNœ^L“2Lôþ^íx–*ЊïÒ™7þÍ  QS`‘Î`VtÐG CsóÝaó°Ÿq¢‘ó,ôcà ㌠ÒôÍR¿/Þ×LYñ|Û— ÛüÑ8w®@#ÏñÛvUýäo:«ù_\J0PÃùÃV5’_è ãX™ƒCúAkO„ì>mÏØ³fk“ râcÐұ݅Y:gB›šª˜›s¯½þî¶áÂB–hÁwª ª/N'I[Ž·{“ósHåéñÃÞ–± 0]„±5všô«’Œ/õw?§½ìt5‡Ú\L¼½<¼O|FÉ;÷á¼ý8™B/ƒFzŒ dfUô½º(x4 öÏ]TøÆ!Ž— 4p hB:Küо3m™Dð„Fj+-A˜GnìÑ0ž,0ã>¶ /Ó„õ1hÍ%¸ KnÙ±ÿÞ`Ý„Eªô]<ªù8äÝóíé$¢,€¢c1UÙâ:ÍÌÓ™€‘ž³0>ÆÆ…h]ëâígïÒF½p$¤'Ðcù[‡/Øw;æÒc+#—cäc#³ xY²»£¼'cÑ'3žô®"éÛœ°¶Æ|î y–¯ªúà¿ßßž°¬C÷=€¯rEØ [~N`ü¸2îŽð-@Tç(y£ýdþëü­u ¼euXZÕz!hä'*¹\˃Ò÷P½ÏÊñæniÉk«Æžþ\—af¸ÄÀá”̰£Æ€)ŒffBó¯vn}ÆÖ™§x“¥8†3Iß÷( U0ù\³ßÄÈñ.*”Éãó$¾˜+o0x;XªQéÊ# ÖIˆ;o|*ºã™³K`¦{sP¿ŠçpaŸ4ùÆdžȮä&ÎZ’ú’'ûRº‚ûÏ­'î²µïÐÇñF-$G®?h71ƒ×«Ãèfüh•}<´øauÉ$!Š©_u“Ä'z} 8†œ.ñFòÔ^©¢„—!ÞTV°†˜½Vÿrè\M­ÛªÁ°Sù¤}Ú"ÝÆðÉô tt?YÑIë5·UçK[«ÓlJ$ïZý·Ý8#×%┘jf½T\ÎÌPø¦ï.¶ztæŒòb;lèNj 7“?ÒI™‹ b—P2p ªàr/]‘VTË™‘È ab[7Bçli**ä/·ôí5_l?Ïý*ÌyMéàŽ»Ó•Yb (¢>…÷Iv¶# “Þ™&D(­ãÿ2rºÏÓµ/ý’(7—rCïø„ƒÞÂ̳”1\5ÚDo Œç.Š?‰*qQD&«¾k®ùìívÿ¿³†GðæÊg©‡5<_ˆHà6µI™± lx™€Ÿüfv‰-ý=Á°—ŠÒæoÌ^ÞþQ¶ ñ6JiØ€{N–4Ž˜Bî\$Wâf1Sb׌³ÔÍ¢øÜ‘q_ Þ[vÆ6`ZѾ•Ùò?úµä€ÞÓþÒYJSøR*ÿL²´K»l(li7^ž ç0gf‡ÿ`ÖòõoŠu9^ÎTZ _¶Ì-ÛdéÛai¯˜H)…›Ä"s£Jh¸|¤ÞÓ’,³é œiWi-„Æž÷“ {É Y¡$šÄŸêi0åÛu±ÖãnÞs‘¼mƒ-´ì¯^hç‹þšjeI¿·Õ8úZÈ'6€ÙQ¤Š¥B 5×f$K½ô²e†—aÇ®Ð(B˜#õ0Œñ~…Ó>ïÏ·ã¥W˜ñIY_”m®3?7«ŒêˆF«€°ý5DµåêÄÏçæÃç¦cª‹”èÅš çãI[oŽèíÁà3þÞDøk0¸ Ö vÞ@‹kI¶œq\HJ¦­ÔÜ1Gìcã+ü#€S^&9Ô7°S¨€éåŽØÉg*,8N¨`DT¶d’̆l/âñùUi0íÿœm·ðp­ßP·6É'ü¾C—¥rÙ®¥zÄÝj~ $ûòrýìѪlÅeúpËÖ‚ƒB'ä\ÿÑT™ªywL™Àªš1A¢"äÛ™üJ‘åI€ìœ+º=ÞG<@-×Èyx*)À÷\•LìÕÁÏÌ[¬³íËq¬tð˜ú )zÉ žOýÞ” #PÌ„n¬ap{‡…^U]9^ûŠ@Éi®ù Èz8åDŸÓöP¯ /ZÓ¦,qËö6Ø,'Ã\´÷çw<£4µÇ¼j•ÊÚܵ^œæqk×pƒ…] *g*)$—@—{}„Š4­ƒ:ÝKØ{Šbã §p½‹.ì3­”¥È6ìù’C©«#;ž*b7—` ‚Íi¢ÚAJ¶QÈÖô| •˜†UZF MtËäò}àŠB­vKš3[oìÉH,9à†çTN¿Vk¤özj´Rmߤ˘s<Ê X™âµ×¸#dµqM{pãÙNîkÂxfSÏe‘ùþ¶¦Ò›8’ó0ò°"wk1ìh¬lÖU`#ÈMc2ßóŒí-°´a@ËY’¢âQ¿kÛ<ެ‰,ãT÷N®Œáb®Ü*>©uQFyÑäßXGÿÑné”*LB[©øpL¦TËé;ÐLh´ ÷‘ Ý+³r#ŸZv›c³—%/Ƭ`oÜ´¿º1ÌÒ ÓæFz þx‘à€Y8Ÿâhœ¼¡çÑ ÓxE@yeòP¯Þr29!üË{Û–ØÔŸ>™¨uã惣zš•v&VAº[|d6*PŠrGëÍc¶W}%,´B€7ŸóF#oMA¨:Ü'Oú¤²ùSDnq Ÿ føMÉ|``ùJÖç,K‚mx¢J²ë”Û%äÍãµ<ù ¡bežÿÍÓHoŽE½Ä3ä‹êUAµË5ÕÛP{i9{»ûÍH!ѹ] ¿0B©G\œÙ ŒN·ƒPÉmÒ‘íú³´eǧic®Ü†+¦(Uj™;3W9ÎCæÞ¤ýõØgX{u@Ñpüºß”й/Y$ûÊØeŸ¸ØÏD [=>˸Kw6Å8ld’3E(Ûù†ïÈ_ŸŽ—ÒuàǪðºüâôp­”ìò³„iIÉ24jE,¡lãnó(fì¶PUÁÚÊ[ñB¿3•m0 ƒˆÈQ}ù]^Q+ò¯?ª: ÄcrPXñëiCÖСxÖë©ï‡û…°úÛ‹k' ®Ü»ËXÿzæÅƒp š¦ /îà§G¶ BR%&Ç‚1×’ø;Î~ÌNƒ"YuÇúýZº‹:°õ*Þí‰À扞¯~Pš=«³™¦ôÅ×ÿšhµ ûÛg¸žL9ÖWOÊ dÄü°åL‰Îù'ùƒ”röâ;{õ¨_à™’g~³,ŸÔbwÅÙ’ÄxÂ’¯~£TŸq,f½(¸'»ýâÄ¿H—7§ˆo7*üZŒ ·¿§ü‰MˆI˜wX¤û¬G¦)i×$cSŒÄÍ1îÇÞÚZ ˹~<š, AJb z⺩œ°pü¼¿±$?ý¤ÉêjMMô/‡8þR§%,ÞW r–®µí5Ô²öCˆÍa‘ MU×r¨Ëm:7CÌ+'0kß`ëMu^>ÿŽÂÊ$1¥OK;Ï`¥*ùÕ°ÂÁD®éé'…ˆ&â"i‡²’Á×øþå3µz›P„ÊÆ‘ZÃ¥¨'îÙ©éâgã®DïI' q)!ž›N y/íBÕʉÄÄ—S¯px¶ënzVÿ÷Îʳ–¸9Šý×3­(„÷¼ÿ[BöKKjpek ^´ v¥öe¦›Û%à#Ь5ÅÀÊÿƒ+˜æH)1šï°¹tn ©‚a)ÛzÅ"’w¬¯½jû¨†!R¿GbB^»²-{oÒ™(¥;ª5Qn®©ÒIPcÅ9¬þ9TáùeÒqK†%~ŸÎ2Ìë Pf‡Y&­~WêUª /bøQ¡>k‘9S˜zW×Í–PlÒ¼šTžknÇÚ $Þ—„ÿu8Üó,§6uLÎ- ¤¡Ç™œ*rÚ,Q~ððw½ˆ¢ÿ‰ °Xb(„* ïãéD’´wûÚÿ¯sÒKuºr¾\5ŒE]S……uNŸh¢&ömÆl”Ql¦À"Á§¨‡L°Ó÷¬ûo×v­mÚa179½†'Žp%ʃgÈUÞåã´IÆÅK•ÊôÂë Q•dÄŠ÷ûÌIðÞÞl²¾‡ÅÀVTŸÕåH17 v% â*¼Þᵄ0 ^4~c¸„åq²Ãrý–4éñkH#ùMû€{| „’@žØÛò!‡E>;BszaJ”-ì•<ûù‡]6£cã¢ÕÙko·ê%«/÷ØÍ²‡–Ñý6KÚ›êd¬4e#h_¸Õ²u\å#³/…2„^L0XobË×·ÔÜ ÷Ò–@µzx¯m“ªU…¿€Ú‰ýÜá7ïªêQÅ…m|Š(Z™}tžõýÛ>±Eõq„:ÿHlzÞ9CÊ,å8rú­Ú-´3abûÃøÒarÏ#Udp?ƒ.…|´Dí®gVTþ”V”ùæ>?Âö¦On6ÀºwJ‹ ºÖZÅDPã-5uUHÌ)ßY™QçX¦T(-Ç^bBáA£j\˜Å3"Ž‹QÇf]ú#þŪ óû¦º7üˆ%ìd|;L…¶cÈ0×cªõh½£…Xä1KkQ —MŸ!ǃÄIŽíbÈÛ)¼¢"òy³Ñ–ÀèP+#Js£*d¿ÅäÉÌy‰Hù–ñ³ eü™uëˆ2µ÷ù}õ”·csi“´%í8 ?þ+AZ~–U»·«CnkŒÖj¦f,øòl8¾¬K+kÃÀuqfÒZ ë’pÛŽBÆÄO(Y'»é,=“q Ì xˆ× ì8T7m1Ú•Y8²!–®Vwh&ǦX‚%‚¥8ªGR¹iJ^Nóœô·]ËiÍG¸¿8ù.õ¡¹¬ -‡˜Á߃œ$0èÐ(Nïr³cgõÐÐjþ2o7êÒàœxyÂï¢hdU„ÿJÔxSd“­¼³äžBç¶hÙðçzÅ£!ý3œªýÉ2gO”g¶ÈiÃѸkÀáp{GäÁ¿™£VûÃ.cV#ôBvÌsXÚTAC‹_ËJg[Ö ÑÍÛLƒWY_zð‚¯ $>g:t!N~A˜ýä®ñè^›jx¡éu—ŽòE c#%ˆm¤e!¹7HA>^àadŒßÿÊRIÑŸª×†x?Á ·uT»P*d[$<žÿš…[eÒ%´Ó äå:žŠ œÛyciì@t·ÜKZM=ÔcÆkäè míoÄ[¯!ñ—¶IjîV_GÂzJ¼Sy¼+4­·ÆåG#yNïªÄÜqE§Ã®Æ»cZpNü²¹»evT$ZåÔf´6#*GÙ¢$|:ZNé§æò›ƒü¹×/®ÅÊö´‰v°­’öWBÍä¯AFßôN‘ŽòB>GÚç7 ÷ E ”5ñ‡¯ê7ã ¢ÅßÙÄnÁØ hŠÊîŠÇôöõµ¢ê³—§ÇyXqœimšT[âÔKˆN¹N‡9BÎðÿItPû ²9.¦L¾À«(2ƒêKsž6òü_¥~ÿC>6ûß!}³OŽý÷¡[w1PgIG…QñðÉ„ëÒ~ì!—º¼•$/|B[À»5¡Ó2Ã×D$3º€š¥ d‡¡Îé©¶t|h!Q+“Ex¾»í}5Ù,5¾<¡(ÞÎ ØæÖrµl`§Z# 2öÈñ: ‚G]A˜IÀF¾¶ÿÒº›N5Y>Îëº*’6H®’U'{nRƒ}tx+3ÿZÖ }ŒlY->^ΆO­ycµ|~»=)ò¯e°Ýs"Ýn”èðí'pFjAÌ@¦ËWE>àÞ2¦3¨gÕú[¢¸g6¢ÒÇÍ”¯=¼’]ü-ßëôPz(~í¿5ëû©D)ÎTæ¶6Ã=ˆ!pŒþäPá\9;][÷Ì„ŒœW€Ý–m³Mµùà chò®ˆƒæ,Ûüa2÷hÑéaGy'Ok’¡*mJŒA_YQ ÍÞöv…ËO—þ{ŒéÊ騱R±ü"3`úT€â=b¿¦ñ—ï‹OsõÛ~ãKO9–¦â&¸¹2¡•ÌŽÍûë4Ï+Âv𲿾ÑVÓÁ°¸gÎJÄårX_˜­ŠÔ¡Â͘#ö ¯‹éf÷̉ç‡C_1+|gÂùï¢/š^ÈóÞt¯ÔVu´w®ñ˜=âGG)ì€ýVF€QØð›%>W¾U@º ~œ*XˆyÔ]¬.””G"•º) ¹·1;¥ÓÇ€>ç6ïWשªˆæó.Ó«,¹z—Š»'¸"ÄB‚ïQhÃ.É‘÷(ŒŒýlƒŠ7ÚN*]º]!W9_ìšÀ Th„ø`Û üÁñÌ_‘?x›þa™Íå„ÕÛ±VfVÑ5aIïöy®Ù6ªçÂÍãUðî9í¸Q+ÞPª›ÿjKkV能(N!6ß´F]1h-N+>3Ÿ»UUrxŠkUꥈb­¼eÐëªÔ¥`™¹2 ÉŽŒ¢ç–|l,ä‰Ñ€½Ï/anu6÷'—㱿}OÝÐyõóB›ÃˆS›ŸM¯²þªÜŠvkAù׿Îu ]þ™¥]Â9“;Ê$ªxî$ˆ wK)?“b0ýR”B†SëE?¿—²u¿ê8›¬^ŽÊá#‰±_d3ŠYjºþ?c,!^8ùz¾€Óü“5-'p+ø3 ?®Øø‘`Ao>õõ8(17 d¿|·7¯\©Z€#Z"+è´¸\õ+ëo E‡d?ÀÚw i¿¬L JqßÐÀ«-V5 &IXŠŠÔè%G†Q• ƒÕðò½ŒÃ‚Pt@MÀSTч0üÔ,ÌÕ7¢ò© jž)M0¥õå?å>Ô¶aYOêo.Ðȯ^÷ÊéF³:ÙâÐȸ­?ðá0ÿÍ«X¢ŽYûÑòŽx>ÕŽ4N‘Ù½ºŽÏ·°ßaËCy$ÿq`V;ç LvŸ6ú¸Üt {ljîÀãNø7GŒÄÉÕ¡ŠÀ¦…ÒQ6÷╸LO¶:äÌŠñ¹jÚK;M÷ ïɰÍ#E·(¦"âBJàªWŒ^XèÃN½+möH©x ê)9w”jš<ØìGyóŠKQ UÛï³(âÕ ¼?˜YÔšF?ÒLØÂŽÄ&‚E°€Ç›¤?ÄmÕ_+¢ÁøÁ; ˆ?¶s{Àù¬µð¬;úNŒ4nõЩ¦¿¹âýŸ¼hã”Õ—ƒþRy†uèçhô. ¸Á3Û‹çà¥SívíH‹ƒ£1#?zC5·´î ]2IW JQ ³rA“â¥MŠìJI3„Y2Õ¯­Ã¨KNwè&H¬ùûÇw¥S £O§¨¨¡Ë9 ¸ðŸ½ü5 B1q„”Û¡+ÝÆÿþ Ôó·/îÉx yx‰²ñBy6;rpnÚïqª¤•íÛ9åÌê0Ï ÂÀÖn¹ìM¯?T´FYVïÍúF®z·š."‹(ÁÅʆFk50>Ëç=I#ŒÁ;»ÉC¿·ÕG,MëÁ’=ôè 2&Ë™ëŽñbTh«reÖºÌÊ;ôÍû/’¶(°3òk˜^„‚  ÍKSQdeòœ‰Jl­‰BÞá8$!¦À`vÝE價ç«àâs6RGú$Íhé² ò¿£ZÛÖYõ ÞKf A„/ôX\e†ƒÝžmÈG #‚%™ Áúîôç9x›žD«w0ÜOl`Ûç„s`äK åšôxÏT©g £]Nããø¿Å€CG™ª5Út´îÀxäB5.î/W¦Qûå:Ì—8HÝy±¿[ißÂfbÉ¥HÃ<±¦µ‰ëd¥ˆZèí^üéËÉñÐOªýtÕp," ïžR³Wâ/E‹Ó¾²DþˆÃmÚ"žP'ʪrÅŠ}Z•û~8Ú«¥.ëÜ_|¼ÀBç?òß±žõºpÐt¾Ð­srmÌÍ{>ÍmÀ[ÃJ¬g"’~ÄÏÈÔ [ˆÍ_ò îr·¹Ô“Ü—,Y³L£^w6g>C“Þ‹“¹³Æ³x`3QLÓô*(ù·È1¬‰­Êé‚iÖ¦O‚"ÛÅäöfÄvþ5˜i¤»ÛìöI¢ã]ž¡Ò€¡þU¼õ(ûúÏFÙöëfžÔÙ°pÊŒ^CL·¥U·M¦—„‰n/%iükoÄ&wKé€dàþW¸ÉÕÊ«©—¯æûbS ȃ26Õ¬ÍeÜáà-‘yîÃ<üo]½ ”/B 5—Sÿ,žÛálÂ:—ÌkfÓ+à´ ˘:¡Ë¶SJèöè²B*•¸€ÆQ§nSå¿©ªÆy¶ ›-ý쇎» Ó›oëÓ?˜e&ð>CÝέRdR‰qu,Êç8ì;ÔåVÜkîv¨…÷8˜tDŠØh‡£Ükûè8%ó°JâRìi‡Ð¢B8žïáêüL›Àèì#Àc0{!²©€4öçÄu‹å ÓTtê¿+|K®n¡ÍPˆ=b£Š"œÖf¬m/9±úÖú@4AlÙy^L¯Y!Vrò®ˆaŸ,1+{00Ì1%0v*¤#aÛÛv@4)(˜•[ÿ8ü,öÇ«RQ¿ rW1|é%:êl‡‹Æ7}d(èÎ_·…D“ FÐ+KïÇ„ÊDLt, =Ñú=¼5ñݧx±åØKΞ~«ÜHÝÄiÇï5Cøá•3¬2£ö¸±!X#ËFm~¶™¹â/’°yK€õ³£.DØ.fÉäÉÖ4n ™«f»êU¾J–VÓØ\Ù¸Ö2¡5KvÞ¡Øv›ümqªlÝ£‘?¢cû”'J*¤Î‡¡"×'póЯí¬Ê¡!¿Âô/z Ñx{ÈXÃö«ŒÚçm†Š£»«Ñáf§ê`Ž^±Lò×rd!¡º3äñÌ=$†‡htÀŒÜ¯WÆ{$˜$möó:Ë/ƒ©p¶¶zî /À·l+KÝ»›˜lZ ##AmÙT÷b7±Œ¬ŠêþNo¡Ò9kHz¹³0©·•boí³);6OË⛎`o5†2„2-‚» us~€bEH‘âEàñìwCñ™{;6ÒM”ö›äº!Š”6FkyØæ§,sãÂqIé©A˜<ʼnâñžÑß÷Q6âSí®¿W¶tF„Ñú¢KTu®_V¶«bù®21ZHÝÔôªGDM2@ßO‚ùü]Èp‘“ŠÏ›²^zKï ÒQ[ß´ @Hí*=„ÐæÈ!à|^•œÖòºey,—g¹$S®œAZj¨ó™‘gy!ßv•ûêvì û`µøMY¿Ý ¢ü¡½^³ìã>Qí"Z0ÃIýä3ac×›¢3CíìÍøE;3ù¿>­[õ’%…mziWÍþ)FôLÉÈÔ® -(z“ÁmÈ_s9 )¾õ2®ï‡p¹¯n§ú^n–! šEG­`ŸbÜk[§ š)ݳú¡Q¥j{ŸÚ˨•_h~-NºÅq“w@ñÆ£åÙXNÉ×uÒzF{'>\]+I¡L“_v qƒG®Yùõâž&•fLï &6HÔ†åîœ1;‹/Öéɦ¥®N¹Qdý¡!þ¬xaÈZvY)¦ž~Ò^^;Õ}‘2“–䳬Hýè T¶eÖ};ë{8´þ~ÌÇAXÔëä_ ø¡?öìÿ›vï1.¿Hw^fè&W܉ŽÛìç/˜¬Zšµ…3!3¯`ÿ*Ãn—Ò‹Ò2¥ (#•Ò²Â%:'§Ô0§xÿ ÔF»ù<7Á¤û· ÑÆa[Q]rF-SQEÿ'c ë´„9à“Éì~½­†cïùÔÔªG¸ÚŸ÷õº::lÆc™ôÅŒ†ýDÀ_ç•ìø‚N_õy³9áŒò˜xhé›É†”ËE£Ã5o&ÄÖßÄÌ$ÑM·ÑõiÝPDXÖBA©F v È‘‚£¾M^'Oº°Æjs£DùN%¨šCIþ»{+vÕÏâ:¸©FT•þ;XÁŸÕ(‚yK«ÔØK'‚èž“8ÇsËpÀ bì¸ÐÃz»t¦U2ºIôyߢv¹ý•ÔhŸuSÞt2'ª–¶tÜì†Uk¨¯bšyÆ$Þ)|ê¨n'KLË:lï€ti§—êæ7œ#/(µ¿­ŠkÜee¿ÀÂHTÜeL}˜ix1¦%³î|âO_°ªjà|˜Â!‚ Z#¢u3ÞÓTÄÊ­:­&»\SrÙëkÕS€“@}à8ÒÆ¦¬×ïtϵÙaܾª-¦¸Þì¦NJݧ6rVÁ6~©šk•P?éÐV&n6ÛxÑe·DƒWn6«¡žh£>ž ®*ŽV”?L/¿”g¯í˜IcUyêýçàz›Ñ,rë/ü"P íøØT/üKŽÕ&‰%ÅkÿE³> °ùNîiMÏÓJWrLó¹ÓGרE Å¨¹™ÚSËÁã•^­lèobY…ÉÙüý«²Òls×gNºp:®AÿÛ*˜> ð¶~Õ ¯ô´kÜòÿW[CMüæz ä h%sYвÿVލZ§O´CÚ¥oLÃzÆõÍ9QY˸Mapjf@ ‚窮¦6÷&`™‚Ì9ÏŸ B†Ši£¥M²”Ä>bO¼· ‡µLÂ꓇@‚‹kmr¬"7ƒcßsû™ôÅà>WŒ÷{ˤðŠ|Và(N•Ì€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/d050000l.pfb0000644000076500001440000013160307056046552016375 0ustar fnevgenyusers€¶%!PS-AdobeFont-1.0: Dingbats 001.005 %%CreationDate: Tue Oct 19 1999 % Copyright URW Software, Copyright 1997 by URW % URW Software, Copyright 1997 by URW % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (001.005) readonly def /Notice (URW Software, Copyright 1997 by URW. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright URW Software, Copyright 1997 by URW) readonly def /FullName (Dingbats ) readonly def /FamilyName (Dingbats) readonly def /Weight (Regular) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -72 def /UnderlineThickness 36 def end readonly def /FontName /Dingbats def /PaintType 0 def /WMode 0 def /FontBBox {-1 -143 981 819} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /space put dup 33 /a1 put dup 34 /a2 put dup 35 /a202 put dup 36 /a3 put dup 37 /a4 put dup 38 /a5 put dup 39 /a119 put dup 40 /a118 put dup 41 /a117 put dup 42 /a11 put dup 43 /a12 put dup 44 /a13 put dup 45 /a14 put dup 46 /a15 put dup 47 /a16 put dup 48 /a105 put dup 49 /a17 put dup 50 /a18 put dup 51 /a19 put dup 52 /a20 put dup 53 /a21 put dup 54 /a22 put dup 55 /a23 put dup 56 /a24 put dup 57 /a25 put dup 58 /a26 put dup 59 /a27 put dup 60 /a28 put dup 61 /a6 put dup 62 /a7 put dup 63 /a8 put dup 64 /a9 put dup 65 /a10 put dup 66 /a29 put dup 67 /a30 put dup 68 /a31 put dup 69 /a32 put dup 70 /a33 put dup 71 /a34 put dup 72 /a35 put dup 73 /a36 put dup 74 /a37 put dup 75 /a38 put dup 76 /a39 put dup 77 /a40 put dup 78 /a41 put dup 79 /a42 put dup 80 /a43 put dup 81 /a44 put dup 82 /a45 put dup 83 /a46 put dup 84 /a47 put dup 85 /a48 put dup 86 /a49 put dup 87 /a50 put dup 88 /a51 put dup 89 /a52 put dup 90 /a53 put dup 91 /a54 put dup 92 /a55 put dup 93 /a56 put dup 94 /a57 put dup 95 /a58 put dup 96 /a59 put dup 97 /a60 put dup 98 /a61 put dup 99 /a62 put dup 100 /a63 put dup 101 /a64 put dup 102 /a65 put dup 103 /a66 put dup 104 /a67 put dup 105 /a68 put dup 106 /a69 put dup 107 /a70 put dup 108 /a71 put dup 109 /a72 put dup 110 /a73 put dup 111 /a74 put dup 112 /a203 put dup 113 /a75 put dup 114 /a204 put dup 115 /a76 put dup 116 /a77 put dup 117 /a78 put dup 118 /a79 put dup 119 /a81 put dup 120 /a82 put dup 121 /a83 put dup 122 /a84 put dup 123 /a97 put dup 124 /a98 put dup 125 /a99 put dup 126 /a100 put dup 161 /a101 put dup 162 /a102 put dup 163 /a103 put dup 164 /a104 put dup 165 /a106 put dup 166 /a107 put dup 167 /a108 put dup 168 /a112 put dup 169 /a111 put dup 170 /a110 put dup 171 /a109 put dup 172 /a120 put dup 173 /a121 put dup 174 /a122 put dup 175 /a123 put dup 176 /a124 put dup 177 /a125 put dup 178 /a126 put dup 179 /a127 put dup 180 /a128 put dup 181 /a129 put dup 182 /a130 put dup 183 /a131 put dup 184 /a132 put dup 185 /a133 put dup 186 /a134 put dup 187 /a135 put dup 188 /a136 put dup 189 /a137 put dup 190 /a138 put dup 191 /a139 put dup 192 /a140 put dup 193 /a141 put dup 194 /a142 put dup 195 /a143 put dup 196 /a144 put dup 197 /a145 put dup 198 /a146 put dup 199 /a147 put dup 200 /a148 put dup 201 /a149 put dup 202 /a150 put dup 203 /a151 put dup 204 /a152 put dup 205 /a153 put dup 206 /a154 put dup 207 /a155 put dup 208 /a156 put dup 209 /a157 put dup 210 /a158 put dup 211 /a159 put dup 212 /a160 put dup 213 /a161 put dup 214 /a163 put dup 215 /a164 put dup 216 /a196 put dup 217 /a165 put dup 218 /a192 put dup 219 /a166 put dup 220 /a167 put dup 221 /a168 put dup 222 /a169 put dup 223 /a170 put dup 224 /a171 put dup 225 /a172 put dup 226 /a173 put dup 227 /a162 put dup 228 /a174 put dup 229 /a175 put dup 230 /a176 put dup 231 /a177 put dup 232 /a178 put dup 233 /a179 put dup 234 /a193 put dup 235 /a180 put dup 236 /a199 put dup 237 /a181 put dup 238 /a200 put dup 239 /a182 put dup 241 /a201 put dup 242 /a183 put dup 243 /a184 put dup 244 /a197 put dup 245 /a185 put dup 246 /a194 put dup 247 /a198 put dup 248 /a186 put dup 249 /a195 put dup 250 /a187 put dup 251 /a188 put dup 252 /a189 put dup 253 /a190 put dup 254 /a191 put readonly def /UniqueID 5020164 def currentdict end currentfile eexec €¥žé ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ6ÜÎø,µð¿5«‹çüÿr¬m`o!VUt…õ0-¯øïáY3y8ñÖ1Ö\VØ Ÿ#ðžÑÀu“ÆÝÓLùø&~D:g©¼•Y·ÏÜnð1çÄßò®DÐÆ ¾½²æ†ãØ"Oéôöæ2­UCµ •±’Iµ'üKøàÍAª¾D  m ãuË¢ÿp‹êiÑ⊛­Á4Ü‚aÛžDö/‹§Ë1Ky 0ïs=µãÄŸúÉgR|’ZbëìÀ¦ÂDù\pã™t!ïˆ ÍœñÑ+³Ð–3²ÿ®]¶oýu¢•5eŒ•ÂgÆS:ýʱ喿êF, 1ÑÜïR´«Zxv„•qίv—MÈeõd€Ë>ÄCÄÿßñW¼Ü‡íønKY8Û’üÉ‘ßò±×~|Ÿ¤¿m¯¯×>ÂûôÃÑßEHŒbÐòX6àtb3žœÀ é Ë %yÚW0U&3ÞŒåÞyãtN¬ÂM`ó¸òhJ3a¥hKÆŽ„wå0¸‹¥ŒnÅÔu¡ø²Â /øÎ¦IA#V¹éxºÜ5OGhw¦y½³; ùûÚl¾Œ³œë4hœÆï G“Ç@Ò¨*·'¾aûñZ36 ê6Ý=‡ó2ûAèÆ©¶.ЮÁ ­A\\‰oÕ!£ÿÂmºÌ:3_¦ €‰?ÉÙY ñ¡Õž]öî‡'-]O]iÙ 5'¦xzBW¨Ò™Ê1ºu±ÛxìB5½ƒ‡7G€Æ^K ºŒ#IÌô·i©g%n‹„g2.¶Z/‹5« ɤÉ_‘øõ—o˶”Åì§©s”ÎaD ÎãëØÕP"|¾% ý¼!(+0&AÓ5ªãÐ8‘-lyßÖ˜N•‰/в$` K÷ä\N6ªYóMp3†D)2‚•Ö_"Ó¾âç„ô ¼µÚK™”·L?Âuþ·7À ¢@ ¡|æ|:Uì<ãÏbe¡éníŸCéaÝptQW'á5Ç(‹q´ÿ Ï Ñ–šÓn'4Ië­ò¹‚X«TŸ¾®õ/”Lµn“H;5(‚!«S¡ëÜéx‚Ã1þè‹9Üèl Z_b,8[`e唲-»ÁqP­\ʵæä;»` ù;ýeºâjä¢9qçg•a™˜b¶å(!t:Dº˜)‰Hi}þ[ú/ Æ\çF~6šÆW$àâéD[Z a¢åÏÇíK3³¼·ÀM±ú{y„OV÷ÕTŽ|*² õ´07Ƚ)Q•çÙA{åB[ëü„u‘`R›o—»&0ss“Vô+ômhÅÓ qzŠvIØÑCp¹ þ²u )û‘%†=iÏ C=,v¢:3ªƒé™j;´4Ðÿ°Þ´I=+îÚíš.Ih‚RZ¯·û Qñ£ã½3ÒÝVº ÎN¡X('*(tÂç6l&VÑóâÌP«³ñê½ÎÚ5_Oß·{‰«ËÓbWüŠ’ŒHTQxÍX> ‹àñhÔÑ)Pú~Ü2÷«féˆ×K5Ìü@ŠXÄ6¹8¬9öö$~Š.éßðï­B‹óýÍçM;¡é(ò0‰Ouø2–Ø.Æ&É6 šRóqò.¦¹÷,ŸûðIôP«Z¨Ê0ìȰA^Ë[—÷(1=+® 8ò…›Çh" S•©\›îñl*¥È¼ÝßËj‡Å2n¥§‘‚wöî`|‘…ÄÑe̯1v"x ‰¬Mþd šÈAWœÒ†öσfRÖ'µ×pgµ§îZ>ý8Ä ÃMuõ¼ÍG¢~Uòа™Aüª‘›Ó.Í wÀ¬u•e¦`ƒð 3…=,Tåî:¶¬—9#ée>0Þ¯×el¤œmrVëàß"Ù ‚ŠÈzÀß9±û’-õðÎø;ZµÕÎ$Ô…öi/ ‰®X“#£â‡kï€À*[±È>Æ_ÛÌDE ŸÑÙçÞ—5»øyš‡Ö*Q /|[\üúA‰“õd< ™üjþ…>6Úq]xª°9’âº&Iñ媠W"æ w5¦äøEH34cŒG×<“MkVSÒ7Õ D7 LÜ/]õY—vî‘ò¥£ÛvùÂqQ¨³%ïä뤩¢òù0+cйSm¼p|šÚ‰ñKÖÔãƒÿÔ”ÊzD"*âŠqEZpI—ó`kFã åR‘ב²’åvÅŒ›Ê­ñÁ ²çZžœßáMd‰6itǹc˜Y2é„RÛ%bk²ËcUݨ‡£×ÚA|lºõ¬µø22æ*̱4™~ÑŠÝd §¯N2=Ü ‘ç:*ý_ Iksˆm†ýª€S8äC$ùG²FÔnV…†¯hÀ?qXÄè ò¥F¾mÑÕ<þ€°n…øá¤³",ÃæŽ,áòSýAL./±ù†¥æ-Mµ¤X +LŸ‹æ¶l哲AZ‘Ák’–C-,Ã…+9½¯, "—`lºeÙ;M1Rq+„ol„Å 9 OÇÞ#’X¸É?*¢Î—iíyÔì¨HkÐ¥fHõœÒüˆN2„ká¤]޽ù¥^‰ºö†aܺêÆfú™“" ³ôÈb‡UnÒüÿ<åê¿‚÷€Îã·É¨[¤üϳ¢0ç²êeYÇs+Õ½ÁÆi8yË9v\­$±Â/JÒ³Ûúõ¥BÔß»¡ n«<ý÷G ÏËÅlTL¸}(C„Ö­âˆÓ}oÏê[Ë¢»‚úÐ10¯[¤æ­>=[G­Fr€n,FºxPŒSõà;ÒC”íñÓoÿ¡,ý’GO€yjRÐ-Ç¿®¥(ªðŠ”5“bòG 6¶Ü*§„ðdãÃa\§Úp—'d!]P—ü/Ù¬²>9ޤŸÍÔ˸ZÝ!Õ¥01øXž ¥œÌû3Ûóò”ëVmÚµ?kÁûÁʬ˜¼Ýu˜DÅ G~+–ü„‡î«Î £v“™Þä«ÆÃ¸8ØÁkq H°+B5È_†j,§OÈ—ªhÛÙÖÓsÂðúEßq+–XÐÁžã„”`¨w8œ–ÎTÔMµû€5 »µ[ĸö`–9ØŽMbÏ+êD–<ÔÉH,Ò<ñ5€úbáëá™8EÁ²:µãò—«¹ÌfcÇSjÌA*Æ:”Ö­Êá“o'nm3oÌìð½öÙBÄY#©^$Ez<ŠË×þ9ó»ú³à„¹gÎ1Åñn\JRÏËãæÇö:ïñ5§–™ó’ûõ»ô¥½mÔPDzÄíFQÜ£ ÷ãZy‰'Âúf CÏõzŽNêq¨ ?â3€2¤(P Qí$½Á³ Šj “ýy˜•!TÔÓ™Au~[Ñ8ë95øÃ±¢ö›#ä²Ë¢/%­¥'Ïc)§… |Ñ?O2ÈÏPq ixâô—n×”cx›ÓeYFÚ}70·«#ñãá¤&ž^D¸(aälÁå}Ô²¨÷¼)³@íÙstüq[Dœ7«ör`Ȇ%ä”pYš=$‡€h©"M¾`Ô£´~”Ý•VŠ~¬DKî•›¦fÊ:Ðicg…TØ&ûÆîf…€Þóà0¿Ñ¡‰} yãp„-ü"¯«Oû—0Vö/ÁE“ûAñQBK|ö«vMRkàn•ÉÕššýf¨j’Ó5iYÛaâdØÐäFP8–ÙG~¤Ä¢©ÙÞŠÒ]Kÿpw¥à~^ÇÔS¬2¶‚d™îTL–ØsJM¡ƒÛ'5c“â<³¿çŸv•qeÚÃË/â¦étÙ[" Î1wHjnΗÑ?Ìï⃫vŸàõÈ´0'¼²¢ xΉ½Þ¤ÜraJdgÍí¦‘-nS3þ5à¦|.—(«¬9¸¸é*ð¹?% ÅÌ-"dn¯‚9 âßÁ=[mŸ÷,ók»Ŧö™PÂ$\Omü)"Ìy` ¹s­sò:Ú ®³V˜Ká³ÉÐ(æð«âkÐhX \õ×·þ >0ý ~ í’9©ÉG³:R†‡ïBlº/ú–?0qE6Úù€Û¦päë@H-ÓÙéó ínºs¦ùGcHÅMÓ>óZ‚!ýQ¡Èüù擟,W±—i´Ñ&Xš{¨A¡ zKPŠLÎx¶I¦ 6X#€³ï00~f^W¥ílg/¡Gnw²'ï˜:Ã!9éø âä¢3ésëNìºáåRo7•®ªO·N(”&"Ôj›LYºåóÙ5¼—G¶¿§ê}ýbJ²>íóîÀß+s9IÅ#îãüïò'¥¢ì³žëµwÔ- ¬J¾†8[ùÇØlX8ÄEµQ3ÈN3X†€?Ïnÿ§†T¥+¨ÃE@ÇìSéÏM!fì‚å¾·Â9ì•Úñ‹Í Ã=èñ}Œ9ƒ]==f „ •¾É}49…ÞO0TÌ =®Ñ¶k\³®ÿØ÷"ƒ4ØãL˜Sþ:Ž —š9*£ÃüLðוYp&0Ï÷²0‘-¼Rƺû`Ør¼NT´JS‰S¦&¯VR9*©ýsõ{ªWý Ma1ÓfÒ¸`…‘õ-ÛmgàÞÔP¯ÉU˜i3’Ò–4w3Ï\PêlÌÙÒ´Ü í6IŠ@y™™¬ñ8 Ÿ=ðŠ“c©ÝÕµ‹È“¢2øúã“'p"1M’¦­1ÁkCIÂM!uxù}nSîõ²x¯O><)·bÖÐI§:ÉK;àáKõ骠gnu¸dÏŠÏX©ží‘Ä ³&HvÍFÍÛS`é]e&¨/„ÿðóy[5? ïÅQ‹KdùÎÀ/x[*]›ÇÀЇLO.5’ŠÊ"œ°N’ã)&T@Îoºnhþ¹ÑlU²¿Ûàþ¨N“ À½ÌYZSþ—¹G„E”rLrC´ͱۭ¢E¹óv $؆Í,««ØbWì-¦rA¬þ$"©]æ§Ý”z`p›£\u¸U¡Ÿ"!²³ºC9–Ž•—îdw„Þ ×g3ÎlIÏ¡Û#€ø¼î¡ÇÀzÛé6ò_úƒto!§»1M.¨£{Â]žð"”òý×1]'®)agd¬Â WÝswÄÔ‰­è>×ÿÍ}£µÓ_ßý$|¯…t”qQÕE»Øgæ>Éx\j”Y8ÉŠ“ÜØÜƒö¾ŽŠ¤øæã‚R&dv•¤¼LæÎÓŽÙNFh±H±&ƒ–[—çåݲÀ™¤¸¬ˆ.1š¬HÍzñE˜vNIž·ñ!K“( —'ø©Go¯&®ãÍÒQÎÿiSý"ê‹ö¾Mל¡,5„meMG3âœdÌÅÎ º]°£÷U}2±‡icÅ:àŽR?råãâD ܵº# ¯{´x%Ýš‡®aóK˜•¬"1€bs1$±¬´@‡fC7!0ð—Ž=¼º¢6Bá¤}àôñ,¿!=½öCÓW.V;JïÉeæ2ø»Z6ti2šj Q¥‚.áŒÃêÕ~ÖGr܉úM!ÛŒö?Ì~˽ÅiºÅ¸éð: ,˜J°ëImPr‡HEò®˜ØlHš¤_ß…ÿbg.<›ü€a'ï¥[5üd.©•ØžAî}gÛ¡êòž6”Ö¤0UE=g)ֈȇ*qôKL ®}¦ä~4±c ùŸ£3ÜÖ–R§Ãý2˜ÂûrÝzè •ÖY'øNNaEGÓš‡}ßèuDuÀÀ, Dvr#l>“¢µID#X^']†x±lOîU.ýÆމŜ.ÉÊpšGÍœ¦@ƒ«Ñ/x{ƒöO„V~OµFÖgKF*_ÿBªz²o˯DÁ¦m”Q%‹Þs`ň°b!ÀØ´ªTh}Ÿ‹H²e4PB‚® é·ÈÌäÑl†lB0I<Áö̳>]•È;$±î$Γ w#§±—qQãO.›y4ô½*&—Àdæw ñ£W7âqÇå–ISÀA9ìÏÉÝÎ0@AšC´²:¡×›ø^ ÌNßßIœ_7 Ñ&çÚÛœ&Û˜M*ö„BóèE4\Zò7+7ŽG·´ðœš’ ƒ—ø¬Šz¢5àÆ˜çñV¸êw~æ9Ò^ÍwŒ;x_²pQ*Hø¼²›J÷w‡M l•Pí¸ÆÊ^q6\À—éî09UòG“åZŠEm€+¨A&ÿ<Æqâé`ÇIBõcj!ob¬€ÉRB7‡ƒÒÉÎ=Í7 ›´\Ošt<j6«™XG^"]ÄdOÒ»® Ï"¹1ƒqiµïõöÉ•R0ÀP6Š;¯Óàl(¸ïq]ýU¯ ÖPa硼_|ǸÉ>I(V¤`/¡éŒþ+Öy˜]ïõ¸r¸Ýà7_ù þjæìn-ÞùÃÅÿ2ŒçuD¡Í×êä¶< _tñ™¨&gîäØ0®¢¢Ù<”íП²:–r™=¨L¿a ‰o4 ë­i1…¦Ìü—8:h¡<¥ Ù3™R9`|?Hªß´"]×䯆§^»‹ÉP^‚ç"•‹,'úó’ö†ÀÓuc0¢jc %®Ö@6P%1ž¢ür­Ÿ]_u=„€A>¢'^ð¡ï9DãCˆÑη°Q¬ysÞ%R˸{®­¸N³  ÓBƒÙCyÂ'&€=ñMe"X_€Ï¶œê*G’üŽ¶ë Œ&€&¥Ãßa;ñ£;A‡dxûqÈ Ì2Ç zƒ%OúŸ5Õ¡+Ã"¦Ä»TI¼ô-£é"¡ÚÈ%«a|­uwxàn˜6g”(÷%=e-Øô—t7Î qeè ¿Ek™éšœžâ{B'K®9숺ɎêÉøóHÿï,^):çIð%ËòØW]Vì_r7¬XĬJr‰zð~ªã{ôðW€ ÎIJGløt¶êPcSžØ½RAr;Fô‡Îø„Œ *КPJèàeÈZÁ˜(ŽÆÔ¸bg„>¹¬/ñþâ_-U7¬üûꇟ‹¦™¡&Þ÷£û¸`³«$3ãfuÀ¶ p£Çjrêu€D²ÞWÙ9\ryO³Þ¾¾žA ±V€ã¡bG8»fýF«x×|zLûWpvCÉ·ÝÕL‹Áå®sîªÒ\ý{Ê&éR„sï²»qº›VzŸ)—c÷7ªÏ©zÎüg]¾ÀìDºòmÍrŸ“Yr)Ž ”ßõ_“bß ?Oç›l³ CEå1ÐQ©'¹F1¢`,Þm˜œáÃz‚áè¿ÄªÐC?3—¤+¾<Ù»ó6ñ1éAò#µ«4ì7Q/º*wQ­ÉÂó x¢#ÔÌwoh«Y_~˜@âñ'}¿ðà Eë0 x•Pt…ÁRÕQ؃+ˆüUŠ[n~þ†€ë#{ÙDåA²  M¤¦€8ù‹1¢Ÿw¤TïsàqZšDN¶£’3 ÿ²Nôñà8+¸ÁQư· óð«0.m–VBlÛ´Ó:ùïD4þ½cÏ(®d€ÐÐ>š^¥|VóÅÇH]•9•¼“2£ð¼»2lž ïYJ07*ø-eÑ‘åc¨ÇœWŠòQ¾¾‘‚?.Äí>U¶SU¡*rÚJµÊDÿO%|Ä æâ™[Ä?™_6;•A 4´÷K>jÔ“y‹ÄQôº¯ÍI†Øu7=JW‚=Që‘[2¤a²¸ü%n!)_ ¬±s˜L,ˆžLvª`çGÑQÓz”í¿ð ¨8·=ît\ÂðwŒWÑE(_²Ð1j‹éûº §íÄ Yç>•‰¶Ðˆ³™aJI)®K~‘/8i‰Î)PôÌZqð.æT Eµq§LYüÂÝBŽãÞ0÷ÿçÄ–g{ÍVüœ‘Òµ"ôÜ-‚®þ¶×«‡6åë@~~þôÀ äW{PŸT×ÞEqQi¬oÇõR’TŠbÞn‡ ào+ÃèMœ?sgKÉÛTo·«ºR@Äm9¦»k>Ûˆ˜Ïk¨¥[#À3ñ4ÅmKN¡¿$Ús{'פÚ|º/¤¡9FK=l}®Ö0úµâ ÜÄ uˆ´_•^¦¶3Æ,¿6Í“ 8Úð›CcË¥u’°Ý ÂÁìt(^žœò Àö #Tî…ër0Piš(ÃãQú)Þ°Æ„ÓãKWRm& ”1¼€áÙÞRìYí5[Õþ `†l8/Î"à¶ØÁGîQ%¯°qÖ•Ž`êEF–ƒF|§vbœ J=”┋°Eˆ·~™Ýàuúêqüñ·STÜàTsBk¾!Ž'ãŽ3ƒ:1š„B•ˆHK/›H€óÂ’¤pFÏxs&ˆºd­J:g•4Šl2Õ Pº™\TÚøVWÁé»<K\mž!ßKÚ3f /1—̧³e©\ßö—{©e⦆x ôŠýc{ÔUZßÎ2,Îénâ.wØö2-Ø+b~Â'?(ß ¢*êý¸Ê¾˜Q%}Ëq´±¦r7†ä¬¼Á*nÖaúÜW¸p–xmlHdYù#GN27ùW¹B–} Ê­Ø2ÔŸ+‚ÑÚ£¤î( ªøcÌ:ê®<¸TI„},²Lí«ža|÷"5Æ*œÏ>[7Uvè>Kž #Òèÿ6 y‹#0Š2©BäX ñ®M¸Ï1)Ì3ȪJ¸ó3af®kcM~)ñ’M·ûÙdu3/÷ Íæœ5QWTÒ$Ñ‘uϧ‘d#HΛ‹£Þâc*i׎´Uõ‡ø–JŸLëáÆ›ï}÷±—ì¿KšÚxñxÀÎ'׬Ζ2Àøu-ˆRþ,ZáGÑ@õ´¹ÿKðÅľPÙÒýáwzl0ˆ*CrÊ>k‚¶ˆã /DüÁj~U}Ý45¹µžšÚ¯ã¸}áO=Ç%Ô<”ƒø¤Æ@í¬ˆP‡ÝßÍ_ÌýÞ”c&ñL¿ç1bþfPh“ë..ž [7†›Uò*ËO³Dcv™y”r+Ã+·´öäÑK¤’E&„ÊÝ3åp¬³ªÝ–‰#ÿ/:)äG )£¹.%ü ¡Å½OªŒ«$éõ«YúP³9 Õ¨9‰wA£‘©#ÕÉV>[ênãnJ6$ 5ưÛ8Η/•Æ/=eapL¥pÊA˜_݆¢’›¡s™1ª& >dëM”˜ÖÌ€fž(.–õ] í¦”™Q~ÜLR \tÒ“ú÷`_&÷™ß&zX ¹û0zƒk÷à±XËÓi•vÞgqÝ8ÃÍYdèÅx2^² À²ê/Èyç¤|žØúŽÞ0ûñ|üÓå% GÅ £ÄïZà]¸Ú64“NH:¯~ {ßãˆÌÆX[\’ú´Çv¨µ§Ÿ:§&‰ÞGðÚ~ú„Øê™6Â2×ð@˜ßÊñàGdW3…ÔKçÞ"+€áHm,é+n¿ÑKI$×írfKóEc™j–åcïbì­øD@õA4 Óñ+t'¯¯17—ÌŸÚ9´DTq“RDŠX†Ò—93…»X|pAÊäÙ~74}OߣÌB0¬$u岿„N§©±M_Š´í* éâ‘€ZúfHA]ë†5sgÃt™ÈË‘ñËë¿<Ž Ï¡ŠS¼vñÓ¦/ø*ä&¤r‰ÑèÁ5ø²Üž¥"™óC™z^u!fP>®Ÿ›Ÿ×”ï‰Ìÿ"B‡|Á€ù« ŒÀd%Æ“EW£Lª«'¦‚´Œ®^ ù¶öht5m1´ÜYÄzÁæÝûˤ&FlM߉ÔóÒ#ý†p%6XFQNžþ&‹Ldb¨ôï—v8ï1[ÿب Ö/»¾cLú2 ³fWsâW' Æl OL×äÀ.« LšNÜšY¯¤³°°'°‹>üºæè¥ÙæÙjT)$}|‚ÛžÊèH®ÃTyÙî†a,e`³\ºé—G×øk:!Ú]?.D„Ø)Ïx§ç«iËœ}AMá í‘PAhÿêVe1tMA^’Ú%ƶzú˜OëÓ*È,<ÂS‡“Yì­óMa ×$&ý—í•´â*UФg9Âîò3>üˆ¨2qëXŒá'âÉo¬×Pl1<Ÿ˜ÃpÞU~cæ>DûOýœ…9ðj#RZ˼‘éf”@ëUÅÿ4·¹áRó‘²ø¾÷cŒÂôÊ·”ê>Œ?Âyì6ýœ£ éJjYæøÒ”ËV}±÷:µôî¬[ë1è7ä¯Gè|˜ÐHÃÕ×Sò0»=µ'C/NÛ¦6¡E²Ë+5dîœ/ (ÇÓ£¯Ñ©7Nµ, Èû/Ý,¾}ˆ‚(.ÝœG†Vݵœ{²ÿ¤Ä@{SVžÂ*¯ºžxI@õÆtÎ`s¾ÓuÏÀ̈«É! ºìƒtddýrmœ {¹XŸÌ4ª?F?»à(+<¿zþÎÂÇ*IÃ$n”K)#ß+L|XífHµ)VJë"‡Õb˜°Î£sNÛîM³I8ÚŽ#ÀÔ9®¤¾#‡–BçUHÜT|þ¦”ü]Dð¶% 5|ä…Üüw…6Ÿ%Žîr=~/Êq-°•[Y¼”ˆôëž«‹è)/‘ήІ€’ºžt=RƒLԪ𠕑:úOºïh°cÐN ÒX‹LÂîçs­.W’¾³Ëi­ÞŸ™Z{6ñ”?Ä“f¯_î–j?¯96)•¢žxtž‰os”†²/Τ:hUFŽV%ÕèĉëX°ü^`”[õ¦ê ø>¿¬Tsú&B5Ž/‹0L]ÀY‰K…ñûõÇË MmÏð ‘zÄ’>€æQ|`><¤øX½·t Æ/W\1_{g¦ú;ܲ’2ýµ”^ò,E¢¤‹˜%Bys ‡–O EG$¿ÙâžF£c]*bŽ<)χ±4àl—xÌܲz=Õå&W%ØB-·…«Ç¤M­¤™Y!`j#¦6ýh£/®1Ýfë13ņ텔&©‚×;ýØ$^æ6Ìwy…F9Oñj´pßh¢ŠýwH:2boÿ0Hö|ÿqÍ¿d;d;ô¸S‹"< )Ó$¿€¼Î¢œcž’‰# ¶z˜»Ó^  0kªY¼@?¾š<ø¤EÌ·o®Œ‘· ?ÿ¬Óµ¡b`xä`³ìåX?*—ù=ÊßaW[p‹Û¥ˆ`#–ûëªÅ±ÀéçtMnjòÝ—ÐWßçù] ®&9ùܹœ|ð´¶JÖá~O‹[häëJê–óÒv’›/Ò¤ÿl²ÞÒú35bý×$Zu†tƒ°àV½Ÿìw‚Ö}ß%:«¬-yÒO,\Ð sÍ<‡Û‹q²}M-G¬‚CD"*u¤þ­Ô€v<‘•s§Ð¸pcÇÎò\U-Á0´vPþ}òÏÃØh¢!a}Ö]©­NL‘Èñ£²ž6æŒ:Û˜¸çÏ0o_Z¼Tãýƒ>†B*ŸÏ+Oï0EwÚCMž«»ï˘ް¤´@ç_&~§ë’ZqÊ”xÇÖ~Y/ßêh¶´5Yôž^ނ탲 ‹±º–†»îï3EϤFÅA|;Ÿ§ÆË(”%e ”5^ä¿ ÒBà"ð£j.{ÌÒ’Å«ÀpMâm“¯‚Ôáa*4³égOÌŒÑhüÅ7½¾-9У޺ ”} QÆmj±WP60Mgt)²×x `%ÿ4Èôg.ädâBR1L ²åt&ZÍÐê<ÕÃãëŶYsWóñon)Íçl‡¦˺úÚîÎs(ÞGôL4òßÇ_KUKO ŒK”!<£Û Ò«jÙ'†º8M¨ÀÑ —µU}ºëé|O?ˆò¾ˆ¿‹.'lm`÷â·mú3(©ÓÖ%!TÙÐ0…Ï XÀY$m/ ¼ÑÈ`eöA3\Züf½ÉÒ?n‚¸ ±€nq¯OÂD3ŠK {ål©cÁqâ™ Qªõ1Äþ²¸¡ÿ(b›Ž»U…iÖÂÈø3F!ƒœ_2ÀëÅäPF`Þ1HèIñ2GÜs~½,atÀùÿx»ö-ÕÒ¶OIhTŠZeÍl)äïÞ]¸÷vì“×vÙ6ÜÅaK1;þ/R‚²ÂlÊ“™bœs¢V¸Å"”Ãcô§@JÛmËòxê•ßÇì|½ÎF]Lxç/:.úfðÞ #OÁläPKë:—-ìãì庥‚D©*u¹®è èÅ®¸D´P›ulçq³ÿÐ’»íˆÁ1åN0‘ZóšBo7kM[…^™Z°¾²½ä#h &‡»úfGÖpA/yR7:FÁñ­ùÂÜÊ7³`#C" 8ÊÍP™Ã€–ÂðÖa„$ºýžô n ¿±®ø|+dÚ®÷­Õ8†ñ&28«•TЬ£Ñ [”m‘ƒL¾Î°’zpªbÂ’ì\'E¨œ‹š *átªRÜŸ('ºÁ‹ë%{8¸DõÿBAY+‘h""³Ì+?nár ù¢Ž\›‘E«[ÿteá5\ÖWÎa°ò&¥ÍÚÙOÝúÉP>‡²»÷wmŽìŽÅ£7}ÜÇ'X¦ âl΋ÍdË­FE]ùßFÞþ-‹?÷3ݱ–Rš­î‹ ¹ùØr¾û›»(˜X[ôNþ"}©ìö40!6`T‰ì-$dj|^‚|Çæµ'{Hœ‘è,€àdÌRM¾Uß«2é¢982ñÇ|ÛtÜ)ã¸rêøÀ±O¼´ÇjRò²ýKÝÖ%±Â××ÿ¶ø1mÁ‰ Ž€ÂåÎéý웦;©vÛ&ë¹`ÓR&Zú]`)wé è)"¦žæ¯û×RÇõ: n›RήJÙ”ÛÛeði™à`EÚV†àóÒ½!½Óùμ›¶UðÒ•§¤˜qc9ÑwÉÈi4Ps‰$ÙTG¹)´cX5éÍÙ °÷âÃ*õ…4âä8–þôüÃl÷?I™Œ—·NÒÔ7GÇX² ‹ŽÊO‰6‹J³ÚSoˆÔøZP%€fvyò°eãè ¢­‡¯ZoÇ¡ýÒò«‘v’·²’‰vY¢Ï•ˆÅ‡‘Ô² $à 7…SH— ÿóö5â wÿª$W£\ñ«÷Æ$‚ñj¥­™<Œü§œõoâ‚Ó‹€Zíª3.iI ¸Ä^µuÃô›ƒ9.ë7–ßl¶ô.,Û9HЫŠÒñqxLÁ ¯Jõ8ÎgÿCóÅ XíiÉê_éÊy”©‡ E|€Úk1ûcOôzZ¢KàË9ùͱ¸‚ªØ)Ÿ?¤ˆ ÅÁ®áîHÄí7çÔ AÆŽøîßy·ÄJv>”ÍO gÝZMpβÜUÀ 2í™8®'nˆô9(áÝü•ÙSî0FY¢.¸(ž*BJ•ñ•hp»8WY ÄÊÛ9¨­ž>8ì7W„]¥eSƈ™l_áP‡Õ½þD›·…s|–|LT ¢pÛ|,¶]?Ð5(ŽZàýòä Rj|€Y4]Ú0E¤¥ý Ï A)€ÿ /ûnN)xSë>$( Jþ(~]}2â˜bY†üo‹ìߕĺ!+‡}e®_a’õЙš5v?—y>a§ñŸ¥é[ÛlœŠQ¡~_§âÛGíX½ô|d5É´ÙL«›oéªØ†n´ òÑÑò,ª–q&߇¤5ÃJ ´;1F$Ö C_xÀðb9þ OANg›ßÕ•Šø‘ÅX+nd‘òÔ‰M¡¡ûÞ:É\Þ{7kõÂc˜¹›ùÝ•#…Iî‹¡ûx½üIЙcdP%vµƒ F6¬Ýݵ­hÏ›ª%vzh[°SÙ(×,B­áa·úÀËMÓ¹&2Гâí•¢¸Aå3ÂL:g¸ ¶¦I9=ƒÀ(±¢Ú×›zÀ¿ñÏ1SjîdÈ",÷v †„•)ôÙC½µHë(ñ{uù±ÍtÜ“ïLû¹2¢[_"çpÒpÇÞ*Ùv’{uÃúlȺìö´„¨`ǤçþP))7DA1ë“~êè‰ü]2DòÜKCÕM5`¾ž‹œ–<ªä¤¡P  £+jmÛÌŸâÃ1±÷ÌÞ«¡x øþacÅ?[¨sÞƒ—î‹ÞFâÙé©:ȃÆxbÁÍš”jàÕÍu ÍY"¹íR¯6w¯#ênC\PUíF­Ù-+ƈÀÇ«ánÒ„˜nä¤åÚ¢ÅÀcÿÓNGOÒƒKC3þ?§†Úù%Îð-³òeGWGz¥…¤ ReLOc™ye‰vÙÑ!.ëJ°ž•ÿ„É#=¶uB­£|çœ} à~]=KD`ä˜Á31Ú)ûÿ&ÞŒ§Å>0jïî»Å_¡Z”íÀÚvîÁ¹.0fÃ9ÿµ#$_q;“ÛÚ¶¤8þ¾û£ Ð†nÿò•5é§]±4èÉH&:¬—”ò¥L:Ã)†µãù’(NSòØm¶9Ñ÷ ˾Û;ÙÂ^Vxo‚HÝ;× o´ÐÝoNXÞf–…(oÏE÷.©Ññ~|\É¿u/TÀM½…§-ò(í±?°Ô™ ‚§/r-›¬V^ßÛÛ«Zl ’zW,ºðÑæZR¬|§ê‘ÁrŒÓ ‚>£M(SŒuNkaÛo2A¼7Ý9øyi³•PDï’né²ðxßžK÷6ቪûRÁ¹i cÄ!ðÂfÜ©ÜÕÅê®ñ¶c=ÁüðCŸQ)­á7íù¯XìÛFÙMât®Ž¿‘¯µRaVí5dûU·iu’œX7òÐö"IPa]¢8Êæ6"lÏå¿îLÁ“UJÁcä“\ê›Ñ§pNb.þ:eD'òF1˜Bkø9êiĪù0A*zÐH8òÞ­˜áylËäðäìïïkP¬ôÍ.·vÖ2÷˜’Ý(ýM?øJ;ÿ7s§ Ž÷ƒ¨µ¿<ºÉˆÝã>#©„`®‹“qÝN1Íî6 …ÞwO´·¢¿îÉÕ™ó™¨YŸ†_à³}ŽT]ˆ=?È3Ùæ—é+gþJóﯓ‚‚JK™#·Zo3/ÖRçF¯gåÛ#²:gä³°@§Ú$ìQè¿Äòùãb&pdOáÿG¨ þÅ·!¹D»1àÔÁTÞzàå‹@834§|Ju_xæÂ\¢ÁjäðÆÛP ßã$ƒ8 ­Ž˜ CU!N\?òôP\÷š9ë‡üšG1Bì÷Ì ò㎙;œ³;ªn5Qµ;¦ó9D'`8JEbÀÔ&a¿b[¨MY1˸—”…£;Xoxs0«ZåJ¡1ˆU˜`šì-LE {Ƭ ‘Ä…›ƒè"YOYyÚ»:Ñšd8õõÜÒo#®×tÍ_};9ÕëŸuEcÚ/Û¬Lä?¿m{šKî¦sóŽ®ù8òéŠ!L%m]ÍÛï‹á})~7P$ ¨kÙœ 夾¦qÄQ>‚íÙB–óõ‘ŽáˆäÉÂÝÐõyü£&ºV´„¿õ£êõ·nçõ¿±¸áÌ|I•s¹aF.VDT·²h“ðù’šŸÞúý¡BÅ.Û¹_x]³†GØvgÈà•¬wÙÚ4„jKS쌙+šÌ,FˆG÷Õ˜á¾ÅI¶dB×¶H–Ðpj­3w>‘h; šz¢h„H‰Ý&à†Ÿ® $¤â‰?b 4.ìý\.ì1\’—ç3›ëmP‘p3äkqqQ¡Ý?kÀjN{0ä$Ú0§Ôש0„ÚYýä˜ðU„&·¾0r:Êú¡TŸ£AZjj£m6ÏLgxë½ÇqÅ35~Ê]R¨ç‡2Ü4:¹ÖAðKð78¤¿£lÑ%sËcU-?‹ïC[H‹úì ûgF¸¯"¿c¨¸°våàâ0 É>=ò ¼iÅ»€„›…üc]ÍGûý(v9,ѶœÂ8?Fï.Å/D†à\ÒÆgˆÓáh Ÿë”OH§Ph®Ì)¬#|4Kz×fðE±Ü4±h6@NeÇÞPó09ƒð±YÛ胼Ùñ]Ô°óOáN?Ee’<ªz×pQ³†øg³HÅœŸâîóJþ3°?åmöeS¼ 0Û;–¡èâÌ6uéù)ê+’ö Z’ÁRŸ9¼¨a¼7Å`)¿¼pÓžf4±­Êmx÷¸ÇÎûø2wp=û; n-?ïÆ¥WáKþÐ*8ÖC=½"ý¥¨çž˜‚b>¸imrŸ’"ðÞE —Õå½ôÂ=Õ¼b#”¬oe>™]ÆØ ÅU©G–ÒüBVi‹Óuùÿîû-ŠR¥=Z’pË -Ìk8­RtKLÛWÍ}˜èiÿ\ƒé«TøI]zï–ið’ÀÁä@Ã];æW终Ía1 Jwuçå_ØÂ(ªeCz¾Æq7#®@ÙäíljÞ#¼nk=,°g=yø³å‰…œ,#‰ÛíÒpæJ(·­CäZêå¬êåSžÀ»`’ºªïÕÁmà-”zïZ£Õ2¿W·Á"RèðÚ‘¿qh µ ÿÍa9u'òÌíïËGóí/´`Âù)yv*}˜ÈQ%iŸì&Cöæå”|'ÊãnÆGá‚™†h v|•ø+°.é%TH·¢_o€Õµ 19‚~ÅÁ«æ_ÚúS]<òLé ‹K£Ê8$« ~‡ó\Û5u…¿§¯üMvìúnß„âgN,@£?¼úéɹÒÂo¼ÐOpL.­§pû`Åâ’L¢\‹QfõnéãL¶çG‰Ø ìAÃáÑ¿8ÇQº§ý¹Ì 8ÍOФ¡ŸóGehè&Ëö¿–œêSNm -—}õf2CÕºè'ø îk7á ýþ %S+9GFYº BÄlDã[±4óæÏô ,Ëlgƒai (晃¬ûi¾Úhgõ-%<c'5ÉœÑqoFè¹µ–ü>lÚè¾4¬â˜|eFëNßÀ«HžO¯žNÿžPû‰–g9®”ýPãúzŠkàT¸²U ¼ÅBøx0Æ8Õ˜“¯µ–ÅW}î`ñæÉÈ,`7b6Âı6h(¸¬¨ŸNñ|8ذþ´e|•×c(QqWÛ¿cy£8Rø…LHŠç­l0B\O+ñ`þH&›—…µGX3dá2Ò<1¢vr·uµ\‰;¬BÐX-tc!¬{a$r¨±¦7ÌÐh¨gsuëѶò7eTÝÛ} t#ø³TÔÝzª¨×ù}SØÎâ67t׿²=¦!Z‹>aÏñhrviTÂÅ¿#N˜MØ›û•}~‰•LEñÿŠT>„úÆ1qÆšÚTLn×L\¢„»|–‚вÃsÙ#rw²sWUMÀ¹Ë–N[8xWéárO?ö,Õár£bñTâòN¨£Ô™KïÃ7K×&XǦ)Ý]#i ߨÍ&˜YªY¢u^ì‚ùÒ)³.ÕªƒUÄÖ—ï úTaiÑô^„$Jy›­‘1#[Æ÷±£¶Ì …+Õ™ØTi»š¦aØ øÔnÁ´‘Z&Q,ÄÊ8.¶ÍRa|“]í Ítþr*ü*[’j#õW…–+;wI•äã‹d!}ËPý8²W_ L{<Àµ|×èþ‰³^So´óÛÌ1[ÝÈš ¼k\*+Mî×tÝÀòXÊš §•å2æb×hRÇÂ[ë›qUñ*«×V³îãªi?–"ŠÊbï;rP…³œ 5¨PDÔϲdÁN6…ÂÍÿN:vöÖýÛý³”Æîæ¨4ºf>Y^ÕÝì´ô¦zæ¹ ê˜qbp¾ØNNO9„qý¾œ°•Aª–ܺžæ4S$6`[hFþ”®(DfHoãX£×v$Õ~ß”èDwk"«ÓN–w,A“êNâsM tQbµ3iÅÍg­:}…¬:è¿bpu±AÓòóHð28X²={¨‹š¢ª/%<JÒ«-+›ù‹„};ûØ»eˆ›P}…\¬3 Ë>Ò µ¾/¹óó[jÊožô&x£Ôs¾tTiO¿g8þed~$ÀN¢è¸QõïGå<Á­íš;”L&!3‡‰Ð8¡ì•]“kºaw•ýOåß_Š.9ô5öLJ¾ß®Ô7Ðë‘Í_?,çãŸ0j’±PÒ9tçmDÜá¬Î–ü‹X>V35vpe.K"£×²æ¢/NÝ/àKá\>šŽŸDÔþó÷PšbŠô´ÞCh> M_Hɼ–>¾nÌ’§ã)s̵ºq]pjÈ^Úû¾*‘d銋pa‡³¾| ÷G‚…¾ ‰ìëlbkÍ|\LbŽš“ôâ)rz¨¦¬Ê冫³À®ö°±^ú–úPaj°¢YÝ{J°šÈ}\$Þ7H’¦ŽjyEï0ÿÌR_øµõF]ëÍÐÆw/3vWWª¶aW™RË}\JIF¿å\µü‚ '®ÃôÊúSm˜-Ùm¾Gˆ¸&.j_êa¿½j€”|ûå8ÇÔpu€1¹ëøYÊq—\q„³*GW`};æú2>‰ÃÕùÖÁ'QÀdAýØ3ãë ¢)¢¦v0Záž¶#“ݻ۽8¥V¼Ô‚>G°yáŒnƒø]U}öÎ?Ícñ‚¼Eжã«ñ²°xIÅ¥Q¬J}3rÓoÐ"óë{Í•Xi¸‡Ñp=çvA½ÒtÕ­ Úf¤k–ǀˆÿâR§8rÞú;å;ÐÔ7á/®Vâ"El™|å. óeHŽ/h+}ÎÞ¤ÿÔv±üÿL¬VS EŸ¿m*€VíÜ!Ôk1Q½¡Ú: £Z8CðvLœè6iqãv"Ú.ŽÒ~œfï\" Â1²‹/V6#=v•Øú¼K×ßáKuGÂ,>ÿ í4¡dú5È:Aˆû¢´¯7 ”->þrF¡qHÝ—¿ NáW8·î3(3‚ D-„|iÖ¯Fè]~0ÇéÅÙ-æÞÅe1R€ó·ô°p}7›Þ•UŒPú$šèš!ŠÉ_¹‚ü-NèwŸ°¹iÙN—ÄΔ“p”ÒÖʹ;5ÜºÄØàã¦ë¦=ªžwñ܈0†"W¡°~ ¿$Æóxù!hjâÆ|dÆÃ|d1 Єå”]~$p îßx"[FpÑñ]ç'JJĘ“¨Ö #§1–9ßèÎŒåÞ\IÛ©Õ„ÅÅÕ>ëD 6‹CD¡È™8” f=Í)+xd¹ÀRä]M§+ÒD™gp@ÓÎ5ÁúY²¡¥È¢½³hx·øó›J¨¡Ù#GBI…‡7òTãÍutZ=ó(Kóã½±X®DŽsh>h:u¶ZÊ]æ!P5,GØa\e—ØGT¿ò·eÌxó Oà§—D/²öÚ—Åü£ÀÛP¸ë;‚î¼PO°ÌB &~.å‚ï¼0Ô8 À]Šß )íßBm•èÄoëc,û^ý–€8QÒÞê8]À(U!¹…%ØCÅúK~íÜ–HÝœÑ4Ð U…„Œ•(=HÅ;î†GÔðU1ûDvþW×W|:%„8Cp8#Rìây`¢T6ÝÄ ”jº-ðnÙèðvèç"`eEùÄJ6Y±½á¢ŒÌ«fP†:¶½Ë•ŠBå–ÉxÀ¦¶/þÙkL÷_T‚>šµ{! ¾»]äÀñN H¥KУéÊëdµhü*9ƒæa×]­€ej¹Û/ ® #§þj$™ "iXûjd—¡5*V·ŒÍ^`®Ê ùÌÌYv ‚\Y]ß_8‘a èë5ÞGRmkˆîŽÿÓ\*çÐü/kµýêOÛy×y_³º£øB¥Ð}üAêóR!‘¸ZdæuÖÌöy¶]õæYÃ˾ûçMÀ¸XSÕc’¾^LŽ›ûæG|Ù£gP‰D™Õ·íÔôìßy¡R©#;ü±!=Ë«©½!kƒ$œÕ ªŠ4=R7¥°‘M:„Ó¹lW$¾=råõ/\ ‚dÁ*É3•ùgDSÜvÙ{ŒËsÕ‘Ú/©ÊÜ®ì,Á¤PÀõÑtNÃË»²ã6éŽz¢Ù±'zyÙB9ÉæÆµ/Õ’D#ÜÕKÄã•-B&Ji…kä¿ÒfˆT“« ®{W-)5Êø;ûˆ.xÐiØji`ÓÃ#á‡äA—rj=kÃ:•å%͵Z‘ æäR#­Œ‚ÅBÃÃÖ…!<ÚÞ\Ìë%’˜vŒt-˜_íÁBIZ#t’75Ú™áùÇ>î3Í6Ÿ¬C¢ ²yʪ‘7ˆËẆ“ƒÏ€ô#üý^‡1ƒ/AǤz„ªñô êÕ Ä5[¨£Q Œžœ¦€Úš)9Ñ(æjá&¹Õb¿}ßËqC4õ ù çP7›©¯h˜äSG³8W£vƳ=àø|-Íåªæ őݠ‡SA5v°ÅV[où¦NÃ}\¤˜¤Ä營R%aËZ:é&2m?r¦tÃÖavÌ=Ôßì´D|2¨ŒœÇW‘]")r)TA§e«R0¶s{Û,ÎBg š·Ö×NTq¯.d¤¸õ[ã_È ÖBó[7ia™Løë³A!¢¹ |2üzÕ¤ÁÅU‰ƺ ÂæÉc£áKÉ+¶ÇûaÀß`áñ¿åã¢ð‡^,ô.iÙOÔ|¦Áæ¶ãuW4@Ùq=¬ïiíÒåÁ¾È[I“í´tY+¿“ÞOäéÉÿ÷ kïo£ÏM²•‰g© Òd…”¡’¸ƒ¢UØOÅʨÅß5Y¨ŠÉÍ#ŸÑmÉþ´Kî"Éœ¢®ô©Ü©Í|1¨Ø»hÀ1GÁ‰ó“!ýýáJ—{5rsU„³‚<ÃetC1ðhz‰ÂÏn¥š"?Rêq•· œÛ1›…%¹é%8_ÿtQQ·s¼YFXÜôM÷lò]Dr&3q`ü³¿ Æ£{¼jð™þ§år)Ž*ñêþÊ…çx êpÄ@ò-Øoà°– 𪪛ÚNÒ²;ØYMSJ·v¦6B“K ¦Û·…$rãÅ‚·äÊþ„ë¹{‰”˜™§íÏîP -è „ûU^Ë*O½ÚL$ a”Õª|A,É!9øöx±­ÉN;Ö*µ¹’¹5÷;œtp+ÖÐ6¶³YHI'ïV)f®&¹Î7Ÿ—WÌ#P7W ¢(é`9…PÂ_ŸFe콺š'°o›Êa†DEäuÅ‘fú{ü"ĽÚuó"w©=-Ó÷Rpqúæ#,ØÔ°¬éþköI€ãå‚§¡Ýg’ž(šçtw?’·AÍM5ê>Z`v um^/QΙˆszû²ÏÐ%—t³2¬K磮b‹ù|.š†xu䲨XþûZˆþZÎþ=[¢Å:ùƒk|½ÏÙ:Lhˆ2^^rs‘tðÛ¡ÿfûhò¢ûÒ:ö¸¯Œvk&”»Î29¹t‚X1™±6äLTì4ŠV™“sNúJŒŠ9"yWXÙ›°^zÇÉàGA¹6–w¼ù)ç4ïxšf‡îq{Ê19á±®ûž#鸾uPóHîJ÷"¼×€Ž!@+Áßc"ˆénøØÁZÞ‡òâ îžjWÔ ÄÚ!V$ÇeN/F‰ö¶Aðë2À =M“b˜éû “ 2ò\Oý£–ØÓ†_:Q=LúžÓšª 5…!‰Ò`ë G ;*|£kýÁ%M•Þ§#8Ç]½‹jð*ioæo…È =ZUQ6Ì´S(‘Vj;´Óc”¢h yBK/·…6 ªHÚÔßE娆æ­Éœ+9Phäߣó(ÍâäL5Å#±½ÜØÍä‚·º‘8Gõ‰ºZ¨ÖоFY¢Ý_ý¡™ ϲÝÉípaõ[B¯núa£–wþÃvMä” Æb?`Z˜½ -Ë,têœÑIiËc"ÓËÓœ·2»{ó èR0 ³½9wBÞ¦þPW.ûÛä«£Vê’ŸÚ°¶³¢ee¶í/ç¤ýn*Ҥ¹À9M/'Å.|üÎ9ÅÎ?¾#ò¬ƺxD¡òÜMŠ“ƒC>ÕI]-ÌL\3\úÔqêÔI@¿×ˆò•NÉ"¬2ã Æòì#ÕMÒ8ÒoòŸN[ö:»Þ¸&Ÿ6ÃEâlÓBrcäC}Ì`×ÉTK„Õœƒë<éëV¦Òlõ `w¢ßÛ$7¬0Ô3|ñÐ֦؊+,q^ÌÝŽ€‹ùζˆ%óÔ"“™X–÷uÃÑÔÚ°)jŸmCljºNHØháßÍay$3™¯PL aÝ2ú™KÆ9\5-Fn|"Ó‡àNo¦ÜŒ „í¸” ²ª®»º¢6©+^îNæûvñv¸ú kÛ;ŽìfAÙ·w'þqÑ&àœÉФXêÒð|/f9¨sšé±Æ‰#©%‘+»éŸ¯kPÖq)Òsñk ~«è~=®O "øcØì–J¬,'½™š…¥‘§&»tŒé˜U€èµ;=½™#;}TŒžÜàkWhÖȱÿÒ—‚Õ£n±C2³Ö×–òŒæ›±zZQŠÕÞÚzGân£Ré$Œ!‘(ü^—Oä·„ü¬šŒÃ$Qå;”VðNûY®º3Ý[z.øÔN¸bƽ?•oa0˜Ùèí¼ :Òf¥¸N #+Œ\Iãމd–ãå?Kÿ‹Ê^rzÐK*ûSËYO昼_7ÃÚ‚K“&ûSÇÅøp}gÊÒ½·;ñVí¨Æ< qšB+Úä) qîã%½ÄÏ¡ÛGñçYÆE'¢b†­tŠy/õÎ}Ü›iaVïû~÷47î%Õ7¸K!Šâz{ÇB´Ã ƒ6k1é™Ê[€MlÊï„÷ˆyS;õ ?ˆA_ŠÀoÙ5Åð öEx=„ÌGx-•õÈŽ»ç\ÚD ÅD­:â¹#粎Y‰,ïHˆAl0s´*N­ëá›â–û̾úY, \ üñ#<« Æß81Ôâ#–ƒ-#jWØ:çjJ÷ÑÕͳɜÀ}xrÏÆ¡+,¡Èõ¡0¡|h€Näµ½!8— ç±6CbQÖD°ÚüÎ?‹¹KŽAÇã¿>êÃIÇlÌ,ƒ\ PÆäeÝRÕcºY:©îa©£?£’uª.x™ºZ `¬ÙÑ›feid >‚e¿±ÎìÈà^!s¶¦Nèì‰G‡‚ðñ}2?¶Ò¼Ó)lwËRÀÀèz#\F=`øÞ›€:{ý0—#ÒÞ+µO„µÑ?R{Íé®têü•Tˆí,Z.ˆšŽ”¬_½ò˜’¶ØeÞRüg=Ä` Át¶gñ„Rëqâ$~Nå[õ…zaÑg\y;¶Ý;9A˜m?FÇ¢Ú%å ʉzáÞø·)ä㔎—£b• òŠaðƒ@(Û6ìNYÝ&ªÄÿõƒð;ô¿´†E¥â”¼f.ÉiwÊÄl~'ׇÖ¬¿C¹WÀ`àìm;m`‹xR™AAŸîn¥×ûi<š|{üy ð!ý¢Y .˜õ=yOY×ò©¤_à¶/²¬]ÐÓIé[°;ë €^ÅÃÌbìÁ¾)–I$kÐåþcrO1 2ôG©T÷’H¿|ºŽß%ÏCyDSíõãLï»SZ\?ö 4 Ü^‘b¬Ûƒû#ú“Ëî·Š/ŽT7?—‡}§üèŠs=Wæð¤u£=¹SbÜr^Ï=ÜK€‘Ïœ'y¨ÉnŒ½¤ç«ªÎõ Êa3òå7î J’jMKƒº‡109QÅŸ> "MàÔI€>*É[ΓNç13{êS %ž@´­1æÈ)‘¾Õç~ÃniGI‹4dF!£`ÂYeÁŸ ªl˜Î}Âq¢u}µqöóŽ€À‡q<Œ!ÙÌᇾöú?)w°uö‚Œ‹OØ[Zo£|·N. b»ö|xŸyK¢xG 1æü`øÇ–¾Ï»™| _p0Á•ÝØÖ«Ý‘Ý°yqõ †Ôcª§ûpBf1\{‘åF I¿ BB \–Iv°;ý…×È~ÎŽ]»³.Ä£Û$°ZKäÉèÈ@Ã]8hâ4Í€¬øè¶È£WØšG]:ógIn4ü–†ofŽÇææŽ][¸Rº²ßCò¾¸Ë´f×E:7xµ²§,Ì&w "À?@Ö€÷g‚´à¦£ý,< üp¾s%®`¾ó­‰*Ýam7Y²™Ù Ô¾l€ÍQ€€ùVw{Qú2ûµÀ!åÙ.ú½Ò¸‘¨Cat´Zî“€Œf O!#‹Â×õzó&L¶Ê­Œô…¥«µX íÀ‰Åí Î~ÐY+»îºâ÷˜)µkeÄéP€èÝYôD¹ I1ËX×bªýqY3PÚ›¿4`ü‡ˆp¶´~ÈñAZcƒ0~:èŽG¸]€ Á|0Ÿ6gº S™>S–ÝŒ5t,Ÿöò³ÚD²žÓ;fêR—¯÷'3y7õZ˜ªÐx6xË·‚ÛîúJâü9t* <…ÞYñÄ n: OâYÿ®Xé<–@—rñâ‘&»á˜k²Vm.§ÕÓMÊ. ™úδp"6ݼnÓº’¢ªí¿EÚëEÞ¤f9§Zg Ö–èJâëh˜ÓǵE3\¢ÄÛe—O„ëî®rl<§/ˆdU½Ø>²®/ƒ74-âD¥³º JwŒzJSÅÓŽíý½R…ÿ©FŽà¡P»û;“•æjäYõꯧÅìƒÙ`™ëω%K¶&Çûð”Ðön£å²BŽ;ìŒ*{Á|׿ô?ÞG.Qôú ´?ý k)ùânϹIe$yI¬ØM»‰ëv--ƒ¤ÎéÌ»Ë /¥Ø–îY¾ðd{ûU„ĸG(ï@Q–¶u$îÍpŽ·Fž¬ ƧbÃnìñ<¹ö(‚Ó+ϰ’”õ.÷B”ûwpxº}8J.k»U$™üHëßËEÀ¾£:»B6~l†8ܳ¾¿s~˜ñm)¨(7õùË0šn_\¨+i[”YË#m´­:–,¬Ä÷®i`Av¶=¤ºÇhŠm μ+e@MzdI×QˆV hçÔíSƒ!œ3/…ðØ£l݇¾°‡îý÷‘Ù,³"Uµ?Þ @€ÏNñùBÛC.´¡ÌÕ·…Õ_œ™‘€‡¾hIÿq $ªXÿ‰Ëð½•*Pºkü‘ÆCÑuuCì°Å?âUï3·FiºÑÖ,•7J™¯2ì.šýéTkš÷SuLjsåä…z[gj[[ÑöñEOHE{…uKýbVmî`ÔB\&¦x¸èø¹9;¼Içh²÷E,–늞z–÷;òÊ­ƒl˜4m?í B*(ûøš©šð4Ï ]XÒAîOIY›+=iÙÛÚ¶¤8ôGÿœÃäæšýð½2 ’Pfü(YëæC­ÔHö¤æÒŸ$Šõ,ÐÏúþ¿δìFyÔòØ géÙâ4$)ÏºÑø£Ú]•íîÖR!^4l­oFµˆØäŸ$r'H‘òÛ~׉MŸúÜK×ìY‡ çŸ^$¯°µ>àòyJà äríµ_J€4†xt™$øHß~Ú&»êsÈi$,Ò)Rš5ô <_o­>J?%·SÄ…RŸÀﱟ5ëD7Ft8Üaʤ4¯¢ZDœî‹ŽÇÏJ!éVpõ¬ ÕMúàÔc›aj²áƒìc<;W`¢Vìå‡ÃV‘©é\”6ŠŒÿöfF÷qCfbër«´ 7Bˆ³ÔY¼P†ÏæÑ\éAÛ–Uh@ûÉm¤wÅšHÕÑì{¿Úh;w*Ÿ´m׺ðÉXô0 zê6û ¥VbÑw/×mµ³Š*-„–é¸0-xþ5³4´t›;¢nÅ‹/5Et®¨ô×e;Ι/›»¤÷V¸å‰ÊÅ}r0¢ÁY‡µžåM'ªAk¶îQú¨Üqˤڵò¤d ‚aÛ­sƒN“,fäyªêç™C$6Ü"…} `ÑÙ[ç‰å/Ríøx;i8—ך——YZ`+jH;I¢‡Yù"âU(Þ›]¤¼ñØÌ$3À`*z§¨ÒŽˆÿŸò¬µÇvåT|›ï DþéÇ5)F1ÇÏdãàX*–ýÚ,Ó¨ »7†%¥ÂvBM ¼¥Äéñ:b+•¥ñ-/9{÷ÏùàrãëÓ/Òxˆ[õ{ž)ŸéîVÃÌ­c›±¦ ·1ºKt°˜þ§jÏhØm# oû ³‹,椢p|Ç“Ã; ;ì¸Ç“Kà†º:õ—½ EälµÙ¹4ýã̶&PLJ…±¹÷6|×»×1)¿þÍûXºP—ð‰!èšÎàù˜ò¥ó÷Í!—¹^ÍPÕ½'·Ž^$óüÊ=éa¾¤9÷%èÅæ¹n™8­!Ìž K,ü‘ †âƒ›2·—áo{Eqˆ*¸;”†–ýu}òÀtfá¡Úmƒ}~ÅÝ)Œô:4‘õàÙ¯¼ðò6Âq\ŤŠ7±œ¯7®ÿkÔg;æ¯ÆjÉ={ËËl9ÇJvzâw¨îö¸ŒÓ›¶ûÜ…a$1h‘ñuí@/ÇOhÝÇŠñ1ÉÑ“PÑþÛT]9lã=äÇæƒ¼­<Ö? u&Pò±G¾ÅÏš?êO,Û_¯ŠÚ›¢Ö»°ŒÁb«opðÞÏEŸX”ç`!a‘BB1¾ÕUóS3ø=ùoà:÷®AÚŽJä s âa ­©`‚Ê0žn™ 厵å^wòi9 Ywýß1 ñŸ”ø½«Í÷£ƒfaFW¥{°ª„)·¼hkD¶»LêO.´@®è½Ùú¦+ó´‰ÕF˜ñ…ñ]aK8S"NÒMãª~@rü­› ˆ§”øðÛ*âCabÚcW‰ã;˜¶µ¢meÈpŽŸ™¬›F)áiO`¾W¸iðH–pµúþhtN8Ô|–¢tU&ú^41GŠßi«0µup©@€°=so†s˜ÆÆY$%æ‰ûz çÐ?N·.†Ä5<úDÒD‰Ô!]’ |79 ëCDħ)-̳g2’š6¹g{& ?¨å±6nq\yb\¯­Î1¼-–Ijhï2@Ê‘¬>+;þ1qËÉzuñZ¹Ó±‘ú$Ü•>èÈ5øv‘ð3òŠÚ¾6µÝðT9ö.[Ø©4Ò>N,ª…b¤®[¸)bù[µ ¼XéÊ•¬W§èq—©(¨Ž/ìBþ*6Ê97uü9*@b±ö@ž6ÍE¥ûÙ$JSXø#V ³‡BhZá„~BS7‰§{!¤µ¸û[îw LÝëˆóAñZ «ßZÈ8PÄdúY`NÀ4+-ê'@‡R[ë ƒ°æö‹ˆÇa¶¿*,±®Ç‘´ÉY?LÚ-3URŠÒqï“ödü€dZ°xJ\€ÒÕ¬ž€¤Æbî_éî ˜òÖâq`ß),Gàf®°íÐ:>ƒXEÀáÍ(ÝΕ¦7Ö4ûÛ£z)#œÍ¸¢TOZs=­Aq³ZiÓØs\ÙÚ%~U[¬ö;mŸÜ›¶í©×žçf@?|Ñ×R}ŠÊ‘k x˜KO>FÝŠØ=75þ•c˜ÿ'ÆXé–\нN>>VÆË$³ ód,Èi«º^Ékãÿ¹g’¬™kR¸Ï+ dƒk NÄÊv뉽ƒ,×"›bRØÑÏ;¼_KúRd†LÔ ÏÜ/Ë IÅÊÆ¥LT¦aˆÕRÇU¤´ø¤T?÷r@‹“þ(ú®—OZ®`k";²ßƒk. ç4Oed›ŒB™“¨­zë:´þi+ï©-–D„æOò;Öa`ÓAàÈîFÞŒLúS õ"u=AlÏÜ%‰5ÅcµÉcrfÕõ ­&¾"³tÇ;N ab/Þ¶i3ȼ/ww-Àň›öŠõ£çokkNuS{9‡ƒh¿A‹|Ù_ê|ˆ„®età逰7¹Ïh6 òL"Ô›_f󃔶ŠP•E¬%!úiñ›Ivø'K¦ žHüòøíÊ®ÿyÿ±wž­«Ê»7>ri¿°ûŠŠY Å6†Ú)î ë`pYÞ°”h {bÌ$¿¦peä$±uKJÂ>YôV!ßû«»ƒ”uÔ&qÜö¶µÓÀ¶±“Gû}A8ª¹p²Ê£*Š £:|k¯Ò“¯üô>—WpÊÛa2)…Šåo I l ‚ÉùˆŠƒ1:ÖÆoªóSݽöŒv,ó®L3¯â^ÝóA'Õ<§ËEÌ<©ÍäÅ YÂ9sý;C¡xÈoš2ÆZõÄ:#ø{LÑ­;ïþ¢C[ݨu#4Hh$[¶Å' S²îÔõNô€®¦QlIzs‚!ØY²xSIx)ESøuT-må¡bæbk‚10ÂŽMlf¾ ã:ðPKËÆ>IVN&§Á]è…°)…g¸ƒ´yqè¥ñÊÛÑzÜ:~Ê/K÷›\Í£ºØÞA³¨ݵ”ka;ödí ÿ3ûµ†‡ÝË*qg7G72FœœçO·£\ rϱ%ÎÏóž÷¿”‡3×sxXÅòÁÀ4&B?b>ü/ÊL3Ôåf& ‘A››k¥­ä­ûª LP·T?ž3 ß3·@j€ ã÷=\Ù°…MÈD\Úéˆi¾À¨¼LÞ[D¢&ùxbhÐPJ[X¬Z ùTB^lÍÑCÚý0ˆ•m›¶uÝÕî&ù—3¢Ýp +i¡°ÈnR_šz4¡Š öÏ3òë.‘u™ô@¯úw6î4aÊíƒïfþ2p9ÊïùÏDßÑ L“òŠúØ *dV˜xÞõ†WNêgÈðMÐ8îSxÿ_ÕQLÐhI¨@¶Èéc¥ ÆÏ’YóôsNô“ò žò™ÿ˜8Œ'Lž{8_µðE"\”»óÌIvuÄ\ußJ{Xܯ¬,HYr—+/`}¾í ײiÝi+´ûîx- Ö1ïtb9¿Ì|aÜѸXkÎÑ*Nwe²1F‡e|æVW³7H‚o"a Ù)C®¯)Bf›X=';> <”ñÅ¡(¸y ·“àUkœÿÛ„Ï+Å#°w=|YT£×´ä9ìfÉÚ„Yü}Zžjçö[„¨Ãl¾œG]?*–æ¤Ó®¼…‰=(䃆p˜I7z²²‡ǬyÅêñ,«í^Í“i«2oå£FC°‹  ’ÿçùR(#‚žxõ×WÈ >?Ž,)ýÕ9\]¬“{‰,iÄ" ã‘a¦JÙúOu'ªþvWPHƒR8'ÿ»²ïÔ¼Ò »{Ó”X¢¡xq7ÆtQ‡AšÉ9Ž6㚎å­Vïutw\>,• ¹.\Çu¼ÐXÓ ô14™\|¦ý€«?c)žªÃDÑb©Ó†óém˜¢çΦ ¨žÒi;}§‹’¯½œ*pb—s©d»@ªo$üðD$\Ü ‰QÓh@.î¿nÄÄöØRR¡ê(ü<ÃÆ{¶WwëÄÇG~‰šZõ‚GJÚÜ™ŽÊÊ}âhÆãËf6Eþ£[o6‰ëû\¢¡ÄMzÝM Ò(Ÿ3­ßâ H™.ibº&6¶ÃÈ$½ck 7Ÿ±åªÄ<#à¨Õ–íöNñf §í£~Ô(ÃàŸh}LJ1ØÌ:Í}ôAÀ¯3†2fú Ê4ótm9èÄ^á Û¹UãχG¯|6&ËVîÄ>¼ÝÑR{Üâ>^ßE˜ñ`)PËKæâë t”Á4÷‚ònãZ3P­P3 }AZ€H†éïn„®ß&%¢zÂCÇá¿<¦—5ˆ‰á k_II^ ávS½¢ŽÊº~·Ø 5»˜Bw÷;4ßÑŽ2"½Év¡Ž5×3±§ë!éjA„GþÝ'7 ,~ãM£ò÷@‡¹™#ÈÀî^Þ 6A:©J¿Ñá‰f–ÿ2{¾°Ø~ùgÆZÇÇíµ¿Ä¥±¢ Š­Ìõs I§Ü?%ÔÔ<ïÂþþDÉA¬×]µ¤'ý »8ÖöÖPø`žä̈́ͦÒ\eza«'F3ô)”LS¹X¿Þñ´¢¦+ª3^’*pÍŽ8\™´1«¶|ÍÁÓ#ÌF0¨¼Ý-×2‘,žÐß({]kædFË  Âb¤ ?§gͧOÓZ\û¥P<ŽøkÕËÙ ªÅ,QI«%Ó/«LO—ÇOVViIœ/ÝòÏÝq½Ë®VÏ v…¶ku¸¾šÆ:±æG%ᕸ*<«Æáólþe¢³Wövôx¢u–>ŸfQOѯ3§$¥Ôeˆ;Ž0KO =• QR¬5V8–}“4‰üþš=Lýk U믾]äµ?„v”hnQ½¸èÑùˆN­/'"Õ ºÛk–?^Õ5åâ¿Y£„ºo'¬tep&f7´NÝž‹Ú¸ËJ›žçTˆXÆDìcGYÈV´éÚã°xëev<}µ“}hèR3`i]C…k5E6СÏ¡½ŸÖœê!,]Ãg±~ >Ü2úþXÑÃo7ü¼}û^­<®ÈÑÐj—ž± ù1óz˜ÃÎü{ŒÉM%ÐmË–!ù:þó¬q&ÍøbÛ‰V÷;;acuÚ[¦kp߬àÈ»æå›™îGiÙæý`þ/¹0“÷ñpå̶°¡©±ÈU!–ÿ PµçGhÇeÎo΢¦$yyí»eÑsZ{è&‚Üʱiøµ\ìßùGSiø°ÁÌ;üE­ŠmÖeî"Ç¢O Œª—&o“éðÝ)^µù}ÞtMRŠ÷™X^í!oÓ ª9+ÿ3ËkþÀ¬-AAü¨ ë+-0J·Í?R&6(¹ÔsÚ“A_b‹Mwzp»A ¥ÑmFš Î=¤ÁÒÞ„ÇãÞÔà¢I2 Ï{v»œ<Äm¤ÖÇc%Pâbi<ÔQ·Üȉaš<|7¶)íñ/Ä´*#ÅŠ È:ä}Ý©yJ¡éÁ—JøïZÄ÷?‰ˆFOÖ|Šð˲¾ÕœÊ0‘ÐWåé?Ux‡Œ˜Q€+äÿžEn_2Ó<ÒÆ†\iïĵ÷âjUlbÔuId<^>Qö aäˆ9JÁ´ Ì0‘¨Á+"Dì' ²¦Å¦C )X)hÒö\û›jÒ’ý}^½¼3,ýVŠÞÅOajÝ d|Sÿ;Ó ÅH˜HÅüîÀ¼h•Üj:ŒýdÉQc«µø¬8¨€æ(úxúâ&´8ýÄ»8Å&]§s$¾s¿†›¥ã`ä qšŒm=ª.ìrËiF~ê³rB‰-ŒÕµí³ò÷°ÙÀè¼Æß™êÿ¶µÆA€jÊI$`‡À8­&E:òª9Rò+΃j·õsŽÁµcÄÕzÂŽêÄä"r¾¶ ¾Ðm:€¯E©Öì'âeÂd²’æ.âCÔÛ±b:ÿ]ÐöÄÿrm„V͈ں^úß.YgéÜ´ýMEuy\"~éÒ˜¿M.¶áõØÃµj©êªOxlØ#imý„Jöbûb¯nÓŸ|[®ÕI_f\¾ÿ‚O¾JÐÒ£7ÒM‘u5×!j¬º« ×_X¨®L-Dñ!$#«Ð)P«¬4ïf“¤ÄÎŽ\¥§%ÜgØç¢»{sêÞdä× ØË§¶éº)-Ä÷H¾º#²‘äK™  He÷T4ð”…ª4O.†Ó(ž”*ÊøJæhnë¡}HÞHøˆ¥ Wù±¨§ò‚ôh©á,µ o·N`˜HtéóCcÒèÅåc~B4J»¿ 5jÈõ­.’¿ì©>yz(ªl;ðÒôŠ—Ð#48Û¥U ³Ž~%qT¡ðI?È–5Ÿ<3l`©¤ÿ×»QŽ\Q‘°/„°`‘m-‰3¹d.}¨ÖÁ¯áýÕÐ?—ßÉÖ”òèË‘¤R‰ÀFô”E*o[9ƒ}æ—Ò'ÎTx`õkeœ&gŸÌÐo©‹œ¦Üºvnƒõ”ªRº˜ÈßüÍï#¢«Ú©õ)Ú•-Ñ “²C46¼ …ŒŒ>.ÓKŸ –‡|BÎsHCÑ¢M}MÍ53êÓÑgÓ=Wë:¹âƒX6:Ÿ=ñTWÙ½NÊô*L!Š}°–Gp£p|L“'¡‰»‹³ò‰M ÍÕ´D¯ä ¥ïGý(ƒû/µ”°F¾úä€=gBœõs®ÑŒ¬ûÀù@³–o´àm?B¸¨«M'J¦§Ñ-5¿$éúÄŒp5S[àÔ¼š {w9ads8‚söH%œ¥œum áV1ö›ô1½#ýå–-««Çõn2ŸSjqÒ‰QëR‹r!^£WwZ*Æ“˜‹k"Ãü£!U*Ü “´ÛIqÙì$ÒtFFbz¡Á &%ÿ–!œÌá¡*iïÑç4!‘H4èMmíémõŒIb§·/±YçÊg~ G4=6܆†±þÞäĵ³Pò ¾ŽÕL9†¾2ï!½][¥»ß¶¯ùNk\ªQãܬ•Mu/ó³QÍ—ly‹ýËk[úJDê¤/÷ų—ÛÛd«ššx÷U ÊD£¢‚@Ç=§ç©GPŒKpG Ò›e7 à1_ªÏÚn§"—ìz¤,0^˜.^­oÏZe s\±ÐwÈÅÕd:°†‚žjò]¥{7G™ a‹˜¢‹£•|•?ùšÛQ¹«ÒM·‡Ú…°0íd$ãk‡8K©õD[^25µó89†ÄËòƒE_Ñ(-ÆöÀ&¾èÂÓ[»†ZgXÔøG„ùR¢BD"9sŽê%Ï©›ÁŽÄÑ5Å5r‰S=Ë"_Õ«3M·½É9dFœJ7eÁn™8˜æ9¶óÇ#Ï»—§:ù”/M<ë¡{)KV Î>.9· õM…’Ö5 å(õYWŽn•~öæ¾;ß|G séX4.ʹ/®B´Sï´ëOYŽÈÊq­&êFQA#qæËºÕ‚–Ç:cÁ¼$x|ùLtsF¶pC's¹š‡ÄŸ( ±¡ÿ­d£Y)‚é.‘Ḍ2SxöÝmϨç·:B6%^é!´y ö"›Îö[ òÊ|L±^Åøý¤Ñ§×B÷¹hªaøz†I“Ž‹©*KuÉ? ³wŽâ#’_\¾«&@·PØÂ0ò< –5¸σ0ýAŽ%á„Í ±„³°99ëVkz¸ÂR`N·’º6"æ0K_çY³"HßÚ„* m6ŒÈGˆ+•µ¶ªÝÁ¨ ´†¯4ˆrI²Qç>Ò…etDz¸ªoÌqÛ4¢Ìü&¯±½gò­±BœM“KËý8"¡ÝÅŠç_±L6Žõ®á»™ägtºæåü¹æô-Ãôoubj¹HàÖ–‹á¨«ß(sœNh9¯óH2ó²Ýܪözûñ»oú¥*…(çõ—ÁºiH{ ›jý×àÌ%+W…ìÁþ «Ï¹m¹2©§f‰ÑbÖ•? 7HÚîÍo÷¥å…«4bÛ|fOñvôM6!6Óo ð¡Yc]?ãívŹjòÄí%ößÄ?î9%C.kŠ¡ïr°-FÇÄ„2{U©_êƒyÙ+³ÐÙ×v·ì¦ë›E µdJzmÏÝLö\‚`}|ît,LñøåêÁ îQðAÇ«ŸçѸ¦›H³ Eó6߸óS¬/Ö:­fçm$u·Ê´˜mà•ðú A³Òx©Ïcvª‰•À°90ýë‹Ëªz­4š1ßRY“Th•Ë6äà@Aùzrm'HŽÖÛã’gÉF`ŠçH(ÈïK£@#èN¨"»Ì«c MY‘š‚™Êéˆ/Bp„é¶2›(:]»Jliš” ZÖ^»¯D,ê Ëœ™fú¦9~™jߪü*¯[+“¶A-%M@$.ÇÈ/Æ”vˆ4.‚[¬n: `„PÖ1*ÅŒŒ^À- 4»*’2ÙäVƒl¾ÅkWå®§ì ÐJ1PŒm "·þãMw’"e…£ ÈÜÏOMïÜù¨j‹ÔNhî§I†‚,¹oÇЂçMEÝLhídŽÝÑ!·'è›UÛÎ5ÃîMh˜Ÿ»¾«oͧ… ëþv¡Æ³›=0°´åÒLj2JõÊ÷—QâÚ¢2Ër‘–:®O&ÆjuÊY§ ‘ù TÇEØ`HбóvÖæÇ=êÑ(4 ¬¾Îëd|ÕÓ¬ÔÑýçw¶)dæÚežŸ.|BØž,å;¦€Ñ xÔÔDªqÊ¿iåR,™°jS}£ç1RKO@;Ë>“XÃf”ã›ì ® eV£áÔ»3ÙÛ¬fE«Xb½ŸÒ¾béx›RÍ •ælÝ€‘sœß ²‚¢?éV夌û=Çcç¶gå(’³•Ó­ë‚ÃxÝ=\¿ŸÌê ÈiÜm!gmjþé‹OÂÒZ(•IÇŸvp¼ ³ÏUœ0p©)±ƒ”‡MÙ"ªÁ“ΗÇE¬¹*]e/§odÑ©bã˜U³–ÜÆîøVaðáÞå &s8Y¥x6(Èq¨g €ÐЇ“9]†fRAø<5èд–ìsåóÉf’wüœE”†‘ù«`i1BбĪ!£¾é+¸ :|Ö é$[ÛacÉ÷cåCðÚQM̆f £È[o,)>£ØÀø„×Ì_Uý?¥±(Ðw}@c\†Òˆfihï#Þ1ÑÊ×Õ½ÿáW›ÊBîKª’áz€SÂÕi?•,¢ùÈFÓ)ß*ªìãv,'ï žä?»8örú²jKà ĵÂöÉ¥Â!g›‡³é¥aÁ­bIdPJÎ^7ù+aº¢Q!ÈΆ´˜'ÉúoôÖȺ{$JŒŽö¿v„<¨Þychú÷ûC×.¤Þ[\ƒØs|fPå~Æ" v›Ló¨ßÂì·®eq»3|ÿ°³‹:LPoOJZ7Àº··¬¹]+Àµ Û_ÅÐlXÃûü—ΰ1ˆªë/te· $o8fÛBí÷5À9ƒ>-ɸ‡)Ü)ÐÑï6?~ Z æ=ùà›rÁ§{Íß ¯ªÉÍgç ­™å%êªGWø,h€œäÚ–ßP·Ø@u$ˆnc<%´N¯©òœ+Z8èëh†ßŸ¹ÈøëBdÁGªÙ~¿!6ÞDÆ3J‰Ÿ ³Ø¯¥ðœ‰Æ ÖÈ~¢;Ñ:1æ~“¯gzHÇixÌøü½V% /àÉÉÓKÿ…ÁŸ¥³€ 6²žYY4âRйëíTÌç©™&kÁ¼°ñ4DžÑ†¸yEõýü¨¾8Tš@$dÍŽ@wæ Ín Õ°âw:âÓ鵓¸}¬Ì y-ü½œØ¦‹×A<‹žæzyïø½ŒpòŠ$Šþ:ŠŒn‚›.ÈxµóYÂG/‡ÇЬÑòxÞTäz|.¦©ŠŽ&¿‚t¢34ꔿ𹺞~ŽqµÙ³Y¤o CòUµ½Ø¦(CÍòÞÊ¥ç¥?¨Ig^¥Õ¦DF6¸°«ž 6`›Oømbb³–WVÎdÛ9,*ãtií쓠ʆßs}Ÿ÷ÕXLPä3N€Þ“ý}€§umæY•}›9g'Õ€’>÷|’ÍXɹ†M.@„7+Ǭ]ê <'`qŒ®}ä'ùùVÙŽe‡hšDݽ°ˆ‚I²_{®ï¨êæö| §ËÁç5lÖF#³5‘ÃÂ%,)鿆;¤#[¡‰‡¾HšÛÃ|ð*VMд{åÚ 7¢Àùs‹ZP”j4ÍÊ;•³Ñ¿¡£ÇaÀœLÐMáD€ÎXÃön4o~Rž {Ra…¦FC¢øœ=x|&Uú1èCQ’•@«&…< ü ë¼U´˜º¬þ –åÖœ'ؽ&!ARž]q"/‚}G›^¬½î/ïÉIKÈ׳Œ]XÕíÎVgDU°âgeŽ666+k¢fS=ˆû-%H¿°× <à€ª¤p³ì”\Û«Jñt¯ÕÀM ›ïÃs„óÒ©ôÒ"^`/”ж3e€a9Zà€NX¿®…8d]ý¾Ù7+=ôõÑ#®º4²BÏA ­L? Ûvÿ¼w®I ,ùVe%cŸH„»çûgÀ”×|zå/’Æ0è…,Y½Û"®$/‘ŸGÅŒ5 MUzñ53ýÊ,þœ”ÖH’«¥¦hékJÅÈÚî—Â"ZMG®™@ U&— næ©Ø$G21ühö›5׋éŒ9ƒH Í'•-–õà´Bì.[,ϪR² þáÄ›êAi–Ù/ÅÌØH.Ç ¦ %JdÆ=ðt‘%Ìf…HÍÊÔ¤à8`ùáoü¤ôvÇWõŽ™%›üË(6Ÿy…Šˆ‡V(yOGÆ ±¹\.tÑ0ÚPj’²P¤?‚Î#b9 /ïIËÚN¼¤?©)³­PΑ]Ãex]ÿ;+»Ñé'|€Ž¶ñ‚Y-óLˆã¦ fÐx×cúg椮 ²Õ ÎÒÚèÝñ•–¯$1µnOµwª³ID¡9ê)ó¤JGäáØw)˜ò¿tª)ÁÄG*üÑ4¯raáž x³N;ò:Š^–­ÃAg¿ÐNžÌ @²°A\læÐÉáŽ!s=£'o­8êß–îú¹ z™ë\Ú—. ƒ<ŒEô`g$9çN¸úÐÜ“ žY¹&{J#Â]æÍœ8û3¥µëJÒ7œ·pàƒ§Í:“îæsDåg-¥îB«ûNjô˜µCQŠj]1;…E#0°gÙLn ò/>œš×Ý© ØF˜‡K¸3—,F£Ú¹C<4îÒ©&w]âUñá?ø’ŒJ¢Ä»YC€t †½Lš_ý5¾šK*¤Æjá}è|ô›×¤¢xæˆÚy=*±ë(÷UMý|MؾՓ^(P>-ÄçYqp¿`®Èhçlü=ÙNYaàÝ ’Ä8[)?g9åñ%(w/õo|H*xy V‰Xh;)ž¾­Îùä™61ñ§ËóV#ר`!ŒQòøßØ’#‘Âv¥V÷k¯‘ZIIä—ñœ÷ûGì8ˆÀ:u¶$ZÛ‡‹}}ëˆTýü¯¬Ðm4é}ÌCÒûóÏPJ –„d@JFÇ!îØmv<1ìkƒŽ¦£”'ôî–ö«tÝîkNKf|–ñÍÜï,Õ06]*—ˆ^&iÚRÄ×.K§Q,aY·O“ë!½ObV./H¿Ú³žq;ÖN±zöIï}ø@¤9ß .úñfbÅ´Pð¤÷Z— l „yp0Öî”}—x{ba]hZ'Ó®….ø.QzvS„Êiƒ3Ä…û6bâ)ý@w~>Ù–M>™D_ Ý>¾{å.Ò˃yAdð²ìºÄ>ÈK@úK|´P©Ä_̶,ŸÈ ê\ÙgÍh¤è 5W†(ŽOŽÜ¨m\"áÝôÞ(kA|÷ót¤°™jöGD•!ËÃzìbT«m«Ü.ÉôqÚT5ê(šýò4ïI¢C§þ¤8í¡ØDÓPðÞI ´6çµeÝÿ©šjw:\’B­¸¨e›ýkÙHŠ"¸VCñY>¹8OƒÄmKךÏ~c™ëð²…O›ñðzØÂÎÑ¿ 5®kD¼"þÚ{ÿe¯^C¶Rî!1IG&Úm7ËJÎCáËîš ¹T¤÷Œ7ÐHgí¸[•ÝÜê<ò3Ǹ;ë* þCÇ?¹Þ[m3ˆkøI  Â=¢S ÂC Pj—èÍÏ)#Dв«N&ÃÅ¿ºreŒ€œð¨JbÁ·#d~K`&`kŽCê¯Ó…w“U#©~ÑÒ˜l6²P–—T`È‘èIfÔ9}ØÌ/ÕHîEUœÌt‘$Š®û¿WƒVX„³8—TÅã1â”/L”í¼Ó:ѹWò˜Äùò$Þi†vR~°wmo/4é·,Üøv~¡ \xÅ+—»ègQnÔÍ2#³–³!‹áøŽ—oîw¢Û„/±¯^Ne»Ë¥tŠüow–ÎÚªg×t É U¬ºI~É~Ûog?܉óX»í`Î_GS©†zæafÆ$Ï%ã<ÑÁ­wé&P .çæF”D*­Û´Þ Ä»f½"¥Ârn÷1…T¢–ÉÉD»ëÖy+_™g[?I¸pó%k†ü>ÚRLÚž>ô`;eª [Õ?TöÄFŠhfpPȾëc /(˜@m£šÁy ¥» ämFôëÁLíØ×á?_!³–7Þðh‰ÍÝÒRc艙Ã×_ë7ߘÅ|OÔm£kêÀغœ9²¹û‘Ȩcf7Ž íÚ™©‚´aÓwC˜ñ1à¬ð§îÕ¦}ˆä5“ÜÔM eð\S×V¯ÕL V$ òq;ç4Y W­FmÞðR.%ðø^ .N7LmX޼2Éë¶ÕD°y@6Š93ȰÅ6Ë£œ$`5ºVÙË5¢Öuý3˜œC¡¯Ñžö÷u¸z>³šnÓ…¤†„ Ð-¡¦NFÏGØ'†>·!2—>¦ú2e™é?HÚzÒwOcúíñSñv ÉêWÀ4zDöøîD©J Д4â3ó|«% Ùo§`’èx`µ¸Qj$£âzIÎŒé6Õ‘S_0”` éëq­+Ž\•–—wôcõÎ׳ºµ–e”?쨸Õ~ã9h%#tÝ^@}Iò,:„^s˜ª¢sï€x×,”ò‘Ú'½Š(èƒárø&€|´}£#= ïûùñ ãUoüRfš¸EVXe}¨1SÖ:Ðí´C $"‘‘[£Ö’¾¬ÔF®ø Uú±6Vº›3IÑ)>¼½ÛbHJ™’ߘn‰,X“ÕX>Àuøoë%Á¬³”½½-{8ũ؂KÐîsW÷Í'­§ê@2î;îe‘"{‡fûÇ¡å %ÿP³NΦñï¡ ^eB¯Dm¡¹Ëoš2IMëïA2x¾*ËLppÙV1hðÉiº&·ú 4†*¤  òkÝ;˜•ÅŸý(•ÞØÅ¡3ÜÒÛ0þØi#š ÄO5ÆNòØB…gvÖP“êl‚¨W}z²È–l( ÕðfMlkdƒ3õÏ/'jK2³I}N”ÂtøžM‘‘4…ǧyqŠÕÜåã DHÓ}%ÇÄÁwžN›ŠlšäTJ1'Æ&‘Ç›)1ÄÄ} ýhhqðßì ú'Dy[XÒ_¿±Ü˜…ÂWÉŒMnYk›ÂFýš–:²Óô×7 ’“Qîód ¬“_ù‹_#ÿ†:ïM¹$ (­ ¾,7§ç4 ‘²,çGU–¡2‡yÙ%ùé0ô¨¸¢÷_ ’YMùžzØ…FY<”IrˆOllI_ÿà #ÍõÑã¹¢ÌÎèsà¶ø/Y©)òò\&iÄÆ.Üé5eV±¯Çu~Œ¾±ßåÑ8Ž3«GHøBµ¸%%Ð9sº^½£ñ7y¦ÁÚËÈ-_AVJü*®Þ…(tøò†è`jž Ý¿[šÿN!L´"í Œ]§eÏpWtbQM >zûÅ >Å5ÕBÓ~žæ gªÓŽÏ”D`_7w¬¼¾Îö}o_0W‹Õ‰~ò*|V/T@z±S}³rìy¾æ¼‰&> Š\– )5‡¬»Ù Ô•þ¨‹çCqÁ9ëñ*¡Í¹¶û’¶trxô¯]ôâ/Ÿqî³¥IrgÄùxB¤‘åfŽ_0y­Kí8Êú¤Lr]#›òƃìÞä«jí×G¤™t®FÆ7ÕCf® ‡ @{Yñž¢ò5´.m˜·¡6ÛŠÙóOrí  EûÑN3”TýþɪïéUϪBØ.Ævt2ÁQ^ºPç0ÿXÁ:ýÙû›I•®|­:ó~]à fJ4šár²ÓĘ«¼‚}­‘úŒGãÒº³,&I01!„ =ðîð|ˆåÉY‹Ê ˜‘«6ZùÊ삜¦ÒjäM„ǶHz#/ `"ÁhFÝ\PêO”oÐ ®! Mê^× ýêzç.ªýð‹¾_ª.ÂeõÿZ K/ Hé_ÿjXÐ{-ÄUjøø N–£»´$ë7ÑÉÊÄüs½!ßžôkÂÐÊt'bûïVY(ç ‹h†Îw\œ‡×˜S Yÿ²²rî«9‹ Äฒ‰«òA)AŒ¯ŸíEÖ(øt×I¾ÐŸ]yñíÈT̶{1ûÒÄ?Ðfò ‘µéí†éã!àŠÑÿƒGª ë1€ùQj¾ õX¥hVDôT_s‰(Ž?41Њþ½„°µ›çCí;¤Cˆ¹½)œ =£väèâÑýHÚ *_)…‘©@F 'ãÖÓûú@=ÕÒØ˜×Ð*¡Ec-8 3s]-õE !z›.Öì2ÖñŸdù¶- ­Æç…‰PÓéÏXµÜ4á GâP¨¬•…b¾3DÛΪŘ3å1MÄÔE, ¼%ÆeŒ5KIÌqÓâ¬w@níÒ‘Ò\*e±²gº,¤:ìCó\Lc®Ã—‘#h&»¹«†úßœžtÊí§‚°—•íòm­ßWHÃ’¾Qt½gäl`è;ì^øT%K6XâT[b¥ÚÀŽ ªŠãÄÁ˱‰dº÷ ?“ëëŠajÜåÅÏû^¨¡Lá»C÷¸˜Ú²t1qä™Nð,¨ïÝÿH]Ñý«?Ÿ8‡3:?î·™ÄÿwȞĴºE¢˜¼øvIŒŸ;:”'ÜסZòS}¦lE}æ!SøÐ‘¨”eMnã#‚¸ð^ °™q Ó­_—šJ¸Mï^ñêñRK#»I+¼‰Å ßEæÑví²ÈÇ›MN „ƒ˜Í`ݨóFá"1¿•îݾפ½‘¬Es$ý²†f†û@Uçõ‡ÝÊOÈE{‡½wâ\:xæV~ZÃUÙ¤ÒY„²p&·ÊÔ0 ˆ=îÈÔ @^;µ AÕUîV7O°¥5æºÿ¹†.@šCq®n‹iäŠ*Ý·£&f†£" h©:AÄ;2YtÔ+U-ýå ·g̨ž£(ÚpG¾L-.vbµº0(ÇŠ•ãd‰°5R%ßìƟ Ê9x–Ï|§0›ÝVn)þrº;L«Á7TŽ}KÉäøììµáÎU1¤g€yŸ)íÐ=oV|wÁ“âJÀØÌ)ø¼¶Nq}÷õò-’»Czláë,ò>0éH%Ò;ÀbÏÓ_WÀ¯ÐäÝJƒ"S6už@¤Qh æå֞Σ ¸¶¿¡*”¸å?ûÂå˜:ã²³Ñé×®ì'îó˜fMNBŸP[ ¨Lêd¹GÚß4”a—3=ô9t¬d  |º/bpÁ'·¼ôNvÍÏõåóíN¼W=1þ≱¼ap8p%+ÚºdÕ JíhúL k ¬ya™Î*Ä.¢èÏç®±Þ{<É{µ³@sá¤y¯Ä ’&í´Çþ¤î\ƒ&¶4»“ü•Qº%Ï<ˆ¦Š¨JYòS$W„F/äJ³"R»8Q¹]A<µ¿Xý##y2ÇeÀ£yÑ„œ;íKfáN iÓêÑÕÁ•Y ?<6çÞ]=áǦMI:Þé*³ãM8ÿ¼vä«b<§·þɼqëæcšaLÌ5|ÌaM¼õqrèõRØC ZDTu<2':>Ä=f+PÎAç05Nì\,Â!Ÿ}X¬Þ¦«§Hu--v…t•õ)båøÁeÍ %M]„7µÕ¿æÉ[Ȉ*OÒë†_šµLÃñJ@uÐÔ³¯˜·>Â×dz$n˜t tCqóflz}ö×ÑVm%B$U‚DÈ ñúÅ–L—baÛ…ö÷St‹Z&ŠV¥ÅŽ!B©„ÚÚƒŒÝØl r ä°¹ôž<ÅÁ’¹ oÄ0 Œ2 •ü7ÕŒ‚b¼A›-‡ô5ňîxçB[9‘øOx€/±¿g”ë!AÍMiQáE³…¼Ú„÷ÖÞŒWb‡+ ÏìhäçÁ{¡ÓÀÇÏ~¬•éÂ,X÷«' Ž…Ý´‚ïìÖ…n Ve€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/d050000l.afm0000644000076500001440000002224507056046552016372 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright URW Software, Copyright 1997 by URW Comment Creation Date: 10/19/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName Dingbats FullName Dingbats FamilyName Dingbats Weight Regular ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -72 UnderlineThickness 36 Version 001.005 Notice URW Software, Copyright 1997 by URW EncodingScheme FontSpecific FontBBox -1 -143 981 819 CapHeight 691 XHeight 567 Descender -143 Ascender 691 StartCharMetrics 203 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 974 ; N a1 ; B 35 71 939 617 ; C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; C 35 ; WX 974 ; N a202 ; B 35 69 939 615 ; C 36 ; WX 980 ; N a3 ; B 35 0 945 691 ; C 37 ; WX 719 ; N a4 ; B 34 138 685 566 ; C 38 ; WX 789 ; N a5 ; B 35 -13 755 707 ; C 39 ; WX 790 ; N a119 ; B 35 -14 755 706 ; C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; C 41 ; WX 690 ; N a117 ; B 35 137 655 556 ; C 42 ; WX 960 ; N a11 ; B 35 122 925 568 ; C 43 ; WX 939 ; N a12 ; B 35 133 904 559 ; C 44 ; WX 549 ; N a13 ; B 29 -10 516 706 ; C 45 ; WX 855 ; N a14 ; B 33 59 820 632 ; C 46 ; WX 911 ; N a15 ; B 35 51 876 641 ; C 47 ; WX 933 ; N a16 ; B 35 141 899 550 ; C 48 ; WX 911 ; N a105 ; B 35 49 876 636 ; C 49 ; WX 945 ; N a17 ; B 35 139 909 550 ; C 50 ; WX 974 ; N a18 ; B 35 103 938 588 ; C 51 ; WX 755 ; N a19 ; B 34 -14 721 706 ; C 52 ; WX 846 ; N a20 ; B 36 -14 811 706 ; C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; C 55 ; WX 571 ; N a23 ; B -1 -69 572 660 ; C 56 ; WX 677 ; N a24 ; B 36 -14 642 705 ; C 57 ; WX 763 ; N a25 ; B 35 0 728 694 ; C 58 ; WX 760 ; N a26 ; B 35 0 726 691 ; C 59 ; WX 759 ; N a27 ; B 35 0 725 690 ; C 60 ; WX 754 ; N a28 ; B 35 0 720 685 ; C 61 ; WX 494 ; N a6 ; B 35 0 460 691 ; C 62 ; WX 552 ; N a7 ; B 35 0 517 691 ; C 63 ; WX 537 ; N a8 ; B 35 0 503 691 ; C 64 ; WX 577 ; N a9 ; B 35 96 542 595 ; C 65 ; WX 692 ; N a10 ; B 35 -14 657 702 ; C 66 ; WX 786 ; N a29 ; B 35 -13 751 705 ; C 67 ; WX 788 ; N a30 ; B 35 -14 752 703 ; C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; C 69 ; WX 790 ; N a32 ; B 35 -14 756 707 ; C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; C 71 ; WX 794 ; N a34 ; B 35 -14 759 705 ; C 72 ; WX 816 ; N a35 ; B 35 -13 782 707 ; C 73 ; WX 823 ; N a36 ; B 35 2 787 719 ; C 74 ; WX 789 ; N a37 ; B 35 -13 754 706 ; C 75 ; WX 841 ; N a38 ; B 35 -14 807 706 ; C 76 ; WX 823 ; N a39 ; B 35 -12 789 706 ; C 77 ; WX 833 ; N a40 ; B 35 -14 798 706 ; C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; C 79 ; WX 831 ; N a42 ; B 35 -13 796 707 ; C 80 ; WX 923 ; N a43 ; B 35 -13 888 706 ; C 81 ; WX 744 ; N a44 ; B 35 0 710 691 ; C 82 ; WX 723 ; N a45 ; B 35 0 688 691 ; C 83 ; WX 749 ; N a46 ; B 35 0 714 691 ; C 84 ; WX 790 ; N a47 ; B 34 -15 756 706 ; C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; C 86 ; WX 695 ; N a49 ; B 35 -16 661 706 ; C 87 ; WX 776 ; N a50 ; B 35 -7 741 698 ; C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; C 89 ; WX 792 ; N a52 ; B 35 -1 757 720 ; C 90 ; WX 759 ; N a53 ; B 35 0 725 693 ; C 91 ; WX 707 ; N a54 ; B 35 -11 672 704 ; C 92 ; WX 708 ; N a55 ; B 35 -14 672 704 ; C 93 ; WX 682 ; N a56 ; B 35 -3 647 694 ; C 94 ; WX 701 ; N a57 ; B 35 -13 666 708 ; C 95 ; WX 826 ; N a58 ; B 35 -18 791 716 ; C 96 ; WX 815 ; N a59 ; B 35 -16 780 705 ; C 97 ; WX 789 ; N a60 ; B 35 -14 754 704 ; C 98 ; WX 789 ; N a61 ; B 35 -14 754 704 ; C 99 ; WX 707 ; N a62 ; B 33 0 674 717 ; C 100 ; WX 687 ; N a63 ; B 36 0 651 688 ; C 101 ; WX 696 ; N a64 ; B 35 0 661 693 ; C 102 ; WX 689 ; N a65 ; B 35 0 655 681 ; C 103 ; WX 786 ; N a66 ; B 34 -14 751 703 ; C 104 ; WX 787 ; N a67 ; B 35 -15 752 704 ; C 105 ; WX 713 ; N a68 ; B 35 -13 678 709 ; C 106 ; WX 791 ; N a69 ; B 35 -14 756 707 ; C 107 ; WX 785 ; N a70 ; B 36 -14 751 701 ; C 108 ; WX 791 ; N a71 ; B 35 -14 757 708 ; C 109 ; WX 873 ; N a72 ; B 35 -13 838 705 ; C 110 ; WX 761 ; N a73 ; B 35 0 726 691 ; C 111 ; WX 762 ; N a74 ; B 35 0 727 691 ; C 112 ; WX 762 ; N a203 ; B 35 0 727 691 ; C 113 ; WX 759 ; N a75 ; B 35 0 725 691 ; C 114 ; WX 759 ; N a204 ; B 35 0 725 691 ; C 115 ; WX 892 ; N a76 ; B 35 0 858 706 ; C 116 ; WX 892 ; N a77 ; B 35 -14 858 691 ; C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; C 120 ; WX 138 ; N a82 ; B 35 0 104 691 ; C 121 ; WX 277 ; N a83 ; B 35 0 242 691 ; C 122 ; WX 415 ; N a84 ; B 35 0 380 691 ; C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; C 124 ; WX 392 ; N a98 ; B 34 262 357 705 ; C 125 ; WX 668 ; N a99 ; B 35 263 633 707 ; C 126 ; WX 668 ; N a100 ; B 36 261 634 705 ; C 161 ; WX 732 ; N a101 ; B 35 -143 697 805 ; C 162 ; WX 544 ; N a102 ; B 56 -14 488 705 ; C 163 ; WX 544 ; N a103 ; B 34 -14 508 704 ; C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; C 165 ; WX 667 ; N a106 ; B 35 -13 633 706 ; C 166 ; WX 760 ; N a107 ; B 35 -13 726 705 ; C 167 ; WX 760 ; N a108 ; B 0 121 758 570 ; C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; C 170 ; WX 694 ; N a110 ; B 35 -14 659 704 ; C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; C 172 ; WX 788 ; N a120 ; B 35 -13 754 706 ; C 173 ; WX 788 ; N a121 ; B 35 -13 754 706 ; C 174 ; WX 788 ; N a122 ; B 35 -13 754 706 ; C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; C 176 ; WX 788 ; N a124 ; B 35 -13 754 706 ; C 177 ; WX 788 ; N a125 ; B 35 -13 754 706 ; C 178 ; WX 788 ; N a126 ; B 35 -13 754 706 ; C 179 ; WX 788 ; N a127 ; B 35 -13 754 706 ; C 180 ; WX 788 ; N a128 ; B 35 -13 754 706 ; C 181 ; WX 788 ; N a129 ; B 35 -13 754 706 ; C 182 ; WX 788 ; N a130 ; B 35 -13 754 706 ; C 183 ; WX 788 ; N a131 ; B 35 -13 754 706 ; C 184 ; WX 788 ; N a132 ; B 35 -13 754 706 ; C 185 ; WX 788 ; N a133 ; B 35 -13 754 706 ; C 186 ; WX 788 ; N a134 ; B 35 -13 754 706 ; C 187 ; WX 788 ; N a135 ; B 35 -13 754 706 ; C 188 ; WX 788 ; N a136 ; B 35 -13 754 706 ; C 189 ; WX 788 ; N a137 ; B 35 -13 754 706 ; C 190 ; WX 788 ; N a138 ; B 35 -13 754 706 ; C 191 ; WX 788 ; N a139 ; B 35 -13 754 706 ; C 192 ; WX 788 ; N a140 ; B 35 -13 754 706 ; C 193 ; WX 788 ; N a141 ; B 35 -13 754 706 ; C 194 ; WX 788 ; N a142 ; B 35 -13 754 706 ; C 195 ; WX 788 ; N a143 ; B 35 -13 754 706 ; C 196 ; WX 788 ; N a144 ; B 35 -13 754 706 ; C 197 ; WX 788 ; N a145 ; B 35 -13 754 706 ; C 198 ; WX 788 ; N a146 ; B 35 -13 754 706 ; C 199 ; WX 788 ; N a147 ; B 35 -13 754 706 ; C 200 ; WX 788 ; N a148 ; B 35 -13 754 706 ; C 201 ; WX 788 ; N a149 ; B 35 -13 754 706 ; C 202 ; WX 788 ; N a150 ; B 35 -13 755 706 ; C 203 ; WX 788 ; N a151 ; B 34 -13 754 706 ; C 204 ; WX 788 ; N a152 ; B 34 -13 754 706 ; C 205 ; WX 788 ; N a153 ; B 35 -13 754 706 ; C 206 ; WX 788 ; N a154 ; B 35 -13 754 706 ; C 207 ; WX 788 ; N a155 ; B 35 -13 754 706 ; C 208 ; WX 788 ; N a156 ; B 35 -13 754 706 ; C 209 ; WX 788 ; N a157 ; B 35 -13 754 706 ; C 210 ; WX 788 ; N a158 ; B 35 -13 754 706 ; C 211 ; WX 788 ; N a159 ; B 35 -13 754 706 ; C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; C 213 ; WX 838 ; N a161 ; B 35 151 803 537 ; C 214 ; WX 1016 ; N a163 ; B 34 151 981 537 ; C 215 ; WX 458 ; N a164 ; B 35 -128 422 819 ; C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; C 217 ; WX 924 ; N a165 ; B 35 140 890 551 ; C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; C 219 ; WX 918 ; N a166 ; B 35 167 884 526 ; C 220 ; WX 927 ; N a167 ; B 35 28 892 664 ; C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; C 222 ; WX 928 ; N a169 ; B 35 129 893 561 ; C 223 ; WX 834 ; N a170 ; B 35 154 799 537 ; C 224 ; WX 873 ; N a171 ; B 35 97 838 594 ; C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; C 226 ; WX 924 ; N a173 ; B 35 82 889 610 ; C 227 ; WX 924 ; N a162 ; B 35 82 889 610 ; C 228 ; WX 917 ; N a174 ; B 35 4 882 688 ; C 229 ; WX 930 ; N a175 ; B 35 83 896 608 ; C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; C 231 ; WX 463 ; N a177 ; B 35 -100 429 790 ; C 232 ; WX 883 ; N a178 ; B 35 70 848 621 ; C 233 ; WX 836 ; N a179 ; B 35 43 802 648 ; C 234 ; WX 836 ; N a193 ; B 35 43 802 648 ; C 235 ; WX 867 ; N a180 ; B 35 101 832 589 ; C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; C 237 ; WX 696 ; N a181 ; B 35 44 661 651 ; C 238 ; WX 696 ; N a200 ; B 35 44 661 646 ; C 239 ; WX 874 ; N a182 ; B 35 75 840 613 ; C 241 ; WX 874 ; N a201 ; B 35 75 840 613 ; C 242 ; WX 760 ; N a183 ; B 35 1 725 690 ; C 243 ; WX 946 ; N a184 ; B 35 159 911 532 ; C 244 ; WX 771 ; N a197 ; B 34 36 736 655 ; C 245 ; WX 865 ; N a185 ; B 35 209 830 483 ; C 246 ; WX 771 ; N a194 ; B 34 36 736 655 ; C 247 ; WX 888 ; N a198 ; B 34 -18 853 711 ; C 248 ; WX 967 ; N a186 ; B 35 123 932 568 ; C 249 ; WX 888 ; N a195 ; B 34 -20 853 710 ; C 250 ; WX 831 ; N a187 ; B 35 113 796 578 ; C 251 ; WX 873 ; N a188 ; B 36 116 838 576 ; C 252 ; WX 927 ; N a189 ; B 35 149 891 542 ; C 253 ; WX 970 ; N a190 ; B 35 75 931 615 ; C 254 ; WX 918 ; N a191 ; B 34 99 884 592 ; C -1 ; WX 334 ; N a95 ; B 35 0 299 691 ; C -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ; C -1 ; WX 234 ; N a87 ; B 35 -14 199 705 ; C -1 ; WX 410 ; N a86 ; B 35 0 375 691 ; C -1 ; WX 410 ; N a206 ; B 35 0 375 691 ; C -1 ; WX 509 ; N a85 ; B 35 0 475 691 ; C -1 ; WX 334 ; N a96 ; B 35 0 299 691 ; C -1 ; WX 276 ; N a91 ; B 35 0 242 691 ; C -1 ; WX 317 ; N a94 ; B 35 0 283 691 ; C -1 ; WX 317 ; N a93 ; B 35 0 283 691 ; C -1 ; WX 390 ; N a90 ; B 35 -14 355 705 ; C -1 ; WX 390 ; N a89 ; B 35 -14 356 705 ; C -1 ; WX 276 ; N a92 ; B 35 0 242 691 ; C -1 ; WX 509 ; N a205 ; B 35 0 475 691 ; C -1 ; WX 278 ; N .notdef ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics grace-5.1.23/fonts/type1/n022003l.pfb0000644000076500001440000013127607056046553016420 0ustar fnevgenyusers€[%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Mono L Regular) readonly def /FamilyName (Nimbus Mono L) readonly def /Weight (Regular) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusMonL-Regu def /PaintType 0 def /WMode 0 def /FontBBox {-12 -237 650 811} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020945 def currentdict end currentfile eexec €;ªé ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>j"aÆôæË…\uãÑÐ6³‡Ó•#D©PôØÇx0z Mñì®äÒÂýt{Æ÷ùƽÁ’”ùlŒ\þˆû4ÄwWJ0¸ÌY)å› yM£.aÞͨ«½éVÏt* Bîèa°ªh—ÈdxŠåïCÄ“$oÛÊULYKdz6W©ìÉãÑG.ø&?c+å@Ã_öû@Vgsó»"Ó¥y ŒËÈDÁKÃPð¹Ú#¥pÃbÖ8“Ê2øoY¸)ÇŽã‹n?¨b(%Æ9cûx·¯P[E¥M¿¥Ë¢wÇ”ìé2u£Þ E/ÜÜ)“º¤/(¦6ŒÜ°>¿q½ÊóPw‰“D?ˆA*Ò­ qU£”FF2f2-¼D°}¡éÂz'µ–dèVmzTÌ镪а¡~,>ör ç÷x…™ÄäLpœÕíp±{šþ.ŒÙ"§B¬'ÿ¯Qsú°­µ0çý"Ú"ÄÍ0d{ÔöœK,‡“}Ô&äéÒö`‚ˆºÉeTÐIGæ’aãyÏ^¿Ó/Ó~úÁöëîUQQdq§G,`߉کëŦ~G—E>i¹â+¯N<ÊA’Ö)[ŒJ¶ÞRßßékU) KŒ[zl¬¨#Q¹zßÃi•«¤8¦å¬£É4•öÓ¸±DDœÑ5‚ùner6<ûÞWkýùŸ£)ÝFè?yàlö‚PÊW¦‰1¼4*Ò•ÐË¡z©[¸îµ>¦èæ`¸éøWÎËôJC(‹i©çU¿èD5˜yÒŒ®ñÊ6B…Ò û2Âà (èï=gÅÕ‘–WÊ•‹SS}P4D†S1×›ü@1 h×#dP;ÐÌ„µó tص¶¢jòÛvEdûe¦ºQ®+N¤XÔjEió nwÜ sVwbæÏ?aGxë´O÷Ñã¶O÷^wáå%»eFÏÑ3ÊÕq¸*X%æ"mýÏ'ðm‡E*‹l]Êe…5Îâ§•å7ÔŽVkiÕ: ;vn„Ū"F™œÈZÛ/[c«ÀÃ;Zêû¶é”Ø Aµ0y¯–Ù ’O›1›í˜6¸ù?†ƒcÓÊUL»c0Œ¹@‡.Õú{ь㒵­ŠÅ}u-”v±ÆM™¾ ¸mzm–Q w.²LXw›Òþ[Þ)Áï"²¸¼×ùSÈEg"Gx)ÄØH<ö-èÛ§ý†Í#nefÊöüF‚¼H˜êvrøÉ—þCààÈ·}JôŒ¿éŒ±\ÑI¿õа' ð±£¥]Èóû’îÈËgxÝ·ÎJ«ÄdįöT"0¥PëRHZ#Ò´ªq˜ÓÍTAñé¤ûÞ7¸Aåo\,S–m¹¶kEˆ(.?¸ ,Q“9ð-/ƒÉyíÅ‚z;<Žø ¬¶¹™ŽšöUV1=ÄË—š¢Ó+¨¼$Aä¹sMŸ·˜*Vq-‚yʹ:¾ttbïÉ]C‰ ±í4Ϩ¢ Ü=‡Nvy£–ŽR.Ы–šN>ÇäGN%PMTÞ·²`·“\NVTŠ}Á÷AøÍòYêXZw¡ÒÓ ¢oeëvZÀžÕiôQ­ó™æª/À—ˆ{êIñ{ޏ8òrܵ_ÖV—ÿ …}=âf¿÷ì© ‡kßçgÓ©°’üxÇuùEÏ–èYÀ=¿c š” 9eL5IØ÷’¹Nâ=Z5Þó ù7ø`´ò ©šÝü4=|÷¿ ¸Á,&@? Ïüާ†ÐبÙÃgAœ¨®A é:€†X:lp¶ÈM‡Òîªqì-Á/LÞj‚Õö©»Û~íÍ(ž€ú;uôHPqÏJ i95“¹¯œÎêìV£[‡‡=|ˆ>ž" ;žøŸa¾ÄsQÌ€ÌZѶr{2&ÍDÄ—ÚpRÝh•Ûì3—ùYŒ‘wps¿”Γò=Pì[î/¹ÚÉfß‹'²ŽãÈ•&Ýf%∟ v||`žãbkÁM'O¾¥e(Ü¢{-GmFéç‘e±V¥ß¦ËãbE×p!v{n[ßÌg–p&?Ø‘Dl3q±¶áß`ù`ª´wSæ¥Ã8Ä,‹ÿN“P8…ø'‹×Ëg/.Zæ„Ü ¹MÝbýþñBwïèæYºÊ?âò‹-JÂuÑŸ Æ—¾‚|J#-‡e &ˆ4[ÊxøyqðF<_¶iVoqäâ„Òx@U€ðKÿÉ'„!n šª›)5æn§ƒ÷#¾C‰·éÖ*£hÿ.¤ÃÁ©ÒóCo>çÛ‹èjúªjK„aPØÒvP–µáj¨CM]ãj+ž÷L_j Y KUiq#'ô±³•‡Í37c™gËÜeZ¤n€ÒÏÒKëP[S8å"³§¯è6*´ð]‹Å+ºœP‰­¨È•)°'Zô"ëT 1©8¸t`uc%¹f³hRú¯’ÞcöºáàKûÅX€˜¶¸D­Ç“½(üÕïlÃóšÅ/q“› ïb Æž1ãm¹i1°É.òÛe=—ópV¥)…k&†Rú&HÇ’x ­c|Muû-bWâ“q”‡Ï-<ú¥2áÂÓ‘xÕr¦¯@¼¡tµÌ+×9 }6•l´½w‘ùûmˆç§ ï,—†Ÿ]¼[Ø#ÅÇ·ÃbMö'Ü–SêSG¿Ú€·#ð_m»Lž¥Øb¬à[½òpVûÍŒmK…‡=Îæl‹ZÜÊÙcŸ6¤/áÖ.ÛÊ—/ ôWX¾Ë1Û81o<ßá´HÉ>Õ‹géµz»íY$¦Õ>™ûÉ©”¦Hš‹ßëhUH´ÜmbÚt&Â"'ÔÔ;oü{^©‰g0%>‰A¯îXƒY¾ÏoüA[ž¶ÓËl……>dIúmbz—£ÎƒñH9:ÜÌߢþ\i¾\<¯¦ð(@ l2S¥Y¬\›Ýý­›„¸M¡ ãÄpËšš-{s/Yõþmí¦ çPõQªÉ4bDpá¼2LCcâ_ÐÜ1ˆ¾ oìTÂL±‰Rá,¶B=÷F'¬ÞU×z—¨¿ÙËPÑú âÎ+%¤tŸ»°’ÃG7Z›c5:ùçþà[µL˜Ci÷˜ˆ©1w80ÂÉgµˆÓ¬Ò(ƒÕÎ9bÕ„üe>®,_²ÚAÚÎû\v-.Û[–w(œÑ™E±:¬g)[¼š ¤&°j6óÅÝ<± (UòÆ5íáWîüîÅP4G8-ÇHÁã_hu9’åÉ åMøá³UÑjß±óY5úÑ£oŽDôŠ»›€ÊšTaMFqË1 ¼zÇa -¸Å¿Óž Ƽ,l¼:ŒÿŠtË!`ŽÄ¤Ïä˪-mº aMìõŸ•~ø©ÊÞL›ØÓ Ôýæ©TŽPÛQ¬§30!Sü6¶œ[&ÐÆ‰·¬,†O×À—É›å•8CárÉzµhO5û§%¨¿7Ýô 1ügm°áT:ìn—ÓÒäª=X1سÉR«¿¡5(ûo«a Ö€ædjì„& ö†÷B,²÷Œaëª6Ô~Ám¯‹Jó ߢUÙׯFϲ*}nXçÕgà ½ŽFß´wð‘¢ùb"ÿG¸vTKÁð;k»˜8_œ »¢§§†ti+ެ.<€i·žg“8ÚW÷)v„[ëkšÝ2¹]xåæÝhœý‚Ój1¾ŽÔ”§MÒÕŠ,ߘ?ËœÜ)¿)˜¢5`íõ¼?;*"ÀŸ±y´~­ïHßó)‡]{@wd¤)/äNtQ¨ã¾µðÙr¶2pödA|„øOûð¯ÿ‹…È"Ù0«A@Ä*Qª‹¾C˜N¨V`@ë‹4Î#ý?iÝ#Z ¥Æšì¹¼s+Â×Ôݦ·Ÿ¶î@ÃUl}ù²=­‰é@T±4]¸@*æyüFU¤§vÀcøÛ+üêN"Úæk^]z~J k; ó¢fžgÅäðQ–j{Ä/Kj‡ç@Ø ^c÷|z&µ/"™Þ[Š/b ¼óÓ°#_™x\È1ÜBNFì )QåhH Y.¤}lxŠ H{ê.ÈòæÁ×óx¶-´<¤äŽ%ÿIÕ‡ÓæR)ãèÔ`ž#. ÜyLy¬ï‰èA²íÊPÕQö^Œðñ‡Xð¿WCqŒ>†èþ l¡n $¿ÂTwÕ6qÊ£«dAU}Í®4aGµé™ÄT´¯ËÁ‡¯ÖSÕµø8mö­æž!½gßIOsljO¤ÞHÜŸ4w‡Ê–âà )l- \*Ù¼B>œ¤(×ñúÜ“S£ûŒRšøhŒ»T;E²q~¿lIy5ôó¿ý(^«uD³ÊFC®Z‹RPí˜z•ü'[—¬ÐdÐî*éu„”øØ¥Î@Š8¬ êð…-rØM kés2g“®¹UêÆþ (£UÜÒ/o,åeˆÑÀUÍß©ˆx¼ëj²)"Ò¶¢„.f]ôÊ GÄ#|+Ö uâý?¸ÈúHW0¸ta­FjËߌ¢@‘O°³Ò´¶¸ÿᥟÖh¯pº[·'x•;¥_Åùö&4PáЛÈ=† оø„cš7€š2V\¾û?óžå=lÅŒ'+¹(äA6Y¥$-itz&Å-ë¿b6Jµ©núöBÙØ+¦y±×¬¤ëbú\ü0ކ6Šª×çYHô5˜ÍTJ @‘7M~ˆÔR,¾#‘d'èˆçt¨‰ÜæzÞaiž}wv6Êƒ{/~ùÁŒ¼Å8ÄeÈâÝ4aiS̶ ",r‹ƒIÁ¡yâÇp(”«(³ç$Ùt}a4´%!jdÆà¶c>+…0GäÉ9Î ®1è0È«¥«3†£¶’g5{ýÖcV®^Wû)”E)“é çÄâ`««“Ãx1…je VäArþÊÖÇÀòP¸$s– **_¶´ÚfFæ$¬÷úÔIH]d :ßÉøe.z8ÎW™÷pÃ`m´¸¹Gù9g÷yã£ÀW/¥¡‡Ó{Ñ*\{â<¶ía’bA·l[¦˜=¹É>K p}7`ð<Ö'.ó¤Î‰¸å.jŇ=ë—WY«Kâ9åìxB˳3æ’Ì`|r.]<9MÓ Æ”V)ÇöjR7À©R ­n¹`i5°ñ5Ù À˜+}"”®J8¥'î@¾œÞ%ªëµá48‹±qЕj|EfÖZšæÄøƒk>ÃÒíHµf§ƒ)+¶y ÒGÔ”ðp» ¾ÿ`d ²vÝîä—è²²´ ªüYLI,%ܧtภ‚é'DâçJ Ǭ’` n¯{lÖ®ªmÄ [D'Q¥²&ˆ@N§Å†07úÁZýG' ä«^§W`ku놠^wMnC ?â£~»pt#Ÿ±Ï ^äK‘¸"DÅuµ.¯“Kî°Ù3þµ~¾2mu‚‹#ê¨[X:íC ·ðKŸ-Å‘ ýå.Kª©ÂÉÙqK•¤UŒ!óξbKT³ñxXö†0ƒív/.4¤\ý×`Ö&ÿ†HõÖÅå€ÔvZgûaYì€w©ð¨€8ÈÓ×Çð’n!#¾‡O{Êñ)ÕZ[Y`ø$½(«ÏÌQÒ96Þš%Ä׆äL:+¯¤B1w­ !ÓŽâ>¶ÿÀ´F•Ô#îü'D¡ü´ß‰×o hرNuSŒªÐ:rQ{†QOiRöýaž‘ ˜–M³%1Œ[ßydE=J\ôæÕ5—‚‚r)1ûÏaíÞù©£9ÕÕ¦ë.x8 ¤2!½bËßs-°¦8¥ û5ºwa®ÈF #Ó¿-±ƒT>ë|¬YpÍÆðhÅêŒz®R–æÜ“‘ÚD`ÈêÕÀÜC[·4!‹¦' Ý ÁwØ«ƒj0+JD°~Üe•lžlô‡]õ!óÎ[B/qmi½'s•Éèw“J‹Æ9 B NLÝœ÷ã%DƈN¬£¼ÀÈÁ2Øûu,×\RˆWâêFoÊÙ V„5÷Dañqd¼Yz(®K§Ènáp55©¹íP&'qüñèàá¯{´f½+¶Ω{*ª5#]çl<’hŽÈwÕŒ4wŽÁÌñÍš|ýª¹šÎ;üx)ñ¨w‰©-É!æt "¸MƺͫÌvæLy㥈ØM7nBou÷9/ úý‹"ßÞµH®µó s="J9Àæç¶… Ð1ª¿ ·Æ!‡À(H’Õê­ñ!º(&>¸cÕãn©ÀjwÌüõ“–‘øM‚¯‚>þAL`oïƒÌǰéaç™Mø£Ì6² ÙSâP­«"×ò´âÉÊ9ï¢Ù>V\`ã QÌ[úïÏ% ÷ŸkbJK‘~Ã2"/ÌþÄö¤{Ùç]©…OÃ÷®UN‘íÞMzï8 ãíµå¥bctÛ”ð"ÈÏT“à ri·ÎTNt„9º(pqŒå´§}“ëÀKyWÒr®ÔøZ+­ª ÷; 8AÔƒœ…g²á_lå’fŸô»Éƺ3MÃwòö¾ƒÕ†>ŒÖ£ d ¬L#6„ækOæ¶-J‹éÕ1ä{ïV@ÙµÂ}™’¾—ö™\Šw¾œªæÁÏuݬAÓD8üzØàBËVËò”I2ë§ÐSé7oó˜6tPãZEþ#à\’–¡TTrýBš>Ü>Óo çœf™nø3zÿ…¹ ]:J”EZéú2âzcåðRÕö"1%¿¯¤ é‰`­÷»ˆg)ܨ/øÌR³òQr™á×iTû•X/Ë ìÈs©Ç–­½>‘2Oª”òÄõ|0µ‰}ÒVÉ à€ç ý2æžöp1Œ-ÜѨä¶^H\#ÃäP«Ý˜Q-o4¨K·Û,z“¿´$1n¤C—tœ°ˆBš;C$s~Ù•Óˆ$„b¬&×+õÀsì¥gç8\ÉYã|¬~G`ÿ¥©ö;Ž›)7éXn¡e7I8ô’íòŒæ S¥µÌìw7ùÙÌ…8Ä3•gªí7”«£¹ôêæTfèã&öÙ³cU“_½Ë™rñ IMÂP—üìZc˜òuÈÁQUŽtÅ_{¯AUãks?uÏ\Yy°vOØ0nº$¿yAäÆŸ?ÌÙœXÂÆqªçÔùåÖANFíc:_xª[ðNe"F fêÙ傱Ìn¢ÓϪ8;]L¬“6áÀŒÆ¬UËû®|b;@S»ôGémà6üV$8CYî×ÇÕ÷…ÀRwÏdzÃñˆÞ^ï MºUýãLW {çjµß (¿EݪÛê~îÛ“c2ßé0à¯ÓýÔkíÖ‘K.üýÄb£;°=vÓOHÓÆ»»`æ¬rCýð&v*D´Öäì¾ôŒ{ijòžî>U}Ï àoEÑ~`£nYò®Ï„“øÖ%6›_~Tßãöè×É¢ÆõWÑ‹Jù,Ÿn uõÅO›_N9Ö¶ú,ÖÞ :@(˲¢¯mÂ)»‚ÏÐíåâxè–àcÆUz>a§ñŸ¥é~¡‡/Eò"‚ÝÃáy&shËRÚ”DöZÓ•F¦¯R¿Ï¢›è,GÉž€P䈞Eu·_9æbòÛt g7—âí=gͧ®,Р§”Õ}޾!N‰à š²Àëw„éIï£À- ó®Se üJà#ʵ(,z6dúݬ¨Ú_¡‹}d‰ä"žž$ÓŠbd§D¥Æo3K‡·8®Ñ†iŠ‹'ƒAúMe ¨†€ºHF”’÷Þ“3ÁÀ+¾nd¯-­`2yØs)M9ÁÝm‰Ée$Höñ\¥[ˆâBV^Yó»ññǸˆré®aÔL®Tcíú÷ßcÞM"Ó¯¶‰)e )E„oÏYs¡ÔX`PÁ^å¾ÇàÁV%šªlsU“åVOeôC·ŒÇQ.ÃZVñ&ß0—J@‡.Beá®_ÔƒÏË»¢mîBlÜG!ñœ?Ú†ízÔú ö6i¾þp±(Î¯ØÆ>ŠÀ™C¶Ëß³ÒGjl¨ÿ±öQ¹1 ‚«¥óˆÌµ¯Ïõ™mRR¦¤/¤Ùräå`ˆ÷Œ¹fùqÄrÇt‡šìÿð‹ýœê@ט’*ÎdòŒà¸MÊÞ×ã˜=‡Ù.ñ<îq²Óÿˆ®Æqì1‰ߘ£ÉN7-"£ÎÈ/Ì!G1š@öã+Skžz ƒ~Æ\͵û ACqYl³“‚&-ææSyÓ©p›,û«õü][5$%ðoˆÍ1**AG±ðÁÀ¬Ì€ŒÖ%à"Žïffp¯–ÓÜþÍ@'äöR*ɨVÚFmUÈOe¾(¡VQc‡-bë3:iŽ×¶ƒRÊÌ¢×­8«UÁžOU‚÷X0/_ÚßÎД‡/-HûclŽ8ÇVìë ñ”]Uô› ÊÈIgYüÇ).F“‰CÂb×2ÓùÐ÷±B=q±íT²¦ôÂi™ò8ìh(ÿÎÆ` ÛœžYSN«±ƒózÔÅ{ß ÒÎZB‚¼ÌÎj—+Xk²!V|ÊH9‰Ý ìBLðBÜ·ƒD#Ï$NÚ(ÒÙi±t@Êêð$¦°Î6h!¯¤$Ѹ)– ÀAH'Zæå%zz˜ɀ³X>z‹Äeã¼ë¥eÂê”ðWÙd§ŠêŸR«ýpøNDä4½¤.˜Ç”W$4~5ÓË%qaàp„ã mÎÖ]§º‡Û²ê3Ó›Ùšû“ÓTƒXЃ0èøU,ìö<„ø T‘º:b.pÂ2úß;òÜýo93Po 7¢^¹ac×>žîÔ.܄ֈ¼wÙÜ£Hú´ßb倛Д„- 1Û·Ä´”ÙF ^Á iª¼,‘¥•²åÓGUÝûzä«÷Wôż÷|•æ¦ddVþ@p€¼«¿¥w(zÒb"ß‘«&•-g”rø­ðn¢¢ì—"™§‹¬RC4G _XÂøF´Æ-s”Q'òã‘ÊLסnþKK㊪§h,86¨Êƒý8Ip‹Fû ë°Ý"A™g/ú%¼úNdž3T(üqõEä˜AžÛ—F‰JHöU€ˆœBPüïeɲ†™@޲oæÛ½·gVNsËYTÆÖ9Î3" ‰O6çqÉùª?â®  ãòãìZ¼fuÍâçä" âoºËÐQië„GPu>líSãgÜЊ¹>~œdó‹@·m™¶Í’½ôZ¥Ì‚I˜µš­àž_ë²(fêq²–ag4þòyoÿ ‹pt¡h¹œ+püVçJQ°bô™ŠÌ…±”<”wä6åÍz±¼‰!»“GZb;ݧ{‰[¢ÔÁK¿3Q&ôýW×:úPk<6I"åQÔ5Úuú‰bú#@9&.’Ç€|to»5ÎùÛòçnf§/ïð•ÚH*Mè¤ ‘peslôÞOµ.dš2%^ 0§³hcSI/1Àd£Ä°DŒKýD¸áS„ý€›‡aî&§ß¡uWÎO Ãvë+83SK¨46ºU9U¬µ§¦g–¬[’ÛSˆ¼Sï¢u°Ž‚‚\öi¼å+¸`xt›O8¬ß_ñ'&¿>Ât?LÞ–þkL@ 4éêü¢£\Ìwl&iæ­€p¤Híymõ~™> ¸T?ºÝ5õµ÷¤oˆãâØ#82Ñ‹l2>àëÁß\ƒƒ!ÍȨL«Ê² `¡£ª6ên‡ÈP¯Š÷ÍPªcY‹úˆ‚Îèõ«Œ÷®——M—óÛŒÍÞE²»Îâ’ú¥4¥ó³Wô =£W2[‹Ÿ^ÛE†T—<>^[ªH?¿-ÍÔ$fuìX¸Ljæ\§Cð"’Cw%a1§òº&©Zý–Á‚ÏßA·"ÐË?Ì&Ãc€{8*®®Bˆ‡Ü‹åýÖ0¬Wî=ÁVǸ²žh$D.5κ@‡)Zdq9È1÷ÌÚlεÚþS|Á©|Z3}>•ø^jÀùT8¬LnÏ3nÓÊ~²Òy‡q#ýŸÍµå+X|ÿÄB„VÝÊh¨¤¢Øñbž]BºL\5nX Š"ƘuRú©x“m§=B6†äëÔCuÂWð11ˆe¢"^r¿¹ù:ªœ 3 l5½E&£‹çœô Ñï¡èó0 Š‹—«æsNîlŽäCÖ˜ÓAY—dœoò Í€#d"âáF×D¢bÚ?ÈÀØoöeô?•}<\ÿëBH#PŸ3ñUzLo7µ/Fgv{©Ok‹b…kU?0~]# DËýÉ©zE±9ÿ²òV^°â &—/­·¹Wo¶óh¶y”:9‡s`~áßï¿&Ô]@½¦n»–¥néÊà²B ]Ø>$Û©ÿˆ[¸D¿=+ù;2]ÿ`ÀË_ÜÊ ÈûZ.ZònS«Ž;B„‡Ú&ï bØW+‘/šO/ÀB~ÐpY/q;ý²Ä9;§VX"y&5þÔó63º§*¢ÜkYŽI¹`!݆­5.W"ûqOf|ÆIÀ=‚-‚g~ßèoéfŽS}¢„Œ› íƒL’¥¹9)mP[ƒ~jÚ±®«tU ŠL""³9(Ft·KôÊžàÀ ¿*‹CœqƾQ©L¶O¾J~²•ZEPGÏ\³H°bíOdqËÃé­Ù¾›–‡šÇ¼q¼à/Ð/Æ9…¥è˜= Z¡H¡<@‰«¡ÅO/P¡rõ0H xœ„À§Nù_`z{¯ö ˆzƦIš 8ùp_2Š­Kû¶4÷98aw°"Õw‚DN^ás5´Ðì†|i~y¥ôö_ÜäM®Ú²gêâDÔ0IäVÐ…ó’ÝzßuÌý·#âJœ —mk„Ýï’°á_²FÃìÂп1Lû•wW³£èå€RDä`) ÷P|ó¹»6üpê¤DáNVÀÏðl…=óm©Ø¶¯%D¸SßÿSZ~\oÁE% Ý¢)•`e %:§µNS‹Ü÷Mw™IÂÉ|~Æ9,.aÌÀ™+fÚñ«Ucå1€Ò¦}ä–ql˪EF-Ÿ‘¶j"TYbÝ«ÿbq1¹^]ݖC粯eÀýÎõñèÝF¡AÈÄð§86ô÷ÅÃìm5ŒX¤&m¥‚¢ÇÉ”çˆ.fU³REv…Š&_ûÄ%iÎí¬Ð`´NX§ªèã9›’š¨/Q\F" €Õ‘z² ¶³Oܨä¯díf 1sxo±¡ÐÕuÂ¥}?|ýÉLÌD£Œ\Õ#éÚrmŽúm§¶ÿ45þè8²ÇÖ¹y4)_ -0÷f™Ëœ[»ÑÔÞ¥ý¥¿°”ç`pƒ¶FÓ]¡üzÒ?DØÁ¯ê¶fUª¡—¾¢ç}ó¿5ÇK4G¤R#YE+QuW lv€¬è• bá~:Ê5£—Ñá–0Д¨hY<—ôÄ„äàkÏ÷¶Ü©rã ž¬¤0õÁ¸®õá¹3óݼKâ+tþ4m?_ìøæeVŠ*ÀGè(ùŒDšÎRÑ aÝ‹ýL šuØêdÕ§Ìh½[“ÙySÚÚ—cƒõYaŠìV×ÍU¸—69\`›1Z?UC/ÛÓ8ÌCÃTûK|Dñ§1‹ ~™ÃÀŒ3¹Sr{jc(ƒ £><Ùä˜4j<¦§{Qp–íÕ*äC¸vC¦Fç»—÷Bˆ3ù³~a”/AÁÛÜØêÈùâYw0fsl¦SÎWè‚&Q&„|!»f&¡¬PÐGÀºG´ß*™UE½hì‡Ì›1ÕÝʇUëë¬Ë9«ÕxŽ˜B D;„YçÀxÚB‰ñ5 ˆÖßÞÄs°¬°Ô¯Œ®Ð+Kpß<øþÁðü-=Þ>ILÑ`ævã¼FKÔ@ µä;1N{ùq¬×Í2|²H“¸ AhÝÅõÞÉfLjLõýþtr1wò íÀ9Øylª´¿PbÓOa\\þšÇ£U™É@$´¹¯Ô¨ ʤƒy)õÉ1v€¡=zµšUˆßyÒáõõ!Ööù‹»¢ÂRýeè ¯ÕœS£6{£Â¶ë«ñê™ô{P?b~Üóýd_Å,]]/ÛL%ÀÑáÀFáÄÙsæÌÛÓùE Àõ4=yð^”’èj¸‰­ô½>uCChYJ[ ½Š/5 „kup€9­ªHÔ¹Z+LKûï\à9(U—5½ÔBÿƒáú ¥ÚWؽ²ÿT'À4Ï(¯ns žn $€§={ç+‡ƒNE‰GU!Ê3pv1õÆa™óTc-_¡ÇÄs†‹bå4Ñ_T„2>cÐWA–¡žñu!N³Z‡>üû’ÖÏhvEã~ªaá¡—š‚•Ê>D³j€d†f\í¼ó‡:Ϋ—›Ó]0—Çeš»èDôì«31ŽÎ€wz_¥©Ý‘³ÐhÄ´é´ïÏ뉆m ØÊ9 ý˜eMxwk6´ºtmkçü=G>ñïí;ÁÕUùShiý[ 5ùÈ?e°æ¿zb{’ׇ×,` ÛkÌæØ„’á< ª«nŠI’ŒbΤÿâÐ ŽÚ3JÏGò דM,UFÀ?J6Ci§j%&/‘¯Tã}2ã:²]Õ3¤õûñºôά-7ŒÜÑ;ý¤2Ù/b=¤û€i›U8¢T°³ê¾ÉèïÏBþóꟑviÍ k‡Á‡Õ7 `­mÍ-âÞÍÀ´qšy|^&º¦vem ÙgúFùXŠí¡tÊ1!6þê!ŽÂ5—yÙyâf1fHœ™20°Ðys¡Äãô¤É<øB‚HÝS‰AMgœidABgÇþ¡~5°ÎäVfz›uÈ#½Þ¢`ü"¨ Qö„«ÉÍ‘†v0]À?ûÌdýÚÈØªœâêÖÉ{Æ<Ša}íü@wVICŽŸa¯Ñy^; V ¾^ ƒñ6ÏH« iTäî Ý•=ýÊëV‘QÖ¼ þòpúãá˜çíØ’, Ë‹ÌñÀ,‹3zúz©×SKKó¿‚7›Ñšq$Nʧ=HLÒúÕM²ðîûÕKSn¼µ NkÂõ²ªä´³XvíBÃOŽd;S7.?cPÛŠ8DX"êš3â°ÌBÎÜÑþ/ßr?Ä|™nãVÄ/$Я‰›-¾¡ÏÔ'™‹Ò+* mg7DH¬ûÓ‡T}p û8JðV,…iL„#m=?Í û8·|ˆaæhºz³z¦X£–}âo“›yËñ ÌB…%aØÖuOf !j«?º£!Ån%„¾\›® Ìð¾mœ/ξºÙEÃÀAÒ8sQñ2b‡†öÙÔʸ4(1ù¼` –dæªE|æÊÒjLq {˜Â8LÝ‹š2"Ôô»Úp‰\>Ü&f'y®ç@Ù×âA…û‚p°£©@A¦žHìˆîå!˜6ò„O¸õïd_gÔ,åŽ-ÞC­Zï Û:,xfÉ„X©&fåùàp‹Ì9öZ‰1¡d¯NŒª¥]/Œ×ú°@¯)ž£Q\É0ftNµ¯|ðíg[ðI¦ã¨žÞ[ðDZ|ÊnèëGEIPH]ˆFeX‡þ‹$2>*¡mâ/ÁüŒO¨*ÞWX—`$—áôPnM=ŠÔa¤Xc8³t¥’Ü`3D÷cˆ­jE}ÃõNaiÏzã•–véf¤V bUì:ø&30 DãJfÝúkVžZÉ[_Óìëåº$`€:¨9vðScBÜ=˜Ä›*ÇÓpä:•Q–x'vp‘FœTð×ãTHÏ1+Çöz^zVÏ/Gó¯óÝPÿÂüÚ·r…²œÊCŸb¬oºRÑI>×Ä'Rdp¬È8›®‚wYIXQ{(c¸2’ëZ³õÿ°ƒ“Êa±þ]ˆ ¡jÕ⢦Ý=j h™/ƒ .•þ5{örqnˆÿ¹/ü=b”]­"¼hÅàá C¹LDhZ\EvöïDËûEò¤¿ e}µÔ™v~x™³ý`?4O†(Ÿ“x#[’8^6P´þ±Ü‘Ž«„tËöŸÜ–¤ÐxÒÃQÈdQ$zÏå¶77Ž"âHÆM™Ãý#é• Žà’/½Ó׿÷f¿éçÎ á/1ò§µ©ÆÐ T@ 0NÒÅ_\¬=K85[½…Ömaco¦ã .‚‚“v¾Éy¦þîE#YvŽÏÌSšTo®lvñO†ÿiw—2+³§Yþ& î]¬óƒj¯”Ïú{øzM›Å•î,/†þî­•†ò/ÚôÎÀ˜”*Wåx ú™#ž™Oÿ5<xfk‰(ÏÆHüð†ŸÆ„h½½§Ò€ß«‹ :L£[KhmèÓrƳ#š™öT¡lÖ1jn¤QRGW¾\öè ã…Ÿ¸¸WŒð)hðà¿Ó?á”`È^¥äÀï(â”È®kàú P"¿Ÿ°ÿ÷"§„ßÈüã0ì•sz…DqÓ4ýÅ«B†z{bƒj‹VFnšlGÔnºÿ¹ÍC!—Yûoö_ÝÓKù­2.hE\_òÒ<^®h%›É‚¶£„ÓT@÷Æ“ÏP¹ì¬ UxÊî‡X‹V.¶·ô 4ÉòåEì†cU#Të7(ÇÒe'íuN¯c^‹Ü]#è‰ Õde/#D•nœôÁne*™ô¦DÑx}m6St‰ÚMtæ/ÄßßXùÂl^¶2RjýŠÅ}V­äÔ£‚ü(»`ùçÖ&¦ÆzûÌÑ<^<òï! õϧ»ú8‡½ÔÍ–îê¨ù!š¢ñ ¼ – ;WÀì®ÌÿR!$ÏÈÒÔ›û°Á“êÿÅ´³ÿ0²·o LwÉ"1E»h¥×›ÂXsêáÆ4Wg8\еpÓÿÆÇÿ æ,í9T꜄aX`1Ói蹞S@ŠyÖL4ëZVÞŠgÞ‘ƒy`éŠfüß ëÞ!Û24»xf[ Fš!½T÷š*eœ02ÁEïvoÿ¾Ë¨µŠ^³ùTFÞôšøc¨=²çæìޯÃMMùãGU–èo»N)tÀÛJÖs}a’´SZ‘ÅjرÀ1Òùµ»wQ{s}p«7#ÛR®*ÌÕÝ/at#í<ܨ‚ïAu{÷©¸°ó€ˆcãg?µMé9³\ÞʼMýõ¥ô}5ãE‘l96l‹OCœáÆñƒ\2 Ñæsu°;]ጓ%o%a¤ÈÎÀÀhãDG¼Å¹Wè'¦³ÚÕ…L¼ -iå¨ôkÇj{"3NÇ©Š¾þ›ƒàÏ·V¡7o.Ü·xÍ=l¥†U7îÃØ`^ý† b”riˆÐ%uÆ÷§[š9w2˜2Ï>Ä< ñUœÕbÄ©P•Í; y ÓüÔhJ|zĚɿÿ6³šŸ±H¼(ÓyC9CË¿ ½«FÓê†ÜÈYÅ-0+”©µ›qÞìvœ&4ÎÏ‹p éÀARÌYÉ2kÚËìCÞí’ÝzH@†Ÿ—ÊÀFXv/uèÒMdE7 ? çJdxÙÚÃ~¥¾¾À¡à¯‰Á»÷õ>."ÈÄèg¨_ðßy¤eÚÇì÷1à2àÑ©ƒâ~\.c×Ú»¢;.ˆ3LcrŤËÅÔ_LrYóL.­à ¯eëÆØÝCm†ª”ÉŸ<À¢øq4ç;ò/‹‚Z‰c´œlhTt¯ä¥BÈdÀ7]~þšÁ—E›å- £™>iò\ ¬FhSKfGì…EKéEè&²mæãÄXK—£Ž+@ Ò4¼§€„þ€à q§¿1ßFŠC^̈æ W† ¼£ÖY0n™ËÒ Â0èø%Zz¼}?:ä×­cÙ˜ íðb·Õ˜Ä%¶Ð?) 3žÊŽRo¹ïGõ稊„lýâ¿Þ½$õ§:fÀyf*쀴2F(O¤âî š«+Y¦ÌF¸Œ öÞÉ¥]Žý0/öYDÌËh1Ó6±{0И…åÊ¥ñüÈÖ`=¡kêQmBʱªM{›My™?+þSêÉþ· -3 ‰x¬Ñ,ÀÃ[ƒ™ò¬)våz&ºÒ âú*â6=?Ò¨©qtuVò•§J‰c PG®°ÐÀ$Wÿ.›ö–±Y¯Õ_!ÀõT›q£Å܉¶uμ²>)2+•š¼(:p.‡èï%êv<\{{IÓ˜(=âíƒÕŸ|"Ö,XþDH±ŸÞ¿Èx~g×Úþ—t—›³€"TÚY¼À!Ÿ˜ÂøM™\§h¸µÙÔ£%%ßìàg^ä½]ÿÁ%¯+F’µ²´#I¹‚2ºÀu—XÁô¢ƒ@X½qEÉ? >Ò‚fU:<%Y=ŠÍê,[¥ö¢ä…H´7Ç4“ºá—]ÊwD8°vhgœTÑ•Ÿæàcà«‘ü.+Ò@ü†R¢ÔV¡Þ4ï7*SyMLN óÊ[{Òñ¸Þ“´È$…Ë!šÒÐ)sŸÓÈÆçŽß8r5vW>íå̈(/ìÒaö¢] ~NÍõÜ8ä&èjªE…wåàÅð÷Z¯©Ä]ÉÙÍyµøÍ÷¥ñ¡‰G 5ýôù¸xˆy̽‘´'‚.ÖX8ž˜å÷û‡i*>>“ø¡ÑW>;f B@·‰ ž÷H|šî-f_Z‚ùL‡µ°ÜSëñçe’΢@KQ"å ð= =ùy¹¦ïºâö´"ýñ]I¬ ÓrÒ‡æ\¾Í_Ô£äqKœÊ\hú9Û°ꊈ¾yP.V.[ ‡¿ÈW-ÉßI­ciCï4DKß L£$RqÁ÷¤×úñp>: áê\n‚(p~àÉ´ò/#yoèsVÅŠâÊÜLXáûXÚ´Z%¬•Û®¢“GB½²t+jó_pþÒ‰BêÎ>b^Uÿ¸ T?»% -=9[Àòìþ vhjÁH¼AGjˆ{Ĕݽ9kâý>Ï¡.ɯk“J(´×)õúú‹ìËlõXÚ­™9lßÖZ¼œËewsÆœ&‡>ˆyцiähA†ü×–Zßb9º4³¢zÖ20 i¶ò„Q“fí…çÍ–d‚?ŒYµ‘rТ·+`:aãoRòVÿÍ÷´V Mú]‘¼S ƒ¤³ÀÝ<´W.$$-ùçu6i:ÐàœÚ[[ñÌô0®˜$Ày( Pд`òpKèùæG¤ˆLEg êÏ|À8d>°ÿ£vÿo2¶þOrs2»ÞÆD:)œ­K&÷wŠ™öZ½àG>v@9í²Q“j¤=îPÝýø…ej¯ÄÅ®o Q¯y©¬Ôw]}¾p,ÂcÜ¥à¢[œ|O\A…‡fk/âH±àì’ùO»ƒ¯ÃñÕ,§œ8{Þød6n4É å/z ™57:äà&"Nvùì<¹çíå ïÚH$aóÎÈ€£¸„37]—å†Eób[ÛŽ‡-¦—”ïJøÛ ÏàwâiÜeÈ8ÄÞ+Z]ÀÛÓE”Jl2"`‰Öµš­B¨:´C-´be.)7@ôh ]KÔ{2®kßBϤÎ7s€›Eèˆ|›.B6˜ŸlHÖOY†õcÙ§SЇ/“jëÐFoKÔpCm‹vVðýø‘æÝ«ÞùsEi Æêœí ëndÀy z#x é—ÿà1vyîNéùWD“#å;JÚ€–Íb‹Xa¿yEC©/¢«Tÿ%¡=­CÚù9C)¹Z¥<£'IþË +À5ݽSÿŸµ­‹Î͉åV€‘ÁÌ1Lû˜!×ù¬|Uõ^ 㚇Ô1H ’P¿€™˜•y6Ó¿j¼$°£—%ž´Üei,°#Ù ±€Æ”˜Í »ë­ÈJ~èø¾£%Ù$ë ø.uÒÌ,Ëð9±46=C2ÅûÅìUkè^äçÌ'SÌÄ=.ÕXåB!É2<ܰ›{ƒEMãýÈÐóbÀ)Ÿ]Ù³Ž=Ú(OïÈùÈÞ0eCzèÃr­Ö.…'­7®9ª°²%÷j%öÆPRAísºILù#éöˆÝëñ“áˆøÄÁTò1c´Ð‘è­/Ödž Ù6g¥µúügT|£•¥êNµÖ‹Ÿme2Û›TXG5•XT**åŒ ó½)ï¾™éÈò¡¤Ò$Ç&ҬԨث®ÜeˆÏ*åfR‹”õ[‚:*{áóçW NpußÈÈhv•S;&ë>Ù5±)ÁzÊgœ>ˆ°i˜ÎZz%D·"ŸZjPKÓä['dq•œŠ?‘zSB‡9µïž=F;;§1„Hâ£ç• ÒÒE¢§/1ÿpp¶äbN:^!kÑd ó‡äs%)Æø¹q?ëÒöëù·Jgá™y&ßLžÞÔ5¹h/'œ»Ÿ`ÚþXE¢ÿ;—žTÇŠEÄy¾ûŸï<⺛Älwµ ä¦Ñ{vðo:Ñ7ÜiáxÅ+_´²aÉ1tíÝm[2& ýצÕ8H ç?lÞ¤&5è5Ò×L»j©³ŒªMœ&éQþ º´Ń,‘·¨{×4ÆÔôø4DÁé ©¿É¢ºÄ³Þùzü¥$-£¨{Óc¬%éçtK,nðI‡¦ô0éŒïÄ¡rÝgZí‹9!dADå·8ó! f±zË–1Ã=DHNy*|-Ð¥8/4ÅcvS&¶Ò[´Ù©«w ¯@¡b•÷´?'C×åƒC=ìûÂÔý üÂ*Aç|‡¿æþP‹"G¾ZŸ¾«M7A.*EàËÍ{³Ÿît~–0oyüO.‰Bß] åZ¬Í¥GÚÓ „ú˜´LœÎŒpŒi¨Ö¿Y\PÓü[æ–zº6m®•z70ÚJ[OZ’tg^ã»ðÊŒéØ4ŸPÊ»>¤”оoŸ5’ñê•@Ni © Ž2y©W®$$\5c1§^p¾é+꣺@·ÃôtÙ‹2GßPë×ÎT¤ŽÌ±°¾Q¤UÃÁ<'M†vŒ>¾CtRɰAÓç$Lt[/t- ž`i_>ÄýÁ À‚¹Ö¥~@z;G/s¥y‰e·±£âRþÈ÷œîÝën_”×ÿñÛßyGéé9«Òþwq²-ç(¹T8Rp9¬t^¯òAµm" •‹]œ‡ÀÀJÕ*ýG[T-9ÅOó=¯ö‡;îÓ-ÚK7µ#¶Î"´ AkdÉ7ß,TLËéá.!ÃlÃêRÚ#-϶_f²+^.ÀHRQ ^&Né9»g®ÄvK‡*ëh @¼î­EÇQž³¶œž3&aF6Gòû~ß0>þøH‘μðúÅ÷#©ÐGl?Œ &ÈÆœzôÖJäZGŽèº-õ¹?U£Ta#ð°âÁÄ ˜ê®Ÿ&¸øþnk”·â}(„Õ‹Š–b-ö¾`ŒUi׆K·Vß.ÝK+DíJ2Ðä îét6Q÷•FÄŽ@-¼ÈÔwêÀ4w•Ë'’éÁÔ .Ní‘E˜þÀ¶Ù¨ ¼}E`G¡ÀW”Sü|²ÑXÔf“š#×§¸«í~'wìt‡—>sò&mœ% ã)ãÅ":Ù;šèD;5qDj=Æ`>Ô\á”**ÐagàÎ,‹’¦È/ µÒBž™ñ¦&€rƵªªn¶(:‡,TÓiLØ%ë)&å}»ÇÁf0u懡DäÖ"WØÊáI{D#B´£ñÍkÛPã‘Ì9(Ã5þøE¶¾^-~?/_Z£úëEÊÐ×k˱텚œë¹÷Ep6ð¼?\±©Œœ†HöX<Û²8”¼qhÂÛØ;ÐŒŒª@¼ç„׿´îÉêSY¬nW¸°òëËLä ‡üxa3àËlâüOæum2z+Zàcã Ô ÐVð¹Aæ³`ˆ¥[¡ 5ý2ÕôŽ]–sW#GC(Ô€{—(1À×Lÿ¥cŒ[‰É‰æì”!H }m¸"WXYXMŸB!ÇÉ÷7ÛÑ0òw༈»О'#yíò^ꋳ<5†4wn8ÒéåÁ"|Åi«6Ë-òç·´GXùÜOú×¢JÇéôz¨PÂ!Œ<³Z7ÎŽ§V2®eþ2QFþÍc4®=<_I/y^󆺌·O ´ÜÚ8;ÄÌ? áw!CˆÖœ‹ZýÌÈ<"áj‡àm>yÜzú=°7f︶ø‰G*þñĨx$¹¹ÆY¥Táüä*^ÆZÑïKfÞ¯oÀVš ž•ô/po¾¤Ó.·ï¦H‘Yjeωœ/2/VyÆÑ#F‘’©¿,ÅT­¹{ÑšÛtjO¤ÕUž`«”ă۫öÎ/(Í´Õóüú;=ª¬Æ¨<þÙ̳¸ÒÁ•¯ô×SJlçôh–¡8àßêÅGæ<ˆf‘rŽJ5¬Õu´ rÌS…¢ë(×ÅR•(õË ›§ãÈ„hãwhû ƒ‰ZµM²ÝT&V*ùد0Köí¥Nœ’d=ù&õÃW‚iu 0*7Ë ºVºJÊÎêæ@¦Æ•ŽñVµˆ­°ê_;7»¡+{Ë"8{KpvúD£­n»]œ&ïëÛzÞ|`´D«ŸêI;e‹wg®+æI½»?è_FÑ7ÆÙ_|ÓØ°ÎE…8“ ¶* åKLá¥ì_ì +(³E¶p‰¤ä®Òáõ©È„¦ˆÊ)“†Iì:¯ï>‚ †˜ŒŽ>ZMK¹7y'™J£è ³î^Ãm_¹£’Оy¯QMdz <Ÿœ5\çžšýÊ4pM8ЉvÑîZ -þ±ADõèRD­ÅÀ§e¥"îóapK±Ÿî;_{DM¹gÚàºÂÄÆ¨6àïZiðs¾áiŸUéÇWëÖý‹QN+IÖ38·ÛÑàiF•ü£Ò  Ä¸RÙpm­Ø6š•ýÙ2‹é=Ó8•M½,!-,¨`í[„ëz_8ž$ä?O¨Éìôe‰úsAeUÏU±Â(àÁ˰ ¸¶ötrò{ÀÑHô‚KYµK·8o½¿¯4r{Ë\Ë|@ܶ¡(Nxƒž/ê½·ó'y¯Ž+P”¦é·§"_$Ä:Ž]+—~æ3Âgqâ0í#=»ÆOŒð9’ÆHE(ÐÈFKFòOžƒ€ó…ÕЈ“ÆÁI‰ƒÏ“”2ª8 ¥vÐ0ÍRý™½Ã¾Ç LÜ3e¿v)Jƒ¡ü¢6õþS!Nw›#*vøþRBUbg„65œ$a¾¥«' •AõW®*¦ ÉÊ ŸÇ‰Œ0lãZP{­ïÞË¿”î)"Ü€d ï‡Ûsê°iŠÒÛrÍͲ“çûÉMŸÈ~tP.i'¢ð×ÒòÑ”d÷¦jÀxrጱÝèñ5ܼ\Nð93?ÿÀüVÚ­çÚãì.àÓA[ «¶ŸÅoM¤î\©šÔÕæ)ÀÝ {[“Þ-ШÄ#LœEèÁ=àN”fÚ¸Ïˈ¤àYÁ¦F-«¹ §œ|yéM²ih±¦2øÅ}žV_ùioúÀfV¹ûéÈab!±üœþñu~@?_,ã%)ÝT’ü¡*=Í|PÓŽê­½­¿]Š‚D*©ÎaPëzF9ÝŸ¶ã…²ý 4“ÜͲ>±r⨖C¦ÊÑ 3CØ]&rÞ Ë¤Æµð¾L—‹úÓÊðOž¤Ÿn–‡ÈùšEgEê%/ ©–Œ•†ãÝ„©-Çp[Ýh-®AQŠ ß Ÿ2£Arôºv©„Ú:ݼXh…6/ð¢N¼C›=»ÚÏý„˜ëÒŸˆð±þ«Á…Cެ† UE%ó&`—¦u)š –{Ó· îî?ÅxѾ™ÓS;Ùq®Ù¿ÉÚQýÅ@nÖàÇûÇ3V<ÖÎlÃ’7Ê?Ca×1ckϘUZ¿„ŠÑ 7B¶6u¤ é|*.â»]®&@`¯UÙÕßò<ŠïáOñAI£n\”ÍÞÂwÂÃHpÐPùH°‡Z_õBðg÷éˆ õ†¼òµ"¡ò>ÎD4žSžpøN }ɾÇÍøV Fñ 2&ªAõAqšÑ¯ˆÿ!WÝ uÝ {GD  ‰¹Œné*}”p ƒÎ¾êíØ¦öXu‡º‹º<ãª^ޝ±ûHkã`›žûŠB’ôÀ7Šþ]$îÑÊ«QMÜfÆ–Øã)JeyßTˆéCf ¬×PÃÛ ” „þ+"­Âgobé‰%ø‘û¥7g›$T{»ó_‘] ±9ö Ñ‹[!i!Ò"ñPD6…iª0)€¹"[¸9ô”X„¹K rCR²ß` "°bV†ËQO½ªOŠ:eù’ú·ÉJE¸G^óßkmã\ó)w}Eðƒ%èP^ÀÙyõB€zç~WäSR_#¼Y¥@7ú˜gŠîlBSt®·E¹Û]ÛU¼ ±X2{¾ÌN¡¨ÞÆ“X¥t¢íFÌ1ÕdTžÿ#-’¿Ü»+¹…÷6>4õœºú;Ýq3‡6FLïÛ©˜3™^ÚB¿Ô©†}2ègûë}æ (ï“G˽‘1T„ïep‰"—Ý‹}–a3•5âŠË줩w_`©õü›Ø°mxþŽcâèGãùÊX|°⺠.½ã1Dôò0§XNÖ OqöÎÂ*“ lTàDš8`ü¨•J4{uˆ2š€—NËìÚpûÀUfcu"ŸÝ™^™&]øp¼‹ŒÆ4­¼jöE™'G[‘#I=F¾Ä‰¾ëgë—¨ÞשÉs 7ÆQdϽÂ.\¥‰Òç•Lq6ïNLC¦Çóa£éi‰#›Ý¹¥“Ì*€ºÞžé•Í99 nœ]<·$´Ê»2ƒ¾Rƒ±Œ´Wå{ ,0.åWýOÛœVælŸßNÉÿª¸_`Ð+§–”úºGjš1à x©.A{¢6â3dtÈ&3Áº¸|_•xF j+@'“¿š—º8oÅ0&HâY€!/jX,Þ'xÆw ¿³ÅѸ£t­¯jÛ÷Ü”_%ífÔ@³’,_%_²?Øöâ¦[“»"V„µ1$+uu—3E²)ºbÁâÃ[ÚìÑHõ²ó¼÷9›ßß?y—®¦—$[ÆG1n¡WHNË•ãg#OÐ.‹ ¬=)¿(-ÿ@¼ ºŽU#M”=³|ǧfr ¼)²Ð—©VÀñqwðÔ*Ü´sÍèѺ5´Wú‚˜ó½"Î]P!ï‡û4IßG؆PŸ÷µ›vÀÛ®D?3oî-a]~í(O3[È¢kôbÞ–û/½Rä·V]ŒeµN£mP‹Ï WŠI¢fR'ÍáùvŽþ„”ñ»·Ûƒp#!˜\rƒÔ{.@²z&„(ªïç_k/‡d¨INX'W7XËœ¤o©2ƒkÌȵVJiõ­ˆ R¯ÃúXiR†‚Çp€óh‹eçü$Ò£®¶t´£!Y'(DÝצî >“ˆøö1ÎrQrM÷&å‘-ÜÌŒe-ÖÉ`„b0=†Xàò÷³QBînù;dÖ2lM×܃'Žqîw ‚æº6ŽÙUSìþ"“¤ä/ƒ¼‘HǬé{}œ¸§$½³¯föާ3¡z¾°;ñHb‘2–•‰ó0ê¿©júÇ&Pµ¦ÿ95g˜¡ê3 ›ã0ë‹E$ù5D&46öi«Z¥;Ìî¬6±DUtï§èÞsR+ç%懂,·Ó‘'33g‰[¿¾–j\ÆSªµé³Ygkð…¹q2©ZÏÊMÄZuN£4éë„ÖüŽ?Äø—Ekíd»“µ“TŸðÕ5"uØä*fdÅàìíIJ~Ôš°¹e¾Á¨.Xsvk³}…`IÌâü¦Z¯aéa¶4⦞ðYuLcØ’Œ"'rÐpØ?ìo¥¬sJö^@¿ÞR}œ±eßduKÿ!ê?ð¯v©=R^ɲŒQ¯ì°NÈ2=ÖɰØSš4ü<ØÎ·•ŽŽ»þÔ1¸ùOR’÷ø ´»ýÕovÔ.zŒ½ÎF@/n}X-9™ æî'¢Äay‹7ܵyŽé÷Q!h·m&‹䤚ùl‰Ò5ò¶©n]¤tᛈסóž¨dt™Ä혔¡­ó=A¶ü.aM€‡ôÈNC{o<³-¸9 ãÇF=¢-pV¾v¸wc&F䋸2·îøÜ7ìŽé½þ­Œ'ëßד>ýO#n»¾…·ñ²Ö'A;2IÒG`OVì‰ ‡?ì8W‹ïv£ICd§-MHb6à Hâ·]…4êPºþ´á‘‰ŠâhÁWÀÊÆ(¢2yo¼rqÒG<ØŽS•ݽ±ü:¨ß=X†7ñš‹ƒ:ýë_eZˆ8îÍhN#·,uÎï¼ï”4JÎjÛãUŽÇ/çÎê°c¨•ôç?†v9¾ æs3„ˆ°[A’!¾fÃbÂ?è[9)0¿äÁ+•&ÿ/ÞÃ#¡Yía qŽqÂE—ØIúv6‘ST¤ –]Mrì”Úa 7f«9ª¶„á4ý¥±±›þºRª ¥Ùœ¾\‚Ûªf7æÞºJ9à QjCPÒ–¼¿àT…š‰Çérz1vþb°È7äìå1©PÀ=1ž2Up2 ·[ÒåÛ¦søš²ïÏ6î9L~ëvbKÈ@ú†å‹/XGTËkýýv0AëäTNZÁt­ë!Æ/fÊO\28–ºp—‚Þ4¦u·¢ÇöØË’OÞ]÷u´ð¶Ž.\/x‹½êðmŽÂ\˽X'À°?ÖÍdðÐsó-_”ƒ–DåìlQ…ºÜðA¦_I¨È1t©®•Žv¢õ¯Fž‹vÈ3x,_û‹×±»»> Ë|—†Ã¾*Þ^zúŒ ‰&Y¥›Ä!âˆE¡ãNáxd.õ‡¦Ö}ìß³õë@Ò"•…4z5gÌvƒzNMh0OáÅ9³\4µ›Ž2“EF˜)xÅäß•ZEN¢cÃÊ]qó1‚£ùüµ¨¯×¦R f;ÉÚ@ &ò…ïFÐáêø¬±ñË€^9†ÐKÅ…?ÆH•äÚáÌ·I»Cœ³.©vÕÜ6PÑ ûœ˜„Õû4$Îæ~ò]ÒGgQÉõOˆv<&—°m”‹íI$–îãÐj´W^Ž‹,¸&;[ÏO¡`‡ õ+gS ƒ0q‡õ,>‡ ó˜µÊÈø¤ÔGXMÙ Í®¤¡Ï K;ñª¸µÎ¶Ë4ˆg*¦½“‚ÛÁؼþ’ûõÚSXD<¶àrTé8Îg‡²» íÒÓY8sz—{^¤(’R Xøûµ<™KW8#yéI ip¹€á½øÏŸL<^ ön†î“ÿçþTmåA6KË7!¶7%qúyñÖrúÒ`ÁmËß>CvçÿVÒ§¬ZÃ_ËÛÎ,œå#»æ!†±<¦g›0‰y®|aÚnh6“$ÆËÇÝì6NZ†prfÀ´Yî{,þXNR›ÿÜ錢óÙ0Z§M>ØC ¿:Iþ.ÏÙļŸïÒ&þœŠ—:Ðr«oq>Mð-ͧ¬SY²ÖR>v³íluýSºXØb„bdbkžpØ€m›2$+tzg»+EgX@ÓO…*¨/¦°1í$Úà/l÷ˆ¡{“hQ•Ûr%œÎû,5ÁÒnwÌ£Õj‚|2BžvÖÝi¶Sv†¹¬ÿVêaPQEKÀ/l`÷U®ö¯®56»ú#øá¥Qø­Ñ{d(âtCq^ºNœÖò87”˜®ðçîOæ…f"ÌŽnÑAî_ž4<¶i\KáàöfÂyu˜;õWÀJÏÁ’'¡­~lDÀ)ü~݈m$·à)¹Ã•&ˆ»û–—!™§³'–ÒrWÞƒ§@"‘ÁOìßy˜ÅÉkÚÞ€øVŠP….í09i 3)‘ysÂÓ, —e¶º°g;Çìý»ûê˜ &8C9·ñ%‘ÙgÔþä¯Â=âÔ¹Út/BiÆÉ9õü2£€@s U­s?#M[À:XêçµõÌúò^Ü…RÏÈÙ\`ë®7ש|¡7éÔ¤½,ÓJïÖd³ôö#&¬B™!×û<#Q„þ™i w_VnÂX0Ó#re&÷çõ¯Ýq·~a=ÜOÆ>ßIëYæ3zÀ¤¶Ý‡.wlœÐ̸a0S"Øs!$õ—ІÁ†¿ ˆç3Î8ä×ÁºSxÅb›ü—€`Y™Ô,\уº×é@pä…iÚ.Qƒþ ®«CPº)®Å‚Çݒ寴BN¨b›ÉræOòHœ$U“ðuUÊj+%–G”Ï1ËÓ®\"š¹¸Â˜Àn½ðñYí-=}üsê´‘ ÿ[ X|ÙênoÄ]cÀ—f"MƒFˆ %‹)÷ ®yb›TH3’˜Œò0¯@w>S39MÙ›¡5mG0«"Ʀ`¿®VH“Ý­{}­ÑjÝ!ӖϦÃÜ€Râ÷IýYJÞ /ýÓfÉ›HlU¦é‘äÒ,Ë„? 3cgjòõ²Ñ·ïfÌòñ-Å cwkÿ°X× œvÜéluHr×,‚ Ã?Ôœ“TÍÒkmt;C¾Õص9BHIÁI]®sNˆZ}0ßbD¦òÙ{ýN “ö›¯9ê!æãG¤|î¿€?s¹x­¿Ïg‰»Žn%cއݚŒ‡qW¹4-ÎÚÅMHz²iO4 < .>€Ÿ&×áó¹ø1%äh2d ~-‰8ö—Ž%Ý P³Ø¡'—˨–2¾Ò`‘c8¨®u{e~j }ÜÓ¿Ýÿ>H¸GQ’W6Ñ1 IüC‡óíácù•ëõ_ËB\ïW)Ù›ØòÀrãl1#ç\ØåÞIÀ1Ä&4VéFÈÈèŸÙ   3ÐÞÅ%—µÆ“2‘§½ÅÎÚ•ÜÚVù®‚PTçîgEŒËfaÅŽJOÀË_É3Ð2*qk,Ô0£­HÚ³ÔËéÒ?- #hÏÄáõI\:’”.Æ!Ô\r6Fæ”´¨Íý*³ÿÀ™¢)th')ª:AOå†XÜ‘pÂG¶â?5ļ_ø0 ôbòîôÛ¬_ÑX¦XWù¶ÜQ’ß±iܶV!ʲñ°{Ò/AU¨éâ¶8CÞ^ÁÈ4Ò. 5Å.4H.­ÃkL®*®‰§(Nb³ÈK`kÐ_u¼11 -Ó²ÀŠàsO¤‰Õö¹¢Ã‹"ñÑ€>åפØÞDä«Ô–¡Þ ļ–Ð(F?©Î• þ釟=ÓùÐßCõU¾…C7öÐ_|A©ÙǨ°Òt–‚ÔŸXÝ_f±*e Ùò&ÑßeÍú&˜ ¢Z’d[†¶F)?‹ýãdÄ}*òÇ »çzp¥q/,Âo=fõ¾,0zHæø‡öÓ!ã+½‡']Äa](à ñZÒcû7BNVݦá{™‹E¾lÆÂŽ3”¨vLž²ß\be“µÆeÕPÔ`ryÒ®Ÿ7¼+ $+ PKuô×IQr¶—î!x4¨¤û|Ámož‹´¾ŠëP–ƒÜç%$ŸÌMé}˜†tZ¶l>/dÝŠ·š¡gñˆ×–]Á·`·râ‚Ûñ2Ió†¬h˜þ¿â>>‹,3à¦üI8Pì²æØ1ÑïÊ<.Èî.9E™ Õ‹íé}zC¶÷9ë„^¬ö±ëþ‡` Ì]€KíKVv<á¯YÀ{IÜyŠDS"—­sÕÔ6£g‚—Ì'öª¢ªÌɪ›oTY‘ŒVÏIž9 æóyP²¹É¾nÚ q[\ H4ϰYtxç`+ ,OxðnÞ.pœíp{p¤!³„ò §©©Ò$Ý8?(²ÓÇ©Å?]Lk|7&ßÏU#‹á²O§ Ì­=5gä‘…ëÙ—v£hýüùÒð¢79…:m.Ö]TÞæžÕØÓê^5o”ï%mÒgýžÜœÖ>t?)›ÌJE#;×e, g÷A`?“% }6žœÄÌmíVt‡À[ª™+V§c rŽ9F©Û$þV©VeÉÞ¦Â%‘‰DG—AʇH’‚Àá2¨¡2ØcÁþpÊW;TW}·1¯Ž ˆ ŠDû’¬£®Xypa€xŒ» ¶¹ZNž¦o›9¿á$D¦Df‘§½°>Ùðz§Y!fñRŸ4Íæÿí4y«ÏËÞ4ŽHÆ•° Yê‡B?fl=6(ˆD~ƒáOkR„,t+‰ñ:ÍkŸÅ ¾,§×íQ=C¶¬AîÚAkÿüÅÈD«-#ÔÜ ²ÕPLéç Ùæiݪ4Lc¡·V2ù¡ÀÚ8…ÚJ÷âC䤯I=e•»mV°5‘•rYåž3kªó[ÑÎÅÍç5'.¼ÊèÔJëÒ³&Æþ¢¶™AÖT.ËD×’£Ïw£Ð‡®™ÿ)g·Ý‡Xu›—®­x' /¾ãz¢Ü±×/l{ … Špа¾,h0ïŽ $±ÎAï‡:M}ÌP€‹ý”äÜ)ª0v¼Èd¤6…ê%ªüsëÞá–Z¥£˜˜])ðŽQ'µks4ØŽ¶8¤ÝæJý ItÓ•6±¶jT´ÛS‘W÷ð–Ì¢^6;I&L*ÑqX¤HŸ‘E?¾ÛÞ×·M˜èò2Qx]X)[¢—ò•ªbH©ÍÔñkbŽì»Q9pžvêJ·CÎÈ&bæ¼diÉ <<x“(ÓÕ±â–ÆC1füH|›`LCF?¤S;Ê6(noZnë/œ4½ÞE•IZ6_ˆ]’hTñeJÏG8JT–¨w.¡@'Q “X*f% ¤Hµý¾h5Õ˜dB–$›’̪?ÖD\š¿'õœ°als3ÇßNæJÈÅ»/úÁï+0å '^`Ïd»âÆqÜü:¤­Ö3G†/úfR‚[ÈHBsnG®ieÇ['P^í̧Ä>å`ðgñª*ýd/vÎŽ*ªóˆPð×WÍ€Œ’qn–ûÀ}§† úpή(ˆÀí<¿•†D52¶®Ù©&e\zAl8:SØòƒ*NgF šÜƒ~Øì•÷R’PÔAr9üBî6$Ê—ö‚t\ÅçlÇÆ{ÙŸ!€øÀ·ûISœŒÄtÂ\ ÞIqÿ2žQ¼úw“FÔhh5£­f3üµàö~ ©ÎØò¾ôÒ@E>²íÖ­²"xª[˜_¡@ɃM8u=òOŒæÚÑžÅLÁöË…‰†i™Y%bÊÙ_ ¥²«ä¨µKE}BèÃ:-QÀAšrû”ý§ŽÍ’½*Ežì©FŸ5äÄ}µ1rmî =pBí³/]óÕ‚T{±Ô_z[pÓßN»ãk yŽ 2ý*…°OÖqC䲇¥,Z|ÍxˆÅGc…¯há-—ÔK0bY<0µ±Æ×‹~ïÃÌ_TâK,<§´¬ý%åTˆ ¯@n¤ÃÆâ;U ±•%˜§èæHよ²®¶Äqƒ8YŠ+þM+ÆW2Ú0Lÿ>nð•¶_Ö Ú‡ì$¦’x¿æ\\Ð2ŸjHk…%·î¤÷®VÂc<Ø5C&žŠÍmqõØ/ß½ç÷÷±®æs(T’2âl¥P…¶èMž.t“© FTòó–å|_v÷æ»å#Ûû¦çf8»£M %§ž:)OçñÌ(£´Å}ÖýÄŽT…SK%á¼´÷€Er9êïÔ¾ÒñÙ…ó‰Û"@ 'œ”…Q¦´¡½ ÿÉB‹´=Çnûü!‚!o`´ãD :ÖÀùŸ‰òLœ>2‡z’}„ÂД9Ê‹qå•sê›ýI’2Þ8’žÊ©ÎC°lú}¡»íý¥laÿl$ôY±8pÕýë‚ÙO®]mQRÞi3“YFA©q;k¾GèhÉ3ÍtÇ]·ºäÞÈ^ú¡N­l %;Ç•e{æŒÏùîj£…ÏùâÅ=šä…Ç“äèÿP²·BO昼_7Ããæ³ÃT2F¢ç T5½øঘâ6¶IgÐa$‡·¸Ñ åßvÚ Ø–g§«7_Òg-Ë«$åP-ÛЋ M”ñνÌ÷íH@\¼Ã7t¦ŒRüo&AÿA<˜O‹C½ý{*45ñZð~ô— >J ¹GÁéÊ'Ì£[ѽ hu´XsŒ¢DøŒ(r‹tâ\¸Äü•¥l§^Ei­0‚ïJÝ5 ³·K–vE8Yo÷$;rG¡Dn BdDýG)˜F 髽´*ù8šÄR½»£¡:–‰%xŸ¹Ù"Qý;;ë,aíÛ7 En;þ_@9âU|ERO€‡[¯?ð_Q†Ÿ¹u–‹Û+IXœzñà…% Geteô€·>$Çg1¬«g=w—}:,LV¶‘4n¾XœaœQ]4øÆ¡u'ÕØ1ÅÔÿ'Ì9%âL™#Çûž¯ ºH-;u€zÈ]Í Þ]šà°{z?Ixe è§à€0 ¸Ã™~ݺ'=Òá² Üï­;3.mJÁÿ­„agß×FÚøJò’Ôô$%nÕ¬NO€ipPÕD§êÉç÷xOÐFó½ Y\¥æ½`}%Nx­Ü^ö¬I@ì†Z\#[kàž Ÿ,Ö×i`¨C¸ä3—ªÃËÚ…ÍÒôÛ|():w‚V5™*øó³‹D€Ù¡9±f#E¨«ácJwIl?WY})…éåG«.™Ê5x”A¼Ýíé©âk@–„­¾þ@ÖðuÁyéÌåžeC · DCßòªoðo"KnE[ÆO¸žì‘ä„S©t›M`(Çä¨0‘Ø^ªö5ÐÕ)ÃÍѸGšÀô Œ(K¶x¥Gò½w»ÈmE`COzÑ“w`¦ªU¶Ï©ÿŒœ–VæÈòN #t(¼Qß ™¶Äž>úæÔ9ææ˜tn»Äa%Ž ø œGÌ¢{-˜+rÉ |ò<Öânn(n4‹‰DŽ$€Ÿœ_=KLºS?V!¿ºÛwlcGFp<Ÿsº‰±– Id ÆT幦×3׬ǟ'_ÿ²Só‰ªH„F‹³M¡ç—ä;nŒ¯^Œ“š:'0å~Ûg{·>?ÂU™÷.S³z_™}.Ø÷¨,•û®¸ˆ;ßÖ{£¦LÜVËLõ°kFám˜‹ìÎúËžp#׿\Ï]eªf¡z³a¾yñ2¥xó«û—– `4ðRÙÕ¯Üyx.É$”:_š=–ž×9’TÿgØöh÷ÅoΡÿÜòGJÈI]:ô¶×î >6œ p…‚ i;9ŠÏŽCU2ä9ã s“|S@.EŸJ£Sœ÷©š?QÀ0}]ø·wWé.¢õð»OwÓMÓUfXpµŸ×øOÇÝ l]1‚Ûw‚|¦¢ +ŒƒÄêJC.ô:M •,ÆË¾R©ðÍfS‰sÞAÿéÅÏUòPkžþåºåæ;ÜõR„™¤|cÈ0"`g„Þ/F©É#Zî=OqÔ•› ýŷ猌 É”@Â&=ºË4<\d…wõa Pê±ÏÐ$ï9AÇÊ dë­K,°Z“ÛÃFÔGg½(^—yÆÊ ª¡ç9=¾ƒÈÓE\ßëÀæKT·7â˜Ý¦"| Kº‡ª>Çúnºì9æï%7Õ—C‘Ó9ÙüB˜=®äGÈ#ó_Ž#!¬t”8qs-¾—HþhY"cçq?'àÔ››\·¤å]åNk€ …dPÿÓ®_({®OC‹ ®ž'æÊ >®­¾C&„ýù“’UD¦€&£Á™}åÐc Õ S^fáÁ#=#–k5EÇC9¹r•¿¤ FÄ,… ^êË›GÅ“¼m¸cS:†ºà•ÞŽÊC-MÝIª` '~uÜ?\f1â S‚Ëx%úÛwCϧŽ%-y¶¡–ÕL/ë…×^Ê%ÿ€±Ùᇖ  üGÄ:!;ñA´‹Ãª©?¨bEFh9Fe¿Õ-þLãžýuC˜©DÃýú˜ì3{ª¯‰5èÏAj×þEÿñ?Æ5@PCùèBè9ºj(q,¨Z' ±5·/P&è!u†)éO/x élYéö'û_%=üsG銚3³¦¥5¼a†oQ=ë˜,J­¿ºÃÿp§3_@ÕHžHåííïsÙ2Gœb;%îŒOvÔñ®EÚêJ®Ýžø$ŽøÈ¥¾ÍÑê˜x>·£IQ±”,–Å=àm;üå9ìgÁI·‚h…>\rô…ø¢{v…iåBAöXuâ—2’ÏHÿ‘Ô^¾Ö'®ŸfÒ"² ýÔ[Ï3)™à½¸nFë<ü·Ü­ÏÕ l~?7樒Û?WâP r¤ŸrwÝj,€Bi‚3ÓZi›ì¥ÛÚm%Ô¡ỏ;ðÜ.3û½}íê<9`<‹~Zƒ:ÍÕW Јt›²2aSfhybÇånЉÍ{ %ÊúZ€õÄÏ3­ðÑ“~%g9Ô‘÷¿÷¥#Û`c(Áa켿œ@D'¡aŠåÔ퀟ŒÊ÷"QL”ì[î!ù1Û§œîåìö˜ë„«-bOX³b*x„L嘲ÎóޝâYÒ,{¦e† ¼Ý¥ŒÄ_f>²d(Ú¨^w…6:iÒy –ï]–!Õ0Bô/yIbþ¤nFó{ŠÑûvü\òhCøÌbQ9Ç_´-Úq§RºÄ)NL ‚‰üFÚ^ýœ‘½¦Ð'Q‹~è²uZ–b}X¬¦tÑRz…îÔãÆ(n}Y±Êæ¹·ééYše#äiÍ3¹½œLDãÁ«–l–x½ פàòÐz 8ÎÞp6ÐSMhJb¡zÖJòy q±Ë¦Gg*!Óùdl¢ö¸$©o¡wÆ'‚wPKº“c%õúJ°¡]Á,^“Íî¥+îÛx¥x(Ø>l8¹úóÜN·'>Î>¤H*bB£5†,,7ùÉí•÷{ Ni²/ÇÜ÷мšPBŽÄø½ ¯ˆkM—“ Óä)mˆ÷Çm– Á.pòËzŸN>6fe«?Kd@õ^ê&Üžà k·v71t SwfI ŒG#¿´ Sp­²CjÜâ"Á:Äéñz戌KNo:rNcfºb‚!£‡Ø«àJÖ“‡ÃÓR‹Òú¥²+ÿ?¤”õûúÄ÷qÉÇ@+•X ZÄ»:ö’§ ²ÈQú\ñ>ì>›Z ·(»»QÓ·­‹ ñzcè/¯Ù?‹q·¯ãR‡ONÆÓ4«gGQš¸èG·¼í3ëTX¨(àtçK¦!½Íþ¦{j½ ÇQK¡¯ðÔÐÀËNBÕ¨~9]šÍÐ,Ì" qSB rXFš:ÍŒŒÝ¶kƃk@&ýŸRj¢uÐl1yå’O&¢P”罨½&¯Äδ‰dÔüJñß°Y[ÅÖqL2ñ]ÇNš:sàü•ç­Òµô,Æ0$bKª ´ÝDx2´áÛ§{ß­Ò#˜ŸŽ•Œušª7“dÆïìp$Š*zóÖVÝêý›S3…Fæ~^XŠ…qg­ù"\öÆAõáœ>gŠ(™íÚÈ1µr#±¾êßܼo%Ó/Ê#6È.8VèGûl±9iW$%ª¬ƒ 3Þn†£¨]*f§ÖE«E#—¿Û‹&án%gFÍ x©Y6OÞmíÜÐôA¦º2Ǽ+°•ºÉç‘·ÕqÊÒÜ›ƒ²ù›7&`}œ¾X´™¡7S·üÜâ ÐRŽÐï¹²É'õ|xÆ&$Š¢¸5 yDʼnf†¦as쟀,Lc:B°†3M*HxSÐ ${æNRŸ–­/‹9"¦ }AMÞÇo•Rù¸Õ‹Ž4óY­y++å &Û^t—.|IÃ<Ù¹b ¦t’¾Zü£¨p€\ Q"?§xP*.Œ_î¢v™…„©XBÅòûhhmYþ$ ÍÞ›dc¼l{Ò ƒeð …y{¹õ>ÎÁg\~æ6ÐÙç}½‰g…^äÔ€óö•ÿ »ø Úö¸$(@Ï¥ºs¾¹Qô§‹ÌØ^ÌàÀòïo2ŠÑÝlÀIZ3´¤Ö¥ ¤mzÌïöîVEÒkY¯51ù_e‰Î­o A¯0gøŠ /ìÑ5Åf‚Û+E§§7ÀdîšO@K·*p³¯05““$~ÇQ$‚W˜e$ #Í„yò,D¡ëÄè0ت†æ =Ø­¥ þƒë ÞÏÚ@Zï´~l§Ý³vܲ7÷¬ÄÓéòk¨Þ‰@Ê:žu–:8ø,H`rö êõuZ¦~f8‚m±4VM¹“ÎënzfYÇÅÀ\1gÕø¢Nì-\ÃãóÈæÖWdk7ú½˜ì·ºùž}šÄAJIsÊ4Å/9CRöµ¡_ÄØ†"ÚÆ”iœ$d„­¬;6jþÞ*,Ò,Qjfj©€$‹"Kíß2#9çUИ¶¦sS_L|úgízPV5?ÈY¿(c™oÿ´x¢$‹ñ*½ç@"$£î_F=ÓÒC‡\„à-¹hì¡ÌRÇQqêPÖ¨Œ©'§ªW•Ÿ6À¡œ :7#ÇVAòäÿ·ýGø—p=zb Xk“l„ªíaØC2³¾¼O•·–¹>÷¡õeÄ”ø¦^Û!âîÜU"ïŽY˜‡Ê(6œÝ؉ˆå†)w·G%„01˜Ìé~ùùáDm^ÑÏÆf¨ Ã >’ï¶ ›@eIàÞßjÌÛÙ‡BV‹G5§GØåÞ!æ0ZàÆ‘ÐTä!™Á[€Êún{²_7Jš_™«·@œÍPï̫æ¨V÷Ç먛Ã)á4=©ÚÒÆí\ŽÊ#´>XzìgæRrK?<(V9ùâÖáH -ÂËÀàTÖ)\Ð]ºÁ•©“ð&[†§2Óžèí#7hò7Æ&˪ÿ: ^ûlÇÊ;’ÙeÊ|^>dìò9þ%üyÛåL²M¤L`« ٔźxÖc¢Y4Ì+Ç ÑÜ£2\fɢ. 9õÛpÈHÓÜïe[,ÐÎȆ_èáÀ¢g¾Op~ÎoZ=ü£Ìß’Ç`CŸQªi¤Á€–ÊMn¤­˜XóÑ\‰9«Î „Æ‘Ö>I©|¸/ºp}®ŠñÕyýiÈH··ËÍÛM({é•ã,³™`*¹Ý„9µg?0¾Ç¿6n°‚ÒÊ]²8\ŒÄ[ãü1‚‘¨ë§Äò;8æÄØs'‡Í,¹v-ü…Ô·˜€›_"TØ&ÊB³&•B˜´Ló„”åb@·]ñäF僕ʭÐmm 3èÞ]ø=¯÷CÆéä‡=5ö<×ý>/r}- )–/vÕÉ^ÔKoÐRZfW…òd£ÕõY6w¶0æ(µêû7Ïýz0·úÒ&¶ýÈ+x¯LÄô$:€{˜9êb¼½÷Âé³ b8væ2à„ëô¢Úüˆ¡Àp!ÐÇ.ÃéiÔIþ°ŽX&ì å[!êqêYöã°q Ú³&J )ì«hÁšÝQtå]^˜JN_8õ’£þæìç2ÝèA¢†rÆ Ì]htU¥Ào©þhƒ” O–1.Ð%·ªo¼â’_:åY̆¾ìÛp‚..\£÷2¨t±Sj¬F™‰éa úD ÎC‡ZpÊQól¶ö)ÙBL5¨’ÕÚ<ØË®n„%£ihâO04—Ià [ÿU(7Öü9S%%7 ºÈ3÷_TÉ?Å3¤ªS­÷s§ ”¤ëõ8êžb¼Ú| à s¾âï¬4ÒﺽQGežPµW[.¸³t›ÓõKCþÖüƂ৯é0ÙÁ/t£,~Û]AÜ:]QH×Èúàî&?¼í|}‘:0<ƒZõúßÒöm腫ʈ G°”Dwg¹z$èÆY¢@{«‹VÇîò5]Ù|úüÁ’¼üàcÓÙѦ)ªÜuã¿ r4ÂçãcíÖ‘0eÉËÄsÙ|mMÓßõjš¼ÝDÃ`1`ªØønzMÊó_:™´ê£Cu´w¿„e!§ê½M(Ž“@E*?ZÌ=·ã‰9ÿn7 Æ£ý˜‰CšJãá aŒÉ.¶„)£­,€” yE.ÂfòTe{çך*$J÷?m÷¼Ó+ö‘:?«%ùwx{°Ã£èº³z-°´‚iPd=Ñà;×ݱI£8b¨’&·ËEM¯a1(ÂTpä.p©DJŽnÊRcE«Hæõ ¢;[Ýý¦žÄNÑF~ Õ±n/²…÷ 9Þ€Ò&á|ŒðÒkŸ£¦éH7ëž“6ˆ—g¨×ê<逨ê•R‹IW¾`gÍ›Øà*#Ìb̦VÓ4ÿEéýJënŒCý°¨–Z3´ý&¼$¢ 0L¨è„•º›6>“7ÿ°'pÅÓË¡èmQ¿:ºM¯2Ã\yf'Ð {"q¬âF>7é{<‚lóÛ`$”RËà~¼Åý±¼»<2zŸE žVq‘aÖãåäXÊ1ðMõ’ø;­¢Ãh=8†ª;@9c«]¾"ìztX9öz65ßÓ¿ð6t‚–-íˆìö2(RÖC¥M]0>°KýÞ黡ë̺|e;:a:ŽqšÞ¾<á½~uN_IwècãÂÓˆ¦R'´QÔó¤ùNQ<ºJÁòõa?ð5a„ÌÄaYåFäÙrÊi`à•¥&äsZ#BL›Y~ί¢u5’½ÞÙ2U¡ã=îÎ<^·{”g7ò¤¤¹ŠÁ“%Ž}ê]¸@Š€aˆòÑÝÄ@Ìðé¦âðÇÛ×¶Ô“$XÁ–[ø¾ÔVK2F/ÿ>È’À;Óê?«LûèÓc)Å·ãßí(MDª z/kÉn¤P>Žõ*dÂ+íkE%®ø‘}S—dq”‘¢Øxû%Aµavz½N1ÌØ¥ÊILb¯ýdê Çy=­„™œz„N±%ç»[%Í57¤t¥$ëäf "V‰Iæ$Øþ ­7ôÎÇYUîúIÆ¿¾‡éɆ_óö¸R[Œþˆ5Ê='æÀÿ ¥)§©]%ðñM†üy}Ì™î—âKœ*.ý¾¸ÞöÍÓh¿#¨XÙøÁÞýίJåêü`LìÏ ([à ©ê¶nÿM7­.þ4…;¿Ø|à›t›H™CîÊçˆ{o¸'Ñ‘ÚÑ„f͆PXy1 ‹. Âj8޵žA{5ÑÈQù :‰—R)òØI–“ §~ºø.à*W¼wÇ’Ùò )KEôލý”àÒVEÓm‰#V/?Ü“ËyÝG`Ú <&ur-zyü´$^Ñ/ ÛRI,œÎX³3Ïî‚(÷ܦހ,E\úë¬`‹•†¶Å‚9ÑÆ-bMÕÑW‚üU""Ì mß8{7>2ÆLcÇh5 7(7`óQZ[ ýfÄŠµ"ë>€Œ\Ö½–ÍɃ0PŽ}NÛˆèñ1á ±kyqðmxw Xؤ”L„ül®ß3A´‹n <{…×àÃ_[PSÏKG˜³wŒÂ‹-Ç® 󤟟;ÍŽ•×FÃ\?GÖ‹Š£]—ªçµûç b<‚T½Å‚} iæÀIzÒo%n·WXÌÿ¼Ë¥©] =”dÉ£é[Ʊ…9c²Þ°µzÑ$o%áî¹Q WrªäãÈfe}°³¿ ÃEáøÔ—kwvÿãtŒ6U"™F£o=Ñ¡ÉGg<~LX#‘¶6Ç-éLæ%Ctù›b>V†Á=Šƒ"è>» ‰ljŒ,OulS…Ípòm#÷Ãî—7,†ŒŒ‘Ur;¶·kL<虎O¦Ê@¶3ßÚ¥›©¤•-©Äü<ðògjϧ÷ox#o¢Þý5E5r$k·å'òw‹5<Æ×ÎòÌw`<ÝX¢Ìݾ:˜ùAÎØà518u1•HÄ’¢¾“šÌ”&ã8%®Y¼Ñ|±ŸPÙrÿËçÙ´°» SÙÜ@f–ÂPléžÏöFGétIí_HmH †Ó§¬ì·é©E˜G$ïÂPy±ýí€<-êüã2}-x'q_Ö]•!lˆ°ú&“^•ÆA¥Ô‹~œ‚Ÿ¿µ2u 7R߉—óË÷qœÖËšm-%6Ê€LK5&bÌGiÒ·…ÆÈ~ZNÌãåŸq&;|<®È¬´ÇBnÂ_ ##îl>ë(MºâÇp¼AÎy½E`®¤qõ•õ%`Ǩûö=A:w ^QtA±l+P¢ùéœÃ&yòˆýñ‰EBã¦i‰  …ë.uKú=‘GÃÛŠb5ãw†…7yáW´qbmk>c0‘YÁu–Á¸â´ÿGíxúL!`rvȵŒï]À0´¥Ø<òW læMãظŽrÕõ}õÃiædá7Þ)4ž/ÍŒŸNºnv[c'×¢ ü²'?Ø º`\LIBHo~ße¦¥d˜ »·t[öno™mÀÿ@Œ[Ž«ÎÃé(s"Œ€]D@¦G>ã˜7XÝ!œìÛú¤É0 º`ŠK$£Ç¯z;~góŸ Q¬ùPÓç\Ǽ+4€ /©Xèî $R2î &L| ,ÊEË<-ã"ÓëùE]¶Å±ôåœ>•RÃm}<»b]pµKöø%^A&»²ŸîlÆ`W‘Û´¦îï² ÷®<ØVZÈ8AkµÞOúUPѵ»ëâñÕ`8†>é1¹ ì.!Ô+©.ÂDÔÎ,NÅʇ &™'rÜ*÷Tü˜+”ón§·¿uàìé »*j¡ 艋ÖyÂ<³‚|5ÕÐ/iǪ‚a]J¦uìöhÓµ}nñ¨4$¬"hº štÕˆyíÏc‚¨9xd”êìE£ƒº‹±˜–zâ>¸T¾t±i ¤è§yœî<'â¦ÜP½sp¶²Èý¹¨}ˆÕÔHÓ˜N9Æ“¶ôHm™Gx`z€£(rÝeä’|qÃÏpŠ—éîúûÝÂ9Å:©d[q8國†7A²›íùÏÐÙÅ×aTBõÝ9‡ŒìÅ׿³ñð5q…À˜Çyè… P™-ýÏ‘2¼U˜YC°v¬ÑQð„L ÄnëPÈhžÇ&@ Zoë<Ǽà_ "‹|²Å96dØÝšK–±ò]pª-‘Êé:û_+ðªÊ\YŸ¡§ï5¿þɯÁòB‡ ‹+Y;I9C—ƒáBåÏM£“Õó‰)6çÖÏ$p¥!Ó—C‡3ÐS”LÿÖÿ®‚FòhO&7ª˜á]r¥&8>Â2·ƒ8å´vð˜nn] ¶kò)ŽY{*¾~¾°Væ^ÛB44-–G  É!Ø4ä1¸/X`Œ‡¬6ÐñþKG =qàÒ¸~#Ô(â=Yl¹á¢D¡n6æD¼Ï›½ârHPWæ('(>s€¯xkó•³–¥êFœ1WcúYàñvï˜_8¸‚ÞV§MŽ%m‰“—(åZ’«¢kxDúÁº{½Ø³JJ)„°8éörè>ý¿'oç—£%[%Ì•Éz¬õmX4†0]|žQ§ã7ÑN;3ë8ý“©•‡Ú#A± œqÎçS<Ÿ¤V ùĤKæûE„oø÷eá JÔ&KÏU–¡èêK:\iš±V8CgžË%©ˆ˜õB•dœ·='w`ØÐJºÌ{Ìnwz0â|ËÀ†sùÈÁxùÖr¬Šå6 VQµ>uàÏ¥|“F®gœ$m|”ñ͉ÝÛÑQƒ6~{ RÜKÂv|LbG±Ö>R¼{~¦)EL]—¬W_Á ÍÿNÇÓu\ú´ ¬TRiÿ°ÖÇ­Gô ß%z´çÐuw<ä”`ÃÝ{tݬ諯Sà<¾öÕ{DòLø!LBxýQ³Bu“Ñv”´«Îôœ»˜LXxÍðÃ×ý™°¹£½ö!•ˆ³¸úYÐÍÑÙ²öQ"«EäWF{’’a@ãÃPÅ©'¢ç0Sì5ÓñÚ-rXqL—ú¨Wð‰‰½”b\m-wŽüª¯Q{þz"ÂJˆ,jd}ïcv퀮AuÅ•´NIðÓ=ÙZÏ3»g Ì4­W„­ßí:m›¡³ÝÁÌ-çM»WjwqRu!ŒÑœ¨‰’ RfØ¿†øÜÂÃtvg@™÷Þ•žßèRX1ƒÉ(¥j$ªð êEÍ_9f ëÎ0¬{Œü`8{ >6æýúŸ·ä´¡ˆ9¢Çàã“ëÅ­šŠN¼1jt )]žõôßúgùX, ¸7±BÄÏÆ±yŽ”vÐc;‹§ZýÈâ«‚–2øiÏäs{éâ€Yî1Ü}•êøUwÝmÆ`hÙ,¸ï†D_lobm&\gå*cžãIÔŽIßæ©évÄ¡ã!zࢡ~TªINÍÅB¬Çâ2/c»/ò~sTã*>Ñ€1k›)“‘ž/ì( ,‰$äž{·Wh¢î¨­¾ÔãX™ß’:ï„Á½2t8·1.i» C¡„,¸‹µN¤Qdw÷Ïë(n>¤ƒDZÔ×E†üó.–Óf„6_i:SÅûS/¿ç¼ ­ÄĘPBÖ»¦ÜÚ51î2MUŠ!O“\Ùüɠξ›_°2?K8 R•™ïHî‹ZÎ…Oê)„ð¨oZÉÕac»þB·t°¤Ü‰Ã4RS:}æg)Û$A¸/s`¬ö’“ɲ SO>ž’$§\I¨2ò‹.IrbGU¶ÝúŸÊ f–ãõ¬~¦…•ë ÂëŠG?ù6ØJÁ²>Êz¢†+y<˰ߟÝI1¾óTÎÁ/¿G…YþŸ­ôE.ƒ–>VT1ói“¥ º^•RÄò¢:nS)…J=×Ä0‹‘•}±žfª¡¦pU©PñÂÏ÷мXŒö$i`h‡¯±Eî!ˆ-R²5]@ØÍ$Ðg¹žakÚZ Z“6üI–2·Ÿòý ï°–ïF·^-NHÚê#—þÄÙ¢˜õ‡_ÅžÛÒl¯ ÎÌ€ºI»¥ž‘޳ØñåAªe…¢÷-÷Ø5Amäiû>ý 0äXÏ­Ç”!«|I%â:êùðCyYm&½–cµiõ>H‚ËÃNÞˆëU[ˆ›`bã_Ñà¼ç…{…ì;œ¦È]K#‚u8[‚…Û-·Éõ¹F¤z¸xÿrÖƒMŠ|ÿcCt-_Æ0›ÀÈ7k’ìëà`^Œ:J@®‰—Ñ´_îŽ$|d|ø,mûåèÕÿ¦‡·®·…F¿Ð}_~ÂBÜïI0ت­ŒaR¶d*¬2Ycý#k¸P©–esͽ|§šR}ÏF3ò+ÉÅÛÚ+ÓÝÝŒ™Ù—“¼˜(*¨‡/ùl9B…Ø-”ëx¶®7¥õ9w÷]bJ ½%[Wn•Z2>xNÃ1ð°ãJOXþò¦ÀCybüBT‚á^"-Cï{ "2+"ï\šà&¡ÃÓuí¯ù•—áåGyR¤èÒ¬õмÜ*'/¦+iƒâ}"ˆâï+‹•¦Ëé _Þ3…"/â¡o <0¦>.!fl ŸŠøšT=7—pi¥¬ñUc$ðRÎŒ­PÿO¶0ÙË¿Ã$ÞÚXJ¥j™Ó§oõ[Ü,.£ !6ÍJƒÇ¥âv!¦ÞˆŸÔŠ9ÖyÉNÃÉš3ÿ7}§öñ·*³ìÞ•O&w?9¬ˆBðЖœ9•ÃQšŽ÷ B ØkðîÌdb…^{hnÿ©¸ý‹Jiáà­”­ÔDIPo›nô6Aònÿn`\g`·Gû”š§èÌj- bäWçý‡ì’Üh¹9GÌŽÑJýܿݢ(§hGùhåaö|îýäZå‡g9ƒüÉgDÛªƒò܃c9CÇ]ËždGN²{4&å𫇉@èFÅéóÅþŒ5XÃ#kˆÄqiI¸PhAʾGK·Ã ¹Þã;„Hv/®Å5½Ï„ÁÇGÎù±úaÒ¯µ¨5¼BÀj”×Õ›~ÞU¼öù†zîuUÍЄ·hL,‡tu£š¦4{âÎV5¤Ðxeº˜Î&ÁF[°4?Iÿ7´ÐÊŸ;¶“×ò%Ë™jÌ%'þWÀt`ï9À}C–çú— Ÿ"«ÒœyKd­–v,t(õš‡WÃmlOû#!a• L*,.{ïq““Dׂþ乜US»Æ%"p¨ØÅmÖ-DZØÜiÌ´^ðªDQ)Ýð[#Óé:;åZLGókNE6ãÐSù.F·CˆµÕ8lHÇÕøL+͹Å÷Œ~æ¢5yÏM²x¯hŠ.`¥f’­’„—H~ßä½_ ƒúTA8² i@‡ã]Fà“·z¦t`Ü´Ôƒ–%×ÊiYÖƒÙ?¬N¢p6Ýsƒdýç¿"ëñ=þBådpoþuíð?äH²Œdû}T¹L¥väúV²±Šñ qö™¶¿ÔtYÍá†Ó¿HšoBå²ð\ÏU»k•&—=ËL§ñ?³qoŒÂs¨2VŒ% \Ûß$¿ÔŸ[7‹Ó&.§†Š°!lìƒÎü«Ÿ,fZ1X\ MÀyʧšªZ²µ÷+±kîV ƒ“°åÙùåãôë ö<•Žymôòˆ9õÆ*1d‡E׃{QŸ:£kÆÀŽð@Ìõ=›mŒ }„×ìW£Æ¬šb«7%¥í@ýìo[æãLj‘ÐX1”9wŠ.åÐ6>.3F<32}ÿÀËð[ÄWÇ#H—/¹´Ðׂº}¿Óÿï‹õ#nÁmMÖÐØpÙÕë\dɤjOX=Oƒît°å³: «ýDD’›Øö8Ír깜òéUô'h9d¥’äo(RXÅÕö!–©…2BsãI_‚i_îÆá•,V-Tk(aúî¾ÿ¥M…P!ø[ {ÃÌm©®Ê ›dk™Ô– Óÿ-VB/Œ7év@)>ÇÉ3€ˆx6ô“¿I\¬û¥d‰(-IÙ÷>Óe‹Ô%Qâcè0êö³> ˜ÂÃ*Þ¢«*¬‹ ?@ •SvÕòï„ÌЙ·ä&›ÛÛjYÈo}.?¼Ï‡sÐúév@¼Ô<´¹’¿­û ÛÐÊ®¸Í¢d|O—0šlîÕRTyæÆZã6˽ôå×÷šÐ˜ùw(^Uy·Hþª—ò§Sáùbü«h×+ªŽäÿf‘Â>1¼>˜–ûD…já«2§ [ÔØòŒ“·Ð~Å”B*¼6ŒÚ+Îj—?Dtá+xµ2fg—õu]&—rÉõ@ ;ülX9]8R~,Ìò›V?}Îó½åÜü[“»P…±ÒÙ)¼>èOO­WI‘ÃÞà?-³£ ~R±§ÕÇ<ËaHêÆ.Ž6ÞšqÅv8ÆäÕÙÞÑtèÃå J[‘<Nêëã²³¦†+š)m´´ v–IåsŒ»ß·p.Ç<*ükÃ|áQqôè"Ï ïå]Ÿ¤>d‰‰b÷že“#˱]Žb3±‹ýùo„t4àÕþ©d§[$Š5Íù£~H¡å œbK“ÎDð/  žè›Ÿz·…éÇÏnr(÷C',›ºå ‹’DçeÙ†e´T°úª'SªÓ¢B9éÅüGî±TzÉÒ71¸ÜH¹px0Úì`ÈÓy º ÷vNúÅBÏûÍ\ùQ '²SKpNÍ6ȰAýI©h0/ÿ[c¢Ý ÇQÖÖ¯ê‘p¤ôÄ«Fæ/v?á½¥ÑÎJ'çr󢆑U÷bÿ&·ªoϤñ).Vð:«c"¿†~wÃMCµØ[EªhJׇží3ä‘In>&Ùª‹€ {ò¹OwèJ—&ð™ˆ}fÞz0{ó<0ÝœóÚ€ˆÀ;+­ ¢k ²Èhµ=©¦l…s{¦l“ÅŠ%˜`â”­‘ã§,sô Ù†™ªÚð5‡·9:CÅŸ)µt›ÝËø£ý ®ý•+±…EaúÓ¬=5³öb“7^P#_ f“!ÓwíÓ*_úN"µ ËO4=š~J4. ßöÆ—c Ó—Âw¥Y Œ©KÞk8DlyM+¼ËrM[Âîñ°×97;¹Öhˆ,ªwœ-h`Þj&A{T×Âr&HØ“äíºèð jm£q/‘®† um'Ñ3«‚Ž€;P±bÅ¡ÅÍ÷ Ë?Ý~ `í ƒ‹áå @”É瞇Í÷€ÊôZrYdð%>L[äk¿‰ÙF1ñ£;ª5¸O¢©Ð„ÆgA&Í–íÜä‹Ú-h6ÕߺpÀùІ>dðã]À·%´:ìršC´[Ê"Öª*Å­ÌŽÿ„¤Ê?%AvÂÌqæÂsƒ]ÓRŽÊ*—kˆåãGý¶27 fÓ8“ecÕ†óIÆ8– 1®Bè•!©næ–¹Þ²ª·£°"Ðo4ýü¸ N`¤þ¾(L/> éíøw’Ï¡“½É·Gá5pb#¤Ÿn*ðÔÖ] L¨vÿzF/üœ ¢ÌT\;Óm¾v/2²Ö¾XgÅŸG‘•É$@ÜP˜·N¥Ã­“ÍòÔ°L¼xç•oNQE‡ªY$“6(æ¸ôO„)ë˜ÜRï_‡¼p“÷©ŸµÒ×Ý‹»9;öåoô÷ú4?" Z®qhÇMA¾Á¨;Ö[r¹‚ô÷³O$ùžÉ©@1úÏò¡I!£ $8_NÐ}.tùqVÙQ£BH§õï“LÊÑ>'S «zV\/k4ð;¼%»Ùr©­ø »\PH¨Ìï’—²í3$шgò“Ìfè‹:9Ѷßçš;Nƒ©m=R¡è¦,ŸÝ'0ƒf”,œåuXÐ#Ú_u1ž¿£=éæÑçm| ÛŠ ¶Wƒ©Ÿ=CñîbS£)\–QúCfTx“ÂÜz¼¿K·`åÐà£mŸûà} ³ ŠèT~._ìôÂS\¨ôê7ãóÎ,zƒ™[Â>nF¼«nu[øhÔI»¢ª‡ÄLœÀõq­Ç%GÎì¾K²t¸¬Ü·]_E5df¹!¬Þêã„âëöï9;A¹t O®´¯(Ù­o·àoÜbLoÉŒûCø…„½UÙ¹|ÉT“í冑!a“b±±Õ-C& « *ò´C!ÕPeF=§W?¨6…ÌyŒå–“Þ×ÿÌøœ¢¹cŒ) dŒÜÁ˜J‹«S‘(À&ìÇ’^8ËæÌ¨—Žâ+ç³äº—Ž*}nV<„ª#‹`äržè}g± ;isgl¿æS·sÆ.,$—J°è·N†£xª&Y¾ãÏ=dÉHHX.Tá`[dW‚?,^d Ó€)F».~ŽYNŒ´0Â8]ÔFÎ…4õBçMqóÛ rÑÉÆÆW; Jës·§˜vÏü>/ŒŸêªÓ¿Î¶wI¨y;é Ìì¢×%è™Ó3áa§èl„$•Õ„Æä ˆ )QØ¡;ˆÄg € ±¾6¿Gìç(ŒþA¨Áº¦ðJ”½k:§+ls¨ÅxÊQÌÉo#R1lF{¹`éò¶H[ûDµwçý¡nt•KÇÉðuŸZŸ¼ÒúœÉdX1¦ˆ‡ô L$´¹’¢1Þùæ˜Ôâ[oTtõ¾j`-3zX ÒóÙ¸msˆ“ :iðÍt?aßþiÛ,nÐäaVø» ÀnèZ089a'd{éúøÖ„,©åË‹Þ)6Óôÿ%M1Ru8»ÔÓU9HŸžsòB¹–¼ÜñŽtšqψEª*Xªb¤ŽºEdb] ª"ç`…!××§ü ½‰¤˜ÓqóõFÁ5N_Á¦å÷› ÏJÊ+ðòÞsÚ:ošËþ G1ļëæÙoè"–]ée#"‚£¡06‹:«Ú•¨¢y ’@¾‹jmä»ü­ [g†¹»Ž ú 0:;íF'~¹€„"Èíu‹œ9oN©)×ix[,•håp¨;˜›%Î 'Ô+p.ˆñxOLƒú`§N²k-©Q&åíQša̶€Oa‚l_†Øú‰ÐnRoí— Ûˆí´2ÿ2Á¬É¶"îß`¯{–<œüä©ÇOê Ž=†SÍ’©DÔÊk 0f¯ÕPmws-eö¾FÂV 1½à´ 9¼k—÷*á´©%!#µOz'àϤB[EFRo×AÊw•+Ñ> Âã ©€ðÍ?“b8ÇLÇ_Ù$LV¨A/7ðH@4v™Po=2¢[|pX,ÕˆYãK:±>%[a:m8jÌ^ÒÆF𚈈7QeVFÅ"z<€èÚ 3!Ý$)ñôw]0VMÿGо,lrÎMÙ¢|Ò°'K‰ö©Ñ¤¦–JSOGÏ$ZŽ4²?…¾šÏü/ê–'u9òørgˆö{êôUƒ›Ï#Øv<9I5/Åy©¤ü@ŽÆ%ãÚæßæ„N‚Ój/pž³ŠéÂ"íbÉaîcY<íz¯sÎ.Ófw@Ç{0›“îþK¦]HWZf¾†t=ÉåÓÂÿA÷ò¸n‚~áßÃa>t˜$SmŠ”Ý¶i‹ç¹cÅ\³÷Kglا³ßK¢¾ šÿ¿Õ±úIfŠîb“¯Cj! î÷³HG“J™öØ[hôÝø…šuN”(¯‰© R ¦ÿè&íÉMi!KE!ÁGÄ':ëÝ»Ji~ñdHÍ›/ÉR“0XXÞÏÔ¸›Ÿ?Úâ¬Wž€Ï2ºåp²÷ÊØí´¦1ˆmEÖi®ñ¢€­<-5Ò‰Ÿ$+–Í4ž ªÚ@÷¡‚¶µ+Ý—pŽXÜ^-"Ñ>_£ó³¼ß¯˜ÞÂôãÈ*…ù…s_9‡OUuyô"fNËᦀï°ü‚Ã#ì\FDÅ ¬gF¨<‘æÇ˜CºláüÀ`OÍr8•% ì6Ì5³úþ* $ ]Ì0² ?"˜õð©vv ¾fÃÜšÚÏâür éE¯Á jauÕé¢dÇ–ìlïî¨Ü›DÿÁ='Ë#p RÔAlSód9>Fí×íà™– æàÕ~I èŠÝd½Ò°ëâ×?¦¬ø´€Ú c~p\eª½R;ˆò/#éÿ炜~KÉ€É:ëá MÀÒS9k»rh½Zî£V¶ÕÜî^®48‚Qó¡Ä&RÄŒÚ"¢,¶ð$æšDÎË—TÅ;5.õÕúà½~¡Í¦G¦st¶BDâžÉðÑ8Ò-[b²l?š¥ö_%ÝŸ^´Hž£›E3ÇÅu%WÞ!ЦÏÁ멨g·m¦ä$”iõ‘ýM9è“d¤=°ª z‘úæÎ+Uy—ûÄOU¢b+׸±ÉõÑ&I¦Fý–Já±³[F¢RÄÞäNt&ëW9òNŠ9”Y}³¡þxÉ~YUƒ"ðäš Î*ÙK-&¯§qr>?R9õ^ØfÉûJ/u–QÆ¢ÏóbŒß8ð]L|`$Å3é0¶K Ÿ±¯°_¹ÊhgæïõZw,S‘ƒY˜~Ëù‡ãóxà)÷=TÜ„}<<ös—•_ñÊNø­·U%]c}n¹+ýº ÿ(²¬çèÖfê›:Zk£µßãPDúK=ŽÙVœ`éŒÁ2òèIgô©Šg³6Õî|¯}Ñ÷M †”aúsÏ"]‰Îù~†Lƒiêú¹M—ðVUØ%—+uOg)Ynê‘! uÝdS‚¬ãmæ +;HÝõH_’dùú’ms.,&{ èʘRoO—ïÛ†,^ñk9/Å(oþEÿ%5à?ñ‚ºSjž²ß-²WÙÈlFá°û2¬pÊ”bæëH™GRμ㟫Ôô°ˆ’ƒåUp!…¨Aã(€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n019024l.pfb0000644000076500001440000011414507056046552016424 0ustar fnevgenyusers€h%!PS-AdobeFont-1.0: NimbusSanL-BoldItal 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Sans L Bold Italic) readonly def /FamilyName (Nimbus Sans L) readonly def /Weight (Bold) readonly def /ItalicAngle -12.0 def /isFixedPitch false def /UnderlinePosition -111 def /UnderlineThickness 69 def end readonly def /FontName /NimbusSanL-BoldItal def /PaintType 0 def /WMode 0 def /FontBBox {-177 -309 1107 953} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020910 def currentdict end currentfile eexec €Õé ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>o/ᄃ_©¸ºw[éB[{'ƒÅtš€ËG†2˜Ì•Ã>á¶Y¬x•ñòÖO©¸¿e½;i§ÒŒ÷Î毊TE¯{j¸vmÐ/@ɇ a9:ûr¨¸uK©Ù´¶\fFJk¯Š“ÚûD@À%öQ{𴪣 ê¶Ë­Š:ª´J4iNøa“¦úí$Ž­S±nz3‘=‘D²ü©>œu¬ËpÜUÚ»[„ðºy;äT)SêÐè·{®@âHeQ²å,TæiŸVó#kbš²VÆÂð?ß÷äÅŒ­%ðY×–÷Šgnqj"cßã”ØYùs=„‹óiXncƒê áઢsŸh”Š?òæö:H¶O1R–û>á‚“•ià3Œ«=¿ô6v´V7½Ù©T½p ûËaDÅUˆn5’ÚÀ€ø‚—%#2Ž:30Éë<袓ŠÂ5’€ÜÇRZª( öŠT”Ûœ,„Sþ5a­ÜÆ·<6àäúHŽ-3âÌùÈi ÒŽ˜ hA=Šuf6ÚúH ؘxŸbÌL-6ÅnH©‚®Äo VYv¸i‰z>¦RÝkŽ£GÍKú4@FN—JK¼Gsi0ŠÆ{\ T°%eh·´åÔ ¡7þ™§ÊÖè¨t‘™ ¦›àÃôòQ¢cBiÙœüQ,îQjÓNZ©›1:¬RdðåƒdnB‰ôAú º7ðJ….ý øçþERVÕso±Ùµbé%©vRâø{}Î8óáÊß§‰vNHPÖéÖ‰ck`ù îñgmÈ­Ô Î+ìOç'3¿üe¯Jx0ÌüÖdt½Eßèr½ä7ŸŒvû@Ã$œ¨aÒñ›R!è¦@OúíÀ„ÕáÏ>öþÞÒ\§7@?´€;Ö5À\¨Õϛ̜õ22EK‘½)9‡nÕK!*6•1ÄóŠVõœ´„¢ù*iÊÓî¹r IVnß7î8Š™ÂXÜÞY˜åØQáÁ#׳"àjvcAc¬A[˃=#Y”ZÀ³!ÌNÐ` 4ÿ/;`PÔh’Ž·/µ^ ¾ !ªÒ@©'*ST‡ckŠÓ˜¡œºš+g[{ÕûVüük®°¬Ææƒ@.)³wõÌlÖx:û+Û#DYCšáó7ÜAн´F$;vÔ(çÅô€Èó}ŠWYvµkŸÎÉòÞt$Ý…Ï"ÚkÕbêÃÀ¿Mü½ø_ŸQãnMO¤¶qíy8ÐKDŽ䬼:J7L‚8\=¯;A¿IuIý$š‡"njÚÊ9‚ 3P‚cëÛ¬qx¯žøA°Ñ’0دy˜=Qv›‚׺ÇϽƒ9©™šª5z!êæ6Š5þް=¢³ žò.O% "ÖÏ7§†@`‰F““}Ô ƒÃ]vÂ÷µ¼-Èi×óyÉ¿1[ËÁ´ÀsŒ3µMðŒx?êsŠñê;.»?>¤.øÛÃ#˜?ãybÈѼ¿ôÞÜ•jŽKÂxW¥Q`x‡îWŸhä(ø·±Ø\ÕþpWn¤#’®¬x•ûY+pÙnÍGî[1'œÒ}ÚRä{”1C!ÀJènùªÎ#´¬°a›˜ö^çJkÙcKu™6/Ü›âb0-+B{…ƒ¹nz{b­æ¥R„­vŽ{nJ­÷y•–mù †j\'* ħ³Aß?Yj¿ëQþ™ºÓ«=œ#­ ¨Ë¡,·'@hž¶f±q‚¨yŸ»Ø$¿ÌPþd¹Û'GdÅÁðÀ©º‹<åS‘âir9ϵÙpG— ~'·yÚz!]‘‚|±aˆ“·Šì‡CßüÅ´ [‹Ž{Ô ówŸžÄŲd\f˜¿o<=øMºqc˜”—?†ÝŽ3O°Ü#­(RñÏt+¿*˜iô[mKvÒåžo§ŠOðëÐov_ö€¡«ñtVDQ ¨]²ü1XkELÏÞ5ŸþÖ®Æ1áðkŽqüì×Ðx³”¢\:¥ˆ„—ô ¥d6juMo©9~1{DÙªA”^™K¢ÝC}ä^D%³7ÚÚ‚©*ûÔ¾#üåÐ/ĉëàÁSÁ°¼uƒœ&×Çû-§JSÒ7^/7i/Æw ½ 2&é+zälú‘ß*šlHÕ!G½S³Ùm ¨ø¡š¥P¡úŸÑo€íP– ¨,fôž Sˆèe€Z\ë % ^x4Šéø^5Íî ŠS ûÎÉÝá•£©l£­Zâæ >vfA•åWO]¦ŸªÕ%|ÞíшŸÅ»öL¦¿@ðê7# êÛú­xÏïõÝ«Òëþ¤u‡Ü}@0ã E9v**#.½]™ƒÉ'9nxáä†/ø|%­gÙ)΋çíd… ¤¡B~÷êиÐÃÖ‡ § SHTdŸ¤~q/¼‰óIM¶"š‡SάÄa³e´™¿Ûnh„ЃMó7;Ž?òï÷Û71ÕŽÚ¶ šÛ]>2KØ L‚>Àl=B‚êÒt ÆØ”=þ#‘³9élžÓÔœª,ë$F~~a³Mäþu¸º'j²Ô*ÝPrœü›â|×ß7©µtf͵£Ë½˜­¾œa?‚¿î#~馒J@‰ ‹¹aõph‡.„øÐC©>(ÚE:P˜’-õs»R=¸bJ8Öù­éž=‰®"_•Oƒë_åÇ>Û UZæÛþ ŸOZ­Æí…õíàgYŽĈnHÿCʼÎâþûBÄEE›Ú9Oó_B SZ…k U"32ŽÑ~­zÞ6=¢†Ü=| ›´½ñ]§B‹ÂO@t¹l4ðºñ©-ó‘1iZÌköúܬ9sP•£¿<í–ôàÚ@¡ótxÙøFIi5ÑãÒûƒu”Œh;Ïät¥3µZdî¶ F}Û<õVúÖŒcIg3E"•fZà!õQË¿ë=É™œøað0˜,AdˆÞÿdQaR‘àådå.ˆ-P© ¡èS¬ŽåVjy2-ða “ù‰Œ*]ŒÕ§3fžŸEž¡sáJsÃñûüØÆª‚6h÷1…íGarø­ ð¼ £öP}Õ¸¬Ú,:¿+>’U’&ú{ºè8:àŠ}„Ž^´ª_CG.…*ª¬A¨B$eÇßò“˜Ê¹É±¹±A¨û™ÀaáyT" ™èžõW¿¾ äÞg²Õ,õM~ü`ÇÈœ p÷eM¹’#T‚pý‹x[:zÌE½ tÎr-¯:äÖ¯­ýÂÑ0ŽŽ.øºóKÍ}4­¸,ü?{üDû飋Š÷gcŸ]žG{ ïî±3JCø¯H?›¼B’^Ô6Dÿí}«ÇJ¤TùÒxsJXVc˜ Žæò΀8 #“”ì7 Å>X{Èpü3þ|VYa qÜûCV«_/8×WçdJ0°æÑU™1¯²ØjödÀ¹ß†„Q“ëä®C-¸Ç—aUàÛêAvIùùØù >“ri®Y²yIjðÂÍIÛÊØ¾Þ—¶_Ö Ú‡ì$ÚŸ’»2aöhM™w/{à™%¨uÎJgš%à.¦Åÿ? Þ´^Ò_ô™•á=üœN$ ça®M­—ëYê^î¾jLks`„¸6“åe#i~4ãñûŒì¸.ÕzFÖ‘TxUoFhp(íkpr1%DF›6>g¤Ìý#T¯>Ü7•F×'-](·Ç|†ò½•n°£]ö¸>H·ØÏ ›ñ Öyý½­ÀáÎ[mj ’þ,í^Ò¦*©AOâæZ9Á¢Uj TûkëÚ¥Õ¶Uïæ üà^dYˆG†³Ÿ¥9Ù-tnÉÀY/™\cápý?s´ç4÷7siúº#×—jÂWºVoÏ9öu¡ø»öZS¢â:Þm ’s_Jå]«ý³‹ÕEþ/üÕÊ?ëÁrXNáiϘ}N 7ô¤E?p­2ô—Ã}À ˆ¼ÁùÞó7×MÛça{r‚¸91t™ÏQ½Q°™\ÒíÙ%}иMêÚùZ-Ç÷mõ•?ÔTï®^¸ˆêü{M­§pˆ7‘´#d8!¥“¤E¿t§1 £ø[1F£•Ïa`ÅT¸ Z|lÓhBŸÜÜ¢.ö­WÜB¶yò3,ƒZÀ­ZYaß/¦ð^w|ò8Nüe¸fÇ|Ì­_¢Íž5˜žº»t>“?ù¢ÝB“ˆ ²éÊZ7M§iÄžÙÓöI§/ù{éy'›Áæ g$‚£R!}}âàÆ»y–Íßû¸ªr2–àF?~âo.ŠÄêšÔYI¯˜úÀáÁð¯d~h­´Ë7-ÐÌ"Þi}YêÈmrø…¶M¢7wßv-ÏoE”ð™¸ú6g ö¾ÐOX·rþ7Ri½_³Y&ê­ÙÂå¨ÄvAl©ó¤$ÕáAÇ óC@Þûð|ù1iÔ;ÞvDà ¨è«J+¬q[—® Å{²F0BË4±U N@„b’¨DAZXP–+Vp$´+Ér¸å'è3i4ƒy.M' a`O~™DÓ„RXÿ ‘» FÒ·>Lî%¢IK#ôs~Lˆûš#¸»JFA=LØA„7n° &5ïK÷¡t&63qC>ù¡ùǧÏMeÛ"Üû_í^›Ò'^Ý^BÓÒ‰v×õˆ2)³ß 0L+`VäÉ¡’®¦1Óñõ\ä³þ¯Zm‰ˆÑÚÉ Ï o /o /Í øµ;$¹°<ô³±ÆX[ïr!2ö,¾; åÝ¿uçp"Æmç×`É0!/re‰ÐðBÜ·ƒBDDnQ³t²úŠqÅÓ~³ÆÎ7I’î7<~ÙBbVˆÊolX ¸aì|tŠ@AŒ§§€·œIß­†‘CZ$Ïõ/â~'Aiܬ` +ž|³ÑÀöýöý™[Uƒ2ëÆüm>ùª=)å„Õ|'Îrkð(p§bSº _ç¿ký,ËïCž~μølÝ……‰hûë`ɱ(Kòn@Gž¾NݲR*ÔDg&â ~[rœÑR`qƒ «;OÀîF‡Å|jfl&þAƒ3ôqE#üä–¬ÅÓkºIöeF '’î"{Æw´ÏTͼÁ•š µD¼ÐÓYe”ô&J:»êô‡²¡UŽ;Ùÿd¾ËfÙÔç%4¼b¬?Å¥“´s-9†¾î›¯2*ò%n •õ©–ý¢M‡eö®N²ÐJã?¢ øÒ„Žš±˜˜«% |GaÊm]2¸†‡ŸÙõ@'ÁX)crعö úçW•BüËÁ).Ǻ?K7KþA1O¥/ó Ög¨¿ûyDE3#¬¾®zS ^šõ0õ$,Š›îÍIh’”d«°Ý£G6×8=#Tj$ÆüšvŒìõã¦cŠPá+žˆUãe?)§~'\¯˜VY0µlžÌgï+ £N…ƒªa³ÃŸKzÔ§Oª"Ô¥öMßÑŸ|T\]nYÔ}åIõzä£ÂЈu• l.«€R÷ 4C ¿KZhõßqü`ŸâDž&X·AC™&ð+Q­þuáÆ°êVP|=ÉÝ—ÒÅ“I²¦#÷W¡/XaóWãâl§Þ¾6¨Jƒ¶­÷Ü1’ÆPü×Ñøt³¢ ç.º1‡¬±P ´3ñÇi‰ÞŽT5`š#Uë|Åu«v;fÃp¶ï#“-¹Ú‡ËªÏ…ÑÈA&l+¿„Õ³o°¢ˆÄðO4þÔ.Í{Řç5UbÁÜ—Ö8ïjÜa2æ¹/άO ¯f¤V¢Ñ8Y61âMô€€Þ°H„O°âé7B¿õ\èÔ‚LFÀ?á,I4\ÊɢʢƒD?n—Úy–8c¿zɻå‚×¢bY¼ÿ—j*Ü÷ƒ©¿É¢ºÄ³öv]‘Åd° øW«úÊã$p[àu~’Ø-ß§1ð´Ph/÷&Ø"àÑŸ ù®ÙWéhêlÄý_À%­3Kùm"P^ÇÁÞ¸|•Ü#™ÿƒ]c$5E°vgß66ÄõÂ!£f0GÏ“³««¹–[‡÷>‹Ä‚ÃåEØÑF‰×ºÏŒj^ÁñöýóÙ #+V Ñ&ÀÒðWdæ ¡(/G«É‰Õ+–ÏÙõ*¾ 7ZÄsÀE+rûÚdy©÷°?>å()_=A¿Ù6Ï Ä1–Ò˜ì䬘K7 Á",@3F¨¼ýFÎÊù²‚ÓH\§X"¸i6ÓݺE¾ÚŠ’6«i;‹°2Ñ ÇvÞÜÀÁIv €/Ï”.{¹Ž½)UNÓ¿ÇaIQǼöDáf]ŒD2¯ü¿·¢(¥„Ž…ˆ~ y\7óË !¯ñ¨«òÈáȃö1ƒë‹à¶íšp¬Šˆy†¨KßXÆAÖGëçà—"<²5ùÆ7æ€õ=¿‘@~C(½M'WY°v~28¾ôT!3áeb qÛ«é.÷q»øáßUÄ-$M¼ªàÙ ÖO;ð,bÛFý­6i [gýŸ…˜­Ou柗çÙw]ÝX}ÜŒòW#Öh½Ø>$Ï…\ŽŠ«Lª,í³Jæ'ûCä8,›ZÛZRnþïÔN¯(pŽö)êjl²=´”SÎ7 -–†ýq6SØ9^’¡Ü;X¤Øð¹¤¬Î¸ˆÔRrQAÿzæ}¿Ô^™1kX éÉÔ ›ÝæRM‘€Ö·åA85÷2®P87Âà!ùx½d’÷ºa øjBRÌdaRfø‚`˜éPà Ù,ŠëBmR"E« è<ÑfòD^ ¨±”ÙÀª •PÇȬ÷D‘k‘7E€`Q®.ÙçµGi³Ãޭܨl?#›?Ý´mcCûêôA5÷ï^¢-;æä;ª+ýŽ er›¤býeøå¼YaFÃCÌJ=1\ ø £xœ5÷Ö¾÷êíÈú’íéÃßOž“g9Øó¾ÍD^I ½z;dÁꂽDE§Ò)ÂÛa½oPÖÃãð(\Õ¤€¡É²1v.sþåt¨³Å»ì6²½8È:)\E±#¾W†2€‚âÉŒ‡Ülo‘)cɲXLáIÒ‡'‘ô ä»(X.’{ ¸wì¤ƒŠ£^î’W¬cÎë0ý®Ik]|³VÂCø²JÀ¸æ+t¤f†de­ý-Ö1° wÀ}Ìc¸¨Ïv”uP.¢«Ä d¤0ÀªuÁ‹Q…,Ž¢t)ÎçZH·N7; ø‘68¨mHêåbÏYqáªsy_­ê „qú6bc2…óóŠWýèA<´²À96^~ÿ>•Qì>`•]Õa3Ô}\ õÊSl³)'£oõ»’©kjß¾¨õj+ÊH¤À‹"™žÕ³ság˜r„ÿ÷•ea*QõP¶VÓša¶yí'€t”}]Áï'V°De›¯MyÇù>…tŸš-’F6€ÁÎŽay#‹NÜf›ã˜„•~Zã49Æ„ êËõ"ä…J'Lt{k¶>¡Çz$Õüé¹G)m¡[`dà€W뼄µÿÜ“Íáyæ8ÙZ¹Þ;¨I¹«+Ý.‚»j'*‹¤ØãÓùmt°üÑõAv·ó&VµÃõãd…µß>Ü‘Ï6TeÂsB½Í½½â¼®kæA²I©~¡ ~á©ia1êõi»«ñ6r„- ~ÙXáÈ,r2ìš‚é_ôã6û½-S¦Ó5[½…Öma`òD‚¾øûëò{a˜‡-ˆ /6‘Ùù¨"?{ª¿ÉY ²_ëÎA§‡Š8 ?ÌåÓ)¬V+ˆ™‡ÂŠòЖü.äîë¦059[w1JûÀ’§Ú³>z¯}Ô”j,0Ö4ð(r,ñš;9TéÄVø4œ$”dÓâ.ÏÏ/© Ø´·²’¸º ½¡µæe-já^MJ¢L¾ŒžÞÏ*P^?Pˆ2—ØMˆÛÂRs“ä×õ¯Rk+ôiO-Ñöà]´â]p¡eÄ•l×=ƒÀSòøZœ¥§†¨ÍžT ¸{»~Êk™/ƒ ƒÚÛÂÙà¶F$ÆÇu$Ê:æ;vWÅŒTð»—±ÚyxƒvNÅÆ’ðD~^ÞøU:}ÈÝ•¸úuœü5 š¬FßMé‚yí}ìžCðÀ˜¿ä¦ó¸ŒÙK½ý ›BBsóqÆõ…¶!ü9ö«B±÷MYjô4ŠmCÆv®ÕÈɳ³õè¤ò†¨¶jå|ÔJ¢ñ·z»B\T-ü‹ÔëH³55à>N\¥ð%Ab_KπϫÛ{‡šYÈØªœâêÕòUJÅ©‡â+Œ¤‚²æ¾x-ÅîùF‰v‚³Éì€M6Ôkn& d¨”ªiW¥×…uÀ¬à8+(º”ª ™ˆ>RÞ‹vçíªŠSc‰‚ƒeõ—!»f‰Å+ŽFëæÄ|Úã@$tF°HóH¡ è;Ad¡Pf÷sd;— ,¸Fü“–U”à6OCÿe¥\¢Î5qŒë¹£µ¶ÊndDÏÔ–3Öh×öŽÁVSp8HS™+ê6hX»©ïœöäfE//‚z8ê1%èNÌ%„ÿôg®‡K|BNLûŠÛÑãù®Jâ#U‰-¹>¼åØèëŒRu Ï’”øê‘¡nšP¯86 ËÚKÓ¿Ø_>èËk²õ0׃» / 7ûE º©;ð.fUyʙЄ!<0üâÙ°øþÅUmwrX§¼!Cž Ü)oYühœºsijÐìuÚ'ózA¾h @Ï9Û‘ÝÂñg¿í.Ebìá&f™ÙE¦âRCX•Žøã¤E…xÛW5˜ÂLyO ݤšôKôÀáÀÒl@–›VámD 2aC•;åv‚Õ¤ÝYvDÎVth7\ñTerw ºÌ%·Brˆ ‘¬ÇÉ´¹…Át>¥Øöã6>(È«ÜÇ/WøÁdm£H …{~/âj>Ëß¼]€è/·°N_ûÌ­§Ÿn;òé°¨a9¬w¥¢-7F½Ü9ñ®RMyÆùcØCŸEŠÇ^Ö$)rIíÙ^ ßñƒÅñĨ?º,Ê1òŠ®Ú¨Wx_t¤eå¯-]RtQY}RãïYÜ^ï3¡b½½Mñ¼%žö¾qÝœ©‘‚å Ìq›öR˜¨ëAñdaHQ øâù‰ Ä¿¯š}eaêüÛé Áÿiyîp $Ö˜ÕiîÂvã¥sPèr-˜}÷ÅÇñÌíÅwíÖ0( †ÛÊ‹Sóà¶q „“=g¦à×p¡¸ÚIMÌ¿ßÁɎ憴¬><¿ñjVœÂ5M{r\QkOõîp\¸èå_¿Œ¹J €K©Ž7óŽkŽõ#käôE²/<ï›V–ñ Ëwwíú0δû0)­ÏåÂÅË-KÚNüuËi¸—I<5 ‡§4£XîqS3–¬Þçh/¬¶C ¾4„êÌÛÃʲ,‘«Î*wˆôOâ`SPÍ•   Ø ÎÐÆâˆéÆmxz±ÖϘÙv€3Äßd¿™î….8`\‘1'~ƒ=0>ؽÙBÕ#$å|AqÁËÏV}ã»äϯVd¼µ§c¸0¢°¢#LG†DØÄŠZ½†ËŒÞí€xŽ#YÛÑûq>æ3§4ç …5VDL#ð{Š=Óû^,—.Ž è¬no*ÜñØg2EÓ·“‡òe+*Žó4Ã"/˜Ý+"Ïû×Þx\áu¹!iàa'ó(_\£[GnÅWyuàEŸÊüHý6ÓÎSNä7èÌp8¬úF+ [AǤ" Эf®û¢ f‰l»<äáÜ>")§à0’& à9z°Ã¹„«ºKi-ÎmJþ<ŽçëcÁ ª€ úh1yZË``8pX7#Ó–&ñÞcViò<1$°X¬lÄоé|á]÷ðÙq§ò®zSÿ÷å ºæãÿ Ï'ŠOshEã!‘aS¤É±€”f¿"@â§Å>–à¯è5z~çç[;ä8œ1ò½M7Ÿ›}qº| ê4çåÑ#¿e?&kb\rab¹ ŠC¡ë¡e,* ïèÃèæd,Ÿ ›Ö—œô|‰SÍTàB¥÷»¨«JQ Ve5½7?»kØÜ%,6ñÌ+Ì5A"}øöôŽM7ÔÀçaŒ-¤´‘Slïaž9Ët_µÇ経ŸÉ$΀Wì%|¾3f f„ÓÜ${δ1š_œÛr]í.æb øR.|†Ÿì¯®L^>Í•^Gû-XÕmWèms.Œ¦Í‹?·|²œ½(g*Udvù'«:L¥#âÀœãOVñ´^»?ËÈýCZÕ±L€8(õ¨ºÈ'Ƈ"î…åKÚצߔ#ýøŒRì„ÈŒNËGÑ(]÷F™CA£~Åû0Æú£ÔË^2tôÁwd¬=UåÍCEঀ{P=Á¯ÿ0.ÎCê‡lÅ Ãq~aŸhû渄Ɗþ0¦ÃòXɔĹm@CæNLe:¼O&î‰äó<¶b93ižœlÀ‚y)ôå¾"@©<¨;Zºál§¸îQû’„~'³ÉðËš&©:F\#=|#qŽ:‰C‘ƒÇ–ì¿ærun?˜Ïé¡w0˜„yËÆG׺‘Ý``|ÃY†¾¸œQÊ]\$Ó²^<ƒOtb‹ö®ZÁsZ#¿w£û­ÔƒË‚‚%Ö!fY¨ª=œÍi,¯ñSÇ ª9JÒâü}~ºT%«Ç¡F‘’ü-ÿlA¿¢_¶Õzt”~%ÉŽ’—“AXŸjNd饱ÏçÏþI³`½Åý‡B ÏîE:Žs]3‹:Ã?bÞŽ‘ˆi-á5îÂQh)¾Õ Gh9˜pwÇ8\:wÞàæXÄ+aÚdNÚŽ¶µˆ>2….š 7üF4Æœ ö²¥ý¨³ú œ€-J{|’á°^}«DAa4ç+ÝãûOœÖ à´dìÅ|TJ¤ëªÉv`\MT˜­¸ƒâs°x3úph6Wã*^¶ #+<Íœ¹ê횆A‡€®MK$5rµ¥yìˆè¸³PYû|Q©F’ÞqÔOXg(*²õÌöÕŽU©t66‹0Ú<@WárÛ|³.ÔV÷:rÓS·®ÉR›˜:ÖÍãªx÷ÇK^Ôc·Èmhœ,´ê§5•åïŒq½Y7ô IHÏ8¤^¢CFÐÍÚRÄmÐ lR-:3Pu`þÃé1#l_;/¢q¾¨‰í¢‡‘žë+:žÓ“Ï0~@"¿ûªGÅî#<˜|+·qc¾C™Ó‹—Æ­—¹ú¸K“ «¹–›úeŠÙO÷.ß3¸oÄÐtoùáxS0š{?•l#Z×+Ô‰}7¼œ´Ñ|koˆÊwhBÂeÙ? ’k> „ßè©>Þc¹ Ð'D6ƒ yŒ§M^näâ|O<^O]ÒÎ C€`#• Ïí’@+7ˆ—¥ogxôËæ2Òqü šUŠF–åpa\å¦bš8ö6ÌcêYLÛµšN8Rf‘@áöv•¯+<à{„W§„t|[“xöá#?Ù”å(ð¸ýX²?®PÕîô@ÏEu™™„A/ýìñ.¢¸äQ<ò,€‡êd©‹Ê¹­g»e>q»W†cÕáL\‹'K’x&«OYì&ãh’!ºŸ7IÜdÌ€Ù”I›N[½xØÓƒ¶©ÛßÒæÝ°ŠDû±§YÒME9³¯su¹ôGG¹ãZ“yÚ ï4ü=Å|KøÍ½ à†ï‹"=£Ð=%ؘ٠U¾ä\ž¦W@×ÎÝþùáCJÔ~¶|krV“43ÞUy"lë-{ø…£C£zâ|ݦT´ÎwèÅ»O”F2÷V5SÍÏ{‰³'&ç!àÛX®€4vݶrÀÖê¬>Ɉš4­a°_Kf6øÕfõÞ<µ'p*«›{È÷CÇýþfû¿LÉåOhì=3ë7…D¨8–ÿ(‰:輄f‹ \1Õ"ÓOʈ lóÀ«5fuâ-àìâɇÉ-[ÝÛÓ÷ús ¢)¤~T“®»ù6æxùÂu›l%uÛ"ãcÍ$9—• ©鬌òÃÇ^" ˜SŽ?XhöJj‰ß|ƒ2‚܃É%æÛÁ0ˆÇ¦’Ù©œ‘VÅõ.ðHSøxÅS×àN·Á¥p¤6eIA;öÑhë^³Ñ˜ÃíG8æÍÞÛ¸³¬LÚ¬M{“eÏo¢z¨|ñ·J Mû«{¡[Ñ‹&R;ÅŠÿxïo6" úZ2V£š±çÌg"À6Qð*aÕN€ž£ò%C>.Ìtk1ûÉõÞd:§‹¤mšè K0óëIZÝ•ƒæµ¸l{+QlhAÙñݶ±ï`¤ÐB»túO Ð ‡Èf/êÄzM‰ü&.s·(ž&î¯þZˆ€0æyf×\ÒQp$/SÅ2~ OBävI¯¨-~¤¼QùÑ{J²Ð,=$MÆj¡¤ßQ¿ûWGýzri,àc¹]¸«9±$oTœ–†÷#ÇOlšÄ¹pEB<]°ãÕ# o°æ„³¶Ãt°aŽMt({<‘ñW)?ê¿þÊ«"]U.MK«71e„Ÿb]€ãÞ #2ÿÀ»ôöØ} C+v#læõ6NåÇ{,É/0ºÌçƒÄ }¸~ILàµd¾¾/ó^Hl^j¬Zá“?÷5-H6ìzÜ~'Å6ç"Ìš+]h_Ý&ÏËapLñæê x[øçðÆ”0çQ‚àq*Žƒëk7ø]9‰ÜsõÚBYn‰DòŠ4ŽlYlèÅò®{ö½þ5’«§ш€¿Eæ1 G’SŠŠë2¡[ÕzÆŒ·¬Ãe㢰ϾÌöÆc¼ð °»9¨QgrÌÊ›û:cÓ0Rmf5GwÕݬ-!yü±WÝc¡Oç B³,£8‘ä[¤!†f¬ŸÖÌ‚?¹æ$ï›ÿ yÀbÛ‚€¬$&‹;þù1XkELÏÞq5ƒÖz1um¶•…gýÐ$"w„Z˜æ‹Äš™LëÀa‡Ä¢öv€ùÎVëK4KÙ ¸_ø*HÇø}ÿfBΔþÜCú˜mýâ–fõy“üÂu*utÏØçÕýN°f…ñ¨â\5bŸ¾¥‚ts >v< ³QüBIÂ.(qJé)‰Ã‚èú•ä3PÜ1š¨?¤œ–ö[ðÓùœ²À5‚%@” ¤‡†IFǺÃI(~ÅïN›˜¸µúÑCk¾ºXÔ6ƒI½ƒ À—pêE¸vn¼\àö8hfJµîü{‚uë—àá8l”iY•Œ_½J´7+$J²¥î:,(6uôºÀ{þŸêüMÑö9ŽÓM°g¡ÙeyÉx²Ë0¤fôñĄ́ÙêpEŸ©;/½ÿò&õ‚ & }ë§ëW£Z Ž}pCîµéÚÄÕÚ>+e­ÎíÎÔ—0I;Ï­b p;Â"ÄiЄCéÌÑZÑý!ÆŽ9‚ÅXöûäö‚eÀÝÿ¦‚ßX{Õ4ðí]ùˆ¿Ê@Ç¿s…É“eê.@AšÊo—ØÿÕ¼¡î€×oî°Ë8s¶˜óH}I#OzǬ—Ð+ªñA-RZæîìÞ‰K¼¨±zpì•»Éb`Ã&“±e:àònG’GYË™]°Þµ9 ˆÒƒ>nSSï~‘AñøÐÔR jÖ‡¬0°kÖ•çÍš¢Çô7Thz,Ü…5ï¬kíN ™DkU1µ;w¶‘ЉËûî1ž«2¡îÕVs~K°=D`õ¸þw0›X–âyö¯î&1yqHüÉN¨mÜ䆟–{$m”±&«®-•­Ñ‰43®}äÝ x¶¦náƒ.]6¸0“@ŽoËŠéôƵ%X1y[»ê9ß?© ºÃ¤îU,~×áõ§ÜA©µ'¢IV2j†ÃoÚ²Úk=e^þ«¶ ‰ý+PïÖˆ·a’_ÙOf(ŸÜ­ ­êEÃ(›}EËy«ýHûõ˸ê¿-p;ã‚o_ÕƒÉ*‰LÉÝ…4 =cᆚq“ã`F:Ü }ä¹0Î1ò·9t€Ÿ1CæÛÿqìêúqÛ÷UŸeöOa­}™11âµÄã&ì3‰µÛát(ï—èFyM½ƒ t—íY‹ZðOÏO†\‰ruøØ¡þ×[ÌñÒ!é%i5û«:°i>÷÷ØËá”Bâô‚‰q‘öwA«b’P9s[àJ 1”tF~j¥uëMñ¸³·ÞWNW~fHcåBÀ"¤E£()>Nx‹­fP¿¹¶È§u?ˆ`dz:£fH½ï£“$tDcó‡1oq\Û1’Ü_í.õZ2ç§7º¹30:}b)>9ö3à$Éß‚u›ëC~NÞÅf€9ë§#Žô÷™‹hj†¥ÝÙ‡.M»„gDŒ¬>Bß„ì¹*`0¡=2†gï—ßv^ó¹£ò¦Gí îõšî{ȃž2ÃîSÚBWHn:Íâút§ÎƒëåOý8z“ù³ÒXeìÁ¢P¢Ê®‡åJF[e´`ˆJ§Ë…|ε1É7í)“:¯Á}§x  :úÕ7RËa•ÿêgD–Èœ„é)òï;¢gÝñY ô}Рi¹küf¹üÛ ï™1Mx™³ÀP]Ñu¨6Àµ™&ffLîÅ ´é…wÉ‚—L¬à‡/ÁXÎìâ2'ˆŽd…tõvWx½k¨Ã!Ž–;ZÙúg¡ˆ#¯\}盡 ¡æˆåœ:Jšl^­k·¿Z²¾§RlQ…Sr PKë¾)?Œz¢ÄT˜Z¦bþÿoªîþ¾|m}EˆáF;«è;ÙÍ4ù\œ—v3ʶ³d™²_@~b±ø©}Q‰£¨*º,¢‹Œ—LòÂÞÑhΊ:—ÈUÁ,QørÈ®3ê—¼•ÌŸé<—š2°^2n' DîÅeÃò船‰Ã%U¥bºóŰB‰›¯“TñðÚİœ2Ë,f&yÖ¶’\a[ö4ê\êIV¢Àß 8ð¨]ê·¶ÁV‘øq˜×¼íEÍ"öŸÈ^gViJ@ÛL›òÜ9#D+›œ= SPØßæFò0^Në¥a¿…êêåM{Ó­%n•ëj©*¤)×âYZl‡©”RYP&ÃÛYÓëŒÁëŠkñ‚F†1f žzŒ/T;½µ¥…’(XØ~‡–#ç/ò‚?°&(e«+^ºŠ‚@£Ó†N¡§ªt:˜àžjm×áÑPGd¨ >úHxA™jü!O¦FJY1Õrcÿ«ó2Ýp*Äÿ°¢‚u­9¤h€Z@)ú;òî?üg«înWÆzM•Õj‹&à8á-åK¤Âù+ÿ|P,ZÎÿXJ=¤öÇÔ=àòöÄ®°—ÿB:òKž$á0ÙÁ7·vêYQ®•Ê0€ÝSwÎ ý®ø1)'µÇ7|I€“Ré5y¹C-·šøŠù-;®¯ŒR*Ô 8´Œ àêDçT|´IõQ;­GK#8½‘•Îä*žU\8ú{•ü<0-RÌO²AÖÄ'1_Û.GÜ{ý¨“š¨ÚÍ3ÖÄäõôÉîw¢ú».nÑ2JwøÂ ¶!>\¥ì_ì?`—©œh:î'kó~¾Tôñý°N#ݑ̵-cl¦EœýaMÊZ0eYÆä§‘Tº}(û¥s#UO½TîÁ· XÞ¶i›;÷s(½ûe¼M-íèˆöPiuçØ1C|PV6‰{ÔÖiƒµE7xQádš¨ÛO0ÁÚE?~×…éÌWÙ°Ê Ú0ÉSá–Þפf$– 55²ùìñË^`HãÅÖúÿFÇìÇ»Õ0ùþ/;“üØémã/Nû$4éH#K.ç>ö‡Æòö+;)›)~óÒˆåséÜ‘!«™]?ýÊsgÀòÝáŸe¢'«H&Ùœî! PÉq‚+zU­n=êæ¼·|g^½tþçæÏ7”šï$åõ%ÏÍ…Ù…Ö{LíSúèa³G&ùÙ̃WðÍðOiíæúDl!nPEðR\ÃbY.Ö}£SÙ(K—_ÓÁÕôØ~¥¤ÀæÈÈ™îpM÷…qá·övÉ–Äéo⪦šŸÏݲ*ò£“zóéŠOçÒ5di¤'D²FÕ“o mèÒÝ Õž½MŽ7ªÛv§—óLNx#Ÿ5ıˆÍ`1D>ÇÞ*ã$Ý÷4ßÀE‰§ü'%yÉ:Qo+";Sl¬Â§ŒFå J;$JÅ&ý¥š Cx4Þëð‡eoóo®°xj=,ý—@3ÈÛfÃðR´žuÝi.›Ð$Sžà6©—ƒ—› „,ö¥ÃÝCÒøñ#v‰I?|½¶Ÿ… $Iì¹F&Œ,óP³ýKfNá c6C'±jÙ)^ü|’¥}~’¿xk|4púnÎd…œ$"X¸]aFðJ[áøvÉÞóoÈiÛz4G^QSJ;íÖŸ*xÀs¯Í~þX€ÿMŒŽEÍ^-ø¡ê'¸rzlEnkŸ…Ïœ¹nƒø|Œ¿¿e¤Þnx…a®,¥P™‘»ôïË“¡Õ÷m,7:äÇâ~7ÍJ‹?´‹Æ(îÕIß› (îO¬ƒÞGm°½xè²Ôߎ`Ús°1ËŽí—Ù—l÷³’‹½Ûÿñ´q©çß[2e¢âQ8šüæ"fزÿÍ{»ô=€?z(uY€™R¼§] ´5f:ÖÒZLÅWqíB2ðk7ÄWCqÒh™«Í|uîÚNÕXH9Î9¿kÅÌB¥ÄÛÌY´8dǬ…ûób(F7Ä9Ÿþ·ÏÜX¼&›¬Œ\ìºHš{ßÊB%Åfþñx KÎz8-Ï…™…ʺҷJñèrDF¬«×^O”$ó¯d¦ð ¹¶z '$ÿõ n¸>³ùÓT~A˜sF+Ó8=¨5:ï>³Û4ÁLÏ»Sƒ¿¦¿–ŸeŒd!bû“†f›Ñ›Èîêwö0XqšZ-ø‚ ¹è¾"Pð}áÐUŽ¢6`Y>-Oá;ðÝeÎ<~yBìRÜKBOÖW&ßvjiA’ÔÖ?¥7ÁŒgÿvŸðmHÇ:>9 ªm+C×Õ‚ÓŒ`9±_Ê®ö-CùJfWEâì N ˆ;BÄ º•‰#ë¹áñwÉeòŒI[¼¢ÕW96< ìa¦îH§u–º Ö4i'jHĉñòetz/$x§D#C:§zvŠ=«Î-ñîä:ßq îDøé>P^¶•£ÌŸk’ˆM’sQ^0ÊaŠd¡'¦•BZ… ½ÛÀá²ÂhɘRœA7Q%ÒëdtMdØëv†twœÛtÈæYQ·E±æ\Y'GR–ЭžTè`þêÿîe¾)Ή¥Ó•·©= Mü½%’¨'m)aÞØé9²T^ªÂx Ô˜·’ªo&¶0ÛIŒÜ¡ø/Ú™þµõ³ºn@ûHÂÎâ¡#»§pÆã´*iþ±²º){ÝZiöã£}_¶Ý µ©|" u¨š4L¦ÿ+±‡­F*cû“í1S¡#‡¹#̽s¬"-eÅ’ µ]~¾¹³îŃSbE n[&:釬ÕK2·¡­v(×Z™(Á¯4)õcT¢É¿â±x¯XŽRµYEÈEaÓÚPL×EN™Îy :®ô™;¯uuš˜ðçC‚vôøìbHãHL„'u­®«T‰ð˜°KHtñò2ù1­Þ áBe¨²˜aDI±§TˆƒÀNý‰àÈèƒ,Cȹˆœª½‡¾š` ~—έ0¦øç¥Ö«: 8mΉÿ¿×1;Ú©³KC2½ë…¡² ¥3ã–Øñ‹O3$}”ä™Bl¤ ¦H·ð0={fWÕ®ý€Ë!%8—¥˜ßî¿_zê ê´VöÐä³HG¶ÎÄÜ"êUùD©s‚ÏRAíŠhàÖÕØœ"±úܬ9sP•£¿<Ý’6ßí)_5¸M7wZQ ?š¨y²²ŽJ;ý•]î‹‹’­é£GóÖt¹¾éö÷¾+̈»µ!@Läcü›Þê ¢|ê &A€’JÿÚåÒ ^ž½Eî¤h6ç‡)•‰é¢†×!OTÉ‚Ú2H S쿽NèÊñ‚ï†[äôˆö±„K£F=Ó¿¹ƒ·#Åž$ý;ŠÖ˜¾£¹âµ¨S3ï“<%,3]ê%s<Ðqæ×ìp„@VHé՘ƛ{ë@úÔRo¾ÈÁÊôè KRHùF •}KRK®šÓƒú…=€(èá¿ ˜,Ñ‚ýžŸkö¹C<ŸÊuœSÞbIâ´á7ó¦)zK~o$M—.Io´*n0”o kP~"ViŸMʰ5»ÌѸ¿Ëm–OÃ^é¢îLNÑóp·)Ö»­;‚:ÏÒúÔíúªÚþçŽî ÖŒ2iá:èœÑǰÁˆÝo³†Õ7Ïä³!¯&Ì’ù@,/8Ta™J}GÌ­ÛBgSå$4†FŽç´œUÀ£æáüéB‡ÇÇp#‹ü÷¯<ÚÜâþmà³ÖQúþ æ|ˆ)CªXùhÁy+ŠtÅTèr|èþi½RµY[3:c W¢¯¨(<80‡õnY ލ¥§zKUW"6ÈÉÇ›ãº7 óÁ¯ì‹ ø¥§á™MÆàÙ¢W!Êlÿ܈‰ߨËQÑüÐy_ÀWHgçÐW²F»$Œ·Yåø»˜å¢“BÔÈv]=Ùg·s½0®š]>èRWc\r…TãOä ÐX×·¦$¢NšfA'ÜU¬º(1p‚寖,ý<´ð×®Î&HFfÈœùŸï"ŠPŸ®'†sÍÓ­®•´7)v³àµFiIÔ1ß)ŠvÁÈì C[…¨«¼WN=??—ÚSÚ@]˜2âRn6¥=Ô"Ñ~æôfñ‹4?ýŠ©a°5øÖ²™'Ux˜«@¹ÆK:‰Ëê¤OÂYïü‘°T ½ÏW`H _`«£¼tEÞ†äÔ’ ­ÊŽ‹ýtCеÚuÒ W€çW+¤Áø(I˜1Ȉ ¬}áËKœáö"îWj_Mþ§àѰ]Æ­9‰³¸0Š8éÌ“¹®c‚\0 Ùø6ÍãØO ]¦pá3>h¿â¡l3¢XðrD­œõjOFð&Dý*û‘"D; ¸™Dù×7ý¯/mêU~¶¾ %áçBÐõܨe¥q¦12ŸÑÈGPE‰|…U¥¡H›„ZhY&„ñ“–Ŷ¾üWtg‹OÇLV•÷ç<„&鈼¨¹ŽQC=×n ”¾Õ×È‹UßÜ£ŒÿˆZ EÚ’°æªúµ¬(¿ñ§…>¸5ÍéÂYsÈè)Y×Afl¶1…È9ZÆ—2¤žs‡K={qSOÝÛq»-¥äab¡ÖRˆ ÷@«´ä»3·ÚØóÝÜ«ç0'ô¸¶lytZAU/•÷„Ýôb3¥¦ç;›o²àŸ R_ÔI®É;Éâ‰Xn€)£˜ÚYGóµì=qXŠ jX:jì41R¼5çð3um€=ߦz>A½TøÌ¢Rƒ~jîµ>ú@ÎoÀS\ðscOà ~×q|ž·ŒKB³ÚØU“‰6ÑV¬ yÛ4ÉZ„ÍúÌ]~J¸¿VÖ<|»f¨¢N“°-Y{懽0ñÃB\A\s2v7ÿëLË ]õØõ°ý…«G–D ·§Òfsv‘,ÔŒÃ;xè;ÿ¼zÚ}ÏüLîñ%ÉŽS&Ä”Þ÷±ˆOg)2º;¬Ujàe•ûÖîBqm׺/<ÞÅ’b„rþÀKÐCMlèÑòWVN§úNqðdªïéÎAG©ÍO^G Ë6–±Áûü‡T– Ɉ㽴îRÙ¸v–P3i7?š›3º´Ét{V ³Vé; ´2¾\nG62ÍÜÒÂÇÄO‡ëJF¾ œSp_‡h¡5ëÒœSœ;œ-˵3(³JÉr)ï”~ªpé\Héd}{eþWû-óYä Ô+O»3·Ú í~øÞ·áÎÿ×U‰‘â†>ôCiiñîú¬dvb¬Ú¼Š§Ïîk!³Îq"ÈÆ˜ýù ¹C(üÈ–Ä»æà§¤AXBÀ Ýo¬»K œjµH‘‹=—_Xu½51²µðîö!¸dÒúQ¶þtŒºradaÀŠÕni†ž–[@ä/Qb›‰ ™Ô‡ÙøáXz"ëNCs!ØåÉ›¨“OÁ‰† šÑ­kÞųր^“Ü¢ƒo˜¯è¡7„•ʶx¢Ý=h‰ò©fÕ€¹$Wº¢í1•GÓ6„<ðOz¸ççÊŸ°×ð‡«ªÅ…í²NK›5ÀbÂ%&,,|-pâ±´Å'mµ›fdÆ|£ ÆÚw| ˆ ­l…G)/BU©ÒÝTUäªCvÊ 3O(ÚúG®Pn}ü›ß‘GPFê—/emÇõqÆØžÎZõx¡ùeÚØ|ŽºOì­o2YXôfjþ0¼ß~dV|€Ñ‚ÿ;£—;³ë}`­¿°?G5[âµLä•ã¾C„T¡¦¿Á¿‹+Kšöû3c ]é¡K¡é)-1œV'zv …]e¦z„¸¥ý1lçyt~¹Kütžê=îÀ"Ž„.Ë™ôçHZfk6ÎÂ/Ï›éÞR›´XXe|ªRV¶žÿTÚÂÄP>"Î[êt'I—Ø´(m!”óÿxG}ް€3Œq«‰Õûœ’pÚjþ‚{í) )ˆç†”ôÐË>­‚C]2Çt5ÉßSÞá_^Dϲ& €æÎS2ç§„ZòÛ)ЍøÑ79G $ˆÊ²ƒqKJ°³óÏ8N<ÞVéx¯O>÷G j¨óæxÞƒiñªÀk×}Îä£%¶ìº"ñ?iZ̼4õ~í¦•µË^_2§Ñ͵áÿ÷Ê6Inã·C˜ÑC¤2›Jgÿ”V}Óù³Ôô-†dõf2LÓøŠŽÅ‡W'Ããc‡bæXü™QQ*Ãè#¬îÄB¬hGò³)æÈWhò,ÌJþž|M>V[𣠒”~ÓΞ”¯î•áÛ×·¨0,d˜ì­Œ‡œ·E¤;ÿWþê&Azì@ÏŠéä¥OºPe»I&l”÷¢M¦ˆÜLKi²ððâSº®a‘T°Ÿ©;CYÙR~üÓ‹zcúü4Æå¸£>Zú`yC©¼-E(Åní%<Œy•sjH•ÏÓëU"Îù£ÑiyÕÍ8Fz©É·”‚n~õ ÎÅ¢†h;O^Zûà—[EÄP=àKøôÜî‹)\¥öl|±yWâ#>oãÁa1ÿ*:Û|x|s´^Ú<÷èØSͧΤÕçZbgj¿Q~0üRù}®Mõ­ö“ÖÔÃé¾ xM|¬rÆÞ_ä]ëÛ‰òQ]áÒù‘Öþ‡$ð÷ÿFûXMoá¾]@#IþÆ…5mhð?.åæ^›Z€Ð%·§eiµ´£Äg2Ù®<8Ú?6CÝÆ5%TðvåÁ~e©-#O¨¥ŸÀ ~GVuQì«×8€–¾ÚZë¿5ÚŸÒΜH;f)üv½Ç‰ ¶%ï8 ô4¬ÁÅõ·þjØ­;«8ÇMîs$C9:=b–ÖŒø   Úí(Ê8CV#_…mh¡ÝñËAo©Â}õÚà“«k(ÆÀA²žå!‡žO08[Ÿjç?ðj ®Ôó©„ý<¿‰ßüº­þø5·»cj,áå˜û ßÉ£@êÆ‚Ð~›€wFÁèkµ¦9 ȤLniÈõ†:T;)|ýWM4 ò]ïæã†`Ô¨/¢Ý…ÜÁø;ý DÉ£Ä#Ô7oD Â6ON¯a$òM*Ö5‡î¾1À)‰Je¾Èœ6&7~%Ó?Ì$ªqøÁ”$cÕeCŽ.ãáìZ=‡»§púçq´YÿKoò;תåârÝÄ4§!nûëæïk²Þè…=ÿÄd¹yiïƒ>CTYNë°®B•ªŸ,>”k;ÕyˆWòñµ¨~&.×í!Zg{A-€‰»9”­cÖ(kißIÂÕÅCÈ3¿È÷¿·´ÛÁ8 NÄT®?>¬°v6™Øü°àoýëN»Âœ°\øœ\l¼¡¹Hc„\6cyG𻿗˜>OF>ä+ jç·®°÷œü‘½v7mŠp⣛ÌWdÜë£ÐH·ê €óîòòß—<ޱþ'bè4¼–V¿™ Dí˜IO€,NK‹@Ñ5q­«é/ žü¼›å°½HˆV>>=}ÉóA_÷A Àn%ëkX]òšâØÙ©œiÉqÝ Àª1òÐìBÙÇdšéJIqÄÌf¦“ÁËÈÊa\1+pÕßÜxŠ‘¹®–_aêΙ‚±ª+÷,B?ûaÿGëXHi¡¼BŠ)÷+?/Õ‹º âWg_c«ÿ7®Íi Ô64aVzGo28´-1KuM•g`ÿ[ªfþD«»µý—±#jDGÐâ EhLc“u¡Ì7^w=‹?φìŠw&J4î¦ E…9%^EÄ'p^$.ÀD[VuZ(YŒÕÏÚ%ÞHôvxí2ï¢ã¾#è‡yÝ3sâ ÿV.x¨zñÙqK’ီ K™©y Ù‘Õe™¡C² Ä8l{šïâ3ì{Ô‹ Ü=&Égh&û5*ˆéX ~p-2rj F*tЛ7‚œÜ¡ä™UÝ«0EMê²ö\~<´µni`¾SÖ“~c €ßÞþÞΠ؎ÖÊŠ¸fãôeU½bühÅ^aéÖ׉f0´ê@ŠªcñÊAIyÜ2¡™³C®™g²³—ÜÄ}ã¾ü ¸…ÁøJ¬ú^gù$írîªb¤ƒm+yƒ ¤n¬þýI ¡È‰6ü|¹ò8g÷äWY¿´!âÐ#®@á.IÇØî•OãÆ5qÝžt ³¥N8µp5ׯVŠ?½ÅÉgbì\£x9K釻kP)lJR‰‡-þŠ´Ó„`h¬ÇW¶Ÿß¸Öª#‘rUûÌÄmjÖÅÎhj¡O£ kœÆãã÷èqòÄbF1æPnÌ‹yï¾²Üñ‡õûhS^ÀßêJô{(ËÄ>+ļ̅éÀˀęiòw›LödïÇøa¿sÂs Âë d¬$/;†mãml½Ë—Ó3à@DµOØUD¥Š )Ž»}£9Ô^Fl9N(¤³ñ­n^þ‘òJ¶|Ÿí+p1¤ðÐ/¨Ø´ã- Ãw<’;GèÑoNÅv'îôvXj¤«‘$EýZ]ñ„ü0@%cƒ-|§Ihàõ}s˜ƒÁ‘Èèecn\úuz¬c?Ø·Ýof>q16÷…­×!ÂT„¹"œ¢E| à sëçù¹yjõ èïºæ˜»‹}²éÆU5GNë¢W*õ­UòJ™eú w]Z"—듃^Àl©÷¨Bôœ?ßí7mvòŒ pm c¨u¤–”pgìÊ)θµbßO(Ÿg¶¡F²ÏX˜ZŸË-#pO q!¹Çæ’ƒÝ`;¦o¬‚ÒSØ%RgÈðhê]É äÉtùÀIjéuÌ3Ö}ŒŒ#å¦ ôý‡ý%<|&@›­­ÖÔÞçûôÀ –a¦.FOæSRõnx.ÎðökîÂÔD5 Æ’ƒ½(r>cEY7؆D—ÏÙ SôØ–Ç}A:ç n.áŽZ›áûrmHÅ/LIvUIxKÕYÖñ;©ÿóBPÚ¥Ë5þv\ˆ[­'HTt?Çœ#<ñMë äá.‹öÍÇëIu!lm󞂦SÝG5´b.ãîm€DÂ<€K ”Ìl7êι%e, …)˜ŠJk6wâ\ ê¥s_ÂaHo°ë¥-• w ¢ 1ãpɵrû–û²`Æ+ø(|'Ö+LÏÙ®ÏÉû JÛjÊÐR Ô¶/fYÇ/>¬C·ü¥w^YêÐ/$!ùª+ÊÌî©åþ2p°,…Ž|-ì9ÝÂõ)1¶× ã}­®oK«l$8#" Ìý.(̶Y/2V‘òÒô„œÖsÚ ´§;êM7;Ê–Õ%¥ÑA%é =¸X¼=Æt·ðWñ*ò™ þM5Ðο‚};ckA%_HÆ3XZi\寲6ÓT”óÿï°ÂQ+H7ßÎUìe9û0m"Uˆ˜AþûM5iø[’܈xÈÍ ‡K=3œ²§{DHAœ|”`ZwÇÁh¨ŠeÝ~´L#û²tþÙZnDgÑ~tK’–-½{ÇŠTµÞ= ›R¬¡ ùV”Ýû€Í™·ÿ¿%ÙžÞ!‚]ß:- È¡æ¼É“a>ý¢|Âü¦– ø!Ò੆›Ê,s“±‘F ÚnZÞ×‹ð‡Ø¸Öà{T%öW¹…­Ít“]ÿ-¡__ùߦªVåÛw‰¨‡š¾^}é;z?+ÎäÖQx› ÁÞ ¸©Ø²_Õ8ñKIä]¸g Åû]”?â³æMšnþBUçõ=ôׂ:|¦öµÎ¬µ’à]çŠÄÒ&1ÝKUÓ0ŒWsK9àÓ» æ9)\‡;MGðÌòìKi/‰¤‡kp ùþ|ÏÁöþ›]œ¯èì5‹wËÈ'Æö `–,€¹É¿( úkÛÖZõÞ;;«úl^ÈÍ„o®s°nT*ô–×±…¬;|ÉU?üü¨7å±~óâ&âÓÃŒ@Œ™tg‘ÅxRV¸£Z+e§%Ý”·«¸ç^L„ÝcÇœÀVš+æzï9RR×J”ôG©quáFÔ=km4á¤í”E©™i›:Ý9¿™‚7e÷ƒð.q 1$JžØò#h‘”qàË!5çX½<ÁW¿òÀZfúêKëË ž'®•x¾(‘%äùaÿq@ÿ¼^«9 œDÑ®%íHtËÆØ}÷2 o®MÇÂM]玪«ýój©¦Æ 89{ïÓ¡ #rV‰ÛFáÊx»{j )8ŠÐtæ¯òVè•űGúŽ.¾ÛoºïËïŸ}𬨖.-NZúÀ6+[‹+¢™oÍoD%¦í·¹Xe'ˆõ«2|‘âeÍQÁÜÏzµ‚‹N˜vnªëAè-2jíâB{ÞËþüu¤ 5C“ñä°ç[õ×|e %¯“ÿs}à ÷OWÃ7fºs‹Ä(=é­"~¸Ž'™ÃHøQwÆ™‹§Ö‡×§åá¸'0t”³4Ñ åÙ±Ç9\ÀЧçYr ŽU:›~ºN:,žOÓ5fq VŸßûsó¼V.éƒÑ= ³êÛá5ÛÝÎYÑy°^cŸÝÛ ]Ã[¶Œ<›]mò¢¡·ƒó;¥š“úQpîúú)DY³@45mô¯'”2—3/Û” Ùn[͈ääóÃS(çˆ×h%À€›$m©H%ÒÈþñ©•7¡bØ!Sš}Zt±G!Œ˜}fNÔ¶áXh{Ä»äˆÌ­l<“^VÀq/ïc þFé²9èñ{©âè€Ï9¶öÉ=f0ÏåxvÇíŸ0ÍL±nûŽÅ_àøQ[÷D*­uT\Kàö{V{*.íÒÓ(®RŽ!âSÁ™{©ê›b“ñ»ßþ™A[Ä#­hî,Ü:ÚØ-* ÷‡ë}F Ÿ†hÀ$î…11ÓrBÎ}-I×±e¶ú$@C˜¸„d'ªB2]”²cÕN“Âò ðáQÈb°Á­‹·Þ`P}m"Ø>‘j³„¤ ©ç™Ã9Pr9P‚EÎ EcÎ¥ŽxlÜx ê±ApRÛã»h†ïê„9ŸçI«Ÿ¢‘ Ððn~}¬oU–+>sÚíc¬0ãÛ€Ö4¥{Õ³¤D¹›ö931A(v\Êf”h€Î¦L°²Àíb€?ef\S]ÆS"l#E‹šÚ'GL €}ÂgK°„| é!"0×­.åâoé÷š"Rò,7•óÄ·ç5¬#tûÔAV :×`D0 Úa„1'¯#1Lì€ãÁ¯ª@¢Ðr!÷Ÿ#Îþƒ^]>/W ]½ö&”¹|í}-¢Íﺃ ɪwýMí\`‚?P„úÇ9¡+HÖ3À-êºB~š@ Ä_[€ ÃcüHM‡ÅôSWÐVìFX-°•s&âW-ŽŒ±xYiwƒ€®¶i§ûñêÉ9ÑwD£Š(ׂ†ç甕«ºS£/V»{z1 Ï ÍÈ’gƉøI ³xì#qéñïÉåvÇV½•£*ØU{?l¶…pí8Îr.x=0Á¸s3ÚɃ#sJºS °Êë&Ê¥øµµ9Rn¾±-x"Ý4äÃg_ÎÙb‹ìoGÈÃî ¡¹wA<´Ä$¡wqôž0D>ÛÙ-2òåŒÑç%+¨ž.Ÿ/ äûT a<‡l ÕÛ†’Ÿ²ùÌZU¼ó2·[Ý÷p° ¨ù8¤dg1vðþù5‹ë÷¥®Œ!C.™·ù›Xù_ÆãÏ·5p™žÂÈïöÜÿ¿0«¾Bá|´>¶@6»×RÈ'MÎ=¶;ïðT½&+Ų3Eg–ò«-ë)/¶´Ió!D§†åÏÔibº.^ 9^)+Š m^Ô·¤gz“»wà‹9ºw¤mFShÞN¾øž—\ü¾ÿØ Áç¤åfV*܉ÏiŒa¸­ºz:°|’åxžK'ÍÇÒè¥ð¾÷˜išE1&_Ü%ç’¥[¢·.À –´o;vlk‰–ÄÃÙç÷ó§}Ûê6åßWoì‹G/¿»J½‘Ôfª‰üRNaÍ®p: 3Ì1›·64$;¤8У°Z‚ Uúy€¿ÝE ü²Ö‹™›’SJ¯ (Tôk]ÐyÝ®Éwò†«x™¡JFUsפ´}ü‚(»¨†ã1ÛÆ4ÁK«šÿË%ÌÈ'M8×9!ó¨Õ§ó¯8“ezg¥:*<0_‰º™*:?¨Z°uëȸÏ4%ÎHõBgþ[Twš’ŒŠÆs=´Zñ;¤Wb± èѳ6¯Ô»0•)iRLfo°Ñ¸ý¥ª¼'Œ8Ùôab&¬FtyïVgú¿`D™j Xôê½Ü‹©Pw Üœ¶% Ù !n>Qø¿Åʰ Ž\F1VsðÑÀgœ‡a­Û…6Ý//e®_ÃÚò>Óh`qC²žXɸfV5=Y»RïߥP‹ÂmìËÕ®øg¦Eù€µš˜ú¼É`HŽ[$ù„+ !ái|Ä>ÛS‘W¡÷pµóå?;¹Šßc{”î´Å–Mñº2¥·šý¨ ŒSÀH{8‘üjvHËŽ`è‡q-©à¹Vê"Òõ™4ILàT4CˆT †—â/ÔP†õým/þ‡6.÷§å ÁzÄ8ɃJ…Éô‚â_ÀHêiÓqv hœÏR¡³”~J–ÛCÖªðr‹ë³¹he'YrÂä^ ê3"QGWøs¡±Šõ±Ëœ¯§EÝbÞ(V! Ì› âÙ%Ì5&ï¥_È~G˜h&Öî`†1Õ&™®HU[¨V¸NSp=œÒG:þÍ?weÚøŠ=Ö¸¢Û¸ÑÆÛuØkX‹gÂL‰k*#ea9¿ÂšOÿŠ#twwU§{G±š±M­%3GÔæšû#Æüg~><£©ô }Q‰^:LÊWg›GŒçŽn¢ø$Ù+‹˜~LWøÄ"a{âœÍÐíœÆóOÖÔÌúÞ>;¿´ ç-®°´K¢îu¡J F%´ñÛèa½E}OËsú2'F¡œ¿HÌrB~DÕÑPCo‘:d¯íG6#™Œn°UÂX«I•ú¥€ŠñtÕž¿’;}²z:LímÏNX…“mk&aæßúÏar‘<Ž–’ bñà€ÀU‡#„ÁódV3cøM%í¼M¹ˆŸ¿<µYïâÄÛÍk4åÑ µ‘ª˜¿U›ó‡¸ª9«Ø: Э¬åX§J»÷üh±qDÁ¥g–ùÆ;$Èw¨|¡”;Ùùp-‡ê<údÎQð] Æ_¹ »Lƒ†¬èc®ÉFQ©§ÅVób u l’FS®¹u{”2¹›NŸ^x—ñ…rivÕÎ4ÿµú¶Á~,Ó0lÚÔS1¨yóRW«Î©øuNà$0u1jÏêìp¶œÕFÓ< n”Y–zWGFÁ"tèž­0ƒô?bˆ>é±—ÝYÅ ¨ƒ(´xƒŸH¾52f ô©×ò]'ä{äàÞšþt_Ý—Õ"ÙBzà**rñx%>>9´Ê9k%R½Áˆšä²újS¸3+™Ro ªˆ®Ó(н9óQ´"ý(iæfìSo#9¥Õ ß‚…˹w[oeïYj|WÙjì;wPû[æWˆ,ÐDZÅ`þrJ¾›òòn«ñP£»ŒñéÆ3‚—ûV·jÓîQÐ9íHEâź´toùâÅüÜú³7gîr¿{Ñ•iey[g_ÈÄÎV_Üo€Gÿƒ*-ÜBPõÈÃFfÉùæ"3Á›!%§0wtEÉžpXt"Fz±ôºê¢=ßô ””\oËg¨bß•æfùEkWOÂŒ«ýßÎmKy. {æRn5PþLÒ F\4ZY›“¶J=ïö‹nÿœ¬è|ÐŒ- ‹=•Œc²>4šïaÄçN«I¯ âÔÚZè©ä6¿›ŒêZ£qcL¹Ý×2ýާõEØøø+öÊ7Lé꣓ÁŽô­]8r1ð‰þÔÃGG{â1/D‚[¡¶ï¶JšN²4ð³´w…{`0ߊ›êÃLq¡‰Féªß¯J³W†ŒI΃xÈXç·~Q«,Hð1µq|EœÃ¤ÛÆã_~‘`x¾LHÚ¾,°|;„cµk<æfï‰K ш=äv«2AIÂv QFà;G{mr#ЦCCÎ×Sêûí.eSx tÛ¨*E¦Ì÷ îÛ”­ÆDuãâÕçã—>,‘v*’ÿž­ƒôcÕìÉÛÕæáù“vAÂ#cKÔàOœ:|eC{¹ï~ëó@ʵãN»ª ãï¤ïÌ£ 5 [G]!wu€ü©$´H²hÈz/l.ÊžÃþøÛ/°»Æk®}ŸFŒ2ž»P?töt¯äƒwÈ4U — ÜlßTô4¼£_‘|`•óñVº7 ™X»·»‡t&”åEWð´ªEšû»©÷B{µ{ýPë…ÝTJð.WM6)gX£-ËÆÐnßZ¼ï…‡ÉïD8ú˾–ã&ï»vS¯yS¼gDäÜ­>@Ì…P`w)rèTûÂåÝÑõe^‡Èaëíy†ÇÜ­0bu Žv–ŠÓÈÔ ¬‚¬ž²æö¸ŠÕヹ”¯<«˜ï‰˜ð3¡à"ôƒ|%Ô£Ãú-.8iée¬Å‘€²‡H[*Œ‘áùjJŽ€AcF‡€‚Ã’Ú¡cƒì2u}ËÇ›â‚P¬Í8?ΩÈbŸ9r+Œs:”¤Ö¡Û>…éÇ+Ev·<È…6hŽ,u×F áɇ>cç2‡ÂœÑä½vªysœM¼Ü£©ÎzKïmžÆapÌ!ÛÄÙãÁ2­,ûS}ö`ájy¾TÄ,"0)ƒ¾¥9åàÕ#S pFŒU×fŠ6‡5VõF“Vs›ÓáOÉÙ'À¸]Âx[B)tô‘W àÉ"“ÿìX+Ï“>~S1Mß!ye%ˆÑ¢³9÷〠å=Ìoñ x£•uøì{{õ0'S•¾\ݚ̌ð±þ«Á…òUUºe³R„G ¤ ?á÷Ķ z©Ôå±ö_F:$ ÏB !„ø”›,é¸}FUº‹.âÉ•ÔUFèÃv|]nw{X>HÄ’ÑZ†Ê6T\S”P䉒 M…Ž–‰€ùÇ›Ý7=7ùÔÿ« Ðó/æIJOÀ¢–Ô`ƒæ‹~ãɧKÐ]ƒÏÂÿíV•,M2|ÔÉ"tlê\ÃnFÚw¿Ý‡4Bå‘JþJ‘²h-ôlŠ Ã3m}]=pM諸NÚ¬èë5û!ÓèÌR’óÔK°Ú¸n5€Eˆõó íŽm7"ÞÕNè¶Å,aùù‹4!ù€ÔkÆŠ£$ŠD`aº”¥W„­„pQŠé˜V#dƒx-pÅŠO‚W¥ÛZ«=kçÊÄ ÌEdcÔó^<橚»"¦v:¿4¯[¨êb†´ –òìŸÆä«k:Òšœû3*s°ŸQ²E_‹››g“BcÑeƒ«Ó'RÊ'6„ËlFô²zÏšŒvd¸ÓÛŒx KfÒ_ÆÍGú„/Mù®$P1–¢Î[ú§“m tH ;X…–2—“sÄ0ò·ù™<ërªþQW‘%(‚ô±C<à¦Ñtz£ȳ[y.ä(ÐbZ9Ç æoyÖ¹vàÅÓ†xŠ:ÊÙ©4J¥fç–ËdANV±…ä¹o×—E‹±ÕZô'r©Ø÷šÈ7³8j¿H¶ YTÊz­P¹)Ÿ8XXJó‘U»°ðŒ»VgäáEV4g¬ hñŽøfÝ£Ô—ýÑ3=8U~{£““ ó^É'ÔLŽ_$O±R »TÔMr~”—ëå9ð}…Ð=…Пhôx»¿e%v‘5Ua5.øQˆNa<,Æ\Acz ýíînœ,ºÔ+zÆÄ(ø¤öšÑ‚ɶG±aî9rÖ_¼[l¶tw{85±FÃOº?]¿$‘Ç;ô¡ï†ìŸážy0²›iü½ —ñÞÀ¦ØŸ­Œú›ðãÇ79#bGYïR— UÈ<±Y |X¥Aía¿A–çý29ýœ{mBÐÅqvm,Ø#B7 lRîvȱ‹’S–Â!C'¶"8úµ)àÎÒ¼A¤²p,\)i<),ñÚùYLñ‘6¶ûï›)R]œ>ÊS‚{¿Ú¶QóëN^Ï¢ÙÙaßùYPûJöý.öá’EJ±78ìŠam%äBw ,€hH‹:±HÅ3Øv¤oB4¼üE×dŽpÍ­5ƒ|üßj XÉ‹&I%†–^F¿Ù0BqÒ’ñZWÞ‘ œn¸FXiè–Qªhµ3+¢!wTŒ]¼¢gß é|ƒŠ£–¬oyî˰ðG:k@ ˜„Ú®jq¨²õWz¿XŠ18œ¶wÖÿ)Opê(x‘0¼«Ã‰æÍ·RüÁœËŒ-à;™M‹U0ƒÊEí·¶ÔcfO¸(µHè3´­;䇾ýî]ºp÷¤öC0aŒ¿‰På~Ðgé@J Qõ!1=h ä~\¦&Y¼Qî¡Û–@è JðÒ¹uPéåðdù,] öªó®é ¼¹A4D6ЪõÄ~£¤„¿¶xSâÀ_+e&/£¨±‹¹YQ³v^ŠŸÓJ2 n6éµ=0ùn¤kºu«†xÔ ;XØ¿ì |Ð)û 0Êœ‘ró0÷c”ÅÓA uY#œ ¥–-9EPeF `,u#Í®i|û~`l˜ut]ƒ{>×Ì yunÁ;V¦,Óî2sü/;G'üs-vo‚ó¤Š~ù ¨"“¹µíˆâ>þr0Ø÷¾©Ý+Þw »­• ´¡Ov8Ý‘ç…kjW߈"®Ç¡™PíÛ§ÏÎÔ¡Õ ‰WdðnÅT »¿ý—Ôû†C¥TÿµtaAä6™å+k¦ 'òщ î÷ƒW$)ãý¦†D¼£'ïéË»èù^û6ˆ”ô—AÚ ³¯ÿsQI²¢¥ÿ ËP––Må†÷FxŠ9àVt0ûô¤NBUðµ=šãt ¤•;' Pe)°“TÕÿ)“²qÊ‚ëß=Ë¡˜×/Qœââ ®cÂ"k(à¢7V/Ï\6UkÙ9G3–r¤Rýù`û("®M…C bW«`ßEÑ b+Ö7 ¼Š“ šQ/.·nºîæ›M¤?Žê2t° ` Ÿ&yŸzíVwƒ¿l´΀õWÚn=þäáê x[øçðÆ–B§ ÙÍ#P°ÿ$ýŒ#¬iK¾ë‡«¿áA%gKü"±Z{ePéΑûGÞ1&D2O„¿`û›üÛeE¹GŠ„%‘s2CͤiVpK†æN6½/¥\9ŽI’h¤s§W{¡üÒ•²u‰¬‘¦8£öäö¿))?-Ô´GÊõ[Œ¬Çx°‘d`B?8³0Ó¡»Z_wxiOÝCÚ<MwÑ~ª5½}Û µcw}ÔJž¾ é24‹Ù[p –|ŽòZ"Í‹`VtÉ'SYXH"€í£-˜CºÃÌapfn—­jBª N'âaÔV&»)6m7T-Ý%Cç,™äöèâŒVçß`Ì!»á¬î~?ÇP­&ìuY‚çëh€aA{—>›ÙmBÓ"µVêº&ŠF!¾‹ä‹1|Òzþdª§˜6$z¹a­ã­€7£.d”È9vMxq°”OÊ?Œî§ ƒz ÑêÑ ÌZˆï)öÚ²›zr¢O5ȤAd{ôLJé¶S¨ƒ‰Ó½ÐBÓFBÚ{›$õKÝõQÕõ¸À¶cßñÛÊ‘]5h‰ô8üWÝ~šK…Ùq‹2è| jr!†ùbÁà1®ŸšsϤ{Æ3ÔwÙÿÞŠÿ'¶9„Vû„ÇÂܲrÀ\ôà]ƒ‡`7ò±B{ WžðJ ¶¦—‰w­`ÙÒŠEêh=ñS6Ðzx:µzô_¿“þí£œ)M1ØM&éBü´-¢èõÉYÏ>”É«¢ýžƒ’}´os&|ê@­‹Í$`ˆ@sUKЋÁEg—›Ê©.&Ð "íu ¦â R…ý¬RÁ€<£ú+ßÉšžÊæ…ŸJb³]mb<€qiPù1NR¾UÕ*ém*®; } ø?¨RX¥ÓÃ8IŽnØê§!ó6ÐzIÙ›¡üèa¸¯âYŸî“r/µeç«-áȇÙX9``9Bß7w5Ä"× mºãÕ0Ò#RøYq¬H¢ ²Ï7Qh¾\^˜¤O)—¥’Å»¿ó ?¡½RŸoÐ*ÁYü° í>TÐ4l‹ŒUK訬µý„/É›|Ž8£;zITÅP*¹y{pœjn q™Æ¨i-&¨^Ò=E´—!¾ºõë¼×à&ìî±>òW»Å@ ¥é<ûþÙ`¦ÏíõpAC΃—9¼ TÖ‚\1ÇP;P±ü¼ƒÙ™lЕˆµþ¤U¾dfÆõ PppEÒ@çöcØJðåð3ÃÞ‚'±õZ ÇàA¯=úàW“œöŒwÀ沟Q…yý~dbo%~®ç n.3;ÚØø¹J9QU[+x;ÄÁVð1Âðìeߩʳ\f%5¦Ëãt¦&°w¦8;œx®U‰K¥7Yª]Ö WqtŽËÇ:tÕ0ÕSþ8fm ™À¢„QÛ§z-<4q¦'Ë šÅý£ g «Ay'–YsÌ€lC“.mÃ}w ®” ;øŠúŽêË tÍ[Ušó ÂrÁÍL¼Ðx`ÿÕ‡åÝ <7–‡Îí2Ã,¸à¬ÍŸ“âÊ•t^ç±ÈAMòèM-ÄØ"ÕÜE‘…ð\›`š§qMäînê÷=;I¶¸=Ž`ØÉD„ßê(Åp'}䋳.;VMf©Óû•Ìm7 ¡N¶ŒB“‚ ¶/‹V'‘;tö—’„`ÉÔÖòT“ûê_±Òg¿ðC»Ó‘û%VH$Z!Ú8´ª¼"pØ Ø~åÈ-‹%ï- Þ`tRÊ«•o£òãHK•6?÷ø{‹V&UÜÕÝK‘3Ít"¾© èŽ;qÌ[£€ãqS9Ÿx4þûoKÌzâ¢Æ+$#P+pYÐÐñL0 ç~¯ºÖZ¸|!¬ËÉÊãðÁ:£$ãƒ6|ZEã}P…;—¶l‰å+g|f-3/áTbJŠÐíA†f•ŽÌRÖ?)ý´Ñ~c0˜gTGú–÷5.ô›jˆÐ²Ê+²j‡ÉÚCÊfš,|šîèÃûfíÌ’Üöx“ˆ/ ÁŸCöûÁšî %F³v“Êߣ­õ®ìÒà÷J§q¾ºƒÔÁŒ$á¦È1wé¤8ÏÈ,Àð]PùÄ–3nèî<@ü*z€IÛI[›áѶüÄwdrl…lŒ.ðÅNéoZóG@Üý·¡› ö÷@‡)ZŽ;Îî]¼kZ <œ˜¦l`þ[†ZR»ÂÜL»3(†Q^{Mž1|ÓnáÉ=èù–B Sÿáá/¦Uä΋9ÙÃ~—x9&z²ëв³”$é÷^‚mª¿üÞ%jhOÁ‘à¿üçØ<Û͞Ю… Z1ÃÝÅY8N莶Ø5i=©¥Fö´aJ2ާ˜ÆH<õv‹v¯çq>RòŒH@6MœŽŠ~*Wj,wIø$N¯Z“MF·<—ŠÖ~«EüÕApÑJo¸Óñd0:!ë#Nèžü¥îAP¨ÐCpÝ‚di¾'˜ =áC%G„-ûC&lk~ Ü_>¹”Oí?ŽûãÇR±š#í›Ø:¸Nßš„3EQp> Ng$oÞ8ªzHyŸÓuûøäSEØ §Xû£7!9˜‹ÚÙlvõ 2¦V¿¹6ÂÀÎ3ÿÞ—xñvP‰Êyá©ôÚwsªÉ½Øþ8l€ E|l&£Ý@äï•\Hø_-ºÕŒü27 ×cItɯÜσœ&Çž…: Ф ¡]F»™¥½ÍÉ9Æbðíˆ_/Ä×ûÝ’Áó©mÀAÅP ×MþX„0󃻚õ¢±€5]Sõû`!_Š¢?Ÿp0þ×4Dû80ÉúÍp~Á6ûÚ•äØ|÷ÖTKÒ*— _Aö4Màð\t-bïMPL³Iw_M YºË$Û)¬KC àÍasþJi{$áhÐ))(ªÜx—ÄÔ i„;0)bñ~€ mfÒJ[“A÷b¯¤}?Çî.9¾“Q«ÄŠ|£A¤í]—Ë˾b  ä²ŒÝE¡j]ƒmqÍrH™ùøÖ϶³1èï^;X‡ SNXÖ51Ó–(±èœònóz_Ée[!a>’ÒÑË3ú²»:˜‰ÀÓ»t¤^YUÍnâ=K@õÌU[´ˆ÷µocnc=‚ᑘӨÜùàÐg ¢ñ`'¸4é°9â’uða5µu³_ÜcÌpÙHøÆ>RY[ö‹,C áRBꙊBÓcÞd:¡/볫»ZüËâ‡c$eËÏ2l¢:itA§Äþ‰Pu¢›}srØÐû|„™('Îا‰ë-Y†µ½Ho ½1Y ÛóH†"…\Í þã VÂdãäšqoªFÖŽ29Îë ¶Žîk(®ÜT_^•)†Ó?ìl¨tÄhN—Ã×Ò+Gd’®½ªòW’ ìüŸ¨T³€•Â_£Ä–Í¡.ë t¥lcу©@Ök5g©tw{jfÉ Rå6P¤2áçì¨+fØ«º¸N-ÔN¢ãÀ׳}†ásÖ^Iô¡öŸñu mcް³„zìcvyËðL!Q ™/4{$›n±IK¶èæ»Û:*%ÿ•µò´O‹¶UñL€3ͱWwÐôønO/ úïl6ì;løŸfVTi}›ËÔæ¦ÂzÌ>ç¹²uºœ½¥èå@–%¸Çºh¯.«cÌ)ÄΪ“ £d_IE\%Á,Úkb¯G.ÄŸEÏàÍó&Ç“a·ƒÀ0sz?ÓdD@QÓ‰WUê ’V›pHøÅ¸ íye2ãf0Ƙߪ`r× öƒ¶@gqÓKÿݬíÕ_½1 ¯ .Ú $É)†¯ º'h)µ$ÑAöüÏÿ|¬ª-üÏ,»”f+ÏW!úÿÊ£¯xnÂ<á6åÉóRý0“ÁŠ€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n022004l.afm0000644000076500001440000007604307056046553016415 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusMonL-Bold FullName Nimbus Mono L Bold FamilyName Nimbus Mono L Weight Bold ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -43 -278 681 871 CapHeight 583 XHeight 437 Descender -205 Ascender 624 StartCharMetrics 316 C 32 ; WX 600 ; N space ; B 375 0 375 0 ; C 33 ; WX 600 ; N exclam ; B 220 -15 381 638 ; C 34 ; WX 600 ; N quotedbl ; B 136 312 464 602 ; C 35 ; WX 600 ; N numbersign ; B 62 -92 538 675 ; C 36 ; WX 600 ; N dollar ; B 83 -123 517 684 ; C 37 ; WX 600 ; N percent ; B 80 -15 521 617 ; C 38 ; WX 600 ; N ampersand ; B 75 -14 508 550 ; C 39 ; WX 600 ; N quoteright ; B 147 331 351 623 ; C 40 ; WX 600 ; N parenleft ; B 264 -153 488 632 ; C 41 ; WX 600 ; N parenright ; B 117 -153 341 632 ; C 42 ; WX 600 ; N asterisk ; B 83 208 517 622 ; C 43 ; WX 600 ; N plus ; B 42 0 558 560 ; C 44 ; WX 600 ; N comma ; B 147 -158 351 134 ; C 45 ; WX 600 ; N hyphen ; B 42 229 558 329 ; C 46 ; WX 600 ; N period ; B 225 -15 375 117 ; C 47 ; WX 600 ; N slash ; B 83 -113 517 695 ; C 48 ; WX 600 ; N zero ; B 83 -15 517 638 ; C 49 ; WX 600 ; N one ; B 83 0 517 638 ; C 50 ; WX 600 ; N two ; B 54 0 508 638 ; C 51 ; WX 600 ; N three ; B 66 -15 529 638 ; C 52 ; WX 600 ; N four ; B 75 0 508 622 ; C 53 ; WX 600 ; N five ; B 66 -15 529 622 ; C 54 ; WX 600 ; N six ; B 105 -15 540 638 ; C 55 ; WX 600 ; N seven ; B 75 -1 508 622 ; C 56 ; WX 600 ; N eight ; B 83 -15 517 638 ; C 57 ; WX 600 ; N nine ; B 106 -15 541 638 ; C 58 ; WX 600 ; N colon ; B 225 -15 375 437 ; C 59 ; WX 600 ; N semicolon ; B 147 -158 351 437 ; C 60 ; WX 600 ; N less ; B 42 54 544 501 ; C 61 ; WX 600 ; N equal ; B 42 138 558 422 ; C 62 ; WX 600 ; N greater ; B 56 53 558 500 ; C 63 ; WX 600 ; N question ; B 104 -15 517 598 ; C 64 ; WX 600 ; N at ; B 76 -152 509 620 ; C 65 ; WX 600 ; N A ; B -21 0 621 583 ; C 66 ; WX 600 ; N B ; B 13 0 571 583 ; C 67 ; WX 600 ; N C ; B 33 -14 564 597 ; C 68 ; WX 600 ; N D ; B 13 0 550 583 ; C 69 ; WX 600 ; N E ; B 13 0 550 583 ; C 70 ; WX 600 ; N F ; B 13 0 550 583 ; C 71 ; WX 600 ; N G ; B 33 -14 592 597 ; C 72 ; WX 600 ; N H ; B 23 0 581 583 ; C 73 ; WX 600 ; N I ; B 83 0 517 583 ; C 74 ; WX 600 ; N J ; B 54 -14 613 583 ; C 75 ; WX 600 ; N K ; B 13 0 602 583 ; C 76 ; WX 600 ; N L ; B 33 0 571 583 ; C 77 ; WX 600 ; N M ; B -19 0 623 584 ; C 78 ; WX 600 ; N N ; B -8 0 592 583 ; C 79 ; WX 600 ; N O ; B 21 -14 579 597 ; C 80 ; WX 600 ; N P ; B 13 0 529 583 ; C 81 ; WX 600 ; N Q ; B 21 -145 579 597 ; C 82 ; WX 600 ; N R ; B 13 0 619 583 ; C 83 ; WX 600 ; N S ; B 62 -14 538 597 ; C 84 ; WX 600 ; N T ; B 42 0 558 583 ; C 85 ; WX 600 ; N U ; B 10 -14 590 583 ; C 86 ; WX 600 ; N V ; B -21 0 621 583 ; C 87 ; WX 600 ; N W ; B -10 0 610 583 ; C 88 ; WX 600 ; N X ; B 10 0 590 583 ; C 89 ; WX 600 ; N Y ; B 21 0 579 583 ; C 90 ; WX 600 ; N Z ; B 73 0 527 583 ; C 91 ; WX 600 ; N bracketleft ; B 250 -148 475 627 ; C 92 ; WX 600 ; N backslash ; B 83 -113 517 695 ; C 93 ; WX 600 ; N bracketright ; B 125 -148 350 627 ; C 94 ; WX 600 ; N asciicircum ; B 83 325 517 652 ; C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; C 96 ; WX 600 ; N quoteleft ; B 249 348 453 602 ; C 97 ; WX 600 ; N a ; B 42 -16 571 450 ; C 98 ; WX 600 ; N b ; B -8 -14 571 624 ; C 99 ; WX 600 ; N c ; B 54 -16 565 450 ; C 100 ; WX 600 ; N d ; B 33 -14 613 624 ; C 101 ; WX 600 ; N e ; B 33 -16 550 450 ; C 102 ; WX 600 ; N f ; B 75 0 571 623 ; C 103 ; WX 600 ; N g ; B 33 -205 592 451 ; C 104 ; WX 600 ; N h ; B 13 0 581 624 ; C 105 ; WX 600 ; N i ; B 62 0 538 623 ; C 106 ; WX 600 ; N j ; B 117 -205 488 623 ; C 107 ; WX 600 ; N k ; B 33 0 571 624 ; C 108 ; WX 600 ; N l ; B 62 0 538 624 ; C 109 ; WX 600 ; N m ; B -19 0 623 450 ; C 110 ; WX 600 ; N n ; B 23 0 571 450 ; C 111 ; WX 600 ; N o ; B 42 -16 558 450 ; C 112 ; WX 600 ; N p ; B -8 -205 571 450 ; C 113 ; WX 600 ; N q ; B 33 -205 613 450 ; C 114 ; WX 600 ; N r ; B 54 0 571 449 ; C 115 ; WX 600 ; N s ; B 73 -16 527 450 ; C 116 ; WX 600 ; N t ; B 13 -16 529 591 ; C 117 ; WX 600 ; N u ; B 13 -13 571 437 ; C 118 ; WX 600 ; N v ; B 0 0 600 437 ; C 119 ; WX 600 ; N w ; B 0 0 600 437 ; C 120 ; WX 600 ; N x ; B 21 0 579 437 ; C 121 ; WX 600 ; N y ; B 21 -205 579 437 ; C 122 ; WX 600 ; N z ; B 85 0 519 437 ; C 123 ; WX 600 ; N braceleft ; B 167 -153 433 623 ; C 124 ; WX 600 ; N bar ; B 250 -153 350 622 ; C 125 ; WX 600 ; N braceright ; B 167 -153 433 623 ; C 126 ; WX 600 ; N asciitilde ; B 62 179 538 385 ; C 161 ; WX 600 ; N exclamdown ; B 220 -227 381 426 ; C 162 ; WX 600 ; N cent ; B 83 -44 499 661 ; C 163 ; WX 600 ; N sterling ; B 33 0 550 598 ; C 164 ; WX 600 ; N fraction ; B 21 102 580 500 ; C 165 ; WX 600 ; N yen ; B 21 0 579 580 ; C 166 ; WX 600 ; N florin ; B 57 -123 548 638 ; C 167 ; WX 600 ; N section ; B 36 -170 564 583 ; C 168 ; WX 600 ; N currency ; B 73 64 527 519 ; C 169 ; WX 600 ; N quotesingle ; B 236 312 364 602 ; C 170 ; WX 600 ; N quotedblleft ; B 98 348 502 602 ; C 171 ; WX 600 ; N guillemotleft ; B 33 20 571 415 ; C 172 ; WX 600 ; N guilsinglleft ; B 33 20 342 415 ; C 173 ; WX 600 ; N guilsinglright ; B 263 20 571 415 ; C 174 ; WX 600 ; N fi ; B -14 0 619 624 ; C 175 ; WX 600 ; N fl ; B -17 0 617 623 ; C 177 ; WX 600 ; N endash ; B 42 229 558 329 ; C 178 ; WX 600 ; N dagger ; B 94 -92 506 622 ; C 179 ; WX 600 ; N daggerdbl ; B 94 -92 506 622 ; C 180 ; WX 600 ; N periodcentered ; B 225 214 375 346 ; C 182 ; WX 600 ; N paragraph ; B 49 -174 558 583 ; C 183 ; WX 600 ; N bullet ; B 150 154 449 453 ; C 184 ; WX 600 ; N quotesinglbase ; B 147 -158 351 134 ; C 185 ; WX 600 ; N quotedblbase ; B 87 -120 491 134 ; C 186 ; WX 600 ; N quotedblright ; B 87 348 491 602 ; C 187 ; WX 600 ; N guillemotright ; B 33 20 571 415 ; C 188 ; WX 600 ; N ellipsis ; B 25 -15 575 117 ; C 189 ; WX 600 ; N perthousand ; B 0 0 600 618 ; C 191 ; WX 600 ; N questiondown ; B 83 -227 496 386 ; C 193 ; WX 600 ; N grave ; B 125 496 350 696 ; C 194 ; WX 600 ; N acute ; B 250 496 475 696 ; C 195 ; WX 600 ; N circumflex ; B 125 497 476 696 ; C 196 ; WX 600 ; N tilde ; B 115 523 485 656 ; C 197 ; WX 600 ; N macron ; B 125 546 475 626 ; C 198 ; WX 600 ; N breve ; B 125 503 475 687 ; C 199 ; WX 600 ; N dotaccent ; B 240 534 360 654 ; C 200 ; WX 600 ; N dieresis ; B 136 534 464 654 ; C 202 ; WX 600 ; N ring ; B 177 486 423 727 ; C 203 ; WX 600 ; N cedilla ; B 180 -229 407 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 125 496 475 694 ; C 206 ; WX 600 ; N ogonek ; B 250 -208 463 0 ; C 207 ; WX 600 ; N caron ; B 125 497 476 696 ; C 208 ; WX 600 ; N emdash ; B -29 229 629 329 ; C 225 ; WX 600 ; N AE ; B -20 0 614 583 ; C 227 ; WX 600 ; N ordfeminine ; B 118 182 489 595 ; C 232 ; WX 600 ; N Lslash ; B 12 0 571 583 ; C 233 ; WX 600 ; N Oslash ; B 9 -70 590 638 ; C 234 ; WX 600 ; N OE ; B -20 0 612 583 ; C 235 ; WX 600 ; N ordmasculine ; B 122 182 480 595 ; C 241 ; WX 600 ; N ae ; B -13 -16 612 450 ; C 245 ; WX 600 ; N dotlessi ; B 62 0 538 437 ; C 248 ; WX 600 ; N lslash ; B 62 0 538 624 ; C 249 ; WX 600 ; N oslash ; B 23 -70 573 494 ; C 250 ; WX 600 ; N oe ; B -11 -16 613 450 ; C 251 ; WX 600 ; N germandbls ; B 13 -16 529 623 ; C -1 ; WX 600 ; N Udieresis ; B 10 -14 590 798 ; C -1 ; WX 600 ; N Uacute ; B 10 -14 590 839 ; C -1 ; WX 600 ; N Scedilla ; B 62 -229 538 597 ; C -1 ; WX 600 ; N Tcaron ; B 42 0 558 839 ; C -1 ; WX 600 ; N Scaron ; B 62 -14 538 839 ; C -1 ; WX 600 ; N Rcaron ; B 13 0 619 839 ; C -1 ; WX 600 ; N Racute ; B 13 0 619 839 ; C -1 ; WX 600 ; N Sacute ; B 62 -14 538 839 ; C -1 ; WX 600 ; N Otilde ; B 21 -14 579 799 ; C -1 ; WX 600 ; N ucircumflex ; B 13 -13 571 696 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 21 -14 579 838 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 10 -14 590 838 ; C -1 ; WX 600 ; N Yacute ; B 21 0 579 839 ; C -1 ; WX 600 ; N Eth ; B 0 0 550 583 ; C -1 ; WX 600 ; N Dcroat ; B 0 0 550 583 ; C -1 ; WX 600 ; N Zacute ; B 73 0 527 839 ; C -1 ; WX 600 ; N Uring ; B 10 -14 590 871 ; C -1 ; WX 600 ; N gbreve ; B 33 -205 592 687 ; C -1 ; WX 600 ; N eogonek ; B 33 -208 550 450 ; C -1 ; WX 600 ; N edotaccent ; B 33 -16 550 654 ; C -1 ; WX 600 ; N ecaron ; B 33 -16 550 696 ; C -1 ; WX 600 ; N Ugrave ; B 10 -14 590 839 ; C -1 ; WX 600 ; N Thorn ; B 14 0 523 583 ; C -1 ; WX 600 ; N eacute ; B 33 -16 550 696 ; C -1 ; WX 600 ; N edieresis ; B 33 -16 550 654 ; C -1 ; WX 600 ; N dcaron ; B 33 -14 681 637 ; C -1 ; WX 600 ; N ccedilla ; B 54 -229 565 450 ; C -1 ; WX 600 ; N ccaron ; B 54 -16 565 696 ; C -1 ; WX 600 ; N cacute ; B 54 -16 565 696 ; C -1 ; WX 600 ; N aogonek ; B 42 -208 580 450 ; C -1 ; WX 600 ; N aring ; B 42 -16 571 727 ; C -1 ; WX 600 ; N atilde ; B 42 -16 571 656 ; C -1 ; WX 600 ; N abreve ; B 42 -16 571 687 ; C -1 ; WX 600 ; N egrave ; B 33 -16 550 696 ; C -1 ; WX 600 ; N agrave ; B 42 -16 571 696 ; C -1 ; WX 600 ; N aacute ; B 42 -16 571 696 ; C -1 ; WX 600 ; N adieresis ; B 42 -16 571 654 ; C -1 ; WX 600 ; N Uogonek ; B 10 -208 590 583 ; C -1 ; WX 600 ; N ugrave ; B 13 -13 571 696 ; C -1 ; WX 600 ; N uacute ; B 13 -13 571 696 ; C -1 ; WX 600 ; N udieresis ; B 13 -13 571 654 ; C -1 ; WX 600 ; N tcaron ; B 13 -16 530 637 ; C -1 ; WX 600 ; N scommaaccent ; B 73 -278 527 450 ; C -1 ; WX 600 ; N Zcaron ; B 73 0 527 839 ; C -1 ; WX 600 ; N ecircumflex ; B 33 -16 550 696 ; C -1 ; WX 600 ; N Ucircumflex ; B 10 -14 590 839 ; C -1 ; WX 600 ; N acircumflex ; B 42 -16 571 696 ; C -1 ; WX 600 ; N Zdotaccent ; B 73 0 527 798 ; C -1 ; WX 600 ; N scaron ; B 73 -16 527 696 ; C -1 ; WX 600 ; N Amacron ; B -21 0 621 769 ; C -1 ; WX 600 ; N sacute ; B 73 -16 527 696 ; C -1 ; WX 600 ; N Tcommaaccent ; B 42 -278 558 583 ; C -1 ; WX 600 ; N Ydieresis ; B 21 0 579 798 ; C -1 ; WX 600 ; N thorn ; B -8 -205 571 624 ; C -1 ; WX 600 ; N Emacron ; B 13 0 550 769 ; C -1 ; WX 600 ; N Ograve ; B 21 -14 579 839 ; C -1 ; WX 600 ; N Oacute ; B 21 -14 579 839 ; C -1 ; WX 600 ; N Odieresis ; B 21 -14 579 798 ; C -1 ; WX 600 ; N Ntilde ; B -8 0 592 799 ; C -1 ; WX 600 ; N Ncaron ; B -8 0 592 839 ; C -1 ; WX 600 ; N Nacute ; B -8 0 592 839 ; C -1 ; WX 600 ; N Lcaron ; B 33 0 571 598 ; C -1 ; WX 600 ; N Lacute ; B 33 0 571 839 ; C -1 ; WX 600 ; N Idotaccent ; B 83 0 517 798 ; C -1 ; WX 600 ; N racute ; B 54 0 571 696 ; C -1 ; WX 600 ; N Icircumflex ; B 83 0 517 839 ; C -1 ; WX 600 ; N ohungarumlaut ; B 42 -16 558 694 ; C -1 ; WX 600 ; N otilde ; B 42 -16 558 656 ; C -1 ; WX 600 ; N Euro ; B 4 -14 538 597 ; C -1 ; WX 600 ; N ocircumflex ; B 42 -16 558 696 ; C -1 ; WX 600 ; N onesuperior ; B 166 247 434 638 ; C -1 ; WX 600 ; N twosuperior ; B 149 247 429 637 ; C -1 ; WX 600 ; N threesuperior ; B 157 238 442 637 ; C -1 ; WX 600 ; N Igrave ; B 83 0 517 839 ; C -1 ; WX 600 ; N Iacute ; B 83 0 517 839 ; C -1 ; WX 600 ; N Imacron ; B 83 0 517 769 ; C -1 ; WX 600 ; N Iogonek ; B 83 -208 517 583 ; C -1 ; WX 600 ; N Idieresis ; B 83 0 517 798 ; C -1 ; WX 600 ; N Gbreve ; B 33 -14 592 831 ; C -1 ; WX 600 ; N Umacron ; B 10 -14 590 769 ; C -1 ; WX 600 ; N Kcommaaccent ; B 13 -278 602 583 ; C -1 ; WX 600 ; N ograve ; B 42 -16 558 696 ; C -1 ; WX 600 ; N Scommaaccent ; B 62 -278 538 597 ; C -1 ; WX 600 ; N Eogonek ; B 13 -208 587 583 ; C -1 ; WX 600 ; N oacute ; B 42 -16 558 696 ; C -1 ; WX 600 ; N Edotaccent ; B 13 0 550 798 ; C -1 ; WX 600 ; N iogonek ; B 62 -208 540 623 ; C -1 ; WX 600 ; N gcommaaccent ; B 33 -205 592 721 ; C -1 ; WX 600 ; N odieresis ; B 42 -16 558 654 ; C -1 ; WX 600 ; N ntilde ; B 23 0 571 656 ; C -1 ; WX 600 ; N ncaron ; B 23 0 571 696 ; C -1 ; WX 600 ; N Ecaron ; B 13 0 550 839 ; C -1 ; WX 600 ; N Ecircumflex ; B 13 0 550 839 ; C -1 ; WX 600 ; N scedilla ; B 73 -229 527 450 ; C -1 ; WX 600 ; N rcaron ; B 54 0 571 696 ; C -1 ; WX 600 ; N Egrave ; B 13 0 550 839 ; C -1 ; WX 600 ; N Eacute ; B 13 0 550 839 ; C -1 ; WX 600 ; N Gcommaaccent ; B 33 -278 592 597 ; C -1 ; WX 600 ; N Rcommaaccent ; B 13 -278 619 583 ; C -1 ; WX 600 ; N Edieresis ; B 13 0 550 798 ; C -1 ; WX 600 ; N nacute ; B 23 0 571 696 ; C -1 ; WX 600 ; N uogonek ; B 13 -208 571 437 ; C -1 ; WX 600 ; N umacron ; B 13 -13 571 626 ; C -1 ; WX 600 ; N Dcaron ; B 13 0 550 839 ; C -1 ; WX 600 ; N lcaron ; B 62 0 538 637 ; C -1 ; WX 600 ; N Ccaron ; B 33 -14 564 839 ; C -1 ; WX 600 ; N Cacute ; B 33 -14 564 839 ; C -1 ; WX 600 ; N Ccedilla ; B 33 -229 564 597 ; C -1 ; WX 600 ; N degree ; B 125 243 475 596 ; C -1 ; WX 600 ; N Aogonek ; B -21 -208 621 583 ; C -1 ; WX 600 ; N minus ; B 42 230 558 330 ; C -1 ; WX 600 ; N multiply ; B 100 80 500 480 ; C -1 ; WX 600 ; N divide ; B 42 28 558 532 ; C -1 ; WX 600 ; N Aring ; B -21 0 621 871 ; C -1 ; WX 600 ; N trademark ; B -33 220 620 583 ; C -1 ; WX 600 ; N rcommaaccent ; B 54 -278 571 449 ; C -1 ; WX 600 ; N lacute ; B 62 0 538 840 ; C -1 ; WX 600 ; N omacron ; B 42 -16 558 626 ; C -1 ; WX 600 ; N Atilde ; B -21 0 621 799 ; C -1 ; WX 600 ; N icircumflex ; B 62 0 538 696 ; C -1 ; WX 600 ; N igrave ; B 62 0 538 696 ; C -1 ; WX 600 ; N ncommaaccent ; B 23 -278 571 450 ; C -1 ; WX 600 ; N lcommaaccent ; B 62 -278 538 624 ; C -1 ; WX 600 ; N plusminus ; B 42 0 558 624 ; C -1 ; WX 600 ; N onehalf ; B -34 0 629 638 ; C -1 ; WX 600 ; N onequarter ; B -34 0 629 638 ; C -1 ; WX 600 ; N threequarters ; B -43 0 630 637 ; C -1 ; WX 600 ; N iacute ; B 62 0 538 696 ; C -1 ; WX 600 ; N Abreve ; B -21 0 621 831 ; C -1 ; WX 600 ; N kcommaaccent ; B 33 -278 571 624 ; C -1 ; WX 600 ; N Omacron ; B 21 -14 579 769 ; C -1 ; WX 600 ; N imacron ; B 62 0 538 626 ; C -1 ; WX 600 ; N emacron ; B 33 -16 550 626 ; C -1 ; WX 600 ; N amacron ; B 42 -16 571 626 ; C -1 ; WX 600 ; N tcommaaccent ; B 13 -278 529 591 ; C -1 ; WX 600 ; N ydieresis ; B 21 -205 579 654 ; C -1 ; WX 600 ; N zdotaccent ; B 85 0 519 654 ; C -1 ; WX 600 ; N zcaron ; B 85 0 519 696 ; C -1 ; WX 600 ; N zacute ; B 85 0 519 696 ; C -1 ; WX 600 ; N yacute ; B 21 -205 579 696 ; C -1 ; WX 600 ; N uhungarumlaut ; B 13 -13 571 694 ; C -1 ; WX 600 ; N eth ; B 42 -16 558 646 ; C -1 ; WX 600 ; N uring ; B 13 -13 571 727 ; C -1 ; WX 600 ; N Ocircumflex ; B 21 -14 579 839 ; C -1 ; WX 600 ; N commaaccent ; B 183 -278 351 -59 ; C -1 ; WX 600 ; N copyright ; B -7 -15 606 598 ; C -1 ; WX 600 ; N registered ; B -7 -15 606 598 ; C -1 ; WX 600 ; N Acircumflex ; B -21 0 621 839 ; C -1 ; WX 600 ; N idieresis ; B 62 0 538 654 ; C -1 ; WX 600 ; N lozenge ; B 72 -19 529 593 ; C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; C -1 ; WX 600 ; N notequal ; B 42 22 558 525 ; C -1 ; WX 600 ; N radical ; B 12 -60 642 697 ; C -1 ; WX 600 ; N Agrave ; B -21 0 621 839 ; C -1 ; WX 600 ; N Aacute ; B -21 0 621 839 ; C -1 ; WX 600 ; N lessequal ; B 3 0 549 591 ; C -1 ; WX 600 ; N greaterequal ; B 35 0 582 591 ; C -1 ; WX 600 ; N logicalnot ; B 42 115 465 445 ; C -1 ; WX 600 ; N summation ; B 45 -97 538 671 ; C -1 ; WX 600 ; N partialdiff ; B 102 -16 524 590 ; C -1 ; WX 600 ; N Ncommaaccent ; B -8 -278 592 583 ; C -1 ; WX 600 ; N dcroat ; B 33 -16 613 624 ; C -1 ; WX 600 ; N brokenbar ; B 250 -153 350 622 ; C -1 ; WX 600 ; N Lcommaaccent ; B 33 -278 571 583 ; C -1 ; WX 600 ; N Adieresis ; B -21 0 621 798 ; C -1 ; WX 600 ; N mu ; B 13 -153 571 437 ; C -1 ; WX 600 ; N .notdef ; B 375 0 375 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -14 KPX A Ccedilla -22 KPX A G -10 KPX A O -15 KPX A Odieresis -15 KPX A Q -16 KPX A T -27 KPX A U -23 KPX A Uacute -23 KPX A Ucircumflex -23 KPX A Udieresis -23 KPX A Ugrave -23 KPX A V -59 KPX A W -13 KPX A Y -27 KPX A a 15 KPX A b 45 KPX A c -4 KPX A ccedilla -8 KPX A comma -47 KPX A d 4 KPX A e 2 KPX A g 0 KPX A guillemotleft -40 KPX A guilsinglleft -40 KPX A hyphen -19 KPX A o -3 KPX A period -62 KPX A q -4 KPX A quotedblright -84 KPX A quoteright -113 KPX A t -20 KPX A u -12 KPX A v -39 KPX A w -13 KPX A y -39 KPX Aacute C -14 KPX Aacute G -10 KPX Aacute O -15 KPX Aacute Q -16 KPX Aacute T -27 KPX Aacute U -23 KPX Aacute V -59 KPX Aacute W -13 KPX Aacute Y -27 KPX Aacute a 15 KPX Aacute b 45 KPX Aacute c -4 KPX Aacute comma -47 KPX Aacute d 4 KPX Aacute e 2 KPX Aacute g 0 KPX Aacute guillemotleft -40 KPX Aacute guilsinglleft -40 KPX Aacute hyphen -19 KPX Aacute o -3 KPX Aacute period -62 KPX Aacute q -4 KPX Aacute quoteright -113 KPX Aacute t -20 KPX Aacute u -12 KPX Aacute v -39 KPX Aacute w -13 KPX Aacute y -39 KPX Acircumflex C -14 KPX Acircumflex G -10 KPX Acircumflex O -15 KPX Acircumflex Q -16 KPX Acircumflex T -27 KPX Acircumflex U -23 KPX Acircumflex V -59 KPX Acircumflex W -13 KPX Acircumflex Y -27 KPX Acircumflex comma -47 KPX Acircumflex period -62 KPX Adieresis C -14 KPX Adieresis G -10 KPX Adieresis O -15 KPX Adieresis Q -16 KPX Adieresis T -27 KPX Adieresis U -23 KPX Adieresis V -59 KPX Adieresis W -13 KPX Adieresis Y -27 KPX Adieresis a 15 KPX Adieresis b 45 KPX Adieresis c -4 KPX Adieresis comma -47 KPX Adieresis d 4 KPX Adieresis g 0 KPX Adieresis guillemotleft -40 KPX Adieresis guilsinglleft -40 KPX Adieresis hyphen -19 KPX Adieresis o -3 KPX Adieresis period -62 KPX Adieresis q -4 KPX Adieresis quotedblright -84 KPX Adieresis quoteright -113 KPX Adieresis t -20 KPX Adieresis u -12 KPX Adieresis v -39 KPX Adieresis w -13 KPX Adieresis y -39 KPX Agrave C -14 KPX Agrave G -10 KPX Agrave O -15 KPX Agrave Q -16 KPX Agrave T -27 KPX Agrave U -23 KPX Agrave V -59 KPX Agrave W -13 KPX Agrave Y -27 KPX Agrave comma -47 KPX Agrave period -62 KPX Aring C -14 KPX Aring G -10 KPX Aring O -15 KPX Aring Q -16 KPX Aring T -27 KPX Aring U -23 KPX Aring V -59 KPX Aring W -13 KPX Aring Y -27 KPX Aring a 15 KPX Aring b 45 KPX Aring c -4 KPX Aring comma -47 KPX Aring d 4 KPX Aring e 2 KPX Aring g 0 KPX Aring guillemotleft -40 KPX Aring guilsinglleft -40 KPX Aring hyphen -19 KPX Aring o -3 KPX Aring period -62 KPX Aring q -4 KPX Aring quotedblright -84 KPX Aring quoteright -113 KPX Aring t -20 KPX Aring u -12 KPX Aring v -39 KPX Aring w -13 KPX Aring y -39 KPX Atilde C -14 KPX Atilde G -10 KPX Atilde O -15 KPX Atilde Q -16 KPX Atilde T -27 KPX Atilde U -23 KPX Atilde V -59 KPX Atilde W -13 KPX Atilde Y -27 KPX Atilde comma -47 KPX Atilde period -62 KPX B A 4 KPX B AE 3 KPX B Aacute 4 KPX B Acircumflex 4 KPX B Adieresis 4 KPX B Aring 4 KPX B Atilde 4 KPX B O -9 KPX B OE 11 KPX B Oacute -9 KPX B Ocircumflex -9 KPX B Odieresis -9 KPX B Ograve -9 KPX B Oslash -5 KPX B V -18 KPX B W -6 KPX B Y -39 KPX C A 8 KPX C AE 7 KPX C Aacute 8 KPX C Adieresis 8 KPX C Aring 8 KPX C H -13 KPX C K -8 KPX C O -14 KPX C Oacute -14 KPX C Odieresis -14 KPX Ccedilla A 3 KPX D A -25 KPX D Aacute -25 KPX D Acircumflex -25 KPX D Adieresis -25 KPX D Agrave -25 KPX D Aring -25 KPX D Atilde -25 KPX D J -32 KPX D T -27 KPX D V -30 KPX D W -13 KPX D X -37 KPX D Y -51 KPX F A -39 KPX F Aacute -39 KPX F Acircumflex -39 KPX F Adieresis -39 KPX F Agrave -39 KPX F Aring -39 KPX F Atilde -39 KPX F J -78 KPX F O -24 KPX F Odieresis -24 KPX F a -40 KPX F aacute -40 KPX F adieresis -40 KPX F ae -18 KPX F aring -40 KPX F comma -168 KPX F e -47 KPX F eacute -47 KPX F hyphen -55 KPX F i -46 KPX F j -54 KPX F o -51 KPX F oacute -51 KPX F odieresis -51 KPX F oe -16 KPX F oslash -51 KPX F period -187 KPX F r -32 KPX F u -1 KPX G A 6 KPX G AE 5 KPX G Aacute 6 KPX G Acircumflex 6 KPX G Adieresis 6 KPX G Agrave 6 KPX G Aring 6 KPX G Atilde 6 KPX G T -25 KPX G V 6 KPX G W 6 KPX G Y -14 KPX J A -8 KPX J AE -16 KPX J Adieresis -8 KPX J Aring -8 KPX K C -24 KPX K G -19 KPX K O -25 KPX K OE -4 KPX K Oacute -25 KPX K Odieresis -25 KPX K S -9 KPX K T -13 KPX K a 6 KPX K adieresis 6 KPX K ae 31 KPX K aring 6 KPX K e -6 KPX K hyphen -44 KPX K o -12 KPX K oacute -12 KPX K odieresis -12 KPX K u -22 KPX K udieresis -22 KPX K y -50 KPX L A 16 KPX L AE 16 KPX L Aacute 16 KPX L Adieresis 16 KPX L Aring 16 KPX L C -10 KPX L Ccedilla -11 KPX L G -10 KPX L O -7 KPX L Oacute -7 KPX L Ocircumflex -7 KPX L Odieresis -7 KPX L Ograve -7 KPX L Otilde -7 KPX L S -24 KPX L T -52 KPX L U -29 KPX L Udieresis -29 KPX L V -57 KPX L W -22 KPX L Y -52 KPX L hyphen 9 KPX L quotedblright -72 KPX L quoteright -99 KPX L u -10 KPX L udieresis -11 KPX L y -33 KPX N A -3 KPX N AE -3 KPX N Aacute -3 KPX N Adieresis -3 KPX N Aring -3 KPX N C -7 KPX N Ccedilla -6 KPX N G -6 KPX N O -5 KPX N Oacute -5 KPX N Odieresis -5 KPX N a -11 KPX N aacute -11 KPX N adieresis -11 KPX N ae 18 KPX N aring -11 KPX N comma -75 KPX N e -3 KPX N eacute -3 KPX N o -8 KPX N oacute -8 KPX N odieresis -8 KPX N oslash -3 KPX N period -93 KPX N u -8 KPX N udieresis -8 KPX O A -14 KPX O AE -14 KPX O Aacute -14 KPX O Adieresis -14 KPX O Aring -14 KPX O T -15 KPX O V -23 KPX O W -2 KPX O X -26 KPX O Y -43 KPX Oacute A -14 KPX Oacute T -15 KPX Oacute V -23 KPX Oacute W -2 KPX Oacute Y -43 KPX Ocircumflex T -15 KPX Ocircumflex V -23 KPX Ocircumflex Y -43 KPX Odieresis A -14 KPX Odieresis T -15 KPX Odieresis V -23 KPX Odieresis W -2 KPX Odieresis X -26 KPX Odieresis Y -43 KPX Ograve T -15 KPX Ograve V -23 KPX Ograve Y -43 KPX Oslash A -10 KPX Otilde T -15 KPX Otilde V -23 KPX Otilde Y -43 KPX P A -61 KPX P AE -59 KPX P Aacute -61 KPX P Adieresis -61 KPX P Aring -61 KPX P J -73 KPX P a -49 KPX P aacute -49 KPX P adieresis -49 KPX P ae -27 KPX P aring -49 KPX P comma -160 KPX P e -38 KPX P eacute -38 KPX P hyphen -33 KPX P o -42 KPX P oacute -42 KPX P odieresis -42 KPX P oe -13 KPX P oslash -42 KPX P period -178 KPX R C -14 KPX R Ccedilla -17 KPX R G -10 KPX R O -14 KPX R OE 5 KPX R Oacute -14 KPX R Odieresis -14 KPX R T -28 KPX R U -16 KPX R Udieresis -17 KPX R V -24 KPX R W -8 KPX R Y -28 KPX R a 14 KPX R aacute 14 KPX R adieresis 14 KPX R ae 40 KPX R aring 14 KPX R e 2 KPX R eacute 2 KPX R hyphen -25 KPX R o -3 KPX R oacute -3 KPX R odieresis -3 KPX R oe 29 KPX R u -7 KPX R uacute -8 KPX R udieresis -8 KPX R y -18 KPX S A -10 KPX S AE -10 KPX S Aacute -10 KPX S Adieresis -10 KPX S Aring -10 KPX S T -41 KPX S V -10 KPX S W -12 KPX S Y -31 KPX S t -17 KPX T A -28 KPX T AE -28 KPX T Aacute -28 KPX T Acircumflex -28 KPX T Adieresis -28 KPX T Agrave -28 KPX T Aring -28 KPX T Atilde -28 KPX T C -19 KPX T G -19 KPX T J -65 KPX T O -14 KPX T OE 6 KPX T Oacute -14 KPX T Ocircumflex -14 KPX T Odieresis -14 KPX T Ograve -14 KPX T Oslash -14 KPX T Otilde -14 KPX T S -41 KPX T V 10 KPX T W 4 KPX T Y -10 KPX T a -34 KPX T ae -12 KPX T c -37 KPX T colon -112 KPX T comma -130 KPX T e -26 KPX T g -24 KPX T guillemotleft -73 KPX T guilsinglleft -73 KPX T hyphen -91 KPX T i -42 KPX T j -49 KPX T o -31 KPX T oslash -31 KPX T period -148 KPX T r -28 KPX T s -39 KPX T semicolon -100 KPX T u 4 KPX T v 10 KPX T w 10 KPX T y 0 KPX U A -19 KPX U AE -18 KPX U Aacute -19 KPX U Acircumflex -19 KPX U Adieresis -19 KPX U Aring -19 KPX U Atilde -19 KPX U comma -95 KPX U m 16 KPX U n -8 KPX U p 0 KPX U period -114 KPX U r -34 KPX Uacute A -19 KPX Uacute comma -95 KPX Uacute m 16 KPX Uacute n -8 KPX Uacute p 0 KPX Uacute period -114 KPX Uacute r -34 KPX Ucircumflex A -19 KPX Udieresis A -19 KPX Udieresis b 27 KPX Udieresis comma -95 KPX Udieresis m 16 KPX Udieresis n -8 KPX Udieresis p 0 KPX Udieresis period -114 KPX Udieresis r -34 KPX Ugrave A -19 KPX V A -4 KPX V AE -12 KPX V Aacute -4 KPX V Acircumflex -4 KPX V Adieresis -4 KPX V Agrave -4 KPX V Aring -4 KPX V Atilde -4 KPX V C -24 KPX V G -24 KPX V O -23 KPX V Oacute -23 KPX V Ocircumflex -23 KPX V Odieresis -23 KPX V Ograve -23 KPX V Oslash -23 KPX V Otilde -23 KPX V S -27 KPX V T 10 KPX V a -54 KPX V ae -27 KPX V colon -132 KPX V comma -146 KPX V e -47 KPX V g -46 KPX V guillemotleft -75 KPX V guilsinglleft -75 KPX V hyphen -39 KPX V i -59 KPX V o -52 KPX V oslash -48 KPX V period -164 KPX V r -45 KPX V semicolon -120 KPX V u -15 KPX V y -17 KPX W A -9 KPX W AE -9 KPX W Aacute -9 KPX W Acircumflex -9 KPX W Adieresis -9 KPX W Agrave -9 KPX W Aring -9 KPX W Atilde -9 KPX W C -4 KPX W G -3 KPX W O -2 KPX W Oacute -2 KPX W Ocircumflex -2 KPX W Odieresis -2 KPX W Ograve -2 KPX W Oslash 2 KPX W Otilde -2 KPX W S -17 KPX W T 4 KPX W a -11 KPX W ae 17 KPX W colon -99 KPX W comma -83 KPX W e -3 KPX W g -3 KPX W guillemotleft -31 KPX W guilsinglleft -31 KPX W hyphen 1 KPX W i -38 KPX W o -8 KPX W oslash -4 KPX W period -101 KPX W r -25 KPX W semicolon -82 KPX W u 1 KPX W y -2 KPX X C -28 KPX X O -26 KPX X Odieresis -26 KPX X Q -26 KPX X a 0 KPX X e -12 KPX X hyphen -50 KPX X o -18 KPX X u -28 KPX X y -43 KPX Y A -25 KPX Y AE -28 KPX Y Aacute -25 KPX Y Acircumflex -25 KPX Y Adieresis -25 KPX Y Agrave -25 KPX Y Aring -25 KPX Y Atilde -25 KPX Y C -45 KPX Y G -45 KPX Y O -44 KPX Y Oacute -44 KPX Y Ocircumflex -44 KPX Y Odieresis -44 KPX Y Ograve -44 KPX Y Oslash -43 KPX Y Otilde -44 KPX Y S -48 KPX Y T -10 KPX Y a -53 KPX Y ae -28 KPX Y colon -150 KPX Y comma -118 KPX Y e -59 KPX Y g -59 KPX Y guillemotleft -94 KPX Y guilsinglleft -94 KPX Y hyphen -81 KPX Y i -58 KPX Y o -64 KPX Y oslash -51 KPX Y p -30 KPX Y period -136 KPX Y semicolon -133 KPX Y u -43 KPX Y v -33 KPX Z v -41 KPX Z y -52 KPX a j -81 KPX a quoteright -78 KPX a v -21 KPX a w -12 KPX a y -31 KPX aacute v -21 KPX aacute w -12 KPX aacute y -31 KPX adieresis v -21 KPX adieresis w -12 KPX adieresis y -31 KPX ae v 28 KPX ae w 32 KPX ae y 18 KPX agrave v -21 KPX agrave w -12 KPX agrave y -31 KPX aring v -21 KPX aring w -12 KPX aring y -31 KPX b v 0 KPX b w 4 KPX b y -10 KPX c h 11 KPX c k 6 KPX comma one -128 KPX comma quotedblright -137 KPX comma quoteright -166 KPX e quoteright -65 KPX e t -16 KPX e v -9 KPX e w -3 KPX e x 6 KPX e y -20 KPX eacute v -9 KPX eacute w -3 KPX eacute y -20 KPX ecircumflex v -9 KPX ecircumflex w -3 KPX ecircumflex y -20 KPX eight four -58 KPX eight one -72 KPX eight seven -65 KPX f a -32 KPX f aacute -32 KPX f adieresis -32 KPX f ae -7 KPX f aring -32 KPX f e -43 KPX f eacute -43 KPX f f -43 KPX f i -37 KPX f j -60 KPX f l -25 KPX f o -47 KPX f oacute -47 KPX f odieresis -42 KPX f oe -15 KPX f oslash -29 KPX f quoteright -73 KPX f s -42 KPX f t -6 KPX five four -52 KPX five one -73 KPX five seven -73 KPX four four -62 KPX four one -66 KPX four seven -93 KPX g a -4 KPX g adieresis -4 KPX g ae 23 KPX g aring -4 KPX g e 1 KPX g eacute 1 KPX g l -34 KPX g oacute -3 KPX g odieresis -3 KPX g r 0 KPX guillemotright A -37 KPX guillemotright AE -34 KPX guillemotright Aacute -37 KPX guillemotright Adieresis -37 KPX guillemotright Aring -37 KPX guillemotright T -71 KPX guillemotright V -72 KPX guillemotright W -29 KPX guillemotright Y -92 KPX guilsinglright A -37 KPX guilsinglright AE -34 KPX guilsinglright Aacute -37 KPX guilsinglright Adieresis -37 KPX guilsinglright Aring -37 KPX guilsinglright T -71 KPX guilsinglright V -72 KPX guilsinglright W -29 KPX guilsinglright Y -92 KPX h quoteright -69 KPX h y -23 KPX hyphen A -18 KPX hyphen AE -14 KPX hyphen Aacute -18 KPX hyphen Adieresis -18 KPX hyphen Aring -18 KPX hyphen T -90 KPX hyphen V -38 KPX hyphen W 1 KPX hyphen Y -81 KPX i T -58 KPX i j -143 KPX k a 1 KPX k aacute 1 KPX k adieresis 1 KPX k ae 26 KPX k aring 1 KPX k comma -63 KPX k e -11 KPX k eacute -11 KPX k g -14 KPX k hyphen -50 KPX k o -17 KPX k oacute -17 KPX k odieresis -17 KPX k period -75 KPX k s -9 KPX k u -3 KPX k udieresis -3 KPX l v -77 KPX l y -77 KPX m p 32 KPX m v 18 KPX m w 22 KPX m y 8 KPX n T -40 KPX n p 4 KPX n quoteright -68 KPX n v -12 KPX n w -5 KPX n y -22 KPX nine four -53 KPX nine one -66 KPX nine seven -57 KPX o T -31 KPX o quoteright -62 KPX o t -13 KPX o v -6 KPX o w -3 KPX o x -10 KPX o y -17 KPX oacute v -6 KPX oacute w -3 KPX oacute y -17 KPX ocircumflex t -13 KPX odieresis t -13 KPX odieresis v -6 KPX odieresis w -3 KPX odieresis x -10 KPX odieresis y -17 KPX ograve v -6 KPX ograve w -3 KPX ograve y -17 KPX one comma -99 KPX one eight -74 KPX one five -55 KPX one four -87 KPX one nine -73 KPX one one -62 KPX one period -114 KPX one seven -141 KPX one six -98 KPX one three -53 KPX one two -47 KPX one zero -86 KPX p t -3 KPX p y -6 KPX period one -113 KPX period quotedblright -131 KPX period quoteright -161 KPX q c 2 KPX q u 41 KPX quotedblbase A -6 KPX quotedblbase AE -7 KPX quotedblbase T -90 KPX quotedblbase V -104 KPX quotedblbase W -43 KPX quotedblbase Y -78 KPX quotedblleft A -62 KPX quotedblleft AE -60 KPX quotedblleft Aacute -62 KPX quotedblleft Adieresis -62 KPX quotedblleft Aring -62 KPX quotedblleft T -24 KPX quotedblleft V -22 KPX quotedblleft W -13 KPX quotedblleft Y -49 KPX quotedblright A -76 KPX quotedblright AE -75 KPX quotedblright Aacute -76 KPX quotedblright Adieresis -76 KPX quotedblright Aring -76 KPX quotedblright T -39 KPX quotedblright V -30 KPX quotedblright W -26 KPX quotedblright Y -51 KPX quoteleft A -87 KPX quoteleft AE -85 KPX quoteleft Aacute -87 KPX quoteleft Adieresis -87 KPX quoteleft Aring -87 KPX quoteleft T -49 KPX quoteleft V -46 KPX quoteleft W -38 KPX quoteleft Y -73 KPX quoteright A -154 KPX quoteright AE -153 KPX quoteright Aacute -154 KPX quoteright Adieresis -154 KPX quoteright Aring -154 KPX quoteright comma -227 KPX quoteright d -140 KPX quoteright o -143 KPX quoteright period -244 KPX quoteright r -149 KPX quoteright s -150 KPX quoteright t -117 KPX quoteright v -110 KPX quoteright w -105 KPX quoteright y -116 KPX r a -17 KPX r aacute -17 KPX r acircumflex -17 KPX r adieresis -17 KPX r ae 4 KPX r agrave -17 KPX r aring -17 KPX r c -18 KPX r ccedilla -15 KPX r colon -95 KPX r comma -108 KPX r d -8 KPX r e -7 KPX r eacute -7 KPX r ecircumflex -7 KPX r egrave -7 KPX r f -16 KPX r g -5 KPX r h -20 KPX r hyphen -41 KPX r i -25 KPX r j -33 KPX r k -30 KPX r l -47 KPX r m 36 KPX r n 10 KPX r o -12 KPX r oacute -12 KPX r ocircumflex -12 KPX r odieresis -12 KPX r oe 18 KPX r ograve -12 KPX r oslash -12 KPX r p 30 KPX r period -122 KPX r q -4 KPX r quoteright -41 KPX r r -11 KPX r s -21 KPX r semicolon -83 KPX r t 20 KPX r u 20 KPX r v 26 KPX r w 26 KPX r x 7 KPX r y 16 KPX r z -21 KPX s quoteright -60 KPX s t -11 KPX seven colon -156 KPX seven comma -157 KPX seven eight -74 KPX seven five -82 KPX seven four -101 KPX seven one -67 KPX seven period -176 KPX seven seven -62 KPX seven six -93 KPX seven three -72 KPX seven two -64 KPX six four -49 KPX six one -54 KPX six seven -46 KPX t S -35 KPX t a -16 KPX t aacute -16 KPX t adieresis -16 KPX t ae 9 KPX t aring -16 KPX t colon -117 KPX t e -24 KPX t eacute -24 KPX t h -5 KPX t o -30 KPX t oacute -30 KPX t odieresis -30 KPX t quoteright -102 KPX t semicolon -103 KPX three four -52 KPX three one -71 KPX three seven -64 KPX two four -67 KPX two one -66 KPX two seven -68 KPX u quoteright -56 KPX v a -3 KPX v aacute -3 KPX v acircumflex -3 KPX v adieresis -3 KPX v ae 18 KPX v agrave -3 KPX v aring -3 KPX v atilde -3 KPX v c -11 KPX v colon -81 KPX v comma -136 KPX v e 0 KPX v eacute 0 KPX v ecircumflex 0 KPX v egrave 0 KPX v g 1 KPX v hyphen -23 KPX v l -77 KPX v o -5 KPX v oacute -5 KPX v odieresis -5 KPX v ograve -5 KPX v oslash -5 KPX v period -156 KPX v s -11 KPX v semicolon -69 KPX w a -3 KPX w aacute -3 KPX w acircumflex -3 KPX w adieresis -3 KPX w ae 23 KPX w agrave -3 KPX w aring -3 KPX w atilde -3 KPX w c -6 KPX w colon -81 KPX w comma -90 KPX w e 2 KPX w eacute 2 KPX w ecircumflex 2 KPX w egrave 2 KPX w g 3 KPX w hyphen 3 KPX w l -48 KPX w o -2 KPX w oacute -2 KPX w odieresis -2 KPX w ograve -2 KPX w oslash 2 KPX w period -109 KPX w s -11 KPX w semicolon -69 KPX x a 5 KPX x c -14 KPX x e -5 KPX x eacute -5 KPX x o -10 KPX x q -8 KPX y a -13 KPX y aacute -13 KPX y acircumflex -13 KPX y adieresis -13 KPX y ae 8 KPX y agrave -13 KPX y aring -13 KPX y atilde -13 KPX y c -21 KPX y colon -91 KPX y comma -134 KPX y e -11 KPX y eacute -11 KPX y ecircumflex -11 KPX y egrave -11 KPX y g -9 KPX y hyphen -19 KPX y l -78 KPX y o -15 KPX y oacute -15 KPX y odieresis -15 KPX y ograve -15 KPX y oslash -15 KPX y period -155 KPX y s -21 KPX y semicolon -79 KPX zero four -59 KPX zero one -76 KPX zero seven -68 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n022024l.pfb0000644000076500001440000014450707056046554016425 0ustar fnevgenyusers€g%!PS-AdobeFont-1.0: NimbusMonL-BoldObli 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Mono L Bold Oblique) readonly def /FamilyName (Nimbus Mono L) readonly def /Weight (Bold) readonly def /ItalicAngle -12.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusMonL-BoldObli def /PaintType 0 def /WMode 0 def /FontBBox {-61 -278 840 871} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020948 def currentdict end currentfile eexec €¸Àé ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>j/¿Ÿ?4 …ô/æ:Í“ØFµ}0ÛâÖ´´+§³„ÏZ®êy{ ß` ëè?½Ô“ñ‚{D›ï.«ˆyëïåY ïûx;à`/§nSîN é¥Q‰¾äË„-88ÜÅO¿t#"šÖ‹˜à3;>FJ›®¡‡`Ð]…˜K > ’«¡ôt³òw—Ò„B+¿?[ÿ+-á&m äOš]Žl€ ïÓ¥9Dÿñufª¶œ^XÍ~&Á»,¨¬¶ÿCu©Ž#äï_7îªTœÞÁ¨#µ©>P¦À2cÒð˜$÷®¶³…ÉÑ©¾çÛØÇ‡÷Š”ùl×VùÆ1QÊt+Šå ~¨`\ᔃ2é&¿N|äÎ˹A×eŸm¤½™ùýNol°X<‹¡Š}&Éèͧ÷—„ðS$6„i7¤‚¨ò,‘BO%S<¿›¢´=ƒ: üz•î†Í±™!´â{H~.5<‹”+ýÍ—Kú )%qúcUQ¹ýŽá¼”gëÜÔ[7,Ê×éù4`DŸ$3`0)L+ɱ&bqèÞR… ƒÒ§Òcm>¹'ruñD˜$_ß&-T«"ɇm:´ðìŽ#ÒŠË-=A7WíOºòÐ=º®çEö&r¢8X𲋣¡«k;— (Ò÷Gú˾÷èËÀ¨G‰æ¢s ÏQÛ.95ñn,m©ÑëTöçXRü|½»Þµ²z)ž@°‰ej–Þ&ûTÓýä ÖMã0Ú)Hku(¢à€/Èqʆˎ´zrþsPè¨{Ü®¯#3¦»’›} +ÕäѬžÖøãE½žÒ4ö9Im`ÃÈ@…ÃM—‘üð@ñ(Xt6~[傌Ü÷swP9#}¥3æyþ}û›r!°O-i­ÑžÏÚ ”¿SÜ8ŸÐfnÂ’89•Q·s$žçðþyʉ­JÚ&zî<ç[ÈŒLÀ=~ Ê*ñ[q£Á;)ß Á¦Ûk/—à=‚ŸmèûQÔãD‡0ü”¯]b¶ž*û„:⨱-PFç¿éûü$¼b2ãR²ZŽŠPoìð%qž׉ @ÿÿ°ÜÔ*e@-ó}‹+‘Ìÿí0¸á’µòõ=&:Þ˜òü”Ñ–“sK«E® îf+ ¹%­T¯Ãµ?%¤»±.§ì×±¤—B˜Z-W"7bÖØ6ˆEuÙ £ÿâ™—žN¼y¿¬p ­Ä Æv­Yq(Н+¬Jtq\üv±æÕ%à÷v¶PeEŽcámÂÆÖέȺ” *x |›=‡Ž”&ΖŽeä¿Ùôu‚ï,7ÃaÁ·þ$ZmÖÅ¿Š„ÌÊÍ–ÍêàrÀ˜V³6V>fA[r}XÖ.Ës‚ÂÇäP<04lâ¼ôº¢È{pñ§ê&ýw“±ã·qÕñÅîŒ(+ÀY‰søSÅxÐÏS®!<p«Ûóûø >w÷ÛYù0.¥[»é÷uÐO2BÊØŽ*ìèÛYÚì|÷èœÌ÷6ÆÞÌýPCgû〄:²ŒÀãéá7L$ÁUgE>Ž’Žsþžê´ãȱ½’ °ÔÔ€¼çcÂ[¹5¦éužWL~4*,x±·‹hÍ“^j¦X:NR‹ðf¼„7R©sÝ`¦“´^ÿlQÿ‰ F­3À^ø º`„$¥‚–…HÑÅd ¸(W†ýàøûŸ!ÅWz¾–ƒÁdºšipšÄmfKƒ:§þZ?­¶zÓ½‚®C|ç´iΠâ‹üÎÖøÓìÊ6l©%º? ¾œ4Ø- rž‚ŸM {N–0‡¦Œ Qaä1³e€M—«Á‰·l¢Kûz‰x5æ,*×З»ÖN¶T/~O£ü— X@`˜Å5dï¿F‰ÜD¶€ ŠTÃ`+U¦ Ó­?¸>í¦Ýí¦ÝêN¤$U>Â/½ÞöRTH‘­NÓŽñ•ÄBŽêèPÆ-ºÂùãÉÏÈeB= \¯”lj îÀ ÐÎh•zá¶f䫾‚¡Æ£éXY5.„áóâN€º³~>´" ââqsŠÃ3?ÐDA¤Ç~\°þÝ/= “Ð&vDõk!±ïÚÓ¶^ŒÀÒÌRdYÏ#‘ðÚýØz/Á]èeŒêÀ§ø~`(¨ò\çòphB˜Þ¨Ægù‹.Dc˜î¯1©íß‘“»XaM÷¿Yc/ÁLÝÍoý¥Ü×0 ܆a¯AÏûpºp-úÝpt«Ð~€ù1L>¦¬§WOMÝëK5ÇŒ»7fwÛH0CX”¦ȳǟÛª~Zã¥ÛIY±Bf„&.=Iê몆7Îs\ý[ò˜¼"t£Uw¹[Öů ŸdóÁdÖE}­ò-RñJP×ÐØ{-¶±á’$÷ 0ˆŽ$AÈš­~ôUtîòn>žy/cƸ»Š‘^Zö*·¼}¹´Ú( ½¾%åuèшá˜h½*à*ö îÚ5ˆ)hŸaØ]Êã‹ÍŽøa]V*ƒÏþ^—âðà·‰WV˜iῈW†åTÝFMœž˜DÍ5zû…‹ü(W[£ãP苺*[à.Ü $¼?ò˜ãØLò;§)1ª'ŽâG“uàÕ“ØøªßâTaœý‚ZUŸ–9ñ˜Î´‘ºÕR™3. Ïª+˪}ùÜk¢áÓ©gjðäQù-.ÕGâß [‹½@»Z¢ßfÿ¾hS~‚=¦|)6œ‰Áý›«‘0žÿ^ WXÙê ›—Ì}³x‹ÙÿŽáÏ 2ìÝYR…‡&ß3϶  %I|ÕNÚôI&È £ÒéèO#³ðÿ#þâM­¼6I.ß«ì O¥|LGÒ謵éÿ^ĆÚ*ÃíQ£³i3ÕKÎÇÊî½8WӃݗc"ª&1^?×wšP1«Aïû²•¯àfçÁè6qå(ìyšT›ÞH¥øyñ6øÁw±"þެ8fˆ‚¤n} X{Õa³D†ÚÓl)ÂOÄFÒ»Ä%jôê~Ý(‘J‘îA–3›¸[Ý8ÁAvi³EÔokn¢ã ˜¬aЀs È–#É¢…f§&¦fZÇ {ÒáçWÀ ;ø›è>@Ö¶I'œôüÎe\ÆË*-•ÈFÖˆSÖT(m\,-Žê”þûgbüÍ“îºÂßþøwÇKÚÎqc¶T˜-†Kh9Ûô|zÔóŒÚ´+ÊSî¡MBbÚƒ(·\È£BW sÀS´Åì.<Í,¨ÞõQëÌÄöû’[¢¬|¯¾Ð°¿® ¢~ìÎÚ÷ëRü¶¢T£íQ7L’UËDHùžA‡p˜z(vdÛö’Ÿí“{³@VŽ‚bwèÜ8ôÜídN#¸ò˜·P[³{ÿˆd§‚Q}ǯ-›ªf^{ë*ló ËzrÁ;•9gë=X“Ò-ÅÐXÌ*F"/dW®ˆNY0é çïfì~VÕ9¤s´Á;)ÍT´>ïvÔB«Ô­‘ö½+R6fž_ ƒ7Z6=·¬Õ(€>D[ 2ô¦ª›üÁÇÙ¹6MÇퟳL<¼)iHËç+и`ô;Ô?ü«l ”U˜0xjXëëKˆgs¢LïT;¹Þóèhß¶Ÿ€Ý°w`nú¢ˆó¥üÅ­=ÑÑ£Ž"è«îP§¦ÅËDËÃ9üÿÚÖä…»âã–þ9†”+Å ¤ÌÛåùaøD®T51iÏ †t©ž®÷l™Ä¬Šl tPŒ~Gp.ÁäGI:ÉòˆÞ«`ö¥æï¢`àHRçÛÇœ­Ášè¿3½â{ÝÆè6ž  ;‡|´ q‘ÓÃòõŠ´°£¯Â©¿j¥êt¬Ï0P<õ¡¾×Õ”¿ì¿o¥ÌCa'Ÿ`|¼zÎ"$®OÛ‰ƒ—Åco+üSE†>Ž¥4­¬×¡êôMŠè‚í¤°%«íTüR„?ïâþǼ,üÉ^­¥'c½ƒ—/e)ì>­Ö¢Ì–Úɤg‡ˆÀcUÆ#”…"_!S<ýKOלG’mdXŒ*½À4wÐ,|BÅáLv"ϲ4Î>¿çž6ç/Þ½N`Ng NV”—¢)Òñ´<vËí@ž!ñ¤÷aà $¯Às£¥¸"ë!}´aˆvã:ÑŽ›YEm´Ó:Ü›¤†IèMl ›¾ÇŒ$ô‡Æ©4ݱ©nXfó‰ð;65uŠÿoc›ÆEa¥«ª?Kß°À3àIFé¥ÚMãýU©©qݱM¨óurèRµTÛjˆ€oFa°®#B4á[™¦Ä«!Óhß-¦^š?·6ÚtˆC" ‘cW×°Ï_$l©+¸8•›¯Pp‡"m©µ0bw¾RÜaîVG§,Ýhlt×. wÄëX‰LWÉÕŒs¤H,0*ãƒÚ»DÞ~uŠÙö’Dê¿å.‹ááBœå›1ü$¥@£‘«¶uŒC no£ç÷¤#¦qÝBÕjS"h#Õºbá­ì‹Ä8–œ.ÕÁÂ[ž+Ziøœ›þ‹¿PÄük·Öó´…Å,ZŠå±}û«ú8êõ?Qq¬n)¯šdÁ=gnÛèUVa¿Bkqû€ù„£w–^q˜=dº>´e˜Žqõ‘Á =¶çìºÉ½™‘æ¾ÑÃÇZŠ ˜vÝY+Úgš7ÏîMMòú„à˜PqÍïÓå×ÈþT5ãVÀ2åô™LŽñõyœ§ ;3g›-®³:û‰%$hg÷§íx¯ó)‹ßÕ»õô0ÉÁYÅmÆ^ô@OLRU½|æH­*D¶¾öÑŽ¿ëU– ÚàF(t=úÿËG>¸q¶ûNÙLŒ»°=Ö›[´ ´ð’ˆ¬ž­KÅ2Ú¶˜õÀJ•œ¦0½°c¾¼ 5s*¥€#z^ºé  ¡ ²ƒöá“™Ùû›Öl†%;ÐÓÜs _Ș¿¥Pˆ\N<½krô;ž* 6-cgÕ&•ðwR*7¶U*¢Ñç0#»f¤®£É ÜौêV#hc"¨þnˆò%%r„ñRÌî’14(ëe3UCtYáZÓt憬¦ns߷‡¾¤ ›i¶£ e¶Ô°`Нš´Våd¨Ê-¾í~溜J±l ˜5—N)†°ÙöˆŠCî¬`KÏš <¦ º_JVZÉùüÅa¿—D1Ó}—©.Q~ðö¬0ǯÊI LvèÈ@6òJ'»ùR¤ïwgQ‹ð¶—7¶[{jê-h¬±ø,^–kæ«‹³Š±‚7u»5Ö À•nu­ö>×à—˜ËÀá#WBuy…~r~“O±7‚çÀbƒ$¨¼8ÅvµÙl?ñ%û’]qò׿uÀÆ6`7·µ×»5¶®ñtZ{BÝ?=ÁYš+‰v ò4ÐÊU}õó¾ÙçÎÝ,>˜'òŸFgä¥^‹¬…ºÏ3qosTêk–wl&¿tøÆÜAÏAl‚²"g…Û†ænÝä]¨åªs‰4Єí?‹«EŤi@íÓ&náªl‹$ ˜ñì‚„¼¬/ï¾—8…¢ÅþZDŽòìdÅzÀi˜ªòOp+pêØbô2tgÜUXµ!µ¤uúèYSM-ïókò‰ÉÀUm¾G/ƒ8t0j¦5§Ós _§;Ù©?©ZÚHZdJ[ít§ü þ¼â*ÇÎ ØæAC0g˜ Ã5©§5-˜Cö^L&IiudøBÎ4Ú¬8k1r" e!Æì®'kc¾²Á’}ˆaxì>Ùx=ßANá4رN’?þZO&~uSã°!î'å6½IcÆ”U1Ž\í »O¯LÔ™ŠjJp4ï ¨ÆO0ïÆ«Nb##>aƒAŸS¨’!©dhÝ9XŠ~š8ü*–,ŒQ~êÕo6XF†Î‘%ÕúÌé\{œ–ÁÇ>§ip²ÃCʆS}ìVð¼CƤªÓ&­2–—w¦)H ú›`*h òe ¼œÞü§Ä·œ¯öÏÌ+Ÿ ÊiÔ%Go-7.‹kI«”>0§dmÑnºâ¾­uxKPò×®0¤Ë«ÍPÐÚšúLó8Xåu·iÆ"‹8tC ¶Š AbqÓWâ[ÙGâW<Æ‹üS,Ï&ƒ‘ÜQi(øç2ÒåH*ÓÇ>%]è©7–*VÀø:¾cŸ,œlB')×Mþ„¿rÔ-‚Ò-ò8,Ó=ļÀ0©)!ÄùCÌBóZÁÝÒ¦ÿ7¹,æÉS©xŽèÄÊ`2Œvü7ß;\¿·¾èÑ õ“N5;2žÆ›‘ÄR >€¿?®Q¯c{Ìî«+D]ÿ ú7 ÈŸþ!fæË3ƒY+¤<28n«„ÕšF20¡ã½´(ó bL°.Ú/ÛÏkkrÙ£? ò÷äeD‰L•!¥¾ª•Üœ¨³¯Ó˜†AèÑðR>Ïö ÙZß„¤dÚFÆôVO“Ɖ«rÍ8É!Wz r\[‹½Ûp-ÊåS5Obƶ®”~øˆß„@ ‘ñ]-"¯Ÿ6†Žý1ÍP|*“HR.2ø?öŽÎ˜\5ì°Ø|Í¢¿ÚI§Eø?OûEÛc¶q]NaN ZÝ?yh«³9E¥6yÄ£uÆJ'çr󢆑ÅK5ª— 8üG& ;¿j90ãim¹ ꊀï7Y.ˆ`¾ ùoÁÚ8k§`õß@ú!ž¡¦¥¼}lT«õžqóèë^°/”¬:Þk‰¿Õv‚kâ%4%cøŸL Z¶Ç(tŠßýæ²!—è~ ÏeSƒÎéZGâmØøHÂB%um›%åüô‚võáþ¸uIùj8·—€htÖv1³AÜÏZ„èexƒ~Ã)hÅ~+p8{O¢—¬ñÊÆ^ð¦ôheȬ»ë«ûƒÓOKR^¬Á-'3ÂóÌJ(§à0’& à9…eÿ¥[©¤ËíZõ…É8¨ áW?cØ)Ϫ»ìVJ”Ó"6—2;©ÕŠÇM(ãp2¯o$öläé·¸Vyâ(ÇC"0¨]5ÖöY¾3´i~L knâ Q*Ü:vÀiäk‹hèH“üùd¸Nc’¥+©}®ÌôÃR§x"YeòšÊhŸtÁWZPÃþn¾±jnG=gžZÕô"¿°¤ºð)°¡@£P!Ò©‘vÓG6>§h·¤ ÇhÕS^`a+„ŽÿÐ §¼ ózqk$ÝàM0·?Éûx5Æ-‘È,ø³¿ y–-°»¶™)_2Oi _C=?t6¥ô–Pºû†ÒÖ­î,—S߾ŽÅòTžÏ7nÀ_k:£ ÙÇ›â 5Üàñ¿OwÞ…d¢ $âˆ"ç4w qpÇ+Ùúõض€\:|k­éñm7Õçí¤×WjE©­¡é™j™@"·w¾ mœµ‹ ‡1îvàÓp—”À]­Jï$ ͺ=Õ­8®[Ëœ ò4+rw âAª]Ä·ÀµÖÆjãÈÇXÙwŸqO2‹ïÿ>¾ ~~lNëÂu…¨²-g‘³MN.¹È Ù%F›pm™–)Ž“ëš0õjb8Ÿ´›Ñùjòú†Ø_«O›‰ÛÐv 6@Sç‘<ˆun0TPĨ Ès#ä a[qXØ“øG&sÎ#rŠ®ÒMºî!Yîw%ŽW?v\C-Ô"|å#9·ºY¡¬+¬ñRûìXç‡mA v•¨¾­µŠc¥í•›œ¨ŸHž"o{`šY›0¦¤iKÁfîÿùTá‡Õ9‡†ŽMŸ8ޱ+žPãVhû' '„ dû¶NÆÑçÃT¡ºô%ŃüGÛÛ•‹^¶Sµ Eþù’y¤§m HM7À41 1è#_qyH3}w| 0w«‰‡³ÖM¯pþ(éW¡é*þ“‚¥p#{=;ÓyÚ.Q¼ðKVl­Ê"jà¸Æ!s&¿WíOnðôþAEÛY†Ñk,£k?w ´ÒCGŒYË4IK ž¡MOà$ós‡zø‡“í¢“Wý•¡•%·&Ž7{W&Ò„GV-õŽf;†Ëýòt 4 Ï±ÅR>¡·²—Η”?ønyí=»Y¦ý–hdæ“ðkéPä¢Ãí#Mµ ¢¦U”È\gJ›ïß®ŠˆP¯f,Ð)¯OA¨©]¼»¡½~+T!¡ú#|óÅ/sjíÛõ¢)¡èÆ÷ rC­Ä?„)­‡Mžú ’y—]Á[ÁAÝ?¢Åiljd/ÞNênTvM¥ åtPm_}F¬aôµFzéD‘’Óósg@pM(ß% ¦ÂMÊbωñœ€í÷ê—ëH·%¢õùA Ó;g¯J›„·ÆL‘H¤V@ZkÞKïž Ó;‘¹!c%ٷпäÑay鯾™ßqX/¼Áªë¡7Ï7w}µ“ië6니ýl q¸Ÿ4ýð ÏXLÍ™‹1yùZãÁÚH5C½w؃·fÕVTk0ÅsdcÓóÉèØÊmŒb5„öµw¨Êã$p[àuvœOz€ÿèðvÐàM+¸¡Ý Ƨš-±ÿQ'h€5+ ¢ª*s™‘‹ÙP‘(’žQ×:G5¥õ•"GKIëÆì}jàï\Þ64¸xT@™ÅŒ1%IlÞ¹ˆt3[ñÇV¸öÌ{ ¤“ÀHEnH7zîòï.Ý?ý^þ„â:ª8„Öók=_©PÃsqÍ€¿8<¯Fé0ä$#³Kƒ0zË £‚ý'“ɦœÜL0öEÔûˆy90Rôî\"^lïÓñ!P7…âzåÍ|%Mó›Må:{KKê>t}äW#3²bÖ«‘/Çç"×úÂn’É×y¶Ö»IãÈIÚPHÔÈV¥è4uEy†¨ª%†žƒ)ů¾xPïÄUSûô$ìUhÿé.Ñê#–QV]KùŒrš¾o IF‘Û“Åâ‘à}5Ä\êú<1UÄÂÉ©{ª› — ”h'âRÜhÖ¡•’ˆÿ¶>¶rÜ >rÀÓ|§Ü=ê¾ôèË·õe ;ßõèmãoŸ‚lOÀ]VgêJß]£ÔðÒü•õì͇J@À„{ÏOœK|'åÇ #âôPJ¡·¤QJ÷–¼Ý…”!E‚`TÚˆùkÙ½ Dö¡RóãˆaîÀ=^ô4œbgq¼»%ljϦPêvqjÙŸžô£aF}KÝ0[VÈâ&¼a™>˜þ1Ü“löœ¯‰àªÓ¢hZ‚'SWüç%‡{R~ìV§NJ£R ÎǶmZ× Ç`ì]ÍFË zì2¿iÓ¼÷„GMÈÃŒÔC–K'(T¦³¨xꓹ•º Ët¤éa²]®/g«âî^X .ëŠ s xér'x#A¾Ê|+¥ˆc±pp‹§.°É×dré\s9—RˆÀl$Iíê‚°Ïe<ñÜZýdÁ ½í1¢Ã¢Ç  ÷¶ˆÇxˆÖæ]Œ ™C‚ê®ÁMóx=K;ÉÃîaÕ »Âû‚Úü|FmY Û:|,[1¡}Õˆñ[‹Rß1O³4ÄõA/²8»{³øWb ˆe°Õ¸ÌŠl¨")çç;Iksèù]Ä¥ =(ÀP3lV¡.•Àµ;9Èuøjdo’Aªí}jÔ.ÿ?ì~œ6£z£å¾ÄÄ—±õ{ôé½r …#¦°^å™=[a#O”VþvtŠÊØmÂþHë[MÇòö˜svLH§JPb«ÃØRЊ­MKUª³ NúŽiÃõžù.:Ⱦ#¾6uŒÃWBl5XëözÉguQÚScŠ•ñe2,1Þ=­z¯ÉšãÔ Öº˜}¡aè•g©§IHÃPMÕÇiLLtÐW“pÓ‡¾íŸËZ} ¦ÅŠï;tãU`Ò“ìüQ¹= ÚCÊæH jf9‡O5[(%¤Èa5ÓuèƒGˆañ¹ªø?9âኣî÷”L˜MåJßB$Öû¸_Ü|Ël7ø‡¥g5fPÔ‡g¢8OHéäYÌnúWŸŠ»Š ÿήž—fæªúüBEœ\Å— ÏÓÇÇ·#[Ÿ&¥ !ÁÛ@¡é”hå¿Bß”oïjo&ªu×rbž0ëU)¹\Œ¥(¯xÞ†¤ÕÛ®6bZ`B+éæ÷}VrV^¼€ã™{ÝÕ=…ó\¿v³ˆ„ú¡Á}?ÜÜ_e{Ä«8géÉŒæÃP vYÓ"Éã²à`+FbÒn& d¨”ªÓŽhd0zø¡œŽÒb]óéx¡â_Õ¨•_ ë\ŽÇœà# fì+ŠÆ–ßJ |Y&ѵUbVýëÞP¤uj¡c· æ—­›y:Þ᥿.ØŸµe ¶¢±\€¢vN»ÖU‡ãhúQ?% 0ù%o¦ÂD5²Çáðà¶H-ã½V´F0±¦È6¢ã˜ì6Û’©£mU *~è˜6ŒDG¡raœOœžtzÒ†ÐÒ#µQÁàg,—/cºt½ÐÕy•¶B›pɤ’Tö4}½]ÈiÚWüvU.ÛQ¹‘‡ »ì7eƒ’¢‡õJŒÌûIÌ}ƒ:EÌï´é©‚í‰ Ë({ÛŽ~/CòýýÑ´KE¬K Êü$â_‡`¼A’²æCÒKúŠ?­¨”лh¸eóä;‰{¤ù/³Ú,2("¼€¥^ÿ¤˜ñ’ ¸$¡mgÑš3ØÍ©†È\È9âù@wÑ‘ö-Ô¨¯‚ÂôéZdᯈ-­2ÿ†5(Ûrï ¡½øÙ˜ª…1tÀï ÊcxÔˆÞ0–@ùß… 6½1 Lô{p×fT£,]PÊV»É¡fuH*°%ÿú&Lû„›{¶¦ ÔÝüC•í©÷Û¬›Ñgü³â¥Ç^X‚†+erÅ«_ûÉ !eaÅ:vk®ïBk'Ïç4%¨sÆò3Θ¡U¦zõ”Q¸Zø¯QO»œ‹Uû¿OªÆ¡@åZç0Fƒƒ€ã„²4§oítÚâß±oè€a꨾õ #ÃÁbñ ~pŒ%/ €ëÀ/¡…Ö7ol£“á·^Yég†äCÌú|ÿ¥Õ¥2ê0;Ü£éRH‰»G1úsãÇmã ;" ?ù1ø³„š,–øk9ïÀ£Ãð6û;êdškj[”ÃÒüC%¾‹`ÕpvæÆ³ÉÐ鬚5.bÅ¡‹Átô@ V~Z¸]£ZJ¹²Ð C•µ2¥‰ƒ·áÙÊnÁ³XàÕ/û‚ࢶ8eɪT¬ ¼{Ü“ƒE›œ§Kæ'ë3À8[ µßœÞ>è ¯ ]àÙÈÑ –ÀT¡ÔuhÌ:i¾H0^Z^²}g¤é“(˜Ä‚ÀQž3«Â°ÔN±Õh‘‚5í4˜„Þ.ÚD繋À-êÐê÷o_¨]*l8KitȱìÞÞ)9u2ÚQOã 4IÊ3ú¢ $¤}=ÝÄN¹D´AI^ò®8;Ò¹¶V»ר>3ˆoºÛàËìï4Vìž.œàû{Ž·4ÖìV[ PË ’Ji€ö9 OªÏFj®*UeA¢ Z™–ÅÿaE‡µÚrªÎBƒ@Ùˆkì½}‹!&˜ƒ ú(Ñ¡º2¯w˜®¼LÏ "üŸ-E Ÿ &þ0™©W‘Ç1yº¯„nŸ©0ÅbÕäŸ'Ôiö}”…€‡~…ƒÄÍÔŽÙ…ãöДªP‘Ï3s·­lPP¹b©!„=ó“帥òS‘!;Óøïxñí‘¥,Pœ4@ç…_1\<ãÅÐ-¢U\¾­¨ÔàöD¿Âdœkšàž£Î?ßU>¶)Žihðl>x£ÚÛø}þ²½{‡bƒ•¶$à̼«nÀ'›•‘¶n§àmÓ§êÁ<“«Ùޤ',™Þe4[dTžÐÈ­ôë»FðRbâõÄúæ*'[æ9x]&¨Šw`vÏ\ù¶Ë59Í%]›”'¯e­cÁèߌÉ<ÿ²:Å=ömÂqH‹ˆå'M?>ÈøòŒ…#ƒET+¤Õ8ÿ*K¯)d _§ÌŒØšG ƒÛ“ n¨Ô¹’: š à Ü)oX7'ž¶ô-£81?´ÛPUðµöÝKÍnjä¾eôˎƱ÷ ÞIp$V 1/ìV Ò»‡ÖÝòâx¡4RsowN'{:öýOÙžšÜe&šžùÍÞ©‰S‰$Dáô:j3uíšËÙ©ñp5žŽ—RÈt›^£°¨/×Ù&]ç>ÿA²Ž9wgéГ"aø9ݧ³Y°=Mß(!¨9ç"@à5äž7U”¶ÚÏ¥Þè8½ NãI*åÅïCÍŒÉÈwwÙ¿oï&PˆÌÄÔ~1Û_Eîîzö_f\ärÚ‡¼Ó"Àý‡.½fÉê 3ÕÙb/uI6/Õ‰«£{rSe¼ÃÜñ0«A‡7Ààܲ³¼n‰Ñdb-«¢m1ïÆ¶)Q±ÒnýH×ÜgP1¹ ¡5ä%p°©HãN×àãcmG`ûU5 uþ–ÊÆ¹°¥-·ðLA@ê¨&°ö„–ˆÄ£S­v×€ÐºŠªªÖÔz?×vGÉšù›tËý8îˆÏ7Ýlœ·!©v0d“ZÎ*”eÕ±¢ìÍp@Ý©}SsÅÔÓ©kÚÂÏ¢5žÇüÿê(Nt;ˆçËhüÃæÄ÷¤Ÿ”]…˜‰D'H`zωèÒ²vÞÿß|µ·ð8_2eÒ8«ŠÜöÖ¸í£²"ÚT"À&Ûq7_x2>„ú†o.QÅrfl¤‰¢à ŭЮläÔOÞýeßC\IE~ÁA‘5D?4žA¶¶ëFuÀo‚»U„R+øó…H"¬zÕ†$:—Ü\'Ç+œZ€zj§Ão?ôLFI!l±;]ÀèM,É[ݦFØéàò¹Ñ³¥è©ªÔëA‡#žVkVöúX*Kfœíí}ºÖÂÜì91_sZÒà ûv©ä+s‘-?òÇ~·ù<âC3 ר”žÔúöÍç5wɲ°eê8œ!W˜˜g›=¦ÄÚ…ÍÔF.$š£pH2 ÝHºËoÈ)oª1`)zÙãl¬x¶™çÖFØ­eWc¢Ö…®V¯™ìwJÈmò¼Œ#ÔÚ>'zÒ‘Æ=VBr±Æ%¿ìçõÜýz±N„—Ž>?&Y 2ˆwCü¤%+ ð-¶xë„bHâ[ü2éBÉ‹zJß:ö5յƴr™ný&·ðUK—QBG33 aë÷˜g4Ðj[vYP‡òIîêhEÈw…ç‘é]G®SG—ÌG3ö©<(ƒô˜x{攜ŽóãÉ}XæÝ]ëÈŒGã‘(:šP½oå¡ :ÐA Cs“è \ÊY[Îzà^…Ü?¬šŽ]†,#%¥hô"*òûQF?æC³ÃëÙ†NÓMç©´›¶ÏiÛ Õ†8;<ò·0Õ˜y Jògf”ìúï=nE”¬Z+0K]åÀ¹Þ#ë)7t±wS”¢l‰c½~ Ku·òÅ2'¡mÊtä»$ÊcÈo¦^mQ!§) X¡ {˜Ê~¶_Ö6²õaV¾ŠBÕ‡=R¦V±¥}‹ÛÞC=Ð–ßøì"+Þewl,F ÖM’}ú´êžñw§¨ÆfÓ h–ñ”äÕÅ3Ä©2q‹™o%Âîcý ‘c¿‹g— mÔ²®»ÉmëÒ~ ƒÞ<‡xÚÆª¥ Ñýxw"(—”ÓkÇO\‰Ÿd˜Š%ÜgÃñM¨‡iü]Œö°ç¼pã˜iBvÆ›w¤€˜›“uS@àÌÄú˜ÏʪñY0U¥o‰‡uŒ—›_¼‡”ÊÞ‡mäìðI_2š>Â’~•šì-&Á­2£ÑÐ “&$¹ÚB=DB„¼q0zÑ=A0«æùÞtdª|j™§#©¹ýsðÏ. A’2òCì¨g'wh½ùÑ8u+¹'¶H\E¹Amx§K¢¹ûœµW4ø}N|Jfµ$²Bzºº^‘Á1‰#išã‚WèšÈÇS"ð@Cœ~Å>‘(ˆ.vc“‹ªd@á¶—Û&ÞO²óáu-X—‚’ÚÇýÝñ+_`g˜¤kubpÁê _Êï6±§*¢} M-ÉóCx4¤³9~¸v1»«ŽrO ‘µX5zS½Ø…˜‡{JP`x)!†¨Rón8æ±.­/sŒYM†ÐBy($'íÔŸÃ2]|ÞvéåÃêÔ µ³@ñç·ÞjÉÍH¹àæú¸ß˜x/ßHÜDC1HBCi’BÎÏ›´Ö™J• SÇØ`°Šµ$mƒj3Zlßs@«sž«‰(ÿ|æHuh+Å&Â!Î{l8c[w&[uÔáU‘3Ĺ›öœ@W2¶Æiºko»êÉ)ŒîÎòkA‰I†Òۖȯµ4ëÏ÷IAw%*ìà±¹h›(I9#¦mÏ îP%ø¿Äê*)):|[ƒBôDÛ!ZžvRpšg±Ÿ ½¦¢‰£”9}T:DLäwåCAC_NcùÑXØ´4ùõ쟎SB¢Œ›ä”´•Æùï4œòÀÒJbD£e+y¡(›§M—Þ"]öìB¨Üñ>Ó£uqÖ™Õßgv›î'¡²Š6e“.þ·þ!{CӤיïj¥ÿ‹€¥ó `Ÿ'™€E¢¹f è'Õ¬ÊéLIàìWªäÀæ\Ì»¨Rˆg¡†6‰qe}W–ÁË =,SØâà ­S(#‰—§ª®sÂüÅ·ëÝ‹žèóì·y£”tü‹Ì™ZOÂn¹Ùi ø? T,…·´‚{r °qÈ”Ð351›cŠfí×¾0èj¡¿ñÒ›¼¯¹hÆjÅf·€ñ[Kà0ÆŸÈEœ9¿Ý@\¯±;mÂ:t÷ˆ5$¹qêêtÆ|׿¼¾Ô¹”sà}AH)ýUµw‘ˆkbo ]Í>†' •±êÀ–¾ÇòÝS±ä‰ÞõA cÎ[÷H]þ€û–”¨3Ȩ¥æWwVp0|›yÊ—ÿ8¼¿)•½­¾]ÛM ¥Þ5GØÏ©ì$…«©MY}‡¹79_n>“KsdĽX|xPH7;I6ç7rJ¯l@Å{Šã÷#úOJhQù÷·kpeÁ<ýÿtivGÛ)ÜݰvX'IY赩³^DeAÓœÿá!2š²ÙL' àŒ‰ÿzúÒucP¿,Ë5óB(ÄîÄîåeiAâèg­(Tu“œiP’›3Ëû0Å Ô³+ßk²Vó.ʾq“-Ýo£¶)=:$0ƒ–$L…ärö9U˦“ún±Æ€Õþy &h1EŠ7ä9 D'd”ÜÎ÷ÞD“?¹K±•ŒwËe·V¯K‡±­ÆCžO˜½²dÖ_Δ‰ }N³ÔL"MRÛ•ØÑÏ+U|ò)úÿ~zC·‹!‚®Ò[X%°7””‰FÓ 0ÊÈ'C€­3]íJ à3Ààr…ïîA\¬Îcè ýT¿˜²\ÝÔa 9ˆL†%Ë®BÚpo`hî…åô}ÀVXkiiB. ø¢¦lĦöú½:;ïÖ£iñA‹„=qÓ m–_«OÀ‰‡H/ƒŒÝo´"jIü "œbe µ#(`€w“ ³ KÖx`>Ì‘a­Œµ¥ƒ2‡º|—`€ÉÉ;ÌÖp#ÇÚÂV×dþoW°ÅŽ€n´_¤-¬Ÿg§ò´éãï.w§y#Øf p%:?Xí¾KÖ¹è`nžé Êr]¸R!b‡IÀ-ÝÁ²›dî ~,FIÙrõ›7nI‹zŠÆÙ 4H<$ñtca¶vñ oÃ[GâþñC¿•¹¸2F9§®x²ßˆ$WÄÓ™åþ`Z–ÉöÛ]âË"Çšì9¾=ÆÂíæúäáØUpì©|CŠÍ^·Aý‹5UdãiqIe¦.†ùønDEÔÙY§¹ -Ìß=öŸ ÿǽèÄßPPT$+°˜°WÆKö`3Jzß²ñC`l/Ñ´jLžbVv|MŠ“ða­ÊýE H{Øæ kUõˆÈßï‹MÌkÜüTÚUáãÛ ÍØ<”sÝö%°NøÊ¿çÿy×­ìϸ6Z¸tðÚ7¹Ç“)Í{+Ÿ5A±…ËzÞ! v"j°½ëÄî"¼Ýœþl¯äµ;¢~º<…aj€†^zý_ˇõ¦!gŠUƒÖštÅaæLJ¨y$VÌ(¤®ì©þGdù‚å&rJpw8$ùÜ»‘=‡«\EØXO<ìMh?±¡ó×"tô=´°©û2áãíŲ«MìãIÌ–ð«½6Ö¸ót/n«º.-‹Â¦N’nZTѽ†µšT Õ‰G»u—wè’E®îa»ãnº¼{ÎÔ&“R½éÚɰURòzð!ŽšþÇÆ„ø¨kÔãáé„ut‡¿Õ–S©|W à‘O©E~%šû©MAW'œ&&[Ç›“T=5Èfÿ[ÃÀ!$ „˳ˆZùÒ𢠷[ÅjíR-N2(j®üÈ@-lÆ !)º>§\r&½Ôkí²µYbµ†7‹©úJ æ©£_Wþp€å2SzƒP@P×yÖÖ§Fèòð®ÚÌ;.°4WYÎíç;; aWÊM.­êâ´ùap–šEC³G1i΋"Òþb²AöaàvqØÂÙ]TD¹a[¥´ÂÌyH‰*,j w'¶ò„êºÐ .%Ø@nãòAõ¾HìGuF—e;z#o‡k.݈Ô3Ô¸í/G÷=–J›«Œ>A@ÇPì¾?½9øÒOÖÊRÔG"pSãTœÍÄŸêFì~5xìrG÷}ú&Zzˆ6å÷¿«;hçm›ÀTÚ½)±³ÙtŒ¡4ðg# oŠœª²½!§«™ZDnî5æØÅÌÏg›lϬèîÂÊQ/Z÷¬}¢Œ9¡q:9ÊnG §,;„.üÚ¶2ó£]'ŽHxjß0Æq¥ß™;L'׿g|'¥‰º{RЉ®<¦”AÐÏ2Q=bæSŒþ%¢J Mαÿ˜°¤·¢õ ,­Â·;Ô™ÆUFˆi…88ÉË ®Z•iÌ—‰Û}R‘ò ?oªþºþk`'®?~šåàÇJéÁy/ˆwgñݽÄÓ2¸obXöðÙvÕjs{!žVyiÒ §Ê¦v¨ñ{i%±6½í#L+–é“4ÀÜkWœZ¤ˆ ¨4bßœ…ì™n5Ä©ùô›ÕÈ|"F¢ÙÕ.ø]ë*š/Ÿ–Ô]SŠüﮬrâ6º\JÁa®ñe-ØBV¯%–äË"}[åtPñ7ª§…_ñ‘æÂäRVP€oTEFV¯€O¬ç§¡I‰UjIY5íô*¿^xõ Ã¦·¹0Õ€G0Zj ˜|Ö²Ù;~ËúWQñULû¼›QÍ7/m» ~÷ŽeF°çðš»ðÌFd)t¯Åí…åè{ɰ"Á¡MrûY;ž·äð™…¸«¿ìŠi­>Ž‹(¼+ ùº:‹¦ÄûUÑü¡¸7äÂež†9xœÃXYáN2ÛÙۈû •­)°û§ì=¢SåHrm–¬( ˜·ô]ú£Å=/Ü»­c­F,D겪|È2ì\­pâ@û:H}Ýý;6PL…­Ñ´>»’£øȯ·hWU²ft.rªú?‡|GÅr¼–š§û€KC ^­‹/ߟ&¬’(„lÁë†Ü·’²t²L÷Y‡°îz9‰§!ëÊ0ª…Ó¹Cyp#\_dF¨‘}¢væì´Všž¾]o±)gÚ{GÛÃ.9ƒ=6ÌÈR”Ì8´}&›k°O Ø¿ûcÍ %\–ÉŠ FeÉ ˆQûÆb42EÁ/¤~\eYÅÁ*:<5Κxä͆=Æ“îro·ˆL{}å¦viBKù"CwŸö©åf®Sr­ZJMŒí©¡-"W›_lnTEûU[E¿( õ=³h!qŠ}Õç¢ÁÍâ³|€OPþÝ®ª+Š›ô{N‘}Y4¢ç!8@çŸÒÑaØ+v•i"û“ï\·¡jþÌÊkÈœ+d³¡Îм'hØ’0<²Á>92,¤äh,áó뜥Ýd(¹º W;›¬¯ßŠ¡)Íÿ2ßÕ²Yj~ç6qØÏßú`ßq¡KÏ|$oÊÁTÄi¥[ËXeE^xDø¤:êt˜-ÅàkÈ‹VªmÎoñ”‘Ð3žÓHb/‰t>—L(Ù"C!<@E] a~àVW. r«%Jô3›Éuù^f°“ûãÎ]kÕÆ§ìA¾¥#IùX_Å.WÛŸíAÆnrL%é©*—`GáLƒ˜Õ2 V LGy…åÿ ÝW†£Ö²7êä Ý í¦çAoC›¸âg©p¥O½FŽ ,‹høÕ¢7# ò6šÏ~éÎÃâNƒ¥b äpGÇ%ûoW¡&ÕW@lg  ÝäÎÛ·²Œ=©(¶¸(ïÚò܇cŠkµ›ŸPªyÿïÍÛçókY—ˆÙ¸€W7ƒÛÞÝЋWª` Œø¢”ýÚ•-m`˜êݰQõP!˜nŠWé~Ó6œ)Òú,®}”¨*ÍÜŠ2¼þ¿Û}U.¨@¹è²h›rI¾—ºNÐàý˜%y_ÜTd¤]6wü{oo\fØzWß5Ñ^­Œ­LÏé†Y¶Åè,õdNCKË‹ÜÚÇÏÅÍÄ.‹u„”¶“›ìÂÖBfñvþ¹§6± Y€^Ä0ûnüIPËš±•>löoÍäÒR¦ƒÏºÈô "5ý©}ìªqÚC“€3’E ôâ„[#?d­`Ým@F±¢WÛ#æ‚Ðf\U/Ó¬n•e§?‘=„ØbsÅ%²‰¿QR‡˜ïL9 ²'¥gÁ°ç¿{ð®‰Iå=LJä•X#¥œõ”ÄiFH¸u;"ö:¹6Èbìå«úüà«ÛLñc&y"œ6ÝðB¬ù2ñŇ;‘ÂoWl­ÌjS­c~±Œ.æÌ„á @%©(zYn5LñõƒISªëÏNøœN²Ãð@žþóuÏØí“-nÃJÉ«k •„"c%Ÿ!ßfÞ]Zçqˆ]…t4›‰Yt@}äiŒ”Ì]^Ï”™Tð€[èÞÛ¬º~‰?šââ^¹¨Ô&ÝÖ’fŸxDºøÜ(*«×ï±HÞ”µcFåZÃå)msžƒv—1ÄŠ•1•ëI=T¹Õˆ|5Ï.L8Pá¾fÅöéçŒÚm Š˜=Cî$dV[øÁûVa·X8ÑÁ‚>®ËÒí'!üÃSQn”õÊ@›Œiöš¿HŸÓà×lZr,õÊv0s®?éÿ¬&uE{¥ÐõFîÅtwX²è·iX«å¢|ÞԨѭ|\Sµ2Áôw=¯%žm%é]Œ°€R;Q€u:çú¬|GþœJ§ê!núÚìR-ù2åOŒÊf–:]·„RßBiEy‹‘Q©)W%™^î&8ÇKÚuèa¤Hé6Ô„ [䘤Lߘg?c&‚Á™ÞPëH*&‡ð.Ùá¯{,@ïŠä>„÷™#¾ØÜ¦-v»¢;F–(ÆÂc¬ºû/šå=ÉìÜdó¹Õa^®T-ÔÆhÓ‹Ï) ‚#ªI%ÒRð6Pîb(ÔáiÊ.ݲMqä±fôGƼ}±‡ ›éG$a6¾Fî8¤Ï‘Ïõôj<•ÁÓþx~àHöJêæ¯#éWo´Ê,îÔ]‘•e¸N{Æ-ÚHwv¢¢ieÑo1Ñê[ÁW8‰€+„SPÖÎç•2¼&ÃÚ¥¢à]ŠôO§ýLf^ÑK“ž‹…;08"¼>Å-»Œˆ…êíéf;·QàW¶IhÊ[†…Å„Áœ˜í ÇÏ¥1£@ŸÀÇfL•K-{|íß›´¼ß£A¨ÿI‚Ù¤:Û@1MVYýÂÇQÀ…WãPï“‚Åp×€ÀãSû…Ïœ¶¢¤æµ‚ e¬„‘*10¡¨b˜j•Gø¤~Š¡-'Né^QܾmÎb.¿óXæ=Aí¯ÿ×vaV{h[2áÁ)=y^Ñß3Ñ‚ãQÍ‹È\~}ºº¦AÓà« ¾Â‡?ÓÑ[ºã{K¡ý2Ð #¾j¦Í…&̲ú`à"„Báá†ô/IçHfkgÝa#iÁšþËYFEÔ¬õ¶ûÐ@Äoã[ùù`û("®M¡¬ˆæÙ¥¤#L’„1„w»R°•:šŽ»"»tì7¹ãK&qÏ…ëV²ŸÈN£Ø¸J’ÍÆ1 ÏžVCô´ìUÖ«O®áªV8qÈ,ýŸ{^6j¯½6[)Rõ§|Ñ?O2Èe¾”’£M1p .ðáÑvìW?3à4?fVynzÍ7Œ¼ñ†™µ5ÿc[€¼Ä´I8 ¨0`ûwÙN”Ïì*éÝ«ø]¤™ó¡çmW)‘ª‰ ‹l·ùOEÅ’jFffúŽ*º®]zß.‘Üð~.K1Ö›„:¤Ò§ÜœCQó÷Ö¸ r»¼Mï—+LÂþæv™âQg*øþ¾{§mµÂWi¶Ê¶VRúnW| ãD&ÂÉÅ9„ò:kVô0 9 oÖUg7è Kªd‹r&ˆÿªß°Œó0Ж˜?nC@…3µê:R‰D> ˆ·Ág‰¶YZšèõ»(ò}mîþcü¾ o?í.üOI=¾âgB«–º]ßènI9 p”ŠÅ!M1Äþª$j¿(Seí>e*Ù(J¸T†C4¹­òEz;b¶ý™? :kã»jVŽÂ{««ZZ7Ñ¡_—éàuáÿ¡©¾8¿öN6kVSÐò8Üú›z•©¦a¾ôßî‘æÖ§GÇ–40Ÿ•§_̶Ž+S´ÿåªÄšCFÚá“ïéRSF7ÓY "qÄi®µÜ;¦faˆåá)¨Cù{„£ØÌü„ÁWw¸×ÛÕã÷_~ˆW?y[dJjOðá'F  ð"S"ÝÀÞ/ 7>d™F9MÒ~Ö‹‚ý~˜…ÌkzŠì™·D1€ü¤¡t·ª±Ùêå`n¿µoõ5‚½ (Ù[8¤Ø{Ø®æßž•ÖK»¬5„G†”SC' mÀFmV¶4 çz¯®ÑUE!qeˆðöï5}› ÞÉ´£ë%g˜ËkõÕr ¯>¶7Ëí§d÷PC"j©«{ñÑY=CÁÔÚe+dP¯30üIŽÄ J¡Ø;_EA!®ñc ž9!3&Ó_8$¸€AÒé‹l~cg¤:õêöŽÚ8}ŽóB£{º_ÅÈaØ¿pH nß‚ùÉsº Œ£§c–E+9i°xƒ#C –äÚ;…–ŽÆqQ:¼s:û”s$/L ~A‘Çpüè3ʳ›1ä¶p—=ª2j°ÝÇ}&…÷»›5êêø3¼×BKÊØÆ²aq÷F8¬+üÛ?НÜ_P¸À®õ€‰°¸ª0"rŒ{q4=¬Ä^¬OÄCŠ‚Tõª“.A[InÉ˺`ÞƒA*ßUoèÖ`lë$¥(ŒE bì÷wUûú˜o °Þ4{/¨Í·â5ÜYzêžâ‡e Hi«XÉ~¥Y{êþBSZŒj4[—¯¶œæ6‘%QŒ¶÷¨–‚‘Ʀ±a`=Z!‡·R:ÓWïÏL\Žš*0Ù•Üëêç:#´ª®õ…t¢f0^§¬Z®€,Z%]´¨_çŒøBú~9¢„-/t`0YCÃmEóý‚ÑäÖ݈¡QE©ÝèŠ-¿'+¥Ú(äÖ^š>P/a #!éqJÐlB^–Ñ=PëOñTÁz…NþËœÇ)'¥B¸|€Ä…bëµ0D>šì¢?âÿŸë£*MŒ–¿ç—‘;kìÄêÝt‹OÊCô1¿¶ˆñüÚåeªk}9 ’0{ó_µ»87è…÷eñÄï1HwhWñÁ„bjœ¡˜’±Ç·,ù´¦˜¨;ªû¢Wxt‚/Kd{>ùm¥ŽE‰É VacôÊCáÅâ¨b§aÚ1ø—ÅåÐï@m«rGQ<¬Á¾¿„ ÐÊ#óE‚•! €êû.”Æ|ˆïÚY~K_Ç—D) ;ZëÌ¡¹ò7ò¹#5ÈܰŽ)®×B)«ºõu«Zí¹DÅÑø7žaªšV'mHc=ÍëZŸÿ2É•qhj™¤kàÖÀ'ÁúQ°Ìô…·Ÿðe£¥t«BSÞ9äÖmCxÃD–{Áqœß ~_êç}j _eÍWÈ`ÚØ|¸}U¹sýw¦n(eôp¤†`T1‡Í¬ãFQTxû傹βn” ¼)JC´.ê.3©Üè=®Ä°¯«gr7°ÔBà~çœ%Üë¸ú©X퉎ù‘Ñf4½€Ût<ðpœ2Ià™™H:­_×àj¿¥œÞØõ®jöNÅöæÂ^vX ħvÝ^œé,\Â2AûrºÏ^É5P¶º0UL©ŒÎÔZŒÆ)ó§ìÅ;åêûY«KsPh` ÁEÉ*cɽMÉ©¼ÙR Û–5Z/àše÷ü4JRâ Q‘0_ÿLÌ—2^/ÿV3Jò£O$týãg@28|üîÅ/Ä÷2FÝ0:ù—¨Â{oÞ<Ò¶Ó&~È-Ói¾ªÀ‹ë.<Çé>9ˆËÖe{! oç–ð2^Ì1ôm6C…æ G[–~RÛNCHãQœêÂW`“š×5œŽEL.Æ—D°{‡þSŸq¤t¦k¦[h‹M¢ea¬mJ-<…Y ›Ž&Íd¯ºös¸:‰È~Ýôb&®As¯ dµÜ=‘~²Eb•7‚ް²¦­ÅÒhÛ›BÍ6æ£$‰Jä3o?ëЋ®24ãu!k"Å#LLÜÕ¥ðŸ\z °.jÓÐ.ä_cùžç µõÒ˜\á8à:Ý^äo *³ÝÊ¡ø\‰E…AÎ~ 8ª#ŒÆô…eÚÉóåžñnKwÎÀk£‰4÷f´OE ˜Ã23ç›J¼î÷…+ńϣ!Á“Ò” шûG‡{År ä‰ÕÖ·§ ùõiOYñ¶»Ÿ³W¹Å7—ΰÜjv>€ºñâG…™¾ïižŸ+|¸g¥žaZÔ=Ý«ÅÊ<Ôœû‰]8îy¢’ULÔk°ÉbæN®ìŒ8iSrÅgþæóVÍF$¿Jð`Êl'€Qêâµë)zÞVs®®Ç¿¤#‹IH²½¸§­,‰™‚[M»~^óK3eÜÇlDËzlÀe¨ ÜJJv°Wšº3Ä8ϰžTk¢óû)Ë8{ÈéÇö#˜¿µpRîÕÇ­uíQiå‘M6|Τ&•\'ñðöMO›Û†!‘†C<ø-p€Ïè äòÅË/œ¶ç‰’„ݯÄ' }^4äÀËÓá‚+I†‘o¬Ÿ¶Õß#¿ï“Û-z.‰Ä#šñœö8’ðEÐe¼õÈ@=3ZÀþAÔ(oÃØšÜ$át ÷—îEtœrq‹êÂC©·l!YÝ…»¶§©#:ÕÛí|÷§ÒËa¤ ¶Wˆm¢”pP›Æ}Zü3‰GFï½\hä‘xƒ¹¡v«›H5€;›Q˜ÔÊRÞ±Œ ›º…øbTªŒ^Bëšl4I$õ¼Ö*ä]2R=­­ÛÀ 9uûõ‰:ÐhZ¤¼û {†Õµ#qsyA}0Óqz#ÊÞß™Ç78«òé 2æ9çZÁB]ý Úlþ<‘D—Nó’=Râû–о;=âxeòÙ)Ï„OœÖ àá{Þq3P¨YÎêCv)ú1!üÁ† @Kê¬^f©é³üúmOà |µù5Æg<Óþ¯¡Ën¨`=4tÙ-gº @ 3£Ü8#@GdÕ¤€QŽûcY¼2¥9àŒÁÈHݹèü#áÒ‡¨ˆ/Ø3¸„Ÿ!üΧd¼ìÀYÒ+q0å.e1SµÓñ+‚ìÕ¢ ¦'adäCêÌ4!õ}ßµ}EÛí¿)=ò–ˆ&!Ÿ' Fަ•‘Õî_®’©â_Í Ç·”Ì‹nñä ógŽžSÉ6É‚^0ãíbæ‰Æl1¿(*qOAÙˆ óZ ¸ÇУ޺ ”} |¥£!ãyƒ{+uülÔm-Ò°Æd-Ý–y,Kúæñe™z|Ñå«ORëªÉƾù&ùUÉØÚ^¯F˜§Àüp•06_ZU‡Gá@Á!¡0 öhS#†ÐÉ¥v“|…G´ÝO3ÂRËþoÉ@Ånê¢BÀŠ^ôO}B³ÙOµ;ZJŒœ±k´k?¶ÕŒ¦ 1L±nKeÕ·sœ BY½0¢E«µ×…s¨û ”^_Sm0h–c³d0˜C(çc ì mÿf–ÓJVOiK.‹ Ö-Tü—ÒМ©Eyu½†I?0kè®bVõý±ÙjK:ÒdnICý¦ñ1cʼÿX‹’Õó>ßQ+È ¼,„5R×ÇÜ#d½îúßî_„, S¿ +1‘î«¢ ‘6&PRÊ’÷“¨[áÁ¬ÖÖµ«{œ¼e»¨¨Ô}õİz—ÊlîpÓ:»^Xª$f›$@ýægðg£üÂÚ93ý‡æ}4ý$$¤³Z‰=è—ivúj(óxf_ Q#[ƒ)Kž‰…#¾[Ð’WĀ܈¹%Z®ÀМj­‘]æ²Õ¸ðïhÓ"¿B˜ Tƒ²/{by~6Þ¾–¾B;4ÚlÄÝ䙵º{à{Þ"Zexˆ>Kô$Å9ê&f³Á2µ]ÞMdL¥n ƒÐBs#L¼«s tÌÚà.•ä-Ô@9‰ú´E{KUQ`yÒ!8V±ìÛ‘ôš–>Ÿô¨FhòÚ^ézì]ªþÕÑ·nÉò¶cÓÿ³Pû¤KÄ ƒˆÏ0„¢m*r ùå“0¸så‚aNÙb_3±\2åO&ÈIJra,ís·ðC‚¹ëæ©4¤C¸fw&ýĬ*>% %|o·õ%µw…"b¾æ\™°eúIßXâ$leyÂÃÔ@†xo]õP÷\—ÜÔ"™ÓÿOãiÚü†Æÿ¸´»ÒUð‰B´¥¢4HûWƪEªµR¤ª¾OÌÒ„xp›o·‚z hº @š9m«Ó°·þù­ë¿!¾„\~§ê¦ ŠDJ<´^ʈ¿\ïòßuI•ˈ7räjjˆþßB¨ß?7ž‰Ú˜]¯•]œ!€ÆèÓ‰Ò÷ƒÆìGB¹~Ï†ÛØß5¡¸³+ú½XoÇ EŠ’6Ý8Ïï_Ù6ÆLg²&!LÒN#m!…¨=ÇÁ}áú{^ô¨)sš©ž,Mò/z—%ÉñïIzÙßN# l!|â»Î£«îwÑ@7·®ÿZŒÒ¡O–' %u ßøTOãý·²‘”8ú.‚Æ ÎOS¶¼Ÿ53Ü÷WΊãÈ~/RƒîHJ®›€ãÂv ·áEB—t4çÔëøGè›䀤NVqìØ"€õ«G0àgïÒEŽgåÕ¦ˆËY7nFÛêm¤÷š½tdyÎcמ !®?—‡4Ó+Jð€<=XK@z5ÿ1¡Š¾”¶9¶°—]¿%úc7wáÔªï8¤}/äS²=ûì Bz'FQ—,Ó-jìh#4°Ì þZÎ/õ¸BŠ€20tT[»fé j zc_ǘÁ³£o߶뵘Á"ؤfJSIlpZÑÿŒîžLÒB¬n_êðVe`_¦ôöiÇñ{ÄÎÛslFèè±)ÃX¨²¼Ø|S}zrê\Í2/q36 ˆ®ñwËþÞ$×I ›œ Z¥ ‹.±{à )2Ñ[å{À3+œýÞáì˜ýY-ŸôR¨Åþ8“Ù!ãex`a«>?>ì«Xî¥Úÿu·¬½¾Û^~ÒZÍ.€0¸¶pù°ï wÔ&ü"‰DFZŒÁGåþh@Å–#P«8à1³wˆ­ÐuÉšM…9K_}“¿}On&ÐÊŽÐÉQÎêDJø6óåNZq}BbâéL¬$fpÆæ¢ÌõWJ»u*põL6Ü“ŠÑ“­‰‹Û¿û†z v¹nà*¤^ÓãñרreÕÜ–íª6´6¹@MòîßËbãÉó©q;H_'njÜ(?³ Ž0±,Ÿ°„+‡çj“JÕX?̰¾ w¿hç¿¢³"cuÂÁÅ~Xø<…Ì9@h§y†ÜGüB¦ µ)ÈÇñÎrZœ-c³ô†kôA¾eX sW³’AJÒáíÅÞ?‹Èž5Ô ¿CCÝyOqÂ;±õDÜ=÷'¡ I6HÛ¥Ž £´Çe1ošR]ÚpüÓjP•’¢ÐšrOX±½ËŸkî"ÅÃKÔÚ´ý£q²cÆ8 ª…ˆp%±³ø.à,¹ß 5F‘1Ìj|}I˜\ÀR4Í1=¥p“°S9êJ3ïË®|oênƒ¶uæ(ªéîÙ: PÛ߬>Ä9GAÓµƒ.Å›.ÕLÜ ³ò÷uÏúF§ñ­‹…,í€ÇÚ6 ÖFÞOϦš-rS¢¢“[ê9ý‹‹#3{;£Ò·²Œ—KܺãÎ#t!C¿tNm;ú k ã£)®I—,Ü*ZTÏíÔÃv":æûVm4kçM”.Ġ»ýõÔÛÒÀÛD±@J£e-,IËwü³¹r:lÔ`H±ÅÖýbdÙÁÎŽU·õ1L*ÔvMi logÈ ‡ãº1‡nFÂìÍú?Áõã†01lô±§ŒŒ*|BùUs`tuŠP”Ÿåoò uï‰y$kcjIg¾V Õ8˜, C-Î% œõ>+7nB‹ìUÔ-4ýØÍÏ2û§|®¯;µ¿Šìª+éü"¿Y«¹¸rup:1Ç–ø%‘©rëðX²|Ú$ÜM>¾–µ9o?«g`·¤z»(Æ9Üvu≄»­7 æ1îæÆ¿ùòvF¥±+,ŸÂDnÖÒšûãMR µª Ò\æT¹,ù¨BܶÜwVB=ý}bNãü³ì£½ždÌÕ):NÖ*²^ðÓôe=”ÝJ‘>ÏX±™-" öH”&¿Ku.p«B@ÍÄ£©¨§¸Žº¾4?Úë¤ÐUL%‚ÐKêÍÌÜûow›ˆ’oíqžiÓ³¤€xZ!1KðkÒ"Vºª¶j,ä» MX[-Rø¬7D]xû¡†å”»ÚÇ,÷£}¥ê›•'—q¯œt½suåQr­öØ«ÌR_±™ø%YaÐu Æ«ô¾ æ^!#úñɾ³82àò‹%éÜmȸie™Œ%œ>ÐY–À0½ 6€XÝh ãü}ÍkÝ2žÆyY~DÒHÖw‹Â†Žš£ÿ±´ 8‘Íç&±ê~nY}ð½ØZg³\\æq¬Y]•ûZ™×>$åàLnЉtqcX\z‰Yj7ïªÊj~ïÇ”üe€ çŸ^$¯°Ä00³½³B©´ðTcfÙ?+6™í¸ZŒá†§‹³/´„ʾ†tÚúÚ½¡€ûÃŽª„Ôã{Mçqz)#:)n•ï&°KÍàÀo–½Þ®oëÆžðo¡/ªÚàR|Yl5«1\ñ{#®¶„ ¡FRä‚ú¡sˆö=ÈöVº”¡¨èÇK¨°»ÈºEM;Bè[¼¿"û‹ènÒ,•Ñ<ð¤q²%¤"beÖŒŠªFäîêf_jêhý̑ފ½ˆ3†Ò¡¨Þ{yS]²¯ø<¯@äo®’)é {PK:Ñ£ÏÙ$À·°ø YÙÏͱ ø[¶!EÕa³Þ(úZ˜ œZ¡ßÛ|™!×!Eýdúb<÷ø!"ž/VB¦nõ!ó×>aîàF8ëÙ3ó±¯ÏšÍøãš•l­S<ɽ°Á]þªá@2ƒy«U*ÖGhX&¬Q•WlOÍ®DüRMtÓK[C»˜…¸ãðí p‡`é&Pøhh!@Dy¨Š±lÀú.Õ»,Ó¼À³»ÃvDì„k_ S:K:s Ô¶éAqRk)·ø¬Ío÷ Ewý\ Ö‘Q¾ uÛc„)él³Íð ¢äÔ|vW~áê~™ˆ¡‘ʘz,í;èÇ Åù²c·Vr>*… F‚¡j{Fx +ÞÙÚ'<·D<µšmzYÂT,Kb1ÿò8ÎNïù!A6nŒ%Ϩȯ €¨ ­µb3í ]è° #:fl BDÀðÒ%㌅4O’Gá¬YÔe·A ºýI1Z:µŒ€|"£âð}ÝLxÅNhñ¨Z´} ãs”1nåã/‹:”¿–HÕUg‘åÔýãÑùñä \dãç0‰3Ûº¸@õ笨/–&h’üðµäah›=èSi§3íí<KÕcóN/í5y|ÆEEoÕÒOfËÀ×:\¢’Qÿ £] i(:gÐí ©½[àÞ]FçQRÄZf;A__ùï2„à\f†(mÑA1n¾ô‹»±Ù{þªä(&>ÂÈRòH“\Ii°Cgv£éþùÔwÌxS=lníRIEN]pÎ;(„ÝÔžpy¬„ YºÒw §F%ãü_`ž?ë¦UM¤$;³‰5U’:q2°F_ä½ò“G°‘ãÝyIù«"ïÄE‚™HyòÖË\Ë|]JÓ\¡\P͵P(û± ”nG~çßº¬õŒl&u†Y)'»B÷˜!\˸pYÐ l·qൔ0Züik®|ë'X%ÏKÒrÍÈ>L’Á§K¤äŸ6¶eò%Xå òPGÐ =±vÐt©zÄ¿‘/¡y¡Ø4v_K¦xÀ Í›©òþÓº ‚Jv¹”üWQvg¢Š¶ì³p©Éžy¦ÁâjÀQ/¤U¡ˆÞ§b¬Û;L#…EÍf„TD¹8›3†ÍJ™(Á™¼8•´zGp{¨‰”Ó°½¨)¬LezEbkϳÂ-£…]7t÷PQ³×C¯ïÙ×Y • ×ʶ„— Ÿ*Ç…oú ïÑ>t¼ÅãÝŽ×ðµóÔPh(Kà‰DeÜ¿ä­iâ¸äì&pá„«±éfcÎß•3%|¾Ë)ëòp‰öGÑ*¹>RŠ1Ãö1ÑÓPjž†a¦#Ÿå»Úñ^ˆÁþÈw¨½(š{üÙ;„©Ñ¨VŒD¬%¬ãÛéA Ã@ñ2àX’½#ï׈‹ ø¡Ÿq°%Ë _RØNzù<ÿzîæi,®ÄJ:äFâpH´ßñg¤Ñ'“¢Œ„ç/Œ‘[Ù\¶}^¬…^ðgP"PqvN…¤jb°w Ñnß;·Å âY®Çm›ø5kÎr¬æ¼‡Pe‰Õ‹§}x|A0á.þÝN­ÉÜöXÊOmÓn>ÌäQR%5¾ b1²‹`Êr…ÙW<ñ%™á¹·G°ÂmýÓ‘ÄFµŽW[A^r.K)ƒÐ[Rèx¤¬fÉía=äoÏ‹ÞÀ±€aóÞ8¹ ‡ŠPLÚ8g³þ‚ ¸Ô‹ŒrX¯Ý&f®B¹0yéû¦ƒ©W jž!›íç¿Õ_Lå®éGèþâð4­²[„Íúcêï^H•ƒÄ.”uÌ]úí;ªÄø ÏŸå*h¥/WÃ)·Õ±‘»Muˆ9€êøÏ‚*ó É*E#øÒÎþ×ÄÁãjð0(Ü{Ïa)è.¾2Œbè¸Qw[´Û¹“¼K KJhÖè‘ôµÊþã̧ µûÜc¦äð¶EÂA)V~J©vþß(Z¾Á²”á«á@õO \=C*1oé/t.™ 9bˆ¨©•ØËhŽéK|Iwã˜âO £gFÞkƒJß; Ó$£•…ka2QÚråWàµVk@¦º/Ã>2}çînÆ0cpþ‰Ñ‹n!ÓýÆCç^®ùâLMÕë Y¤ìHqªöûæI¹§ÉŒ±÷W½|Ä•éÈôÀ/vC"oǼQ›jÑ<Ï`Rb(qIœ³£e¾«ÙV˜‹t'¦Éž18ÏÊ” Ù¡ÌB)¤ã“”ñ1pà ð >ý‡3Û ÖB“—/¨ öQ÷2“ü÷ÀqLDXÒʽ}ñÕ êŽæWº#¹Ï Kwés^¨¢†0ôµœl ˆTØ1c'm¤LT•N °¹HåÔ=ÃÙÃQˆµ˜_Óƒn˜9±Xàwß©jÆ2|ÿ ‹ Ð%?kR£ ò~ççïGmð©OmrÛFY¥7F)]—$SÓRY®XéÈJº\çŽÜ㻿š„vþÓܰÊî¤O‘3ßoßÊü )¸Éªäq0n]jJÏúùÊÐTº•H œ9¬X}w*B¥ëhá”4»'—Òm¯Ñxi¿Ën÷ëÈe4ÏÄr… 8~c ßDï00AJ=G BCßO!g­AüFOö¢ÝéF¤\@²-ûÐÖ•ä¤â<3ß5¦11Õ,êIËl*÷ÿ†a­Á¹¶ нŒXeJli WD¶µê­ë¹»„óê‰i™-U _) ˜Ð‘-s;IS¸LŒ ãj„£×>ÖšÚGâ¡ Õ’ÇŽÙÛ¹žRÛ¯NZ²€+}’”— ØðÅT Û:|’¾LÒ¬¶q§`ÊÔrç^áˆÏ½jR–²µºþ¢Kâ=ó,76™ó–@ÎÝ„o <œ°.Ûî‡ü d„ÓS?{sÉ\lÒ\ômSÜun*ŽT»Ø*õ2ÅÃå=ÕÆTN—70!þ cÔ7<ÉDýº”76¡ÆWÀ¿èL˜RAᾬ¬pÁ7г ¥Ó¥É?°boZ^üØr æÔ¤‘L}0éíkùŠrë“£Ù>rt/¶[®(…"r¾ì¾{$w_D½É£pŽ„»i2¯9÷$=` ÷î›%Å¢¥+¾j˜EÇä0Ìü…$ú É.á wcЖµ·’ÔlÒºþ¡ZÑš·TÀŠ/Í3Ã=Gê„yOÄz/ƒCšÄ¦^®u%Þ‡E²—î†>U±‡”^EÖ•ÞÚ«Võª¢›FW_™[öüE®]ÀC•,ÌÞ<™âúhpOÄs­Òü?ƒËc²¸sÂë.#Tå+9Í1G2ÉëdUኳÂñ4Mó<4SlØjôœuPNY.ÛQSÓèndž7)@é"=2•ÌÞÉYV[T&Ê©YÝ:d¶5z‰ÞTsºuÖzSÙÛ––‚þ½L*Ï(æ½~Zôˆù¼Wà!=˜è1£Öñå®Ì›R{ïÕ¨Cå‹©ôЬGמ‘ÅlÄŒZÐYß,tÂo§Ü«ofô’:ä8Äèð¢H$H*JL¹o¤1ÒQ¥RX¹ Œãe³ÉÙU·6²ÎøËÝ“ñòëqò@5ó3óѦ zëqF œ›«î(ëD œÒÑ’QÊ€D·ŒómŠÎƒÅX¿\;A¦T¾v®' ²)1^ Òé3¾™Eä~l¦·Gz”Ì•‚'N\‰JìѵD…khÇ,WNP`Q•E2½žÀ ®k±ü ÿè¢òÀ¢€ziT´U¾Œ(›Zòß-îh¶¸…íøWÃÌNãR<nÜã9:ZÊÚüVÜeeïUKŒËÞö•C…[†G¯Œ|òg„]Ô.*ô“õoSEÇØ!IÊ!Æ¢”NÉ0Æ=C)å¾BPÞ°!u:»d«u,Eà Ö—Ùœ ß𞯪¹ŸZçýLüXù gìĉqJ}v„è[À¥¸Õ˜ï2§‘7áÈÁLüÀ½ ïú/,#˜°ÍÕêü f±Ìl°ªQò%ý%Ä™IþŸx±‰þiŽOÓu[šÑ-€~Ëýg7IMÜ@v0ÛwðqV;[Gð¤y›–IŒVu j|‰ÇÃÌ /­ ¬±Ž°º1¼é°c¼–¥„ôÔ÷Œ p‚÷Cè™±Àìì1ä™–>»½û—Ù,™åcÈé]7äíi‰ÌFÑUÂ…½½ü{(<)°åÈ4]Ô ÌÀz½ÿ>–4£Ù‰% àŠ”Á'âÅÞRWx²ýÀ„&ø%ÀÞtsúbt'ïj ã‘$ŒÙÏ1 ›±sÕm¯ŒE*80ØÙaRväv ¬Á”1g@J®²þil6Hž!‡‡ß´Zˆ4^aJIF✢mw‰¸äl$7uO±|½ZŠ\±¶ïâ¶`ÜÉ{CÇ+Æ3ùh»T™nèE+ŠÙ;.s¨íFáásæ÷ÄQ»ÌÝVè<§®è4Ðú¤YÔrÁZS¡]×Sù<%se8 û>ê™Wzª†v¹¼´°@ §øÿC9Äð¾8€^/F…1š­ˆ%2·ß–$ƒÖìšG¸®Eô˜ʯMìªpF1çÿŸ»Á?º<¶:ì2…·F¼9œæX §½8óý±ù°ÒŠ^ðCå²z¤³çCOÄ ’<[#Þ¾éa: ÄŽ»¸l›_Îÿz©8qûk×*èÅ›Í_^Ž‘/¯”oü¼Àþ4¦+ Åg@…ÔŽ¥õâíâœYjË…¦ Zl…/©°RËmæÙ]˜ÀËÍÓyQÞ¡gPÛ2>´¹a¤Ûù;®22GeJN;z ŸÈv†ü"È›óí]®]³4§þ[•ËÇH²ð-ËÝ%<”BCX‚1ŽKtÚ\LZÆc½Î•€?gAÏPC+Ud}Ð^à¶·­ €üeÄ€%=8²¥ËkÈú.6.5“ÔðpËî ýãÅ 9Õh,õÍVW€FAØR^Ü6럫ŸõI'§On»Ø©y"®¹™‚ßð]2#"-üšœ8]²FôIS*édkÍrôÓ¢æ‚ ƒ),}GHAÌbñN\ÍB¯ƒ÷¼-d •n½pºz£¼ìÍX…0Šõ ®Ôñ9lz%ä~²Y Ïè•·ÿfÖÕ žïÂÖo=’ÌË¢cxðZS¤Ä}D¸lj£1½D, ÂHņŠ'Z>„­_'¢ÉÿánØê}+7%âü1°}ûé¿ }È"†xPwÙ‘7´÷Íåz§I ÂX²ÑÄÉ ó?ÑU¦ýÇœ&T‹æŽ/På/CvÕ"ü`Z³V á¸‹Ò¦ÚÔý˜Y=ÇkêV’f%Î9P¡¨®"¨#¼ T*”5(w:U´Û $«4ûE—™¿)ek-p‰‚Çhµ”%”ÙçÙĸü}ó§Ú ŸK2Ç[.ôÑËH[ø39´ÝJ;µax «Û•$ MÂõµ<ÏWj[íIASÆü‰kæ–` îxf  2 ¾îÚ±ŽC-Ç…úȰGÐŬ eSõb޵`(Ô+ºn "0`êEÔ7@&О#çž”‚™l: <ÏŠ–æõ·}uI êdv’ÌB)_ð;ÓÙ/í³¥%n4`‰äû59rÕ`„›ðMµ}CâEùrj;ñnÜ6É”WrœÂ°Ö6³“‰ QÆ–¶#LÔ§ ½ØHL&Þ:) çãàà Ö,GÀ—F]OŸ·*âÍxØvÌO­MÓ$‡HX²r¹Ev!h g ßÞp[’ÞL'¢œó•ÑQŒ¹púVl>¬Ëå¾»Æ~ê&°Œ>v<£@ TN³ï¶á„(}[õØ?PY´QIP¼3r\Óƒ’&:øöŠå(ð¸ýX²?ôã3wÿLÔ+{¸bÄòLó[xÁ jY‘ +ç ûçcÙˆXL¨âzEòêvÅ»­uë¨JŽhwÒÿ¦ëÛ‹‰/à·Òö»"©æ=Û–ôŠúSlÛ6=2”ƹ¼ƒ“¯æÍ 3Âûiû›G¦œœé,˸j1œºþ‡†ëïðWß@Õ׉C·íû]¾©Éµõ²VB„ƒ½ûtDoá—»cÿF¸šÁ­©æ¸w@Ù($· æ+ù_]<[4Èž»vÝ :èƒæ+0ú‰¼‘P]ÝâºIˆ²ËOáÿéiúcœsß‹Äôl•‡vƒßúL¨EÏ>È&$‚»@'»~[ÂÅaSRŸbüTÒµl•Ú®;Óɱh¼“ËuÉ[À¹h‘f eWW.ÞÎ ²_‘Æbæj‰£œ p€]ͧx>K²’á“FG7×%KÇ “¥É´Ä›þï=õú-3>ï"Ðgßc^bdÑQyHäL¿üè·¢ø^Ï€Ž?O®<ÃßÚ>’‘é+_öAQ€¾Lwõì Ï Òç9_«¦¸H³ˆ=-W?½Dk_—ê Ñ‘‹«D‡¸[T6ÈgcU%ºu<§B:—ƒÿêX^™2ü»öïªíÑùñä \dè΃‡fxÍVu¡¬œuu(bQv£¨¼‹c·¹èÍ©¶ ÅÂj«fÇ€!s{>è«¥Ñ@a¶ÁÏmÊqŒYBY½tTrPÀÔ{0ã)}»ÅA(¸?Xú–2lãMR–áûLÅPÍ€¡!M‚¾’·®î>ôä·bv5a}T–Ü2ûGGåIs›Ü¼3B> "'y_óI#w,SæÍÚ},#GT]j$9²1?~Ï_×1ÐÞ¸½E°Ž±)îÀÔê¸ìc-Qv­gêÆ¹ :IˆÒ-¶¶Ÿ?؇‰fNˆ‚eí;1bß¾$§Ô%LÂô˜ä+׌s2`Åí£¤ÓýpÝP…ˆ<c|x¸+_ÇŽ'‡‹S ŒU“¥!Ø<7`AøÙP¦›ùËÉ·[>­Ö•æ\ƒ%K%ÑtúMYõÅrø¬£†É¶<¶bõ ,ß7N\½’åônOï-Šž=£gçÓóº@ TEF9’tûÈÁ…èÑP¬ êzF©´ÙY).@»Á%0ä.e5g¨\vïÌn©£`)A¡"[DÁmQ VìÊYŽÍÃíí+fóèrò> ŒmëžZû%cY@[üÌš’uPä™Lî¯ÿ¯- _Óìäù{Æþ‡a÷M~ï+O¾ÓŒößvYuÓÌQ1 ?u|92LšpG-xNIæÌ·ZóóùÊ‘âì fJKM݃%n"u?¿+[sw“ÈÅ‚á:ÏÛ!,š§S}Û|<6ÆBez\rB¶ÒYv½á¬`}±†¼/ûH •±÷¯Èdà6Ý´*h#Ü!+ã¨ýxºiÚö9¾)š]WÕ–âKs|RžHר®)Ø—íÝ\ý— uïéß÷¨ÞõHÐ}ü­|÷FNхʧød}‚órgù4 K8G™¼™Gÿèƒj_Ê]$b˜új¢ Ä•}Àž}¸¤ˆ½ž#é°j”F2ztó…dõª´vǽ$1ܺÕóê8 ÑÚ*WÕƒ:(ó8WAÑ/¾Çòܹ)öqç= Þw-?PPÔìâ1PBìgUR£'åÒCU¶XrüpC×–äU,6 ÞìÕüæëÁBm6>‡6ÖXµ-³açÚ$Î`ƒIN;8BXtY„Ù\Û€¥³e –žˆ¶¡’Øûh3ÈíÁrFQ.0ÝV8Ô¿¤Ìmjå•FÓ"aû ©$ÈHjñ"/µ¸¨¾ÿšu3¾˜®æ|uèæØ ΂1n‡.À8󺲈Dæ"k÷o´ÝS>2ݘ¯­hn׬_"Ò:ÃïÄÊ<ˆ–3)ÔÅåD^H;1þ±¶eèúåÏjÒÉ+» ÁœÀ˜|‰eáý¦ïD œX‡â5Ÿòñe`,!Fž†©:i"û>Ü0‡Ùg˜aµ¬K‹ðš€£šq›»ïX3¥5·•]1ÒÅïw¶?¯ê >eý=m4›D-±KXà£Ð^³Æ<µœ™!FWf«h?Òhä„Ï^ÀüW«‡4¶úÌlSwj'áê«ß"¼†/ﮚZØd¯Ë.%¹.B¸÷ü6Ü„8J[…åÓܸ»ZŒ q®ôCú¾pö%H]Î;] _ƒF=þÙÑæðvêAöE„Ö_¥ñü~çÅS€P´â}?Å*ÿ¾¤!©cˉµ<Éâéõö¡ + þ¾Šý|Ž8Æ1Ž£¼ç"|n/UO¶Ø-³UÕtì„ý½NXžÀ“ç©òhz0 p©&ªƒf¬3);“¶·aM|‹”5&‹ø}ªA<ú¤¼ÚÞ;य¶>fÍ¿Î?ÿ]¦fŒ|KŒ ódp1_Ÿ½lA‘{Kïþ…Âþ‡‰Âlð~®µõìAˆ¤)j~ʽ³S4îrz9>w“’mé”#¿§Ž®ÚÿBçïCÜJífÛÇ"ÑÎP"íìa`¹Æ¡àYjcLñÈ8ªs[Šß;Sð8’>±g—Ù5© qÚÐI2@˜Ï¾öÔ“±Â…K¿ÕŸ×†ÈÓÃ’ur èxµI'ëS¼upÙNÇ*A||“¹~dÿ¤‰þªŽD`½q˜ë‡p U¯ Âk0·A”:,ŽcõQß¡Y~QýkEÓeÜëbz‚v®kcÍýÉ¿îÏ«IâLüÈŽ3o(r ­|ífsU%8%‚ÓJBÊÄ.ê.+²¼£¸‰òùLˆšñ{…'úŒ˜Û‰¦/ûÐç×Jøg.ð¬OŠ·0ߪ~9'¾ ·ë”3 ÚÏšè×êU0¿B>‹ ºõ‘·ü°¿2¾Iüé|öRx³ xæ“«@ è™Ýfß_eÑˉl#ÉX&h·¡CtLƒ6}LXÒ£±Gøj©a¶Š*hû„u Í€~ü+CçZ¯?i@ðÚÙ¾dÅt©võŸ{¢N!;žnÙ[qIíè'È•§É5Юªe}މ€‹”5ªá;˜·ú%», +óÒª”Ð6`‡¼3ß(°܇¨4¯÷Ò3Ó)¶0z½ä{3e‘¯ŸÜ&£²Àtp“ýN-#è %E*F„OgQ±Ž8<~e{b-ðµ\ý’Æ–mµLÇΘrÓÙó3qaë>öYM-·³À®\»\o2XsÃFœBêxIݵJ¸m¤™ã‡™£Iº*ˆ+½ì*-ïëØ ‘âX 5_™ÒÁÁvW²!¦kXëYF‹ºÀk¬Ñ„ >žJ/í½=¹³Új¥“XWÂóZŠø™4ð?Ä›ß-êÊÍ7Ý`YhÕjÅÞ5ÓFð\Ëë¯wolkxÇÿêw=Ÿ°&8¢zrè…b{ß)FN©u}=Ä´ˆ#¯Úá³æêxåy¬›áKþP1¥çuŸà§z,C<_J½-mÒLEZaºK½¿¸y•L0‡Ëƒ¦Uq«´í ³‚G¡"æí%)£éóÌP3Oöf3‘4tï[9Dô1rxÃ?™–®JŸ­o΢Ê=Íö0áÝ+.wÔ[.;˜oŠÀ*ç3}ˆ®;^Õÿe‰˜,v÷àN&woIõvJž‡À Ä‚h„·3§É@P/ÖBùÐòðÑ;Œ2°ÆPÜRÆ»‰j-]jn·e•9\aû£ºxS:ÝãÌ5ËÆ^0I#Xr!…†ÇÙÜTFhž/ÜKÁ‹® Æšk•8‰šrë—-§Ï K⡽O;AÿNˆ GNx³Í—‡%^Ñ)ÿ_Ûq½á¦(óМr”e:€Pi°s|Vñ<­šwŨœ6N¢§ìGEŸëy±ë®ße·M/)Cé%ÇsS¸[ô(MDùà5ù޳Þ†,ÛgX‹ÜzíFã´6\>¸ò¢‰êŒ¸l&+h˜XÍ€×ÐbÇwÌU ,§5¡K7(Ùó¾yÂ`»DKñ/"žmsOE_GwÓDÄ­ôã¾§K?«¾ôÿoP ›¢ÌLëd EÅuàQÊo€Ûª„»=R™;|dí¥Óú–#7‚·FüG›ÌfñúEÚPnhAsLzýò.IHûäc!ò@ª™ÉV{b>Þôd)B¡£íMíKR·}A2— Úßj7åé™ëƒs× LM<¥áò¢Ì!ç£3[ê?)˜Y‡vÊ<« IZY_±Mmpˆ'BÞ Ø”ú.ô!æUú”“MVÞ§Ÿ° á€æO q+…<›ñ$I-Ö·ml´ñˆ¤H×XÈÖìÆd¡W|ºîòpá÷–ì4ºu‰hÀaôÓ ôÆò–3æ­,)b“¾îëx$L7¾I$øˆ€mØ¢b>zþ®+?;²\,¥ùÛ©ö„!¥Ò5 êŸÏ:{4qÇ º/Léjþ(†p؇aˆ®áÀ¹Gd[=Mžø«3¯?lÑ ¾yI¥ü±‰ø×½ýËóR•ö½!B,޾šãHYr‹øâ&Vÿlòf¾53 ò:F°òà+æsR`ýŽ2™KÉë¶m¨!xÀ¥Ò¤n¿Õ3Ü…ùÚœëà平´Íx™ƒPÈzúO‹ù±ÔÈFó½(·÷æ¡#SetnÍå6 n¬yŒkŽÿ²‚©0€nUž\aG÷[:›ûo€Ýg vùŽ»HmÁ<ƒâPmR?Ûæ‡óÍ(oU7C²Â–Vøb+õý™M,¿ bR¡gh䬅ÈÀ_;›×õe¯&5¼eO-NÅ„vß[¾’ÉOmþ°S{ј)<‚Ô&ÿv·×G|ôJU ^bgÇ€(„—S‡sÄ^|Te¾7Ïí¡§hãKR‘0·›\¢a1Ü™€Vû Ýûw*øöÀXÒ‘»`Ñ¿$ñ þ-¼üß>¾œ+éX0¼t%O³<^éa=,wéóÏV jÏ®!e7ŽÂ”¼/è›åý,ÄË{ÆK1mlzŠìÍ;¤‰êÇ) D? Û\ŸVÓÀ`ªÃaß»!9F1áÎ}ʯ‹qGBM.(U.¸ÒŽ¢š.:èÔ—‰› š°ur‰Cã¶ñ÷ôt_¿vyü¯ì¤´‰²É‰•rÙî¤êJ&ŠÕ\ åù5åû<;ßzËÊN1Âñ” ô¯®³B—ÐÔCêôPGÔ(áp¾ƒéI§Gò°ë­þXäÆÜâá_¥ÀL¿Ã^ï²ÿ1çè$šhÜ+ê\8ÙLÁMOº“{÷Ým ~—è†Ú¹Ê¼e/êcI óüíí|f¹KC!dúÎìÕ7èÝ}vOœr3öwËùbõདྷjíÎÎÒ!›DÆ£>¸h¨ti/ ¤uáQs\ó|‚{|¥@<`²k u˜¢4yìy‡ÜñС•´‘zéºAO»  Õaÿ÷ãfš„ V7¦p¹Ç`?• á”Ú™(ƒm1exb~ÔŠ­—QB¼“ûµS!dÒ£îž5ÒVÏl'O—BkãýŠjé ·¶·Ö`ä½¾‹¯^¨ØBIð?¥:JØÄŸ§š\4oms8JóMk¥s6PyK„ ¼ÂÑæ“æ¢ÞŸõ³FƒD½¬~ËW„&Á€{î¢)§ï2’ßW|O¨ßq%É_¾¹Óɦz•êùu©<ÏöhJ@v6}mñ?@6sÁ0˜ïUáÅ•sITŒâuÇBÓ9ÿĪâIËeÀ\*Æþd?·Z/J¢y9 Q:jŽÖ¼+µÅj8¦šZZ  ~„®X•¢ Ý¢Ê)!EÑ.Ô&H /~yîlì—Ž5H^ó".>ÔùÂM§Q‰0ŠÐ8´%(@¯ÔN‡äôWü{Žö|­(Á$+ëãv Zãu.Ò£´GåwÖ²Äëvõ³WÀ¦¨ù•I¢€›|Oþ7â)ãà^{Ö|o‚O©Cjy¿ =o¸''’g k"ÑL_!“ÙíöñÇó6õ—Òñ YAcSPîkF#SÂòÐIVÚáhSPé”!µ ZnU Ïž(C`[•¨œ“«$¹Ù·í:™e¶ü¢¹\V çc /|UF˜NÛM»ïd6ª£Æ‰Y°†›Xå¼¼TCl#ŠÉ:¯ˆ.[Àà?^®¶q¬<ÀëËû*¬ilógFõ5sj,‹×ª»z¸Éßc×1‘¹Žä'”sÜ¢˜Äog˜>ù.VïY¹3YÔ´/Z0¬Ï{å/!7DúT›ÊÛ.û­LÍ“¦*„$¨nÔ¤Œ!3&s{Ùhæ'öø¨ègküÖ¦Q~b;„ J]úFêæ«è˜pÿ;±œdRÿ£¥«ÐàÍAý/ò!‚{Ó×S¦44êù‚*©×òè9é Þ»ê­Ó¤êGFܲK˜¥/  ´ÁÇ×hpIµúêõd•Â05ñ³¦ô÷Þx;ÌøZêb‹ýG0véQ•Ñè¯d ]¦aâ²÷wyI¢Å`ðîðÈ+šQeH“–¬åMqRP£¬ÎÿVY±õ×§#š‹Çc5ß$Nœñ£Ð€Þß -¯²¹èÚ[²@Nú±N]5wóiÓÜéeM2»¥¼›Ï®ŠÙx1¿ÐÀh¾øÊÈ©½ëB¢dY2T­rú—ñ‰…x0ÏRÏËmF¹¹4¹ŽR¢Q°)B-Úîâjª‰¥~;ÀÄ•¼Üš£j4€U ¦G¡Ý]áH×Õ Éê× ’<œxÛøºÖŒ<ìŸ_×qÃ1@¹;‚ì<§ÙdD¾´ý”8À t}ˆ3Ý þ 6¿8´®¨øp‹Óãâ‰BZ»ç¦Î ›:N¶ÖϤ 2¦û'÷«(±¨Ð§¾8ãX\ûßF¬ °ee™™ƒ1ºë$éNÿÃÕk7¦ó6•ÈG´^®J¾q(˜~{Æœ,¼5¸í¶ÄÐÓmÐ_àþ% D»2QÿÍ:ãh@)žÐÎÚsM–…ÚLÚyÅSîû~&Óãª^1Ðq‹ æ‘«ÿ–ÃÈšÓ«†i¦‘!IåžëVnÉQ‰_Õ®â…ÐÄžAS”Ncàû»cÚÎ4SÍ[—o{aí/d#ܶ1IM.mF…¼êyõÜÔÛžN2[8Ç9ØÉE°YÃn&!VævY¼¬ 迼)zŒL‰…û_´"r7R…n9Õq5Wäë?Åá_‚-"ï©j¸llËù¾«r ª¬Wu¤­'6)†ëxÙ•·ëp‘5ð°Ò•‘bO’…ˆ ¡‹2@A ½š)?" Æÿ‰fŒ¨ Ìn?Œn$Ä7(sy¾»}Í{þç:€MàHfÁHŠrÅÁŸdÁ{¦õCýJ+Ýò´='[sUìâú{Ÿ6}]VÏ@èÈa›p&´eÔ Âd½ôÔ;µžE/€ßr¬‰ÊSÿøÝ*xI‡{ØÿÖT%Léy%ÓÀt}#ÞÞó?•¦s •7P:FÇk6iŽK±)z?÷,ª˜{ý¸TO¥°GSx®êu¥gê *èO"b ßFB§ oWw-{¡ñ;ï|éÙÁó%O7; üüDÀ?ÏóÂ×´‹Ýíx¡ì|i\è‰g i!ù˜eGûuÿ?¯¾ -3Ä_ìÝ,!åï€|Ô§[wve!Àõ$ç]UHúÚ¶ÂFѶlÞÄ¿ Ô HÕ¢[ R?ºÁîÄŸ@M×"G²À|ï´úª'9sèqK®^v=bÐwñ_» {@b'S5˜{Åí›Î$sº¬Éþ9êeÕ§ÿ7g9¯;Jj6•i¹ØuÐTÌ kbî)Ílòü¼jW¢ùÆ¥º´ßR’Úúìe¢†C-Ä66{teSw ÷²ãúòS ¿@Ó’´àFÏiz¿M‹2häòd„9­éÒäU$óÀàRkóTËÝçˆ#êtÍ'c2uÌíäœk|#·½ =ú›w”UYaAM€ý\2*3¶³-F¦çD“Oh _ýó1™™~³äÎ$M¨¿µ°ÿ‘ŒaWjoÍô½Ù ›Rs3[ð~X—éð*£)lÀ\ô~HµX†¸‚o(" ÈOT¸¹ÖG}˜“îtþsã’—¿ANy½²QfèƒmI²­Ö'Jÿ3È#ayhýṳ́›…w-é¡Hà¨ÿÆ*8£ å…'óº4ÝdLà‹óý*U s \5‘Ö ;>ÒN¯W}L„¤fÅð7”殳á„j²é:]Ì>ø5fJàFI7E€«¹TÌ–|ø^æ¹×\§s¦´ífʺ‚ÞÖe;fIÏå{FrÄN þZÖ0ÄŒÏT›|ÒÞ®œU'ÐGƒìS»ž÷×PØ{£Æ¹¸T\¢BÔvüÓß/ˆBúW¯ùå›ÒŠ=\bc¢»ä\Q‡ÛÍ|KWÌ:öMºªÅÞ!¼«ŠX2%ïæ{çù¦pžî%ÓYüëÉi0PÀë¶Ø·HY­T†_@c×ié¹íëC…%§Çʦ‹ „u¤Iõø{^»I^»ÐÜè{¿5@†y0+MÆm‰?KAXáµ0T«›|nËy+©ÈŹɯŠ\ÉÃPxBz}tD›ž¸a{?˜ïóņtM½'Z} ¡J,Q·Pa0ÞYiM¹ä]Hóš1Aee£-<Ùf†€jsÊFÜù¤‡,4ÈŸü)H¢½˜»/:…ƒL˜w¤rŸ<ð±8X¡{¯  ïupßKemA"ã yM HØ; %,’ÈÉ( Ì0' Ö^Ì”ËiÅÛV–ZB³gÊ'[Ë#hkÃE¢™ö}à­½çó8!5eϪ·¥­¤Bý<·¦Ô·ŠbÃ_òÙáK“Wè»Ñ?ª¾ž¤< 9¿IvÿÑW;qã<þÙ¿ª B~Ï%×Á-pAz yã}]P]Ú––ⱞ5ZÿIgÅn¨mCb¨›BÌó«ðÞ¥ð)ï /Óó;ýXãe @¬ayX_›°> øñéM©2@õc¦!h{´·íâõøŸÑCD3:©¹{ÐÁÓb(Z¶Cô&÷]ØTñ Ø»ÜÛ€ÎQ<ÄVP”[TorÊiÝ'ë{[Ý•þºÃÄGhR¡Òlìš%äÑgÍ»¶{o°*xÚ«µ_ì~¹uáõϼ*¨ØÓþ™GB›Ås¶RÐÚg9 ókñXR§ÿÙ‘Ù'éšl•o3@Š^Üm{ ö=βϸڔuÓE(#MZz¬¹æ§if*1Ý­Nuy_ó3+î›ê~¹©)Z“èðZ xØsÂôŠz@=ªô|D¬IãTJ*£mQ‘IÚ O>œ3„ù=Dž­Þ`IÒ,;µÀºÃÅd»uÏuY|—{Ù«ù™;ÞÆ†r‹;Î]c³à4åVä?¾Q²Ñ7ÏsŠ'ÄÎ?(œjÊ‚ùtêÈ©§h,ÜšXбÈD‹`¬ 6ð:µRU6ÃCQÜ}i>qú‰.çšžAU/]îà^›qE‡(ˆRÞyMÅq¤Ö*Aß±ÅàÀæâéÜNÇ’·kRì Õö˜)iÈÝ$7t(üup­œÃÉB~ ÒaKŸ†Æ—#é‚:&HÖH‡žºª˜¼YäQ€ìÙ€L2±OZpXi¨Ã°k`086@)ó€÷Lyq+ë*ëU©äáYá`p ùµ)(’ P‚¸ÌZQªË4â'ú‹8œ$[Ú?WÁ dbL‰)“Ž–k͘÷ ¼e¾}=%©§<œ4yÍ“$Ì`N 8½×{ë€-OàÆÇ]ÁIOhÝR)\#Ð ŽÁnEÙÓªž[l‹vi¾4ö+rPû`4ü=EŸ¬I´P™ÿiñ{ XÑŸä‚`ÆÙêÏèM´Í¬o\¸ø¨Áq¨µ€?ìª^xÐq~m°ñmµãývk"3ÖLF•s™ÊžUY7K¾q|w'Fÿ¾ œÚ¢Hš¥‡- œ–§ o7 &L@G„z`cSü>« •ËäÜ’ ÍSÒøièûI•-%—ŠDHHÏ}@ V¡ÝÊ=Ò͆¸ží.¨¤´WQJ Œld³ÿÞ¯Ùú?¿’Ü-Ĭ±Ý.ÕïáÈ[Ô`>ò¦µ=íUõÙÒÅuÐ먗´€m¼ÆåÒ¢­&Ç,µP.¯’ÎëiµR÷³ríÁÑN¼TUEÕ^àÊΆ©PÈ‘ôzn3OÚ:ú_ÌåËX¡!Ç dnÏ;k=+ݽ;±7«K0V449C-ôª›p´uÏìö¼>—³ ø¾æûI˜Õ´ ~çô¼ª]é®0ûyʈ| ÈL±DQ7âCÔ/Ëþ©obYÝÐ]3[9ÒX È- ºî^fS~vn~ÁlQ*‹Gªæ8 ‰”È}ßíŸ]…#*„ãÓË>¥³Ál»/–.ÿ¡l®¢¶ø±ï àK†Xóh·ÙM”šê'¬¦­B6<èpÍçW=ʸé=Û1cE%tA"¤ÁrIÎzã©­Í㉔Ÿd—kJž‡·XŠªôîP¡Çé(ô@¾²ë^Ŷ]ÖƒPå‘$îÚüIÊú*ä¯Rm”£–媑ç™ôÀ\°ÿ4ކ”,plüØyµ'Èåð Í6 òáƒ,ôÍ rúù•ÐØÛ ƒ\Éß!úB¼Òa=8±I©ÿÄQNr{E<|íìô^l·òÕèA²Žsæ)ŽÖEª‘3zyÉÃÈ7"BðÆÔ nWü¶Bm¬Éëè1œÍæ«}K…ûú©K!5y è/³¤‰;DòAN?Ÿ=¨ZƒA{’ -l€²ûrZi¥ßn|Ø*w߬}‚í:Iè'æ%jrhX¦ô~ïü¬ƒ®Ñpâ YÄ®Aœ—Cw±ãMêsÕ›ƒmÁ 2õÿ<_Ë7±QÊ3Þoí¹¶s$p–^Á•GáÏ*qz…Š oðZtüɵäõéÞ+Ú’*%NØ°Ê 5,>m³àŽÀ¯Ø#‘i8½P©ÌªÖ*Ûä/Z·ô¼ÁN^ôj#u‹ •œ Jýן{ý› Ýé*æ1¬R gdTepGí r2DéªÏc”ÇÑßâ RïÞØ2±ªäÝ'Änõ¹ âQO±9jz`i»I¹[²@amA›ç+_³}O 7ÚAcyåéܘp°¡ÍglËŒöäOR<;tÕCÕ^³ÌFTcD ¾î?…¦ “˜g=~IÄX9yˆ|n"Óò| °5šsµFRtП{Ë;{‰;,œµvèåp´žü@œåEHÿ±±Ó €)•ƒ`°Ù6·±ÎfHºC{奄ö{Œ½Þ˂͜KÍÇüjò`uóË)$߬õñÄ –ò×Y+Wí±ÊÒù9SqÖªÁy˜¿KÈKý¹*\+@ÛþãÕé&ö2¦ŒŸn÷]i“žvJOR~I“ zòŒnV«ž2Ç;)Ð'^ùU›§ùk÷ÇiLá13æû¢'l[ƒô:„Ï>ŠºJ†±€öhB&~põÇ”06‰–*àg),ø~?ÝwNÑsù¡û°öë£ï4è&`IaÒËG´ & y¹²ýå„êy2ÈìuèM¼Ù ˆŒYè÷åéN,÷­ŒÅÖ¬jB» º'#näÖŽ™J¥åì¥\°0b—¦7Öin3ØÀéÄèF%ô'ªG·èU;X EÁh^`&~V>š7…©Án2ߦjUÿÌÈëÎ9VÁéw‹d%Ž i_®kI>=/ÌLöN*²+K¦1Å'¥hs{üØ¿™vwf/ Æp›˜mÙß© Óg. ¿&I<= ƺêóú,õlÜ^Ì$b‰6½Å£ Î篹~ÝO8ú·ú:\­1»¸!ê;gù t×ÁW£QKu[6âPý©mhkôÖ{oÖ¿X÷ü9=á[†¦ä±èx­ƒ^í STü¼4 $`|Â)­5w0×}ÑdÈâU>—Eí@Ù¼åBu6y:ðfZ9LùfòSWí,J?øõ +ÉÉÜ¿å2#Ðj’hÚYkø”Ε€ï#ôîçÛˆwppŸ~¨ž÷Dº¨Rgæ%sÛ¥%÷u(‡ Óñíc²€/ÅMÑI¢bÜÊv^¥ç¬2¡Ô‘Ö<¿›xß§»+"7©Õ/qHYõêl’ÔL¶NýP~,˜ W\©ºFo¼Â^ûÊ„š¼Jœ8U å×ÖJx}ý#"›úÊ…ª!Ÿ1 oäªý_u>Õ`ñ#–Dv—+Û*€‡ßaÐÿGþõrš€œp!Ö-ºSö¶¢k—mS”ïñ ³¯XŒøÞ´K°cRd#Øx6Õã¼áxΕÏØs,ʶ‘ÝÑ?šÒ…òÖ?¨ç±a6±¨íûD¤b%MæÓ¥ìq ‘„¿‹#ë­ÂÔ ËS‚-ÒŸN\°E>†<ªsá»ü(ã6½µœãè€eê‹y™a¼: \—þº°`y÷¡Þû‚¼¡/(2œ:·&«|j-¬ÚÆáÚFå‚…V•¤²Ùà¤ßp“:žBÝ |jÀ­‡ýô+E96sHÝÓ‡ I ÔΔ+®jˆÌ…%xŽ""9£„v”``¨þ¶•–²Š “©õ‰_{P™…ãd>äwRë­6MTC~òÎl?èjM+á(W{mñ2Ì}`-ÅìlîÓò¶›~˜Ì­H²æÙš¶»³:ê ÙAk1áEÓ“žé´¯¼ÂPL‚ØyÞåDUÀõÐFH½=;œÒe7vA}ð5©í–`?®Ú%Zs…­«_ãýÄP=›cSDG¤ýOãñ˲BpT1©…Š `úŠƒl0t—i€SÍŒbò­«¬© ¼­‡öŠüE9ógY·ÀNí囼ÀORŠ'z’qRì‰@‘’òå&÷™!¤çoìâ7?3uÃÀ£jáÖó½pXj¹FeßÁÅeK[Zì_’Ö8z»(¸#fþF:^ øŠØßàˆš(×!ˆ=éÀ$Gd䀸ø36 ÿz5 V ¦æt°'L+r“PŸœNNì),SŒ­¸wȲbÀpõŒê‹´6Ó³GÞjoèÚé1ʯºcJÊHÚDÂÎôؾkMµ µâG¯FóèP}ët«r£+Ðýnd9þæéJI¨V~hÓl³Bꆶé(fM­¬õ>dÇÓ’7ÐtK1_«{k…¦¢•ZEëÿ½‡›Ú_|³(\rAPxíEtäd­³ÓðZcVs«¦çùóõ¯Å€Ðoà%KΤڊôß­“¹"]ck ­zDfÓl7‹].åJ &†ùq¸£ KÔêMYxK÷;{‚~9€V¤Ó‘gt Ý\…îÑG ‡£µgx‰.;ž'-î]ùª`L˜0|Wn)+½ƒkï‹ãA6SާzÔ ‰OØ%™PüÄp¾“hV¼Ô­¹‰M¢ùY›ò$Å¥p(ÈÝUŒxŠ$øþ±¢7ü¤“© ãã{® Z‚œŸ} yiöÏ[Tôïã‘xQéöz)Ý&M+ ±½°]鯉K0Ï[-7©`²K¬Ré4!Ú]?.D„Øpó3ΕD©õxíîFÞ“[Ö^„=G\d²üližìÙ¡µK\¨Ã|6]þzþ‘‚öä ÒNù.Šò-%øKÓ­Ð S#ÓM¡w±Ý7{w¥ Øo9ºNí«mÛsºxCâ/Iù<€»}~ ¡,œ*ðPú9¨>χær%zb¯o6†ª°òFüñ¡ Ì/z*tìÖ(IÇAÔ]’¾³†KcwöHXZr’ò˜ÌÌiŠ–ôÈ9íÇI_P³$LYí*15 âa2ì)p’Á%xqQßôÌ0ì¦Á9a¹ø¶Šˆeü«(\ºMˆ‘ªì{Õ|´<ïU­|½§ÒÏ 8xÅ*wáâ,ü´¿õãàƒ?MÞYòè¦Ü^¹¶%ðZeuD\ù‚gäB*Ù›RÌxiˆC<\ KOQŒsö»¨é)6.¿8Òl›è®Êì3òhâr]?QÍ2|HÒ«Å.&[æ:*/ÈtT®B>µ¢l¥Ú-~Š»¹èC›h>Žc.m¡ô¸\Ø»±s,ª ï1à¤ßš›ž¸ÆBÕ¼ÀöÞÖÑ–!:€Ñ€$«yô÷ÏãhDƒœ… aÅ;OèSã‚£§w¤q¡–òNK6)’j$b7å÷>â“•âìôìÕ4aµ·ÅªFÀ`Tf?FìíŠ>˜3Kœ*´0ô5÷’ht߉òñg\]5¢$ Òñšk$øo… ö“M¸@Ïÿ%‹¡Y5¢a-O mÅW•4Ç3$²‚¨õ¦zŒwîã^Ï/ÇZ=]nÔ¤á8XH¨¹Z¦EEs]‚ôÉ:?¬ç-|,3Îá”™Ñ#*ß·Bæ!*l“fkÁÚä'\(«˜¹w˜Pê)ݧ»ñK^,hª&ñ¸w’ ÿœ£ˆ4‡˜´B;9O­“[5ãÕçwì2±B£†©oìáO¹m;1û6³d@§-ƒÅÚ8Éþß8|Õ‡H»&¾KH•°.ްš[uHÍæÉ9Έ€ë‰±›>&óTË!­*1øÛkIh?ÇýxP¨K€¹ñh„5¢¸ÿavÅpÞüéÄXj½]§Í*É<žSÃìÇc{ãÐÙø°°‚¯)·Å%ÆA[‰àuœ\c‰¿ÐˆMŸøkÓ[¥Öyè“ÒYè…ˆÅï^Øš)´Nô¥L³wP/Pf-¸ûÂzÿ³Ð¼ë¥Ì¦Õ|,$k "+%’mShæ'(¬±¹õ±þjŽfaÊøóMá+q7ÛH¼¢³” clø6ŒÌFTQŽ~roÉÜ€>SúÞ&ÌY²K]†Í¡«~§0:øË²­|ãV,Ôð†Dmµ½†w¦ÈýÁ;üx$#éiLz`PÞ“£Èg¥”ÀLÀû&ýℵfêOo{yôò/éņÒ]‹@À¤{z+âJƒ¯¦_*ßøÖV-É̇¾sr3ª ¹ÌAsn¤cMÀ†z®Ÿ"ì¼8híÑLÉ}ÄEÅ.õ¥‡¤5b¼rÀ^šgŸ •^oW¶çŒ”¼œuÙQšxhÔt³-Š,b×è&0“%©Í3ÒÊ5Ð6›Ô\Öñ}ƒÂÃrÓÉÃLh°ç ßå BŠO†«d÷ÝNMŠ^W"Õ¶Ž^•ÅL×ÀFÏÄ÷Yð ÿúß…ÈIœ±@s–°ÙK ]þ„é¦Å^‡$ ¯î‰9„þ3õ—Í<”S?›SV>GŒjžBŠ€m3ôaoý­"„UG {Ùñ²4ÁþÜÜú þÃVÅÅþ\[¨Ò_öchtÄfY,Ù in–Lü Þ^ ºÚ¸qØîÙKĤ,ºjðRj5ØóûLüòI­ùg.s¤¯ZãR±‘]ã1Ûÿ*ˆ˜9ĤÓ6ôOoQMûiûÅÔÖM”†·(]u3§FP9 !/â‹a¹´Oyá]ÌQûþܹž«¿”%%ßævD½M)þD31uíœÖì5(ñ5KÜûP’•ÿ1#â¥1yvnzõ°ÖýDÁO‚ÊL¨ŸÄqt^¬†Í‰J6 œT™9R,~T«’ÑÏ [ÜLøéȹýIµòF¶»Qû¸ëj„²8:Ï©È}×<‹é¢åUötÇ=ç œ³¢?ÈŒD­ø±C¬´;9M.퟾§°Ì;é`à8NñÜô J"à³´·;ˆìQƒ²™oÙ¹¿=¨È±jû™¿| á‘îø®íúÒ«„Ü'ä—“^Á¾GÕ²U^˜ÑX‡ÿ‚Ëð¹·oàsb ã:$P \èY¨žh©M–ýœŠà{¹Ð`ŠgÁ}Á\¢sÀÈíƒÐ?P.}¿ ‹wHzÕ›$|`ä¤O¬\SÊ¢õBm.P7''Åv&GH_?§yÁ9޹@ÇM…fT‡B©vÍTøóçq¬5"j‹Ý¸x„¡×:ˆ€áEI]o5N$¯#©Í¯îº}Q|¯Øœz7–îü vF~[.ô¢DÒiú×A²KMÞ¤Õ#t®VUE£K‹" h»õ^ßõGƒ‚ÏÃÿÃå*7kâ•ÓTy |–$|œ-ž©ñ AÒä["‰ØìGòaTLKÑ—F’ìQ•ƒšcä‘)Пƒ˜îŒ#7±‹¤~)Ó¢(Ì<ñD}òÞ1`²òêëÓC DÑvÁ:Z‡lkñ7eû/J©çà­1:ƒ.}NÃÐJLÅ Ý~Ã)ÀÆ‚ÅfiýpM§´Ä¥jPõ`­Æ£1T'ø /ß@`5{Úþùã=‹á?~DV,1Èĭʺ·÷&[rg•,QdæŠD4·hAx¡®Fç¿ãD«™y”a«®ž=NBMཙ¦lÓ°úÏ)ï‚H‘ƒ1nÄX¨_˜Ë°ü xc™Ûz°ñxÆ)»rlQ%Ër%Ê6}ÍÐg§1Èír2N\÷¡&ö¤Ÿ’2_a^“»"V„µ9²me ž¤_«Qv?·…å”+K âVÕŒ]‡ïiE}ÔyD³NK))<Õ5÷ÂZv+òB3/•]ª ¯›ä»Ë-J¿7@8VmAžqعÙ¯‹(8ÃöxÙƒ~êi¾Gõ•ødîþ"pàUVh qš3âIS÷»ã ÈZˆŠŸÄtWŒyÝišžs®Áy—7NÉNŸGx@}òíùúäWó–ä’‘Â> TæÐ|(e#t£g@L:ŒP§NªLŠì"¨5e­ 9|‰ÞÞb›©¯gÍñ`‹ºöSD½DµØ¦UáûÒR¬ ûF()loq-˜ïïÒŒ¾&1ÜMS½‘TƒXl–Ǧeê$8w´ÓLU G:6ùÁÝ«¨š|rz&%÷lÃØsNþ‘?¿jšºCZ³,âo!$™ËLN—Ú`+KQÃ[#“>õ êËŽ Âu±C9á2™7Cxÿ³ òV‘Ý+î¥í¹½*܆Уé¬îòîÄ[ÐâUÜXß*œ\ÖJ´¼A 7¡7! Ï!L0'чg&V}œP’oôU‘šÇ´|Å ØVßÎzÅ—ˆê¤/Æ”ˆ*†œbTaˆCy˜qC¦º`‚—9Ëâã”ò-ÎÓGGí +YÕpëAáS„0Ø?.ïÓÒv Ý W9»ù ýÐ Õ„¾»ËBPMuØa ì ®•ªº4£ »~ÎöŽvjÚÈ(OHDxÆk94„6hvp_øM bÔàw,˜gîÉûZòßÚ½vªË‰‚a÷op¼4É7voðX˜ê1è´´ÿeꉨê·:ž ^yeSJÉ‘ùuêR#´8ˆAã€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n021023l.pfb0000644000076500001440000013062207056046553016413 0ustar fnevgenyusers€~%!PS-AdobeFont-1.0: NimbusRomNo9L-ReguItal 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Roman No9 L Regular Italic) readonly def /FamilyName (Nimbus Roman No9 L) readonly def /Weight (Regular) readonly def /ItalicAngle -15.5 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusRomNo9L-ReguItal def /PaintType 0 def /WMode 0 def /FontBBox {-169 -270 1010 924} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020937 def currentdict end currentfile eexec €ì¨é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>mµ¹œ_«¶må™’Íîcbk¯$uصÄýÏCÀ4€uÖlºi"•ªbcª»B|œÂ*/?¸;ÂfÛ÷Ò-²©ß£I4ÞŽ‚ßBkG3ÓÿÓï°Ãö +_¢v=­Ø`dÃÞ¸ú3à‚òxþæ‹Fö²VT®– }HàõNù»x)cþël½6dB[KB9rraåJPö)i‡Þf_X#8ˆ¯û=½W|—pS;¬ ãˑ߶à1ñÚÛ\2[ºa$³˜ã’ÍìE¤WÑâ·/M­ÎMHÄ9UÔÁ”ÞðÁÕó´ Å<Ïfw¬Êì%Íæ;3ÃŒôç'ØLT»ír¯Qê¡S{ËiƒE°ìQ(a®ÞÎ~Hòä‹R#àT]ºÉaöFÍ ”Ôux‡ŽQÀj+CÉíï)¦x!Íé£Ýä;v3ˆ/ýsËÒ¦DëéÁêöý\îH²+A}}·ó ùç×±Š!­…šî û;P‡)¥þ-c‚ò°øàx€:$SUÚÓj²È²X;MwÓ¬ûÃJU5»Ð7éÅp\ç'Âd” w{ CÜ•ã&„åž0•EÎŽX‘‰0å› …Áj²Ô7K™èG Æx» ¥„? h…GœÎ|ÛS?ª€Ö%ñY†A½Çe÷ 5½¼œ-£f‡)§ÏaH‰5å5¶rìW(Æ}èΩ!´“ÐÓ;$¦¢W¬¼ÿ=š b'ߌŒñ²šž¯¡bñ‹ZèIÇ©imLq¯›F,| ¥G»™ò®vUú¹‡V·ßv Äйø…+¼g†–ÿœ•|d²“žÍmÜ…]àgG²õõÄüQöŸ¦ìh¿’=Ï6µ}2’ò‘ôM3Ŧµ¾Peäl¯°e|,øìøÆB£±áš D¶Zg‹àë¢1®^–mŽ„Æn òß™÷܃…˜ èöÐ×úŠ$.½ÿ i×pÆÊ5Žn5àc Kž“¶I«ÙâžF£c]*c^(l·2äà2GÚEuN—ªüÏJóÀh(úzïdø •U+O+•Rȯ†€Î¬A¡¥YåÐâ{R0ý¹‘ŒmHF¶ç” ­à¹–¡ô­Nofð2~ZF‡î_ÜW¼soØÊPÏûn.‹‡–ýN<ßY¬ˆ&¨˜Ž#z9ï>Í-+V½/ÂÔùg]ë t<Ö*ƒ–G­ùÝP¯(g®l(}ù`¯¦ZôûdêIÔ…6iÕP $Jã[E#x]§¯øTD¢ÆÚÝ» òZ[–?HX(–7tÒ&ɳû¿éß=Ó}YýMº@¬S¨ïH¸M\—¶X»ã_ÃXwŸî N?d©•ÆÐwà߀®»\©´Ä—­îšÞÈË|JÕ&`:åôBf2òöû¶€»°‡àYÁrx´0ÚÿAì–QÄp`Ç¥Š á,ò/¾­ÌœV#çÚSE>áærŒÃúetâÊ5’•ÇÒ– t3J„@ˆ_,…(ȃvÆù=W‹Gú»õðSÿTqc)š!ä,—Ì¢Ì×±)ä'ýzºþZt¥¡ßH»ÑrÌæÍ+`ì!&_¯P졆«¦Îo¶=pC#03¾aŠÑo©¢õ$ñ?Ãgäa«õe½Þ«¯8[°ÿ¶4[x6•0Iaä?>t5·•WžãQÙ—ÚXÍEjÄU¨2sèâC wΗ¬w³Šå»ã¦~ﲬ°áÝGGbb:d-f¤ý¬ûš¿ÚÝb[düåÔ²L% ˆ ~Ρ;gÂ'r¶xçýR#¹VÙE€›—Ç5£«ˆÛ1¨±L*Æ} ÅOÄŸäa/Ì-Áv«CÛâ>9ây±çk`;óJ!þCª z‘úæÎ5)E¯¾ÙÍ N~°4;eGüΜ>sÜäܺѠ?·2ÞT@ÿ˜5l4¡%ÆHÜIâš‚È.´¯™˜oýQ_¾WÓ†w'S#Ÿ’6¢¶ª»ÛÄï⽪ +Þ„Ä3ô×SöÌçŸZY!‚˽m„¬Lª"ê0óßMk´ |¼gä †ÍO!5°Ì2þ„-‰e©ãµò8¿âúOXrƒîu°ÆñìÁÎ74‡,Û¥0éy\¾ÒÇʨâ’!«W¡ÙzŠÙíL„[GzRð¾}"éߘlöý~NøºJõu<êæö뎚ÒË0Ô¤à¯Ü:§ª²I÷Þ!hˆ¤Üõ"¸`’åɘ4^²7hœ‘LÚÍŽR¨A}CA_ÀkÁi(oÊyA×Ì8°þ^<Ùî„,¸D1ŸºGéÃF~QÙîGOÈ®\Éü{J)ÿ¹å&D,”y€fZ5‚3Æ[Ú]oTÙ¸ué\¨©q€hþ³[¡¾´V£˜àXcuGªI¡0Xyâ0åªZÁt#§Á{¾ƒ¯V(#Í8ýõÇd”79#ÕjÒ]Ô¨Ž‘äPi¼°£7åLÕlíZ÷}µ?€Z‡?ý`õ£ƒÓÞÅ‹ OÙ:¬ûÛü¹%/ÌÚ<Ò©Á“Ë,º,n² 6ü<Ùâýã„ ¤-—TÚëLˆÆ×QéTÈäéa9QªÏfÈ ; ‘jµDöÒéo†Ùá#t%CöYÒpDpò?Ä^å·)îP*†$ül ” +¤`2¨‰ì~+±9t\!ñ+ø;T­¥sÿ=@œ†ü¯_«ªêé˜äyô·Ã×2 nkSuCÆãž‚Tíû¬ÅãéIr1Üä÷ "ìÔ%ÿœÙ•Þ¯éà ú×p]úá¤lU ® —œ´Á?ÝwíÞв`ÒW0øyÏg§ô«FÜ­ ˆàX«2âqË8ÈI¸'ŠðT¼Œ?i“ eÏ·»“[{ÿPXCcí²t[&Í/©×ÄN¤¾½†þLÐ9»E€9MÛ°d»^o¢Å–Ž ØÜ CÛ@¼"eOù¿ùÅ£fÔ*†”»‘yh û{¶'àû=èÊ7o¤EÜÈÀÙHûZ)bòÙø_Ûî˜&ÚÝá°\Ž­Ÿž©Ü/'”Xäõ mŽ^~ùÁ¬85Ë}N8.*HÝOMü¼r¸+ÄäíÝÓ\ÄÝ8w†€š¼¢Ÿ^ÂH”ÿìÚ²Ô"ªÚPaÀò[q=_‡yOBV ò+•”bsg…,ŒšK[Cß\èÓaOvas’!…=ýúþ” ‡e)¡uóü”T79²`ÌêÒªºqNêö ³Á¼{:EÖÿ j 2q¹Xb1Ðñ߆¶/Fã„‹sgßhÃÞ e§rs³bmMêݺi#ýŒn&ÏŸ°¥ö"ù1JþB…Ç15:„6×yUá¤>ôyŽÃ ì½|—“É¥hÄå¶NÓØá¯s¸¸)…–9þôëÿÿ»td:äæx¯hÿÛAi5¿Ò³·Löú¦È‘ÄØ—3yÑDšÝcÿÌé­ñœ(Ïĉ2™œfÏÀ{YO‘98àh«¦„¬^…1Hòp8hNF /¾ïxO7¤~‡:‰´ü—ÌEê¼m,ø÷!ñ§A-!EïM³ù³~˜ƒÒZš|ÏÄà¬3³iëú«Á:Kíò[êé¯0:ߥUñ æÅãA“jf¯)k‹äÄÛ\˜l­ÐÐoçJp>>>ý»•m-tx *“-¢tèFÖ&Õ¹þ0´þ¶×¤ª²r:@qXÇh÷•ƉûÁf/eÉNc#"¸~a…"w@‰1Üt…猀GèP~øÖW$pE1%;úÓ O$-÷QçéÚã-<=~­ù»æõq_ÜÃw±A–G¡w’Ý¿OËF×'¦cÊ^û\ŒÊ2IÓà)„ ÑQDZÓÕ„„å^3á†Á¿'ÒXÕ¢?xM/á >: ÿ"–¤,;’»–É–ƒÀ¾q€²ãßäÚ#˜/ºÃru…ù·úúq‰Rx®ô}áiK@† 4ý=å]— ÷›Äѯcª Ö…ÞpÀ‡a+4ˆ –t!¥Ñ} Gcñԑ؈iER¦§Ä?U-®4KÊ`2B‡¯^;–zÅcrñyt¦ T*ÛÖ1®CKMÎD‚éºÑÎL¶­(ÿ¸áfÌLM©Œ»cY .+>;g öý£ŸïSìI\¹¹1(˜s‚ FLC:­½Döòà/‹ð%ìªh¹¥mJ cå‘ -™Qz5¼EÐC:õÞ‰š¤>‘˜ Fk> Ç¶:—@¬1Î`Ò¨™nÍÜë˜ÂIf¨âз˘•µI=~5<—½*9¨üH‘´žü£J¾~‘:ÏÇ—ë¨wÈ$.îßtÁ¸¥(ÕŒ×QÍÕ³8ú]—7QOþÁªãA‰xûû D«Võ4˜-ïašro[#+¥\gP%E» ¯MôARæ¯~¡\£$Prš´Éºþ껡2Þ þ]T¦k~`ŽcÒ4*æ\GqM°‘›fÅù&•ú£5ÝÎߪ'®k¼bmÙí,m&Ú:Âuî9ô'¿÷º]†Ô+í³¹±!2>#ˆâb+fêÎ_‘åA xVÕ@¶sÕ!&±×hŽ õ)ã¶›‰*¤?Vþ_…¼XÛ.`Û©µ åm׉.é¶å ëÏ=@°å‚ P®°Øž{ ˆî!_yO¼DÔ×€Jy¼Ùèssü±SZÅ?œ1$˜¬þöú¬méAÉ­a%¥b‘Oy%[9t,ê™íG$ÂÈmlìWÿèL˜6>¤¸1Ò—Ça+*üï„à<`¾pvÈ{*™¹x‚èñ:³H5ÌO9>S9¾ÛËçëžO¥Õô‚pi‘,XÕœ7ŸytMñÖÕBq‰“¹7¨PÇ"¯SÔ.ì'æè[¸“ª‡¥ “{P†•ñFjè±b"‹`¸Ã£¥ŽâɹVôeÑ­K /ª°CÌ'/¦ĉÖUTy_8þ/صÇԛɉ6Û©:„Þ÷Gžp‹.ôýaWwH‹^D‡>ý¢“8 Z¤“ö7ÿ»h-ôlŠ Ã@SÔÊj-hÔgo;`Üò~‡²m“‘ ‘!U­OýdjN ä$,cˆm§nµÀµO6n´–¬w`CO—€¶}’J¯V^°ç“ªÙyÙSgtÖ‚ÆÍ#Ë¥>’Ëßt†¬ŠÓ„´{Ì西1+¤4Y»Oeˆü3¤htVyjCBQ×U ÎgöRH«¯’v¦v\fžy, þ\¹Zz· n‚¹ÑFZ#à Ôª¼|VÂx¬ø83G%ó…æ6ø,kI~n0‚Óžq-Œ¯TÔÕ@_ðîDZ%ÀlWjtÔÖÝîómk,ºËLlbc!’_{™Ñ•¡^­lßI܆6 y'j‚÷â%BÝ´j¾’°¸ÕK?ƒ¢0Ä Û˜%9½ô5¤ÐØ 4´åƒ¸ƦÉámÅ«!bΗ"‘½n›ßÎ$dÖCh(‚tžZ[XSª{›tª½~Yìg0¡Òå±[%ÒÔªŽØÖ‹¦a„ HX%,D-¸Át§pØÓÃffïagÛ6ShTÁÓD [VA3Ôðõ!…£ü·g¾üe²CôÕ(ñw,œ–2¥Œh­§M ó O‚J[r—%;Z[žõ+z³ áS‘Jùlí–¿Ìd{ záqK1=á™Rô'€¦‡Q9Û½ ‘1ïÓ®—›yœÙ6y%±ý/Œ4÷QSsÿk@ÛæjðgYߪäN®JêR Y¸(š„‘ì¦~Xí‘’^×z;eeßzéYLh€%ºOn«´he¤®Ah¬ŸÇêUä |‚:ùýù ;”ÈôÒîʶˆß8d¿Š«nU°¸¡öý”/²_œ³e¯¸:Zx挰ަVh]~×å·Ô˜,%Í ò™b¼65™6ð®Úìl+>ÉxkáöÌ¡ìÈ2¾Séyx6Ê R¤¢†ô¼62NéHÆ\61ÔN nI×<…à…ß=5–cïâŒ#O¢àu¹þêU^¬¤×¬Œ¡ÿ”ðˆ‹’ï”®©ÚÚòÿpŠÿh¨<ü÷H¾G¦ÄÐÕ{ ïôÆ®n Ë2g²¾[xæò ©}5is䫉3ùºˆ›¿~)ßW‚Þ"YÁO âëü﬊µË$Hë™zîo‚œÎ˜{*´N”"aŒŒ¶MÏ9msõ üù ½)æ!“X9X|ïì¶ïÌQµ<Þ‚?BIsf;nnöûd¿¾å3Íñ£í‚a=­&Æ…+™“òÙ’D¥ï\¾bõnS!#£§¨Ð5z[ÕC™TLp›šÓ·vû†âηKFjýÄ }I!Ä ž¯¶ ú¯Q¾<îÚçÎb~ûã¾ý<ëÆoÍs¯ú2dj°£Q$–Gx)mÍAª}îÀÌÏn'áµlE ªñCÊÆÑo„ q»6ÙNRŸ¦“è"£ž|wÛÛþäú"ÄPvÊ’‡ÊˆØ{á°ªÑ cé/ XÜQ©&FqèHNL–îp+cƒOËÿ¥fËÑO{ “Ø6‡gùMü›|'¾LÖl£Çfò®6ë¶›¢DÛÑ&ÈT½o¤iŽ£Êé¶‚S0š ¾Ša2ˆIXòowvˆŸ'êZ2{ÞXÙ42 ÇiË”Ñi3(¹R\¤õWvD ˜dçEÈË.CÓìn¬‚ƒr(B:A®ý*#ˆúþúB$‹¾Ã5Ú4á iž»ÏÚÝóó7 :`ÔÊm§%r„(ºEþµçÄ¡&NæIàðó¼p…\ ýÐ#é!kajãzßæe½Õ W¼ã€cyzmK€ŽôN­\¿?^=‰:Þ \©d(qûÔ×l^ØJø­ÄÞÑ3ŠÏÕØùÙ($ŸáP1Nʤâ‘ëç»_Û*%‘xåñ7瀃‚­‘øiXÛ*Á×%ùO·#`ç »;gÎsö2¼é#¡×VVÑ 3–á"M¹[Çøb¢;(Ü·G¾_ã}kBfv®šô‡G(>ðšýä¢iÖ2•ÇÁ_:Eõk'çÒÍc¯°¬Š%c¤¶Ìäÿ3¢‹0z KÕ±Æ[”õÞ2¥…œË‚oŒ‰G7¿æ£2ÄÂn×£¯ËÎâ7†Œ•)cOj©+‹;îzv³‹ÄïÍ6äóÂr^33úmR%áÞ¯ûŸÏFÑ$¾†du&³°6oÞº—&÷^x³v]B‘]tß;FKåktb3è1½h©ÐL´ºFŠÂñÇí³_]ïTçÁ狃'9ˆõ …´ÀÔ,iRÏ«BÆòDö°›-ólzÔÜ?SìPƱÉ,—éÓ(¦€!'a¢{Ó¾—mIc¿ÖÓO5Ž~lì”¶ÁÄœ– ôêÆšÞ£Ó­™{’ÝOø/ü/UWØW_pÌ4§ù‘gÀ4‘™š©r„]³w=˜ÒT,žŒ5MlY†æú³éHU},¶ÅÀ¸=d’f¾¹dG1½¥€½G)Qe Ç!R€H¢d2Ö]áuZ£)(§^Ôˆ!Ì};ÀQ»¿Deç¦b§i«(’ÎÂPr·‰X_òJ°˜g!D@óÊÛ"€‹%H)¯9YižÔCØgÓ“–Î^Ô·1Ÿ€Ã ZBP½z2´9¨ûVÊëâí?"|ûaµüðÑ^#:yãawqÓWA, kýÈ?e°æ¿zbŽuÞ-í¦d ÂËë÷ÁàØC@»¸^”’ýj‘‚¦‡´=ÒáÝü!Y¸°sK Ü6îìæÙZ+zD¼ÁLÀoö¼§Ò³øËþ¤¥Ôô¬gÄ㎠ÑÏ¥È&|Ýn¿¾œo²¸H|$fÂõÛÔ˜=ˆ›]¹h?¯)Èm‡e6µWõÐ%nÂÝWEÆ):œ:â©«+Ê 9¸Ù“b  ;ˆR+ƒ•éR¤˜¢-ÄfÿiSxLŽ—¼µIï§Ä*Gz¥Y¦¸‹ÜÛ`j¸³åªiU£=§šu*<Åú²áôCDÄúßx5)»Á<ŽupÚ˜Ì6Èɿŭªñ‚š>T€<«¶CQ´kì`Â}"ü¢îX0Þ¯·~[ý+SlSÁãQÎŽzµ„z±?MÍ>Ö;6tvŸFuƒ_ýz’Õgx-WU(ˆà”*çY_”4k©7ÍOþ&Ò¥¯óNq‰£µw½vs4Ó«¤°ÞOa£åŒÈÞæd·ÏB1ÓíßÉ—ge@Å.Påí½9„´uÀD+MeÝ>ª¨zÓ|O{ü §»BȪtN˜xÍZ¹2xG£`Y,ncT{äªîwû¸M޼fôÄ ÄÛÒ1ï7¯|ÁT w?Wtý>jDN_µC$â¤Lp»)ß/±‚'a”±7w(XѨš[xлW…Èc¬¿àp@“Ãgî W-†z-d`ƒ‚‹Žßkmχƒ¸×ù~h›1Ðqì÷ Ä;±ÔuÞQט‘/Ý]ˆjÈXêDúô‡Ñv)·NªéOìFWÖŸˆkqÕÈBoˆŒ !×ÑÂL TÔ^wÎ$µT¦uÓ÷•\’Þn!b&ØNÒ Ž“ùë2CìÿS”ÀKó„õ5õŽÚ3bsG÷³¦0ô¯‹„ìçñÜ„éªqâ4SQN¾]S¥–qŒãêgæ_“ò†ù0Ú Êø1É?`v:Ñ‚©8ÝûRx⣶ȣzÐvé¤ðŠƒH80R4InC )WÓÿ¢U¡m?ö3K³±¥Æ¼z¬é®•Ÿ~Q»Q3NJurñp+Â~:f˜êZå@]aw"ù™ªF_hmñk(Ô—1^¸Ú!´:ïLó;?>à}:t†o£‹È³<Á;ˆžþÖ¦Í.¼«BÑ·”MÁJeHÆìñ¤Íù°ÄÍ06H=ì;D7JÂ÷%”ö¥S,Ú:>5¹I´a§ôg¿‚25ù²BÌ+W_@û“›B‹/»Ü¶ ÊÀm¤®[˜7¥ï±ñ‰Þôø X»ŠöððÛÕ‘¦ìts<‰ÒpíÊhÿû½ÖƒÚfèê¡-/¸¢Æ·Àš½­‡‰(g?WÓV„_œsÜäÇ,¬^Œ—Ð/ƒ-y‹À@?……‚§Tw.«lÈHd…ì¶.­‰s®w³+.³ô ͼ(±Wš…j.ºÀP@™~ÒYù-¿IPOÎÝî„áÍܪ"+KÆwû‘ žÄ)“ïV›–§O–oÓS\LMþh¶srÛ™j××ÿýjʹ¿ÔÏÒ~h=±SΩoÄ+–@Ô]?›9_jqrŸ º8 Ã Ÿò"B‚ºéµ/)Ĥ©øïëË‚f ~†"­S•sÌ9覬¼IÝH+&Ç+Ï·'ðҙϜ´ÁÅ <\nXÓèL÷b’|üÌØÈIÏ•ÄeÊn™ Qmë;rµ2GŽ lÝ(ºWDÕ[kKFiüÏ,F»pý¾q¢­; h¡øäNK7ÇŠ·ÝÇñOXò!P{<ÚWÔ.¼V!Üö ²Ó¸_åëá&ØÀˤ]Ô¿fƒ{Ý V£z09ë}ùõëý|µ…Zþ¶Š½r•ôRúNóûòKÓžt8``%³ ì nM&•<¬e‹Òxæv–oÚ[;¡Ì?ZÃyzsÒ÷«ê­CyÌšÊÒ’'üá_R1W8ÈïfÊ‹>áAÍ®Óö2ãC5/mlÛ¯ËU¿˜1g0öϹê®y܈FÙ2’ò/e†©ó8ºú*õqüI|5+z(&Ψ¨U^Pã³üÇRNåS“žÝC\ø óÌztd?í£X®HÑýx2Šv%ªú9ÆáS ‹ÎÛIÁ&¾títdÎÏ•\%Ë ^ÁuC±¶r˜¨–OÞ˜á?¡'8Ÿ‡mãÐlÂÎåÏt æØ_ov÷7Ø—Š«m@¶¥{Y’ûÁ},I—¬ôŠD;̳ŒpOº"ŸŽÿD×¥’è¥"¶à~¨‰ànOzÝ®Tkž|ÈÀA‚õE ÑNÁ¬[a^øw–ŒCv.û­C‚ …‚SNWß™_‡3¼D0Ñ¡»Û‘‘.ÅÍwŒ(ctv>2Ú CÒTþd¾UŸÊwF@ö ¨Â£`BÛͽ½¶fž¬\QX†úl¤"X!D×ÌèI‡(ºš„7§ÔÍTÒ°¹É®[lë+*<*ØYÏ4ø\Z®qâÊÙOGõà4H63ÆQ¶¶®¼AÌü_(ú\âX¼Ž\Jí¦bEÅiSiFá ÿ‡jî¹ÁÞ!IrLŠæð ‘«£<*Þ'pÇAi÷ÑàèqDIÞ+ {yãm?Ê ÿZ±I‰Qnˆ aþ÷î½RWfå ó;"@ÒW ¶?þâ0ùêiº*Rò§$RI‹ûjàÒqó$ÀH%Àk˜ó^onâJ?7^|T½áŠ­„b&©¾×KšÑ\R=@~˜­/$bfò Pø´N3‰)´o¥)…ÚÓ"ùK>R‰ ¼ÑˆÐŸäÑüÀ·¥âc»åîSÃ:^î0Rƒk桮̀HÞÔHð½zçÒµ+l.Ï~®Ö#g© HƒlÉïªõ&©’¢Œùz_„®l Õ^FÚzG;Ëäƒ µÒâj‚®L^S½ÚɹVE}{d€\Ý"¾¶„ãÍYP å,ÎP^3‘5˜pÀ+3®Ú–ÀÚŒ2‚‹”ç†]¥“›úC_åéÈÎßɰ‘N&‡Ãå_|žÄ糧A:íè_SÝY”QLŒ‡ÑóEnãªîš¦w†;—Õ'cëúz¥¾ê]üžG ¿Ìûå` ¢·X ‚÷[¾ 2@† QÇ?˹ ä»¸‰çƒ¦¤osÌåé_x+ëèf«q´cþÑ xͳlúRNªI¥ˆžÜÝ2N-¨n—ýOÊ47èÕa\@BÍΈöädf:÷¡MPBYüµêÆûJxž¸Á’?¿ÀÚó|ó›„\ös==¥ÊZ.÷h½wn´N]°ƒáz¥ò%±âÐ8.Ü‘ “›î´QáÐÕ©2²R;¯Äf”Ñ6ð\Òhbªh…èRú~b‡ÐûÓ¼eÌ™*ãLF§cÚÿfB"¸×„e"RÚt8IU%'€Ì\p±,¹òˆ{«ãò¶w±µI CíídÈPî£f–àÞ[à¡]©ŠÚ7Øò8ƒgI¸Bìínvû­\W±÷Å'/vcmv¬±ïŽuºp˜D— Bº´Nísz¤žß€\Ð=ÔT¬L©(@ÙeåŸ'b“ëûï þ=XÇ®ë(¸…³#›¤&Ü/þ0{ä£Û–Iïu!ÒõŽj{3ñÙ£ç’|Tâì”Øö ³\,B— ¦Gl¿ÉóTEªOÈ6n˜²Vâ)2›fÒ<íã_Ûq½á¦(ü‘þÞ0úvaÃÀ7:|¬ œE±H&’èÄH~uvã¡5Ö‚i1Ñ.rn'ˆ{hœ)]·&ÒG ÆÌ´Õò„+Ž{ÕRɯ*íï»In@+©¨jêá8Çúƒ ¬^òýL>s:;7ì^—àð´M‡Ñ„e5““XÖyˆÇðuçz¢ì q³$MëZs„Œ„9Gvùÿ÷0s]Šð¥äîE›¦ÿ}ôyp•D6Ù±$F„Þ÷§÷<[åA6Á×KÞ§y0ôÒ C…uéñ]:ICÔ†àDg|ÇaiâSàdhcÊï“Fûrk‡mshÔÉ|¼–ƒà톦yÕDï'…÷Ä(ˆ/cŽ |¼bóik ùòP8‘!Ì*ÓGŽÂyæÿƒÓAzu}k3Kk³¿ã½Ìæ‰wÄ$½|—æÍxª(™Þ•ZÄ1È“`}øåÔƒ‡Îö¦b0·¹ø И‚W°Ç î;ø8–‰.¶Ÿzžèî·dé?­Ð£5­yûÌlž-ؾ8™Äj¢ÕÄ@¦/u€tSÊxäeƲ,‡Ó•‘¦&É$™Ÿ·g=Ë£î+äMzJEÐ;î³Ýê•èÌIUˆHš€£¶#) ²nòÎÌI±Ö›–Ð-aŽ nj»¸¹ÀzŽ·°’¡d^Mßàè?®ÚB7þŒ6=ž¬AM´4ë]aa{UÃûWE9 AmjãZ–8E|Vr|¹ <Ð)1“+â|M JXܧ÷:Wþ–5ÌÙY1]çÎVDh¼l~kL:îA@I&›â÷k» ðß%4¯Ö‘+ƒg~ ÎRÑûÈç£Eõ«jD|…qjbó'¡ŠÆ‘x.·¨$uñ£Âdßd„w"óÎu~f ’ótcßç~ó×s(ËTïÚ¼¢3üÂíòÒËÿ§}ˆ‚ºþæMxQJ<@¡ÁujÒ2ÅV »ƒ8èÐnØäKÇ°Ž¸([>ê¬X+;ý°N “”Î?)ÿ.»iM·äþÛ§ø!¶Ø ÙÐ$Öû¸_ܰu4ç§K:í.R©‰WÄü»âöJ£81“Ž“’Þ}óé¨Rioþ»¶ºÓ¯Kʵù «F®X7ÓišÒ}lïûk(êýˆ™Á2Þ3èJÙC-úÿ²GǦ÷ä3¡*Œ:×®áT¶µï"äd·±§=ºríÀªi§Ø¿ûdùf¿ÄëhÆËÔóäÿŽÐßBsÂA·öƒ gqñ¹oÒÈ’Ÿ’9Tú¨pl‚$í4Œ¹Áä]¦²:©¼+·x>‡ó -U;×H¼µîƒ ©Óp»’ÒùêZ|it[j‚NÿéL--n,5ù¥c[SøLè[x•e6Š©órôOÚĺÄð«CÚCï›Ô¨1>pYNµÃ@Ÿš³PWµ°Õ”ýaB¿Ä<Ô–e§"Ë5 ##ÝÙŸ¾îBd˜˜¿&-u4ÅHdHüÕÑZ¾É¶Ã>#bÕ¨àЍ…ðð×Rqj!fYµ/Thº 5« ¾/£°3¬¤¼åÕûOñ©»kÚbl©×C>ò»ša…dOiÈI\á“‘3ŒQ {¾{Ûy{`…(u0^°Ï T“bñTÀyßãÀ]ÎùÈ>þ#Çá&vI ¤ø©R8¬eN®wÿb’G€§Œ~¸Rœï;»{ì â¯Å÷'BÛq¦)7‰L¤‘xX³;ê|üˆîÞê·Ï Û™†è&¶ÙY â¬ÖN܇3ꌾ&µÿ”€‘_ñüɱ‹ßËZK½à.¥.ÒùýýQiè;žÑ°I‘J9î˻ɖïl8ægÞ¦¥ÐÐ#üÖ™~êQ³ýu‹S–°Í홆ôÝM­bÇ—Ze ÔðñJÖb´¦vÀÖ©•{ý¿9P‚B–È·ÑP‹2 >ÕyǬò_É‘÷(#1ŽE6ØÄ}ìÄÕ€bÈÈýŽ:IíXÐONê‡ç¸Ðo§ÃöÏ!äBÏð‰y.µª~z © 1מàxé4jÂT„æ,»VT´b‹›ÛÙ«Z®ct5½˼ƒ"ÌÖ.D¤ Ìt]{$Wî$ɢǽ£WuèéǽÌ#ŠlLÉ‹Èl4á=° ®R®œJ!)þ[)8\9xN§tÊÒì¤XÝñSðÆ\úãûT.i4& 3{qíÏÃrßý]Hìeª0ïP_$o![ŽíË]„/£VŒ¢Ò–¯…RÛ|QÑðû×ÅÈ^œ©ce­¸âFÁËÛönïP33ÃJè9˜ûˆ?Ê/3E/§-#iÍÊ_âöõÅì8w[Ä¨ŠŽËðøfX/¡˜4 н_ùÐ&xh-“Â…£ZÛÔZKC£¾;¼J¦‡±ìYH‚:mƒ‡ÊB ŧ@&*×xXO°²x0;H¿—f¿õïŽ4Ê2çJDüU’F&h+&ýÈüvÙñä;Zh/Mÿ±G°Ð×Èçkå ™U[Û>p[S! \×"ä2(TŽ€ ` ÕÒê£ JÚû*"U½’M넟ö@¬—¶ª™„?ZŽ®Í¤ke&-ÄÂÊÃxQÚ@ÿ9«8k5%‡-W{ºá¢DÛŠ²JÝ5\Ä÷ W%b!“1x÷ä§ü8¹PwûD뜮LtéGû”z„š P;šÛÅÛI=Šî¡ÂEr ƒàJoþz$w×ñÊ´þ÷m}„,8kRPšCÚwsW¾§@„ĪçEîJó„üìñ©ÇT0¹I‰G®¸É –ý¤ÿeýþ-ʶ=¾–3MzÎs”+ÎFÂ]ÈJœ+Äï×£D¶‚ÞR~@º0c¦[š9w2˜;ÊU&ôô~)6T!IœZ›ôâÞ¸®un_^VÑY¤nÆ›n¥•òz”qvwȸÞNiP4(†ó1쮨*ðA7¯9ZµÃX‚½íñý ¾f%Ø( õŒOk“\†¥Gù(Ü·üÙäšù®2ü¤Q£7‘· l—`JâvúuÃêMÌÑtŒ_±7\\¤Ã˜mâBŒª»–æbõÔ¶·ÉFqð²{âc૵ҕðÈWÀÃîÕJÙâ+==œFÝ$jÐ%@R‹g6«õb§?ó Ì Í]ðeaéínÃyà|,ù­¡Fĺ­ ¡OEÍ@lpý*Ôëë8o 4R¬£uê§V·½ØÛ¥žVÇGË$Jš›ûÜ6%‰`+¤v¨©ø![h*Ê66 É›(YÀ]?ºü€ÀE³ £7Ê„?ä£Õh0mÃéËò×0µ°bÚ5 6ª-B”-XLÒìJÍ<Û¾ð§ÿc©ðu2ÜÚaîP,fŽ–Yö·þ^ àýmßxô,¬`u‹>@Gf`eµÖ]|åúGY8²¡Á=ËÜi£"ˆJuÚ­A·6ÂIhŸì`¤ ‚¡ä»Ú°ƒ‰ß^è¯ï6¹¶ÔïD ̷õʀ?- NÄ|þbSOWÃmßsÿ ZÄozQ™ÚçÀ³BG\Ûbl\ÏÛÄC}^±÷ôÚ[tE7häNk,b³˜ 77omª}E8]ë}g–mžuÕuœƒ±'Ïp#ý¿^È¢@Ùl š-Æfïoí©s¡6p9½ )Ð*†ÓITø€üÔšóë‘`ÒÍô{ÈofäŽnå.e !/xãØA%òs5¦äøEH3r*^Bl)LMÀ,™GCb¬kœÙ.œmî:ßÇñ¨'?*&[æ:*/ÈtdÍÃ]1¿'Q+кød£cQ_ïƒÆÎ#àPéÄY‰Ðü¬ÔC$ ®‚5dò 0Ù¨QI¦, Bø‡TáÔ˜pfö«!ÆRòD†›Êí§¥![!rë&c»èZð*ÜPÇ`CáÇ$‚;|<öÔ5ƒ3Á²¹A{¸¨/œ~›ÂÉt{õÒ5,Zÿ5”¯è<`Qµ·@´Kk8NéI%IWùÇr®vÒ ¬o0n(v~¥K¾öxb©‡ÑS®h-™0çŽó¿øÁb*оW4„»'ÜÖCüz„ ðaã‰oòõãÛ=g¢F³Ù×dñJ"VÀE?é–b[' sðÖ ýQU= ©Éâj1ó£Ï[X´ÂPòßzø>Æj&ø økžårT[èôÆÙ7‡¡énfÙJÒ&l*zž}¸,q#Ñ="ì.(-…Á”ž¦çn¿ó5:ª'Ô‡ÌÀtõüŒ½ã#‘ÐRŒ·i ’É€|w¤‚—rjÂ*JRõÜÛª¬ÆaÙu\"…ð^c!yçÍ5„/:tG'OÅŒzt,“ÆJ{ê*…Ûz±º" Ùe>k¦¿ …ž¯¸wÛŽ¨ï÷sq 83Ü5£‰Í‹À»ç¬Hñ¾N9—š^Ì“^ˆþ5q2ÄsJðKñ3®±:zàOmhOJ#*H„ó×¶!­c?›•ÉM2X©¤O Ë‚›õcizKz²-xùßÈûµãåZW—á娴gö Z^S°øíYij1ù¢Ð u*ûœ—Ÿ”gvA8á¸÷)Ù§«gÐÃÎzKènJgéôSñ¥&Iœ‚ý·®4ëç®-Á­ᠸ6D…hÚX䜧˜醇‹^!!Kt±ÞcƒPVÑéB•ü4!ÆÜQ ¬¶Ï=¼¦Ï"ÂhôñÁóíýâÌÉÌ)ÉÜ;¸aÛfë»ÍÃ/ñK¶&*è©Jb&7ë ß=Šž²æ‡Q™~–ùí€T@?i}cÉÈ&&_º&P«-ÚÔsÊŸ¼p_A’e”­žð…ïƒì[ÆU„Ö¤ÓÉ jÊ€yüøX;>¶Q^p·Ó4TX7-tZµsLô0o—³²7Æ’^ µ½–Æ-”ôI’¿0Çy=¢…z¬d(Ãj÷"å¬jUnž' ucÓæŸ¼Ì‹æŠM¯,k ÿ‹zÓnH DܧKúŸS4Oò;õ°½‘8õ@×»AÓߎ|Ÿì[,¥!b§æÈIsfØ«¾~1¾ï³´C‰2ÆpÿdcL/Eµû¼ùÇo2'a𨯇~¯¨e.%/èFN>ìãxx fnsŒN±€><ô-“ßE w ›KGºÕ»_ ã¦ôbõi°»âô›³œó™Mh´Ãã{]ˆst4ŵÚÊV ³Ñ°Áý† v :ƒÕYAÎÀù—¸Ö–”]®Ö\8|ŽkeÀ™a9Á§d9é̦TútVúã)§±gK¥…0‡bÖžÞ¡I/--èG2Öñìß)ôB`®€¤ë ÞaÅ7@ u*-ÚidÌ©îøtÂ\aDòãÇso8@:"Û»wÆžˆˆJR­¥uz°àÒšIª‚8†Êîä=©‹´ƒþÂZü&FÔ9a,кzU3«5è‡Î¡Þ—é`¬’S5ó[‘‚EMmo Q11‘ÉY0_-±¦½w¬ç ³1ý«¼K`›ÀQ£ ›Â #WÔ.:S®zÙôYÅ@‚U#l—¬7ô±æ^Æê©ÿÂ(ÑŸ8`‰·;×Q–o‹ÅýˆR†õ<³å'”7i#,wzbÄßë×mslIÀµj)ä,˜±àûn&ämÌãÝúÛ©þF®jþË. ìm÷ ,ˆ<^I¶£zÖÊ7£½~ÌÏcÅê°¬íƒ/åè.Úäº(꾫”º²cú&€¥¡çþ¤2 ?Z.s½ ÿ¿˜M‹Ê-yÄo.?„Ãݲ®u<ÍNRÖxI.ðc=sÀqδïR^Ó‚Fd‚#’¸3*€H‹ßÌ[+¼uaâQMG;&ý|U,_µ¬ÿîƒõ ±!°äS½{êÎZ¶¼Cò·Ï­±«cÿrŠ¶Ò *þýkàÓC˜ÊvøÃŒ¨FŽag‹NäF«žõ±Ä‘ªhy0QK›ƒa Gâ‘æˆá hŠÐ Ss,hå5ÉžAgn^«/³ æW™HC»}P}eŠâ‰5hØ?Äå‚n¾êPÑgð~¥VZ»qî‹_åýgÌ3iõ¥–~Az5"Т±òlSi©Iõƒ½›_ì[šBöŽh]û×Úú\°ÄldzØyÇ$LmÝ?’u,ZC. R¸ž\OC;›r`NÉÏç¦+] ù%ìÞûö›Äù Dò{÷¬gh*‹šc'‚X©)-8H‰¨o¶xob÷Biº*Ïéí¸€¦W~´<dº™ò­RZÆÍ9oýÞ WÏì×Ð 8°·]j ÆXÖNÁ¿þÐu19 anm«#ßm1”(ïÄE/ ‹ ` `–4ðgQ²I^ßn ªÿu·ìõ[¿‰âÉv§t1ºi]«€C%Ì$3•$ãpµ¶0`ûEò2‰ä"±”çu!§ÉÁa§L<Œí¥²IKtÔ_p-ñ˜ôí+ÚËûÍ­ö®9ˆTüÊF ÇM í¿ËÅSˆ¨„Ö­šqôÎ_Z§t¸P5~s4x9DXS”Ôèpµz6Ö?+Sí,.•9Œ é+Øø\ãrÝ¥ñ=À1…Ùy`ýq¦áϘÁÛ#DšS+ªEòÛY^…0R—vûZ¼6`Ç8qâýá[Êô4䩺_8¡ºId¾õwuH¸ßæ)vŽû=)ô=W÷IO¬ú ´õh£³È»s°RÛ“@“Ò”ëV¤ØûÎ ¯r?Øög\OdÎþŠ„Œ'°ÅN0;çвÜ~ÝWßVèÄ?ᯫ¼³™—-x¾qÑnŒ×¡ƒBŸ¥(Ë̱ßTZ"%×‡à’”¸FI¬È¶]UzA³Žú³wxƒ2ô·Y·?¯Þ¹˜OÊ îÈytÉPœK Ò!ø‰ÍU‘ñÌ#kï9”Ä+e}Œ¬f1‡·ŒRîò…!lúc×÷.¤Y/;Ä+ÌO¡z|ÄqãeûÓ¡‹ü·×øÚ.» À5'A×öV­yÀTr'ÞŸùaG÷ò¡iÔƒèpX2²£A+›Ù¦ÿƒ˜AATâ~ò\`B™+=[BÚaí„NÙ»Ž[&<Â}•]ë{EÐà‰$­™!å€ìàsã+á¹¹ëô»›®<˜šê=£Î툅RežÈTw§þðÖL™Óš÷Ÿ—퉨ÑcíרWgjâü²( £/¤;7¦Â|î è¨~:fé«T¸ä~įœ ê®=šÊë“¢$§!òrq\òNjT !ÉÓ~§ß…AH ŠR#s¹0ÌÕŒ Ûú"<öápvTgÕdóhG‚ŸtX‡5¸3ÃÅãä“C^ìw½9‚³DáFZtÛ4²‘Îý‡ñ “½nð¼{ƒSG6/etÔŸç=¬Œeï¶V<Õ¼sqô £–ÆÞ»ã߆™fÂ…lÞ%‚ê’õÿ#` {¯ ÙúY?çÆõÍsaDà$Æ“.áæ°¹"WŽ^Üø4q°­ÀW™ŽoŒÎ£Ur …=A¦«¬ãIŠÄ—µäŒX£ï!ÈÔ©îY¡/k¸"900Õ9@Pü%O|6ip@¢Æç à9DÊçÛ)”µwßæS³Æ]íǽ¸âƒ9ó65i°krËn\fV´•×è;¦mšÏ é*rìðœÜ¦‚)Ó2Ÿ*× G.‹µÞZA2&®¾ÒW sÅ+G6N$PrÏ,K §²Áe3ÝÇ!û|ÔAO“ØÝ¼rŠ~³ŽÉ‘³Ð÷€vë\‘çxÒ8ù½wiIUnüú ð×éÖ¶Zjü´cuòÒÏ— ëg¢³Lz³ áS‘Jù…aW;/L_1›7-D}ª“\jª¶•9s·|ª1‡s–NûÄœ6§p u›l[E~M½¸Ï´´Ë¸vã-ƒJeÓ Íʰö¨oÒa›ŸKNOÂ/ “ü·¶Ÿ‡cÀkä˜ÌZq¢‡"bÄæŒ —¡âº«"ƒSy•Ý;^aq ²Wœ3÷:>/ÜoC[鶇½HnþÖÞ[TÙË_ôÅZ(4ºŒ¶òm™Ön±6LËù)BwQäÜû 4Å@Z5[\8§ðÅ߉÷Ù= ъ׾f£ïmO;i8\.ÌПZ¯±_¦@ëæåsqn•­zâøî$ÆU³æÅÖC=Fiìz(È4ööÄ¥`DË6qÕúöÍæ–SH–÷©vÃ-“%J«Ÿ¯$¶ ©$ܧZ/ÛçÙtHuüË þ£‚{gUܹ%L`mê%€@ÇÙIíîÌ:ÆbˆÏ¼ýSŒÝŠzyš!kô?„âžiÜï5ýP™¶€ÜéZ•å÷QŠ”¿‘Þ…ÐíÛIèw/ðæ~á”;ùT€(™ï<¢S®R* ùÐ0ÂÓ°ÉÕÊbp¶™*·aV “âB?#8‡÷"ƒu ëÙ¼ÌéÐÝY‰˜‹fY‹–‡vÀÝL¥ûÅÞ$)ì >z÷î“¢æp&všO K1;I:¡Ž®¼†ž.´4Û÷,ËôE­”o5¨ƒ¿ßQ“¤K³CV埛¸Ž„GC X™7ÇpÖGœ{B_ýÇîµýsÄ]‘ Íe><æ<_qÚ?BcMrÞõT•{i«}Æ鄪Þ6Qwľi~ÛZƒ\q±ØÇiŒÀòœ`.×GÊY0(ºúR!Åo ySïŸÞHÙR´²ó9Y.n¨å›jæì¥œwåÈ´|c+Ʊ¡´’&1*¿ò»žÉÇ!í]ÕÁ¤”vÆœ®Pݾ ^¹(øÔÙRè¥p©ÇãEü†ÙL¨³“2²/,CÃÖÌÖÁ¬öÙp`a–[6E®2B[ï,µ®gNæ²±½_&¡ç'ü¿¼ƒ„ ){Í)â•É¾ë© IU'KóI«pÊÀ…ÀvÁžÐtARP)¦%ôWe8C ]Î#éD9jIùÙp§¶¬÷š ˜M”›µRNðú)Þ©ÄoVë½éf éòãå€Íøé¹êÏ<0æ–½Óäbü\Ÿyž5ÂÿäZiBÏßpŒ°¤eÐEçYnûA9ËlçÔ\kƒ!$Ø•HŒ#Ö4ÃãáîP\¨¤´:ާlÌ®¸—Ñ`ñ&ײ ’IßÖb ƒï©" rö@K¦6Û¦ˆ‡Öi’ Xn%Y³kÏ+ÒýªöuÛ]zÆõ›€Ü'%{Àzi¿¸i–S±’¼þ«ÂÓH툈'Ü/çà1éMN`ç.‘Ø-¾súm–¦V×úÇl²B¤4ɾÌ)«.©ùüÆð ÝÛÀãÖê™/ø«s^eÚùÙ‰_\LÊ?X¯fÖ 8„gßÌzM0Èðü^)¼AKðkQ!’„íE\šSW*ÙÙѦâùS¼õYÁ)‚‡VmKÐv묶4Z *Þï–åS(d*“ž\ºbÍ"!Öî(ÑPƒä­ùI+ÇÅëî¶í*^(ðýŠ;T5õ`áÛï¯DóÚ÷sa!ÞÝ^œJëç7UbZÑiËBþа€à ÔJžeŒÖ7ÑafØqiKV¯Y(·ÒlÃ`#8ÇOñ;kà-ü»ÛoÙmÃÛ½‚ŸÚreè¬ð® Ç ŽRú£Qg¤ÇÀÇá‘òV 4ÿZr‘Úq6’šµ6ôÖ(PÅ×"á<õº(n$ì½P„7ÚÚ símoBñ-h–±ÈÙ9k$pR*йÀfáR|½“…_Æœòk¨â¦¯ÓdÌÌVäñz;[Íÿ ×`ûBMÞga××"Û‚þ4Û¢NJ®Ÿ¯À$–iÛjD™¤;´ž ÇøÑÇ=“‡kÆWX¦‰ho?&;ÀÈ6we¢‡³ðiIÐ%ZƒÂså‹ÇSº©MÚ„óÀ´â™0°Yk„mqâ-|2Ýj%¯îvèË=PM-%Q.òÏ¡};äꎧåºÅŸ§;H ¦}NÃ+ ‡êÌ ¤NŒ:¿LÁƒ$_s<mº yÈDEM”=Ê»¥nò†Ãbí-l4õÈimÇ`™ÅT}ÀÏ¥€oøÈfž²Þ„·ΕE /ÕÚ5–>Ÿ!”Á´†Bòó• E!Á Ý ü ‘UKiúùïz€úN«£»Tl5wèzÞ“Ôãû´‹ëç¨æhÀµLjçqw>†‡\¤üÆG]7x0¸#JŠUÔDÒ;_!(9Q¶ÆôwuËÕž~½r4ØäYmÚŸ67ç6./ƒä zßëŒß§lêÀj*ÛrçË’ªÇ&¼¨õ7Ú~w?ÇüºÀ5'3}ÈÖ$€Õaê«Wp¾×c³DÆ QòVh·ˆbQUòœ¦Ö«ãOtÞv¶­² ¬æá¾1[`ªÉ3"kÌå2$¼P@»wÒˆÕkÑTókM©G)Œârîhë Ø!ø¹•‚c[Ã!ÂÅÜ/:ò‰fKÍ.ŸßçB;¦'‰ŠNT⿦¼ô"ɤ¤kËBx†pH¥Ä‰¶²(“îBœßHª‹c›Oõh}Ô5àîéW70ÛçømDúeaòÓ+­¦]¿ ë©ÞóÆ?¡×‡i ÊZ^ü%蟔)d¯r‡…ª:¿Z ¨ß/pó[ÜîÚëQMDPÚ x7ÿ7huc‡ÅÕßå¢63‰ª´âÙ¿O'ájþJÃX5ëF›HWQ—. ”p'¼ªCAJÆÔBÉïr³¨êIV ZÃðÏŒjc¿8§cò aYÑUó&{V1äËp8KZ»e…( ®~ïÆ\}(½Ê-2O^žMÍàì;º›võx˶XQ&õ0+r­Uw<|¯ci —NqG_×Çi ¤Hd ¤À¢ä cá9*‰Ù£jü, `²†É~‰O©aTô¶ÜO"phfg˜—(&ô‡b¹[‡`F)³âÌšMLç?PïÐ$‘zðzÉî‰H™¼.=Eòµ[ Z²©oèl™Ñs59Áð:­Ó‡Úu@úðpùGìdçIC}ÿÌÈÖxM‹Ív”䵤ÖåòÖïÛ&D¹ž~T,»nP”I{Á•6^€¥”é J‹OÈ{VWðÿ"w|mΣ{8îSä)ðLïhYÎðÍXv7ª¾—8i–ˆ¡á²»¼žñʰ#òöú°îi?8T–C§aJ½3‚º«Î ¤ä·“X_ôÏg íŽö2õŒŸÉ©Žä¢t?z5ÇL…K<7`c"ûÿñJró¶ØÁ ä딡/R Ç$Ë€\ž(1ÓM&ÅüN¤Gfk‚èNÆEM?#3•G¾¼«2ï>5—ƒ³RT­Ð  áKwÊDJ}qSï¥e)p¥Éö$añãB-x2c×ix¹!ªñH˨±HÑçÓJõº¥Ý.cLˆ%ŒƒÐØ{„ŒbÝw8 IW ¦[­*ÍrÍé7U`¨¢^ÜR)!T¬ú[Âã‡¥ß %Ý“Ònâ µUâE Ú|ˆº´ {#SLâüÑë;ý—ä4›ç}˜u¦á-–$”¼«Xª¥mø*¨'­¶L\ÿèi^4×/ˆ¢¿n‹ƒ±6´ÿð%k¡ŽAf7[Ðá‹·'n‘žœÀr3´ŸüqÜfòú‘í0Ÿ­õÍ•néî5¸®’yùÇÅ.pã‡!Fb¢üõw.¨Ýƒ"l%Ã&CC«—Ù¨ˆÌ€´/ÌÃVÀªó'}Þð3æµaùñ €xASö÷/€ñ×™‚«h ûYjð \}cˆø[“<Ý댒Ùs„õŸ7¼ìŒ†žÖ>ÀO¢«àF£®—U~€T±É;L,ãKûãÂ.+›2£üäBQ›OCÊÂL#¯£!ÊîÒ¢<¶lÓÉËM˜È‘¹§òŠÜRGöy&Ã>°5J}[1]Ÿ¯ÛO Gl ¦ó#‘°zèZ£í¢¯¾9ˆ`%WªŠ¶IÈ“Q‘rÚjÌÀ¦ðð4qa§‚uu ¹—›æ€´³ÕÖ6àà]J°¿õ§ˆ±¾ŠBF©ŽØ* §#ÏÝøvÐÍ/º ÂÖ!jû-¨Ÿ+˜b¡$E6ç‘FUcUSíéÌÒ}èΨaMQ…Ð-êØÿ7—AGjXƒÄ†„:ÛÈCŒüu—ûq—ƒñ¼ÆqÅÝÆl 7ä×G¾Áp”!ðÉÚê‹!Ç¡Ýè¼íúeü®ñºpºû,•ÄdOtŽ÷ªSI‹ì19*‡¥—!›v…þ$`¥ß¯¸èLtdÝZï jƒÖiÉCÇ8÷÷…C~Ôù.®¯>¤ê¼œ,eœ8®œd5ÇÓàíQÀ ?É::öÇοO©çØAÃÚn)rÑ”sØ8ƒ-(Wþ/ò‹G¾HBùg»q¢¥©eèxr`\¶ Ñ)À«‘ÛIÞâ—ÑÙЭ÷l~œKÃPµª-® é¼I”¬¢lâѱ٧—«éÅŽsÁKœ=kó =CZ?÷JZéÒžÀ©ƒwºt;úô›hC7WñÉ<µ{JvWˆºýù-YWS¤ƒ´…L[¾6‹‡?øùp6›vÜÁJã©ÞŽWœöeþ@tâò| ¡´n¸Ÿñäíº“žBù=¹uí›ðNˆî¹ÉT¦¶0-,¯ãp›3|'ñ“R\ c]º})iVCª5W*»]z$Ú±oÙДTÅ6¬0)žÒ«—’N4»[”_ÒXó&¦½?p²€ç[8×IOö>ýO|=©‹%¸ÙÓU¾,e{“ìÁ\Ì‚„œ\ê–ô$q¬[CE¸Kàï¶óN‰¼’'Éf :%?ÀnëÑã­mì0=»]äi·“:ûð¿jT»qk•#\’…CnXhçVx'ºpwFã[¶"¹>:¿¸aétDVÆì^°Î ‹{žÅ’ð—i)­lapžö¨‰™þ±TlÒÉ¾Ì JÐE¡W,F‰C®]ØÔŒZß°’—¯XÒ%Y¿¦ìJÝÔ[àê,³U¥ ó í4™½€p²ƒÎpnüZ²)UTúìÿ85eܲ¥–¶`ñÅ"Ïm7çLRL÷ÈIü#Új]µ’ÙÈAÇ…”ï|Œhü»r-bQÃØ°Õ3Lõ‹%IÍu51}Z3Ñ–÷Äšl+ØW±ö‡†M¦W, ™˜ +´îRj.®$fÆ@ËI '°½´E¥Ùµéïö“Ò>ìG½%{`¨Cªj05Óº`I£¹¨(Z,DÜ6Â6'/ísKDí>Yçi ùí¯ÐÓàR0^[‰FEÞ¯r)¥NHkY†Ð©nöÖœ;wä‹.1ìò5Y5¬¶£nkkLšÛ`XA³ò¬p^ÏïÆ+Ñ"Œr\¦Á7Iö:ð–©ÓòºËÐf ŠðNŒà1YZQi×·ýÈ øÄ¯UœƆ,†%úŒ©ƒñ*û0 ’F2¡WEÙ&¡Í³¶f£‚ )ÕÃZ¨¥ƒƒ ™mÜt©{—½ŒÎ;Rc§Œy¸¡•Œ®áYŽ Jå …‡*® 0¹euPDÝXÍš…8Ìä¤ÏªLÊÕCÛçðig¬WÒ^M-„²p”žOU• ˆt©ÎëaÔnJ.ÈuÉõÝÆôYjH_«ÝµaÑDAÇ]w¤´ÏKäÄxÙbåo¥à³‡6®Ðʲ`ƒË®¹8ò†ê‘Ní8ÒèeöÕzœYcF6²h{@±r™&z c‰°¨Î0åî6ŒõA†ž:éÌ{` ;f¶Ëq¤¥$ý˜³Ù¥~¹-¡jË{qü„-h ¼4‡ÈŒfï1×-½6hÂ…±lÜm…5ÈŸÞÝÿxÿ»0‚TrËpœxk ï?¿xû(wcnEÒ$³…ª_éîÇYO9ÊÁ2âÚ‰æÓ°1ÈìûZÖT(m\,-Žóƒ $:µ·´’jU–Öà¤g^éËBšr¨Æ~ÀšÑŸ+“R®v èÚÁIŒº¦BѶÇP¨m7,ÀèKʆ'‘O½‹OŒg[²´û†×·È®F¸ Y~ Fû±í)•ï½À³T<رÙFýç,hh¤VÖøiˆª$ÑÓª¨†¨JÖ’ ‘.¯4¹/<4 WÁ’žš¹k!þB–‰ì0¡ÿç¦Û®&íGmH­Ê³ãâÛÈ{¶dcx¨ à–é‡õ{’Éô¨Í>;a€§çé¥z6Ô^êȹ¶ëâ†üŠ}Ó9¡ò«jüB·Ò4x Qn%Th’¸Ô§õ=£¼„¤° {è°”Ï⮚þxQð*-UIÝÜö#»åÒ!`Kà¥[5?a5h–cÌ@@½¥¶`0 m¶ð½rö'þ±^hñ°KÜ@µLL&ĉû“G„y³ŠY‘Šåbî2Ù1* µ®¯kô²°¯áµ£ZnŸ¢D‰]³Úx˜ñ>•1þœ»´°æeíÄÆµgüê(¥ï ¢H™S/PÉÍoç,Gú 2òSöt˜÷×nd]Á¯Ñ"®k‚xáF‹?†s%±¶ûdѹKì–~döì:c¯sO9ÖM~²ÄÉþ1dsnk³Õ²ÒF_KyL …Çbˆ-‡¤ÑHýÕ7!¸Q&þX#W»I‘ýó3&ß;$€àŽS!]ëQ6Î «Æ@ª*gi¬7‰Œ‡V®!{YÆèû ÜlÜù ¸å„þ¬‘ë§K>á¾ì ?¤O£@»Æiöbìð±k¼ôŸ8þ“>ê½Ù'pôÞýüØDYmÀ•ù'Y]p¸£éu”³:3hŸH|ûzls¾Äb5hÝÏ£˜Eaë(UQ¯Þ58ë‚V½;¥lÓ¤©È=AKÚ[y&(þZ ‰M3ëyv¯êjº›ËLòî©ê3vO•Î#]ìI(å`õ)µ "aéZÄô(ÅñÈczj‡âM*l»"ªȪ°F¯3‰¾?û]lÙ˜C[Z÷Ú™¿;{ O Oâcé×(t®! ŠJç²Þêî6Ï5‰›uÝbsÜPŒw–‚<¬‚×o3YøÏiÜ$ÿvE98¦¬‹¼*Ýò'ɺú*ú«C™z“3ö¤–b†ç˜A/¿¼Ä8éeí!:¥ÊdÜžaÔQÑC°Rß>Íîý&B½Ó~㟊#Õô¸÷ßm5¢úûÒˆåU$rICLtóJB&gêôR¶+Ú`éÀŽšr9]|Jiý*Õ¸ f°H› yb±1þ¾vA‡tÔª=¼G´¾š¡ØôÆ#´LþØf0qM¶_^ãƒûXß" B<ˆ>÷nÝ`Å OÊÆÀ°NMt fzòtÍÍVÏOꧨr×Éw¡D,}-­ñMxë5çs™|SÿtÛ0ñ”>!æäxr4KÕÙµ r¼ßbwøžå÷T™uêr9²V¢ó쎮¨´ÒÝYíEcCë§þîÐÖG „OÃôbZÏÛ­o½:7{ô ¯ðˆq«;\¤è8_û1v© ~ÎÒƒ‘:ÔÅpåp¢ÍŽ ^M°°‰™vê$Ì\ç?–¨ÍÓŽš¹tßîø„(š±é÷,ÑAz¸cÂa_ÿèÕõSv@öA[Yä ·= Ýu¹¸x¬­È«á"e:ôÜdÅѵͅE)Õ \´69•äLÔÜY"FD»V5á[)Ó‘“-ytŒ© ~ì*ãäq£&LóÐé&ž¥~Z8z®…­ \ºýƒ„C†•=y°¬ó‡˜ ¨‘ d÷dÈŸ¼E²q*ÅÞøcóÈkÐN?Õ†8¼ïƒ-Œ0ÉßÈ0sÂ8›m()¥.’y¾˜f¨Ö#xг|àœé,¿Ð¤`’¿Ë«þÒ×Hª©ú MD޶Îc«FkØÿPÎwv$1+ä3n~ÁTóôüÖ¾áAº°]·q! ¡`æ³*€¼•¸hkS%¸áªAø§â&n¬Ùµ‘$ªÝ{–;—ß)à—Ü+ÜG@e`ò¸ÚÍN9 ±O¹a&ë—‘äfK$Îäê ëÅÿª_8·o5NI—ªB €51EF ÉJ*\ ÇrTò:ÇÚÏ‹HÁJ…'­Ø6i-<ðˆ’ÇžcÌ ì¢›˜ÃW7LÿÊ vû3—m| ŽìK$,`³ÖÀfDÜ0(ÀIš<¿A›JÕ ¦h©ÖwÚ GÐBD]ÃIšxíÚÔ=Ôa,¤Ôqå¤N ¾ @®âµÆuÛu<¹"&86ûVyO 8;LRŠ€èœ±‰¼Igþk„5êÏx²$å¾çPnlP±#Á‚QWQƒ‹p…þó=1“á¥v2Yü¶:ä%Ií¡í s640 .ER¶UãŽæD—DDÚšB?é¶D 't||žX\;È»‘ˬ3P%KfBv+7ÇÄèÊ”93Zf ^»Ê\{+F:&°‡;}ÊyO¢š*}FJ‰¼ˆ‹–›qÚ«’¬I·iö®¾ç¸€èòG0zåYƕܯ_»\£j{©+Ÿ0þÖkÙ)‘2ëè$zS×ÀqÓå1c@ƒáäJwíG¯{•4âÒPƒ7¤â7>k„ê4™X ½1Ï™ÞGÌ4>ç¬]yV†ÿm9Fö§¢´á8Žj6a;Р錯VCO°øÖAÜXôu£‚²Oᄹ°bØÚXuÒ’„y™œÀÊû ëÕ¯ÄËôÑÒóxy¡wÑëQk ‡Nª¥¥?´ ã7Sâé“a‡äÞQHhrG ¿TÆt[C†Õh[§¦%û[¢Î›)u‹m¥#¸•Ö|Ó˜ßMîi)d8ç ¾8t&ÇÖVÒv.ZË©„m.úŽI@t¡Gs¼Ê¯ü² ‚×÷(©Íî¹ÄÇ1çtO”Wõµuë‹ ÒYÀ [6\ª5I Q[´¢áíµÚ²ÖA§_6B7VÊô£¶ÔµR^¡L|f›ÛbU?šµÑà7ÖÚÙš=pmä›#N ¬cÛöí׊}âÜhþÓÞ¹²u†àF·ë);ÀKfŒ\d¼¾þœýýHiÖ$»ˆEª¸ªÚÙ±‚^ƒÆ¿'–Õ›}  §Õ@|:\Þâ«tTáWöA›{iûÑUkþpRµJ+‚êðÈ¡¡a´šäËq«>ü÷¾5™YMÚkÇ 6E9úoú-stÜ$½†ºù¾®[¥¤®Mî2üfHRos&,ç)7ØÛ 4ª‘²0t_Jg‘N€°HdŽÍŠŽ@¹ êër¯ CB/f㥑–*t›•Gà•wB1…îTNsÑT”ѱŕóbët%§s#ØIÛΉã•õÎÿ?$‰d `å)«€[“aH¤îËgëó›“x¼ø¢-é`„×¢ÐD{~UÁ ŽmªeM–Îö½ÐEä Ø…4=mïSWñ¯……ÏÍm#Ùý X‚Tša ya€¬„.:6ÚŒµåù^CØ•@qß º¬£–#,YàØÈ†›ØrA±$TVÉö÷Dg(¡¬!Ô¨8ß…–à ˜­ÈˆzTÏÈa~¯/ëf¼1Ð*“­¤ÌX(ÌÖêU<1WøÇ$Ìoc—2·Œö¶?Ñî‚;œuð2àY<ÊwuÿçÁae6ô[š^)…9ãC6ü§²±Óö(]ìõU*y¸‚N+{ Ÿó›=AðS>©×ê× en bPaè(#_-cc*Ý€Œ&‘Û¡ÇQ³xùÓ(èAÓ”( äÙ!ò,ôUk› ]jô>,bæº4õ°@&‰a¾Ví‰ؼçx›ä <Ÿ!FûÙŒmj‡ÎaöP|´oôPGm¨®dSˆNîGÍ…f³êUË­r% ¡ž–k¿Â=Ÿ§=Ô5~=Sù'c#©9Ég²°Ì³ÄZè=Èà(¼ÂýC)*¿qZªPpÓJ”X·Åú17ïäœÅ¾Í*a]dÆý¾ÆÜaõÖã©fðþ™ìbUa#ƒô|üʺ:eÒû0’ÂÑÑoéŽtY4 †ÚVìƒöoY£~­Õ#%µAá¹]‘¥‘à8Ò ¸/j­öÌÊ#fžeP´<‘`sõ<þéÜ]Ȇ&$·=[Ã15ËrVj~døÞÃí¶ñ.#òZ¯l; x×¥3¼ñýžOí ¸î•<7¨#ŒæÿCÙ·àð¤¤d¥òþ½CûoÖüÊA•Öù³Vö·]˸êj ÿPåvߦÛÍ×dtɲ;ê¥Ðþqc­ma-T&¦]ó^¿¶ÛQ¯Ó§¯'Ê<ªÜF¾Fu~¡YØ@eSx¦(‘>‹ž Kv×/v>Œó„õÏeØ©ï­tïÊüÂ`R4$WEýËü¦ Õ‹É<9—2YúÖŽ˜V¢ëd’[^ÿ̺ÉÜ5 AÊgtt‡l Na`T¿ò=sþë†y³²ÒûѪѫ°àZ„c ­d¿ÿL¹³Š''uëÒÓHbÈO,Ž>¤a’‘u¹Í†ƒ²ƒÌüž€qF³› Bš€ÂÆOßpQn~w:áõOHÆ}i·ê`˜®Øûƒ—zÆ¢ ê!)}²ΑIКî) àŒcú»éÁîÆñ${÷Ä»àÅ.0êsc¤v–£1ŠoØã/#Ús, ÁyÈ-ùçbØ`¾LK¬4ýX e–œ!þcïmbss½•'“ Þâfß6Kš‹óôÆ…ùK?Âáæ{\.êÚ»÷ éݹ±¯¤¡=ŸÀA,+åš»gQM- 0«G}(=áÐg}Æ“<<õ*ˆ–zåìÒ.´Ÿ Y*3—°¶­gÒl.¶ŽôGäLÈ¿<ìú6S¤µÿÇ}kÍ€ê¥Ä€lgîÏib5‚Í~´>I@Tšt&¾ÝÖ mÛW@%)©ºdp‡¥o–Z“QkÏ.'«#~+ŸaÌ‰ÕÆËogÑB¾èšøšVÿMÂie{ð¿Wñý{êÂzóûè[óÿñUf¬)N#õ`BWK·­88îæÌ  ÁÝÏqz’a¤íV¥ºy¯(6ÓÂ*Gq³ð…ƒ,ݰ–T ¦>¹P3Ðö Fâ\˜yß÷bÒÿc—øuù¦)ƒ„T;u[JÜ=ݹ1݈¢È·K™”!cÈÙ<aBÄ1Vö¤èâ­;Ò‘4›«Sš¨ü<ð+¸÷+ÇË•:¿'ÎqÊchCNÕßZMû'²¨Pb¹ 1¿²Ü»%êjP’$Ï#¢Œ\ô¬•HàCBa žŸ7Ò……¶Õ‘cí^?j¿)â ‹•/-*Œu+x¬ˆ(Fb%z^!ƒ€Ó]5flé,7Ê7ÁÚgv€¾cöyîMñUξlÝɳç¶sH‹Ë’*×ñ$-ÙO—‘Bmf¢ºAÅcÉžWeGÍ%â Å«ì"›C6…Ût–j³¸-ÏI¨Ù…ÈŽ 1À'o¹ž_³I¾%œÕé´[GÞ¼‡Œ|[Lˆëàqíÿ.$éÝZ´Ià èE’OÔTög“k2Pç1[‡”OròVfà'Ë–Y™Šµ„ˆ¶%+Õï]Ãa—Ë ¿ˆþS>úШ=t#¹Š%5ªG·é¥C­]Ç¡Àà;qÝÊÅ[–v ÿ/ÔÜŽù»n\D„¦^òRŒÓL«¿ßh°ÝéOï:IOòâ̱È-9i§Êòî_e5*E[h))*ÀªdV‘°¥¦]ð|ˆB&ŠñÍá&XסٗVëõxUÿä"]­>wZü÷ê’¿Í7ƒÂ_e…A®”Ò_^x¿S¶Ó ÁÕ@åE©¥ä˜Iú^®£ ñùZLM˜D9•¶ÿ„×t†e@ÃdrøÞb®JX£š:ËBņ9'ëX(ç_V´¢‡ö:™ˆJamwà_KÐêÕö‘¦'wãºK(@†»ÎêÞƒ93ä ¡4#Ã`ž†Æ‚Êíünç*M—ñ,lý‰©8lñ¦}Àm_”ƒÜD wrv®ÞŽð‰^—¶¹ &`™¢§’70±³©AC/™ùšÄQ§es8‘&à/EdU&ç­8uüu]½éܹ‹çÆNguÂñ3êg=ŒOzb!ïðؑϓ”‹ù_ˆß1Q°àILô!d®^óæ5³'àâ§üŽõ~º1µt>ëè©àßRUNâ-Iä ¹kS[ú±ÒwD¾èÉw/¹˜‘ÐÆ’"þY·’Æ•à‚ßWøh‹ÔõdxX­CDïкbô8à#PFÔð"±Û«gGòûe'`¥à‹ô[,w.©¡^vtqîÂÕû2;ÐyY»¥Û¦»"ðz;Ñr.0ö†'€öêicíBKõPóʶ4ì¤UœG%‘ÃÉÕNÄF.n¹$`J]%æüÌ^hžùÏxê²aeº+Ûé¹Â!OwãQu7œ#s¯˜.AYÿ/æUoÃeÅ`Êáñ£K[¾ Hz škkFØ~äÍþqHïu ýZG|Äã k ÒiÝífjE[Ó(©m‹>¤8P>é|m°#¶õ¶Ö£»fˆ6Ùó_o]4 s!¤ÍZ/ùB½R‡Ó·eq½ÙÀOÿ¾ãêkï'á¶ëVaâúE"ÔI ÒiîåÛ}q…Ê2òQ„ݮƌ©éèÁñ6Ù8Û.èåÿráþ¶lµ®qCë¦A’¼&ÛžEeìv¡†¨¬ïsw­m’yü‘”â„fÎf|8gìWd÷íÜU즊ÁŒÅ1Zp¹ŽqÏ'Q˜ôÛbvë½.7Øk ÆjÅ¥~Æ ÷€]®¥„,-€Ç2ÁîŽ8ÙYòÇw¡‰$®‚:ð亊cÝG¯Õ{6ÝB†"ï$òyÍi´ôá̈ç=ŠýçdþÈAFÎ’SßO‰é¢}æH¯`5CF¨TZˆ3|‰Ú*,¿Ø2“˜ á ˆ5+æcÎ×Å*š/ÌÕçÄý:?ø¿ÜÝ–g¼‰s .öËéx¬›ÔË”²368àbYý¿yQéí¹3>PQɲe§œx0 ïBîBó¾_´­ˆ³¢¶rû+Óá߸ëÇ£Ò´Y£»T­LU´£Âý²˜tc`ë~ò­\™{y¸›ÙD¡éÉCç6_ˆwBMÀ(ߨ‘‚ø›/æ:AX[æà™DˆQ¹½Nn%#ç$»Mp;ÆÌÜ CÏÉL²USv©Qd_ŠØ–-QZÏgÐ6Í…Ôÿ*Ý–¼RüYJ«o[2Œ ãa†­q¢ ÂE`öv¤ÙW=ˆ‚¼[ÆËöÚF‡ µ)l/¹S)rÒ’-–GÎÔ}£# ÁFÏTL¤Š9"#÷_©?…ÆVcRw¸?û0Äœ ‹ódï\tçíÜCæ…Þžn–§§Cè©0_„u—¥°ÅCx•Ùs©ÀŒ+çR» 'îž”^ë"®4D¦ð0´êGdLSl§fN¾ðh ¦÷w^s À–Ú»+վʣ]k€Õò(í¬ñ6pÅDúŠJ{ƒ !žÓà©î¾/²>³ raþj@-Ÿ/·›í#qï~/dðQ4or†kÉÉåÊP„›A}b&‚¯©zÂç¹N2÷åþãS#ïÍ! )þöýjïSAeÓûæ«*Ü›P­†û€ ;ÆÑ2P¤eo¼|HôRÙdñ×nk 'xÖÞV¨ã‰ï»Ç«¢BZÎ+nÀB¿þVYÈQoš0Ü¥ß åÅÄâ1Áª¡g–ô‰º½E·ˆÓx0›Ž'‡"ZóM(uÔæè>Ú~Äh…^¯c;¬=ÊpèkGâ&%þÈó*;¥¹Üã¹á%Ô•fw“—Nhdžˆ7m”RšW92ìshUÇxë¾vÅUí{ ÞsáÓÔa¯BÛ·!äÿ)SO}&¸ñ”4Í™~;ãYœ „ ‘ñ·¾²ÞX}eL“¸¸S4³z¶fôF`n²N8g/á/ Òé8>£Þ@÷^»WlØ)Üþž¹6qØîi ÔE#ªM•râƒðu¡U•Õ¼–!úK&ŸX,jІó‡ÄS¹= ÚCÊ3¯Å»UæG¦~ͲðOÉgF£?ÃRûíA¯Ê ®´çÍí×–%C¢Aš7¤!¸Â‹l#ub¸ksZ§¢¨á^µ€¸È9QµP´O•!Åfwýg[›üP”ÛêBÌ8÷‡=)ÌÝãú}·a~F—ä¼6Þ¯×,ì‚dœêOÒýóR±(,ãZÏÂJ?æ!†¬‚΋þ«›P`ˆÛœØ×(¸Î*z)<°,Éæ¦kîîm€dì`Ef9Ôœ[7eAí§¬É ?yŸB3 S“H¯¤Ö)~Û´â,„\g‹&¢§Ú)œY ”Ÿ8O$z+[òiˆ·gÀÁÿŽâ/•¯f»7{Û0ù~kA½­áz?ÚyŸ@õAañ·G¹E€u%ÿ^Kßù£H|Ê:KQ²…´Ï݈t}¼Q¡Ô·¤ÙñvÁ‘Fjd Ç t½3é¹&äÈ@½üÍ ²«Ù¤Œ÷…ÁÛ:üIVZ­‘_¬"‹›sV(ÎaOP"·¼Ž›ýô¥VgÚžD‘˾1{N1ÐÞ[쇕pªõ”!-Ô {ëÁ•Yh,§Õºf'yU¯=Ò^X.#r˜{m¿Éøj5¢ÿ§¨Žé‡ûL]ÑÀòµÓ·5|mã½ð¡µžaMfL)Ý·ÏÅÕ\6doâÀ-ŽÕ3Ü…ùÚ]%óº­"tÉqs–hÕšh€²ÇWw±î †4u@©sĽ¤0jlth¾‚A€Õ8¶s묋@bÅo>wKìæ}ß­)~Ãþ¯债)¿ÔµÈí^};‡!ÄÓŽ† EWäqãÍ‚¿»Ñ=’eÕýE>Ø÷]MàC2oq |øTÂÖþsb!`-„•|KÖ¾î}Û—T…÷­“ —¯–;>À%6qA·@Õî3c=|6 ªmrh7ô>¬gìýo¬®3aõLÐ7¿‚ÿ Õôà’ÌLËpz`PwÌ(® b[4èê]* àñ_¡qÌÍê:T…‡Â©|;ïz=òï<¤u½ÀÉD¸MºÆš`ˆÇÑÚÅñ÷Nï…/{¨­U¸hà€Gê=ݠаìº8“.aÇ6ا5ÕÀó dÈriŽæŒbD¼o„/ý”@¤ `ZL1È ¡uÐï[¿ï#yöIÉ-œ¯”£§j߀”c.îcÁt²þU=ƒË"±è^Âð”«ÔˆÂ{'Èç´cãΟfŠÓ~Œ¢}œæò’ ‰îÁ¶1tb[ª×Úsìën€}be{³tíÂþTl7ý5›hÞF%©j· ”:B¡ŸºÝ©j ‚ž€Ãýs°õ!?KÁýN¡Ó¦#cCºyåØóéŸrŸàÝ–½Ò¡ ×(ÑQO!ŠpGTpy+ÞóýF÷9§hv† ™Ýé3wù…+CȯGDGE’qì¤*£râÉ)Kt¸¨°Q⃠?Ÿ›ð鳓`MA‘Ú žò§†Ófd—›{ƒ‰œ3[ÿag¥L0ñ"K%oÜiK-ÙŸt™`ðVÿ)D8m˜§Œìá÷(pOõÒgÔÆÝhîWòÉãÛÎ;jx¥vìbtf¤¥<ìté K扜aŠ;ºoËÊ䉋“:¤ÁA þM¾~DÕ „3vÎ!$ªHJæÒåFŒ1HÍZšë§ˆZ¯2æ\§ÁbÂ[¸æÃ£—,m´º¨'VPþ(Móë1¼øOÌGG¨Gmç° " Æ>Ž “¦±‡7ÜE°û4GŒ@xýå@º¦rć3pà ¶Ë¡ú”Ÿ!.qìÞqyd ðØÔ»t‘S»X ­ ¦7•ÄÆ®€¾ïPvÙ±-íîS$ryêmu[¶Gj+m{ÎÒ±$0KìBÍobaè˜ûáèªáÈüËdüÇõ|à"ËÜæŽ'?|®aa¥@[S²­‚7!íк”µÓ)ÕKǰ\÷ûïh¥X !vAU¼Níñ€ xëÕ‹8•é]fñ‡]CüHGþ†Ö…¿’ k1Ûn¸À“ßxˆ@ ã¦ËmÞ QÞWl^X{²'7ó ³¦°¢i!¤žrÃû€q:ž–n<©1`“d´‘ðÂúÕÖÓÖ“ ínbÝ·I‰% ©9FϨY…Œp(ÁÒµéZÉîãQ%ê4Bj¾ ÿÜø©¡‰„¨YðSã|NO /Â91Ø­¦ÚÆnâ˜)Š ˆ\¸À{¡<ägrîJ´‰˜´74`¶:Œ!?6å³=Û'uf—ˆÁk¿>ŽxJ'1àüi[˜¨0Ö1é¨Óz­8Z'B;qÊIp \DÚÏ tM½Ï<Ö "½þÏŠ¥Â ÿ줎#xœ àþéÝS>¦·{æ0§ð”`”íq»«zú®|¢ÆÊßiX4ÔÌÓ¯u”ØOßuNÕ¾[÷ÒàAùÇz”Xœ“ÅÄw« m‰˜¶/`’‹ºUw‘±ï X°eùÚ&~ƒDG§ÎE¯É[ƼâN.¢PyÞõÌñÀñÎ6,ɧõˆ\P!<ߦß΀½^[]¨ëŒýÙŽZŠð2´,N÷´„á¾Õ’T™¢S2quíŽ,ÖÐÙŠ¿¨Ą̀„ÜcìwošcCašú};PP±gºÏ^ÓqM¼@I2ß~5]zÂ>#zj…Íz`Èã³µb1ãl@uJ“œ©*üÆòÉ—/Næ1{©hÏ%© õ“<Û`Ð\Âu>"Ã1/F©bÌ»¯…þQ9ÿ› ñ‰­À'ºac))åM°±2¯$ÍÔk>ôK,é‘_d­–=ëI©`¿eù,TÌ.†½™ŒgoV3Ôç”dû̉•áNìmZ€’â3ÛŽyŠBDa«­¦õÈO2'•žr7JœŸš—ù‘ Åì ˆ2’œ¸a©mx¶TA~ÜVÙ²ˆ¤?z —ЃÓ[ÆY±°Ô®Á£³ï³pžÖFqlòöXíJ;Â8M¾øJüáÓ-ZqyÐ%˜ŸˆWT²Ås€\bO,P[°}é€R ’mnB0c+û—/V_y‰pf•t;‘ø3j…[Òð¢øF- äŃ$þYÙW=Ñ¡ù²F¥}ðÅMª 'µ;iº[ȉ[«§_.cDö\S^É òªoqƒIX¹ûàÌr¹ª¿>Ç ß¾né¯1OŸ6ú.5×>ëü0tO¤]HT|ca4ªI¥Î©ä0ê­c8ìÌ,׆S.†qz ´³¯­FjCÆ<æ)`5ï…ÍœLBgXVp,ž®ÖÎâMÃzóFneø´ÿ7<¸›E%ËMRE# –q4ûfïèèJD˜}.êi&W6H"%‡@ìØ± ™ÄÈïíkœÃLváÀÒàñ‚zÖeäÆlÎɳHF¿7¤ŸyèQãÌ'´ g“`µ3Ytӄ̘oÍbUS®Û¾\£ÝçïUSlF­ Kk±Á` U?›ý¥’rwÎUÀmã0¦ñyž¢¤G(ù¾*o÷3E0—qEÏZ5ëˆ\à~±@íF}–Q.„6ퟲVÙ´»Üb;ݦ47A!Cíç$ûjáH¾é^õ$YM*ÈÄž£Å‚‚[¾Úe*[bêzÚ?/ƒF&.šÍŒÚ~žÔQyÝNZ¡BMÈ;¡ØËÄh›¸$}Ù3eÊMÞð>åñiZ.cb‰T¿vWøÊiùX„¯ÌÀãF‘{@å¢é2½ÙfÍÞ…}é=UÇé§À:r^ð‡¡í´xE ûu*Ähñ8Á5#;œZêojÄS¸±ÒÍ3›#ÌA-`§ûÞf/MC¥ý-îù&熚x¼a2ß´ P<ð…ù®…p [Ïê¡J¸ Ð¾´(¨Á ]F“µ.P¾TþÍG“[1y¼ø5HmXbÙ†jICD~qÝÄ3F·EøhÞÚz†åõF]ƒëÑe‚W|.°¾b l)È”@ ÿU6ؽs€dÕ$- Ó»/YÉÊ,ò+°h×¢W²Lõˆ?£}ijXÃÚ4ñ²–É\,Ÿ˜€¸ž+ˆôs䕳 †Fý>:m¿´ýWšo“H‹¬‹lo\zûä0-³íæ©d0àX6¦Ñžì/(J•€ ±¯ð®vv÷¬wTØäG´æjý{@ uBÜMø“~¡5醂J{¦ø÷w³u°ç‚÷¤Gº¯r ¶þé̶àÈÆ1ëa®åPHzáQvyu£'’%Õ\¤׸“99/ Øèsãó’÷UP„^H‘#Àoê›°2;`ˆ+ ô=7£$ãÆt·äM:±öÝ2ÏžqWf¶ HZœe©ÉŸÝZ.³l€]Õ¶ÎH¼wо Fqù»¢üΣÏüw>5(ˆ4…?‚xþu=0/üÀ¹­÷°c¨p`¥ø›ûˆ|ëÏ…ƒç¢PdËÑßЃsLªÀñ|A®§§/Ž &pÇãèHÌÑ¥+QEÛ¥ÆtHwô•ujD t>p7ÍP@0p=å41'sÝÄu—NÌöGhœjúEEÜb:Úº\øUt°aŒm¢FNs¤¥]/Œ×ú°Aå-<ã—`Q‰|C0(4¹qK¶V4Ï ë6'B=ý‚N‰ë¹mÓ½¯qq¤ÕϪ¿¾^Y¢3×îAžüÅ!¬dÐ}66H£^PØ'Ì=±\"5^NýÞ{»?®6ƒHjZ=¦8~µXãºHaJÔ3“Î‰Õø/ €¯ÇùW¤jËÕ>&Äðö¢GåïÔZU¢âÝŒ¤ÈšŠÙ~cÊ¿¡…Òå3w¨îÖó¶ùÔ.M=J¤mÇ_Š0Ç5žî¡wBÎ]]½FkqÜ?w'»=F&>–ˆãùÅþ-À*jj´6Ä7_üÚ(ê<“¸Â\icÎ'£|¢ÊIj(§×(Ú§hß>Ʋã‹öÁQºLVPx<]©)Ò!Õp½Îm6Pb—‰ÇƒØúÚ¶¯ñJÇ4q6S‹²Ïb0¤]Ÿ~*F¡5ù?•àŽãÄÁm‘Ã×°‰A XË×ôL=ýSbîXLñúÏt(GþeàÏý”¢áG†þ×4Oέ¬–'"’{†éoäæ“y.G·ËÉ ›u·Öw‘ªð3¡ÕÒ¿…¬3f0‘ƒv¡‡ÌRá†én†/ 9Zqurèøþ“›™o½~¸úÇúó©P¥)™¥Ý=ØZŒW¢”Ö4¥N_#eYÇ] 껑° ‰©Ätc’èbè#Áþy6þ×ýD$ÒW=Û1fç÷MCot嬖 §×`ÕÿC˜÷Ê kw—™o 4&LY“>\ëÝSe‡&G%›"¨È¬uOãõ Fef=èIm ›XV·SŠ«2¡q&út7ÆR|胯àšižK)üÔû³É?J/òÐa©d¶<¿š¹}›s·;¹Y!·¥åúëÊî/¢†<\q¡×ÜÁ0  ¨ØÔFÖ$L…鎕wÞ’(ïYÒD¤÷Íd7x“I-v l; 3 ÿK8hzR:Ð'Uiç­—ö‘¯Xò ‡ˆh‚§§ÏøÉŸ\¨¬ġòúðn?)ž½ÿÁŸ½/I£€œÏc<‚ß9„vÈ—*ÿÿ@É:¹Šˆ©lJ4ú2D†CMÔRª´:Ž Î\#–ëg qëˆ{ž²•m'P‰´ß™àø7P³úïVåää#äߨöpæ;‚ªmć•¥°éí©S¶.}÷¼Z˜@Z>£Å±÷W’nïW륩¼w«NMƒò@ºµà•=éà~ úÇ`GÄÏ!Õ©"=Vt?#7b¬Q½v?8 ³%WŒ¾úYâÎå×Pìt à{³ ¤ƒ³ ¹ÙÈ?üVÈFãÖˆ÷eK"Mý™rÜ2WGÖKþ!h(Ý·ËŒÅG”É_0?oM„çWÒ ñý£³ÂΟo»,ážÙvÜ«ëÉyÝ.·f$8—Ñ@6VèÐÈT¿$ !ÃW©ßÓtŸ?&ªè}—¸’Ø:ÏžŒxâš²6WFìÒsv”]fYNÁÈCï†~ìïÑ^Ö¸Ïà; Ü܈bÉú‡"r>K=‡³ß²zdìÇÀ‡pH…V.ÐAÏÇÒ{jŒ®ù»v𭃤iPÊ4µd%ÀA8øØQCòQ]ìߘ5žëÈ 0Â¥s…6^#ßÈ«•ÆÅrÒloƒ_ϱþqÆ1 û­ÕÈd*‰™ýØz[=ºÌj5î§bŠŽ~½8×4ófª˜‹s%9£ŒcH›µý%©*š«Xûx© çìÇÿ[’EÛ,¸¼%´]nÓ·Ö¨‡¾<‹ÆÀ>mJx1[WÔÒ|‘·­H½-&½_x¢ñ:3Ö z%³^Å`.×¶V{DL♠雙ߎJ ýFº:gÏ1I°$×Wëäi^åg*!Q¿&ïùQ*µ/e`Xr&7Ôÿg Bwî~òÐɞΤcUi•§´¬$4wóìBUliÍ]õM^JýÒ±åð|‹ !Œ9*øSþ³–K¹Ž¥3«2dµ¢{]ß÷|)&™§Sgo¹/Ü®áfOÌ7$ái°´?î‰:§;^øEœŒÛÿ͵ÇÕˆOGrؤ´k…2bý <˳äÚ@ÐÊn;Ú\‘Œ8—«¥»y¬¡Æõgè™]FkòaaÛúûþ —§Â³fÊQC‹ðÿw¥¼1(=ßçÒìJ<°ßOO[ñÈ'DÓu„ È*d¾€}ö[å—Ž'é!äÊVœØI0RvÍšéõK ÝJÕí°ÿŸ„ä½*…ì† Qt»Sœ5lê°þÿ}ÉcôKÌ÷Þ›ØÀ—|³]‡¹§_3úöø*t“À’GPïš[k˜ù½ÎŒ@Ðå¦bœ97­{³²vK³ç~d„SQq12ÅV}Ö.Ü$.Qé &Eƒl_”°ÿÙf£h¨ŸkHSKõ6î)“]iòŽ -ÿ(b»ˆ‰âFp{#]>w£ü1¡_„ŸÄ°V¨ë&a*™tO‚ÁD†$oäâì½Á.$ÈU&ü=!£ó^7À—†ZtÇ5âï²_,ˆæTi¿f¨L€\ Ì?ÒÌ}á…åTˆÀNÖóîú4ør“Ê-äø>\€ûÜCšÎCÄ`é vjÆ_p¾(v׈tU†5áH$¼ëE=.‡9Ù½W¤Ö… mÕÏ8ÞÎÁ 9‚¡+ã"þ´&‹€ÅÄt¶ÀpÆ4CµQ<á¡ÐÏ 7IÍÊxÏ…÷Øè ¯=ú Ã*ÉÕõÇÖ:¬Á$Ç›=j÷É6·™¤Ç— _éÁ¤ÛmŒÙËvtóNv ‰IªðÇ@ñ9)Î-6Cƒw{ã·¸4}Ù7EV‚’7=`tP+‡LûoÁϦռÌv~4á¨}¤é!àdêXü­^Tpó’öǷ÷ZW&åâ¼kϳw…6â|“©ÜÐoÞˆÅ÷Ïtî‰éÓæœrÃã Þq²#Øóö¯df½=ìûü eÉÑÈ!ÀѶºŽ58:ëF¥ÃŽóÅ@1Þo0OµÑ6¹ødÙ,F#êÆ0ØáîµH0¥àÎãÓÍ©3鸣t€<7ùá8<ŠŽíX—†å Ÿ^²_UÜJAóXR[/0L⹦U‰§ Jfùb^#pÎe[Kõ?c¤Œ•$a”ãæ–ƒ˜d¨¿'Š¥ì ºgûc ®)¾ \o+‚ÐgoÑüZ1öã½<Ãôà+|û2¯g21*LUÇï~³€‘d3 Ä¢ºª³ìEåOÙ=Æ®®åó¿ oð z»U”c‘Óô–!à¶ æ;dÜ‹Œ"Ód53cveñ7•kk¶¼[¿gý¾ë£‹ÒG`σq€¨Xé-¸µ,„vRu±`‹óܵã„ß‚ŒÍšVÚìÆjÁ²’8ðóKí×ìŠ,%¶/BïDDÌv#´‡ÉÉYC%0B&KÕÄ8i´ã·&Æ¥ŸoVM•f*}fJw l¢ÝŹª,‡ñаNŠ9Œ[Ú«–í²PidD‡·†¦¤T>MüÌ:‡Á(&÷:Ü4.¾^\H_ok¥h!ÈÄŽÚФÍô¹Ì»ß¶ÊhÀVlF7Ä9ǪN·,c¿´vè.9¨üH‘´ž‹úqÂVÏKO.¥O“2N^WV Ô%h+yñÛMŸ[œ (Éb@0ãýO5gùdܪ¸ ‰Œoa•å><ÉÎH‹c×’)œÉê`D×÷QQ9‹¦R¡”ÈŸÑÔÃ}öDqÛòL3ãÔ–]ê|Võl|‘TÂ?8Ò¢Â!ŸQ…£ƒ2–ÂTÔãÃ,콟µÑÎÝ{pn··íž³ë\E,BQã´IÓÁ"¬¸#L>ë¶§ÛTVg¸º=Fk}ÄT™*â^ÃÄ™¿ ñþ]®èøëjä1.Ó0«Œyã ±Aê¡jÄ«”Á(yp$q™†¢<+•ò8ùy?–õÊ* Éy$Q_–~ᥘe‘CÔ"ù9eüv¬ñĽ‡R_`/ú½çSݺ٥¯^’éN”¤Pà!-,:7ÂÝCAPTIEt‘!(nþªV.ÔÂ-E€yþ’i…½W¥˜9àÃGk2ƒŒÍÖ…b®ç¥G¥Â’ˆÆ(^ô¤–·¨&~Èö]Mz7Í·$˜éà Oãkq¤ÈϺô’ŠŸbq¹:dd#¹ioŽ-,QøðÓ§`©Mƒ¤8;)ÀAûÀÍgSu&Ij,Éý/r´ýè?]¨,T\Snïïˆó`]2…5»ƒ)"ÞÒˆoS’åJóë$²6m– Tm {}iU„¯ÈÂHÆ@Eæúv(ë;—Ô)õ¯¥I,°œÊïð挘¦T xúßCŸþ÷ÃÎ%¡S÷;šãÑKV’ò.wd ZxRê7P“Ô—þô0âmmG÷9®.uíÂÂwa2ÈDùCNØ—C£´kCmØÒB"E/í.Ž>W ¢Ç{ðõß/Ík{h³OÕÁ÷ä«ÉjÆ}Y ¡¯¼2Ž{m­=îg±Ï!1SUz"õä{{±Ÿ%‰ŸO¿(6ýØœ“ì5®Q{]Èþ gY]zÁ£bð©ä¾+ iÛ.t% rTd?˜îÉQØvSËMêê±}aZêð¨ƒ/)öüêùW#“ômÖ6«Ð°ÒÏô±Ri7ã£ÈT’úen”×NPÉêG·• 0³F/í»qÈSÙÃ= k…mB‘µÑ<àØL%]C)þ’ÈRô\¿f^¼gÓÉÒ¼nOä'cUO7˜x~Gz¬e*5'_žª#ðù_³qçX¬sÒÖÁ¬ŒFÆÎ`ZfWþ‘D¨ÜŠ=üºü'[©„„TÕÒ:d'Ö§ãëY¼×Ê®Šd¼×°K¯VþÿØÎè­Š~ЩE8:È—€ð.w‡éP°Àô”˜‹M)‡ZÖ*V†´K<ß2’Jmê[E53=Õ˜ì7ú‹c8]ˆ˜gJål,RŠ>c Fü”R„ã/7±›’¬Ç»ƒ_Ëo)æ·”Uj€Bý_)dö€w#L˜h˜&«U&'ªß~Të‘ ©ï\Ìß”ÓÒˆV¨ýlêÃQ•oV€›5¶Ø‹_w™Êæ¾{<‰KKj¦¶‚˜à6­+=-•×w!mœ=Y]ø%õ#og¼6¾W.ƒ×/Ô~@:YÍñsZ‘A¿$”Í{.¨>X÷(’ œÂoÃZ'P$‰šÎý°ð‰p¸—‡ùÜŲ́öß×\ÌåÆ4ª7rø.ªŒø3F+ä§?ä @ A¶ªÜÍx·§z×ãvŸõd ¨™O—ƒJvBN_Lôe¸ J€ #VÒ<áÌÝH[~ÌSŽTÝWèBe:êJÀ ^½5r~F®gð£+Fm¸g {+£“œl~’‡_€ÍíæG» ž|ç6F‹¼óÎ}œ -úH;€«OÃz(Oöð ÙŠ¼?xÓ“±ó¤W¬Ó¬Lí;¼àçþ…YÚËܰ™Ãæ¾Ù£R®’:º`Cn IŸH.!ååÕî”À¤j6‡WÛlSšd“ÝrÑj¨ž6&ÅBô@èYšJúë—{Dêê@¤ïÑ ‡UÍR½„ts¶PÆtç¼Ô5«¼S2«ê¡Øa 6sK´}| °Tþ„âOÞ*+ĘÒt­ÁÙzýx–x˜2ßZåáýØ7å·Ó·øðåÈ—²?DzÚÿžÝÕ[~ÿk1:À¬ŠÍºÝw#xjðƒäEÂ/ÊÓĘ­}t½[~A³·<Á§! çfÌUˆú<ֿͤIÅG¸¥ÏRÙ×P›eµ¯+ÜsdÂþñw± ˜Ð‚ »,¶ûjý‹b„)ÓÍD†—íh³:l>Àû̵<ç5N­¶:&»K »ï¼ Q3eö4¨–.ðÛaŽîßVßå…ßtÌk¾Þ­uÞ;ÌQ? 9’ÉÃÚÙM”'ýÜûH$¾¹Ì*8{Ò#žÛñ¯›°n·„>¸ðªp·$Ânæ³bùù¡jF›¿Ku.T¹ JgÇyÓ {:Ü«`­ š‰ °=”tëx»E&µzJjÖ½'W–Ü‚¡—LsÍ3ñâ+ r¨FÈ8FÓÔâù2·@”Åz_†z#O ñ-ö?¥ÕÞ8äsà|Íp¾ þX€@ë‹ÌϬnW¾Æ‚–܎ЛD}©ïâÿ¤ˆEÀ§ÿ·T ÓÚuê÷WÛCãɱ¡G“Þ©Õª“ï*u)Œ½ÈRM‰Ã›î$¾ƒÂ iÅÒ»õÖö²KMF~´ë³Æ+&oä°ÄÆd–@º>A"{ˆ;ì!$™vhD^´5w9µ‘ñ!Dü8Ükа…rh‡&¿u‘íU“ÑW´h§îRcâ¾´f÷d¡¦®P_»D_9,ðUœ6š¾â°ˆo“û MŸ„‹ÁÚÃh. 7¹ Ê—{`å–ûÊß[ŒÍÀ‰Õ†ÍÈ;Ä ìó/ñ&½OØBíô-ÒNú+•j+I%U!`ز5Þä®D3ç(uÐ8h¿‡c×ÄèŸ~ÀszÊ>…í¹Ï"i%uCÕü<×GwŸÑÉÅLXÏÊÝý“‰øùtu-ofµ>jÃŒªS‰v¥_ox *§õýp¸úõdæ¯8& IÙ·ìWûãÚh(º³7¨ÁEÖ”¢É:žxnèúøÅ}*Èùœá5FR¦Ð¦›ÃDÖ`Îýpg«Š¥à‹Å…/s O[Ì F¨áÝÐìb¢§°ƒMæ\UƒäãîÁÝBn8­‰!˜œZÛÞ^=0R€5ÇG'gš& l¬h¨ð¦Š»¡•¶?¾m=Ûøü'S§ »&LóÜGçþ¯ Öƒ¢k½bí+žÓ¥¶ŠJ£@ Ñi²¿i²‰³¼{áTgÜæ+¥Q\Bt˜Ǫ@òÒU ™ñN@ í¹X5àÏ÷ò³¬ wÊP§L ÒÿÙ†Ç"ïzf\K^P‹¦ZH›þ¿ÁÃÀqUT2ϽfZh­^Ú±>I¶ë.'¹‰‰d°\Âd—ª×‰ÊŽà¸´w6Ò˜>~2lëï*n£'Ó«ÕÍ-~šb¢)®>K ÇÏ ’B°.•W¶~©GíwQ-fØ‹‚ìæ'(r Û2‚æ8mŽ”ý_²„ñÏQÖþ{¥4$x«uA·y—»õL´yïRþ×áÎ䨉y´/K  |g|½ÍÁÐ7è@8}îÙ!ÇŠRÏp"oìÂHî¥I—w† áLë;r^©8Ö>uª÷2Püt³){þ4«Ì–$®·‚M[ k[^š7DcÇ}œ»¯¹ KØf³­¬Ìëù•¤ –¦½þÔW‡þjT•ðnBW»ÜS¤'ñÖÅ¥—`ýJoxO½‡î“"¸–£ì.}AWœ,êP}UH;/"Š/gs,ó<:1ÚœÍzø„\÷Ÿ”ݸJAQî¡­;q7;ñkŒlçÆï3ì¹TDT'-br¿AÚÁ³º[Á4‚}áÛ ¼Sjü|úgY8¨g»Uêg›‡ã0„”SmK D~tGFçÆæ²›:&Ý””ÑÉ K¢pŽV Ö/u--ò¼ŠTäIÿrÆÏˆ‘ÑøƒwzÑd†EÄû¬3E² ¹ÄL:þÞæ§¶ÅšøÊ©£œ»æÊà2寈šÑ`ν|ŒÀÙó2EQ%E8v[°¼ÀQÙg†k Åê?Z_ȱÅMÙ8VÅ‘?ûÒ¨œœÇXL»“Ô8+›âŰÒ„'ìtéàK¦»ä9!—&Êç*A¤ 2Õ­¦#äzDXzReª‡ÕDƒû–Ô¥Ò½|LrÿsèÖ`XHQJN*däOÍNûXëjÖàÁcͲð¯Zð¾KÚi¼x|;?!ñl³aboÁžšC®±¼Ûg|ïkÇE5—¡ò sTÄ18ìÊûÃÝØ%…ÁH.Ç.^%/¡¨#¯'X:'ökL]7ÕŒSõ)ì•1E©cCåÇkãËJ=‚Ô1žó¶‹–}ùýqa—¦®'‚9Ê*ø@LÐ&Ê…ÍÎ× ÕÁñiÚ̉áѼ ð¼0ä ;¹¢eó6Íe¨ol3¡i"ø8pù.í.ï2Ë¿ÂÒ½¦/ªoDg\Ýà]ÉCÆß†h @TV>1¬¹`²—N˜ø(«zù|“†v†êÐlÆ<\Ì@@v=ÖªÓË}\4 6"^S$¢§ß‚Áp–ÍÂ$moƒ4{CÿÎzI_´ b‡ÈGv&ú5õaËPP^æ‘D®6pš¸ÉN¿•Ó;ƒiǦ¿Id§ú¶ò$Ÿ»¥ðò!ÀÁÈ€˜¡´°àtò¨PãÂßmWí6©ÁXxc' »®ï7•ÆåwDªma‘ßÅ&×®äQ-Ð<|&h€5V–²õû»xCj]lF*¡–§Ü3"Õw„ÚD÷Å”£õ†S­ƒa?¿q3è/ª-™+Ê?.&»äÛê’Ut:‚]ê6{z¦uõ6ºÂËà1RcV}ɹíO–w›;ÊqsÀsÿ]¡5ªTû5åLþyu÷Nƒ „†çy¡/À4 l[Í€ý¥µ$­ûp·;iµè!OX‡pmÙ.ÔŽm*0LèÝ-/Cïɽœse71uîb*…›¼L­ôî£Ajð`oþÉR¨‚g¦Q„6"G.a™Y[d<©n§=b)nøòš[xV÷¯+ÛX2.óª‹Ï9Ù˜8È€¾˜0…! „Ír q¾Ó/²ÙOùA9ÕâN ”} $®Jx”Mýt±w$V Zñ-hÏPì%‚ñn¼Ï¶ ø˜g¾­æ:ð^9Øãrp©˜>Æ"RË¿¦R!Z¦ƒŽŽ"ÐA·€ðû˜ù•/ ­€„šßîžË<‡ræ:Zƒ»–/ç$ö3Q´·¡dt:ÑJ8AˆwvŠô#ã4Híw<.‡bLþ÷w¡[hrõDˆä,HI®mTË…}À—.WÈ@¸™(êCÁ¼s/iµ/ Ökq3ˆvaj¶ir2@ñ}^ª¢|Ž)Xb(à ÐÉY*Qóž0ÝÄbö(vTìÌû•%öêÅpž•/²7èËpÊÅÝÁ=¥½ 1“ü’æÄÎó¼ýÎk6y¿Å…W–ÍúŠ&Ö:eš/÷¡§ã§÷oø„j-d}8è'ÿ¯T½Z’!î´¤uê¿Nð@›<ÁPwàt,FíCÊr’L2äŠxb$c9f€ÊÃc@lRJ›;vŒÕ¦‰&C÷‹|Ö\a¿ëÑþêgØ©¹¯Ù¿9:V…e7Àouº°¤pyßöL÷4<Öçþ{±ûÎã'IÉ5ˆ÷U P\Þÿ¾:cÝÍ „+3]În³W$ÕHÃum°Dâþ¿Sé•ûBZ¬–üï8L“4µó„Sl³«Ù„G„K«ðL§gí·†,ylÂöSR'Z´ß ‹M.®8ÒNbõ¨]È4]Ulgðb-2Ýfþ!‘iÚÊ7D¨ϬÃü©G å“n';-NÙÚâny oVÂ΋áu%n‹ø[ŽRÛ}¨ÄOå.W¯HÞ›wX›k³`’ìâ¶)ÀöM1Ö-ÇÔ"¢¼Ìoxôéu¿'¡|ó[1í1;Rtô‡©.»3°*ôrëØLK@åÅ"Šor"Ú´%â"?L¼ÝjeIð€…êêåM{¬È°Ž˜Û÷žÔ"2§UÀ6fü'àºÝsÈuKo! _ñEG0óÝþ–Ól¡/‚IËçL‚©@ñÖÍ–$®·‚M[ xë?Ô_ý¹~f¿ª'¼%æ1ÂtçÖÛ^LDZ:ws£¥:~RÚ9òé|6ão‡Äcn´"ÊÙ6”©à6œÌe‡ù¤ËÎ\ýâfVÝŠ6f<¨.ü“ÌX†>:)b ’?TNŒ ^\ƒw$¯Ætæ‚xüÆ–F,טj£¸„í\ùÐ5¹¡¡iÙøòˆu÷å׺³Fh¶owãrwÕ>žg/jÇ«V®’ñQws.­{*7™†'r²AÖXÀÒÖÅ?Д\ªÛDo|åÃò‹±ôð#óÞò蕸tdŽþsÜ{Œ«ª«ió¿uõdÃ@µ[Ä0ôU²f‡uiÚ½°‚úQ4#’rùÖ/[ä“)%U¥Z ½ó §ݤÍXu¿, Ïâ6òÉpV±èàÂÁ§l÷œþ)!Ó "¸ùdC¿¡³A‰åÅ«ÏìQ­ ÌE¬Svi ÏàÈù$ú o•Á\tÝ­^œ@G­Ev…Š&_üྞwçcé»f#YߘÝvsgÚᶆîÞÊáðÉËÅKÄÍFåq%kÓ@³8ÃËÖÓ'þm#H´ë*•¿/.JÚÛãIû3éê,` —tbeEZ\`§À»ÒôȧåþŸ¾¤½ŽÉ–%Bâã ¤;?ý·Y!g¯²»¹ì©-oætŸóÆ;ãn U©¡@mŒÌ Yu‡/蕸Ä:*DZú^Ç$‰ÔôÄ©¬‚‘!å2Æ`Lœ5VRüœ/¥SÕ6‹ u-ýÊL›”KÑÂÑÂ^D!ëä±q) °Ðå°²Ä+¾X¤ë9êaÇImؤðÞvuŸ]UõW"JK•I΢âwüXHÃiÙÀñ£ÜR¸T!%»BVYKß3¾C®ù?î\`'JÿÀT„°ŒF_V»þ¸‹måOÂKÜ^ÈÍAŸY~_MßÀ»°é bŸßI+ìxÉpÁæe=K¿’ÓñʽÄû®8 "ñÛnŠ©°Pã:8M\­•C£­¿‘¤©@Yp] Ùü|ë%wÊP3žËÒ£gŸ)ëCÈ’Gú5 ­5ëÉ8»×E÷tr}é.·‹ü½± Å@"­ Â…` ËpËQ®ê¹Ìå{‹ÅNë•jŒ9atrX"Å1¾¤(:<ñö6 M>×…ìvÅž¤uÁ[éá“¿Æ¡(’IÙ×Ë:ý ½(¶…žùâÁQÅ•™ñèá>êµtlΊãi(ÒcÇwåôùí®ð…·*†©Ï]ýVsž;ü«I)gžñÒ3x¤CD ùR=;ò?›ÜÜ×òÄ u Ÿ7wæon?äÞóÕ°bÿ»/½¤¹8øt¶¾02»§™PxVH¦N°Ÿ„ð•ø´ä§Œ–H%«Ûqú­´*«|AáFÿÒÇBW@IÜ¢WéóÔÎFÒ÷víyî¡‘^2w–=í²¢L‡× &XVŒñ1?ÜAfæêY¤½0 0‘·¿Nr/ÉœÌÚ;Œmþ¿À¡\² ¦ß»€Îís+å%å·³[­›grÆg<¡õ€ÿño<–¹¹·ðA®Õ ßÏrFÛ xt6Éâ¸pm8YrºÚ¸=Û;úøSª:}¤½õä,‚wÂÌsÁÉöh“f­U#Ô5Ûæ€qÐVËáÞœRDÌQ@»¨1—j! ¦Än…¹9)`9L‘0¢­¿åŠé/Æ{þ¸(Ž&6PÒ{EXãërð@ÊLð)¶ñÁ„1“û#ro’/‚(ìÔ4én³‹xŒXœ¸[·°Äl7ŽŒêÌrÌùÊ ž½°´jõÅËŽ}b”;·m‚%XIJQª•aÔ*Üð¥ùI;jˆÍôàÈÔ–WÆãûÍkÆÑ9¦‡0>á*k1»ò:ñ•Th»¼FÃæŸK«}ZçÛ@˜ õ¦°Šw¤y/iÂ4‰õCy´§fŒÁÉ6š6ø•èÈ^#Òä}íóqŒ *ßjËûÚF®†)4H«Ç2Û™Áznt}þ L±”0­£x{Û’EV#Ož,úçW•BüÇ·Ìö0Ô<¤TÂÛѲ5I1غÎþ­ŽIgõ­ƒG)WË/×fÑ‚¯Af fž‡Œrá¸ö’ÄI•Œ¹‹ÊÇÃyVå6žoAñ`>Ô–ôvoÓQ~ˆh 7OTUÐ wiª°I}e¹Å9R´ÎÊ`­ÑVÙ†Æ nh=âÖÙà ÿU€¦n©Á¹K.¬abÈ–”>eÞRüc¨ÿÆà¸ ¿å>ùFGÅê@ìÄ*kÛ¾˜ÂíòiÃp|çt·xfì³ð¡Ýerr‹Žr‹È*×"%ÉL†²E‰øC}8ì”#¢iÚª=që ·õ˜+×<ÏÆÎ³–öVØnLb¿ð0UfËÈ9±„0FÊäµy“ølµÕîŠSÃ?n·yI.= †xyCc$ˆ~´é'0vxòÈȯÕ¯xu„%N™ºñã4]‰îÊ„lÌÖ+ð‹l97÷£ØÊnÓ q™š9-4ðNP.“O-ðGArµ Sñy5uà1Kݪ–@ˆвÒH·>ލ ØÏib 4Zsy%{µ›; v$;°kбü£DŽð/çÖ– Y)#±:ib°ëïöîKl³iÊÒ9š;>9­ ÙÃ/Ç꫞ìɳý—1¨3Ð ÏxÎ"I3ÄÓ±‰“.Õ`FØ{ëë ß«¨ E¤ú%ÍÇô‚ö¢ž2ÕÏÍPüâ:Ì‘M/¢Ö!à“âçN%éœâÛ–Þx¶{ËG®y7!敌m¤shSj\ŸŸ¼MÝM¿\ -;´øcë,ˆèi–E¤Þœå¿Èw×ÃǼ«#oµåÈûj3–pâ”§ h•–\ý‹!ôc ˆ¼–“Ñ1’FèÉäVKÆ»·#iŽÝ”V 3÷pû쾨Â;íÝWàŒ‘eB ¯5HR°{j÷Rÿ¼Ç‘rÖ-…Æ{ÍË×3IÏt|ÊubPþP“©¸E«o³óeÍ@ãsÖóYo‰nUÑÀc•s(Kâ¾  °6ÔÐU'NbÈuÅÑo&‰²eºàñKSÏþü¬Yþv¾ˆÑm_¯"‘IvyîåÓ~K+ :75ü½‡üãç•D5hÆ·KØô q&a êR€ƒ4œ+¶ ÙÁ^ÜÒXŒ ÇS™Àß~èåKöx‘îe%3VM~ZòØ‘ ˜yÜ£‚îb7Ž*<~ßt7µö9¶3ÿÕ¯ÓEZ{©ÄÇþ Ê’{É3Ø‚/›yb¸çuqv)âKÉ€¾Q~«îg· =#èVñJ[p•/i(¡Ó ¬%c «×´»¾>ÉYÖCÿM÷E^¤[_å¦ãüÇ~¡y²¢±ÞÚpZýS$1¾š×S ìø&¯}cí¦ÁCK¼^šËCî ž{kÂgŒ§…Ó“ºwœç¡t¨˜Œ/v#ÌòΚÃȘ,†Q t ×ILÊã(»7ªHsÿÙœFÒYÁż¹¬¥àúžÑ%E߇lXÍ‚•§à9ržù9!NpQ·ï?å›ÿòU|q8ÔÆ0h“óÅ‡ÍØÒ.¸›:¿ý£nðQµdëŠÁ÷r“ÓúZ¾ô›S¨‡úÛ Í[> "ÙˆÂÖÝ,ŸQø:RuV„«ò` ù0fÕsß:ß•÷Èéø"˽^í4ÐUDú¿sj^c8«™Í 휊' …´˜œ>µgòé%gþ‡²™£¶„=qÔ;(±Â àYÁÀXTd/$ïÑȬ(Ý«ñ­KÙ¯é,ÀänHe¹€²ŒÕC߬#ïÉÆL¾éÙ!œioG½Žp m|.u÷Y|]Q¿.kœ—ñ_ ¸o €°yhWb&ëÈÕóŽÙÃ!R-o¨Oüu/joGü,Ñ“­N@l  šwÞ“qø2Ó¬§¨L¨Ã÷Ù}ÅéH\O*wï̾á6¤©½s‡ –Œ¸º$h‡ô…ÁXrˆ‚ ç:¦b6A÷k4eVcÅJ®þè'·ÅS«È%CúŽÞ#ƸòO¡ˆñ”šG·<d­–W§ST@0x—سä¶ÚÊv„ù*Kt&-w)iÞçäížáû‘½=@2_[.sP£kCÏZL­êh¬£hù’xú^Íÿ íHœ>YVŒõg`Ðm)nz&=‚°¾í r©½øè×¼ÁF3‡\Ï\Ê )eÀ«Ï% 3™s&Ê@°ã´ZŸ‚æ°ö6,É5-ﯰ÷gø)ÞéôºßÏU ƒ†‹Q¬‰5¨N ØÊ, ¿5n zS0€í9ÞiÑ£ /ÄØ ðžu¨$¹â•5q˜ŒÆŠæ ˜nv1¸"ÿD€˜ð©%ú•‰ÔÚO GA2¦ÄT-E®2ƒëgiDÙÍ&<äñ¾ÈG †FÞfÓQdbµ£èǧi@TLÿÍoܘ$'[¤ ^ð[CÏ$Û}‹ n%[Ö ¼?˜YÔšœi"„µ.ÞÖ20d‡É—@ÞâRî²ÎjSGž¯Í`W4kjƒ­5xæRî;úRùýpRÛ³³øAˆ|«9_dwŸdÓù´£þ9G¶¥¶‹ÂˆÆï‰/4øâ ”`[lBß„ÖÜÐÛ«&ô¡ç»- ©&ºv+!¼’8~ ² â}GðÛ<|Æ)äïëoŸKƒ®”“÷$«Xž”¿ûÜÚ†þ+³>aX¿G2Ông¢/Ì|VÓÆ ¢U\ì‹è‹úf•$èyÖÛ,OýmóZ³ìÈÕÚi‘g„ât½?à wÖcn×4Uþ†Ç9=m¥Àô:ˆGïÔm)™Â¦b²Êî­ä‡õ4¶f½8‚Õ­‘ÞÕ#„ 17^῵@ÉSÃÈlfžWìPªØþ› ¡T%sÀá+…´+Rôk}È^Àa ÍÐŒ/?zS_Ö ‰~G+ä¤"ŽE“’Ñöý›ý«c¡Q#óU-Ⱦ0ȧn…õžÙ[Zä1qøÃª­ Ãtž Ƨ•Õ64 N›Yhª± ¡&èO#Èò<Ç?aÝÆa™åbx Þ½.5G ŠYürhŠóÅÕ›õ¼P}£²úâr‡FËÄìÚßb®³ÿR×Ùñ*ÅDŠwó`³M¡ç‚óñ”³Ô46´v”W_vÑãBxÙJ÷õÁþ&Šý‚Âçéãöีý‚}´ç´~“Æâ›3ɰ…t5äÕQ^¼)#¤8átÈ”®õ %¬Z¯‡ UúóÁíD¦ÁŽ%,:òP¡¾Èsƒ ‡„^·tÙÖO¸ç;7p´uä¥ÿ5^?u‚ó)p%T^QDUEÙÄWßHVY%“‚ŽàÃ’ž›¹¯¢.Ã~(õ_-?U-Ô>šp²6RéD–{=  E=„À× =`66S&dé.·Ìx ªê~È>Ø55Q¶×íEqäfå\Ú )d[™Œò–v¢}Vî”Ùþì[•z ¦7 J? á¾õ}ŠƒÑ¡Y?àM¢–H"‘@‘…ðâ® þL$9âôWŸTDŽť=8—¶¯‹ [š˜KøŸë¯ÄóVu<‹¸•½$DZ€*® DîÆ0y–ø8-—Myeãóé"–¾‘ÞlT†0ç&#le˜aʹ‹%ryC/¤t…O’ì{m'¡2{g ÞreÁ j¥ ¿Ó­úDÌ:3Ü‚ÜL•Ý×¢1kú&Æ´ 6º›ù/D»È:] F'Åhö]\7(AbzŽ0YØsu“\"¾iÔÅö Mÿ# ç$1Á𬘅’twZ$ÃÅY°ó@SÐzÔbD;;°eËn‰ƒúøzð«aU¤’ím••QÀí ϼÿk‡—”‰yÈ;ˆçGpÀ}óNx+½7{™[}¹,¢Û} šhã•éò‚ø×žA8Üâ‚N>çom赂–º8°ÙÒsã¤ao`ò‘Ûô4hHçÜ ó¶:vØ?«Ï!uU U¶ËJ1hðÓ?®8ž„îg{Ýálo9¿û7ù ‰«ft¦1£á.û.‘¼ä*°˜ÛÐû °»N½ nÊJ~§àîfø Än_­·…×ðÈ÷רdòAêPÜ߸û$–ÙjÂ37l¶?™!¿„°jä$í°pОüüÓ*paÉ¿ ˆNÄZJ8XÆdÂ.«qÌ•Ÿ<øü²~ké×á6H,0ÞT%8/¹d£½‚çBjŒ ¬¨À›l Ao3ÅJEÄõ{¿&¡,[ªU@çÛ^•NáÃjp6#§) ãu>ÁX¶_|FÅ\Ÿz£”_⣠¦ªI21%È^J‚ŒU—ƒ~Ý~9g»\ac¹¡[Œ+èDýœ6‹ÞF+{î Jñ^®ãäõþ9¢it+¥9‹ÆÜÛ¬ý4f™¢‹pŽ‹ ïÄÿæü‹á!Η®m’°B‰SDI*Ù¦i2‘5c\ ëeÊ4?¼ÝlIi-R«KËq_RÛ€h U¢ "ÂòcÓŠ‰Ì‰ÅkͲE€SG§—Ðס‚8ûÂBEbPìhϱ “™7ª¸/ö5ÞRä}b˳L‰R5V]vûîV‘o.ÓQ¨È¾Þ³u´¥Iž÷Ì}°Ù×öGÃAláÕ)>Á(œÀy²Šq¬ÌÓ]Ib„Cý3)H÷¯¡Ö¦u®+ªÉûÄ¡‰ü¤B ‘ãÕѺB¬¦|Ý«AcŒ‚#of¨òÎòÆj3ÕBSµ`™‰Žµé.šF%j‡O¨9 »ûH×ù¹cJ>g°÷a¿õô -²(ФÕXtî©ðÙRËø:þƒOÁêâs¹ÀŽEãâªWäÀ’a‹P³Áõ!Ð>›§C‰«F°3},tx_(îåtñxÁg棵¥öa?¾Xµ„£S"$X¶åJȪó°vg&_ÿ@Ë>u cøI\"b„SgѬ]\¦©þ%_05=õN–áöÅÉ8á¾ JæN33yO É]šé»Q~ <þˆàH;Ê•x¶C|Ó¼:ùe¼kÅ„]0FÎ]ì’…ÁýÞ1F`©`¯~Jù•Ç{éòo©úÈÝN®yÒçÌ"ÿG_F.F¼Úq©Ö]ÞÜô“³ˆogIƒÜý××`ûÞ{ªÍx¬ñïUˆi8ø‹™­OȤ ËÖ6Ôãò”+5÷,±<+"bRs÷åØšMþCâub÷~œŽ\))½ÇgN龪Œ|è(I-\TvŒ*6j†+º™9 ä‡äx¸ {Í]GÜ#TšU¹E\Sé2] wûÍ~Î.N4XJµ$¦©Ó½¹àySDqÇäô)©ŸöÄÁí™å'à ½óí×&1ªH3¬r_U—³Á H’ÃÌÇeð!)D-I'¤l’ɸ=AêÛÇ€7¡Èc™i_½|‹)„@:ìc7C/~ou8QË5ˆâ)¬Šãuج %a ½øà´–ÞÝ*©Ïª(jFbâVw‹\´ÛÒRªfÚÚ]ö¥—žØ\‘=ï§Øbª·ákÉ^•d`áõZ§YH` _ 3î äÎÄÏíÊRsFE‚n¶–ðÄáßúiñ“h9–µ‹Ã†þ1òfõá ¾MOF¢›©TçʼÜÀ<'5 Ù¨½ínaÚ÷ûÃcÇç„ø0oŽëwIÌm…^ÒŸ™Çê‹C7Œs¸û‚\Þ­ŠfN­ñz¸O§ä%{ÑïËÃ-¨¨X/C¾jàü¦g`HLQ"Ë8iQD™4ž¶“íÎê4ø:'Œ7©ÿ8 +'¤÷\oäC¢A¶0œXWPâØö'¡%BvÛêè"pòišÁçŒj v~)jdn^ÞÔ„=.¸¦†s¬[àeÛd‡%G©*KÈQçhô= S¦»;蜾ñfè£Ažíá¹}øŠiŒ_†MµÄ÷­—ë÷‹Nè,Íq£L9Ó÷F ÅU·e<â~x¾ çÊ¡çÊÀà)1¢¨ÅTYA)VÔ•ÍeãlÌWÈÉÜÌ@zõÉË!Oõ¥öÿ$ð¶Mg‡êÊ—)a¸°vó·âŠñÛ™Œ6ïQ|8Ùm¼¯3Þ¸™£D¦ÀGÍÒf*¹O9¬RŠ!ÿªþ6Gp¼û™_bë mo$rä²„ð…£Æþ’cøy¯Œ™yõ¿I1MÐ3“_”ò¥ŠyÂ&^;ÖÖDêuÉ(î&Ž}°Ò¶uËÜüçCïéxLJ›-N°Õ¼&Qןƒr&p9*äSdgÀ èoô¤ô¥vír£¡Ç,î5LTö-´˜*VcÏÓ Ö$[ÊOD³ôöÞ,„«AmED0¶FŒWØlRÆð_®â*}¤aé`ÂìnD½êy|ƶ?_“ç[öÎBÝUž±ézŒÐªÔé¯*TH–öå—íÖ„~HSàÁß™)†0ì+F]Ð7ÊvêÓ™9rK³Ô(é}Úg Ýâç.È É`Ë…ñr{óEúQü¨Õ+`™¦Z ÝDMª5SG‚®4|ú}„šÓ©7IÛAå—öÝVà2_Y÷·$ÑÉG5€™ÿ;3nmh‹r½[†ÖÐÅMÔW·¼äCRL°qŠ‚Öf»g;†£ïfјˆš&Y/lQÐU±Þ2]9²DɳïÒ<=Kx[–)jˌ₴L¤Ò^ØŠ;g)‰ ʈCÁâ÷F(›N;õn&Œ\å&pèu®íNœïoE§ o”J©QŒ.È`ÑcfæãDªúÍKZòH0Ú.˜ÄL¸¯)ÎV¥wfk¸¦®bÝx>Ð(5-î›jïtƒIðqñQ¹³:\p}i ¬¬Ü¼Žª¹ ÑN¿@h'2“2§T,.Ðäï-<Ŧ¤……ü—Bo—ÖÞ§ü¦[=9Èu6š‘ÀE®sÒÞ(µHö½ vète^z¶ï[ù¤àŽ¡­†ñ· °ò¬=_pâQ‚‘×õ7æjõl‡Á9 w‚ÆXÒ¤Ïl¬yuÙ¦ã4ï#_’:Ä ©3PX­v ÍßCª›QfRûýéÒœÃÒê™Ä/¸Ë± \üÅÛrVÇÓ­“M?ÍËÞ{‡áfý3a! ÅEœØ+aÊEâ©.Ü Õ‹((úÖR«8FÀA_»ÅÉ%¦aûŽ_Ñgý>ø»¥-#—K4 Çä1'+H‰_ƒv‡ËAîu•¨&1S8Ù—û¤:ŸŠ g"•7È\ª«Âfpæ–\¡`ÓË— žtFñ´!f)-–«®ƒ¡…Ýî«¿ðÙÚTÎÕËç‚¢kq(ðÚf뼺E¶ÔR*;ªú9×d·È>ý§wÝ7 Ô III7/›æáuºä­ ø×ˆ³Õ+Än•‚ËlfQ"" Ílÿ%D³­Ýî< e1«âjf¤è˜ëHcj`‡ûyGzªT·…ÚÕOIʨÃB)s¤š[Gg¯Ã°(úSÊ–@‘*qQJ¾Ûhæ¤-Æá·˜ÁÖÐdG‹¡| sñÑXÇ/ï 0¸ žèK¨†iò$i&szþ)ED£“û£Ž… ڮ®;ûwl‚Ë4`ÛLîÿ¬úºbœzÜf-Ä‹YÛèÅIY©ÁÚ¾´ix’LÐ9™sA­á BÐ]jM´…Ëüôß !äæ)«ƒJi\1{yªùìY#…n>dhhÎûÕÌA¶ýóäÙ .ú¢ «}RjíË.³ˆ¢Ì¼îÛ ñ4>1F¦L+» ’¯¼E,vá,ùLŠPñ&>“ŪÒFÊdW  2”‹¼þR“|,2·d÷‹ÂHJr§üçH~æÆÔޝÂ)É `w£ðþh­_í«š›§×Ùsýª¸‘PšŒŒ<¹†+¿àLÐÃP]óêŠKQ˜³õ«ÁØ‚0¿$/×71K{a9‰CžqÕËìwñÙ:Q}ŸàŽ ¡8ÓªUÂ2ô“ÌÁñ>Ä_.[³©_ J2ÕÝ!v kËÌúòâ ÖòË‘Ó%îH@®J'Èpžìíåh,ÕÙMWã¹´ûÿ…-˜•÷ú FOb^}QóûT$î%è£96Þ_1=ó¥Åeã>Þ‡²,­!µ‹pöqõ¨Äs¡X˜ï=5ÀÔ–Æ+Ý¡–9™Ó´uÛ誈ŠMfÏᯜ†p}†&z±¿íæˆH»¹ÝZö¥{U”ƧM®¸>¾Ö÷½ä¤æ-C­—°ÌXÔe{ÂzïvrÏåÉ÷¨}ùÔ9ÎÏa$ºònaž}z ÿ¶xßn³Öc¼ŸwªÍuúºÐ´"ÃÕ¬šx¤2YW_6ÉÛâÑߨðá—‹ÈçM0·?Éûx59¡Á2‰;Oùxp„R€–{--÷&3™”V;н7û¸2[ñgˆÚ™bb»&ï•‘¼Í´Ô€v†EXB×§^_QRŒ‰Ž(jA¹ìÝ6Ì;óT¢”0'Þî5Ж7œ—ÿ`3aUt´f›<¤n­%})ê;L“%ö—îÚ"¹ Õßpðቱã…)SÂú/²ÅᛃCþCRŸrþϨ´§»>ütë-ÁH”3-Sô÷"lx±XÊß‚×V²–q·{§¬£Õ'±Ï@i ó÷£bFº´§°îw´ã ›¼IЦù¶÷6?s"jÑ›’•‚L#¨Êý‡Œßèßdm_‡0ë0J¾á4JŸ6m@éØ÷ž¨Méf¦9yoæ%iÇŠÕå-§…;\ÒQsÎÑá~usµ4æ’~ó‹µz„7 Ê¥¿–VêÇÖZüj|bSBói½“'EýNÂZZûWɼ Œ‚ÞŽžs±`dïÿ½žŸB»õìõ,ø‚‰ê‚š)¥a°<˼j Æ'|Õ5$éL ¡sÔ·->Òý}}Ç¢[|¹·h1 ˆZ™H7Î,þ=ŵ“vÉ=l%¹è¢ÎȵÙq÷)¶6ÙÄj_ê}Iÿà2 ;ƒõ§Ý¤Žä¥áW!÷xÅöxFpÉ-r6Í$ÈÉl Èv¡Ùãµ8Wý>çyHn~ÄÝ=©D–}b÷èשöëÿ†³ŠSßoTD‰xE3Q¿#ÓRW»T§ïë´ºõ<Ñ4i 2ž’àdqYÿŠ3ñ©Ì¥®[ýêb‡e9Àªy²ÛÙ_ €¬Q„.߬‹¦Çš©ð‘AÊ)VS„WˆZíŸñâß;Ýfu§ŽâkYùba¶&‹zû$]æî“ CÃÕ,#Ž»mïgwܘ@Р®u\t,<ô/lóÃ:,jO«ÊêÃ{,Ø™ÎxCE’ò<éo‡Š¥ñ–Ù§ ³ÕD$z_)PB„!×ÕŠð™Ò_FG¿ïYá3Ô%z¦‰½Ï$…2UnjLýõX¿Á¯ ‘ˆšÖ‹¡ ¥vÑ6käö° 8™ù /«4é!é§°œ-øÆ` Ÿü±‡Ù\¬÷=Ͳ‹Ôõ;¬®^=ÀÑ–áj²äÓŠv$Þ˜Ž%ådñ+hFÆm~àwq¾x⫦76M÷tùÔ>f5›…@½ò.(ÃK®®[þP×TU<¶…ŠŒ/·ßè@Bp+™ò+"UÒŠÅ_+‹åÆí‰}BþE£m9o+&?åcø˜ýtv0Þ¡4×X•MR¤N6ÇCÜÕƒs*#ÔªôšÏk˳ˆJ!<ð âQkúqh>4³aÔEoSSç,·Æ“ÉÐ5zèšdO/7=\v?^lŒ‹Hrˆûƒw'„üP³9Ý]iÑJ¨“µU47Lìö©‹GîøŒÒ Ó±ƒ†Tóü¯”POÕýŽ“ðzG`Á‚eEw‰.*ú{V#Ãô×Ùðaò·§ š<ÍÃ<±` “6šÏñëmýsßÖzJ©xº¤–¼ïßç¨õ3Hl;iß¼Z #5EO9÷¬hÊU¤ šâã…ƒ\ˆ‚ˆÂLÙüQ­"PI1"à0&UÄcÍ~ˆµ‡ÄgKñnÝ,I²h™Û^L±¿jþÝ$@wøÈe{¤Ó"|v|q½3ïpG,%B¶HüJã5$ õxãºLè¤yþ´«-Êcø¸ °µ’²æ—}°+ÒÙø5ñ?€?\\®B6èÅÁÄÖ|! òiKGç×Gœ(a¹Ê.OØ£º®øP;g•_b¿Í{*.¤ãy™‡½­]‹)ë‘¿‰JŒÇôuÑ€Ä ª8¯Zœö‰B¢Rãe|6WÙ+@˜^Ü¿¨Å(ZtÄ}ýÿyĪ"‚nÀ:NbIfO{RÔc ¤ÏÝmhþ+KzMd×,ÍM®f“-xÖûbóî¬U.eL-彯eŽúÁÙÚßC˜ #Õõӊ9UH·K‹ÅüEá_2õï }ÏEÉ=)%‚‘3§2¨XÍo&£Tja;ÁJ1'nR“"Ø[üž—”–ï›áª<—üÀŠng—hTôÏßkC¨Ùüå<Þª¬o—£T_‘ˆYmx¶£4v߸8ýlO§…tr=E®à JàýõÛ…&­ŸÜÛ$K´öY¶n33OYê ˆä•tw¥Þü¢Ô¥ú>7ûþÑ8ExNÿ¢õªAw•¡ÒþT‚.Ë(E¶ó”çhÙQ ÖŽú"•y0`†%wZd¤ $’¾³ëþ/…»n¾J^@ŸÇñJ˜ù#“Åë>m×A¿=üG‹Ð<ÏÿøHàíä{ì¶Å\9¤f"ƒóÄâß·l®ñlO«‰DÁÿbCâ'¯ MâýjD.¥j\ˆ¦¹<6ëå"µÄ`¼èagHY›Ãþîd ä5q°Ûà–H-i¢PbmË–hñEù¶&ù§Jxè¬jõ¹îQr‘w&ÌôK ~|”ã·ß…Ç‹röýWÊ íAŸ,]Ñÿ$ôt8ÀàG>ß›_Ï'|„Õ¤ÿUfî~ËõprbýÍ‚_¯}¡ef'QàìÁ§Ç?ø8 ¬]aaˆó}z’Ý¡Å5£6Z‚"™ž?=Þ‹½r¥#+32àË'SÍ(ôÈ@É]æ6np(x,æî|V ÖÞJ'†Ëkm¯ÝÇCÂöðE†8,è>aé 85Âö»¡¤vdc[è™÷[Ò;öö67Ò#‹r3 oÚð¥Ù2ÒH)êKky§8À<#¼œ¯eÔ 15 ¢u—i$ø<´~a‰µoÙ¸»%¨×øt@z‰«&q²WÙæ¶ <%‡ŒX– Mÿň‘ü|£êêjä‡lãk=2‚ÄÑÚ³sSL&Ò5Ê”ÀŠª•@e»—ºaÕÙ$Kà¶®âÃüzýI`’.]TÈRŽŠæe›6×&jÉŠé~à¯['´ÀE®ÄÒ¾×Ä,«‘NhÌ…8†ìîbC³Ó`® Íe] Z+Ëù¤¸ÑásÄ«øÒ_?)´\KÍÍËÿ>$­×çjê†g_ØèwIH¡b]½^åþÀÕÞŸ,§é—¯ßJKòBI›mvk Žu"ψH¤¼¾8,9˳¿9>ñGñŠ.mú¦„.1ËžîäÇbÞ¿Êôœ×¿Xtù’§‡éÚ™°ÙÍÅ8ë±+ˆÉkn“³P³'ê]sx‡z¬q)ÁPÅqìÝHð$y»ü‡ñ߀߆íkW39¶›Íì$ûù<‡j«¢6³Óšº¡@C!Ù)qI’8™ß´G•BA¹ýŠèž&gDvp´9ÏØv}0ÒÒ˜êÁ«-ײ_¥º¹÷lŠå¢»|Û3[*5ö½·ýp1μ~ $òOÅAq™Ï!èæ¥^ JûV73NB ÛÍ£²S6pYˆÉ)ïæŠVÿÛn¬1 Î }ƵdcJqÖËÖùÊŸ†Ò®ˆw*Å*çÛ·úœ“º‰}=Íà¬öàMYe=ò+ËpùûüþÁîp>’;àÔpÄäÏpÿcøÇœ\d8øg%¥Iãîᆇê2Ne«­.ŠxïWÆ0ñ.›*ÿ9†q$ ¢œ^Á}Dà_ÞvÞ’En–œ€U¸Z<eì5ן,«ÐuñN²nîGïóÑ/Ï™7Ý9Õ ¶•øÁúY —}xÛ„²„•bÄ`e˜B§¹‹!ÂÌ'ÖBXhrÄ›SM)›?·áMp¨hƒqUžtÒ¦àö}Õ>ÄP,@ØÜQ꫾†ûõW**꙾ EÒÅÑ ›ë>ô@‚ZwÔÞÞ,‹IĬ[qÁ½ÄÍs¦.G÷ë!/ðW"´'–3/pr’Î8W –½‰³ò£íô˜Êƒ£zË@'µaÞ(º7¹¥nqlëJF3v7²¹öº*NÊŠ-àÍcÿ DÜc›ïï ûS¤Žö/Tñ[À5SVxy#íršx-–+Mx#]èܳ’cQ‰¸kûØS²‰)ø– S rðuÌ úÇ™c.Qôt¬/˜æâú¸œ+8y»˜A–›DívÔèˆÙ³Ù„úÅÔYÛç#7E»Nyü"ý~Ff>þ<×p ¨jÊÐ{’Ϊk² vŒ^`R‰LY`~œ¼IøþOo<3_´ðì £ÉH¯(è¶7œÌг9S!‘͸Ê–v—~ÙÊ»•SH_Œª• qC'Õ›‚DMò*ÄîPIÉsò&Ôò|ä»êo@lòr±[¯l Ûy€i”ì©f7±9ïúÜ[¶<§¤È,^4ÓˆÍÕ(|0Dº•ò÷_km¹ñÖ Aú4ÙÙËìü|ç×o@H o_« ÷ÍÖ9íŒÈ+á|5öÛ¸ØY•¦?öžR¼ &b>Ã@ý@'ê­[­žf9än˜;£­—îTW‹öYžy© 5¾,ŸÞA¿ð^§a ÇÕ+*bÖs‹JŸ îk:|AµP-R¢•ÝÚÈë–¢4V_°¹Ø,»&4Pù)É]=)®*uëè“Ñët¶ðb[ÊL§Ý”=°é›Š ƒRH³a euYƒèOYô›ñ-ˆ î".‘;[¥ÅS*úr/Žù%LI÷ö/tMX ûÞá}@ÿš¬+ö@Ôg:E8¦nR#‹OL7¬”ñö\{í¢Fаߣ!±Œ„ãxÍÒU\E=bÉ,B“º íg3ªü­ûHûåEÞ‘äÈ¡­ÙYÇRbé*7ÄÑ»HÜܤÈöÙû© oœVï©­š¹þHíaÕœZK„5Cž~P>’5£c@¥©šªi<¸®»¦ë„v’4¾‘Lâ5¼ m 2ÓY7CêéÛ@ö9ê±oÓ§ÐI_¿“†–”‚¼%gLiÑ×íжÕ8<0vœ£N³x¸+Ë^`]Záx’à£.°©tÓÆ÷ es„®ƒŸtÆ"enûÓ‡Šzÿ¢“>Góf•;Ò‡s‡Œl™Ÿ9«²pHå9p¥ÈŠ|u䜑¥3ÅùDdä ë>º5v*I ?þȆҙéìüþU=¿3I³忽=àb¿GͪêLüG»úMb•½F¯h­)‹\ûi¶ÊRaB|UÔVÿm€ƒA;³îˆ:•}ÐäS¨‰Ó‰½õtQkáGIœ°-v bÝäîëp§ýÁ#8«ÐpœÍ%oú_b§ôªm<#]®'eSÚd™1Gµ¸obÄsÐÓíˆ>ÐÞtñÆ#óæ$jñWÁwÒ~, ÿ~ÙÜÎËÓ{ê…®¦Æ×²YB ߸㿤ã9pü§HØí„9ºZ¤€/ÜF¹Z™•ž•ñ„«â9poº}n ”dP¦oåVtz!°×>>~{¤‚•îæƒÐûÛýRC~õ°òÝX&a¤©›öh\±ƒ¬€Ž27ë"ùPŒT³N¡ªý´üjݬQÒVI!ï‹CÆÎ6>d)Qºß­µm&,°ynkÃP·`¬áçÉþDÖl„;zÿ M‘Á“üºÓ»Žz‡ ¶Š€~ŸòþKøöÞH´Èc®j\Éü¤aO´‡ ×ä,Á~Ä)á LqŠLÅ2ÍP>í5¾ò¨<†èZŽtË“d z¥ù§­Yé;xãÑäíFÆÇ3úÍ)ä$6&µ5§ì‡Ï,Ñ–ãx˜g2È”ØüùP}ÍPƒAÀq¶ˆ` Œµ%êõÂÌ}9Õ‡åo³:Æ»#ë!}½ùÉë4Α Gp1ÔíÈ"nqBjé üCÇ9‰(Ü/ßb¥H2L™ç@µ\ºÉ/[Q¤jöì¶ 7SçýIËJåè«Ĭ/µ½ŸúóB%R:jùù²>ù‚ƒ_FF•ൗ 8;ø­Þ°EÅNœY?^ªï}Å‹Ú( Ÿ®¬Oò4ã¿Gì_Ilu2$©mã· P–“-Ðc„ÃÑR`Db’ºz Åp¢šk1·£u–Û^À„ký fLÚ)è¤R$¼tC´ÏËìH¹J²ºÑ2h¯Ó#²ÃvÛõe7€!^AâÔ÷KçH$9ssÄHˆg5s±ò&=»ÍÀ|êÛ-"¡ŠÐ6Rð5_«ðßÃxIb0o“¾~BöcµO~IÓ)#pÉ+E»·fHÍ­d-$½Ã=Ý’rȼlL€ý±ÖGj¦¡}5´>÷ÓûÇ‚ Öø;¯óPΣ¯„…[¹ /ÞÆymZ îá³#íýãÖ™PΉA„$mÎ)Iœ>‡ïýV0ª¾Bâ9Ÿ“òë–p‹lð¶²ärs»ã£P$ÏI‰“(Èq‘¿¿ÿï•aëîÛ'“;SÖ¼€^×Ã'éMÌúŸ/S ÓЉIÕ« J¬S;£îr¼â¾\Ø€4Æ0<}2?ï$2íÉGÊÔ¯k8¾›ÑHÊÊ2?fëWà lrø&ŽtlÿÔï€ß^ËÏR-…ªAoÝíþ„<²[™u‹]çÄÚ¸ÿ÷¹‹Œ$ì„wpê‡{*^ÜáU9hY‘—"õ±K¿æbdý‚Ï |Ó‡Æ+xª¬+–1_Jyc§ŸŽrO^ú%çyj\+}¨WCŽ„©¿öy@íõ¤ öp®E6ðP#©áñ¤¢õe‹áqKÁ—¡QfÞ2Bšµ;¥.ðr£ÑD‡UÎÜp‚ß}™5WLš[fÚ­ E`Y×1yàíž&0ô8aâ#TêAŒìßÜ Râ÷Z¶÷³êã6Äë÷ã…À—â[êí!DMéƒÆ¸/³/Ýaê´S1÷ëÁù<ï1ò#üæ£IØ––Q«bzHû¢£ª•'%Pæž ”8ïA"Zá·hůˆ—lKNt´:Xö:'ê‰X£õØuDŒµz»ëHYfŠQ—haT*0¬1ðvÅíf&ìÙîÐJÓçbé1Œ{«­2ƒW´ñ îí•âFhªÜ¾º’WñìA‘ç%Ê <¨ší M#¼Ü¯¬fÀŠpt—HèÄõ¹¸{„èpBWZ[ Pe#UßlÆÒÇ…±Æ²é¹·´rf´¡Káó÷шûÙILìQúb|€i•÷ 6ñ ã×á· üV¶âEïrx† d23¨§z ¢>_7 Ô…Häutx°W ®YéΤíó¬=!5L°©†#p]êúØœàŵgvË]Cy »\r¨§®b›%âSÇUUT b€¯¢¹un–|$ãTbÍ–ûXóJB©ÕšÖÖ‹³Ä%fY߻˥i ‰ÙÁÛ®½æQ²']Yß 3Ü!Щò_P7)œn¹T‘íÀãjZõ{‹³`è½Ò§{$‹ˆ¥ª)8oö°˜2l+C…8ꤣ"2^Íû²»ðžÞézèrŒÁS÷ê¼J|÷ašt´•ü‚µ¨šžFùƒ"Â&kø8½ïµÇ£qÙõsÞ–ðPìHýËžE«Éö¹4JÛIÃŽ·P#n#˜„fâþz© ¨cvü]‹íV¸—xïn´)‚äµQîÃαþåqÀÈ#,ÍS?‚1p'¨|0¹ÁM‘áJÓ¬’x0C\'ú‹¼uÀL«E^«=—JoO¹œ‡íC_8 ‡C‹K7a½e¯¿Ù$O„Úá…ZêdW@TT^4”œçVÏ«O¥ƒù†¨´ÕYè4ï3h3—‰ùlXÍ_³¾\°oeâbu ÈÍú‘íëCž³†ã¿›ÄÜNr¢ÿêÂ\ œ…«Ì‚ï¤BÈ|í°¦Â4,“=ÔaÊxmú>ä::êÊIäó¡Ôåž³VÏÆŽ¿µ2äØq²¬†’“ ‰-×Ídz®©¤9ÿûÅùÓË£çV8ÜmËŒd÷câTÃ'÷sR){×ó©´ìðE±ñ2ïx–~91¾W®¤¶¥¨ÍQ¶‹Á­‘áä5¸˜4FNJ’1΃˜%ÎÍ@qÞ¡´Ú ØŸ?¨Po&ˆ%VOo Xdvо=>…{Âeûk™éTd•ä¾?{;Öí¦ü¡Ÿ¸Mùj+qtÍ1P).À=té±oÞUæÅ†°æÀ¡‡RuûÈòNïòk¢? –?z@ÃYß3¢sþ,_o`¬´=MÌcr\…¤€‰Ã=‚áª|ϾºVCvÂÂXÚy”Í5s—"Pœc Oˆ•¿6‡»Šºç;^B‘Y”Æé‡kzÅqÀnð×ìYÞµ(®$Qj¯K¹E1ùÄjöSC…?‰fhÜîGX™ÐKÄï½ÉÔUÒ´ŒÒ=Ôä ‰Hûø4+ƒ¿{•/ƒ ‘\ÂwÔ•›øÉ×ÂÒ"ʉ窷æM(°Ù ßœG É ú9Zc–Fe96¦Û¾ã<ªDtíR*Îåa}ÁcDŽո¢n%kùlcîº;cÝŒ°VƒM÷øFú2ã/üðtð8‘mè`ò€`Ã;9é…Œò–"ÕTÖ^nlqÂæ-¯ÔÏyë•¡mœ?ìÍíòaùôø¸Ã››ÿ²ÀèÖ^äùË®Rµ_³»áÀŒ:½fŽ‘`„šòà4¹æ‰$¥a·Dšì= äu™R!h1ªzÉ^xùÓ2Kl‚Žž•,Ñ^WÔuCê÷S|ödž€ã]ñoÀ:qê*·Ò–½ZóAçìÝÃ8`oàPvI¿vÊorÜÒ²—2ºëQÖWyžgŒÈFñ„º®•UÄ0ÖÄãÁ¦a“.ZŒM=¬´Eâ°¸w*­„e„¿Þýr Ñ ¿§úòÃgŒp¡È¦ø.´HhŒŽšl–ŸL¿¨…™urÎj¢(ÊÀ¨I–IW~¾ãlVlç›ëíÂÞšyu%ò´¥"Nø-¿­Üéùh/8C¥ëµ\êJŽ¡â÷ÈKc”àN¤¶¼šÓDÄwrJosÙ+œCX÷:?ˆ/DR\"UQ'¿œªõ'wÂÖy†"|±”¡ºf4(«?Ý©\5š5;J®1ùKØJœ i”ʯ²r®Xï2Žeµ|3¼›×[5ä÷Ò¦šÿ²z GW=R—+J(ñGðü*𯷣À8¤û_Âî/ÆQ%–´-;r¦¸bc†+Ó²ÝC3u†ttúÀ§"áÙfQ †øª ç’ [×2ˆt¿+€ÆÐv8òa¬$Ü÷HSÅÕÏ ‹bÖFˆÕ{ž¸5£ù–n¿s"<µšâ¨[É.âkHJ@È©˜­£! ú•Ù œa×è {_GYà þyÖ;˶"~AX¬ýA‡ AýwOe%·ŠgûPQšÙ$Çó…ªÔ‡Eê.X¿œ\Å‘H®Õ)òiOì‹,0•*MÙ"Sº„l»ª-gÖNÂ]¹ï‰sÕ“åXLÞ(¢sFŽ×q<òè†]ì(^ ôšÓæÊNCБ߮A¿ÛrK;òËý%^¶•`³)·î¡K¼ßÐ9Œf:¹Á<üx˜Æt¿¢ŒÑÈRļ™[îÇwõ )SS,L>Žq¬ÆÚò4qpM?¹-ä”蟻÷»p ämš!ùÌkòQ®1ô4ÆkÔ€ícµ,>Æ¡0=ežÞ3 Õ=èP(™ëÆÝ¦UÞ=X1à0¼¦û;¥ÿÔñåÏ~ÕŸãù‘€‹"r±råê!;;÷Ö¢|Ê;ƒD{ÛD­,€àLõãhR_k›¦±¤\,Ši1!ÈÕÎh/.îG àVŽý„ˆúõw`©7"ßÚ„‰ïIcòæYx­ú¸¹ÉÈÙa€¹+<„Ç%áõ¡5Kdy|¦Æ¨|••.]h•‹dBvÑãpjñSÊ'ŸoŠ×o ŸKä“WOõI­j¹ Ô.WB@تV}þÆj> ÚùŒ‰åjF’ðÕ…±>ŒŽÔ¥€î‹:3;cÔNe¢Å FaZüUÁfŽ j°öù¡uä±V‹´p÷:›«Çø'•­”põâh‡AGpÿ¾œ†¾Ëï1Úo)O®ØäùÊJa‘]/q”­WÕ¹àL#w­Ô2o× HÐËù´-ò†„…ÙËÇ 9Ñ’ ád¦qÕà&…Eß¹ÒUZ{‚ È|T´á¦ùU>lÕ,dnxŽaëéR Wª]xÁ攸 Y”÷‹Ý–‡ryÊ´\ž÷ä}ÒK[>i·iÓ ûÜÚyî:R4Ÿ?è’¯å¹tUêo‡Í„bY<·vØ“!¯=½ÀÁˆÚ%¹iœÞn (Ë@`ð›Ojl+hp ÁN¹þ(þË^8žvmDõõ¦º½ô<Rôþ´:™iŽÊsÇ×ë“ÿ]8ëþm,ý ˜jó‘„´à¿ej-«ÑY0 âýºUž“¯lºÎ!vHE«†¤ Y0ÍwœgÔ·-ð?èÏH$—&!Þ_/CêõÜF;0+áô½sÍl[ÇMw@ÈÏz³ô¶—¼At>²¾Uâ8ÜÜjS§.cG¿V>j5÷[Å7-Ñù*áv>à´yg€Bp“$êÞÎÍ…Ú«ÄVÙéà=:tÕÍ-ó ñÛw¦§U¥#Yô”,3›ÛnÛªÞ>aML|6ú+&¬Ëõ Wøšr9ìbxi®Æ(çô¬ ê/~-Ü‘òYl•Jœo­ÌAoHCr!µ ŠKs\‘ÖèÒ“~DT°èÑõS¸J5Ä>ô—õä)Öà…/çSäÜiooùc}:Åí(°øµ[ªº¿è骦rE Ñ{a[‰Ïî‚•Rz¼0a\›W%p³žfu@L‚0º'9ZȵDO1†ÝáÓœÞôeh©ñ( ¨J¨Ï‡ÆR®´\ίѢ“8ZMJZX0p“ÍÙMa7OôëV>êa#Ö¾úWMà®l4RX:¥7h#Š%õpïð¯_^¿Þê˜ÈZý¥3&ãæ(VYì™ÒzqŠÅ¡Í|Ø,—¿é»íö‘*A¡qìX:ªJÅq´•¬x²u¾Ôž³* ¼°¨ŸÒÑËnÄ61èâhiªj½w_1áÊåJ ¤ïrÕ P?÷Lqz›(®‰zD‰r]¤äö×—…8 ZÝ^‚€ÞŸ&ÎC×}Kùu÷t†E|y<(‘[Ï¿|cˆ²é"['!Ï_»Rº-¦¿¼Õ>ÑB?«ÀV$µJ`#^âncÅ(&1_ØOÇâ>דÌuexGY空Š.Ò¹rVH?ÎìÛƒ Jo.¸r[ùA¥“L–Hä¨ÀÑg8f P*ë øî+§  5ºô¦n娨Îïx­$$!×9|Ê÷bö´»T»;„„ó˜qóÉ–JøB zªÒ¶µnÃ] Ð+F§àâNÝ1ÓC…m©¤¶nóea„Kæ¾¶ð‹ ÈÞ°Cd3]fWÿ‘d•Ãùª]‡¢äUBŠ-HŸpªà;d9 n0”é%÷_.¢šDÇn»PÖ-‘ýxÃ\ô»á==rÚ¢Ž»²XEn(8ÆA«Qáe%”É/Y/øÓÆñyàgt~Iš^ÌõÁgS¿· 2ýîdŸEÌÿ­‡žGycÈØ‘bTtï˜OÓÖ“iZ=UÊgˆ’ýŒý{š;è­ª¿bg_oeß_[Æ5ëÿÙÖÅs°Ö!tHȤÒRbÎýôƒçuXš@nÐ?‹8Ü|Gá´„ÝÿY”ô¦ #È^Ü‚6ÒF°Ó樰&ÏppÎÑK3@æÜ4þð ©¾p.ô¼¼s‡pçoGÿØIaN$ }ú^o*ª²QÔA%F䌿VÚ6Nî1 áËo¥kÎÞŸÁ˜¶m9Õ{#ìÍ4AF“ôNÂ,´3[ñž ÝØ‘„Ü ö‚Ü¡‡cêrÛlŽ2úª-Iù='µ9Z·Q¾[µÛ0É¥@çuR¾äŽ7Ÿäx¿3~ïÍ™*ü/q*[dnð+Y=ŽŸ½žµî4N_„g!åµÐ; ÀT„© r’÷›÷LAw.aÏì˜ì£ó€î?Vé½³ž(±W“g ¦Ñëî`0qî<¥ý¦øÅv<œ—Ñö,Ñ•BA+UÕPXt”?!}ô/òÞRžS= ÝFëúˆmܹ-)œ&m|¢ÎŸ[v­ÛDîe$M}MU¾­˜‚1(3H‰q‹`³å‰)¡·}Kà7Sâ*[ê!fšN犰p¤.°0òaŸÍ·\ÿ‰RðÄK/¢UË4faôþxF’RJâ‰Øê¸R^j#Í.Ùos†¢*Ã`%|]PkZ(0Þ+ïVº5ˆ:á ÇkåJ †ë Äd ]½$,­}Ÿ• iëªéøGù%>‘­LµjÅ ¸bÑá°FaåÈke¼ÿ¶;=îð<]ýý·Ï,s-w Õ_÷}/jz⨖¼„ÉÞ ã$à‡à‚†(B~aõduÀfÌfÛ‰ A}õ‡Ÿ[õÕ+›Ê»H-¢97/JòÜ’¬÷'*5Ïb,ö%ß9Ù³ÐDM6È·ï}³÷ëWß6\í†ô©-Hx,!”±: –«2àžKŠ …¼PŒDâ™·Õh½|à˜!'Ö…;À™ä7Ê’¯hæÿq¢Ý$€y—(Šú@v4-ði_D"AÈ—P2ýsRžêU”Œ§~†ÃöÔèu®ÔÜÅ7}ZÎÇWä2@Æ;¢Œ©#¾µèŸO?ÊV#šÐÅz©ÌmN¼~ÿ´'IoÃmÕÍêûZ!ÝC ˜ý€”>Ä{A¦A¢ÂW’F’¥’Á®¤—ß§º¤oŒUbj0ý]/ŸF ßúƒBÌ­'{¥Ñ[E­­[å÷;×>µâåüÌ ˆ;µ¡µÕÕiÉ“[ ç¸/²Ñ´Â¨ÜâB6ö]+¿õo£ög¤Ò¶ñP©±ÂÆå kod/¯Û… m~ý•_…‚8O“zš2Ý5ttº“Þ|÷íä7í¸>„éÛ¯üEùQü>e4½XðüRÂl¬5.·¬äíaôøÎ¿¾ dä„ÒÊŒ¥ñûÈ9¹øÂµ¤ Ì e‚†ˆ'éSú¢»CN[ÉÌx!õ©š08¬ñ:ø~¥Eä¡éÝÐéSóœçþ¢°g+D3… :09žO-ërÚF“÷3£Kú‡)xeÜNB‰O4sîí`Cèþ,ü>WFÁêÙn"ŒÍ ºgKÓïÃÛ{ÇoV·X£‘ÔKÖé:KeÁ± Ú˜ÿJ˜ $þ°ý¢ø7»;)Ãû-Þ¼5“ímðè‹…2"0¬¦ùË‚ÖA¦~`,: @¦•¬reSŠS°MÒ+T9TnŒNù`p¶Di† ‚ºO·;BOhËXqPj‰gô…„ë0ʤÓßá@åb/‡7¸oMœÿØpq2â±[湇Ý0£¾„3çßýäÖ*üŽmßÏÖ²ýéNBS·UÒÈéõVBȉ“2*$Ãn7Ô[¡¢à4³÷IÓp^CÎõEÔzøiHDи†Ì:˜¡Á¸9›î¨k¡ó¦ŸÕ¤ï,í¶põ¹$žh—äšàÆ=¤šÊû¿÷¹wÜ]Jg6n“Ç·ÒÏäaèú¤Ñiœ>lÝdå” ;Ïd!«hOƒŠ²[ÏnÆÓ©=â½)løe‡…¢÷LÏ(j»'f¤^—%ðÞVMqÏQJ ˆ¢úËœ`wÙW嬓T9´  Žž_ÙfayôZ!ïĸ. l,µ×$Ãü2Ý[$dL¤‘L´ß =ŽÍܲá;ª–}vÔ«Ì$9 ^É;$ ®\EmåÚ%4¥$¯Ø~N`Ö.±«}Tâ>b؇TÀVç~ölI}™:ö›fTJ<¦™ß²íîr"IbËrÓNo{_ļEïÑ$ ô¨z+ˆ5\ª?¼ûßaY¼rÛD‰¼¢yP~¾g±hÛžk>áà$ä.Ëj·æ øŠ›ð÷_ÉSÔ‘QñøOÑ_™ñÓ£ÆfÄÀ!‡_„©²UFfsß{þý:° #”—Õ®úoxpY4ñª­›jQQ;®sIÌORLCà6¼ÜÚª½ÎÖv¼hüj Íœ/nþ€|ö«]‚ÒºuÜ¡Â×à%¿ýdŒÓ[‚tª×ÏÂqÿïë¥ vÖÒ)'´×“»ÃÏJìCLغ¢z4O+K'U¦÷F¦chÌÚx Ä ñÁ®ñ2¼½§s-û‹Yx¾ÈBf£Ú£Hqf¹—±x÷™À]1  Ù}>Òô³3äñ4±y‹oªè Ü™ÐMÈý’©^»Žqœûˆ^ý¿«–¾×2c~u¤#{ ¬÷ d¼?°•i ‹TÑbp¹Ec~P”{[lÄ8<ôzõŠwq"{“‘.“Ódçe?’)_½yÆ5¡Hƒ»xDãïôÈf|Š«½mtö7†ú¡°‘uº˜ïüùÎ'Öl} äè§m§Í¸™& r¯yøR”‰Û)“ÝÎÖ /p¹¦Êìz‚ÈNî6;ÒÖ É»é6‰úþ íåuÔ‰ 1Q˜®PŒYš{;_â®J‚c{wËä6×Í]@ñ¾ÃäÖú¾³Þê»W Þ'p±A~,r?…>¡ÑÑ*.ÆÊ#ªxá6±|ç¶š) aºTWƒ£†K ‰Bþ@Í" ÀŠüoiñ‹ÈâvtØsŒÔéDüP[%ç„á]¼ì ™ÈáõWIÈ2ÖMþñåÝJ2^Ìf+Ïjpßo+a1º=•ðÓV?C¦xëœD÷õªP¨lÐN ¸¬‚x ¾ìEñâÂSI*,¯\ó€ò¦†ÂLjé ‹,Iù’Ó*ĨðitK$!‘^Î83LA‚xž2Ô _t„À3Õ—À‘ G¼7dmK_ŠF½'´n[¹»„ƒµF3Üži> ÂgºëP v>ÞûP6ø ÐÇ12ÞwO¤d¹ßâ¾IK;0âš Š­&65~Ñfbr»±¡äCƒ‹áš&Ž©jdnÜY€8Y…$yk‰¨W°%“SÐÂV+9¶ÞƒƒË¶ÊMû#Z+v£÷”ÐgñoÐæQq&ÈÈ(ƒ½’18á'šÇæŽã“ï®L ïOPõ@E’ðhSÔñpj?aîðÎn¼ÿIØwc°äû…—ùÅ$°ÆzïWÀ”Qïû_ºu©Âx ‡¨et] èÑõ5Ýþ Õt»WµÑîÅÜAìAŠ£2Z¼ +g]F?w×'Sx|ë´f-Úò$¡?ßFé‹´ÌRˆñˆoW w 4kà˜ù’ ëÅòÌ^Ô¯ˆ©mlc$Än–I²ü7µk +­²Çø¯KáÊYxÙÛšEÉAiÏŒ0-=OÔi_4EˆŽ‘§kÕrÌL>Øê¿ò–þŠŽÓ2'î ˜‚íôœn¸9¡ªúË‚¬Û‡Ô¡@— j`<ßè¾ç-ŠuQCÑiÛ),ƶ-“RÄÏùnØ"l6*0¦(Ž8QY7üT^ʸ£)˜Ó<úø“9Ä8DøNãÅ5OÒ«ï¡ >ô1¶gGéî,“_gÒUkëKA‹<¨ȸ_ƒµ’Ê™ÓAÅ*fvM°»t@ˆÙ1YÈÏ1Uƒ4à¿ÔÀ.Z°o5·Q÷þ¦O?áCO85p3³M‚çùž”½Dð\›:°ÝÐÉ[%ó¼}mÁ7u‡­)ÚÙFPõ´þTòç£äɤ¢×æÄ2‘÷ÙA‡rõuV`a¤›T]YM ùÈ’y9œë)3Ñì»Ý±…¸Ara[ çÚ~2O“8º|VdDIƒ)2ý³?О9{àj Àn”oðgs£8íä㾟Ȭù‹ÉᯠA/À½sX“$6½ÜC°| Ù)h.}é‡*ûm›WémïùݾJdï!ÑA‰÷ZdÒ`z¾HÆp"˜ ³hAÖ3ÜÁ]_ÓHL¬êõk¯Ý†>>®d¶‚n××Ht«¬¯(Ζ"±¸Ô4*-ƒ6w_—Ð¥YÎB3ŒA/°~räS°™ÆG$²©ÅeíTGI®]˜Ìš›uï˹ð—™ú‡OÓɾ«Y|æëB_“ô¸5`Û‡÷Q‚§UÌ£Ýݸpve¨¾ @ìal‘å3·Ê7~Éo;¥áù{þqq`lÓs…6&ýF  ° °_N¡ÓdK*¡Ý,l*Q'€˜c ÇÜàeÅ…„‚O¤-ðêµB|@˜Û 'Éf´l‰§`îÛ“¥ vu¼ì̼Qê¡ýè,ÀdñÖÜà+Çoüd† ùúÚ†x£0O¤–åÏì.¿© ÝàyIe1?÷ø@+ÛêLàcã¾Àª3ö¸ijÈÛÃ8ª/Ì>Ä[vêAïk6E¿Ãî_+ïïv"q–ùØ'—‘š"T1æh;³Ê»qßøØ¥yÑt²?HÖ;ájœƒßñÿ®¿Ó>œ¢“¨ÃæùPs ?\i†ë.zt0{m†¸H'Ü-!\O•ºí#× Ýçk“‡Õõ  ÛÐèÖ˜Š˜.}*p³·õø¸ô6&Ý\·8]õS«ÛLæ¾K_—}¸r(™ÎFÃЪƒ1C"áiyƒ¸*:k*åPŸÆmŠVô÷IUqmOÏÚ4@üÊF7—%ƒx4?‡^sKõÝΙl•2™˜ÍKBc^ó¸Î*>ǵì8æaŒÀØÚµÄYvô‘ÏÁõB¶ }dø"»bj ?4HÚDMáMâU…2wÝx¯ªø*³…¯ÒÈÿ¶·¢^µ¡Y6¬¥?Ê[j$ŰɈMµH•ÍÆæLO0aÒêv§´÷°O¯¬Í?¾›ÎzÒ£zóôL.†O¾„"Ôa«U<ž!¥ ½Ëmß9N/€ùJ,rýºvˆðɾÈÜ»iÊ‘°H#Ê¢ýª q!2QÒGSüzŽ&(â?[¿Ë®ËaÊÈÜÆ¨ÿÊH='˜E JòW˜v?[NÅN™Ì%Ìðž•Ǹ™gïðàõvX;øÿ¦hPnŸëF«;ò¨ÍeÏévN™˜±ÙrÊÏ'8×€LM/TU)0o_»ét95uLŠUÌÎ5þø »c¤ $„Ú•ÇwÙ«0ÞVðqì2˜ã3XÅò×и–Œ¤ßr{Œ|~W6·ü0lší‚J~£RÌòbnêÕ E߀·\ÙXËB ùsJæ©Øp¤9-bI–/»]b?_8]N:I Cœ¥ÉUy8abªÔW@€ª¯Ú ¢ÌhetŸÕÜê©ô{Ø8ñj!ᣖéæ÷XÔõ ?÷ئRW®òÎÞl« Ú›Ù­Ü0Ëz‹5Ž$zµÁ "§#ÖË]µå™|²Ñ«Ý5ÈØÖNÁº ¨oÄ ±¤VÀ=y¾c¨p騂Â5• ë«s;ZP­°|5½Œˆöý4´–ᧃå©›Â,èô)¹¡ÚŽä:Ï"¾ß™²ë±æÑ«’ Âã FŠ ò}”ƒQÕ ruRdÜjÝRyÊ*¿'º“¦#òäyd Y,èLä.K’!ƨÈFcæ¿à‰uhÝX÷L³ßž £ÂkuD¨IseP{5øU†¶U¸fGÿ÷9¬ÝÂþ6Æ·æÊ#0J‚·‰E«ŒõÑQ)¹uªf+‰½èš‘·©]àJ;´ð€%qˆl\8ÐZК;ã»)`‹ò+p¨*, cƒL–œðP¥¯< 3G5Žý°9Ãà¾ý±å!x$: Þ]È?ǨT롘,çÿeçP¹Ä݆ݷÿJç·'ÓËÇ ³i-$|®g}™{UÚy¨#òNôMØ%2m]ö©À»•Fë(áÖÛÛ,Á‹£Ôc«Ø8²AœŠ-æ%(%úô%þ9…/¿´Óyins¸Kš‡dXõ&¦#¥ #Š! Õ»q\3Ó¨´ƒR,-ƒÑ‰RÅ_§IˆQ2«k~m·”±Yˆ¹ÕC$ØÝãgŠteO’Sиµp;ÐÓ[?~¢”ýÙ´F¨ç<Ë?ÛÙ€Â9Ly(´Fé­8†¬Â¶Œ\L*‘³nÌTK}ˆluÚËR0Žàïê^?¡(¥9)÷´•8–½Ê† ¹Ø¾]håÎ8'šJ~-°ëú ÍlXp˜òd£Ð⟄ȤèÿP:hè+CjKÉVë<òË:ºs‹9€Î²ˆ”$–‹Á ²FjÎÛßUêb<*:ycÖWÎщ‹#×Ë™a‹[=Y†ZÃâ‰ïõk¤ÅØZ’ŠJ¥3%Ù[ÑÇtðÑÕb‹¡ToFCàôTÌjʘÐ2¬ðXrÚ•©"K‡\|/É“ÖU!§pæ–$¢,*¸d»ÇOIla´BUÄ Q½ö ¿§w)mY«ö–OﶯóõÜÍרû^à mÈ;Ø(ö­êÒBÜ nr±¦”¬$ ‡)ÞZ2*×}„çô¦%p¡xð©ì Ó*{‘xÙ¥DC ÿ0âåpÛ»džUK9Tg~à†Š –i ..$ñRöð©?k±ë$w¤ûóÁR–ݱ:= ÷qØaŠ…ÞÂ6/ˆÑñ»N‚Ÿ–ù¾–[S!£»F7k•& ‚Ï4M)ºd%Ù¸nvG‘Ö™xAQ¿&ÔÜ[̈&øŽ<«³qÓ4á¢õö Rìp8@? E÷ %騴žÌ3 ÙV=8”±\æ)æ†ãºå”åÂQ/y‚ê¹_Ô<Õ•Øì_ß–/^Rwä©'‘x½˜Ð‚ÎÕePÉô%ÀH®Á5õ¿A& êtü˜L=¸Þª eÁBkz^‘¬_gâ"^üÝ)|ªüú=äbÓ ‘Ô&÷™G]®ÓÖã±þ’=<¬PX#¡ç|æ°| .þÂ4zŽDÓÅÑ–7l{~ÜçɾÐQ¡‘¦?«Bz¹0ÁoQÈÕ¬[ÙÐbàà@‰5]ña”PÄ P¾Ï7½É¶-}L·b™!Z7³‘ÏØ2Ö©Viݹ ¶Üðdªp£Éåäp“$o¹VE‚Šuƒ_QÜÇ«;6 »<-ü“â8'=ÄÉȸÿ’2¿‚?ý×£= ~ pò@ÐxýõÚýˆ¸–)°'Zô"ëT¼…ê匭¼+ՠ¿åM‚ª#ê¯3BqÀR>1“ÖªKj0¼Êbí¶bÓ “õõS¢a,Âê}¡Ñ‘˘'íôA6ï5ŽÚDFIŠŽ°˜ZÎ4¥kÌÔ“78¯?2͈RY𗣋TCã´@ŠªÀ•)@5EÜv‹áöä´è^Âð”«Ôíxb‰Þí=Jv¯§\=eÇ<ø³®Ú™>—(›ºAgXÕaÖÜ#ó¥§@¦O䪨¯.ÿð£ýŒ ¬Å¶©ðêèƒ3Y¿kïÐ;Ù1ð[ê\Áâ¤ã¤†„SW¢V¯‚–qit[ÎE’´PôäZŠÄ{÷/€,é>V)H°Hsó?‡#@´“ T©zâ^œtgqëºÌåÏ¢‰aæD,T_~á ‰ÊÖ{^~š¼ºÙ4g.:b+ÍåA¢ºêbùWÁ™ü>ë¸ جŸZûaÓX“¯º¥ˆ* )Pù¬Û¸H¹×d€‘[ Ù…L)éôì5lmA€–êÑŒ·fÎvè²k ñºñçž,p¡ˆü®vEÃUÃ÷3¶ÐQÙ7yiÀ›¡ËŸãÇánE)‘!&µ%>ÿjÎÍ£ÃÌÇaù×ðÇ^·\hT•Ž&náÀ²žà,#‚ùšÇäîJb–¤ÿìU/=¶G¤-;8…r#þQ £Z„±Á Z0K- ü•ÿûÖèæô.`z(º¾Âpκo“¸;¹Äw‡™'4¤ð´oÆð)È,̘[|<„êeTxÿyè«æÌå‘쳜5:€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/s050000l.afm0000644000076500001440000002272607056046554016417 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright URW Software, Copyright 1997 by URW Comment Creation Date: 10/21/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName StandardSymL FullName Standard Symbols L FamilyName Standard Symbols L Weight Regular ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -229 UnderlineThickness 46 Version 001.005 Notice URW Software, Copyright 1997 by URW EncodingScheme FontSpecific FontBBox -180 -293 1090 1010 CapHeight 673 XHeight 500 Descender -222 Ascender 673 StartCharMetrics 190 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 128 -13 240 686 ; C 34 ; WX 713 ; N universal ; B 31 0 681 673 ; C 35 ; WX 500 ; N numbersign ; B 20 0 481 631 ; C 36 ; WX 549 ; N existential ; B 25 0 478 673 ; C 37 ; WX 833 ; N percent ; B 63 -7 771 673 ; C 38 ; WX 778 ; N ampersand ; B 41 -13 750 675 ; C 39 ; WX 439 ; N suchthat ; B 48 -13 414 503 ; C 40 ; WX 333 ; N parenleft ; B 53 -172 300 680 ; C 41 ; WX 333 ; N parenright ; B 30 -172 277 680 ; C 42 ; WX 500 ; N asteriskmath ; B 65 127 427 546 ; C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; C 44 ; WX 250 ; N comma ; B 56 -120 194 102 ; C 45 ; WX 549 ; N minus ; B 11 239 535 294 ; C 46 ; WX 250 ; N period ; B 69 -13 181 100 ; C 47 ; WX 278 ; N slash ; B 0 0 254 673 ; C 48 ; WX 500 ; N zero ; B 23 -13 471 686 ; C 49 ; WX 500 ; N one ; B 117 0 390 673 ; C 50 ; WX 500 ; N two ; B 25 0 475 686 ; C 51 ; WX 500 ; N three ; B 39 -13 435 686 ; C 52 ; WX 500 ; N four ; B 16 0 469 680 ; C 53 ; WX 500 ; N five ; B 29 -13 443 699 ; C 54 ; WX 500 ; N six ; B 36 -13 468 685 ; C 55 ; WX 500 ; N seven ; B 24 -7 448 673 ; C 56 ; WX 500 ; N eight ; B 54 -13 440 686 ; C 57 ; WX 500 ; N nine ; B 31 -13 460 686 ; C 58 ; WX 278 ; N colon ; B 81 -13 193 463 ; C 59 ; WX 278 ; N semicolon ; B 83 -120 221 463 ; C 60 ; WX 549 ; N less ; B 26 0 523 522 ; C 61 ; WX 549 ; N equal ; B 11 142 537 391 ; C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; C 63 ; WX 444 ; N question ; B 70 -13 412 686 ; C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; C 74 ; WX 631 ; N theta1 ; B 18 -13 623 686 ; C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; C 78 ; WX 722 ; N Nu ; B 29 0 720 673 ; C 79 ; WX 722 ; N Omicron ; B 41 -13 715 686 ; C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; C 81 ; WX 741 ; N Theta ; B 41 -13 715 686 ; C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; C 86 ; WX 439 ; N sigma1 ; B 40 -222 436 513 ; C 87 ; WX 768 ; N Omega ; B 34 0 736 686 ; C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; C 89 ; WX 795 ; N Psi ; B 15 0 781 686 ; C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; C 91 ; WX 333 ; N bracketleft ; B 86 -165 299 673 ; C 92 ; WX 863 ; N therefore ; B 163 -13 701 433 ; C 93 ; WX 333 ; N bracketright ; B 33 -165 246 673 ; C 94 ; WX 658 ; N perpendicular ; B 15 0 652 673 ; C 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ; C 96 ; WX 500 ; N radicalex ; B 480 857 1090 913 ; C 97 ; WX 631 ; N alpha ; B 41 -13 622 513 ; C 98 ; WX 549 ; N beta ; B 61 -222 515 740 ; C 99 ; WX 549 ; N chi ; B 12 -210 522 513 ; C 100 ; WX 494 ; N delta ; B 40 -13 481 740 ; C 101 ; WX 439 ; N epsilon ; B 22 -13 427 513 ; C 102 ; WX 521 ; N phi ; B 27 -222 490 686 ; C 103 ; WX 411 ; N gamma ; B 5 -219 484 513 ; C 104 ; WX 603 ; N eta ; B 0 -222 527 513 ; C 105 ; WX 329 ; N iota ; B 0 -13 301 513 ; C 106 ; WX 603 ; N phi1 ; B 36 -222 587 513 ; C 107 ; WX 549 ; N kappa ; B 33 0 558 513 ; C 108 ; WX 549 ; N lambda ; B 24 -13 548 740 ; C 109 ; WX 576 ; N mu ; B 33 -219 567 500 ; C 110 ; WX 521 ; N nu ; B -9 -13 475 513 ; C 111 ; WX 549 ; N omicron ; B 35 -13 501 513 ; C 112 ; WX 549 ; N pi ; B 10 -13 530 500 ; C 113 ; WX 521 ; N theta ; B 43 -13 485 686 ; C 114 ; WX 549 ; N rho ; B 50 -220 490 513 ; C 115 ; WX 603 ; N sigma ; B 30 -13 588 500 ; C 116 ; WX 439 ; N tau ; B 10 -13 418 500 ; C 117 ; WX 576 ; N upsilon ; B 7 -13 535 513 ; C 118 ; WX 713 ; N omega1 ; B 12 -13 671 583 ; C 119 ; WX 686 ; N omega ; B 42 -13 684 513 ; C 120 ; WX 493 ; N xi ; B 27 -222 469 766 ; C 121 ; WX 686 ; N psi ; B 12 -222 701 513 ; C 122 ; WX 494 ; N zeta ; B 60 -222 467 756 ; C 123 ; WX 480 ; N braceleft ; B 58 -165 397 673 ; C 124 ; WX 200 ; N bar ; B 65 -177 135 673 ; C 125 ; WX 480 ; N braceright ; B 79 -165 418 673 ; C 126 ; WX 549 ; N similar ; B 17 196 529 325 ; C 160 ; WX 762 ; N Euro ; B 53 -4 722 671 ; C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 687 ; C 162 ; WX 247 ; N minute ; B 27 476 228 735 ; C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; C 164 ; WX 167 ; N fraction ; B -180 0 340 673 ; C 165 ; WX 713 ; N infinity ; B 26 115 688 414 ; C 166 ; WX 500 ; N florin ; B 2 -174 494 687 ; C 167 ; WX 753 ; N club ; B 86 -26 660 544 ; C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; C 169 ; WX 753 ; N heart ; B 117 -33 631 528 ; C 170 ; WX 753 ; N spade ; B 113 -36 629 591 ; C 171 ; WX 1042 ; N arrowboth ; B 24 -16 1024 512 ; C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; C 176 ; WX 400 ; N degree ; B 50 380 350 686 ; C 177 ; WX 549 ; N plusminus ; B 10 0 539 662 ; C 178 ; WX 411 ; N second ; B 20 476 413 735 ; C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; C 180 ; WX 549 ; N multiply ; B 17 9 533 525 ; C 181 ; WX 713 ; N proportional ; B 27 114 639 416 ; C 182 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; C 183 ; WX 460 ; N bullet ; B 50 155 410 518 ; C 184 ; WX 549 ; N divide ; B 10 2 536 525 ; C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; C 186 ; WX 549 ; N equivalence ; B 14 87 538 446 ; C 187 ; WX 549 ; N approxequal ; B 14 121 527 408 ; C 188 ; WX 1000 ; N ellipsis ; B 111 -13 889 100 ; C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; C 192 ; WX 823 ; N aleph ; B 175 0 662 689 ; C 193 ; WX 686 ; N Ifraktur ; B 10 -54 578 736 ; C 194 ; WX 795 ; N Rfraktur ; B 26 -16 759 730 ; C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 574 ; C 196 ; WX 768 ; N circlemultiply ; B 43 0 733 691 ; C 197 ; WX 768 ; N circleplus ; B 43 0 733 689 ; C 198 ; WX 823 ; N emptyset ; B 39 -24 781 718 ; C 199 ; WX 768 ; N intersection ; B 40 0 732 507 ; C 200 ; WX 768 ; N union ; B 40 -18 732 489 ; C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; C 206 ; WX 713 ; N element ; B 45 0 505 470 ; C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; C 208 ; WX 768 ; N angle ; B 26 -1 738 672 ; C 209 ; WX 713 ; N gradient ; B 36 0 681 687 ; C 210 ; WX 790 ; N registerserif ; B 50 -13 740 690 ; C 211 ; WX 790 ; N copyrightserif ; B 51 -13 741 690 ; C 212 ; WX 890 ; N trademarkserif ; B 18 269 855 673 ; C 213 ; WX 823 ; N product ; B 25 -124 803 751 ; C 214 ; WX 549 ; N radical ; B 10 -35 515 913 ; C 215 ; WX 250 ; N dotmath ; B 69 209 169 311 ; C 216 ; WX 713 ; N logicalnot ; B 15 40 680 367 ; C 217 ; WX 603 ; N logicaland ; B 23 -1 583 476 ; C 218 ; WX 603 ; N logicalor ; B 30 -1 578 476 ; C 219 ; WX 1042 ; N arrowdblboth ; B 27 -19 1023 506 ; C 220 ; WX 987 ; N arrowdblleft ; B 30 -19 939 506 ; C 221 ; WX 603 ; N arrowdblup ; B 39 0 567 909 ; C 222 ; WX 987 ; N arrowdblright ; B 45 -19 954 506 ; C 223 ; WX 603 ; N arrowdbldown ; B 44 0 572 909 ; C 224 ; WX 494 ; N lozenge ; B 18 -1 466 740 ; C 225 ; WX 329 ; N angleleft ; B 25 -152 306 757 ; C 226 ; WX 790 ; N registersans ; B 50 -12 740 679 ; C 227 ; WX 790 ; N copyrightsans ; B 49 -12 739 679 ; C 228 ; WX 786 ; N trademarksans ; B 5 277 725 673 ; C 229 ; WX 713 ; N summation ; B 14 -123 695 752 ; C 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ; C 231 ; WX 384 ; N parenleftex ; B 40 -79 92 925 ; C 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ; C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ; C 234 ; WX 384 ; N bracketleftex ; B 0 -85 55 925 ; C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ; C 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ; C 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ; C 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ; C 239 ; WX 494 ; N braceex ; B 201 -79 255 925 ; C 241 ; WX 329 ; N angleright ; B 21 -152 302 757 ; C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; C 243 ; WX 686 ; N integraltp ; B 332 -83 715 922 ; C 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ; C 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ; C 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ; C 247 ; WX 384 ; N parenrightex ; B 398 -70 450 935 ; C 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ; C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ; C 250 ; WX 384 ; N bracketrightex ; B 305 -85 360 925 ; C 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ; C 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ; C 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ; C 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ; C -1 ; WX 250 ; N .notdef ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics grace-5.1.23/fonts/type1/n019024l.afm0000644000076500001440000007623507056046552016427 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusSanL-BoldItal FullName Nimbus Sans L Bold Italic FamilyName Nimbus Sans L Weight Bold ItalicAngle -12.0 IsFixedPitch false UnderlinePosition -111 UnderlineThickness 69 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -177 -309 1107 953 CapHeight 729 XHeight 540 Descender -217 Ascender 729 StartCharMetrics 316 C 32 ; WX 278 ; N space ; B 245 0 245 0 ; C 33 ; WX 333 ; N exclam ; B 112 0 417 726 ; C 34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ; C 35 ; WX 556 ; N numbersign ; B 33 -32 660 697 ; C 36 ; WX 556 ; N dollar ; B 59 -126 628 763 ; C 37 ; WX 889 ; N percent ; B 129 -20 903 709 ; C 38 ; WX 722 ; N ampersand ; B 89 -23 720 723 ; C 39 ; WX 278 ; N quoteright ; B 165 469 356 729 ; C 40 ; WX 333 ; N parenleft ; B 84 -200 458 729 ; C 41 ; WX 333 ; N parenright ; B -21 -200 356 729 ; C 42 ; WX 389 ; N asterisk ; B 145 407 478 729 ; C 43 ; WX 584 ; N plus ; B 87 -10 596 473 ; C 44 ; WX 278 ; N comma ; B 27 -174 245 146 ; C 45 ; WX 333 ; N hyphen ; B 70 207 371 342 ; C 46 ; WX 278 ; N period ; B 64 0 245 146 ; C 47 ; WX 278 ; N slash ; B -1 -14 427 714 ; C 48 ; WX 556 ; N zero ; B 81 -23 614 724 ; C 49 ; WX 556 ; N one ; B 172 0 529 709 ; C 50 ; WX 556 ; N two ; B 30 0 628 724 ; C 51 ; WX 556 ; N three ; B 67 -23 613 724 ; C 52 ; WX 556 ; N four ; B 57 0 599 709 ; C 53 ; WX 556 ; N five ; B 59 -23 641 709 ; C 54 ; WX 556 ; N six ; B 85 -23 625 724 ; C 55 ; WX 556 ; N seven ; B 131 0 679 709 ; C 56 ; WX 556 ; N eight ; B 60 -23 620 724 ; C 57 ; WX 556 ; N nine ; B 68 -23 611 724 ; C 58 ; WX 333 ; N colon ; B 113 0 374 520 ; C 59 ; WX 333 ; N semicolon ; B 76 -174 374 520 ; C 60 ; WX 584 ; N less ; B 77 -10 630 474 ; C 61 ; WX 584 ; N equal ; B 61 52 622 412 ; C 62 ; WX 584 ; N greater ; B 38 -10 591 474 ; C 63 ; WX 611 ; N question ; B 168 0 672 744 ; C 64 ; WX 975 ; N at ; B 73 -137 1032 745 ; C 65 ; WX 722 ; N A ; B 26 0 703 729 ; C 66 ; WX 722 ; N B ; B 82 0 762 729 ; C 67 ; WX 722 ; N C ; B 107 -23 793 741 ; C 68 ; WX 722 ; N D ; B 77 0 776 729 ; C 69 ; WX 667 ; N E ; B 79 0 762 729 ; C 70 ; WX 611 ; N F ; B 74 0 741 729 ; C 71 ; WX 778 ; N G ; B 107 -23 819 741 ; C 72 ; WX 722 ; N H ; B 68 0 812 729 ; C 73 ; WX 278 ; N I ; B 63 0 368 729 ; C 74 ; WX 556 ; N J ; B 59 -23 641 729 ; C 75 ; WX 722 ; N K ; B 74 0 843 729 ; C 76 ; WX 611 ; N L ; B 80 0 606 729 ; C 77 ; WX 833 ; N M ; B 66 0 931 729 ; C 78 ; WX 722 ; N N ; B 68 0 816 729 ; C 79 ; WX 778 ; N O ; B 106 -23 828 741 ; C 80 ; WX 667 ; N P ; B 76 0 747 729 ; C 81 ; WX 778 ; N Q ; B 109 -54 831 741 ; C 82 ; WX 722 ; N R ; B 80 0 785 729 ; C 83 ; WX 667 ; N S ; B 76 -23 725 741 ; C 84 ; WX 611 ; N T ; B 142 0 753 729 ; C 85 ; WX 722 ; N U ; B 119 -23 809 729 ; C 86 ; WX 667 ; N V ; B 179 0 802 729 ; C 87 ; WX 944 ; N W ; B 168 0 1087 729 ; C 88 ; WX 667 ; N X ; B 22 0 802 729 ; C 89 ; WX 667 ; N Y ; B 182 0 805 729 ; C 90 ; WX 611 ; N Z ; B 30 0 733 729 ; C 91 ; WX 333 ; N bracketleft ; B 23 -200 463 729 ; C 92 ; WX 278 ; N backslash ; B 138 -23 285 709 ; C 93 ; WX 333 ; N bracketright ; B -25 -200 415 729 ; C 94 ; WX 584 ; N asciicircum ; B 119 270 580 695 ; C 95 ; WX 556 ; N underscore ; B -65 -145 550 -76 ; C 96 ; WX 278 ; N quoteleft ; B 167 469 357 729 ; C 97 ; WX 556 ; N a ; B 50 -23 578 549 ; C 98 ; WX 611 ; N b ; B 59 -23 640 729 ; C 99 ; WX 556 ; N c ; B 77 -23 597 549 ; C 100 ; WX 611 ; N d ; B 79 -23 700 729 ; C 101 ; WX 556 ; N e ; B 64 -23 591 549 ; C 102 ; WX 333 ; N f ; B 90 0 464 729 ; C 103 ; WX 611 ; N g ; B 26 -218 656 549 ; C 104 ; WX 611 ; N h ; B 67 0 629 729 ; C 105 ; WX 278 ; N i ; B 67 0 362 729 ; C 106 ; WX 278 ; N j ; B -43 -218 365 729 ; C 107 ; WX 556 ; N k ; B 59 0 651 729 ; C 108 ; WX 278 ; N l ; B 67 0 362 729 ; C 109 ; WX 889 ; N m ; B 60 0 911 549 ; C 110 ; WX 611 ; N n ; B 63 0 629 549 ; C 111 ; WX 611 ; N o ; B 82 -23 634 549 ; C 112 ; WX 611 ; N p ; B 11 -218 637 549 ; C 113 ; WX 611 ; N q ; B 72 -218 659 549 ; C 114 ; WX 389 ; N r ; B 63 0 487 549 ; C 115 ; WX 556 ; N s ; B 60 -23 589 549 ; C 116 ; WX 333 ; N t ; B 101 -23 414 674 ; C 117 ; WX 611 ; N u ; B 88 -23 656 540 ; C 118 ; WX 556 ; N v ; B 129 0 651 540 ; C 119 ; WX 778 ; N w ; B 120 0 881 540 ; C 120 ; WX 556 ; N x ; B 16 0 648 540 ; C 121 ; WX 556 ; N y ; B 37 -219 653 540 ; C 122 ; WX 500 ; N z ; B 21 0 575 540 ; C 123 ; WX 389 ; N braceleft ; B 84 -200 472 729 ; C 124 ; WX 280 ; N bar ; B 57 -200 335 729 ; C 125 ; WX 389 ; N braceright ; B 29 -200 419 729 ; C 126 ; WX 584 ; N asciitilde ; B 97 142 581 314 ; C 161 ; WX 333 ; N exclamdown ; B 26 -186 331 540 ; C 162 ; WX 556 ; N cent ; B 79 -124 598 634 ; C 163 ; WX 556 ; N sterling ; B 49 -23 629 715 ; C 164 ; WX 167 ; N fraction ; B -177 -20 489 715 ; C 165 ; WX 556 ; N yen ; B 107 0 702 704 ; C 166 ; WX 556 ; N florin ; B -21 -220 690 744 ; C 167 ; WX 556 ; N section ; B 56 -201 596 723 ; C 168 ; WX 556 ; N currency ; B 66 100 644 604 ; C 169 ; WX 238 ; N quotesingle ; B 177 470 343 729 ; C 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ; C 171 ; WX 556 ; N guillemotleft ; B 135 72 571 481 ; C 172 ; WX 333 ; N guilsinglleft ; B 128 72 351 481 ; C 173 ; WX 333 ; N guilsinglright ; B 96 72 319 481 ; C 174 ; WX 611 ; N fi ; B 85 0 703 729 ; C 175 ; WX 611 ; N fl ; B 88 0 701 729 ; C 177 ; WX 556 ; N endash ; B 35 207 624 311 ; C 178 ; WX 556 ; N dagger ; B 109 -194 626 709 ; C 179 ; WX 556 ; N daggerdbl ; B 35 -194 623 709 ; C 180 ; WX 278 ; N periodcentered ; B 143 182 270 282 ; C 182 ; WX 556 ; N paragraph ; B 121 -191 684 729 ; C 183 ; WX 350 ; N bullet ; B 111 175 367 425 ; C 184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ; C 185 ; WX 500 ; N quotedblbase ; B 37 -135 462 125 ; C 186 ; WX 500 ; N quotedblright ; B 173 469 595 729 ; C 187 ; WX 556 ; N guillemotright ; B 103 72 533 481 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; C 189 ; WX 1000 ; N perthousand ; B 72 -21 1021 739 ; C 191 ; WX 611 ; N questiondown ; B 52 -204 556 540 ; C 193 ; WX 333 ; N grave ; B 175 607 339 757 ; C 194 ; WX 333 ; N acute ; B 247 607 475 757 ; C 195 ; WX 333 ; N circumflex ; B 135 610 453 757 ; C 196 ; WX 333 ; N tilde ; B 117 622 500 744 ; C 197 ; WX 333 ; N macron ; B 150 642 467 722 ; C 198 ; WX 333 ; N breve ; B 188 611 455 754 ; C 199 ; WX 333 ; N dotaccent ; B 241 621 377 741 ; C 200 ; WX 333 ; N dieresis ; B 147 621 469 741 ; C 202 ; WX 333 ; N ring ; B 214 593 398 773 ; C 203 ; WX 333 ; N cedilla ; B -13 -220 270 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 82 610 498 757 ; C 206 ; WX 333 ; N ogonek ; B 23 -233 248 0 ; C 207 ; WX 333 ; N caron ; B 167 610 485 757 ; C 208 ; WX 1000 ; N emdash ; B 37 207 1070 311 ; C 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ; C 227 ; WX 370 ; N ordfeminine ; B 96 262 451 729 ; C 232 ; WX 611 ; N Lslash ; B 54 0 624 729 ; C 233 ; WX 778 ; N Oslash ; B 34 -39 906 749 ; C 234 ; WX 1000 ; N OE ; B 90 -23 1107 741 ; C 235 ; WX 365 ; N ordmasculine ; B 92 262 471 729 ; C 241 ; WX 889 ; N ae ; B 54 -23 927 549 ; C 245 ; WX 278 ; N dotlessi ; B 67 0 322 540 ; C 248 ; WX 278 ; N lslash ; B 50 0 372 729 ; C 249 ; WX 611 ; N oslash ; B 12 -38 709 557 ; C 250 ; WX 944 ; N oe ; B 71 -23 986 549 ; C 251 ; WX 611 ; N germandbls ; B 67 -23 654 729 ; C -1 ; WX 722 ; N Udieresis ; B 119 -23 809 920 ; C -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ; C -1 ; WX 667 ; N Scedilla ; B 76 -220 725 741 ; C -1 ; WX 611 ; N Tcaron ; B 142 0 753 936 ; C -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ; C -1 ; WX 722 ; N Rcaron ; B 80 0 785 936 ; C -1 ; WX 722 ; N Racute ; B 80 0 785 936 ; C -1 ; WX 667 ; N Sacute ; B 76 -23 725 936 ; C -1 ; WX 778 ; N Otilde ; B 106 -23 828 923 ; C -1 ; WX 611 ; N ucircumflex ; B 88 -23 656 757 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 106 -23 841 936 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 119 -23 809 936 ; C -1 ; WX 667 ; N Yacute ; B 182 0 805 936 ; C -1 ; WX 722 ; N Eth ; B 73 0 776 729 ; C -1 ; WX 722 ; N Dcroat ; B 73 0 776 729 ; C -1 ; WX 611 ; N Zacute ; B 30 0 733 936 ; C -1 ; WX 722 ; N Uring ; B 119 -23 809 953 ; C -1 ; WX 611 ; N gbreve ; B 26 -218 656 754 ; C -1 ; WX 556 ; N eogonek ; B 64 -233 591 549 ; C -1 ; WX 556 ; N edotaccent ; B 64 -23 591 741 ; C -1 ; WX 556 ; N ecaron ; B 64 -23 593 757 ; C -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ; C -1 ; WX 667 ; N Thorn ; B 76 0 721 729 ; C -1 ; WX 556 ; N eacute ; B 64 -23 591 757 ; C -1 ; WX 556 ; N edieresis ; B 64 -23 591 741 ; C -1 ; WX 722 ; N dcaron ; B 79 -23 882 729 ; C -1 ; WX 556 ; N ccedilla ; B 77 -220 597 549 ; C -1 ; WX 556 ; N ccaron ; B 77 -23 607 757 ; C -1 ; WX 556 ; N cacute ; B 77 -23 597 757 ; C -1 ; WX 556 ; N aogonek ; B 50 -233 578 549 ; C -1 ; WX 556 ; N aring ; B 50 -23 578 773 ; C -1 ; WX 556 ; N atilde ; B 50 -23 612 744 ; C -1 ; WX 556 ; N abreve ; B 50 -23 578 754 ; C -1 ; WX 556 ; N egrave ; B 64 -23 591 757 ; C -1 ; WX 556 ; N agrave ; B 50 -23 578 757 ; C -1 ; WX 556 ; N aacute ; B 50 -23 587 757 ; C -1 ; WX 556 ; N adieresis ; B 50 -23 581 741 ; C -1 ; WX 722 ; N Uogonek ; B 119 -233 809 729 ; C -1 ; WX 611 ; N ugrave ; B 88 -23 656 757 ; C -1 ; WX 611 ; N uacute ; B 88 -23 656 757 ; C -1 ; WX 611 ; N udieresis ; B 88 -23 656 741 ; C -1 ; WX 404 ; N tcaron ; B 101 -23 578 829 ; C -1 ; WX 556 ; N scommaaccent ; B 60 -307 589 549 ; C -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ; C -1 ; WX 556 ; N ecircumflex ; B 64 -23 591 757 ; C -1 ; WX 722 ; N Ucircumflex ; B 119 -23 809 936 ; C -1 ; WX 556 ; N acircumflex ; B 50 -23 578 757 ; C -1 ; WX 611 ; N Zdotaccent ; B 30 0 733 918 ; C -1 ; WX 556 ; N scaron ; B 60 -23 597 757 ; C -1 ; WX 722 ; N Amacron ; B 26 0 706 901 ; C -1 ; WX 556 ; N sacute ; B 60 -23 589 757 ; C -1 ; WX 611 ; N Tcommaaccent ; B 142 -307 753 729 ; C -1 ; WX 667 ; N Ydieresis ; B 182 0 805 920 ; C -1 ; WX 611 ; N thorn ; B 11 -218 637 729 ; C -1 ; WX 667 ; N Emacron ; B 79 0 762 901 ; C -1 ; WX 778 ; N Ograve ; B 106 -23 828 936 ; C -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ; C -1 ; WX 778 ; N Odieresis ; B 106 -23 828 920 ; C -1 ; WX 722 ; N Ntilde ; B 68 0 816 923 ; C -1 ; WX 722 ; N Ncaron ; B 68 0 816 936 ; C -1 ; WX 722 ; N Nacute ; B 68 0 816 936 ; C -1 ; WX 611 ; N Lcaron ; B 80 0 607 729 ; C -1 ; WX 611 ; N Lacute ; B 80 0 606 936 ; C -1 ; WX 278 ; N Idotaccent ; B 63 0 388 918 ; C -1 ; WX 389 ; N racute ; B 63 0 500 757 ; C -1 ; WX 278 ; N Icircumflex ; B 63 0 467 936 ; C -1 ; WX 611 ; N ohungarumlaut ; B 82 -23 710 757 ; C -1 ; WX 611 ; N otilde ; B 82 -23 639 744 ; C -1 ; WX 556 ; N Euro ; B 21 -23 648 724 ; C -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 757 ; C -1 ; WX 444 ; N onesuperior ; B 210 284 438 709 ; C -1 ; WX 444 ; N twosuperior ; B 124 284 499 718 ; C -1 ; WX 444 ; N threesuperior ; B 147 271 490 718 ; C -1 ; WX 278 ; N Igrave ; B 63 0 368 936 ; C -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ; C -1 ; WX 278 ; N Imacron ; B 63 0 466 901 ; C -1 ; WX 278 ; N Iogonek ; B 7 -233 368 729 ; C -1 ; WX 278 ; N Idieresis ; B 63 0 483 920 ; C -1 ; WX 778 ; N Gbreve ; B 107 -23 819 934 ; C -1 ; WX 722 ; N Umacron ; B 119 -23 809 901 ; C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 843 729 ; C -1 ; WX 611 ; N ograve ; B 82 -23 634 757 ; C -1 ; WX 667 ; N Scommaaccent ; B 76 -307 725 741 ; C -1 ; WX 667 ; N Eogonek ; B 79 -233 762 729 ; C -1 ; WX 611 ; N oacute ; B 82 -23 634 757 ; C -1 ; WX 667 ; N Edotaccent ; B 79 0 762 918 ; C -1 ; WX 268 ; N iogonek ; B 0 -233 351 729 ; C -1 ; WX 611 ; N gcommaaccent ; B 26 -218 656 854 ; C -1 ; WX 611 ; N odieresis ; B 82 -23 634 741 ; C -1 ; WX 611 ; N ntilde ; B 63 0 646 744 ; C -1 ; WX 611 ; N ncaron ; B 63 0 629 757 ; C -1 ; WX 667 ; N Ecaron ; B 79 0 762 936 ; C -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ; C -1 ; WX 556 ; N scedilla ; B 60 -220 589 549 ; C -1 ; WX 389 ; N rcaron ; B 63 0 533 757 ; C -1 ; WX 667 ; N Egrave ; B 79 0 762 936 ; C -1 ; WX 667 ; N Eacute ; B 79 0 762 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 107 -307 819 741 ; C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 785 729 ; C -1 ; WX 667 ; N Edieresis ; B 79 0 762 920 ; C -1 ; WX 611 ; N nacute ; B 63 0 629 757 ; C -1 ; WX 611 ; N uogonek ; B 88 -233 656 540 ; C -1 ; WX 611 ; N umacron ; B 88 -23 656 722 ; C -1 ; WX 722 ; N Dcaron ; B 77 0 776 936 ; C -1 ; WX 384 ; N lcaron ; B 67 0 544 729 ; C -1 ; WX 722 ; N Ccaron ; B 107 -23 793 936 ; C -1 ; WX 722 ; N Cacute ; B 107 -23 793 936 ; C -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ; C -1 ; WX 606 ; N degree ; B 240 383 543 686 ; C -1 ; WX 722 ; N Aogonek ; B 26 -233 703 729 ; C -1 ; WX 584 ; N minus ; B 77 172 606 292 ; C -1 ; WX 584 ; N multiply ; B 102 18 582 444 ; C -1 ; WX 584 ; N divide ; B 77 0 606 462 ; C -1 ; WX 722 ; N Aring ; B 26 0 703 953 ; C -1 ; WX 1000 ; N trademark ; B 213 273 1087 729 ; C -1 ; WX 389 ; N rcommaaccent ; B 8 -307 487 549 ; C -1 ; WX 278 ; N lacute ; B 67 0 474 936 ; C -1 ; WX 611 ; N omacron ; B 82 -23 634 722 ; C -1 ; WX 722 ; N Atilde ; B 26 0 739 923 ; C -1 ; WX 278 ; N icircumflex ; B 67 0 426 757 ; C -1 ; WX 278 ; N igrave ; B 67 0 322 757 ; C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 629 549 ; C -1 ; WX 278 ; N lcommaaccent ; B 11 -307 362 729 ; C -1 ; WX 584 ; N plusminus ; B 50 0 630 633 ; C -1 ; WX 1055 ; N onehalf ; B 210 -20 1050 715 ; C -1 ; WX 1055 ; N onequarter ; B 210 -20 1032 715 ; C -1 ; WX 1055 ; N threequarters ; B 147 -20 1032 718 ; C -1 ; WX 278 ; N iacute ; B 67 0 448 757 ; C -1 ; WX 722 ; N Abreve ; B 26 0 703 934 ; C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 651 729 ; C -1 ; WX 778 ; N Omacron ; B 106 -23 828 901 ; C -1 ; WX 278 ; N imacron ; B 67 0 424 722 ; C -1 ; WX 556 ; N emacron ; B 64 -23 591 722 ; C -1 ; WX 556 ; N amacron ; B 50 -23 579 722 ; C -1 ; WX 333 ; N tcommaaccent ; B 62 -307 414 674 ; C -1 ; WX 556 ; N ydieresis ; B 37 -219 653 741 ; C -1 ; WX 500 ; N zdotaccent ; B 21 0 575 741 ; C -1 ; WX 500 ; N zcaron ; B 21 0 575 757 ; C -1 ; WX 500 ; N zacute ; B 21 0 575 757 ; C -1 ; WX 556 ; N yacute ; B 37 -219 653 757 ; C -1 ; WX 611 ; N uhungarumlaut ; B 88 -23 697 757 ; C -1 ; WX 611 ; N eth ; B 83 -23 633 744 ; C -1 ; WX 611 ; N uring ; B 88 -23 656 773 ; C -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ; C -1 ; WX 333 ; N commaaccent ; B 43 -307 217 -60 ; C -1 ; WX 737 ; N copyright ; B 54 -22 837 743 ; C -1 ; WX 737 ; N registered ; B 55 -22 837 743 ; C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; C -1 ; WX 278 ; N idieresis ; B 67 0 442 741 ; C -1 ; WX 489 ; N lozenge ; B 95 0 541 744 ; C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; C -1 ; WX 584 ; N notequal ; B 61 -74 622 544 ; C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; C -1 ; WX 722 ; N Aacute ; B 26 0 714 936 ; C -1 ; WX 584 ; N lessequal ; B 35 0 657 624 ; C -1 ; WX 584 ; N greaterequal ; B 44 0 627 624 ; C -1 ; WX 584 ; N logicalnot ; B 103 86 632 376 ; C -1 ; WX 711 ; N summation ; B -18 -97 760 760 ; C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 816 729 ; C -1 ; WX 611 ; N dcroat ; B 79 -23 746 729 ; C -1 ; WX 280 ; N brokenbar ; B 57 -200 335 729 ; C -1 ; WX 611 ; N Lcommaaccent ; B 80 -309 606 729 ; C -1 ; WX 722 ; N Adieresis ; B 26 0 708 920 ; C -1 ; WX 611 ; N mu ; B 11 -220 655 540 ; C -1 ; WX 278 ; N .notdef ; B 245 0 245 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -36 KPX A Ccedilla -36 KPX A G -38 KPX A O -37 KPX A Odieresis -37 KPX A Q -39 KPX A T -91 KPX A U -37 KPX A Uacute -37 KPX A Ucircumflex -37 KPX A Udieresis -37 KPX A Ugrave -37 KPX A V -74 KPX A W -57 KPX A Y -96 KPX A a -11 KPX A b -10 KPX A c -17 KPX A ccedilla -17 KPX A comma 9 KPX A d -17 KPX A e -10 KPX A g -20 KPX A guillemotleft -48 KPX A guilsinglleft -44 KPX A hyphen 2 KPX A o -19 KPX A period 13 KPX A q -13 KPX A quotedblright -71 KPX A quoteright -67 KPX A t -21 KPX A u -17 KPX A v -42 KPX A w -28 KPX A y -41 KPX Aacute C -37 KPX Aacute G -38 KPX Aacute O -38 KPX Aacute Q -40 KPX Aacute T -91 KPX Aacute U -38 KPX Aacute V -74 KPX Aacute W -57 KPX Aacute Y -96 KPX Aacute a -11 KPX Aacute b -10 KPX Aacute c -17 KPX Aacute comma 9 KPX Aacute d -17 KPX Aacute e -11 KPX Aacute g -20 KPX Aacute guillemotleft -48 KPX Aacute guilsinglleft -45 KPX Aacute hyphen 2 KPX Aacute o -20 KPX Aacute period 12 KPX Aacute q -14 KPX Aacute quoteright -67 KPX Aacute t -22 KPX Aacute u -18 KPX Aacute v -42 KPX Aacute w -29 KPX Aacute y -41 KPX Acircumflex C -36 KPX Acircumflex G -38 KPX Acircumflex O -37 KPX Acircumflex Q -39 KPX Acircumflex T -91 KPX Acircumflex U -37 KPX Acircumflex V -74 KPX Acircumflex W -57 KPX Acircumflex Y -96 KPX Acircumflex comma 9 KPX Acircumflex period 13 KPX Adieresis C -37 KPX Adieresis G -38 KPX Adieresis O -38 KPX Adieresis Q -39 KPX Adieresis T -91 KPX Adieresis U -38 KPX Adieresis V -74 KPX Adieresis W -57 KPX Adieresis Y -96 KPX Adieresis a -11 KPX Adieresis b -10 KPX Adieresis c -17 KPX Adieresis comma 9 KPX Adieresis d -17 KPX Adieresis g -20 KPX Adieresis guillemotleft -48 KPX Adieresis guilsinglleft -44 KPX Adieresis hyphen 2 KPX Adieresis o -20 KPX Adieresis period 12 KPX Adieresis q -13 KPX Adieresis quotedblright -71 KPX Adieresis quoteright -67 KPX Adieresis t -22 KPX Adieresis u -17 KPX Adieresis v -42 KPX Adieresis w -28 KPX Adieresis y -41 KPX Agrave C -36 KPX Agrave G -38 KPX Agrave O -37 KPX Agrave Q -39 KPX Agrave T -91 KPX Agrave U -37 KPX Agrave V -74 KPX Agrave W -57 KPX Agrave Y -96 KPX Agrave comma 9 KPX Agrave period 13 KPX Aring C -36 KPX Aring G -38 KPX Aring O -37 KPX Aring Q -39 KPX Aring T -91 KPX Aring U -37 KPX Aring V -74 KPX Aring W -57 KPX Aring Y -96 KPX Aring a -11 KPX Aring b -10 KPX Aring c -17 KPX Aring comma 9 KPX Aring d -17 KPX Aring e -10 KPX Aring g -20 KPX Aring guillemotleft -48 KPX Aring guilsinglleft -44 KPX Aring hyphen 2 KPX Aring o -19 KPX Aring period 13 KPX Aring q -13 KPX Aring quotedblright -71 KPX Aring quoteright -67 KPX Aring t -21 KPX Aring u -17 KPX Aring v -42 KPX Aring w -28 KPX Aring y -41 KPX Atilde C -38 KPX Atilde G -40 KPX Atilde O -39 KPX Atilde Q -41 KPX Atilde T -92 KPX Atilde U -39 KPX Atilde V -74 KPX Atilde W -57 KPX Atilde Y -96 KPX Atilde comma 9 KPX Atilde period 11 KPX B A -41 KPX B AE -30 KPX B Aacute -41 KPX B Acircumflex -41 KPX B Adieresis -41 KPX B Aring -41 KPX B Atilde -41 KPX B O -18 KPX B OE -9 KPX B Oacute -18 KPX B Ocircumflex -18 KPX B Odieresis -18 KPX B Ograve -18 KPX B Oslash -17 KPX B V -46 KPX B W -30 KPX B Y -63 KPX C A -34 KPX C AE -23 KPX C Aacute -34 KPX C Adieresis -34 KPX C Aring -34 KPX C H -1 KPX C K -4 KPX C O -12 KPX C Oacute -12 KPX C Odieresis -12 KPX Ccedilla A -34 KPX D A -40 KPX D Aacute -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Aring -40 KPX D Atilde -40 KPX D J -4 KPX D T -24 KPX D V -37 KPX D W -20 KPX D X -40 KPX D Y -62 KPX F A -68 KPX F Aacute -68 KPX F Acircumflex -68 KPX F Adieresis -68 KPX F Agrave -68 KPX F Aring -68 KPX F Atilde -68 KPX F J -33 KPX F O -24 KPX F Odieresis -24 KPX F a -23 KPX F aacute -23 KPX F adieresis -23 KPX F ae -26 KPX F aring -23 KPX F comma -84 KPX F e -12 KPX F eacute -12 KPX F hyphen 4 KPX F i -15 KPX F j -17 KPX F o -21 KPX F oacute -21 KPX F odieresis -21 KPX F oe -16 KPX F oslash -24 KPX F period -82 KPX F r -35 KPX F u -32 KPX G A -17 KPX G AE -5 KPX G Aacute -17 KPX G Acircumflex -17 KPX G Adieresis -17 KPX G Agrave -17 KPX G Aring -17 KPX G Atilde -17 KPX G T -28 KPX G V -41 KPX G W -25 KPX G Y -65 KPX J A -38 KPX J AE -29 KPX J Adieresis -38 KPX J Aring -38 KPX K C -59 KPX K G -61 KPX K O -60 KPX K OE -51 KPX K Oacute -60 KPX K Odieresis -60 KPX K S -45 KPX K T 5 KPX K a -17 KPX K adieresis -17 KPX K ae -17 KPX K aring -17 KPX K e -38 KPX K hyphen -52 KPX K o -45 KPX K oacute -45 KPX K odieresis -45 KPX K u -35 KPX K udieresis -35 KPX K y -74 KPX L A 0 KPX L AE 12 KPX L Aacute 0 KPX L Adieresis 0 KPX L Aring 0 KPX L C -35 KPX L Ccedilla -36 KPX L G -40 KPX L O -39 KPX L Oacute -39 KPX L Ocircumflex -39 KPX L Odieresis -39 KPX L Ograve -39 KPX L Otilde -39 KPX L S -14 KPX L T -104 KPX L U -35 KPX L Udieresis -35 KPX L V -102 KPX L W -79 KPX L Y -121 KPX L hyphen -20 KPX L quotedblright -147 KPX L quoteright -143 KPX L u -17 KPX L udieresis -17 KPX L y -64 KPX N A -15 KPX N AE -2 KPX N Aacute -15 KPX N Adieresis -15 KPX N Aring -15 KPX N C -1 KPX N Ccedilla -1 KPX N G -2 KPX N O -2 KPX N Oacute -2 KPX N Odieresis -2 KPX N a 5 KPX N aacute 5 KPX N adieresis 5 KPX N ae 4 KPX N aring 5 KPX N comma 7 KPX N e 10 KPX N eacute 10 KPX N o 1 KPX N oacute 1 KPX N odieresis 1 KPX N oslash 2 KPX N period 8 KPX N u 4 KPX N udieresis 4 KPX O A -42 KPX O AE -33 KPX O Aacute -42 KPX O Adieresis -42 KPX O Aring -42 KPX O T -32 KPX O V -40 KPX O W -24 KPX O X -43 KPX O Y -65 KPX Oacute A -42 KPX Oacute T -32 KPX Oacute V -40 KPX Oacute W -24 KPX Oacute Y -65 KPX Ocircumflex T -32 KPX Ocircumflex V -40 KPX Ocircumflex Y -65 KPX Odieresis A -42 KPX Odieresis T -32 KPX Odieresis V -40 KPX Odieresis W -24 KPX Odieresis X -43 KPX Odieresis Y -65 KPX Ograve T -32 KPX Ograve V -40 KPX Ograve Y -65 KPX Oslash A -34 KPX Otilde T -32 KPX Otilde V -40 KPX Otilde Y -65 KPX P A -71 KPX P AE -62 KPX P Aacute -71 KPX P Adieresis -71 KPX P Aring -71 KPX P J -52 KPX P a -14 KPX P aacute -14 KPX P adieresis -14 KPX P ae -15 KPX P aring -14 KPX P comma -103 KPX P e -13 KPX P eacute -13 KPX P hyphen -7 KPX P o -22 KPX P oacute -22 KPX P odieresis -22 KPX P oe -17 KPX P oslash -26 KPX P period -101 KPX R C -12 KPX R Ccedilla -12 KPX R G -13 KPX R O -13 KPX R OE -3 KPX R Oacute -13 KPX R Odieresis -13 KPX R T -12 KPX R U -12 KPX R Udieresis -12 KPX R V -38 KPX R W -22 KPX R Y -50 KPX R a -4 KPX R aacute -4 KPX R adieresis -4 KPX R ae -5 KPX R aring -4 KPX R e 0 KPX R eacute 0 KPX R hyphen 10 KPX R o -9 KPX R oacute -9 KPX R odieresis -9 KPX R oe -4 KPX R u -6 KPX R uacute -6 KPX R udieresis -6 KPX R y -4 KPX S A -26 KPX S AE -14 KPX S Aacute -26 KPX S Adieresis -26 KPX S Aring -26 KPX S T -15 KPX S V -36 KPX S W -20 KPX S Y -54 KPX S t -4 KPX T A -93 KPX T AE -85 KPX T Aacute -93 KPX T Acircumflex -93 KPX T Adieresis -93 KPX T Agrave -93 KPX T Aring -93 KPX T Atilde -93 KPX T C -29 KPX T G -30 KPX T J -95 KPX T O -30 KPX T OE -20 KPX T Oacute -30 KPX T Ocircumflex -30 KPX T Odieresis -30 KPX T Ograve -30 KPX T Oslash -36 KPX T Otilde -30 KPX T S -7 KPX T V 9 KPX T W 15 KPX T Y 7 KPX T a -77 KPX T ae -78 KPX T c -79 KPX T colon -104 KPX T comma -75 KPX T e -72 KPX T g -79 KPX T guillemotleft -107 KPX T guilsinglleft -103 KPX T hyphen -53 KPX T i -9 KPX T j -11 KPX T o -81 KPX T oslash -80 KPX T period -73 KPX T r -76 KPX T s -81 KPX T semicolon -105 KPX T u -78 KPX T v -91 KPX T w -85 KPX T y -89 KPX U A -40 KPX U AE -30 KPX U Aacute -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -17 KPX U m -3 KPX U n -5 KPX U p -3 KPX U period -12 KPX U r -5 KPX Uacute A -40 KPX Uacute comma -17 KPX Uacute m -3 KPX Uacute n -5 KPX Uacute p -3 KPX Uacute period -12 KPX Uacute r -5 KPX Ucircumflex A -40 KPX Udieresis A -40 KPX Udieresis b -4 KPX Udieresis comma -17 KPX Udieresis m -3 KPX Udieresis n -5 KPX Udieresis p -3 KPX Udieresis period -12 KPX Udieresis r -5 KPX Ugrave A -40 KPX V A -75 KPX V AE -65 KPX V Aacute -75 KPX V Acircumflex -75 KPX V Adieresis -75 KPX V Agrave -75 KPX V Aring -75 KPX V Atilde -75 KPX V C -43 KPX V G -44 KPX V O -44 KPX V Oacute -44 KPX V Ocircumflex -44 KPX V Odieresis -44 KPX V Ograve -44 KPX V Oslash -42 KPX V Otilde -44 KPX V S -31 KPX V T 12 KPX V a -51 KPX V ae -52 KPX V colon -74 KPX V comma -76 KPX V e -46 KPX V g -54 KPX V guillemotleft -81 KPX V guilsinglleft -77 KPX V hyphen -26 KPX V i -13 KPX V o -56 KPX V oslash -55 KPX V period -74 KPX V r -43 KPX V semicolon -77 KPX V u -42 KPX V y -19 KPX W A -59 KPX W AE -50 KPX W Aacute -59 KPX W Acircumflex -59 KPX W Adieresis -59 KPX W Agrave -59 KPX W Aring -59 KPX W Atilde -59 KPX W C -28 KPX W G -29 KPX W O -29 KPX W Oacute -29 KPX W Ocircumflex -29 KPX W Odieresis -29 KPX W Ograve -29 KPX W Oslash -27 KPX W Otilde -29 KPX W S -22 KPX W T 16 KPX W a -34 KPX W ae -34 KPX W colon -61 KPX W comma -53 KPX W e -28 KPX W g -36 KPX W guillemotleft -63 KPX W guilsinglleft -59 KPX W hyphen -9 KPX W i -9 KPX W o -38 KPX W oslash -37 KPX W period -51 KPX W r -33 KPX W semicolon -63 KPX W u -32 KPX W y -9 KPX X C -39 KPX X O -40 KPX X Odieresis -40 KPX X Q -43 KPX X a -17 KPX X e -33 KPX X hyphen -33 KPX X o -43 KPX X u -35 KPX X y -48 KPX Y A -91 KPX Y AE -81 KPX Y Aacute -91 KPX Y Acircumflex -91 KPX Y Adieresis -91 KPX Y Agrave -91 KPX Y Aring -91 KPX Y Atilde -91 KPX Y C -60 KPX Y G -61 KPX Y O -61 KPX Y Oacute -61 KPX Y Ocircumflex -61 KPX Y Odieresis -61 KPX Y Ograve -61 KPX Y Oslash -58 KPX Y Otilde -61 KPX Y S -39 KPX Y T 14 KPX Y a -71 KPX Y ae -71 KPX Y colon -90 KPX Y comma -85 KPX Y e -66 KPX Y g -73 KPX Y guillemotleft -105 KPX Y guilsinglleft -101 KPX Y hyphen -55 KPX Y i -11 KPX Y o -76 KPX Y oslash -74 KPX Y p -53 KPX Y period -84 KPX Y semicolon -93 KPX Y u -57 KPX Y v -36 KPX Z v -21 KPX Z y -19 KPX a j -7 KPX a quoteright -14 KPX a v -23 KPX a w -10 KPX a y -24 KPX aacute v -23 KPX aacute w -10 KPX aacute y -24 KPX adieresis v -23 KPX adieresis w -10 KPX adieresis y -24 KPX ae v -21 KPX ae w -7 KPX ae y -23 KPX agrave v -23 KPX agrave w -10 KPX agrave y -24 KPX aring v -23 KPX aring w -10 KPX aring y -24 KPX b v -23 KPX b w -9 KPX b y -25 KPX c h -9 KPX c k -5 KPX comma one -79 KPX comma quotedblright -39 KPX comma quoteright -35 KPX e quoteright -13 KPX e t -9 KPX e v -22 KPX e w -9 KPX e x -25 KPX e y -25 KPX eacute v -22 KPX eacute w -9 KPX eacute y -25 KPX ecircumflex v -22 KPX ecircumflex w -9 KPX ecircumflex y -25 KPX eight four 2 KPX eight one -32 KPX eight seven -15 KPX f a -6 KPX f aacute -6 KPX f adieresis -6 KPX f ae -6 KPX f aring -6 KPX f e -6 KPX f eacute -6 KPX f f 14 KPX f i -13 KPX f j -15 KPX f l -13 KPX f o -16 KPX f oacute -16 KPX f odieresis -16 KPX f oe -11 KPX f oslash -16 KPX f quoteright 0 KPX f s -10 KPX f t 14 KPX five four -3 KPX five one -37 KPX five seven -17 KPX four four 0 KPX four one -55 KPX four seven -33 KPX g a -3 KPX g adieresis -3 KPX g ae -4 KPX g aring -3 KPX g e 1 KPX g eacute 1 KPX g l -5 KPX g oacute -8 KPX g odieresis -8 KPX g r -3 KPX guillemotright A -56 KPX guillemotright AE -46 KPX guillemotright Aacute -56 KPX guillemotright Adieresis -56 KPX guillemotright Aring -56 KPX guillemotright T -115 KPX guillemotright V -84 KPX guillemotright W -65 KPX guillemotright Y -117 KPX guilsinglright A -52 KPX guilsinglright AE -42 KPX guilsinglright Aacute -52 KPX guilsinglright Adieresis -52 KPX guilsinglright Aring -52 KPX guilsinglright T -110 KPX guilsinglright V -79 KPX guilsinglright W -60 KPX guilsinglright Y -113 KPX h quoteright -15 KPX h y -25 KPX hyphen A -7 KPX hyphen AE 2 KPX hyphen Aacute -7 KPX hyphen Adieresis -7 KPX hyphen Aring -7 KPX hyphen T -64 KPX hyphen V -34 KPX hyphen W -15 KPX hyphen Y -71 KPX i T -12 KPX i j -7 KPX k a -13 KPX k aacute -13 KPX k adieresis -13 KPX k ae -15 KPX k aring -13 KPX k comma -3 KPX k e -19 KPX k eacute -19 KPX k g -26 KPX k hyphen -31 KPX k o -28 KPX k oacute -28 KPX k odieresis -28 KPX k period -3 KPX k s -23 KPX k u -8 KPX k udieresis -8 KPX l v -14 KPX l y -11 KPX m p -1 KPX m v -23 KPX m w -9 KPX m y -23 KPX n T -87 KPX n p -2 KPX n quoteright -15 KPX n v -24 KPX n w -11 KPX n y -25 KPX nine four -6 KPX nine one -30 KPX nine seven -23 KPX o T -90 KPX o quoteright -19 KPX o t -13 KPX o v -27 KPX o w -13 KPX o x -30 KPX o y -29 KPX oacute v -27 KPX oacute w -13 KPX oacute y -29 KPX ocircumflex t -13 KPX odieresis t -13 KPX odieresis v -27 KPX odieresis w -13 KPX odieresis x -30 KPX odieresis y -29 KPX ograve v -27 KPX ograve w -13 KPX ograve y -29 KPX one comma -51 KPX one eight -47 KPX one five -50 KPX one four -70 KPX one nine -47 KPX one one -92 KPX one period -49 KPX one seven -72 KPX one six -48 KPX one three -53 KPX one two -56 KPX one zero -44 KPX p t -10 KPX p y -25 KPX period one -80 KPX period quotedblright -39 KPX period quoteright -35 KPX q c -3 KPX q u -3 KPX quotedblbase A 7 KPX quotedblbase AE 19 KPX quotedblbase T -79 KPX quotedblbase V -77 KPX quotedblbase W -54 KPX quotedblbase Y -96 KPX quotedblleft A -72 KPX quotedblleft AE -64 KPX quotedblleft Aacute -72 KPX quotedblleft Adieresis -72 KPX quotedblleft Aring -72 KPX quotedblleft T -11 KPX quotedblleft V 0 KPX quotedblleft W 9 KPX quotedblleft Y -15 KPX quotedblright A -72 KPX quotedblright AE -64 KPX quotedblright Aacute -72 KPX quotedblright Adieresis -72 KPX quotedblright Aring -72 KPX quotedblright T -7 KPX quotedblright V 1 KPX quotedblright W 11 KPX quotedblright Y -14 KPX quoteleft A -76 KPX quoteleft AE -69 KPX quoteleft Aacute -76 KPX quoteleft Adieresis -76 KPX quoteleft Aring -76 KPX quoteleft T -15 KPX quoteleft V -4 KPX quoteleft W 5 KPX quoteleft Y -20 KPX quoteright A -80 KPX quoteright AE -72 KPX quoteright Aacute -80 KPX quoteright Adieresis -80 KPX quoteright Aring -80 KPX quoteright comma -53 KPX quoteright d -30 KPX quoteright o -34 KPX quoteright period -51 KPX quoteright r -20 KPX quoteright s -27 KPX quoteright t -11 KPX quoteright v -11 KPX quoteright w -4 KPX quoteright y -9 KPX r a -1 KPX r aacute -1 KPX r acircumflex -1 KPX r adieresis -1 KPX r ae -2 KPX r agrave -1 KPX r aring -1 KPX r c -6 KPX r ccedilla -6 KPX r colon -36 KPX r comma -64 KPX r d -5 KPX r e 2 KPX r eacute 2 KPX r ecircumflex 2 KPX r egrave 2 KPX r f 15 KPX r g -7 KPX r h -12 KPX r hyphen -40 KPX r i -12 KPX r j -13 KPX r k -8 KPX r l -12 KPX r m -8 KPX r n -10 KPX r o -7 KPX r oacute -7 KPX r ocircumflex -7 KPX r odieresis -7 KPX r oe -2 KPX r ograve -7 KPX r oslash -12 KPX r p -7 KPX r period -63 KPX r q -2 KPX r quoteright 4 KPX r r -10 KPX r s -4 KPX r semicolon -37 KPX r t 15 KPX r u -8 KPX r v 12 KPX r w 17 KPX r x 7 KPX r y 14 KPX r z 2 KPX s quoteright -12 KPX s t -9 KPX seven colon -71 KPX seven comma -95 KPX seven eight -10 KPX seven five -28 KPX seven four -70 KPX seven one -21 KPX seven period -94 KPX seven seven 2 KPX seven six -21 KPX seven three -7 KPX seven two -11 KPX six four -1 KPX six one -29 KPX six seven -13 KPX t S -9 KPX t a -3 KPX t aacute -3 KPX t adieresis -3 KPX t ae -5 KPX t aring -3 KPX t colon -41 KPX t e -5 KPX t eacute -5 KPX t h -9 KPX t o -15 KPX t oacute -15 KPX t odieresis -15 KPX t quoteright -3 KPX t semicolon -42 KPX three four -2 KPX three one -34 KPX three seven -19 KPX two four -16 KPX two one -24 KPX two seven -12 KPX u quoteright -8 KPX v a -21 KPX v aacute -21 KPX v acircumflex -21 KPX v adieresis -21 KPX v ae -21 KPX v agrave -21 KPX v aring -21 KPX v atilde -21 KPX v c -25 KPX v colon -41 KPX v comma -57 KPX v e -18 KPX v eacute -18 KPX v ecircumflex -18 KPX v egrave -18 KPX v g -26 KPX v hyphen -5 KPX v l -12 KPX v o -28 KPX v oacute -28 KPX v odieresis -28 KPX v ograve -28 KPX v oslash -28 KPX v period -55 KPX v s -25 KPX v semicolon -43 KPX w a -11 KPX w aacute -11 KPX w acircumflex -11 KPX w adieresis -11 KPX w ae -12 KPX w agrave -11 KPX w aring -11 KPX w atilde -11 KPX w c -12 KPX w colon -36 KPX w comma -38 KPX w e -5 KPX w eacute -5 KPX w ecircumflex -5 KPX w egrave -5 KPX w g -13 KPX w hyphen 7 KPX w l -8 KPX w o -15 KPX w oacute -15 KPX w odieresis -15 KPX w ograve -15 KPX w oslash -14 KPX w period -36 KPX w s -15 KPX w semicolon -38 KPX x a -22 KPX x c -27 KPX x e -20 KPX x eacute -20 KPX x o -30 KPX x q -23 KPX y a -20 KPX y aacute -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y ae -20 KPX y agrave -20 KPX y aring -20 KPX y atilde -20 KPX y c -26 KPX y colon -40 KPX y comma -58 KPX y e -19 KPX y eacute -19 KPX y ecircumflex -19 KPX y egrave -19 KPX y g -27 KPX y hyphen -4 KPX y l -11 KPX y o -28 KPX y oacute -28 KPX y odieresis -28 KPX y ograve -28 KPX y oslash -27 KPX y period -55 KPX y s -24 KPX y semicolon -43 KPX zero four -3 KPX zero one -29 KPX zero seven -21 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n022003l.afm0000644000076500001440000007626607056046553016423 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusMonL-Regu FullName Nimbus Mono L Regular FamilyName Nimbus Mono L Weight Regular ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -12 -237 650 811 CapHeight 563 XHeight 417 Descender -186 Ascender 604 StartCharMetrics 316 C 32 ; WX 600 ; N space ; B 295 0 295 0 ; C 33 ; WX 600 ; N exclam ; B 240 -15 360 618 ; C 34 ; WX 600 ; N quotedbl ; B 146 315 454 604 ; C 35 ; WX 600 ; N numbersign ; B 92 -62 508 647 ; C 36 ; WX 600 ; N dollar ; B 113 -92 487 655 ; C 37 ; WX 600 ; N percent ; B 87 -12 513 611 ; C 38 ; WX 600 ; N ampersand ; B 105 -16 478 519 ; C 39 ; WX 600 ; N quoteright ; B 135 314 340 604 ; C 40 ; WX 600 ; N parenleft ; B 294 -124 458 604 ; C 41 ; WX 600 ; N parenright ; B 147 -124 311 604 ; C 42 ; WX 600 ; N asterisk ; B 113 250 487 604 ; C 43 ; WX 600 ; N plus ; B 72 32 528 530 ; C 44 ; WX 600 ; N comma ; B 135 -145 340 145 ; C 45 ; WX 600 ; N hyphen ; B 72 258 528 299 ; C 46 ; WX 600 ; N period ; B 226 -15 374 116 ; C 47 ; WX 600 ; N slash ; B 113 -81 487 668 ; C 48 ; WX 600 ; N zero ; B 113 -15 487 618 ; C 49 ; WX 600 ; N one ; B 113 0 487 612 ; C 50 ; WX 600 ; N two ; B 84 0 478 618 ; C 51 ; WX 600 ; N three ; B 96 -15 499 618 ; C 52 ; WX 600 ; N four ; B 105 0 478 604 ; C 53 ; WX 600 ; N five ; B 96 -15 499 604 ; C 54 ; WX 600 ; N six ; B 136 -15 510 618 ; C 55 ; WX 600 ; N seven ; B 105 -1 478 604 ; C 56 ; WX 600 ; N eight ; B 113 -15 487 618 ; C 57 ; WX 600 ; N nine ; B 136 -15 510 618 ; C 58 ; WX 600 ; N colon ; B 226 -15 374 417 ; C 59 ; WX 600 ; N semicolon ; B 139 -145 350 417 ; C 60 ; WX 600 ; N less ; B 72 44 522 518 ; C 61 ; WX 600 ; N equal ; B 51 190 549 375 ; C 62 ; WX 600 ; N greater ; B 78 44 528 518 ; C 63 ; WX 600 ; N question ; B 134 -15 487 577 ; C 64 ; WX 600 ; N at ; B 105 -62 478 624 ; C 65 ; WX 600 ; N A ; B 9 0 591 563 ; C 66 ; WX 600 ; N B ; B 43 0 541 563 ; C 67 ; WX 600 ; N C ; B 63 -16 534 576 ; C 68 ; WX 600 ; N D ; B 43 0 520 563 ; C 69 ; WX 600 ; N E ; B 43 0 520 563 ; C 70 ; WX 600 ; N F ; B 43 0 520 563 ; C 71 ; WX 600 ; N G ; B 63 -16 562 576 ; C 72 ; WX 600 ; N H ; B 53 0 551 563 ; C 73 ; WX 600 ; N I ; B 113 0 487 563 ; C 74 ; WX 600 ; N J ; B 84 -16 583 563 ; C 75 ; WX 600 ; N K ; B 43 0 572 563 ; C 76 ; WX 600 ; N L ; B 63 0 541 563 ; C 77 ; WX 600 ; N M ; B 11 0 593 563 ; C 78 ; WX 600 ; N N ; B 22 0 562 563 ; C 79 ; WX 600 ; N O ; B 51 -16 549 576 ; C 80 ; WX 600 ; N P ; B 43 0 499 563 ; C 81 ; WX 600 ; N Q ; B 51 -115 549 576 ; C 82 ; WX 600 ; N R ; B 43 0 589 563 ; C 83 ; WX 600 ; N S ; B 92 -16 508 576 ; C 84 ; WX 600 ; N T ; B 72 0 528 563 ; C 85 ; WX 600 ; N U ; B 40 -16 560 563 ; C 86 ; WX 600 ; N V ; B 9 0 591 563 ; C 87 ; WX 600 ; N W ; B 20 0 580 563 ; C 88 ; WX 600 ; N X ; B 40 0 560 563 ; C 89 ; WX 600 ; N Y ; B 51 0 549 563 ; C 90 ; WX 600 ; N Z ; B 103 0 497 563 ; C 91 ; WX 600 ; N bracketleft ; B 280 -124 445 604 ; C 92 ; WX 600 ; N backslash ; B 113 -81 487 668 ; C 93 ; WX 600 ; N bracketright ; B 155 -124 320 604 ; C 94 ; WX 600 ; N asciicircum ; B 113 354 487 615 ; C 95 ; WX 600 ; N underscore ; B -12 -125 612 -75 ; C 96 ; WX 600 ; N quoteleft ; B 260 343 465 604 ; C 97 ; WX 600 ; N a ; B 72 -16 541 431 ; C 98 ; WX 600 ; N b ; B 22 -16 541 604 ; C 99 ; WX 600 ; N c ; B 84 -16 535 431 ; C 100 ; WX 600 ; N d ; B 63 -16 583 604 ; C 101 ; WX 600 ; N e ; B 63 -16 520 431 ; C 102 ; WX 600 ; N f ; B 105 0 541 604 ; C 103 ; WX 600 ; N g ; B 63 -186 562 431 ; C 104 ; WX 600 ; N h ; B 43 0 551 604 ; C 105 ; WX 600 ; N i ; B 92 0 508 624 ; C 106 ; WX 600 ; N j ; B 147 -186 458 624 ; C 107 ; WX 600 ; N k ; B 63 0 541 604 ; C 108 ; WX 600 ; N l ; B 92 0 508 604 ; C 109 ; WX 600 ; N m ; B 11 0 593 431 ; C 110 ; WX 600 ; N n ; B 53 0 541 431 ; C 111 ; WX 600 ; N o ; B 72 -16 528 431 ; C 112 ; WX 600 ; N p ; B 22 -186 541 431 ; C 113 ; WX 600 ; N q ; B 63 -186 583 431 ; C 114 ; WX 600 ; N r ; B 84 0 541 427 ; C 115 ; WX 600 ; N s ; B 103 -16 497 431 ; C 116 ; WX 600 ; N t ; B 43 -16 499 563 ; C 117 ; WX 600 ; N u ; B 43 -16 541 417 ; C 118 ; WX 600 ; N v ; B 30 0 570 417 ; C 119 ; WX 600 ; N w ; B 30 0 570 417 ; C 120 ; WX 600 ; N x ; B 51 0 549 417 ; C 121 ; WX 600 ; N y ; B 51 -186 549 417 ; C 122 ; WX 600 ; N z ; B 115 0 489 417 ; C 123 ; WX 600 ; N braceleft ; B 197 -124 403 604 ; C 124 ; WX 600 ; N bar ; B 280 -124 320 604 ; C 125 ; WX 600 ; N braceright ; B 197 -124 403 604 ; C 126 ; WX 600 ; N asciitilde ; B 92 212 508 348 ; C 161 ; WX 600 ; N exclamdown ; B 240 -216 360 417 ; C 162 ; WX 600 ; N cent ; B 113 -13 469 630 ; C 163 ; WX 600 ; N sterling ; B 63 0 520 578 ; C 164 ; WX 600 ; N fraction ; B 50 138 549 470 ; C 165 ; WX 600 ; N yen ; B 51 0 549 563 ; C 166 ; WX 600 ; N florin ; B 87 -93 518 618 ; C 167 ; WX 600 ; N section ; B 66 -62 534 603 ; C 168 ; WX 600 ; N currency ; B 103 95 497 489 ; C 169 ; WX 600 ; N quotesingle ; B 236 315 364 604 ; C 170 ; WX 600 ; N quotedblleft ; B 93 343 507 604 ; C 171 ; WX 600 ; N guillemotleft ; B 63 0 541 417 ; C 172 ; WX 600 ; N guilsinglleft ; B 63 0 312 417 ; C 173 ; WX 600 ; N guilsinglright ; B 293 0 541 417 ; C 174 ; WX 600 ; N fi ; B 10 0 585 624 ; C 175 ; WX 600 ; N fl ; B 10 0 587 604 ; C 177 ; WX 600 ; N endash ; B 72 261 528 302 ; C 178 ; WX 600 ; N dagger ; B 124 -63 476 604 ; C 179 ; WX 600 ; N daggerdbl ; B 124 -62 476 604 ; C 180 ; WX 600 ; N periodcentered ; B 226 217 374 348 ; C 182 ; WX 600 ; N paragraph ; B 79 -62 525 604 ; C 183 ; WX 600 ; N bullet ; B 202 141 398 337 ; C 184 ; WX 600 ; N quotesinglbase ; B 135 -145 340 145 ; C 185 ; WX 600 ; N quotedblbase ; B 93 -116 507 145 ; C 186 ; WX 600 ; N quotedblright ; B 93 343 507 604 ; C 187 ; WX 600 ; N guillemotright ; B 63 0 541 417 ; C 188 ; WX 600 ; N ellipsis ; B 51 -15 549 84 ; C 189 ; WX 600 ; N perthousand ; B 34 -9 564 614 ; C 191 ; WX 600 ; N questiondown ; B 113 -175 466 417 ; C 193 ; WX 600 ; N grave ; B 155 490 320 639 ; C 194 ; WX 600 ; N acute ; B 280 490 445 639 ; C 195 ; WX 600 ; N circumflex ; B 155 490 445 639 ; C 196 ; WX 600 ; N tilde ; B 145 516 455 605 ; C 197 ; WX 600 ; N macron ; B 155 536 445 576 ; C 198 ; WX 600 ; N breve ; B 155 490 445 620 ; C 199 ; WX 600 ; N dotaccent ; B 250 511 350 611 ; C 200 ; WX 600 ; N dieresis ; B 140 511 461 611 ; C 202 ; WX 600 ; N ring ; B 207 480 393 661 ; C 203 ; WX 600 ; N cedilla ; B 210 -173 377 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 155 490 445 633 ; C 206 ; WX 600 ; N ogonek ; B 280 -155 433 0 ; C 207 ; WX 600 ; N caron ; B 155 490 445 639 ; C 208 ; WX 600 ; N emdash ; B 1 261 599 302 ; C 225 ; WX 600 ; N AE ; B 10 0 590 563 ; C 227 ; WX 600 ; N ordfeminine ; B 155 279 447 574 ; C 232 ; WX 600 ; N Lslash ; B 43 0 541 563 ; C 233 ; WX 600 ; N Oslash ; B 40 -43 560 605 ; C 234 ; WX 600 ; N OE ; B 10 0 590 563 ; C 235 ; WX 600 ; N ordmasculine ; B 154 284 448 577 ; C 241 ; WX 600 ; N ae ; B 12 -16 578 431 ; C 245 ; WX 600 ; N dotlessi ; B 92 0 508 417 ; C 248 ; WX 600 ; N lslash ; B 92 0 508 604 ; C 249 ; WX 600 ; N oslash ; B 53 -43 543 458 ; C 250 ; WX 600 ; N oe ; B 12 -16 578 431 ; C 251 ; WX 600 ; N germandbls ; B 43 -16 499 604 ; C -1 ; WX 600 ; N Udieresis ; B 40 -16 560 761 ; C -1 ; WX 600 ; N Uacute ; B 40 -16 560 789 ; C -1 ; WX 600 ; N Scedilla ; B 92 -173 508 576 ; C -1 ; WX 600 ; N Tcaron ; B 72 0 528 789 ; C -1 ; WX 600 ; N Scaron ; B 92 -16 508 789 ; C -1 ; WX 600 ; N Rcaron ; B 43 0 589 789 ; C -1 ; WX 600 ; N Racute ; B 43 0 589 789 ; C -1 ; WX 600 ; N Sacute ; B 92 -16 508 789 ; C -1 ; WX 600 ; N Otilde ; B 51 -16 549 755 ; C -1 ; WX 600 ; N ucircumflex ; B 43 -16 541 639 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 51 -16 549 783 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 40 -16 560 783 ; C -1 ; WX 600 ; N Yacute ; B 51 0 549 789 ; C -1 ; WX 600 ; N Eth ; B 0 0 520 563 ; C -1 ; WX 600 ; N Dcroat ; B 0 0 520 563 ; C -1 ; WX 600 ; N Zacute ; B 103 0 497 789 ; C -1 ; WX 600 ; N Uring ; B 40 -16 560 811 ; C -1 ; WX 600 ; N gbreve ; B 63 -186 562 620 ; C -1 ; WX 600 ; N eogonek ; B 63 -155 520 431 ; C -1 ; WX 600 ; N edotaccent ; B 63 -16 520 611 ; C -1 ; WX 600 ; N ecaron ; B 63 -16 520 639 ; C -1 ; WX 600 ; N Ugrave ; B 40 -16 560 789 ; C -1 ; WX 600 ; N Thorn ; B 43 0 499 563 ; C -1 ; WX 600 ; N eacute ; B 63 -16 520 639 ; C -1 ; WX 600 ; N edieresis ; B 63 -16 520 611 ; C -1 ; WX 600 ; N dcaron ; B 63 -16 650 616 ; C -1 ; WX 600 ; N ccedilla ; B 84 -173 535 431 ; C -1 ; WX 600 ; N ccaron ; B 84 -16 535 639 ; C -1 ; WX 600 ; N cacute ; B 84 -16 535 639 ; C -1 ; WX 600 ; N aogonek ; B 72 -155 556 431 ; C -1 ; WX 600 ; N aring ; B 72 -16 541 661 ; C -1 ; WX 600 ; N atilde ; B 72 -16 541 605 ; C -1 ; WX 600 ; N abreve ; B 72 -16 541 620 ; C -1 ; WX 600 ; N egrave ; B 63 -16 520 639 ; C -1 ; WX 600 ; N agrave ; B 72 -16 541 639 ; C -1 ; WX 600 ; N aacute ; B 72 -16 541 639 ; C -1 ; WX 600 ; N adieresis ; B 72 -16 541 611 ; C -1 ; WX 600 ; N Uogonek ; B 40 -155 560 563 ; C -1 ; WX 600 ; N ugrave ; B 43 -16 541 639 ; C -1 ; WX 600 ; N uacute ; B 43 -16 541 639 ; C -1 ; WX 600 ; N udieresis ; B 43 -16 541 611 ; C -1 ; WX 600 ; N tcaron ; B 43 -16 508 616 ; C -1 ; WX 600 ; N scommaaccent ; B 103 -237 497 431 ; C -1 ; WX 600 ; N Zcaron ; B 103 0 497 789 ; C -1 ; WX 600 ; N ecircumflex ; B 63 -16 520 639 ; C -1 ; WX 600 ; N Ucircumflex ; B 40 -16 560 789 ; C -1 ; WX 600 ; N acircumflex ; B 72 -16 541 639 ; C -1 ; WX 600 ; N Zdotaccent ; B 103 0 497 761 ; C -1 ; WX 600 ; N scaron ; B 103 -16 497 639 ; C -1 ; WX 600 ; N Amacron ; B 9 0 591 726 ; C -1 ; WX 600 ; N sacute ; B 103 -16 497 639 ; C -1 ; WX 600 ; N Tcommaaccent ; B 72 -237 528 563 ; C -1 ; WX 600 ; N Ydieresis ; B 51 0 549 761 ; C -1 ; WX 600 ; N thorn ; B 22 -186 541 590 ; C -1 ; WX 600 ; N Emacron ; B 43 0 520 726 ; C -1 ; WX 600 ; N Ograve ; B 51 -16 549 789 ; C -1 ; WX 600 ; N Oacute ; B 51 -16 549 789 ; C -1 ; WX 600 ; N Odieresis ; B 51 -16 549 761 ; C -1 ; WX 600 ; N Ntilde ; B 22 0 562 755 ; C -1 ; WX 600 ; N Ncaron ; B 22 0 562 789 ; C -1 ; WX 600 ; N Nacute ; B 22 0 562 789 ; C -1 ; WX 600 ; N Lcaron ; B 63 0 541 566 ; C -1 ; WX 600 ; N Lacute ; B 63 0 541 789 ; C -1 ; WX 600 ; N Idotaccent ; B 113 0 487 761 ; C -1 ; WX 600 ; N racute ; B 84 0 541 639 ; C -1 ; WX 600 ; N Icircumflex ; B 113 0 487 789 ; C -1 ; WX 600 ; N ohungarumlaut ; B 72 -16 528 633 ; C -1 ; WX 600 ; N otilde ; B 72 -16 528 605 ; C -1 ; WX 600 ; N Euro ; B 11 -16 534 576 ; C -1 ; WX 600 ; N ocircumflex ; B 72 -16 528 639 ; C -1 ; WX 600 ; N onesuperior ; B 191 259 410 612 ; C -1 ; WX 600 ; N twosuperior ; B 175 259 405 612 ; C -1 ; WX 600 ; N threesuperior ; B 181 251 416 612 ; C -1 ; WX 600 ; N Igrave ; B 113 0 487 789 ; C -1 ; WX 600 ; N Iacute ; B 113 0 487 789 ; C -1 ; WX 600 ; N Imacron ; B 113 0 487 726 ; C -1 ; WX 600 ; N Iogonek ; B 113 -155 500 563 ; C -1 ; WX 600 ; N Idieresis ; B 113 0 487 761 ; C -1 ; WX 600 ; N Gbreve ; B 63 -16 562 770 ; C -1 ; WX 600 ; N Umacron ; B 40 -16 560 726 ; C -1 ; WX 600 ; N Kcommaaccent ; B 43 -237 572 563 ; C -1 ; WX 600 ; N ograve ; B 72 -16 528 639 ; C -1 ; WX 600 ; N Scommaaccent ; B 92 -237 508 576 ; C -1 ; WX 600 ; N Eogonek ; B 43 -155 549 563 ; C -1 ; WX 600 ; N oacute ; B 72 -16 528 639 ; C -1 ; WX 600 ; N Edotaccent ; B 43 0 520 761 ; C -1 ; WX 600 ; N iogonek ; B 92 -155 520 624 ; C -1 ; WX 600 ; N gcommaaccent ; B 63 -186 562 666 ; C -1 ; WX 600 ; N odieresis ; B 72 -16 528 611 ; C -1 ; WX 600 ; N ntilde ; B 53 0 541 605 ; C -1 ; WX 600 ; N ncaron ; B 53 0 541 639 ; C -1 ; WX 600 ; N Ecaron ; B 43 0 520 789 ; C -1 ; WX 600 ; N Ecircumflex ; B 43 0 520 789 ; C -1 ; WX 600 ; N scedilla ; B 103 -173 497 431 ; C -1 ; WX 600 ; N rcaron ; B 84 0 541 639 ; C -1 ; WX 600 ; N Egrave ; B 43 0 520 789 ; C -1 ; WX 600 ; N Eacute ; B 43 0 520 789 ; C -1 ; WX 600 ; N Gcommaaccent ; B 63 -237 562 576 ; C -1 ; WX 600 ; N Rcommaaccent ; B 43 -237 589 563 ; C -1 ; WX 600 ; N Edieresis ; B 43 0 520 761 ; C -1 ; WX 600 ; N nacute ; B 53 0 541 639 ; C -1 ; WX 600 ; N uogonek ; B 43 -155 556 417 ; C -1 ; WX 600 ; N umacron ; B 43 -16 541 576 ; C -1 ; WX 600 ; N Dcaron ; B 43 0 520 789 ; C -1 ; WX 600 ; N lcaron ; B 92 0 508 616 ; C -1 ; WX 600 ; N Ccaron ; B 63 -16 534 789 ; C -1 ; WX 600 ; N Cacute ; B 63 -16 534 789 ; C -1 ; WX 600 ; N Ccedilla ; B 63 -173 534 576 ; C -1 ; WX 600 ; N degree ; B 155 346 445 636 ; C -1 ; WX 600 ; N Aogonek ; B 9 -155 600 563 ; C -1 ; WX 600 ; N minus ; B 72 261 528 302 ; C -1 ; WX 600 ; N multiply ; B 118 100 482 464 ; C -1 ; WX 600 ; N divide ; B 72 25 528 540 ; C -1 ; WX 600 ; N Aring ; B 9 0 591 811 ; C -1 ; WX 600 ; N trademark ; B 4 243 598 563 ; C -1 ; WX 600 ; N rcommaaccent ; B 84 -237 541 427 ; C -1 ; WX 600 ; N lacute ; B 92 0 508 789 ; C -1 ; WX 600 ; N omacron ; B 72 -16 528 576 ; C -1 ; WX 600 ; N Atilde ; B 9 0 591 755 ; C -1 ; WX 600 ; N icircumflex ; B 92 0 508 639 ; C -1 ; WX 600 ; N igrave ; B 92 0 508 639 ; C -1 ; WX 600 ; N ncommaaccent ; B 53 -237 541 431 ; C -1 ; WX 600 ; N lcommaaccent ; B 92 -237 508 604 ; C -1 ; WX 600 ; N plusminus ; B 72 0 528 529 ; C -1 ; WX 600 ; N onehalf ; B 23 0 573 612 ; C -1 ; WX 600 ; N onequarter ; B 16 0 580 612 ; C -1 ; WX 600 ; N threequarters ; B 6 0 580 612 ; C -1 ; WX 600 ; N iacute ; B 92 0 508 639 ; C -1 ; WX 600 ; N Abreve ; B 9 0 591 770 ; C -1 ; WX 600 ; N kcommaaccent ; B 63 -237 541 604 ; C -1 ; WX 600 ; N Omacron ; B 51 -16 549 726 ; C -1 ; WX 600 ; N imacron ; B 92 0 508 576 ; C -1 ; WX 600 ; N emacron ; B 63 -16 520 576 ; C -1 ; WX 600 ; N amacron ; B 72 -16 541 576 ; C -1 ; WX 600 ; N tcommaaccent ; B 43 -237 499 563 ; C -1 ; WX 600 ; N ydieresis ; B 51 -186 549 611 ; C -1 ; WX 600 ; N zdotaccent ; B 115 0 489 611 ; C -1 ; WX 600 ; N zcaron ; B 115 0 489 639 ; C -1 ; WX 600 ; N zacute ; B 115 0 489 639 ; C -1 ; WX 600 ; N yacute ; B 51 -186 549 639 ; C -1 ; WX 600 ; N uhungarumlaut ; B 43 -16 541 633 ; C -1 ; WX 600 ; N eth ; B 72 -17 528 620 ; C -1 ; WX 600 ; N uring ; B 43 -16 541 661 ; C -1 ; WX 600 ; N Ocircumflex ; B 51 -16 549 789 ; C -1 ; WX 600 ; N commaaccent ; B 234 -237 367 -60 ; C -1 ; WX 600 ; N copyright ; B 3 -15 596 578 ; C -1 ; WX 600 ; N registered ; B 3 -15 596 578 ; C -1 ; WX 600 ; N Acircumflex ; B 9 0 591 789 ; C -1 ; WX 600 ; N idieresis ; B 92 0 508 611 ; C -1 ; WX 600 ; N lozenge ; B 89 -11 511 575 ; C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; C -1 ; WX 600 ; N notequal ; B 51 94 549 464 ; C -1 ; WX 600 ; N radical ; B 27 0 628 699 ; C -1 ; WX 600 ; N Agrave ; B 9 0 591 789 ; C -1 ; WX 600 ; N Aacute ; B 9 0 591 789 ; C -1 ; WX 600 ; N lessequal ; B 53 0 525 535 ; C -1 ; WX 600 ; N greaterequal ; B 59 0 531 535 ; C -1 ; WX 600 ; N logicalnot ; B 72 168 528 438 ; C -1 ; WX 600 ; N summation ; B 113 -127 507 563 ; C -1 ; WX 600 ; N partialdiff ; B 71 -17 529 582 ; C -1 ; WX 600 ; N Ncommaaccent ; B 22 -237 562 563 ; C -1 ; WX 600 ; N dcroat ; B 63 -16 583 604 ; C -1 ; WX 600 ; N brokenbar ; B 280 -124 320 604 ; C -1 ; WX 600 ; N Lcommaaccent ; B 63 -237 541 563 ; C -1 ; WX 600 ; N Adieresis ; B 9 0 591 761 ; C -1 ; WX 600 ; N mu ; B 43 -200 541 417 ; C -1 ; WX 600 ; N .notdef ; B 295 0 295 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -33 KPX A Ccedilla -30 KPX A G -27 KPX A O -27 KPX A Odieresis -27 KPX A Q -28 KPX A T -27 KPX A U -32 KPX A Uacute -32 KPX A Ucircumflex -32 KPX A Udieresis -32 KPX A Ugrave -32 KPX A V -74 KPX A W -12 KPX A Y -28 KPX A a 8 KPX A b 46 KPX A c -19 KPX A ccedilla -15 KPX A comma -39 KPX A d -10 KPX A e -14 KPX A g -23 KPX A guillemotleft -49 KPX A guilsinglleft -49 KPX A hyphen -30 KPX A o -16 KPX A period -67 KPX A q -24 KPX A quotedblright -78 KPX A quoteright -98 KPX A t -26 KPX A u -15 KPX A v -55 KPX A w -19 KPX A y -60 KPX Aacute C -33 KPX Aacute G -27 KPX Aacute O -27 KPX Aacute Q -28 KPX Aacute T -27 KPX Aacute U -32 KPX Aacute V -74 KPX Aacute W -12 KPX Aacute Y -28 KPX Aacute a 8 KPX Aacute b 46 KPX Aacute c -19 KPX Aacute comma -39 KPX Aacute d -10 KPX Aacute e -14 KPX Aacute g -23 KPX Aacute guillemotleft -49 KPX Aacute guilsinglleft -49 KPX Aacute hyphen -30 KPX Aacute o -16 KPX Aacute period -67 KPX Aacute q -24 KPX Aacute quoteright -98 KPX Aacute t -26 KPX Aacute u -15 KPX Aacute v -55 KPX Aacute w -19 KPX Aacute y -60 KPX Acircumflex C -33 KPX Acircumflex G -27 KPX Acircumflex O -27 KPX Acircumflex Q -28 KPX Acircumflex T -27 KPX Acircumflex U -32 KPX Acircumflex V -74 KPX Acircumflex W -12 KPX Acircumflex Y -28 KPX Acircumflex comma -39 KPX Acircumflex period -67 KPX Adieresis C -33 KPX Adieresis G -27 KPX Adieresis O -27 KPX Adieresis Q -28 KPX Adieresis T -27 KPX Adieresis U -32 KPX Adieresis V -74 KPX Adieresis W -12 KPX Adieresis Y -28 KPX Adieresis a 8 KPX Adieresis b 46 KPX Adieresis c -19 KPX Adieresis comma -39 KPX Adieresis d -10 KPX Adieresis g -23 KPX Adieresis guillemotleft -49 KPX Adieresis guilsinglleft -49 KPX Adieresis hyphen -30 KPX Adieresis o -16 KPX Adieresis period -67 KPX Adieresis q -24 KPX Adieresis quotedblright -78 KPX Adieresis quoteright -98 KPX Adieresis t -26 KPX Adieresis u -15 KPX Adieresis v -55 KPX Adieresis w -19 KPX Adieresis y -60 KPX Agrave C -33 KPX Agrave G -27 KPX Agrave O -27 KPX Agrave Q -28 KPX Agrave T -27 KPX Agrave U -32 KPX Agrave V -74 KPX Agrave W -12 KPX Agrave Y -28 KPX Agrave comma -39 KPX Agrave period -67 KPX Aring C -33 KPX Aring G -27 KPX Aring O -27 KPX Aring Q -28 KPX Aring T -27 KPX Aring U -32 KPX Aring V -74 KPX Aring W -12 KPX Aring Y -28 KPX Aring a 8 KPX Aring b 46 KPX Aring c -19 KPX Aring comma -39 KPX Aring d -10 KPX Aring e -14 KPX Aring g -23 KPX Aring guillemotleft -49 KPX Aring guilsinglleft -49 KPX Aring hyphen -30 KPX Aring o -16 KPX Aring period -67 KPX Aring q -24 KPX Aring quotedblright -78 KPX Aring quoteright -98 KPX Aring t -26 KPX Aring u -15 KPX Aring v -55 KPX Aring w -19 KPX Aring y -60 KPX Atilde C -33 KPX Atilde G -27 KPX Atilde O -27 KPX Atilde Q -28 KPX Atilde T -27 KPX Atilde U -32 KPX Atilde V -74 KPX Atilde W -12 KPX Atilde Y -28 KPX Atilde comma -39 KPX Atilde period -67 KPX B A -9 KPX B AE -9 KPX B Aacute -9 KPX B Acircumflex -9 KPX B Adieresis -9 KPX B Aring -9 KPX B Atilde -9 KPX B O -10 KPX B OE 10 KPX B Oacute -10 KPX B Ocircumflex -10 KPX B Odieresis -10 KPX B Ograve -10 KPX B Oslash -8 KPX B V -29 KPX B W -12 KPX B Y -50 KPX C A -9 KPX C AE -9 KPX C Aacute -9 KPX C Adieresis -9 KPX C Aring -9 KPX C H -26 KPX C K -11 KPX C O -21 KPX C Oacute -21 KPX C Odieresis -21 KPX Ccedilla A -5 KPX D A -42 KPX D Aacute -42 KPX D Acircumflex -42 KPX D Adieresis -42 KPX D Agrave -42 KPX D Aring -42 KPX D Atilde -42 KPX D J -31 KPX D T -40 KPX D V -42 KPX D W -17 KPX D X -55 KPX D Y -63 KPX F A -38 KPX F Aacute -38 KPX F Acircumflex -38 KPX F Adieresis -38 KPX F Agrave -38 KPX F Aring -38 KPX F Atilde -38 KPX F J -95 KPX F O -27 KPX F Odieresis -27 KPX F a -47 KPX F aacute -47 KPX F adieresis -43 KPX F ae -20 KPX F aring -47 KPX F comma -168 KPX F e -56 KPX F eacute -56 KPX F hyphen -67 KPX F i -47 KPX F j -54 KPX F o -63 KPX F oacute -63 KPX F odieresis -48 KPX F oe -21 KPX F oslash -63 KPX F period -193 KPX F r -32 KPX F u -1 KPX G A 6 KPX G AE 5 KPX G Aacute 6 KPX G Acircumflex 6 KPX G Adieresis 6 KPX G Agrave 6 KPX G Aring 6 KPX G Atilde 6 KPX G T -25 KPX G V 6 KPX G W 1 KPX G Y -14 KPX J A -7 KPX J AE -16 KPX J Adieresis -7 KPX J Aring -7 KPX K C -42 KPX K G -36 KPX K O -37 KPX K OE -19 KPX K Oacute -37 KPX K Odieresis -37 KPX K S -9 KPX K T -12 KPX K a -1 KPX K adieresis -1 KPX K ae 26 KPX K aring -1 KPX K e -24 KPX K hyphen -61 KPX K o -25 KPX K oacute -25 KPX K odieresis -25 KPX K u -25 KPX K udieresis -25 KPX K y -67 KPX L A 17 KPX L AE 16 KPX L Aacute 17 KPX L Adieresis 17 KPX L Aring 17 KPX L C -11 KPX L Ccedilla -10 KPX L G -10 KPX L O -6 KPX L Oacute -6 KPX L Ocircumflex -6 KPX L Odieresis -6 KPX L Ograve -6 KPX L Otilde -6 KPX L S -24 KPX L T -52 KPX L U -29 KPX L Udieresis -29 KPX L V -66 KPX L W -27 KPX L Y -53 KPX L hyphen 3 KPX L quotedblright -66 KPX L quoteright -73 KPX L u -16 KPX L udieresis -16 KPX L y -45 KPX N A -3 KPX N AE -3 KPX N Aacute -3 KPX N Adieresis -3 KPX N Aring -3 KPX N C -12 KPX N Ccedilla -12 KPX N G -11 KPX N O -9 KPX N Oacute -9 KPX N Odieresis -9 KPX N a -19 KPX N aacute -19 KPX N adieresis -19 KPX N ae 11 KPX N aring -19 KPX N comma -58 KPX N e -6 KPX N eacute -6 KPX N o -10 KPX N oacute -10 KPX N odieresis -10 KPX N oslash -7 KPX N period -83 KPX N u -9 KPX N udieresis -9 KPX O A -27 KPX O AE -26 KPX O Aacute -27 KPX O Adieresis -27 KPX O Aring -27 KPX O T -30 KPX O V -31 KPX O W -5 KPX O X -43 KPX O Y -52 KPX Oacute A -27 KPX Oacute T -30 KPX Oacute V -31 KPX Oacute W -5 KPX Oacute Y -52 KPX Ocircumflex T -30 KPX Ocircumflex V -31 KPX Ocircumflex Y -52 KPX Odieresis A -27 KPX Odieresis T -30 KPX Odieresis V -31 KPX Odieresis W -5 KPX Odieresis X -43 KPX Odieresis Y -52 KPX Ograve T -30 KPX Ograve V -31 KPX Ograve Y -52 KPX Oslash A -26 KPX Otilde T -30 KPX Otilde V -31 KPX Otilde Y -52 KPX P A -79 KPX P AE -76 KPX P Aacute -79 KPX P Adieresis -79 KPX P Aring -79 KPX P J -82 KPX P a -52 KPX P aacute -52 KPX P adieresis -52 KPX P ae -25 KPX P aring -52 KPX P comma -156 KPX P e -42 KPX P eacute -42 KPX P hyphen -46 KPX P o -48 KPX P oacute -48 KPX P odieresis -48 KPX P oe -13 KPX P oslash -48 KPX P period -181 KPX R C -27 KPX R Ccedilla -28 KPX R G -26 KPX R O -25 KPX R OE -4 KPX R Oacute -25 KPX R Odieresis -25 KPX R T -28 KPX R U -32 KPX R Udieresis -32 KPX R V -33 KPX R W -13 KPX R Y -29 KPX R a 7 KPX R aacute 7 KPX R adieresis 7 KPX R ae 35 KPX R aring 7 KPX R e -15 KPX R eacute -15 KPX R hyphen -48 KPX R o -17 KPX R oacute -17 KPX R odieresis -17 KPX R oe 22 KPX R u -11 KPX R uacute -11 KPX R udieresis -11 KPX R y -15 KPX S A -22 KPX S AE -22 KPX S Aacute -22 KPX S Adieresis -22 KPX S Aring -22 KPX S T -42 KPX S V -10 KPX S W -16 KPX S Y -31 KPX S t -18 KPX T A -27 KPX T AE -27 KPX T Aacute -27 KPX T Acircumflex -27 KPX T Adieresis -27 KPX T Agrave -27 KPX T Aring -27 KPX T Atilde -27 KPX T C -29 KPX T G -30 KPX T J -79 KPX T O -29 KPX T OE -7 KPX T Oacute -29 KPX T Ocircumflex -29 KPX T Odieresis -29 KPX T Ograve -29 KPX T Oslash -29 KPX T Otilde -29 KPX T S -43 KPX T V 10 KPX T W 5 KPX T Y -10 KPX T a -60 KPX T ae -33 KPX T c -88 KPX T colon -136 KPX T comma -108 KPX T e -83 KPX T g -92 KPX T guillemotleft -122 KPX T guilsinglleft -122 KPX T hyphen -94 KPX T i -58 KPX T j -80 KPX T o -85 KPX T oslash -54 KPX T period -136 KPX T r -54 KPX T s -63 KPX T semicolon -111 KPX T u -84 KPX T v -93 KPX T w -88 KPX T y -103 KPX U A -18 KPX U AE -27 KPX U Aacute -18 KPX U Acircumflex -18 KPX U Adieresis -18 KPX U Aring -18 KPX U Atilde -18 KPX U comma -76 KPX U m 6 KPX U n -19 KPX U p 0 KPX U period -101 KPX U r -41 KPX Uacute A -18 KPX Uacute comma -76 KPX Uacute m 6 KPX Uacute n -19 KPX Uacute p 0 KPX Uacute period -101 KPX Uacute r -41 KPX Ucircumflex A -18 KPX Udieresis A -18 KPX Udieresis b 25 KPX Udieresis comma -76 KPX Udieresis m 6 KPX Udieresis n -19 KPX Udieresis p 0 KPX Udieresis period -101 KPX Udieresis r -41 KPX Ugrave A -18 KPX V A -3 KPX V AE -12 KPX V Aacute -3 KPX V Acircumflex -3 KPX V Adieresis -3 KPX V Agrave -3 KPX V Aring -3 KPX V Atilde -3 KPX V C -29 KPX V G -31 KPX V O -31 KPX V Oacute -31 KPX V Ocircumflex -31 KPX V Odieresis -31 KPX V Ograve -31 KPX V Oslash -31 KPX V Otilde -31 KPX V S -34 KPX V T 10 KPX V a -60 KPX V ae -33 KPX V colon -124 KPX V comma -129 KPX V e -52 KPX V g -53 KPX V guillemotleft -75 KPX V guilsinglleft -75 KPX V hyphen -43 KPX V i -60 KPX V o -56 KPX V oslash -53 KPX V period -154 KPX V r -46 KPX V semicolon -114 KPX V u -15 KPX V y -19 KPX W A -8 KPX W AE -14 KPX W Aacute -8 KPX W Acircumflex -8 KPX W Adieresis -8 KPX W Agrave -8 KPX W Aring -8 KPX W Atilde -8 KPX W C -8 KPX W G -7 KPX W O -5 KPX W Oacute -5 KPX W Ocircumflex -5 KPX W Odieresis -5 KPX W Ograve -5 KPX W Oslash -2 KPX W Otilde -5 KPX W S -24 KPX W T 5 KPX W a -20 KPX W ae 10 KPX W colon -88 KPX W comma -66 KPX W e -6 KPX W g -7 KPX W guillemotleft -31 KPX W guilsinglleft -31 KPX W hyphen -2 KPX W i -43 KPX W o -10 KPX W oslash -7 KPX W period -90 KPX W r -29 KPX W semicolon -69 KPX W u 2 KPX W y -2 KPX X C -46 KPX X O -43 KPX X Odieresis -43 KPX X Q -44 KPX X a -7 KPX X e -30 KPX X hyphen -75 KPX X o -31 KPX X u -31 KPX X y -53 KPX Y A -24 KPX Y AE -27 KPX Y Aacute -24 KPX Y Acircumflex -24 KPX Y Adieresis -24 KPX Y Agrave -24 KPX Y Aring -24 KPX Y Atilde -24 KPX Y C -51 KPX Y G -52 KPX Y O -53 KPX Y Oacute -53 KPX Y Ocircumflex -53 KPX Y Odieresis -53 KPX Y Ograve -53 KPX Y Oslash -53 KPX Y Otilde -53 KPX Y S -55 KPX Y T -10 KPX Y a -60 KPX Y ae -32 KPX Y colon -135 KPX Y comma -107 KPX Y e -78 KPX Y g -81 KPX Y guillemotleft -115 KPX Y guilsinglleft -115 KPX Y hyphen -91 KPX Y i -57 KPX Y o -83 KPX Y oslash -54 KPX Y p -35 KPX Y period -135 KPX Y semicolon -110 KPX Y u -46 KPX Y v -39 KPX Z v -50 KPX Z y -61 KPX a j -87 KPX a quoteright -56 KPX a v -28 KPX a w -21 KPX a y -38 KPX aacute v -28 KPX aacute w -21 KPX aacute y -38 KPX adieresis v -28 KPX adieresis w -21 KPX adieresis y -38 KPX ae v 21 KPX ae w 21 KPX ae y 10 KPX agrave v -28 KPX agrave w -21 KPX agrave y -38 KPX aring v -28 KPX aring w -21 KPX aring y -38 KPX b v -12 KPX b w 1 KPX b y -22 KPX c h -3 KPX c k -9 KPX comma one -144 KPX comma quotedblright -119 KPX comma quoteright -136 KPX e quoteright -41 KPX e t -29 KPX e v -22 KPX e w -19 KPX e x -2 KPX e y -33 KPX eacute v -22 KPX eacute w -19 KPX eacute y -33 KPX ecircumflex v -22 KPX ecircumflex w -19 KPX ecircumflex y -33 KPX eight four -58 KPX eight one -75 KPX eight seven -68 KPX f a -38 KPX f aacute -38 KPX f adieresis -22 KPX f ae -11 KPX f aring -38 KPX f e -55 KPX f eacute -55 KPX f f -42 KPX f i -36 KPX f j -59 KPX f l -25 KPX f o -62 KPX f oacute -62 KPX f odieresis -27 KPX f oe -20 KPX f oslash -32 KPX f quoteright -56 KPX f s -41 KPX f t -6 KPX five four -52 KPX five one -86 KPX five seven -72 KPX four four -62 KPX four one -66 KPX four seven -93 KPX g a -10 KPX g adieresis -10 KPX g ae 16 KPX g aring -10 KPX g e -4 KPX g eacute -4 KPX g l -33 KPX g oacute -8 KPX g odieresis -8 KPX g r 0 KPX guillemotright A -43 KPX guillemotright AE -39 KPX guillemotright Aacute -43 KPX guillemotright Adieresis -43 KPX guillemotright Aring -43 KPX guillemotright T -121 KPX guillemotright V -71 KPX guillemotright W -29 KPX guillemotright Y -114 KPX guilsinglright A -43 KPX guilsinglright AE -39 KPX guilsinglright Aacute -43 KPX guilsinglright Adieresis -43 KPX guilsinglright Aring -43 KPX guilsinglright T -121 KPX guilsinglright V -71 KPX guilsinglright W -29 KPX guilsinglright Y -114 KPX h quoteright -49 KPX h y -32 KPX hyphen A -26 KPX hyphen AE -20 KPX hyphen Aacute -26 KPX hyphen Adieresis -26 KPX hyphen Aring -26 KPX hyphen T -95 KPX hyphen V -41 KPX hyphen W -1 KPX hyphen Y -92 KPX i T -58 KPX i j -142 KPX k a -6 KPX k aacute -6 KPX k adieresis -6 KPX k ae 21 KPX k aring -6 KPX k comma -53 KPX k e -29 KPX k eacute -29 KPX k g -38 KPX k hyphen -99 KPX k o -30 KPX k oacute -30 KPX k odieresis -30 KPX k period -81 KPX k s -9 KPX k u -3 KPX k udieresis -3 KPX l v -83 KPX l y -93 KPX m p 22 KPX m v 14 KPX m w 15 KPX m y 3 KPX n T -42 KPX n p -5 KPX n quoteright -47 KPX n v -21 KPX n w -12 KPX n y -31 KPX nine four -51 KPX nine one -75 KPX nine seven -66 KPX o T -85 KPX o quoteright -39 KPX o t -22 KPX o v -21 KPX o w -6 KPX o x -26 KPX o y -31 KPX oacute v -21 KPX oacute w -6 KPX oacute y -31 KPX ocircumflex t -22 KPX odieresis t -22 KPX odieresis v -21 KPX odieresis w -6 KPX odieresis x -26 KPX odieresis y -31 KPX ograve v -21 KPX ograve w -6 KPX ograve y -31 KPX one comma -91 KPX one eight -86 KPX one five -67 KPX one four -119 KPX one nine -75 KPX one one -62 KPX one period -119 KPX one seven -141 KPX one six -111 KPX one three -61 KPX one two -47 KPX one zero -94 KPX p t -15 KPX p y -19 KPX period one -119 KPX period quotedblright -108 KPX period quoteright -125 KPX q c -2 KPX q u 42 KPX quotedblbase A -3 KPX quotedblbase AE -3 KPX quotedblbase T -78 KPX quotedblbase V -83 KPX quotedblbase W -23 KPX quotedblbase Y -79 KPX quotedblleft A -59 KPX quotedblleft AE -52 KPX quotedblleft Aacute -59 KPX quotedblleft Adieresis -59 KPX quotedblleft Aring -59 KPX quotedblleft T -37 KPX quotedblleft V -14 KPX quotedblleft W -3 KPX quotedblleft Y -35 KPX quotedblright A -59 KPX quotedblright AE -68 KPX quotedblright Aacute -59 KPX quotedblright Adieresis -59 KPX quotedblright Aring -59 KPX quotedblright T -45 KPX quotedblright V -14 KPX quotedblright W -20 KPX quotedblright Y -35 KPX quoteleft A -80 KPX quoteleft AE -73 KPX quoteleft Aacute -80 KPX quoteleft Adieresis -80 KPX quoteleft Aring -80 KPX quoteleft T -59 KPX quoteleft V -36 KPX quoteleft W -24 KPX quoteleft Y -56 KPX quoteright A -140 KPX quoteright AE -149 KPX quoteright Aacute -140 KPX quoteright Adieresis -140 KPX quoteright Aring -140 KPX quoteright comma -196 KPX quoteright d -126 KPX quoteright o -131 KPX quoteright period -220 KPX quoteright r -145 KPX quoteright s -140 KPX quoteright t -114 KPX quoteright v -108 KPX quoteright w -105 KPX quoteright y -118 KPX r a -20 KPX r aacute -20 KPX r acircumflex -20 KPX r adieresis -20 KPX r ae 7 KPX r agrave -20 KPX r aring -20 KPX r c -24 KPX r ccedilla -28 KPX r colon -81 KPX r comma -97 KPX r d -14 KPX r e -12 KPX r eacute -12 KPX r ecircumflex -12 KPX r egrave -12 KPX r f -18 KPX r g -11 KPX r h -19 KPX r hyphen -120 KPX r i -28 KPX r j -35 KPX r k -29 KPX r l -47 KPX r m 33 KPX r n 6 KPX r o -19 KPX r oacute -19 KPX r ocircumflex -19 KPX r odieresis -19 KPX r oe 18 KPX r ograve -19 KPX r oslash -19 KPX r p 28 KPX r period -125 KPX r q -11 KPX r quoteright -37 KPX r r -13 KPX r s -24 KPX r semicolon -69 KPX r t 17 KPX r u 17 KPX r v 24 KPX r w 24 KPX r x 2 KPX r y 13 KPX r z -19 KPX s quoteright -48 KPX s t -13 KPX seven colon -148 KPX seven comma -140 KPX seven eight -79 KPX seven five -84 KPX seven four -111 KPX seven one -67 KPX seven period -165 KPX seven seven -62 KPX seven six -99 KPX seven three -72 KPX seven two -69 KPX six four -46 KPX six one -61 KPX six seven -48 KPX t S -35 KPX t a -20 KPX t aacute -20 KPX t adieresis -20 KPX t ae 8 KPX t aring -20 KPX t colon -102 KPX t e -37 KPX t eacute -37 KPX t h -7 KPX t o -39 KPX t oacute -39 KPX t odieresis -39 KPX t quoteright -94 KPX t semicolon -80 KPX three four -52 KPX three one -74 KPX three seven -67 KPX two four -92 KPX two one -66 KPX two seven -71 KPX u quoteright -38 KPX v a -6 KPX v aacute -6 KPX v acircumflex -6 KPX v adieresis -6 KPX v ae 20 KPX v agrave -6 KPX v aring -6 KPX v atilde -6 KPX v c -25 KPX v colon -71 KPX v comma -113 KPX v e -13 KPX v eacute -13 KPX v ecircumflex -13 KPX v egrave -13 KPX v g -11 KPX v hyphen -24 KPX v l -82 KPX v o -21 KPX v oacute -21 KPX v odieresis -21 KPX v ograve -21 KPX v oslash -21 KPX v period -139 KPX v s -19 KPX v semicolon -62 KPX w a -6 KPX w aacute -6 KPX w acircumflex -6 KPX w adieresis -6 KPX w ae 20 KPX w agrave -6 KPX w aring -6 KPX w atilde -6 KPX w c -10 KPX w colon -71 KPX w comma -70 KPX w e -1 KPX w eacute -1 KPX w ecircumflex -1 KPX w egrave -1 KPX w g -3 KPX w hyphen 1 KPX w l -50 KPX w o -6 KPX w oacute -6 KPX w odieresis -6 KPX w ograve -6 KPX w oslash -3 KPX w period -95 KPX w s -18 KPX w semicolon -62 KPX x a -2 KPX x c -29 KPX x e -25 KPX x eacute -25 KPX x o -26 KPX x q -30 KPX y a -17 KPX y aacute -17 KPX y acircumflex -17 KPX y adieresis -17 KPX y ae 10 KPX y agrave -17 KPX y aring -17 KPX y atilde -17 KPX y c -35 KPX y colon -81 KPX y comma -117 KPX y e -24 KPX y eacute -24 KPX y ecircumflex -24 KPX y egrave -24 KPX y g -21 KPX y hyphen -24 KPX y l -93 KPX y o -31 KPX y oacute -31 KPX y odieresis -31 KPX y ograve -31 KPX y oslash -31 KPX y period -144 KPX y s -30 KPX y semicolon -72 KPX zero four -58 KPX zero one -81 KPX zero seven -73 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n022023l.afm0000644000076500001440000007661007056046554016417 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusMonL-ReguObli FullName Nimbus Mono L Regular Oblique FamilyName Nimbus Mono L Weight Regular ItalicAngle -12.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -61 -237 774 811 CapHeight 563 XHeight 417 Descender -186 Ascender 604 StartCharMetrics 316 C 32 ; WX 600 ; N space ; B 319 0 319 0 ; C 33 ; WX 600 ; N exclam ; B 246 -15 463 618 ; C 34 ; WX 600 ; N quotedbl ; B 254 315 582 604 ; C 35 ; WX 600 ; N numbersign ; B 137 -62 589 647 ; C 36 ; WX 600 ; N dollar ; B 131 -92 582 655 ; C 37 ; WX 600 ; N percent ; B 137 -12 591 611 ; C 38 ; WX 600 ; N ampersand ; B 132 -16 527 519 ; C 39 ; WX 600 ; N quoteright ; B 207 314 468 604 ; C 40 ; WX 600 ; N parenleft ; B 335 -124 583 604 ; C 41 ; WX 600 ; N parenright ; B 124 -124 372 604 ; C 42 ; WX 600 ; N asterisk ; B 211 250 586 604 ; C 43 ; WX 600 ; N plus ; B 131 32 588 530 ; C 44 ; WX 600 ; N comma ; B 110 -145 371 145 ; C 45 ; WX 600 ; N hyphen ; B 131 258 588 299 ; C 46 ; WX 600 ; N period ; B 235 -15 386 116 ; C 47 ; WX 600 ; N slash ; B 99 -81 625 668 ; C 48 ; WX 600 ; N zero ; B 156 -15 571 618 ; C 49 ; WX 600 ; N one ; B 117 0 492 612 ; C 50 ; WX 600 ; N two ; B 84 0 572 618 ; C 51 ; WX 600 ; N three ; B 110 -15 579 618 ; C 52 ; WX 600 ; N four ; B 141 0 545 604 ; C 53 ; WX 600 ; N five ; B 113 -15 584 604 ; C 54 ; WX 600 ; N six ; B 184 -15 631 618 ; C 55 ; WX 600 ; N seven ; B 215 -1 606 604 ; C 56 ; WX 600 ; N eight ; B 143 -15 576 618 ; C 57 ; WX 600 ; N nine ; B 142 -15 589 618 ; C 58 ; WX 600 ; N colon ; B 235 -15 450 417 ; C 59 ; WX 600 ; N semicolon ; B 114 -145 426 417 ; C 60 ; WX 600 ; N less ; B 131 44 627 518 ; C 61 ; WX 600 ; N equal ; B 95 190 625 375 ; C 62 ; WX 600 ; N greater ; B 92 44 588 518 ; C 63 ; WX 600 ; N question ; B 231 -15 581 577 ; C 64 ; WX 600 ; N at ; B 139 -62 561 624 ; C 65 ; WX 600 ; N A ; B 13 0 596 563 ; C 66 ; WX 600 ; N B ; B 47 0 591 563 ; C 67 ; WX 600 ; N C ; B 110 -16 635 576 ; C 68 ; WX 600 ; N D ; B 47 0 592 563 ; C 69 ; WX 600 ; N E ; B 47 0 619 563 ; C 70 ; WX 600 ; N F ; B 47 0 640 563 ; C 71 ; WX 600 ; N G ; B 108 -16 636 576 ; C 72 ; WX 600 ; N H ; B 57 0 646 563 ; C 73 ; WX 600 ; N I ; B 117 0 603 563 ; C 74 ; WX 600 ; N J ; B 100 -16 699 563 ; C 75 ; WX 600 ; N K ; B 47 0 662 563 ; C 76 ; WX 600 ; N L ; B 67 0 585 563 ; C 77 ; WX 600 ; N M ; B 15 0 700 563 ; C 78 ; WX 600 ; N N ; B 46 0 678 563 ; C 79 ; WX 600 ; N O ; B 102 -16 616 576 ; C 80 ; WX 600 ; N P ; B 47 0 587 563 ; C 81 ; WX 600 ; N Q ; B 102 -115 616 576 ; C 82 ; WX 600 ; N R ; B 47 0 594 563 ; C 83 ; WX 600 ; N S ; B 96 -17 602 577 ; C 84 ; WX 600 ; N T ; B 152 0 648 563 ; C 85 ; WX 600 ; N U ; B 136 -16 676 563 ; C 86 ; WX 600 ; N V ; B 124 0 707 563 ; C 87 ; WX 600 ; N W ; B 122 0 696 563 ; C 88 ; WX 600 ; N X ; B 44 0 662 563 ; C 89 ; WX 600 ; N Y ; B 153 0 665 563 ; C 90 ; WX 600 ; N Z ; B 103 0 590 563 ; C 91 ; WX 600 ; N bracketleft ; B 254 -124 570 604 ; C 92 ; WX 600 ; N backslash ; B 250 -81 474 668 ; C 93 ; WX 600 ; N bracketright ; B 132 -124 448 604 ; C 94 ; WX 600 ; N asciicircum ; B 192 354 567 615 ; C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; C 96 ; WX 600 ; N quoteleft ; B 388 343 544 604 ; C 97 ; WX 600 ; N a ; B 93 -16 546 431 ; C 98 ; WX 600 ; N b ; B 26 -16 591 604 ; C 99 ; WX 600 ; N c ; B 121 -17 596 432 ; C 100 ; WX 600 ; N d ; B 102 -16 630 604 ; C 101 ; WX 600 ; N e ; B 104 -16 570 431 ; C 102 ; WX 600 ; N f ; B 109 0 663 604 ; C 103 ; WX 600 ; N g ; B 105 -186 647 431 ; C 104 ; WX 600 ; N h ; B 55 0 556 604 ; C 105 ; WX 600 ; N i ; B 96 0 513 624 ; C 106 ; WX 600 ; N j ; B 112 -186 547 624 ; C 107 ; WX 600 ; N k ; B 67 0 578 604 ; C 108 ; WX 600 ; N l ; B 96 0 513 604 ; C 109 ; WX 600 ; N m ; B 15 0 603 431 ; C 110 ; WX 600 ; N n ; B 57 0 546 431 ; C 111 ; WX 600 ; N o ; B 111 -16 577 431 ; C 112 ; WX 600 ; N p ; B -13 -186 593 431 ; C 113 ; WX 600 ; N q ; B 105 -186 668 431 ; C 114 ; WX 600 ; N r ; B 88 0 619 427 ; C 115 ; WX 600 ; N s ; B 108 -17 558 431 ; C 116 ; WX 600 ; N t ; B 127 -16 518 563 ; C 117 ; WX 600 ; N u ; B 127 -16 569 417 ; C 118 ; WX 600 ; N v ; B 114 0 655 417 ; C 119 ; WX 600 ; N w ; B 114 0 655 417 ; C 120 ; WX 600 ; N x ; B 55 0 611 417 ; C 121 ; WX 600 ; N y ; B 22 -186 634 417 ; C 122 ; WX 600 ; N z ; B 115 0 563 417 ; C 123 ; WX 600 ; N braceleft ; B 248 -124 528 604 ; C 124 ; WX 600 ; N bar ; B 257 -124 444 604 ; C 125 ; WX 600 ; N braceright ; B 175 -124 455 604 ; C 126 ; WX 600 ; N asciitilde ; B 145 212 575 348 ; C 161 ; WX 600 ; N exclamdown ; B 222 -216 439 417 ; C 162 ; WX 600 ; N cent ; B 175 -13 563 630 ; C 163 ; WX 600 ; N sterling ; B 90 0 541 578 ; C 164 ; WX 600 ; N fraction ; B 84 138 645 470 ; C 165 ; WX 600 ; N yen ; B 161 0 665 563 ; C 166 ; WX 600 ; N florin ; B 74 -93 643 618 ; C 167 ; WX 600 ; N section ; B 91 -62 624 603 ; C 168 ; WX 600 ; N currency ; B 127 95 597 489 ; C 169 ; WX 600 ; N quotesingle ; B 344 315 492 604 ; C 170 ; WX 600 ; N quotedblleft ; B 221 343 586 604 ; C 171 ; WX 600 ; N guillemotleft ; B 108 0 626 417 ; C 172 ; WX 600 ; N guilsinglleft ; B 108 0 397 417 ; C 173 ; WX 600 ; N guilsinglright ; B 297 0 585 417 ; C 174 ; WX 600 ; N fi ; B 14 0 615 624 ; C 175 ; WX 600 ; N fl ; B 14 0 611 604 ; C 177 ; WX 600 ; N endash ; B 131 261 588 302 ; C 178 ; WX 600 ; N dagger ; B 208 -63 561 604 ; C 179 ; WX 600 ; N daggerdbl ; B 154 -62 561 604 ; C 180 ; WX 600 ; N periodcentered ; B 285 217 436 348 ; C 182 ; WX 600 ; N paragraph ; B 152 -62 648 604 ; C 183 ; WX 600 ; N bullet ; B 253 141 449 337 ; C 184 ; WX 600 ; N quotesinglbase ; B 110 -145 371 145 ; C 185 ; WX 600 ; N quotedblbase ; B 73 -116 538 145 ; C 186 ; WX 600 ; N quotedblright ; B 170 343 635 604 ; C 187 ; WX 600 ; N guillemotright ; B 67 0 585 417 ; C 188 ; WX 600 ; N ellipsis ; B 57 -15 557 84 ; C 189 ; WX 600 ; N perthousand ; B 91 -9 598 614 ; C 191 ; WX 600 ; N questiondown ; B 105 -175 455 417 ; C 193 ; WX 600 ; N grave ; B 286 490 429 639 ; C 194 ; WX 600 ; N acute ; B 388 490 577 639 ; C 195 ; WX 600 ; N circumflex ; B 263 490 554 639 ; C 196 ; WX 600 ; N tilde ; B 258 516 579 605 ; C 197 ; WX 600 ; N macron ; B 273 536 564 576 ; C 198 ; WX 600 ; N breve ; B 280 489 574 621 ; C 199 ; WX 600 ; N dotaccent ; B 368 511 470 611 ; C 200 ; WX 600 ; N dieresis ; B 258 511 581 611 ; C 202 ; WX 600 ; N ring ; B 326 480 516 661 ; C 203 ; WX 600 ; N cedilla ; B 181 -173 356 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 263 490 576 633 ; C 206 ; WX 600 ; N ogonek ; B 258 -155 408 0 ; C 207 ; WX 600 ; N caron ; B 286 490 577 639 ; C 208 ; WX 600 ; N emdash ; B 60 261 659 302 ; C 225 ; WX 600 ; N AE ; B 14 0 690 563 ; C 227 ; WX 600 ; N ordfeminine ; B 229 279 511 574 ; C 232 ; WX 600 ; N Lslash ; B 66 0 586 563 ; C 233 ; WX 600 ; N Oslash ; B 34 -43 685 605 ; C 234 ; WX 600 ; N OE ; B 62 0 690 563 ; C 235 ; WX 600 ; N ordmasculine ; B 243 284 543 577 ; C 241 ; WX 600 ; N ae ; B 36 -16 630 431 ; C 245 ; WX 600 ; N dotlessi ; B 96 0 513 417 ; C 248 ; WX 600 ; N lslash ; B 96 0 524 604 ; C 249 ; WX 600 ; N oslash ; B 47 -43 637 458 ; C 250 ; WX 600 ; N oe ; B 50 -16 630 431 ; C 251 ; WX 600 ; N germandbls ; B 47 -16 539 604 ; C -1 ; WX 600 ; N Udieresis ; B 136 -16 676 762 ; C -1 ; WX 600 ; N Uacute ; B 136 -16 676 789 ; C -1 ; WX 600 ; N Scedilla ; B 96 -179 602 577 ; C -1 ; WX 600 ; N Tcaron ; B 152 0 648 789 ; C -1 ; WX 600 ; N Scaron ; B 96 -17 618 789 ; C -1 ; WX 600 ; N Rcaron ; B 47 0 594 789 ; C -1 ; WX 600 ; N Racute ; B 47 0 594 789 ; C -1 ; WX 600 ; N Sacute ; B 96 -17 602 789 ; C -1 ; WX 600 ; N Otilde ; B 103 -16 618 755 ; C -1 ; WX 600 ; N ucircumflex ; B 127 -16 569 639 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 102 -16 672 787 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 136 -16 676 787 ; C -1 ; WX 600 ; N Yacute ; B 153 0 665 789 ; C -1 ; WX 600 ; N Eth ; B 47 0 592 563 ; C -1 ; WX 600 ; N Dcroat ; B 47 0 592 563 ; C -1 ; WX 600 ; N Zacute ; B 103 0 590 789 ; C -1 ; WX 600 ; N Uring ; B 136 -16 676 807 ; C -1 ; WX 600 ; N gbreve ; B 105 -186 647 621 ; C -1 ; WX 600 ; N eogonek ; B 104 -155 570 431 ; C -1 ; WX 600 ; N edotaccent ; B 104 -16 570 611 ; C -1 ; WX 600 ; N ecaron ; B 104 -16 577 639 ; C -1 ; WX 600 ; N Ugrave ; B 136 -16 676 789 ; C -1 ; WX 600 ; N Thorn ; B 47 0 566 563 ; C -1 ; WX 600 ; N eacute ; B 104 -16 570 639 ; C -1 ; WX 600 ; N edieresis ; B 104 -16 586 611 ; C -1 ; WX 600 ; N dcaron ; B 102 -16 774 618 ; C -1 ; WX 600 ; N ccedilla ; B 122 -173 596 431 ; C -1 ; WX 600 ; N ccaron ; B 121 -17 596 639 ; C -1 ; WX 600 ; N cacute ; B 121 -17 596 639 ; C -1 ; WX 600 ; N aogonek ; B 93 -155 546 431 ; C -1 ; WX 600 ; N aring ; B 93 -16 546 661 ; C -1 ; WX 600 ; N atilde ; B 93 -16 570 605 ; C -1 ; WX 600 ; N abreve ; B 93 -16 574 621 ; C -1 ; WX 600 ; N egrave ; B 104 -16 570 639 ; C -1 ; WX 600 ; N agrave ; B 93 -16 546 639 ; C -1 ; WX 600 ; N aacute ; B 93 -16 546 639 ; C -1 ; WX 600 ; N adieresis ; B 93 -16 571 611 ; C -1 ; WX 600 ; N Uogonek ; B 136 -155 676 563 ; C -1 ; WX 600 ; N ugrave ; B 127 -16 569 639 ; C -1 ; WX 600 ; N uacute ; B 127 -16 569 639 ; C -1 ; WX 600 ; N udieresis ; B 127 -16 573 611 ; C -1 ; WX 600 ; N tcaron ; B 127 -16 593 618 ; C -1 ; WX 600 ; N scommaaccent ; B 108 -237 558 431 ; C -1 ; WX 600 ; N Zcaron ; B 103 0 604 789 ; C -1 ; WX 600 ; N ecircumflex ; B 104 -16 570 639 ; C -1 ; WX 600 ; N Ucircumflex ; B 136 -16 676 789 ; C -1 ; WX 600 ; N acircumflex ; B 93 -16 546 639 ; C -1 ; WX 600 ; N Zdotaccent ; B 103 0 590 762 ; C -1 ; WX 600 ; N scaron ; B 107 -17 584 639 ; C -1 ; WX 600 ; N Amacron ; B 13 0 596 723 ; C -1 ; WX 600 ; N sacute ; B 108 -17 577 639 ; C -1 ; WX 600 ; N Tcommaaccent ; B 152 -237 648 563 ; C -1 ; WX 600 ; N Ydieresis ; B 153 0 665 762 ; C -1 ; WX 600 ; N thorn ; B -13 -186 593 590 ; C -1 ; WX 600 ; N Emacron ; B 47 0 619 723 ; C -1 ; WX 600 ; N Ograve ; B 102 -16 616 789 ; C -1 ; WX 600 ; N Oacute ; B 102 -16 616 789 ; C -1 ; WX 600 ; N Odieresis ; B 102 -16 616 762 ; C -1 ; WX 600 ; N Ntilde ; B 46 0 678 755 ; C -1 ; WX 600 ; N Ncaron ; B 46 0 678 789 ; C -1 ; WX 600 ; N Nacute ; B 46 0 678 789 ; C -1 ; WX 600 ; N Lcaron ; B 67 0 638 576 ; C -1 ; WX 600 ; N Lacute ; B 67 0 585 789 ; C -1 ; WX 600 ; N Idotaccent ; B 117 0 603 762 ; C -1 ; WX 600 ; N racute ; B 88 0 619 639 ; C -1 ; WX 600 ; N Icircumflex ; B 117 0 603 789 ; C -1 ; WX 600 ; N ohungarumlaut ; B 111 -16 616 633 ; C -1 ; WX 600 ; N otilde ; B 111 -16 586 605 ; C -1 ; WX 600 ; N Euro ; B 60 -16 634 576 ; C -1 ; WX 600 ; N ocircumflex ; B 111 -16 577 639 ; C -1 ; WX 600 ; N onesuperior ; B 249 259 469 612 ; C -1 ; WX 600 ; N twosuperior ; B 230 259 514 612 ; C -1 ; WX 600 ; N threesuperior ; B 245 251 516 612 ; C -1 ; WX 600 ; N Igrave ; B 117 0 603 789 ; C -1 ; WX 600 ; N Iacute ; B 117 0 603 789 ; C -1 ; WX 600 ; N Imacron ; B 117 0 603 723 ; C -1 ; WX 600 ; N Iogonek ; B 117 -155 603 563 ; C -1 ; WX 600 ; N Idieresis ; B 117 0 611 762 ; C -1 ; WX 600 ; N Gbreve ; B 108 -16 656 777 ; C -1 ; WX 600 ; N Umacron ; B 136 -16 676 723 ; C -1 ; WX 600 ; N Kcommaaccent ; B 47 -237 662 563 ; C -1 ; WX 600 ; N ograve ; B 111 -16 577 639 ; C -1 ; WX 600 ; N Scommaaccent ; B 96 -237 602 577 ; C -1 ; WX 600 ; N Eogonek ; B 47 -155 619 563 ; C -1 ; WX 600 ; N oacute ; B 111 -16 577 639 ; C -1 ; WX 600 ; N Edotaccent ; B 47 0 619 762 ; C -1 ; WX 600 ; N iogonek ; B 96 -155 513 624 ; C -1 ; WX 600 ; N gcommaaccent ; B 105 -186 647 668 ; C -1 ; WX 600 ; N odieresis ; B 111 -16 581 611 ; C -1 ; WX 600 ; N ntilde ; B 57 0 570 605 ; C -1 ; WX 600 ; N ncaron ; B 57 0 577 639 ; C -1 ; WX 600 ; N Ecaron ; B 47 0 619 789 ; C -1 ; WX 600 ; N Ecircumflex ; B 47 0 619 789 ; C -1 ; WX 600 ; N scedilla ; B 108 -173 558 431 ; C -1 ; WX 600 ; N rcaron ; B 88 0 619 639 ; C -1 ; WX 600 ; N Egrave ; B 47 0 619 789 ; C -1 ; WX 600 ; N Eacute ; B 47 0 619 789 ; C -1 ; WX 600 ; N Gcommaaccent ; B 108 -237 636 576 ; C -1 ; WX 600 ; N Rcommaaccent ; B 47 -237 594 563 ; C -1 ; WX 600 ; N Edieresis ; B 47 0 619 762 ; C -1 ; WX 600 ; N nacute ; B 57 0 577 639 ; C -1 ; WX 600 ; N uogonek ; B 127 -155 569 417 ; C -1 ; WX 600 ; N umacron ; B 127 -16 569 576 ; C -1 ; WX 600 ; N Dcaron ; B 47 0 592 789 ; C -1 ; WX 600 ; N lcaron ; B 96 0 593 618 ; C -1 ; WX 600 ; N Ccaron ; B 110 -16 635 789 ; C -1 ; WX 600 ; N Cacute ; B 110 -16 635 789 ; C -1 ; WX 600 ; N Ccedilla ; B 110 -173 635 576 ; C -1 ; WX 600 ; N degree ; B 257 346 553 636 ; C -1 ; WX 600 ; N Aogonek ; B 13 -155 596 563 ; C -1 ; WX 600 ; N minus ; B 131 261 588 302 ; C -1 ; WX 600 ; N multiply ; B 143 100 577 464 ; C -1 ; WX 600 ; N divide ; B 131 25 588 540 ; C -1 ; WX 600 ; N Aring ; B 13 0 596 811 ; C -1 ; WX 600 ; N trademark ; B 90 243 710 563 ; C -1 ; WX 600 ; N rcommaaccent ; B 88 -237 619 427 ; C -1 ; WX 600 ; N lacute ; B 96 0 572 789 ; C -1 ; WX 600 ; N omacron ; B 111 -16 577 576 ; C -1 ; WX 600 ; N Atilde ; B 13 0 596 755 ; C -1 ; WX 600 ; N icircumflex ; B 95 0 536 639 ; C -1 ; WX 600 ; N igrave ; B 96 0 513 639 ; C -1 ; WX 600 ; N ncommaaccent ; B 57 -237 546 431 ; C -1 ; WX 600 ; N lcommaaccent ; B 96 -237 513 604 ; C -1 ; WX 600 ; N plusminus ; B 76 0 597 529 ; C -1 ; WX 600 ; N onehalf ; B 82 0 627 612 ; C -1 ; WX 600 ; N onequarter ; B 74 0 619 612 ; C -1 ; WX 600 ; N threequarters ; B 70 0 619 612 ; C -1 ; WX 600 ; N iacute ; B 96 0 535 639 ; C -1 ; WX 600 ; N Abreve ; B 13 0 596 777 ; C -1 ; WX 600 ; N kcommaaccent ; B 67 -237 578 604 ; C -1 ; WX 600 ; N Omacron ; B 102 -16 616 723 ; C -1 ; WX 600 ; N imacron ; B 96 0 564 576 ; C -1 ; WX 600 ; N emacron ; B 104 -16 570 576 ; C -1 ; WX 600 ; N amacron ; B 93 -16 564 576 ; C -1 ; WX 600 ; N tcommaaccent ; B 127 -237 518 563 ; C -1 ; WX 600 ; N ydieresis ; B 22 -186 634 611 ; C -1 ; WX 600 ; N zdotaccent ; B 115 0 563 611 ; C -1 ; WX 600 ; N zcaron ; B 115 0 576 639 ; C -1 ; WX 600 ; N zacute ; B 115 0 577 639 ; C -1 ; WX 600 ; N yacute ; B 22 -186 634 639 ; C -1 ; WX 600 ; N uhungarumlaut ; B 127 -16 576 633 ; C -1 ; WX 600 ; N eth ; B 111 -17 582 620 ; C -1 ; WX 600 ; N uring ; B 127 -16 569 661 ; C -1 ; WX 600 ; N Ocircumflex ; B 102 -16 616 789 ; C -1 ; WX 600 ; N commaaccent ; B 159 -237 322 -60 ; C -1 ; WX 600 ; N copyright ; B 57 -15 663 578 ; C -1 ; WX 600 ; N registered ; B 57 -15 663 578 ; C -1 ; WX 600 ; N Acircumflex ; B 13 0 596 789 ; C -1 ; WX 600 ; N idieresis ; B 96 0 568 611 ; C -1 ; WX 600 ; N lozenge ; B 149 -11 571 575 ; C -1 ; WX 600 ; N Delta ; B 43 0 557 563 ; C -1 ; WX 600 ; N notequal ; B 96 94 625 464 ; C -1 ; WX 600 ; N radical ; B 88 0 773 699 ; C -1 ; WX 600 ; N Agrave ; B 13 0 596 789 ; C -1 ; WX 600 ; N Aacute ; B 13 0 596 789 ; C -1 ; WX 600 ; N lessequal ; B 56 0 635 535 ; C -1 ; WX 600 ; N greaterequal ; B 71 0 600 535 ; C -1 ; WX 600 ; N logicalnot ; B 160 168 621 438 ; C -1 ; WX 600 ; N summation ; B 90 -127 616 563 ; C -1 ; WX 600 ; N partialdiff ; B 111 -16 580 581 ; C -1 ; WX 600 ; N Ncommaaccent ; B 46 -237 678 563 ; C -1 ; WX 600 ; N dcroat ; B 102 -16 690 604 ; C -1 ; WX 600 ; N brokenbar ; B 257 -124 444 604 ; C -1 ; WX 600 ; N Lcommaaccent ; B 67 -237 585 563 ; C -1 ; WX 600 ; N Adieresis ; B 13 0 596 762 ; C -1 ; WX 600 ; N mu ; B 86 -200 569 417 ; C -1 ; WX 600 ; N .notdef ; B 319 0 319 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -41 KPX A Ccedilla -39 KPX A G -36 KPX A O -35 KPX A Odieresis -35 KPX A Q -37 KPX A T -34 KPX A U -41 KPX A Uacute -41 KPX A Ucircumflex -41 KPX A Udieresis -41 KPX A Ugrave -41 KPX A V -78 KPX A W -20 KPX A Y -35 KPX A a 1 KPX A b 40 KPX A c -26 KPX A ccedilla -23 KPX A comma -47 KPX A d -17 KPX A e -21 KPX A g -27 KPX A guillemotleft -57 KPX A guilsinglleft -57 KPX A hyphen -35 KPX A o -22 KPX A period -70 KPX A q -27 KPX A quotedblright -82 KPX A quoteright -102 KPX A t -33 KPX A u -23 KPX A v -59 KPX A w -27 KPX A y -63 KPX Aacute C -41 KPX Aacute G -36 KPX Aacute O -35 KPX Aacute Q -37 KPX Aacute T -34 KPX Aacute U -41 KPX Aacute V -78 KPX Aacute W -20 KPX Aacute Y -35 KPX Aacute a 1 KPX Aacute b 40 KPX Aacute c -26 KPX Aacute comma -47 KPX Aacute d -17 KPX Aacute e -21 KPX Aacute g -27 KPX Aacute guillemotleft -57 KPX Aacute guilsinglleft -57 KPX Aacute hyphen -35 KPX Aacute o -22 KPX Aacute period -70 KPX Aacute q -27 KPX Aacute quoteright -102 KPX Aacute t -33 KPX Aacute u -23 KPX Aacute v -59 KPX Aacute w -27 KPX Aacute y -63 KPX Acircumflex C -41 KPX Acircumflex G -36 KPX Acircumflex O -35 KPX Acircumflex Q -37 KPX Acircumflex T -34 KPX Acircumflex U -41 KPX Acircumflex V -78 KPX Acircumflex W -20 KPX Acircumflex Y -35 KPX Acircumflex comma -47 KPX Acircumflex period -70 KPX Adieresis C -41 KPX Adieresis G -36 KPX Adieresis O -35 KPX Adieresis Q -37 KPX Adieresis T -34 KPX Adieresis U -41 KPX Adieresis V -78 KPX Adieresis W -20 KPX Adieresis Y -35 KPX Adieresis a 1 KPX Adieresis b 40 KPX Adieresis c -26 KPX Adieresis comma -47 KPX Adieresis d -17 KPX Adieresis g -27 KPX Adieresis guillemotleft -57 KPX Adieresis guilsinglleft -57 KPX Adieresis hyphen -35 KPX Adieresis o -22 KPX Adieresis period -70 KPX Adieresis q -27 KPX Adieresis quotedblright -82 KPX Adieresis quoteright -102 KPX Adieresis t -33 KPX Adieresis u -23 KPX Adieresis v -59 KPX Adieresis w -27 KPX Adieresis y -63 KPX Agrave C -41 KPX Agrave G -36 KPX Agrave O -35 KPX Agrave Q -37 KPX Agrave T -34 KPX Agrave U -41 KPX Agrave V -78 KPX Agrave W -20 KPX Agrave Y -35 KPX Agrave comma -47 KPX Agrave period -70 KPX Aring C -41 KPX Aring G -36 KPX Aring O -35 KPX Aring Q -37 KPX Aring T -34 KPX Aring U -41 KPX Aring V -78 KPX Aring W -20 KPX Aring Y -35 KPX Aring a 1 KPX Aring b 40 KPX Aring c -26 KPX Aring comma -47 KPX Aring d -17 KPX Aring e -21 KPX Aring g -27 KPX Aring guillemotleft -57 KPX Aring guilsinglleft -57 KPX Aring hyphen -35 KPX Aring o -22 KPX Aring period -70 KPX Aring q -27 KPX Aring quotedblright -82 KPX Aring quoteright -102 KPX Aring t -33 KPX Aring u -23 KPX Aring v -59 KPX Aring w -27 KPX Aring y -63 KPX Atilde C -41 KPX Atilde G -36 KPX Atilde O -35 KPX Atilde Q -37 KPX Atilde T -34 KPX Atilde U -41 KPX Atilde V -78 KPX Atilde W -20 KPX Atilde Y -35 KPX Atilde comma -47 KPX Atilde period -70 KPX B A -15 KPX B AE -16 KPX B Aacute -15 KPX B Acircumflex -15 KPX B Adieresis -15 KPX B Aring -15 KPX B Atilde -15 KPX B O -15 KPX B OE 5 KPX B Oacute -15 KPX B Ocircumflex -15 KPX B Odieresis -15 KPX B Ograve -15 KPX B Oslash -14 KPX B V -37 KPX B W -15 KPX B Y -58 KPX C A -14 KPX C AE -14 KPX C Aacute -14 KPX C Adieresis -14 KPX C Aring -14 KPX C H -34 KPX C K -19 KPX C O -24 KPX C Oacute -24 KPX C Odieresis -24 KPX Ccedilla A -8 KPX D A -47 KPX D Aacute -47 KPX D Acircumflex -47 KPX D Adieresis -47 KPX D Agrave -47 KPX D Aring -47 KPX D Atilde -47 KPX D J -38 KPX D T -47 KPX D V -50 KPX D W -20 KPX D X -60 KPX D Y -71 KPX F A -45 KPX F Aacute -45 KPX F Acircumflex -45 KPX F Adieresis -45 KPX F Agrave -45 KPX F Aring -45 KPX F Atilde -45 KPX F J -100 KPX F O -34 KPX F Odieresis -34 KPX F a -52 KPX F aacute -52 KPX F adieresis -49 KPX F ae -25 KPX F aring -52 KPX F comma -172 KPX F e -61 KPX F eacute -61 KPX F hyphen -72 KPX F i -51 KPX F j -59 KPX F o -68 KPX F oacute -68 KPX F odieresis -54 KPX F oe -26 KPX F oslash -68 KPX F period -196 KPX F r -37 KPX F u -6 KPX G A 0 KPX G AE 0 KPX G Aacute 0 KPX G Acircumflex 0 KPX G Adieresis 0 KPX G Agrave 0 KPX G Aring 0 KPX G Atilde 0 KPX G T -31 KPX G V -1 KPX G W -4 KPX G Y -22 KPX J A -14 KPX J AE -23 KPX J Adieresis -14 KPX J Aring -14 KPX K C -50 KPX K G -46 KPX K O -45 KPX K OE -28 KPX K Oacute -45 KPX K Odieresis -45 KPX K S -16 KPX K T -18 KPX K a -8 KPX K adieresis -8 KPX K ae 19 KPX K aring -8 KPX K e -30 KPX K hyphen -66 KPX K o -32 KPX K oacute -32 KPX K odieresis -32 KPX K u -33 KPX K udieresis -33 KPX K y -72 KPX L A 9 KPX L AE 9 KPX L Aacute 9 KPX L Adieresis 9 KPX L Aring 9 KPX L C -19 KPX L Ccedilla -19 KPX L G -18 KPX L O -15 KPX L Oacute -15 KPX L Ocircumflex -15 KPX L Odieresis -15 KPX L Ograve -15 KPX L Otilde -15 KPX L S -31 KPX L T -59 KPX L U -36 KPX L Udieresis -36 KPX L V -71 KPX L W -31 KPX L Y -60 KPX L hyphen -1 KPX L quotedblright -76 KPX L quoteright -84 KPX L u -20 KPX L udieresis -20 KPX L y -50 KPX N A -10 KPX N AE -10 KPX N Aacute -10 KPX N Adieresis -10 KPX N Aring -10 KPX N C -18 KPX N Ccedilla -18 KPX N G -16 KPX N O -14 KPX N Oacute -14 KPX N Odieresis -14 KPX N a -23 KPX N aacute -23 KPX N adieresis -23 KPX N ae 7 KPX N aring -23 KPX N comma -64 KPX N e -10 KPX N eacute -10 KPX N o -14 KPX N oacute -14 KPX N odieresis -14 KPX N oslash -11 KPX N period -87 KPX N u -14 KPX N udieresis -14 KPX O A -33 KPX O AE -30 KPX O Aacute -33 KPX O Adieresis -33 KPX O Aring -33 KPX O T -37 KPX O V -40 KPX O W -8 KPX O X -47 KPX O Y -61 KPX Oacute A -33 KPX Oacute T -37 KPX Oacute V -40 KPX Oacute W -8 KPX Oacute Y -61 KPX Ocircumflex T -37 KPX Ocircumflex V -40 KPX Ocircumflex Y -61 KPX Odieresis A -33 KPX Odieresis T -37 KPX Odieresis V -40 KPX Odieresis W -8 KPX Odieresis X -47 KPX Odieresis Y -61 KPX Ograve T -37 KPX Ograve V -40 KPX Ograve Y -61 KPX Oslash A -31 KPX Otilde T -36 KPX Otilde V -39 KPX Otilde Y -60 KPX P A -87 KPX P AE -81 KPX P Aacute -87 KPX P Adieresis -87 KPX P Aring -87 KPX P J -90 KPX P a -57 KPX P aacute -57 KPX P adieresis -57 KPX P ae -29 KPX P aring -57 KPX P comma -161 KPX P e -47 KPX P eacute -47 KPX P hyphen -52 KPX P o -53 KPX P oacute -53 KPX P odieresis -53 KPX P oe -18 KPX P oslash -53 KPX P period -185 KPX R C -32 KPX R Ccedilla -33 KPX R G -31 KPX R O -29 KPX R OE -8 KPX R Oacute -29 KPX R Odieresis -29 KPX R T -35 KPX R U -36 KPX R Udieresis -36 KPX R V -42 KPX R W -21 KPX R Y -36 KPX R a 0 KPX R aacute 0 KPX R adieresis 0 KPX R ae 27 KPX R aring 0 KPX R e -22 KPX R eacute -22 KPX R hyphen -53 KPX R o -23 KPX R oacute -23 KPX R odieresis -23 KPX R oe 15 KPX R u -16 KPX R uacute -16 KPX R udieresis -16 KPX R y -20 KPX S A -28 KPX S AE -28 KPX S Aacute -28 KPX S Adieresis -28 KPX S Aring -28 KPX S T -48 KPX S V -18 KPX S W -23 KPX S Y -39 KPX S t -25 KPX T A -34 KPX T AE -35 KPX T Aacute -34 KPX T Acircumflex -34 KPX T Adieresis -34 KPX T Agrave -34 KPX T Aring -34 KPX T Atilde -34 KPX T C -36 KPX T G -35 KPX T J -88 KPX T O -34 KPX T OE -12 KPX T Oacute -34 KPX T Ocircumflex -34 KPX T Odieresis -34 KPX T Ograve -34 KPX T Oslash -34 KPX T Otilde -34 KPX T S -50 KPX T V 4 KPX T W -1 KPX T Y -17 KPX T a -68 KPX T ae -38 KPX T c -83 KPX T colon -145 KPX T comma -116 KPX T e -83 KPX T g -76 KPX T guillemotleft -129 KPX T guilsinglleft -129 KPX T hyphen -99 KPX T i -51 KPX T j -59 KPX T o -87 KPX T oslash -60 KPX T period -145 KPX T r -37 KPX T s -70 KPX T semicolon -119 KPX T u -92 KPX T v -98 KPX T w -96 KPX T y -108 KPX U A -26 KPX U AE -35 KPX U Aacute -26 KPX U Acircumflex -26 KPX U Adieresis -26 KPX U Aring -26 KPX U Atilde -26 KPX U comma -80 KPX U m 3 KPX U n -22 KPX U p -5 KPX U period -105 KPX U r -47 KPX Uacute A -26 KPX Uacute comma -80 KPX Uacute m 3 KPX Uacute n -22 KPX Uacute p -5 KPX Uacute period -105 KPX Uacute r -47 KPX Ucircumflex A -26 KPX Udieresis A -26 KPX Udieresis b 17 KPX Udieresis comma -80 KPX Udieresis m 3 KPX Udieresis n -22 KPX Udieresis p -5 KPX Udieresis period -105 KPX Udieresis r -47 KPX Ugrave A -26 KPX V A -10 KPX V AE -19 KPX V Aacute -10 KPX V Acircumflex -10 KPX V Adieresis -10 KPX V Agrave -10 KPX V Aring -10 KPX V Atilde -10 KPX V C -39 KPX V G -38 KPX V O -37 KPX V Oacute -37 KPX V Ocircumflex -37 KPX V Odieresis -37 KPX V Ograve -37 KPX V Oslash -38 KPX V Otilde -38 KPX V S -41 KPX V T 4 KPX V a -65 KPX V ae -37 KPX V colon -130 KPX V comma -134 KPX V e -56 KPX V g -57 KPX V guillemotleft -83 KPX V guilsinglleft -83 KPX V hyphen -49 KPX V i -65 KPX V o -60 KPX V oslash -57 KPX V period -158 KPX V r -51 KPX V semicolon -121 KPX V u -20 KPX V y -24 KPX W A -16 KPX W AE -21 KPX W Aacute -16 KPX W Acircumflex -16 KPX W Adieresis -16 KPX W Agrave -16 KPX W Aring -16 KPX W Atilde -16 KPX W C -14 KPX W G -12 KPX W O -10 KPX W Oacute -10 KPX W Ocircumflex -10 KPX W Odieresis -10 KPX W Ograve -10 KPX W Oslash -7 KPX W Otilde -10 KPX W S -29 KPX W T -2 KPX W a -24 KPX W ae 6 KPX W colon -93 KPX W comma -71 KPX W e -10 KPX W g -11 KPX W guillemotleft -38 KPX W guilsinglleft -38 KPX W hyphen -7 KPX W i -48 KPX W o -14 KPX W oslash -11 KPX W period -95 KPX W r -34 KPX W semicolon -74 KPX W u -2 KPX W y -6 KPX X C -52 KPX X O -48 KPX X Odieresis -48 KPX X Q -48 KPX X a -14 KPX X e -36 KPX X hyphen -81 KPX X o -38 KPX X u -39 KPX X y -57 KPX Y A -31 KPX Y AE -34 KPX Y Aacute -31 KPX Y Acircumflex -31 KPX Y Adieresis -31 KPX Y Agrave -31 KPX Y Aring -31 KPX Y Atilde -31 KPX Y C -60 KPX Y G -60 KPX Y O -59 KPX Y Oacute -59 KPX Y Ocircumflex -59 KPX Y Odieresis -59 KPX Y Ograve -59 KPX Y Oslash -59 KPX Y Otilde -59 KPX Y S -62 KPX Y T -17 KPX Y a -67 KPX Y ae -40 KPX Y colon -145 KPX Y comma -116 KPX Y e -81 KPX Y g -84 KPX Y guillemotleft -119 KPX Y guilsinglleft -119 KPX Y hyphen -96 KPX Y i -63 KPX Y o -86 KPX Y oslash -59 KPX Y p -39 KPX Y period -144 KPX Y semicolon -119 KPX Y u -50 KPX Y v -44 KPX Z v -54 KPX Z y -64 KPX a j -93 KPX a quoteright -60 KPX a v -33 KPX a w -23 KPX a y -44 KPX aacute v -33 KPX aacute w -23 KPX aacute y -44 KPX adieresis v -33 KPX adieresis w -23 KPX adieresis y -44 KPX ae v 16 KPX ae w 16 KPX ae y 5 KPX agrave v -33 KPX agrave w -23 KPX agrave y -44 KPX aring v -33 KPX aring w -23 KPX aring y -44 KPX b v -17 KPX b w 0 KPX b y -28 KPX c h -6 KPX c k -12 KPX comma one -148 KPX comma quotedblright -123 KPX comma quoteright -142 KPX e quoteright -43 KPX e t -34 KPX e v -28 KPX e w -20 KPX e x -5 KPX e y -39 KPX eacute v -28 KPX eacute w -20 KPX eacute y -39 KPX ecircumflex v -28 KPX ecircumflex w -20 KPX ecircumflex y -39 KPX eight four -65 KPX eight one -85 KPX eight seven -77 KPX f a -44 KPX f aacute -44 KPX f adieresis -26 KPX f ae -17 KPX f aring -44 KPX f e -58 KPX f eacute -58 KPX f f -46 KPX f i -40 KPX f j -63 KPX f l -31 KPX f o -65 KPX f oacute -65 KPX f odieresis -31 KPX f oe -23 KPX f oslash -36 KPX f quoteright -62 KPX f s -46 KPX f t -10 KPX five four -56 KPX five one -90 KPX five seven -78 KPX four four -68 KPX four one -73 KPX four seven -99 KPX g a -14 KPX g adieresis -14 KPX g ae 13 KPX g aring -14 KPX g e -7 KPX g eacute -7 KPX g l -37 KPX g oacute -12 KPX g odieresis -12 KPX g r -4 KPX guillemotright A -50 KPX guillemotright AE -46 KPX guillemotright Aacute -50 KPX guillemotright Adieresis -50 KPX guillemotright Aring -50 KPX guillemotright T -128 KPX guillemotright V -80 KPX guillemotright W -37 KPX guillemotright Y -119 KPX guilsinglright A -50 KPX guilsinglright AE -46 KPX guilsinglright Aacute -50 KPX guilsinglright Adieresis -50 KPX guilsinglright Aring -50 KPX guilsinglright T -128 KPX guilsinglright V -80 KPX guilsinglright W -37 KPX guilsinglright Y -119 KPX h quoteright -52 KPX h y -37 KPX hyphen A -29 KPX hyphen AE -23 KPX hyphen Aacute -29 KPX hyphen Adieresis -29 KPX hyphen Aring -29 KPX hyphen T -98 KPX hyphen V -44 KPX hyphen W -4 KPX hyphen Y -95 KPX i T -64 KPX i j -146 KPX k a -12 KPX k aacute -12 KPX k adieresis -12 KPX k ae 15 KPX k aring -12 KPX k comma -60 KPX k e -34 KPX k eacute -34 KPX k g -43 KPX k hyphen -104 KPX k o -35 KPX k oacute -35 KPX k odieresis -35 KPX k period -89 KPX k s -14 KPX k u -7 KPX k udieresis -7 KPX l v -86 KPX l y -96 KPX m p 19 KPX m v 7 KPX m w 13 KPX m y -3 KPX n T -48 KPX n p -8 KPX n quoteright -50 KPX n v -25 KPX n w -14 KPX n y -36 KPX nine four -58 KPX nine one -84 KPX nine seven -75 KPX o T -89 KPX o quoteright -41 KPX o t -24 KPX o v -25 KPX o w -7 KPX o x -28 KPX o y -36 KPX oacute v -25 KPX oacute w -7 KPX oacute y -36 KPX ocircumflex t -24 KPX odieresis t -24 KPX odieresis v -25 KPX odieresis w -7 KPX odieresis x -28 KPX odieresis y -36 KPX ograve v -25 KPX ograve w -7 KPX ograve y -36 KPX one comma -99 KPX one eight -94 KPX one five -76 KPX one four -127 KPX one nine -81 KPX one one -69 KPX one period -128 KPX one seven -147 KPX one six -119 KPX one three -69 KPX one two -54 KPX one zero -102 KPX p t -20 KPX p y -25 KPX period one -125 KPX period quotedblright -114 KPX period quoteright -133 KPX q c -4 KPX q u 37 KPX quotedblbase A -6 KPX quotedblbase AE -6 KPX quotedblbase T -82 KPX quotedblbase V -85 KPX quotedblbase W -24 KPX quotedblbase Y -83 KPX quotedblleft A -66 KPX quotedblleft AE -57 KPX quotedblleft Aacute -66 KPX quotedblleft Adieresis -66 KPX quotedblleft Aring -66 KPX quotedblleft T -46 KPX quotedblleft V -18 KPX quotedblleft W -8 KPX quotedblleft Y -46 KPX quotedblright A -67 KPX quotedblright AE -76 KPX quotedblright Aacute -66 KPX quotedblright Adieresis -66 KPX quotedblright Aring -66 KPX quotedblright T -53 KPX quotedblright V -22 KPX quotedblright W -26 KPX quotedblright Y -43 KPX quoteleft A -87 KPX quoteleft AE -78 KPX quoteleft Aacute -87 KPX quoteleft Adieresis -87 KPX quoteleft Aring -87 KPX quoteleft T -67 KPX quoteleft V -39 KPX quoteleft W -29 KPX quoteleft Y -67 KPX quoteright A -145 KPX quoteright AE -154 KPX quoteright Aacute -145 KPX quoteright Adieresis -145 KPX quoteright Aring -145 KPX quoteright comma -201 KPX quoteright d -129 KPX quoteright o -135 KPX quoteright period -224 KPX quoteright r -150 KPX quoteright s -144 KPX quoteright t -118 KPX quoteright v -112 KPX quoteright w -108 KPX quoteright y -122 KPX r a -26 KPX r aacute -26 KPX r acircumflex -26 KPX r adieresis -26 KPX r ae 1 KPX r agrave -26 KPX r aring -26 KPX r c -26 KPX r ccedilla -34 KPX r colon -86 KPX r comma -104 KPX r d -18 KPX r e -17 KPX r eacute -17 KPX r ecircumflex -17 KPX r egrave -17 KPX r f -24 KPX r g -15 KPX r h -24 KPX r hyphen -125 KPX r i -34 KPX r j -42 KPX r k -34 KPX r l -51 KPX r m 27 KPX r n 0 KPX r o -24 KPX r oacute -24 KPX r ocircumflex -24 KPX r odieresis -24 KPX r oe 13 KPX r ograve -24 KPX r oslash -24 KPX r p 21 KPX r period -133 KPX r q -16 KPX r quoteright -44 KPX r r -20 KPX r s -29 KPX r semicolon -75 KPX r t 11 KPX r u 11 KPX r v 17 KPX r w 17 KPX r x -4 KPX r y 6 KPX r z -23 KPX s quoteright -51 KPX s t -17 KPX seven colon -154 KPX seven comma -146 KPX seven eight -86 KPX seven five -91 KPX seven four -116 KPX seven one -74 KPX seven period -169 KPX seven seven -69 KPX seven six -104 KPX seven three -79 KPX seven two -76 KPX six four -52 KPX six one -68 KPX six seven -55 KPX t S -40 KPX t a -25 KPX t aacute -25 KPX t adieresis -25 KPX t ae 2 KPX t aring -25 KPX t colon -107 KPX t e -43 KPX t eacute -43 KPX t h -8 KPX t o -45 KPX t oacute -45 KPX t odieresis -45 KPX t quoteright -100 KPX t semicolon -86 KPX three four -58 KPX three one -82 KPX three seven -75 KPX two four -97 KPX two one -73 KPX two seven -79 KPX u quoteright -43 KPX v a -9 KPX v aacute -9 KPX v acircumflex -9 KPX v adieresis -9 KPX v ae 17 KPX v agrave -9 KPX v aring -9 KPX v atilde -9 KPX v c -22 KPX v colon -75 KPX v comma -118 KPX v e -17 KPX v eacute -17 KPX v ecircumflex -17 KPX v egrave -17 KPX v g -14 KPX v hyphen -30 KPX v l -87 KPX v o -23 KPX v oacute -23 KPX v odieresis -23 KPX v ograve -23 KPX v oslash -23 KPX v period -143 KPX v s -22 KPX v semicolon -66 KPX w a -9 KPX w aacute -9 KPX w acircumflex -9 KPX w adieresis -9 KPX w ae 17 KPX w agrave -9 KPX w aring -9 KPX w atilde -9 KPX w c -12 KPX w colon -75 KPX w comma -75 KPX w e -4 KPX w eacute -4 KPX w ecircumflex -4 KPX w egrave -4 KPX w g -6 KPX w hyphen -4 KPX w l -53 KPX w o -9 KPX w oacute -9 KPX w odieresis -9 KPX w ograve -9 KPX w oslash -6 KPX w period -99 KPX w s -22 KPX w semicolon -66 KPX x a -8 KPX x c -35 KPX x e -30 KPX x eacute -30 KPX x o -31 KPX x q -33 KPX y a -20 KPX y aacute -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y ae 6 KPX y agrave -20 KPX y aring -20 KPX y atilde -20 KPX y c -33 KPX y colon -86 KPX y comma -122 KPX y e -28 KPX y eacute -28 KPX y ecircumflex -28 KPX y egrave -28 KPX y g -25 KPX y hyphen -29 KPX y l -98 KPX y o -34 KPX y oacute -34 KPX y odieresis -34 KPX y ograve -34 KPX y oslash -34 KPX y period -148 KPX y s -33 KPX y semicolon -77 KPX zero four -64 KPX zero one -91 KPX zero seven -82 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n021024l.pfb0000644000076500001440000012716007056046553016417 0ustar fnevgenyusers€y%!PS-AdobeFont-1.0: NimbusRomNo9L-MediItal 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Roman No9 L Medium Italic) readonly def /FamilyName (Nimbus Roman No9 L) readonly def /Weight (Bold) readonly def /ItalicAngle -15.3 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusRomNo9L-MediItal def /PaintType 0 def /WMode 0 def /FontBBox {-200 -324 996 964} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020939 def currentdict end currentfile eexec €Ï¥é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>m»Pˆºàªh«¡ÉŠžP£)cÖJõöÅ&/¯©ößFF¹ZÎä¹ >o^ÙAëŠ9¾v„Xô f9&7G¼~2‘z Ÿ <ªÉnþ 1þ×Ò¡Ë¡ŽXZÿÜ(¯¿ àa“Õß$ª: ó;:3DéÝØ¼Ô¯‘ÒîïIÀ/ÐÜCj¯ÛÞ3¹nòOzªçÙ-ŠG9k°á0EýS`ÛÙ¼•"m* &%¾{´È±c2n4¢zyh§¾>8u)E"+­û-ÁËîvž¨Ò/èÌO¤‚5:äSçšaÒÞ–¢æóis&FÓ0кxHžŽ¢øÂÉâÒý¦Ø D’ æõ'iøÅó@cÌwÝŠS˜â€zÚ¶5Ak8þ¹P{Ž&}5@ñÎé´•ûûÙGº¯“ÝÒT?–T[ŸN;óÅ}xc‹Ä=÷WמÎl•Brègû Ü…+LÀ6ã³à™y(‘£Ö…ßKGg(â¤WÓÇ6)Ú™àÕyêc’$0`Æ”¸d1¹è}`}Çx¾%á%µGk–°Û0Þ·N=Ò4y£XÁ¹0Ûšj9Ûeåè5teÞ <™^{O–¿™º™¢ ?^ч~ùuF—¾‚|J#, &"èU6™Çúoö=ò©B³ýÍQGœê@¿%÷1-I€Gn𯲠þøô‡aò”5ÇB[v„ÔPÕ¥Œ_bÌ)DWè€T›~¢•BïQMúómmR &ia™a…¼ò7`ÉÃý¥Orp· iD‚¼ Uv‹J.÷É/„˜ k£mݪÀ!0’¹ûñÙ@>Ì,ò„Ý$–$kQK*Û™ò ÍßÖPªýIØr2ÀºÎ›¥…J4Äg [{ØóaèG¡Ï‹ùÏùfÒ€°žžjý÷²ì?·dïABå˹!oO: žIÓ× Øó ?«ìL²?mÖš³îøçíÃvαWv[¯2N !¡ ¯ÏQc³§jî¼ÕIjw¢&šâ ùç2ŸæµAõÄ;ì(ocœ—œ%à 2!Ç…7gºâMAÙAf­gOßaî‹õ#Õ‘©˜ïOH”ö¿í ªÒ‹Î?ƒaRIåRDŸ)Rè~ØU©»”rl:AI©‡ù¼˜£Pj¬*X/ é¨ÿÆnæYñž¿pW?I[4Ðhœ¼íhH.R8Û‰)òã‰J°8ÎÓ«âb~þ,›N (õô¨}-$%¿z’ÉÚDMð6^iòÞó?”i`\CAÿÞa„ò§G˾MZŒ3w´óá±ÒX‹¾´é1œø¼§U‹Ã•ýœÍ>ÇS&Ž-=ŒDh ^íTIÆ1ŸÝ +ç ï]³„ƒo¶ÆúEùÁ…ãs³&²[¦–1IŸ°[³pf°´pd.?W_LÑÅÆCÍDÊȆ`‡EëÁ9•ìMTBot²Ð[æu±Ò/hpf^ÿ2jca1=ÄFûã  Â-J®³±ÿ“±´Í  PÑ”y¸+(x9µºáf"´7Ú/Iw•£¹!*S¿Ei«.­ñÔ’ÛEUÑMö~CTãñ×-n† ”Ï Pq¤8,=ÎL¥{¡"ÉŠÓ3 ó—ŽS£xôݪ´œ= êÈGFxX‰ŠÕp&"LE ΟÑï²ÏJ°¼Ä<¦‡¸Ÿ1¿i€c­‡¥ë[ C‘ЇLÔ‚£Å}/HÆW¸{F-y&GÉÛŽHÈæ©/äãͼ™ J¦­›9os¤HÿK*ðLeÌnŸã Egÿ@‹;& ŠåÆföàÄâ«È¹“z¬ûÔpQô”‰=†pB‡F¨r4‰3Ö†$O3àªhY 2˜dÏÔœtüQEö¯äÑÔîÒ˜™Ý=ƒîDèS+,Ôéf»o·LëÏýZaœ³SnÎ_ßu AP®Îc˜öê›$QÛD¼cÅå äKÀ©?æÐº$õÛš®Tà´?à XI ;Q"IMxXá3¦õ"ññ 毗º™’P|qÑÖrë;¹PhKN‡Ná+?>¨¿üص“4›O´» •TF´´(¦}Q,çÔ%Éß)tùþELHÜ«5¸¹žHzwÞªsÁ4 ¿yeM§»’î„Z’êδµº%„b²úêèí.'g"إݫécÞvnv\‚¦ V ‚L‹ÊÉÙ-¹X9<;Ü{ e“Y$®â\…Cí‚‘…Эaq E‘vh²ýŠŽ0áîúNç²w3™Àñen‡'ç÷ˆÉOj‰¸”—‹àá…ëéÁ ™¹‡4‡ºk.8$»q£øÁñ5²í›vÃÙ¼ÚÁ¸XNB8 ­|Œ»}üòm¨ý&Ù¿=A¸¸Ýè F.ñÅÏ_¯±ñ(Žã³Yí…y²PÜzÏÍF ¡Ww¿çœÚfnŸh¤>‰Ž aæ}pNÓñ&=¬ˆF³êmèq *¨¹@W:׿NÌžZ1+µ—v¸¸‡µþnbŒDÅ íˆÊ&W¨û(ŽU@uöIéYñATðCYß ×<¶xÚ1z£)h¾Rò2)£¡¡‘¢Ág›Ýçøì,|.t¯)Öú«˜Zn°Ò.ȇºÇ¢ƒ7"âw`/„LMÈ™“êÙϵGœî>ÊwêA‘½4Î÷rÄv§ŽÁ¨„èz•Ò]Ó'QgÎÑ〓yúÓ™S—–Ò3ÞFVäÌÁ^DÒèg£ùRÕ¾“œ ö¨¨ÁÌ|‡èt~Ì•¿sê¿@)IïËPÓulmBÆïeè_™¼ïü¸¸ÌùPL.ó]ÒÞÙüm—P¿nü;à/’ow¹‡ «b¯=¨˜1ðO°¦åÞd:§=º³_ÚrîTîyS·öÿ‹e,¸k3Ðbj)ñn1*»Õ—:Pãlc @•n£fk’BÍ뺤> !:‘†Ô PI¼Úp–Yr<þñþZ1LY'¿\¡Â³ì„ÍZןjÂã#–ö{““lß´ó_}d—wKPJš¡}©: žýi¼\Ø*tØÙi$1¢ÒÒ$@¤×Ú4Zï‘`òÝéà]™ÊhêFåŸk¤¼Lú>ù-# -öôWÄ-¥ùþ"›ìtû*;©âÄ”4@#w41!qù‡úz¿|ìƒkë¦YëGP/OÀî8Ò¨»F´3ôÙ>÷®evlÜÃâ4?A¤×ß½[™—…½+:¬ÆÔ!$äd0}›4”½ì æÞøh¹¾wbÞœÞÑ^Ÿ/Š: YoN“àpé«,<ö¹E/ÓdÏ(c±Kîöšn™ow©>Àa{Ïõ?Œöòg³WΆŸ€p?†ÙZÀÈÒUˆñh’$Þ5H èàÊ.R ë+<;æ‡c_ Ñ»ºÿAÎb#°U‘èvì—Ê$ÊÙ^¸‹¬p×ÄÓõ1Ðtgsmö+~Ö Á[PQJ*¯6g~;õsC ¹&8”Ôy¯ ¥\å!MϨt݈(@rC2Ó$yŒ…æÇFÄP³Ýjâë3?o7›: á 'ÿÅNª%HÆ!×úòuϱû×ÿ˜Á#ÊbG÷/¼”¼¯ŽQ¶¿´*nÚœoçöÑéB¿ŸqD~ôútòTNä\¬{‚ô¡¼&ÃZùÒÃÊ™\·6Ì2Gj4Ü*e— ¾9xY×éà'‡Ýãšù›gÆ`%~FÍæ(Ð[õöȺ´å¢â泡ã&žØƒ4!µÓç—I?eçnDuYž2ÛTJëY³8dÃNÚu¯õrF™_gÍYÅ–½ÞðѰAlf²"­¤¼ QYh;¸9¡^l}_X†0u¬ˆÙØ‘_¼¢í´µû)ÁoèÔ“Cj± /QL"&ÈðþQùyÝòúXïlã-"z•2 RNI¤ÖÆ“ë4õs/Š¢Ó±­•Æ:ìNš;©BŶ÷KOp©´ò; 0XtÔ®Ég½F}wRhUút—]Õç …¦Ÿ•”éõ–ÆSpðÚÄÇÚL…É©q­þ.¦âýrìëÀ~WµÖ˜51a²Ñ/ÏGó+UóÌ?"ZVŠvlP·÷ÂÊ}€BÁW2lºhðiм¶°\EžšÇjŽ¡$e‹ˆ¤;\ôª<ô(£<ùfðRñOªç1‚[k^‚š`q(˜Þ’L£ÖR·ÂëÑï”,là±æ| ܯZML^’Êx¦õUe€íx^øÖ¼K‹‡Cº¸éC‰º8öu”ÇîR/§+®[;®õàÎ×O`^®dJ™+‹é¯DÙ‰¼®Ì¸£C¾ð`¹iÔCŠ˜Þà©öBfkËv<òr1 Êœ}{¡A"úÏ+5xËgÆî2%5T4ó'¼1h/š]îzÿi ÁÐ$iÚlëÐy¶0»m5à¶åC„£×F ¿,=« ði© s]˸fóŠâ*1ƒ©*±­"9u½[aQ bø¶(ï~Ú¾êdÓž=‰%‰i&ü͈‡Š­àiÎÕi:xƒfz.H¬†ÍjÆO`ÿë;ë“·É ÿKŠÐ¡€ðXO¿ E¬Å”í•à±ÐO1˜6ù>Û™B¶Ñ›¼;¦¨ ˜V¯ËÛ¬zÃú=I±hÏÍ ð ÿÉl™•Vv1ÏËMγ F¸3tkãù*~büàÎÑsÉ0õå ïÊý}©gÞ1•z\N¿K„üöuºäfOR ~+qN:˾¦ "­–ïp(kyåÓcî{ÆéÜRWÌLL­Š! '-&ÂmLþ-§M|p9YØ»‚Ëo>àã(@é•ËÅ¡Qï’Zk¯íÙȳü:CÅŸ)µµ¾À‹…Åj'K E ‰Ij~Ó몙†fÈ(‚îô¶˜»ÝÎ_‚%³i ¿¡Îh]}= `mkû cÃH´E±;lŠ –w ”ò:€—lãÓï­i:Æ.üå;hVråµÝCšôÅ·ÜY×¥uÿ¯Toðêi5k£¬µQL\×hfö0™,@o Ñ)1™—uÿgU¨xKÆÅol–¹PÚƒÈÊ33b®°Ð@4]z8ûi™–9óó“ä3e¬Ã„F‹,®ñ² —OüaF1»B|\–ç­"4êZ›´R»ª6•®Ü dæG9çMå]õ»ØÖ°ýéîòSŸuÇÃ-W1up/Nª~ •³ŽªÞøóãÚ% ‹ƒ^t…—ÍR—œÓmv$‘+¹øMܳŠwYŒ}Ö$”Ÿ£„eÏõÕýë&¬ãÇbü"÷Ì'™ã›hªaoJU*«ÚUÎU¨@M¡ÍéÄü<©¹SÊ7f›>¶tYÁ™°ÎðÙy,Y}ýHÎöŸ,ÄÛ2oÁ QQo?›º[Öaƒ„ÞZÒÐr©@ªù&äCIÒ_F±R.Ú}sPSmƒ™¶ì˜Ê¯·™;§y]4ÏÅ(¦ã¡O‹Zt@\~Ãì=çÀº†edŠ¥êª§ŽbºFv† ßÇVµx^ŽN®À¨¬$%“F²ÓFehÆç1œGòEÑrDŠ}/"¬h`\½™˜$ öÏIæ¹–Û+ºï—Y“m4ìÏî/ðD;eˈ4™B'ý{Áý;7€Ö›Jß1k™/§<ûXÕ³‘¥Òß|R{a]w´ã˜ÊÈ»a‘@FüÎ"ä•yœáÎ2åÆÀCÄ|ëaœûäŠÑ„-K/¯é`Òø‰ФÉSWeY¿í/¸,<52½\¬á®Š)gI ŽÚsú0âñÜgÿäàDZŸåTÓQ ®ém=Ã-å÷z¾5²ÖuH;ÆŠ±Æy ©¦Ej%,Jh8j<jM?½¯Ñõo1´7Ÿ=‹AvЍ9l1ªGøM®~JÉÄP¨n ú¯°!A²½L©ÞYðƒ>‘ÐøÏ‰ôRÏÓ1$1wWÊ!“Ôê~“¢QÓ ¯xwù²t &ž„Oÿ…ò‡Å›¤~\x_ kS󞉫!n7VP“FŽº¯“’¼¾¹‚›4‹YÌ*² Gx"mplT«aG˜¼üÔî»ðrÀ ¢ú}:!&&A)@86;Àh–•žÛš­ØFá:ûõ+1±Î7õ tXÂãxÀòÒÙ£žY¿*e£TÀÜ$'ï5þ»³€±v` ”þÏ@P—%îè; ¡ßè|Ï_ ÉH¹;êÐLò ô‘ÎÅe?Wf<ìgš—(¥Ç®ÃÑ Â…` Ë{ã8ñ«øƒ"*…–µ²•ÏÛHÞ‹ÈÛ…“ŸÀÔÔe[»!ÊêDêˆ(û}Ê r“Ýa<æ›Ê(øKὂü 6Þ}`7êÜß}µOg „.Ÿ”‰ƒo‚9•(ïvõ+(¢‘HöÒþ'çRã¹lâˆÅ²Hma¾Ó\*•¶M ºYC.¡÷Ecúø1±Pénë«‚ÀûNðë¸hÚô벎, ‰‚ψ¥þoœT™Øe'•áæ„ÍœsvÿG*qùBÜѪ£-õs`/¶®¯½êþ¾Ø'¢ ‹Åß L²µJNÅìþ½_ü•û´jKµs€xee9É'òfÿà¬j3pìó:ÑÔö´WÉe2Ϭ®»”pñ°¯y:õ¦¾‘}¦ £±EŽ© hB¢}£Õ»?e8'„ 5ËÁzm¯˜ãÔüC¨ûTZÀµM¦ 2I›oqÆ/ÉÚŸ8oÏέæiиѯàÝV·rMÊ{± \cØ{=ÄͦxÖ$äÑ]Æž`PËÚßê»=–B²‡ŠS“vÅFö)`Š8¹€fÔ‚ù:ùðŸÙ!Ä]¾FwαËÒÈ]4j:,‡hÌ:ù ÁÖ½k&}¿°&u ûŠÑ–«ÓŸò•ºnG°&’† ‹ºqáÍlò[ÞžDåž :¶“NšNa.ÿÀsÂpN2krTº;6뿉m›À«ˆÔ©§Í{yžÆ;ÙOõP“\ïáÞdµ‡óÜ4S&³fÁ'/½êò|Føz¾ nRкCCñŒâä„*!:¿?ÑDÃ…_û"”_+ *þQÔ¿_ä þÖ,þ7¢ß^í¢ r0€Yw1”Î | ^PcJK÷³ÙÒéËaM 麽[X5À¨à¥¿}lí¸µÓ@PÀÉ”ÒúNȺ`µ<®Î¥Ë"Èf[¤el‡ºÁ-œ’¢uŽ=ƒjôÍ}"nÀÁã’iìŠHFœÉnä€ ÀÔÆ4Ö¸ù D à5zÞ嘌ïWɹEɃ5«=.ã±Ùéëööh>1–¡°hû-¦dÏ^æ“DW*ÜéiX[y Óxÿ!åsY­r¥·ƒ]ZX)8_å±ßþT¯£øh8‚<³[L£(b5 ¼Q[br}™ÁfÑò;á¨a}´aÁ¢F˜$ßùEvØÑÜãžÁ½~:‡'SÌÛ<.þ'é@’~²NÈÉœ ±ÚCkÞ€2=åäVTÈ',”D01w«„Ñ&aºkŸÏÉ–Ê ¾ÐÙmª‡€e"š7FŠói…Ù†ˆâÏ¡÷cM~Öñæ…ñ“‘qhÂcä—ªXìðפVÂ8>z«OC—/ùWFf³þì.]K,ºýCí»u­v?ùxIà RûÔñ\£8Oø•Ïšè/ceª÷SÑ]½Z1ßÙ ¹hé;#ŒÖIy?ªmu·ZÐ-õÄóš'̃RZß98Z"Nsc3uœJ9iÐüžA=ÿí>áç!m˜ßngÀB ™@ø·†þ ©"vÙÎÒÆ\>9§ý·1›¨`îŽ4÷Q5“À_?‹ Äî¤þk'ñ…íeVDÿ¢ª‘´6§F|2Ñc+ + ±Z‡/h£øy-¨ªT,÷Yaȳ֚mÚ á°€ ±Òr$žX„Ao׋R[%b‘É î(àm;e²j•Ãødç)œQº„ëJ¯Ñ(ä‡zTJjÞ¤¢0CGΜïl’{ee¬Êßx±HÓ' Ödà"¦Š±qZðÏÕCA;vqOxåšd×™Qr ³LœØQ1ñd©O„kMFÆ ã(½Ûv„ù*Kt&-w)ÑfÉ™ò ÇlMüC4c+i)ÐoY[ûEþ`uÅÞãó1xSaG;.P—æy&Ù^|·Õfí‰$žýËË·!š6¹‡™É*á–‹g¹¾¸m‚N*Ö·ÒÁ]J>àËüZÃ~¦É·œŸé‚FîO‡™Ó]SY¿’V ûÄx3Ö_@|£ÀżVt«yÂz½ô\›FK¡Ù‘“Ù•ê”´• f¾\Gá›S_~ÄñJ%P”¹Ò€Äñÿ²ûÊlÑ9²HÂ.(õ>«³ :rtyŒZŽÆ¬ñz îšLá…Í0 Dá›Â\7–ë̃VNfåW£¿¬MÙª×%ßëc%W‹;…|p˜oÔâp,ÃCNiÓÌωNûÎ+º!Ǭtx™†ˆƒOà©QU{YÞnÏnIhDI<>z É4pœd¶&B5ñö³Ãò/[¢¹Ê“Ðõ¤Ó!õŸ{Ï- &§ÞÚoà3éúy™µ×V¦bsp…%6ɹßÌú,E²œG¡»¨/ %ô*¹ëŠõ…ãýoŽâ¥_6ÿ^m¤Ýƒ`0öâCÎcx¢ éÚâÞ-cfì}½A'îá”<ŠvEÚá1¯¸Ïn¶qŸÂ×ÈÒUˆñh’!³ªÁÎ=}žÄ·e½Œ½Mèfì}’]<\á:ÿžRkäìT"‚ûà¬ÑÅÊîÏêÂ2W¾«›"+ùk£˜g+Ùœ‘@_‡èÖ t¾õÈt3QÜf˜»ìÙÎQ²Çš)õyÈY„å˜ÉÃNtÝ÷¦§(fˆÚ“åv¡WyÕà y4Ö° x‘ŒfVsÁÎOÐOË’XkN“õâ¶×—ról!5W^X-²~lUŠ ¡pbª%*`;>•ë…š×PgÜÙq)b|Ü»>*¿Eñ—Óí«ízêL·'ó§Ý”0i¹ÖöB Ú MpƒS2Fß^ùÈC…ìpN·ä}™®Îv‹J‚F¥¡æP4ÐÌ·aݬ_F}6 Cض3µÙ¨»‡z Ü|­7¯˜tŠb´š¾?|ŸJ9•Îa7+cœ„‘Dîìd9×­àìª#øó‹`ž 0hz"ªÀ©•B¸nŸ?GÆ]V¼(`9çPBÕ¥á9“Õev¦Ñv8îpñ…ØV™@(Usªó@ªº©=h?7è&CtËl|G¼@ÎQâm”‹ ºàG¿K¾¯LºQxd!jÀ˜]#I…‚ßÒ8NÆ#ndawÍÌ«—Qû+©ª 0xê5JôÃJÃgh)š2ÙµWôˆÝv£òôÎb>Ö±Í& a´ªåóÖt­¬Ÿn±ÿV?ôzëUàtà.yÖð >4°¬µ’Æ; ZWCF’š È­£=—Л³@ÚÚ°wrO ³©B¤\”½Û¢¯ˆ˜L/%hiüº~@RYæ¯`ÖÕKwR1›œª…話fåo&vj¼+¯ç{âmN:]›Œ(ÙPo×§•†›¹ òpŸÆYáq°¼bøê"ª¤‰¸zµ­cÜ9ôåÄ”÷€îK‹Ùä.Ó˜„¶'Œ¬:“Åa/=¿„t=†q¢ ÂãTü+7ì2&‹LÓífƒ¹Z/wì>'çµ–¨ nªØakÅ—ÚÌv–ùÊ}C“_!Îð‘~ÀÔ$Ã8vBP+Øaþ§v6˜rû$Ó®2Oª”òÄõ|³V¨lìÒtrÎSN ¹QQuš½u…ÛG{—Fû`”˜.çQÚ5Ȉ(ñÞ=ÛLŠrâ}<®vâ?Èyqæ-è}¡O–€°z¸!YÃò½úCÓ³¼Ù62íµÇÈ“—,M¡°˜þ`Ã*cÌ,Cª']¾³»‡jú…0Ë·/(¡â–AÅ:”ÄQt˨‹õzL–Ò· Ø©ßè¤G„>&ëíoÈ âÊÖÔEÅ5oñÔ1«Œ%H·%oµÏpƒ€ßv…æ?qJT<Øÿ¤‡…ÌM°ÇkJÏÝ?U®E6xiÂúïù´þëYÊý´]kÄDèËŽ×,MFhËý³÷{+>èÅ‹ñw]aX×ËÛC0~vÁ>ÓvUôXš0Í6E3^¦î‡`Jà]¬ãÈ%9×o­x(åâó£¨O#¢G‚¤2®ä'±ºj/-_™Û)’7¹¤Ä’É^!LGuXìH7«NJ: )¦ÄÛ÷÷˜3w©Ú{k‘56Õ Û¼Çbò¼“•+ÕgÕi)¥Q¸€yêzñ^’ª@BXÅÅuМâÓ©pk§óB­¨PˆþœpM\Z §pø%ài½u={¾Í¾Ô-‚ž+N§KUYôñUf¬)N#-ÎS4Þ>zQ¾£“L¥T£,]PÊV¹j’±Ò¶S¹:÷hfh¢ÖŸ'V»ùH¯ÁP*à½:ÿ« O¾]µò½frjT¿­7Ïs³§È\]ƒ4Šª¯Rg96 ïÁœ(Dªò|Õrl–Œ3w)»‘¨e§4±0Uâ¤`b ŽÐ7§¿·Í$d\Эøš™Bºª¡šÂ墥¯®¤–€~HVÛx6ÑÕ‚è€cw°Ñ»#Luw Oƒ ŸÍá½¹ xhFNðKœd—Å_VL¶žÙïù2IY´faú‰„¢?^¢“ CNEÒY_ªžÇÈĘÁÍÜA®ýDš”xÇÁ¡Ñ[R7Å3aj‰wAT17­`Î÷HçÀðY[ 9B†œã¬ÁÀ£û‹;´%²}&(æ}î^÷R+JÖä´6½$BâC{OèÅ(­ìÞ$ÒB ,~§ ›ZdtÓ„thšœnE±6y£:&ׯ«1ØéI¶ ¤¢qh“Ùƒ·„W§,&§|š‚©µ,«=[ÊOZhKow†„5ø­ Ý$öù%QIŠMD8êPü8YÀÌ×Câ-¾ì ]Ü¿20Â<`W÷R|ûù±X`‚`ÌŒ ’æç†iÎ2¨ ð´ë’C?:È#Q:Ú¯hHî¬Ò¶ê›ùrŸ/¶ý… Ӣõíx6=={ùÜ<ý+ø‚åœßn×ô‚ösp¿3Nª9Ö]†ãCšxJ²ò´¼†„Â-WëÇûO<Ÿü€#¬öO.ÎèV1!ïF’É.7IBäwjV¿¤>]FŒJÚ|¦ìì¾hQÙÑPUSñ·‹?èª}|\ýò‡r oð!@®©?Ïh²à /ḇSŒ]fˆ Æ`†`­±X]uºÎwYÜri/ðn š¸;­²ÝUGöånr†P:¸ÔT†üø‡©„¯ãÌÕ~á¥È--F0è™U¾:GÍnŠH’.’”´oØßÕÆfŒ`ä~Ø„|Ñ ÆSlŽIp±bí!@}3\D$]Ïï·jšcJ‡B—"`Ù©ï*•·ÙÄ+5V`ÊÿçeÌÞzC*½²" 1ð,-~Ìû1ÌM”êœÿm«³c¼ÏÈjVÅl{µÃõ!•F“×ç>E û§öííâ‹ùh›+¨ŸÌÆëVœ=ô@f”Äð:µƒoĨŒG4­_SÈZlœPä¬<™»{h0J2VwÄÉl\YRdî¶c]<‚ôâ^ÚUmÂŒÆ)PiH-U`¨^þŸñt<5zJ *41èMa­=ú©uwtLS¸Ú`²ßÞA…MÌÄM5ñxmîål”¼7ž" L•ÏšÕM6~_&ÙÿøJ¾E…Þ©AT«d `.û¢¹hz雂ºí4íK£ôµJ‹Á„~ ÂõÓQ#dÒL ȵ±Ð*¿ê·{apvGP˜ý‰ô4!îžqvæwVuZ©s"(ȬR+;Õß~¿oENJéè™d`Ï“ˆt.©òŽL}Rü¤Áõ%ð P!uÚþ|¿ Óó6‹ø9ÄöOÕhWþ } ˆ=Aݽ¦Œ‘ú_ð“®ì¤÷“I}Ââû-sN¢R|ŸØI42ªšàEiÓþÈF5tÿ43Ë2vü·Ï`ÞÆ¾b½Ë¨Nñç§BM—.•²ùê7Õå± p!ˆó•RˆrŒÇ@»Crí‡Ý‹ä§šÝ/h§_òªò‹ô¦@Qܹh ü40­#=&_)0LâªHÆ­#—`9ËŒ}Sˆ”hgÃwÀr“œðõ"OǢ̵ª¡¯ó¿7ë*±f§œ©Í>ØêŠª‘v’ͪµ¢4êB—|Ý"èèØYé’æáÎIG_à8œÑC Ä#ãýrŽ3MÕJœLF…c.ê̺™ù'ƒ%×Î5›o¸m\dóZʸ†bzPoÕÍ ªÊÚâ}©Õ\!FqI—s°xcØ üAŸ†mÙµ‹Ò$óÛ¦jôRظh› ´‹÷éYéÉß>0jeu úïC´ÔffÌúåŒà…HÓ׎ޭ¿â_‘<Nêëãic–g—®óÅÈUè°‹VÉW¢®3o{Óš(| Ì~é³4–Œ+ ¾œì¹49eðöˆ#íÿ9u?6öIgOt´n€S†ÍÌg›á×BØX–Ü „GP‰¦9*Цçðœ QE¤Ø?ó_{êÅiBð#Lq0é“¶ê:Š,ÞÅe=œ&Îÿj•Vd»áÄ&öžcºB_‚ÉÒ&kLÕJJƽ²vÅê‰XINåö™@ª.ÐV7ñWú¤»ÈèzìláÖ@t;ÍŸq·W“iÇ  ç6iíîy¥üàˆ¸j.‡ÁzqåÉR(ºâz´œá 3ó’ÕòþfÚYŠÉèmR`gý·(â˜Ú#zE˜&ÙÌ×cõºv2úˆI0OˆOŠZ1È1ÖÆE—åEí wÅzæÚÂö•+8¦:ÜD†œµ˜Ïز4]yÂJúÒh»v2%†®—šãô¾æ`±¾ðÕŸ™Ý:gÄ¿ËqXë°x[͹¯D l6ï“–ú0 oÒkï\¢>2⊭ïHv‰>â9|Zr›ò}¤Ì ÷Þ4½^ÊS£´Zë}—¤1㟎IЍ|Õ?ãœU~‰ ÝÇhÏìD¾mêÆ„×f¬ÌØ×‹oTe×W){øòE-økeéyžE hxÆÑÎã`tWjØK󔥢x—AÄuµk’ëKI·©Ùx‘u#*ðÿj~Æzˆ¼¡%ì&¡û…wРƕ_ì„¿šL8¦gý42£©¥J KUPnÜ?B“oc³"f¹íìw[.)ìsξ2Ø:ŸÍêË7wÆêë |ª,íÿ¿OÉ& Ì×X)Ás•ÀÕAñrQ6*©ñüŽöæ ±õɉӿ`,ªðÕšHȱõnüȬ wY¥jHÃéÈΘIÏê=h#¨ŽŒ"‰Vyþ˜½l¬­ìŸ¶²Ï'¯³D:øš9-ZSW—“âάGB‹H$íÒ*¡GP‡aùm"sý« \›‘•¹Îà7æÌPô×¾ 9¦‚oV²[43Ûi!ª÷ÇÊ„JDl ÈÿwÄ}þÛ€ë?ê YñPËœrÖ$ÈûTÖXK·™{i:þ²Äü ŠON&Ñ)µ=ªÇìm~…Í®i¿>ìs¹ÒM!ˆh‚’ƒ§^^1ÃJc¯Bû™z¯0`g½;Ûz4Ô«ƒ†G1ÁaãNœ™1žòiš+( Dµ^KA„0‘¼JÛ*Dtä­çÜgxv çÙð{ 2¿óÍžù×ñá›9”¦ì˜ŸžéÂW°7ù¤ã»‚»Iœ…>×üÀ@…cóŒÇŸ^=Þd¦™Ö­21ëaŠZOóM†˜‚³qÀ‘¸ÞJð~,WÏÆLl¨Q>>P~Ò1*EÕ¼!H‘A‡‘¯æˆ”®/ù“ûŠBNx^®¹@o-ð EÛ)º”ì:—|Öc{]–ñÈÅD}'*Eñ³Ø<<–zœ6 1ÜÐ*¤Ž@ñýÞ/úįÛú·þáo\]aÚv¢¾2A³biÎxeî—ÀR0„žíuÄ°ÄæÐ‚1“Rmlaγ©á2†çNuÖ6 íÏëjlïV¢û·ÿ×]V‰H÷ ý¶““ ûq^oþ®¯û1U+„PM;j\Ò £ìôŽÌ¼‹Z£ªõÂ2­8™iB *÷êf±G;%É#ZÔòk7ÆüÚŸÄâ–†ElÿÝ|‡¯Ð·BØ1»Â/ާÔ=ÙF->ˆÙ¢"™ Mt»éš¨,ËuèŽá$%k4 ?š:k¿RzX$•<#Bò£<3u»&t¼)-ïZJóÄ(ÔÊ „hGÊ–$Èèsµï…‚˜PÊþ0`ÎúÉXÜÞY˜åØQTìks&ú¥q‰Ä‘¾HÑ»s³—fr4·ÕC‘ .^:¨æ øš*–|Œ?irN[›‹ÑwǾ®¸Ž 9ç’Ëu´µIº¿Ò·Ähéçý”mNse*JÒ+Ü`'ž›„܉Et–‰ï+ɹ¥ƒ¿ ­%§tœÕ«ø$>ý;Ãù(Þ>[›:•иßdÃÚŽ€Œ´´ÿôqØs‡7+÷ò£\€s*ŽJω‘ø÷-ŽNêîâGOåwŽ’!¼ÑàÂ=dǯ_/¨”i÷™ ùŸ¨Éµ6‚”õå÷ì*J°ÚÏp[‡ôÏŸ«‹G}6GU:¦Õz¸6kÕ cIŒ…T`ú޳By~ @ÁY !Ÿ~£ûLjt­È=Êis ï0qpzð7ϸˆµ)Â6ÏCÑn x ¨%7áü!^Ü!ðs¤žÓæ÷«Hr-ݪt›mB…7÷=“Þƒbá3>4Øl7ïKô”B¿L»ƒ¡çù 2 ÿûÙÃK 7ºWy¥&H”Bâ…陣;=îãË¿(RgÆæÊ.nP…^sfk¯·È0nç|Á®°7ýi†0IAð{¾‡»»m4æt¥K\\(Ä9õÙ`1ÉÒ׈5tú[.$ã'ë‚–›Qϰwj±)güâÄÖfF&[ØF_Å>Pñ™§`÷o¯)°¾è6-Ñ—&B…ËG¾ŸœR‘PBYûŒs‡’CÓSâ X5žŸÏÍS/—ÎRzÔôK8ñ­+l!!÷ûªróÛ”Ó(¨¾re-¨UM>MãHÈžV¼OA…ŒäqÍèY³¹1÷iκë)­o:¾„E(ÂÃãÞn€ÿ€¼à èß4_w»eè5M©*úó»N«Ýb. ”] AY‹ÄÆÔðaëܦ£üC#ê1L@<Ô_†¸+,M+ÅõÁ[Œqý/±‹ßü¢)+&ùä`L•€‘gB*}tMKÎ qa6C0§¨š]Uä”8‡]’<±Ùd;õXg^êøO3Uk/ŸnÛbÐ_¬?“#jï¼]©¶}AåmQHõö ðøÿiôôªÓ$$ð»P–‡°DÛ>b¹¥Ç¯×î9fBêR)Ë¿iã—ª}8ŒëƲ}#!;Æö¶$ÏcP(P×Ðfü•©ë’í^iMEWÒÈ m,ˆ³]ØÝ0EmóüD™*oëΣä9M¤W:ëpYNµÃ×Âjrf\§õ‰0ã•àÎ[QO]Ãе &×À‡ÇÑG5ÕTÅ&+pƒV”2UÖ/ „þ 8ŠÅ¢…ÑtX&¬ùh©•XÆ ÕÓ‹Å‹‘¿÷8€ÞÖHÕ<Øq ͳx4ê±lmŠá·7!ÞêîJÉþ–×>tˆ2…îª@YQàO¨ÚÁ@>©L›–Ì" #hB’ãK‰©¬•Rde¿!Cn™|VB{—¼D&ñr—ùL»Uü§aT³ž50…ªÕ’UU•Ù±îpã6 ÃÂ9øÞºÒ±°¸ÎƒF”‰Ïà ÉÞÏqÇË!Ïî¼Åëaa,‹2ç f—¨ÉêøcZ„{#„ʄʵT±ŽÁ „äMW;ô „"¬Â%ü¨é£Êæúû·Ã¿C ¬¼6Ž@a¶‘ua!JýÑtg=Æ»)Æ›ëiC5ØÛ¥{[¾3[\Þ& EÕ½eáMo õ¿æo„“A{.{ÎHx^:Û4&-mþjµ±òĽ.Uõº’ðª¿`·_‘Ì8J“ò{,}îè~å@ÉgÝd?𨸺ÒO·ÐpL\#ÇÚs‘÷yî·ÓÃs Fsð l:µ«;#c0T_çëh¹nÄ¢:´z LA öú1ýN‰6Ñ×ZE®|)iϾ55p¢]T1–d™¬ô1ÀÂÜàw¾œ±“’1Ñ›¿‹=–PÀŽà·(Ž÷\•1:õ™‘^}jÃØMsȰ #ê¿;PZ%$buŠÏL>¦ 5V+ð?ˆ´rÞßÕzf%öï|(”ÞêP³¢[!ÊX9(qO?£AÝ„#ã6é…v¢Aîu}\(òCáí_”ðF¬¡bا5 ÃÎ]†!¨²Ÿ£]KâcߨÿìôÄžx5„—Þîö¸GX¨yïÚ£n{+¸”P3’âÓ÷Ãi«‹%hÚPQð,Ç-¡‹Y;¯ëÙùa#õaV à.Ì÷ï$UtÔË`>sŸ8ZoÖ0¿Ÿ¤–<Œ šmÎ(_ž·dâàHhlVѱL…KоüDJë ¦ Ï3Ŕե"8‘X9™SáT/LJKN‡$|ê~o9¬îÅÍÇ’Ý~ ý½Gê»/ŒR†÷ª\÷O÷W¶Êfe`B¶üµšñe,}¸CŠ?ÿ Sr#9ä3köó‚ð{Ï€ì ˆo++½Î°†äלּÿ{Nß´é5ÉÏ…Hòl{&pyÕ='×±å¿k§Ó‚CšñrôÐ>¼r  ýeȬÌ3—ÞPhC–x«MÈÁÔÀ=|Kœ5¿µâ›j[ö¶g÷!hÚÈʤê"úÏIÛ~›lß:ê<¦N±Û¹`ÏRŸ[{ËâVG*­¦j Üøiôÿ/d»¶º²ƒ TÅÜö;_Ó$™Ê†Lõç#¦;Š?Ö & €&ü]÷ßQ w'i\ ø)àòmu¯|‚vÌ‘Ë6þ¾Ú Ò‹ñÚcy’ü`™<À]Ýe÷x\y¥Œ«ãPbîhîç2¤g“DQ9É+I¬ÂØÞtüª¢Xñ€Æe³Æ“kOS盧¶*³úñ©Àä28í…#ˆÇ˜ŠxxîÁû0iŒÚIƒ°È[m›ãb]$i¨I…K ¾ŠX¬auVÛsø¼%Yï˜EsCü9 ˜ [Ip(ý 0obÞåš´4hÀR–¿¡‚4 ÏÙA~¨Ö•ÂR”…ËÌ‘”§Øû¯ð€ª›—]·ò±ÜUädR2ª>pú¿wô’¦nÈâ!ÝÒHeL/‡2vÙÖvŒ" „‰3ñ½±sÃOjµ~Âѯx%Ð)Ãø'‚œ%ê*hÈäS}ÏÎàtƽD¸6j\-ø3Nÿcr8«í9ãš1P¶l½÷ž(?E¤öÝ9òq#•Øâh2qß\Ô¯ DœÛE<•@JsÆ,ÑHUßC8—Nƒš­b&‰Y}=ž4qk[©ùo‘Gl$åaЭɢ_Åo_7X!¡ š•¡{{cE…óR_ óE·gþ' màòû½\þÖ0#ºöâBæ„ “C¦b~BA¹è Z〰xU^:!KVe2¿²dl«¿[xõMM2ăfØŠ¥”Nr0.xÝØÔìRƒ\°ªa<›tQ¢ÓW—¨UƘ‚É,:uªš|×vì´ú؇¶Ìa+™Ý!¦B\ŠˆÅ$¢ ¾?ü>@AÞmpzÍB¦0Û(Òó£ÉÂÇ$x—ZC^?â}}Á\ ¬mSXúX0³9‡AýÙº…Ø^ÁÑåé?¤ÌYQ:¸´Hˆ|–3§ã‚Y BD!¾¿Æ°žÍ¯jÿn\g[SO:-çoûh—ýúBGû9—1Éþ•B\ç‰0=Ï3;\¬¤âXbA4æöô#ªˆÉÂCÛï‰và3T4ÎÜ=Ýmƒ !h'¥|ÓlŒ’ƒ 0ؤ·B=Ôzœü­s½'U”_"…™'Þ:Py°d±‰p2è[)©ç÷”3?{$C©=³ÙáÓhä–¾¦M±¨fïëYJ`›’ë—ºÍDïò5 Õ¿!ÒPÍ\¾äÍî¦X/àF=„T7ôZ{ƒ+¥ŸAC“@&fli!&˜ƒs3@ˆæe»«’i}u”íáŸö™ÞqœÝc$eUWÿ¿ˆŒ˜£Ùw^ÉÜ=¾ÖeëW†—¢OWfáçÌrgôê«;`bZ˜ I1"´gy)•t{m©¼äBq;zÿbѦnjÓ4½X´R‰êª H\pWùÄ}Z$H/q/’ˆq°!{0‰œN¹Ò:µÅSçð, R´5—¸å­§:Jß{%ÚPâ‚*ÿjŸ8¯P1B_yîö&¡&€1+±˜ µ ÷]9N!¨ºácpE¿Ð¥Îå½m°JÌÑ[âÒÍÈ,’v¸Æ~BѰÕü옠VS~eˆçMW!NºÑÉ’q›5"'8„gÄ;V½j[åô¸¦’H-¸ÀÃÑt7×£ ¬`š êœ{öýFµ‹¨À†!µ,(OÕª³&¤…Ç$ßc_ŒP¥ ¬üQ?}$ÐAJ·š · …{(bùÐ\.MBm Ê¹>i'é®éÜÊY{³'|,Õ”fÒ’ëœk€’PáFüí-ºÎe"§6ê\OåòÚcŽ]@ˆ(0O²w‘éÇž!_¼ÍHc6]µ`û±G¶Bz£ÄŸösgÆS7?.9RÎÇM”Ÿe@H9¾¬Yß‚)ë:à,!bÓÚ øFÊAxCÎ×"¾Ù7úÎ(jIÁ …g0髚D^¥Lt*TÎr£g9™ºs“*ÚFë}(–áÕ­ç\çºÅ×åêØ1ïu!JÛ7ÉA ~Tò²¸Ý}…,@„DûOG#¥Îoãèf 犜]1‚æ,ŒÉä{Ë4ó³AæVkÏ_S ùÆ\ìeò?]´„L=¬¬Š¼bdU¢aÈ™€<üKŠž7¹†\±s´ ><* Mƒqºvi×_NïÔÉД¡âçE…R—œØn£p˜kÂÚî‚ÊGEÈ‘ÿž˜EY(ˆ—Ør®âˆI'£DHôÞÊÁ]*[¶Ú¥DF„í•´Å‚Ú&¬ï~™kþ¡Q©® JÝ—D¨Â©­q\S¸ƒ ŸØ¹ßGd¨]„ríܽ™Œ÷-6¬$ÙeíßDYPDàa)œ7¥“6)JF˜r]¹‡Õ^ü*àþ+êÊ4/õþ3¢ŠÙxƒóÍ_d•fé7-¿ãÌ\•ýH̃¿®£czJK¨Aj‚É¥Jþ˜& y\y2õm!êøûdVi‘1Õk2ç™Ó5OgÊhÀÕNóË´Ö¹ÿ•lóHz Òù&DMÁUtå ¡/=Óïù œ2a?¤o»«lC±ñáÝÿñx…!=D,¤&ேºË²"]ò/{dôï _=é"´5´×Ù±)$µÞ@oÕÕÙMè=ž‹ÊÕn'Nؤ¸´[-¯cÜô‡ÍE×ú¿xÖËJeÊ—4 ½ ½ Ú??paÁT2±1JésúŸOâ™ä—ÌY±AªAù  ²ý¨V,ì÷*|çâ«F0-»gû&ö­c´»¢ê}ƒïG.¥M£ÃPHó>•è‰âÔ€¦4æ>…Kö²ò’ÂgAõÝ`SÜ£õEØAÛIGiõu2† Ò#îö;<ÖF¹–fjnJá~`΂£}¬Ù š3hgGJ‘E@¤­ýµÁ¤AO·•ìMWs ˜ß•壨JM'áb¥ñ;ûh^³‹ RùäMCÛÆ¡*/ ÁEÊ7òªúñZÙ×öÔmaZƒƒ¦`Øþª·g †vimÈÅ•…ŠD¾Ÿ¦_îä;™ÂÞáÄÙî>Ÿw—´M°¶¹›&N'§È,Ó©–HÖÿ´Ø„¿H®¢à;¸dûþÈaTÒsìÆK8”ç|VSëá$ GÃw¬Âpób™²=Üf ÇR oúެ)ú# Oö’jÌIï:$Ÿa—R3?„øÓ“Y½mY‰ $”4“f}S{Þ]9|¦@ÿ§phâJ¡o“п¢XáûXßOÖµ+]ÉЩÅ\pH bOT…äfƨ_VqaRƒ”ô6 Èë-¤w™o¶þÉ«_fê»vAÿ.d—«3ûñ 1ä̳×ìÜI¨ÞS¿¦{hYžñÇC¨±”,uºGè0GGU7зD°ÅÙ³éñ¸‚€áúpíÛcf±H"‰‰Ït„—¨\¯ š¨Ñ'M/¡¨ÎGOÊGܳ‹KV [ÏMp,3 ç%‡LÊüŒÛRçCGÍ̧þÊÁîSV lj<žÔ-i"éni`CcÕŽøÀ5äì·³¬Ù•÷û!V¯y\<À•wCø”–Å&gô?‰Š“_iƒcH¾^ÍNÓ'´mß凜¬+¹X!KuãõbÖlIò®3U&îÄ«»„«e¶"4fÿež¿M«û‚ÀÆ¿y…Ò˜­!Å6Ð6Çí¢U´à±øu½ï ¹•¸;/¿‘€•R×’>¼vtæ† îä*jlŒÓ]³)ù7GëÕÜaOêÈKúD34òŠò\”£íÏœð¥*wY›Ë+.I_:WåLQHZÖ;Ãà呹wyaoc¨wœ Ò¥ÍíhCa;Ðw}š><6»•F6‹ê Ñlga¸Œ(óš<¯ p P%K±ü?r_+Ï9XŸbßO"½û¬z×Ê«CJ'%{ïÊ+÷£xÙàX¿xâã _V°°„¨eìËš3ÓÆ®ß9%I<(­Ñá…: œ39IËm+‰:îä€I ÎÇ2—c§ñôàÌ«VB_§æÈqɆZ$ê¶±ò&Ü^µÏÔ†¬wð„Þ>àA2½ÊZ¶â¹ÎÁÎÆ’Sµ3ÒuHB9”›ØÆÚÆãøèÚV#áóWÍê.¥‚FÐB­-³²…Ë#P'ß»˜&ŸÊºõ66â=¾eØ‹¬tþÃä¯nÓ¹0_‰™qßÂÿ¨ùÒÍÞÙ%s›`gî©çºÍ„žÏjŒ ̤ÃÁâç\?S7ö\‚É¡ý<î¥O%ÕÇ5l ·£S¼Ý—Î@AããŽ[‡Úáº#Ä—O ”’b¢)®>K ëá,Áÿr°Ó·Ê)I‰ÿΡ_Ã˱槬Íg’T—YTHl'Э[<É]q=…n€TwÆ*ûÇ Ð” ©ê’èù>ˆWòšUu8å·Ò ¦ç"Zë@È_^!<áÐC&~ЧäŒUåF·,H9\Ù&#{¸Êá x3ñfgÊiÂ:Äûò– Hô¶O÷î «|qÆÏ5¦OlÝ©¤WšÆ¶ñÝOU¶ð¿#t+•G}àÙí¨¼–ò;¥b„ ó±Ü\@ûŠ·h*£|j›a‘6?ˆ°<;–Üd\:WuBûZOZù¤³ åÈW‡4Ä>XD‘/_vÄ&±6ëYÐGë]R½h*BH„as'lOÀ0º ´|¶8¿M €S Ž;ëžÙÇåî3|ñÄl‘Ñ Ì—a=y¬¤ô]ÀLî%MÖìh¦ÄÚ…WcjGuÏ’ø¼Qæ slJöåùóçqìKt[[x÷D>ØŠ3ü žÍÊÝaKæ™ÖõyD츟#…¼øä!Ì0ý=Äc%h Òã»ÌÄåDø°¡|ËÄ ìF “„¾#}°¨T­(mî¾ÀzÙrdIxU0j¸‰LEfŸVÿ%¡,-eü ~ÈÁgÙÓ>˜.Á„{T*­=[c¤ßH¸xŸÄ›†aIþÏÁãŸ!»À ÛèÚú±°È2Y”+F qá?"XÕ KÜ èÅrã釋ÌA½F?º§Ç™}¯ õOÔç;¨á\(!¢cVŽÍo2 ŠºÀ0ëÎ,dáÏ­œ$+ŸMS†hÊŒø¡ŽÌÈWæÉq?»x3*Žfê‰:JjlÃõ¹>îE0ûì]­ÑF¤G ,DšFªág¯ ‡ÚÍÍýÎ3÷*C%I½lšj æVèñ7…£/›v½Úþùz[ qßrÔ-|Y„Çy~OŽöZç¾ê-"$ß×/B]‹ýŽD@\d‡.>ïØ«¸‡ÓÿRÝRGêWšä]3Ìh~ÓñOh_}ã5tü†ߨÞë£uºJ¿ ‹Qdê éèɱiŒŠa†éÐü Œ¶§ýæë­é¬(»,Ølz’#&éGZ>ô¦ªˆúîO$«^€ôZçuX•ãQ®,L˜žeû[iÉåùvÁ<{AôZl Y "\2ë­ðÓwü¨[¯¤—Ép‡ÉuR(f/e/ø£H\Ò”6Å v`têð,ƒM¾%9co›õª ù• â,TG©Wûb]Hö‡[ò‡Á9˜ Óôˆ¬–¶mHàtyešòç3h+VÜE½Ró!Xå%"ìg±[âBÔê @NÅÚÃGsf$œe%ÃU‹d7ü¦(!ãÃÂ~“JoO+ÿ PUc}šshLw ©ó}åÀ íÐ[šž¿B;‚°!P#½¤;AœbÏ¥¡%Y sÖßÕ½›<¯”½‡<1Ñ&m‡+,‰›gv91–zšµŸëGr†ëy·¿çn:êœÑhÀ<<åØŠaI¸ðañ×j3—J4~Òs—?K²'ˆ€Ó2‰P–ˆÕòÉÒãò+`Ö©žÇ&=•vά]lj¤§ƒù‰Îý#X©ï}2VÆz¯ç×äûÜ\}Çå|ý…Zjo‚î²õ× !A–½:- eY½}«kg~{9ØáµEÈW§Kå‡+Ç8TÉ\÷tÆ2;–FŒÂÀñBKHÕÁ?çª#›÷­BFb'~KÙ:§Yçh 3´7eu3Õe“1ˆ4S8·_Î~Y'ãeŠí h¢Ÿ’w§Ù"åã­õ ,$¶ z[F·ï‡e€ËÝ ìx±\Ê/ÞÜmf»C…Ç ½u …øÒ¡z ñïÛ:uˆz½VŒ–À42“+ÝØW5ÝGÿºˆéCiX8¬•ö–¥ý(©Mò®eHÏ•†'¯u]&tî½&]ÿTeñƒHûøM¾±khšˆAeI¡Ñ1aé*~M,b4²S£m‚‡3úâ¹ÿõã+.l¯˜îêðÌQö0< `·IùfTcÁMA*Õ¢kH^)qèþý‚Ð+ál±­*– ÂjóàÅM ÛÆ»³ÛpØÊH$á§Sbë¬MÃnK’µƒaù ÈÛ×#=~ã«th…¡Âç»–âmþ¶d‚ã–ò¿ žKáÞì8Â¥›_f†•aÚÊ@(z'nKl û*ËöåSæ›fË .]‹Ë§dÛb= 'ÊlýÎt'5õ^¼N èL6ÓS·ÐТb(ã%t…~$ò^;CÌð©†×n—¥ïÑÀxj“‹dÂØËmád89+KˆVYÍ â)zRÕ_¢ØS”žØ­ ÜWhÚϬè,@æm©­dQ KÐzØSM–Þ6ýoÀÊjJhakö¾ç¹…‡z›Ïüû‹ŽÁ ,Ášîj´¨ wQ3c+³ru7ãV…Ùˆš_H÷E³Ëü•U“ws—±,;LN[}#gv"PÐùŽY,…[’ò÷Û•/ n™ø|B%xd nE½3£øÏüÉ«ºGžËX?8 ¡Êòøy—®»ç@²¿5ÀvTÈ!–fK°Ô£jÅOð„௺¿Å$^Ñ•ÑÃæÖmC?ô#kÙý«Ì,üŸ)÷·ÃõêvÉö fÈ]ÇhAN*¡"É1UÇ~ŠÉ•:5x‘ÊðçÉÏ;î³<×õ$ˆÿpþigù€õuHŠtÅMÄàd¸xÑ.M©áÿâ;a@§v#…ìaYpQÛT¦Ž}õ¹B&QB ³18ˆ5péÒ†ä%1òô‘®‹íž=~쟧³ºŸ¡@ –-‡(*„õÇkXÉò¹X%eE¢°#Þá¿•u¡9ƒQ ¢9*)Oy=qM†³»µZÈiwÝfÕ óî`ìÝ>Aú –Á0þ´Ü^y9ê ñp£„É”+¯ñ-õ³¥Hú¸8ÐB¢9QÂiÁؼé9ÛÙâCù~àOMšbÎPvGiã¦!v•„·››Xg9°’u«sBbè’¯¥ðÅ÷Óú1%½’z”˜< ”,Ñ/Ùyd+Ô õ$S Òq-ExЗFÄÛXU‰ÿbvS"SZ) fnæÅ&é,¾Ø¢ÆŠMR>Ú¬(¼–²Ê1)¤•Ò»W4\³k, CTjÕw×.ÊüXà€%ŒMÅúŸ wÉß.…Ž®RãT‹@C¦|ù¶AXÌ˽J´4¨ã]°`úÓdúÞ×tòÀ馊PèçL¶¶ƒgþ.œÎ·‚|_oý¨«{Øk&ï5@»ETε]ÙˆµéçGþ´TŽ'§cÔfK?àøl2 ed]l^ E4°éç|°+„þKúŸÏVËÅ×7‡`‡äצUk®â0óS<6W,â`ù-6ÂFªnðÌIT­iywJ¨!}(4JjõÕ?ô£õŠ#·a0Âר‘Ð mwäo,m‹m¸§2½F,ºpÁ9ÃÏGeò׍ÂÍ¡3j0Ýx*V=Áˆ^åË„9¤çŽË+û©êê-¢9ÎÓ¦ Æü¦°—è@þrb0@Ò7q1@ñ;)PÛIäw[`Ÿžå° Üw2艮*ß4³ä!ò¨¤xÔå"rÌMh8Bå7†ËW²VÚ>ù¶ƒdüÎÙÚi ûvªÏ¤Ëü–¨Iµö&ÅmÝÑÄ3ç¼!P¸•yDMä\†¡%ñ·\z!áŽÌs1>ëN9^S¡ày¿ÜÄO|ÃßHæ#©Ÿ„ÝV­ó¸Ár®(ìÞÀ„ÝájVN˜p—ôG¨¡£·&¥‘†Ü¨ë# $º6•· oßE½Ã׿ê²â‡ÆŠ`„iÎ p³l›ÕßãÕe<·Q @ã8 Ì/å¤ ðW[§j‡ËµœE09Î*osìÆÄt9lÄQ6.»g ë\ßÊï<å ïYΙv|+ʸŸg¨GZƒSýŒ]»²­Üç{ܓҫÕ&k í¬£ÑÃT¯%€kŽàÁã‹¹Ì õK¼£‡j¸|PÁË)Žž;‡SCJ‚ÄÂkÂŽÀ¶.A ÔT”a¬˜4‹{ZÂåIH} _¿gçß~lÞÄ•ãLVñK‡ß+—«¸¦C½ï›:bò+ý!£ˆö7ÖƒP``ïJå’焃Ôûó»M²¼ýN„†¯ÛW¶‰ÄeaiÑfW­j!=Iל“92šèä;»` ù;ýk”±¥LDHoY*£ht$–/:(­ÙçŽTÒfzÞã종ë¾OõTÊÌöÅÃåà½ma›WŒ£3…ýUÿÑ{CW‚ÌéFߺAé *têÂV ¯N6¤ièºq&x¨_ %Àé´æózœ D® ÿ—¿)3•ˆ;4Ó<^ë:^ìkw¸‚ú__x‹,w¥ø´ŸÉƒUÙ(M§hh®‰„-™Êÿ´(û®!üÁ¯÷œm¶‘gms OW#>î”é*Õ®ÙÙÓ¦’!vCÄ=9³îÁȦýá •Ãf¯Ó*Zã^ XÐüddâút~é¨‘æØ¾3I~âÜ8åîRÞqý˜erŸÑ­©÷®8ÈûÚkfx^‘ùl¶?Ÿ$@…XR‘6ºžÑ² ݕǢ»Îh¡»âL   ;®G°;Ú@H³T¤öèOrLG›päÞgt½½ÈøÂ>'…Þ¾á9Çz9MJ±äü»¹àÞ_~ÈŸ‡Ò޵@Ô)H–ù¶¾šÏYÌôeÕ“!ím /Eˆõ=⦩]v›ŒmŒLKŒÕ„i£¹\~.1ÊW‚xóÄ Éóe‚Ý\Dú9“ÓÎïé¯_§zi…ø¦“C˜r>Æ£ÙøN"Y“ÏC° sÅ.nêy,+ãs‘Åßc„{‘>&@Â-b™›ñìç†K–ߎêªè’Ì#”ÈYng'ίÔAã'75ÇãoZ•ˆ0~‡¢>3ÅS³„||–¶MC?ff?/H œ[ŒÆL$L!÷¡±{Ù+×ãå«fKx¢mèeDº }@ÐÇ"Ëpó¡õÐ{œ3£žaæ‰,×¾"‚V 8üU~„¾±ôÿK¼+‚Ò/Äh{J-úA­™„åGê…鱺^@ü‘‹ÀQ¤ýVóÌâaæW 2 Þ¹”T£F9Ç s½Ò{Žó"ðRóå#CÁÍwqu$rW+ëDý™V!“ʘŽRºmÔw¤ O«Š¬È1º{÷‹4VŽù®FaT“9µ•’•r‘I‘V4•7-JQeìêçŸx¯sŒñ¥+¤Ãw$D/]gzœæ!…ê9 Ѭ11ë‹£‹ªþ—c×R­«/ˆ=Äõãùè7h¶$$oB…$b«póR“Ùì|’˜k 3ƒuüRj¨«? æ¼y»Ÿ¶k¥ôWΔøßL¬$^ºì…Ê0Ñ[–wŽƒ#[®°+í6ÃB!¨ a‘eŒFWaFå§a-S'#ÿÃÿbc¢1 GÊxÛ´,H˜• F<à±!îÎÞóñ¥Aã1]U+ò9tÿ¢ãIä\ê°óÿúqä½,µÏŸ ñ»>gèbößœìz*‰Œl4uŸP$ ›2býàÁk«£PHH#lê¹»MJÝž¾{Š#`²3V£’u¦¹öÄ[ßÍX™$PNC¢Ñã²cÂõ$ðõI,ikÑg½Ð~²v\æ7Š.Ù×áí©É§µ.ÐÝÜ7e9e6ª@;´¬‹ÂQµ›}þ⯤­¤»j>nàc¨Ž…?ÚÀÆc ý8 èÚE§p³ûëe‹ÜOìò ó‚X¿ _»wϹɥO,6/!lF Hìµ<,ºIµ;UÑOã·•>zÊ’Ž#°ÖÛWûí>—8œ™žÏݳôîMåð.Sý*ä¡1õÊ‘­ˆ¤•q³Ã„Ð]ë8D‘ƒ [€Ã?nŠL¤ w÷Á²(Yмè#ãjæ,œç8å²&[™/hd-¹éç vQd 'åSÇL2…à×€úQÜ¿h·4NAÌ<'˜¯=²eŸ{·»@ž¯×'×’wôÒÑ.ü#a#u`š¡¥%뺶ð ð ¢ü… Íy ‹aI­J~;ÒÊ0»±µ?5xþî™öNVbÒðVÜ+ÄòäÕÊP*É?z¼+0`3•ô„ÔŽ÷C {â ý£&nÎó L¤Þ©ã¹´Žô¹UÏ…8¨ ¯«ª-ÇÇXï­poçÄŒ€ ¿\¥®åGV2Z‰/õò¬WјI’z ·¨Ó¤ÐJz$º{A p˜j]×}‰>6Å!qB3;4÷Aþè²Ýº»%›bG²•ÁÌýy½ÉRÙ@HQdŒ”wÚŸ³D_’2š’)~â´0M)¡Ä+l(“ƒŒš•J«eŠàH¼Ü[S¾‘ZÕŸê³êo÷¶ÙØ7ü¼:=÷[{¶´W׸_¨ó>ãÊmó~ <ìV¶7ÅžÀÌÜ_È#Š]ÇÚ«S‡å•~¦@¯ýåÄ.@aS~(6ÔØj¡7¿o£ ¢»êG^ .ICMÌ*2‘½£ü½è¬ÒFJn ï•ÕŸuæPÖ*Úúo¿Ã­ÿÎ|C£+é8Ó²ÎÀ`uV†®TfwE²Ú€ÝŸÉÒ?Ê’KLå 3`á4ɧœ«…Këè<´:`‘ô€¡$Ÿ1uæYdø7Øb 0žWQ‚¡¼3—‡‘œFva[ÕTéå¯×ÒyÜ’xŠŽIöŒõ»•¶¨I–&1ôÞâNa ¸P—¾·`ؤpy»µ<ìUsƒ/H!r 1R©h·É}†˜À$½vÊ&ÜcNÝ N⬠À%ùO© ´·wwävfYÜ5ðw¢Îÿ`~VN`Ž%Èg-HEÔ¼ªÒâ°@Ì»£2FXC _p¦f'GÔ°UÛçŸjí(Þè·À¢myLr*ŸOé?Ícœ³_áz\ ocóp­IV»ç[qKÊVŸ;n¹’ØZgÕ}bÕ (á„Ãmâ1<=Ö©ï6 Ð8ÖÉÑ’´ÜðÌêÞ1HþrjP-ÿ-S-Ü6ÄØ7—`ùì¾x~zh0ã =n’êŽ&‹J‚Ëy€0&¦OÚâ ¢´\÷ÃT“³TÎÞGs¨z@oW¤nA6h[cÉóÁ&¾§8Ôs»3mpí0Þ]Ä™«œüá b©},)FÿMøô[vPç;šJÃFÖ»lD¥è!KvÈ¿©—]ktˆ"¥†¨|°¨´7w…‡”É)ùÜa×ð"´d¨ÕFÀOQ3óZ¾ÓñlÕ7@'BP8‹éõÈ×=Ï×BO²ÇÁž&õE³Š t‰ážt7*µ|¡\=ÃlúfÌ´?ØÙV¿¹mAÓ·ÿW¹n|¼æ±·±‚;5/.¢ÞÈJ¯½’#Žx箸 »åð`òn2ÔyžHòe@[Gc=½Tr6¦S¿åhÈú½¸4GÆ –ÃŒ‘´À‚t ¶¬f(ò„wRa€1ÎÑž0bZÙˆ#\œƒ%¾§f¢¬ß×Ŭ—'=WT²h<à¦:ã…m‚€š@`°b“n²ÒÌŸƒ^)cÆgÒ:°{TüÉDàØx>ÕÇ56Gº+8Y^¢„EµwSZµ±NP}NÑ 說Éåóí] Dåãô‡Sa8zñ§øÝDð!'€d|–³ˆ…𨵗Ý{ 3 ‚*j<¼êëñ7@¬½‡ ôÁtŰ,;\úì=£àÎÀüîµÇ5ôÅ£â  r '¸"…ìß÷ 𬘿×rȶe@È`¤î%€T˜#·}ýBÀ}m鋯™TzäìÆãC+»yq]6[PIÅO:É%x?Ê@’>ºßȸ²ûßÑ:Ô[aÈM¡ýˆ®K€¶T„Dj4æÞ 0_¤î—!¤'³ÖÅ;ûg ©Y½ïNÔÈuMïœD² >‡œµ£„a³LŒ›GmpøÞæÞï]ì°|ü]^$×n×=&÷uýœ˜_p"¦¦¼²ŠHÓñ¥•ïoÎ}¦%ñ=œPŶáaç/¤Í;Jñþ|‹!W jÂÝ[F¬*Т¿{(›iøn2¹±ãcê5[vRR3m«D1¼çGÆfÛøR¶FÏ:#§ï×k(×`‡2 ®µ:ðØ®øYÈlOâi¬• F_0ïð1ža×mQƒ'ùPÌ?hòLµ[vŽ ]¤ËsÜiãÙ¿!›>Y¾EIZ¤1Q˜§F„?ßécHÔp×44'Z"+è´¸PzL¡7·S@ g"¦•ÚàFÍ&%»m4ɦI§3aV¨/ë@ U¸ü»¨07ñÙ=TI×™aO(ùÙÂw^ FÒFì<\pï˜$H€‚¥SfÂÊoZÕ»ˆÞÍí¤’mN wß‘QaË:žcßý¥9z­oÓµ‘ GJL3|ÔtA/þ‚Ê„íÈS¡êo÷¶Ð´˜Á\åU¥ÃŒ^„OSsÃÎ oˆ#tRr½F0QsUö)ýBGi²ˆAò™úe9äx Å žîö«!~¡÷Å{Žþ§©®ØYxÓuJx6$ò©'ÁŽÓ!Ös¾" =â¯~232WTúª aµqÞ'Ë`…¢MZ!¶27">lšJ_u.š|é" ÿ£êlšZ7k ô](àoTiEÜÄóÈZbUâá“×9!ÀÎw_†«àìJÐx%C<„_»ja}bÍ;%_r‚²hpÁ¥I½²åÏ-š»Ëðê  b=°×¿YUùK(4»‰0r'D=–í¾-š˜×VDP|©¿¬Í«„g_%íôÚºËCÚ › L·¢#Æ:‰_ænÐ×­LüìŸ~hdI„× ]ãá¯NG¤”ÛÆ»Þ·Áð¼æ97vô¡^[J‰Õç¼Û] hÅ‘ŒdzÙ° 3Ñך—øR7ÞiíOФBÌG¡¦ŽìM¦!™©ÙŠy›‘.T ÅëÇŸKO3ž¼ˆœ¹ë¿t̨(· ¹¹ˆ«•oàN¬þ¢³ ܲΊˆ±‡e ,S~Ô?…°Ùé<wø>¦O'wã"œþ{ns”Õõw–RºS¬_mÄÂÚo´µ§ÀPoÔ”7«M¼-“¦ò\Aií¼»ósG°P  píOè%/­jмÒ=ÕÌT~™_l £PBÞiW÷ÿx×&“èØQÖo´±M9{¤ØÔ|ý|RçñËB_ ýÉà¹Õæ2ÚLíBq½?Û‚mC]T(f`¼/h$3’ErJýroB=îÃ7lÛu€ˆ¥¿8x@’E€6¸•|}íóÆRhwÊÊyY3þÁa-Êb•P¾­™ŸÏ‹ÂãÆ(/¨TÐr§îZwhFˆÔ«ÃÚ+2d„w´óúáÁ"‰„ï:£ÿm÷T"¥Ýí%ÖŒƒ*ù9c{&|lܸD…­rEˆ<¦„b¦û¸-.¢;ù zX¤Ì€ð—`ªÞGÌÈØâ>LqÓã ù“ñ\[épÙ¨Žrùñ_¢ÊLÛŒwîoìË.²lÖªJbÜr_=ÌæºÖ‘Aª2ùãÔ9TètøÃ7)mÞÆ”?´SÏÚ˜) lÀ–åLÈîr¸žnK·°sîJ N©5ýš?¯~ kø’ƒår­´ˆ)iro&¦æ×ßh0&¦ˆ4ùÏѾ¹qúVff8ZV¼{Š'‹ƒÄ‡#Êü“d\¾ÀèGæ»úo;å$ñÒΚê¬òœ 5©˜’)rM,óœ]Z.NÒ­Ê3ËÁtó?IñÐG8B\þ³™Fºéþ~ dE­ºsD©ÊsÒÔçÿ8µ¢–Õw‘JI `›«ùûp›ý‡N˜#Í"óšÓ\ÇJÝÈñ°2¡ñ$ 6vã4Ö|Ó=˜ ¡g•ð öiŽý¥.Òú¨Æß½²;gyh°V9c5NðRtàÓ(›U”)ýd  ÇöïR7( 9,>@?ŸYÊR¤öΠµ­ìvXá:éÉF»ze°±!u±Êˆ¼º~g2ÚáO=>ÕÞXmÉÎl™X±KY‡çâï6¹ýǶ‹Aœã:N[ÐAcäe1©k{õÆVù ÛºLìšË-lÄ'åÿðE¹®—Gsº*¸Å}S£>ðÔlÇÒ§ÚÓL÷c/ã=u«*Ù»I ª"²/™Þ¸¹ S²?üÙ^ò‚R'VTMªä®ð[¾¥”ÆS0£±=*2Î-»ÈTsÂØ#)y€ÈDñ«õV!h¨µô1±åR½dE3˜q·ŸÉÁ ‘nìˆuÍ>Á›‰CúÿBô'U”x&eV¼ËTádD"ßæ·FôérŒáØ*Tàž£n…4hzŠ0+7õâ¹HªËv¶+ETÆ>ésçËì¬ïadÐÃ÷ÔXàÆ™>Y·=€ëûö@Ù>”3!Ú6ƒÊ_Ccbðú·BeA]F*cÇð=á{ ³ËÍçãZÕKo-[¤žÕ:‰H¦[I“<Ôr®å5¹êKn9D1·¦3§=‚ˆ‡õct Å`êæÿµMH2!üöÎÜ?é&zßÜb¨¡¡lœP/ݶyn”씕ÊÇ|0ö¾vå³Ï%¾yüŠ&åÖÍ{ÂBð§…14WsÂû^òâÀä^ß,üe(àzTLÑÅ€_30 .']Š ¦ßT©â¥ûtõ*¬u[ªV]Ç3ãÁãáìù;ržàØdnOÈ/™k¦—û(å(ùTS#¢¤uI{ËÓf}_`nˆ¼†Såx@èÄR2ÞMåý¯ÿU48¿è´ÁAèâú–Býݺe`— yÛëN¥´í^E,vσÀNÝIÇÖiÒºÅS½BD8â=S$J"OXÿWäÈÌ,žSªL´JŽÃBabhS…ép^/6œn¼ñÏžH .PÔ&¾¬‡¢È†^ÉqØ„²K0B¨ãa.}H!¥ß8x…í æa„‰/AÚË8б‘Gú(tÖ:2…lÂc¢”f$ç=Õ8B&XB¹Zï¬Öíä€EÝîKG¡ïdÐh˜¿¾Ý¥µî¯ *B%åi”Ç®ª2îÉÒ‚“7rÞ÷÷Éj¢izž¥:¦â©9Jb!¶m`1ôO¾†›4ÙÙo B*; hcØ=™Ög+Kgý:¨ÖÉ_W¦â—g'¹  e{ÙNIÇÏ2»ñe'Ë#Ú®ç¯dˆqÎØÉ‡t‘Èy¶Å³MèuÜ5¨ÈCL²jªå!Áv6};%Â}Kñ÷óH¶3³–¾pŽÔæ ²Ý§]æ}¦h/è7—K¤¨U@‹ ¬Ï¨/ ò#Kç-FÊóÌÊöY÷Ébèäìä9ÊäÁB9BføÔaïHx4sO汸 jK$9G}ʈ*ò'`žÓ;®»fÉw÷”¸H’[›ËÿìÚR.Æèèçù½»"íètŠo@§;ÒÛ˜éz¹I~÷¦âs0s—žÎyÍÕ|~€ÓÜÖeÌ6«ˆ:™ÇWŒ»…l“­¡Œìz/$˜DLpÁ6ôq?G?µj¢H0÷‹–3S/;±óœxŽ#ô s5ƒ®¤ ÝÒ‘>AuTvêR$I¤«ŒÞwÔv*1®.È¡—zi˜îp{H)+'Nx¾rà è¦Í®Ÿ~¸­qáÏbÓŸ|XÂ.}Ç¥t“ChíVU¿+Ê)í#ió) 5Åöë2CÏÉ—$^7ÙÎùíì~œN• dJ%x©Yȹ)¹ÈØëC sÙ^Ùþ+Ú׳9ìº|!á:¨Ë¢¢ ]T»î9x'Ý=ÚýJíú;à ýë;(7uïÉí¹7¸g>Õá6;ìè·ñvGX§£”ƒƒ¢þ݆/“°:$ÉA„¶Ö¬>oGèæ'=ÏÊ¥|ÀðD¦ïn=§üÃ,-nÿ¬!ìøÈ?5dã '˃HV¢¤mƒtHã\ÓÙýl´ýaø{Q³ £òäSË™™ß;BÄö€F>kPR¼Ðã"Ï |¡9ÞHRþø³4­$æ[ÅËfO¦ê˜gõWÈ£Ýæ¦°ü×*yW¢â þ¥Ž -ÿ§+½™rê²@ö–¼ÝÑ©´÷œE‡VÞΊ;d,}<Œr~­Ì qËMG¥±û= êϲz¤ã½|wcìÝ eÎN÷Ï Ì˯7ä SWÍLO¸s¼2‡ÈÑh!ä2L:½ð\Äb/òY£2~ö߯C›o@E=±tËàŠòì„©+§$0kû÷ÜËš¼ fèÂly+(ƒõ‰'Ï–ÂìT6Mh]<x'àÃpzX·”yÍ5rV6AóH7z`*- 3Û8'yÞà‰ÈŠ6…£ãàÚ §¦üÞOñœ.OðН/ôŸhÜ\ÀDë'ÑkÆ“PÅÿÉp£ÜéZŽh^@5áTfèÅOMϤmØØœiÄšÐï×Û›· £†Ôðß—>ˆƒ‡ºÂM~ÕØ5­[÷¼ìÔô©'|é4wߎ2IX¹~\ôA`bзV¸Í.šê²Cí7fÉAÂ,™Í5)^W;ÚS;W‰ªoj7:t¯NùÈÅÌAì3|Óú\i¢uŸ^}’‘v°ûàþìD;Hì35šhz¹âM÷á0`áó“Ȳ¨ÜWÏΫ˜B»qùù’&0’߸5ð6¾µŸ¦¼6ÊvFÑÏ«‡"¾gѵrº¼âf2"œãg¯K 6µÅïÿ¹QéÊH¢Á Lñ.š·T¢ý£˜ˆ*$JD¨¿RÚUzëJ푦†ýstê¿ïöÛ_›'"Ôaï.ä<µ0çFkÎ/«ðû=`ïtY›ØˆðT$T’tÚ3ÙlƒYó–¿4~aì± À¾3Ò'%‚zÉœŒÎnj+ñ£*O+¦²rÏŸ—e±z›I† ûºØL|®ÌÀ¬;ÙÙ`yLùa:_¡MÇ/R lÛ3úá“cåw †FÂ"òl{¹Õ‡†—¿%žÔôÆôê-̤o RªÂÓâ­xÁÕÑ¥’&Œâ¤ËÈäBs„† v…tç¡CáÃ8†  .Ûó~y) ‰2´)2÷–ã§UHÏÁøÌ^‡Ñže³¹‹Ý:|ÈO9t$üÆ:^ây‚/²§`쉪GÂY¹y)~MV>x¸!¥4¦[{æÄ,‚Íf(t= ¤ÿ`>Úsn%ƒøSjjZIÞ^$ܨ·üòØâ²uB$¾eËz2-Îàª+Zq‡ J¯D‘Ÿ“ÔÝP/<ØB4t'£ÌF,êÓC\bŒ¹þXiF¡ÆÎDFÙ ø7«a¨V– Ón†écò¦«è!ƒ`±¡#~˜ŸÏÝ×KØq{ôT\}¤³çÕ)¾=â 0T]’É‚U¸æFlÉ y÷Žf) –Ÿ™QIв¯åøŸ© °\WhSþÐc}ïk5hƳÎT¬??vt0Äœ•gfǽ;ül£ˆPã/OŽe=ã£%¥S;0ÅŠ`Ç™‰ØÛ3:%èÁI¦0z£±„w™Ë7ƒñÞ9ÉÀ°½ŽÖÓ÷÷<‡ÁÛúÁ¡Çv•‰¸[l!Rå €äjã®cP›“ Á[ÒƒQaxôγÄ]MP»p®{Y ÒíóáÂÀz"©0Glw|X¤N䤒€!:êÏÈúá@ÜÇñCp&“^—‚”¡_‹1S¯÷/†ü×H9?,ú$úðøA•Gß/_Õ}E!š÷·íh¨ÔTåΙ<0àÿÔt’k¥Ä´ïáÖ˽ÒLUß--:ÛLÖ%¥dqŸDb°–8iô ñËWŽ_î 9 Þ¹£ø~,c¬Â §0mÑ7o ´ZÈÀIéÙ¿`:†.:q¸';Y"ì 4Î¥ø|Òòi'l16;\ÆD¡ »|¼:ëÒòdÅKK;h™³qû€eT§µƒ?>]õEtWá_DñK™@=Tºtæ?îí[ÿ¿]/ô€áœaŸa«’G8Ÿí,úc…öT#‹4™øãqçHr ž“UÕ™q›Æ=DZ†õJÈ5¿¤VNéѧ`Y¾àŒøîÅÿé†x‹Ãfß÷“ÅHæÈ 4íØLÁfßW•ó{æš.eëºnL8à­ÏÔg㣗ÂÚQÅ5Íaq®Ž]`¯ÑÚÁÙíëùý,@¤é¾þ eËÜŽ°-b™a´¡¬vöOƒ.ÖÿÜ¥¼}W{¸ ®ÅØ‘Y€ßðpÝ™´ûGŽ´è³©¹äì3[®|ÞÑ\h$?~5ÂëCŽòáѳ²ÈðŠèí.[kÚrØr?~WH€•Ou¨áoaCïîk‡ŸñMV%Ù~ØæÙ¶@‚ ‘×esÈå) Ú1&çk6ÌÖqÛÜÉ_¥êgvöçB‚<¥´zÌ0¶›Ì¸(»¨áx§$^hh¥S0X ý=QãÔ¿rï”F‘äŽNVC³¡_ËŸ‘x؈g4ì™"fÖb7šÄZàIøêþ¼*Û¶Jºôb±¶—ÉÞ zºäQ¡%NÖÏÈU³ Íöpçþ%þ±”EEŠþ|«Ÿ†b[:Ÿ`Â*ÁG’’OÐÔQÍÁAû‘‘J¦IjFý¯ÝŠÚTè½kÕF¿)A çwnÒ=p¢*¦9›XžîÉá£ÏŠ0ÿÕWf7¨$g3¹è6¢œ‰;LÊqÅáõ áì!Ü |2ErYŸŠ„$,š¶²ikë?/ çOcáI½cÓuýo¶Çà^ÉZô,¢èz–65í䆵<‚ô^ ÅÂ…kñ×ÍÆNz„ïHbMÎV 7Žª}“°Ck9`®¯‡NÀ;Ž.2ƒAšp;þIžcMwãÇÛTè–j,Y¯rÒmf6I"; ªåêÊ` JeiþZA"~ƒåê'Þ†îòü`ÝÈ\âYÅxQPÕºq¨&WnlŸDb5CenºÂ,oô/œéèéÖ-­ PØÛ®=­¸]!‹èè…k!ÐQ\ŒÕµ ‡?ÅG%âà1Ù­ Üè›â”ô °ü¨'îÔW sf®´Ÿô—r’ s1sk›“~(Oxeó4HÍ¿~˜†ì«:`oŸ`ÝËqæo†‡gE’*9Ð%ªÅå„?™¼wd¸Þ¥òûÃÿ4‡ŒbP†n1Ó÷—.…ªd£¤ÉhÃßÃ㦨?*Ë•—;nïç’ æ‚mm;P¤·vµŸú}G5 ª)ë“gDõåv2TOŤ6cî}±¡–Š(Âd­#í0u_i˜ñÔ¥ü>îÊF‚‚M^§ƒH”9³É±’7±â:Àÿ-Œ7—qk¶a´Þ}J€ð’¤¸mݪe5ä–éPÄÝãŒ#+>ÖhR:‚"èD]‚Ywùä±¢ë:¹3ÓˆÖ—`'ö”~Ã7þÇÂf}•üæU÷‘–Æõ›Žt­ƒž ûÛ^P]aÚv¢¾2 ½v牄fO! ?N†7]PÛØþéÎSñDšÍ´…»E¡#Ù5åtåÄ’6ÌùȲîçvÀÛEg0·UÜRöŒ¹Æ>šðÜ6)Ù´Ë»ÿÞ¤‚ €ƒäã‘Å·’…Rµÿ†‚W§n|f2ªp›Xf?p\Š7iâ)`ÚÛ£pOå6ð†×ŸbJS »0<Š>£^gã—FéfiwH’BY]IL>Ìaù;K”J#ÃbéQÒÞ†9@Ñ–¸W›ª#÷bêGâH3䯡¶Ò.z»ŒÑ¤ªƒ[šöߦÁo™Ùÿ =¸”áÐX*ìŒC>å¯ öâ/ôÊ+zEáJ‘ÿŽfÆÃ ÷£‚ Ú*!{ƒ{ñ¬é†„&t1åˆ;&6: Šóa¹–f¿)·áö¿Oòg«óêô³A]P”ºÓ»ë5µàú-ñ`ÄMQìtƒzL±DæßôÖkF~œea3zD¬¬Ë™ˆWŸ•›øÊC‡ëÒ¶féÚ–BÃp—ÿöÐpî š <´«'n·¦Ùpy=²Qã}Éí‚/ãå‚ÜSG.é—‘ï–tH\骒R,·Ô£hc—‘ûßM§Îž¤Õä|JQ²Bþ”ºI7¯~ºü;#'é9íñøÃœéÆ"a¼[ü¯Fa6F нtÝÓE:ÛhlaäÙ!™£ ”—Aªý ¨’ ®,—/<7DRŠUÙ·H{¼®±ÅuvŽÚçdÕæ†,GýÌ ¾° ì¼ÿ[4ªÈû8«5º$ƒñBö«sý4U¸æÜͨåy`ßÔœÊÔ‘Ži±×W:ÿ€n<}*1Ƹ=4U‡ðô¢:,,nÍž£„ÈG'¡¡<`j aÝ¿ôP;ùR­ÒÆ ñùàxðS‡·ÉÉûN!™õö<®Ãã¨×0Ê3º:‰e8ÀLÕítœ‡Ÿ3ÞXoiØÆæë“¬€´±±LpŸZ„VWÒ€py8ýú¿3ûÌ…þ¹™s 7D®!³!*>¾‡Áÿÿ{¤½tŽ”°ì;›hV²ÙȲÓ"\õª.t _¡˜‡Ò÷ TKä÷N…6Õ´ÞsÎK3#zô&˜Ô;}¥(¶¡õ¹šú­øµ…„÷( Çq"9,´g£¥1d²RP¬B÷zµƒ­q²òTݶÄ3¸]ˆ°Ç—á›tÒ5\¦ áËŠ¶Ú"3g"õ‡8Ön»¦zJXû©/º–ì”8øï`Æl.‹Q|Åþ ýïr«+ࢾbv:lyÜ^8¡©Žü1 @A# W#XïmÚÅy× 4ÈK:“„ž8g\c޹xZZNonbõ™¼#Sâl±GÎZ:t©oB›.”lø¡&É•ŠÛZ!&ö‹3\ÓJgn(®ª©ä«WŒ`E¤vë1'3³}ä :d£›å03ƒ¨ö³%ÊÙC½DÛögL\¾q úïÊvð}¼Ì¹ûÖ¹ÕâUŠåJý‚l¦»ÆL­¬Ê¾=ZÂøäD»Èæee136/«ß‘x]/ç]5NSü.±ïv¬¯m¡{›ËßÛ.»Þ# k%m,kÌ?AZ‡+(ß±xTÓRGKIcØå>Õn×®Û”_Qø—¥é;Òt1½aD*ˆºìS>H¼ ŒùŽj²± 8&}½IáºÞýHâX$6[«ÍH½¤d܈#€5ymD˜vA&c¢šâ×Ád |™|ýë¬1âm;¼TSç¥ì©(Ó›/¾*Á¤ü€g„ìùí·»a£ìä‚BÆÄ x”0|T+£FôÛÂî»ªŽ«þ#NFH¬R6£x°Q~²}€Û2zzC±t žEz,ÄNßkÅ=w«c8y¸×Ã_Ò”éÔY#ˆ­ E•€à¤2rw2š ñ•ÅÓ÷®9ô×Ó \1&þÄäÖ…áÐåŽÕô綪?è¹/¤dE Ë 0wpÏIÍ"u5aK¬yŸ×G8~²"Û(´;HWŒKÖϥꌑ1!4c“-òè Ä-ôVƒôGtôió­gå6EéB6ªÓI¢CÙϹ Gׯ¢ rMwíM,©òz(‚t|RGü”ž¾Ý³wNé_·ñ)]É=ziÍû½8]¾Ä ÐØ‚ÿ=ÒçG²î®il¡^4UìÑô4 ,=£ÚØm.{žO RšwŠó7<Ÿ,¹ÁY¢5°Ü›¨& ³²E2¼'\€µÖŒ %ÙCÅXÀè¾›t cXåÚX/áø¢ç/%›`|a¾3'‹L`3ØÝ|9ÄÔõ\Pò^Jk¦{´}ç‹ûË o¯óœ)þu ت\êÈ€Å`cÉ‘dЊ‚e³¥Pö@ÿ(ŒãTHÃ÷âñËz'’wÍm°‘C§BOŸˆÊù¾šm}+G ñ|L™yʨߕöbD¢z N LÀ艘i²¦5[3!{ß"^}:$é€.(å*ú¼¶Ð›Ù‚·Z¼—rë[ Ì’¦‘þ¯SL¥(å(Ã"ÕÝH5:™îý³ÌÄ£„R÷‹Úò¾Oö¨ÍãƒÖ ÒJ:\ùoÐ}å¬ìúéóÍŠ+8k­³Oü+¹m¶öÖT‘}3cØU Iïd¡‹‰ÅÆŸö˜É×ýQùFÍÑK絞&¡}QM±çÞeæMæŸ=àÀüþ}–{dœY¾É¬ ÏÁ´JÝécd¶E‡±ðv%e'R”˜—>¾›ŒÇGÎu-*£&6&Ìj6ÃõàÇX®·ÃûTÖëѽUõ!nuÿ›ÍÚÕõÎNP+…d¿-‹…Ë4GM,ý|Û†)¥>£Û:±ÔŽd«ç5î¦øñbxÿNÿdåhÔ+_Ê$ͼݪÄ^I´ ½³$u´ÅnK 3Y0úú³*˜jhÓŸ¥=BÎYÛú ‚¶Œ”©qê„°c4`‚LK rÆY‰É¯À…D3GýOo\ñ?õ²‘µXp}1¸¬ÌŽ8€I¹¿m`´ÊÓ¯Ù™W¡Ø “KCÐøÎTN£eS?nØÃZ¥Ážñþ¢“ÚúÀçÔ‚~{§ðggÛR1CsÞ iÎ3}ÃFuKoêÌé±Û1ÙqOñ”u½•3ó°²p€8æ'1f’íª˜TzË©™Ó¾^…²šÓȘ1ª¶Þ01Jb'îÈNÿ2åîØp¿–¿LCëæxÐg&Tâj:üÆ 21í;æ4W˜oV­2{âeÔq–g`Ö"ràFfs QˆÌ º~¶FyÁaâs^Eä  ”ž]÷o öZÈÐ>ã5:ÏóòSè IÌ£ÇQ"8ÖReù"ä8ùdDgë§Ò¬š£R“ª Oªå|2ñ^ñq]·}4·“.†–/(Œ-Øä¯ôûÜ5Ž’8”¶\0G“¸.½âÚË ý/ Õ7ZÏ»¹‡d½–¸7à†ß ÿl4îÚeÕ~ñüçÎ*͈÷(ÎøkÑeÈÙá)st×H¹Í{ÈŽ1Múน‚È@BnÍëoß½Ù?bá´ã{Hæj¥Æ|ÞB†Tw<«Þ¾ÏW=Xiz–:k7NÕvÆýV|,M®½Ö Ɉö‰Ã8±,áÊéÊF¨J7Pü1“ç-“¯ÑÈâcâØ¯9‚Z"‹Š»”-ñ ì¬tgynR¼ÆÂ1켢ܶ[S^û»íø°È^í–®š~%SoPf6j/Õ÷¡¢-nJ»Ø9îçl¸ýt²²Ö4<ô:µj“œêïêÒÝî.GZ´þRÇ€¦.ˆ¯CLøpyg'°³¹f‡$çm“œþçI¶‘tºR~äV_Þ!}È:¸«c9-C1¹\l}j´¢Ì3ÔiJ çÞôŸLÂuy¿õ¥½<1  ]ö B=!ìeˆ¤ëà[£}L]OÀãçÁPæ½üBgrÇ&›v9—%ׂÔ7v†õ´µÌ6*ÎèIHð”–såV‹N~Â71ÝÛú ýíx"+¯gMÀ²NÁe妪ºž+Z=3ž¹(FkàœÍÁx'‹Ñ*™nxhÃ\3‹Ò6˜Åc7š%ºŒ9ºkÝ‹lK‡± ×0.ëTµŠª:²Ê]–þW–}ÒmE¾ç{@ÎS(ÍQ@wÜ£ý8–Ú¸r'»1>ßÅUô -ý‡[°ÊY¥“`Žf¦EæTWÚ7/C0dMÈ'álÛªi3ækTCµêRÁ_ZïÍï5I÷ ˜7¹ð<˜ƒêã)WYNb‡è‡"èx£`¡Ä‚,öŠ[°Oz¯e+ß) Ü7ÆŠ »Ê½Ï; u»™EÕw|õúU]`Aï{ÔŒnd[—Wç[s\™ÛnOA„•š5®ëlþe¤YY‡äTŒ“.¾ÁOÍwlâšúWŽ ‚¸käÖoLe›ä$œÄ7lùAyš­:jïr'õì“nàmæ ÕDRÕ\¸É6ð›2¦ ƪïÞD·W0âóƒìÜ o«l’œ;‰DG©ÍO^ ÁdI¢Åbô’ yÄ ,óãÆ$XyòœŒÖ¡·;+þª`•0»|,P—6^.6ò¬yd XkÇnP¸9=â!@º'/!3¹Ùäh¼;lN;·ŸznMÏåÀpTJÎbqˆ9Š«i|Ãë¾y¥ÍÉðÖšƒ¾\T3r·UEËíVR¯yƒú2’'½Á8hA² •»½ Ü¿žú«Z¯ܦדþ˺<TûR‰R™3í ŽUãïW[Qá.ùJU mŒ‘?€U<òª;»™²‚Ùónþ%ïõèK0íø…{$amÜ+œ÷lpqkurØÓàVûë„^6 ÎYRA¼¹ 5ôà2´ ÔjíÄ%r¥³RøM^>kZ‘.¸¯1ÝѾ÷\­ô¾èä¹ïâk–|Ì ­Ô>Uƒj!K{B>ÕÂPEÁöOŠÙø+3•Ýâ†m Q¾W¿Ömµ×„#SÄQ3ÏÇ£×~Eœj\‡¬þT¥ËiC6s%4ó;°[B–Úa`6èm™èn@=媅Åënøð B<[€Ë:r«@¿k㮃ø¨'‚­«Á+/³bŠ®o–Ž^G’ßå9ƒ¹úÕÈÚ÷m97!¡Š{缇YŸ!šÅî“k^ðµªÔ'U«‰×ñº=žÊ¸Q–òÓL‚»| Üú¡Zâ„òûGº„Œ¥ÄÌôßH¶ey,j­ ].Éu¿9‚N§s¦÷Nø”#ñLqÐæ«&ƒ ¹0­2IO¤ÕdKÀž‹Ê#úŽ£B羇ìƒï$wWeÅ6‰a['ï…aÞ^e•no æ.eZrž'J‡ʼïTž¶€5íwÄÆ>cb¨Ø¯,ŒÕ'*Æ6<1H†;4½Á1v,žŸÎ–«JìÐìŒÊ»hö-#\ö ÝÍúJFB_c§c9)¨óbxWöà¦6¾¶ùǸƊ¾xæâk=½mº"•U¾»&¥Edúô…c²óJ&™-Šž·hSß9ë0'[t0s{ ç£ö»ÙXbòˆOÿ¡ÝRŠcÏJ­ˆ‰p’s¬Žòóèi¢½ª´Ä ˆ¼C(=‰ÙßD ùË–o}º·=®‰±MmÞŠ)ô*½2G?SvìÔ‚L:/Ðø_Éf9ýU²Lm:ìÇ›ØB»m'RH†ï‘Ãhùl°¾sebÿŠ8. ú•Ù œDX4¡Þ]çR"ŽÏ2!a+Ñ…Ã~Ó\.E´Y°»»³î IÛÓ;¨œmàÐe]ŒéøM^¥.!;HÔ*õô:ȯ-Ï £:kö —wÖª‹åòS²ÿœ´;A©ž^ z‰r”ÆÌpD´õµª³­CÇV<‹ËG…±*Ž[–kœv"†'>M3ƒÆ¾ÔŒí­' [0R9û{x8cvâm˜…ót9î¤#YåÈöqâ`*† —žâ´ò/µ1͸žã–Eß S–„ÀëRh•h`'ÙÌ §Ýl„©•IýHÂ}oõñ}(c‡yuÇjIa%Ë<YÓÉ8Ê4áñrQR™¶ZM<;ÄçG3®øT,˜Ûi±»˜±«U;Åຯºh´÷G† zÒQï¢Ò4ÄëÎËL{hÇÈ㊥´}7Zåë‘Çÿ3ô¤³¡å½º þuyAf¤°“|ª;þåek xÃîÞõõöвî>söôV°Œþa2§çÏ7zeDæÔi±Úâ^íFŠÊ;Ž©“|6f…<Ðߌ~œ˜Õß5¿»O“>e옌RÞc kvÕOks6ÖÌ]Wz]@ª˜΂|ÒÓ½Ÿ)UÛÔQRô¶]B¢Q2Š½ë’¡n¶]R_¹~°óΫ.ÍÖN´\ùƒM•„âzî¥?Ø>"f|C-ÉÊ^æ:s ¾É$mÞUÜ kTu@&OœÐí„Ô `Vóû1J’-)*äTÙÆ]G™ÛîqlW6j~ÂVui¬’ÑR™&@v²B}¹M!I­‘´Ïƒ8 c‡<Üÿa÷$õ¡£N#ï½ã@_¶h¾ °³¸Wvã  Œ ®¤dROzy‚”¿Ÿv„ÒØƒuܪ¿=LŒWš-ÅrÛŒaÝ33à»`kAV º>×öAO¾Cƒ7“¦F&†Ûý¢)©„aûý•5Q¶ÌQzƒ '¶ØÑ^¿üVs‡= BÂ,yOc )yw¤z–XNè—b÷ÎýæZ?ña^ ÅÐzêÄÿ!&ã‹:{ìŒÊUCßý¤…>H›·d9¼³†Cóv–jDvl:¸¯‡í¼f9Yw÷$Õ` µä‰±ÓžV€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n019023l.afm0000644000076500001440000007656207056046552016431 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusSanL-ReguItal FullName Nimbus Sans L Regular Italic FamilyName Nimbus Sans L Weight Regular ItalicAngle -12.0 IsFixedPitch false UnderlinePosition -151 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -178 -284 1108 953 CapHeight 729 XHeight 524 Descender -213 Ascender 729 StartCharMetrics 316 C 32 ; WX 278 ; N space ; B 213 0 213 0 ; C 33 ; WX 278 ; N exclam ; B 124 0 363 729 ; C 34 ; WX 355 ; N quotedbl ; B 177 464 455 709 ; C 35 ; WX 556 ; N numbersign ; B 54 -20 649 697 ; C 36 ; WX 556 ; N dollar ; B 69 -126 613 770 ; C 37 ; WX 889 ; N percent ; B 134 -20 895 709 ; C 38 ; WX 667 ; N ampersand ; B 83 -23 644 709 ; C 39 ; WX 222 ; N quoteright ; B 166 477 309 708 ; C 40 ; WX 333 ; N parenleft ; B 113 -213 446 729 ; C 41 ; WX 333 ; N parenright ; B -7 -213 325 729 ; C 42 ; WX 389 ; N asterisk ; B 169 438 471 729 ; C 43 ; WX 584 ; N plus ; B 92 -11 591 473 ; C 44 ; WX 278 ; N comma ; B 55 -150 214 103 ; C 45 ; WX 333 ; N hyphen ; B 97 240 351 312 ; C 46 ; WX 278 ; N period ; B 87 0 213 103 ; C 47 ; WX 278 ; N slash ; B -12 -20 434 729 ; C 48 ; WX 556 ; N zero ; B 98 -23 598 709 ; C 49 ; WX 556 ; N one ; B 208 0 498 709 ; C 50 ; WX 556 ; N two ; B 34 0 620 709 ; C 51 ; WX 556 ; N three ; B 71 -23 599 709 ; C 52 ; WX 556 ; N four ; B 63 0 573 709 ; C 53 ; WX 556 ; N five ; B 70 -23 629 709 ; C 54 ; WX 556 ; N six ; B 93 -23 611 709 ; C 55 ; WX 556 ; N seven ; B 137 0 671 709 ; C 56 ; WX 556 ; N eight ; B 74 -23 604 709 ; C 57 ; WX 556 ; N nine ; B 83 -23 599 709 ; C 58 ; WX 278 ; N colon ; B 110 0 326 524 ; C 59 ; WX 278 ; N semicolon ; B 78 -150 325 524 ; C 60 ; WX 584 ; N less ; B 87 -9 635 474 ; C 61 ; WX 584 ; N equal ; B 74 111 609 355 ; C 62 ; WX 584 ; N greater ; B 48 -9 596 474 ; C 63 ; WX 556 ; N question ; B 184 0 630 741 ; C 64 ; WX 1015 ; N at ; B 80 -142 1036 741 ; C 65 ; WX 667 ; N A ; B 17 0 653 729 ; C 66 ; WX 667 ; N B ; B 79 0 711 729 ; C 67 ; WX 722 ; N C ; B 112 -23 770 741 ; C 68 ; WX 722 ; N D ; B 89 0 759 729 ; C 69 ; WX 667 ; N E ; B 90 0 751 729 ; C 70 ; WX 611 ; N F ; B 90 0 734 729 ; C 71 ; WX 778 ; N G ; B 109 -23 809 741 ; C 72 ; WX 722 ; N H ; B 83 0 799 729 ; C 73 ; WX 278 ; N I ; B 100 0 349 729 ; C 74 ; WX 500 ; N J ; B 47 -23 581 729 ; C 75 ; WX 667 ; N K ; B 79 0 813 729 ; C 76 ; WX 556 ; N L ; B 80 0 551 729 ; C 77 ; WX 833 ; N M ; B 75 0 916 729 ; C 78 ; WX 722 ; N N ; B 76 0 801 729 ; C 79 ; WX 778 ; N O ; B 104 -23 828 741 ; C 80 ; WX 667 ; N P ; B 91 0 733 729 ; C 81 ; WX 778 ; N Q ; B 104 -59 828 741 ; C 82 ; WX 722 ; N R ; B 93 0 770 729 ; C 83 ; WX 667 ; N S ; B 89 -23 714 741 ; C 84 ; WX 611 ; N T ; B 158 0 748 729 ; C 85 ; WX 722 ; N U ; B 124 -23 800 729 ; C 86 ; WX 667 ; N V ; B 185 0 800 729 ; C 87 ; WX 944 ; N W ; B 177 0 1084 729 ; C 88 ; WX 667 ; N X ; B 22 0 794 729 ; C 89 ; WX 667 ; N Y ; B 168 0 816 729 ; C 90 ; WX 611 ; N Z ; B 28 0 737 729 ; C 91 ; WX 278 ; N bracketleft ; B 19 -213 405 729 ; C 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ; C 93 ; WX 278 ; N bracketright ; B -23 -213 364 729 ; C 94 ; WX 469 ; N asciicircum ; B 115 329 496 709 ; C 95 ; WX 556 ; N underscore ; B -59 -176 551 -126 ; C 96 ; WX 222 ; N quoteleft ; B 163 477 308 709 ; C 97 ; WX 556 ; N a ; B 65 -23 568 539 ; C 98 ; WX 556 ; N b ; B 54 -23 588 729 ; C 99 ; WX 500 ; N c ; B 76 -23 554 539 ; C 100 ; WX 556 ; N d ; B 73 -23 650 729 ; C 101 ; WX 556 ; N e ; B 84 -23 580 539 ; C 102 ; WX 278 ; N f ; B 89 0 413 732 ; C 103 ; WX 556 ; N g ; B 32 -218 601 539 ; C 104 ; WX 556 ; N h ; B 70 0 574 729 ; C 105 ; WX 222 ; N i ; B 66 0 305 729 ; C 106 ; WX 222 ; N j ; B -65 -218 308 729 ; C 107 ; WX 500 ; N k ; B 58 0 584 729 ; C 108 ; WX 222 ; N l ; B 68 0 307 729 ; C 109 ; WX 833 ; N m ; B 71 0 852 539 ; C 110 ; WX 556 ; N n ; B 70 0 574 539 ; C 111 ; WX 556 ; N o ; B 80 -23 576 539 ; C 112 ; WX 556 ; N p ; B 7 -213 586 539 ; C 113 ; WX 556 ; N q ; B 71 -213 607 539 ; C 114 ; WX 333 ; N r ; B 69 0 436 539 ; C 115 ; WX 500 ; N s ; B 61 -23 520 539 ; C 116 ; WX 278 ; N t ; B 97 -23 366 668 ; C 117 ; WX 556 ; N u ; B 88 -23 594 524 ; C 118 ; WX 500 ; N v ; B 122 0 598 524 ; C 119 ; WX 722 ; N w ; B 118 0 820 524 ; C 120 ; WX 500 ; N x ; B 17 0 583 524 ; C 121 ; WX 500 ; N y ; B 8 -218 590 524 ; C 122 ; WX 500 ; N z ; B 31 0 557 524 ; C 123 ; WX 334 ; N braceleft ; B 91 -213 431 729 ; C 124 ; WX 260 ; N bar ; B 54 -212 315 729 ; C 125 ; WX 334 ; N braceright ; B -16 -213 324 729 ; C 126 ; WX 584 ; N asciitilde ; B 137 268 594 438 ; C 161 ; WX 333 ; N exclamdown ; B 76 -205 317 524 ; C 162 ; WX 556 ; N cent ; B 96 -120 585 628 ; C 163 ; WX 556 ; N sterling ; B 44 -23 628 729 ; C 164 ; WX 167 ; N fraction ; B -178 -20 486 709 ; C 165 ; WX 556 ; N yen ; B 100 0 696 709 ; C 166 ; WX 556 ; N florin ; B -32 -212 696 738 ; C 167 ; WX 556 ; N section ; B 63 -213 589 729 ; C 168 ; WX 556 ; N currency ; B 110 133 593 556 ; C 169 ; WX 191 ; N quotesingle ; B 173 464 292 709 ; C 170 ; WX 333 ; N quotedblleft ; B 146 477 449 709 ; C 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ; C 172 ; WX 333 ; N guilsinglleft ; B 140 106 336 438 ; C 173 ; WX 333 ; N guilsinglright ; B 109 106 307 438 ; C 174 ; WX 500 ; N fi ; B 83 0 591 732 ; C 175 ; WX 500 ; N fl ; B 88 0 585 732 ; C 177 ; WX 556 ; N endash ; B 46 240 628 312 ; C 178 ; WX 556 ; N dagger ; B 127 -177 620 709 ; C 179 ; WX 556 ; N daggerdbl ; B 51 -177 620 709 ; C 180 ; WX 278 ; N periodcentered ; B 166 192 293 295 ; C 182 ; WX 537 ; N paragraph ; B 145 -178 677 729 ; C 183 ; WX 350 ; N bullet ; B 120 220 376 470 ; C 184 ; WX 222 ; N quotesinglbase ; B 37 -128 180 103 ; C 185 ; WX 333 ; N quotedblbase ; B 20 -128 322 103 ; C 186 ; WX 333 ; N quotedblright ; B 150 477 452 708 ; C 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 907 103 ; C 189 ; WX 1000 ; N perthousand ; B 93 -20 1024 738 ; C 191 ; WX 611 ; N questiondown ; B 86 -217 531 524 ; C 193 ; WX 333 ; N grave ; B 179 592 357 740 ; C 194 ; WX 333 ; N acute ; B 218 592 458 740 ; C 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ; C 196 ; WX 333 ; N tilde ; B 130 611 471 719 ; C 197 ; WX 333 ; N macron ; B 160 627 450 696 ; C 198 ; WX 333 ; N breve ; B 165 594 471 729 ; C 199 ; WX 333 ; N dotaccent ; B 244 612 370 715 ; C 200 ; WX 333 ; N dieresis ; B 159 612 446 715 ; C 202 ; WX 333 ; N ring ; B 216 579 396 754 ; C 203 ; WX 333 ; N cedilla ; B 1 -214 264 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 91 590 505 740 ; C 206 ; WX 333 ; N ogonek ; B 35 -205 246 0 ; C 207 ; WX 333 ; N caron ; B 176 592 463 740 ; C 208 ; WX 1000 ; N emdash ; B 42 240 1068 312 ; C 225 ; WX 1000 ; N AE ; B 11 0 1087 729 ; C 227 ; WX 370 ; N ordfeminine ; B 107 303 441 742 ; C 232 ; WX 556 ; N Lslash ; B 75 0 570 729 ; C 233 ; WX 778 ; N Oslash ; B 32 -24 867 741 ; C 234 ; WX 1000 ; N OE ; B 101 -23 1108 741 ; C 235 ; WX 365 ; N ordmasculine ; B 114 303 452 742 ; C 241 ; WX 889 ; N ae ; B 59 -23 915 539 ; C 245 ; WX 278 ; N dotlessi ; B 94 0 290 527 ; C 248 ; WX 222 ; N lslash ; B 62 0 312 729 ; C 249 ; WX 611 ; N oslash ; B 19 -30 639 541 ; C 250 ; WX 944 ; N oe ; B 85 -23 966 539 ; C 251 ; WX 611 ; N germandbls ; B 126 -23 655 729 ; C -1 ; WX 722 ; N Udieresis ; B 124 -23 800 914 ; C -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ; C -1 ; WX 667 ; N Scedilla ; B 89 -214 714 741 ; C -1 ; WX 611 ; N Tcaron ; B 158 0 748 939 ; C -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ; C -1 ; WX 722 ; N Rcaron ; B 93 0 770 939 ; C -1 ; WX 722 ; N Racute ; B 93 0 770 939 ; C -1 ; WX 667 ; N Sacute ; B 89 -23 714 939 ; C -1 ; WX 778 ; N Otilde ; B 104 -23 828 918 ; C -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 104 -23 841 939 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 124 -23 806 939 ; C -1 ; WX 667 ; N Yacute ; B 168 0 816 939 ; C -1 ; WX 722 ; N Eth ; B 89 0 759 729 ; C -1 ; WX 722 ; N Dcroat ; B 89 0 759 729 ; C -1 ; WX 611 ; N Zacute ; B 28 0 737 939 ; C -1 ; WX 722 ; N Uring ; B 124 -23 800 953 ; C -1 ; WX 556 ; N gbreve ; B 32 -218 601 729 ; C -1 ; WX 556 ; N eogonek ; B 84 -205 580 539 ; C -1 ; WX 556 ; N edotaccent ; B 84 -23 580 715 ; C -1 ; WX 556 ; N ecaron ; B 84 -23 580 740 ; C -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ; C -1 ; WX 667 ; N Thorn ; B 91 0 708 729 ; C -1 ; WX 556 ; N eacute ; B 84 -23 580 740 ; C -1 ; WX 556 ; N edieresis ; B 84 -23 580 715 ; C -1 ; WX 650 ; N dcaron ; B 73 -23 810 729 ; C -1 ; WX 500 ; N ccedilla ; B 76 -214 554 539 ; C -1 ; WX 500 ; N ccaron ; B 76 -23 563 740 ; C -1 ; WX 500 ; N cacute ; B 76 -23 575 740 ; C -1 ; WX 556 ; N aogonek ; B 65 -205 571 539 ; C -1 ; WX 556 ; N aring ; B 65 -23 568 754 ; C -1 ; WX 556 ; N atilde ; B 65 -23 583 719 ; C -1 ; WX 556 ; N abreve ; B 65 -23 582 729 ; C -1 ; WX 556 ; N egrave ; B 84 -23 580 740 ; C -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ; C -1 ; WX 556 ; N aacute ; B 65 -23 570 740 ; C -1 ; WX 556 ; N adieresis ; B 65 -23 568 715 ; C -1 ; WX 722 ; N Uogonek ; B 124 -205 800 729 ; C -1 ; WX 556 ; N ugrave ; B 88 -23 594 740 ; C -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ; C -1 ; WX 556 ; N udieresis ; B 88 -23 594 715 ; C -1 ; WX 319 ; N tcaron ; B 97 -23 492 801 ; C -1 ; WX 500 ; N scommaaccent ; B 61 -284 520 539 ; C -1 ; WX 611 ; N Zcaron ; B 28 0 737 939 ; C -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ; C -1 ; WX 722 ; N Ucircumflex ; B 124 -23 800 940 ; C -1 ; WX 556 ; N acircumflex ; B 65 -23 568 741 ; C -1 ; WX 611 ; N Zdotaccent ; B 28 0 737 914 ; C -1 ; WX 500 ; N scaron ; B 61 -23 547 740 ; C -1 ; WX 667 ; N Amacron ; B 17 0 663 895 ; C -1 ; WX 500 ; N sacute ; B 61 -23 545 740 ; C -1 ; WX 611 ; N Tcommaaccent ; B 158 -284 748 729 ; C -1 ; WX 667 ; N Ydieresis ; B 168 0 816 914 ; C -1 ; WX 556 ; N thorn ; B 7 -213 586 729 ; C -1 ; WX 667 ; N Emacron ; B 90 0 751 895 ; C -1 ; WX 778 ; N Ograve ; B 104 -23 828 939 ; C -1 ; WX 778 ; N Oacute ; B 104 -23 828 939 ; C -1 ; WX 778 ; N Odieresis ; B 104 -23 828 914 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 801 918 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 801 939 ; C -1 ; WX 722 ; N Nacute ; B 76 0 801 939 ; C -1 ; WX 556 ; N Lcaron ; B 80 0 551 729 ; C -1 ; WX 556 ; N Lacute ; B 80 0 551 939 ; C -1 ; WX 278 ; N Idotaccent ; B 100 0 389 914 ; C -1 ; WX 333 ; N racute ; B 69 0 498 740 ; C -1 ; WX 278 ; N Icircumflex ; B 100 0 454 940 ; C -1 ; WX 556 ; N ohungarumlaut ; B 80 -23 683 740 ; C -1 ; WX 556 ; N otilde ; B 80 -23 583 719 ; C -1 ; WX 556 ; N Euro ; B 12 -22 636 709 ; C -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ; C -1 ; WX 390 ; N onesuperior ; B 205 284 393 709 ; C -1 ; WX 390 ; N twosuperior ; B 100 284 468 709 ; C -1 ; WX 390 ; N threesuperior ; B 123 270 455 709 ; C -1 ; WX 278 ; N Igrave ; B 100 0 378 939 ; C -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ; C -1 ; WX 278 ; N Imacron ; B 100 0 458 895 ; C -1 ; WX 278 ; N Iogonek ; B 28 -205 349 729 ; C -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ; C -1 ; WX 778 ; N Gbreve ; B 109 -23 809 928 ; C -1 ; WX 722 ; N Umacron ; B 124 -23 800 895 ; C -1 ; WX 667 ; N Kcommaaccent ; B 79 -284 813 729 ; C -1 ; WX 556 ; N ograve ; B 80 -23 576 740 ; C -1 ; WX 667 ; N Scommaaccent ; B 89 -284 714 741 ; C -1 ; WX 667 ; N Eogonek ; B 90 -205 751 729 ; C -1 ; WX 556 ; N oacute ; B 80 -23 576 740 ; C -1 ; WX 667 ; N Edotaccent ; B 90 0 751 914 ; C -1 ; WX 222 ; N iogonek ; B 0 -205 305 729 ; C -1 ; WX 527 ; N gcommaaccent ; B 3 -218 572 813 ; C -1 ; WX 556 ; N odieresis ; B 80 -23 576 715 ; C -1 ; WX 556 ; N ntilde ; B 70 0 589 719 ; C -1 ; WX 556 ; N ncaron ; B 70 0 578 740 ; C -1 ; WX 667 ; N Ecaron ; B 90 0 751 939 ; C -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ; C -1 ; WX 500 ; N scedilla ; B 61 -214 521 539 ; C -1 ; WX 333 ; N rcaron ; B 69 0 486 740 ; C -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ; C -1 ; WX 667 ; N Eacute ; B 90 0 751 939 ; C -1 ; WX 778 ; N Gcommaaccent ; B 109 -284 809 741 ; C -1 ; WX 722 ; N Rcommaaccent ; B 93 -284 770 729 ; C -1 ; WX 667 ; N Edieresis ; B 90 0 751 914 ; C -1 ; WX 556 ; N nacute ; B 70 0 580 740 ; C -1 ; WX 556 ; N uogonek ; B 88 -205 594 524 ; C -1 ; WX 556 ; N umacron ; B 88 -23 594 696 ; C -1 ; WX 722 ; N Dcaron ; B 89 0 759 939 ; C -1 ; WX 307 ; N lcaron ; B 68 0 467 729 ; C -1 ; WX 722 ; N Ccaron ; B 112 -23 770 939 ; C -1 ; WX 722 ; N Cacute ; B 112 -23 770 939 ; C -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ; C -1 ; WX 606 ; N degree ; B 291 383 594 686 ; C -1 ; WX 667 ; N Aogonek ; B 17 -205 663 729 ; C -1 ; WX 584 ; N minus ; B 81 197 601 269 ; C -1 ; WX 584 ; N multiply ; B 113 34 568 427 ; C -1 ; WX 584 ; N divide ; B 92 0 591 462 ; C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; C -1 ; WX 1000 ; N trademark ; B 208 292 1096 729 ; C -1 ; WX 333 ; N rcommaaccent ; B 5 -284 436 539 ; C -1 ; WX 222 ; N lacute ; B 68 0 463 939 ; C -1 ; WX 556 ; N omacron ; B 80 -23 576 696 ; C -1 ; WX 667 ; N Atilde ; B 17 0 680 918 ; C -1 ; WX 278 ; N icircumflex ; B 94 0 406 741 ; C -1 ; WX 278 ; N igrave ; B 94 0 330 740 ; C -1 ; WX 556 ; N ncommaaccent ; B 70 -284 574 539 ; C -1 ; WX 222 ; N lcommaaccent ; B -1 -284 307 729 ; C -1 ; WX 584 ; N plusminus ; B 50 0 625 633 ; C -1 ; WX 947 ; N onehalf ; B 202 -20 965 709 ; C -1 ; WX 947 ; N onequarter ; B 205 -20 938 709 ; C -1 ; WX 947 ; N threequarters ; B 123 -20 938 709 ; C -1 ; WX 278 ; N iacute ; B 94 0 431 740 ; C -1 ; WX 667 ; N Abreve ; B 17 0 683 928 ; C -1 ; WX 500 ; N kcommaaccent ; B 58 -284 584 729 ; C -1 ; WX 778 ; N Omacron ; B 104 -23 828 895 ; C -1 ; WX 222 ; N imacron ; B 66 0 373 696 ; C -1 ; WX 556 ; N emacron ; B 84 -23 580 696 ; C -1 ; WX 556 ; N amacron ; B 65 -23 568 696 ; C -1 ; WX 278 ; N tcommaaccent ; B 55 -284 366 668 ; C -1 ; WX 500 ; N ydieresis ; B 8 -218 590 715 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 557 715 ; C -1 ; WX 500 ; N zcaron ; B 31 0 557 740 ; C -1 ; WX 500 ; N zacute ; B 31 0 557 740 ; C -1 ; WX 500 ; N yacute ; B 8 -218 590 740 ; C -1 ; WX 556 ; N uhungarumlaut ; B 88 -23 683 740 ; C -1 ; WX 556 ; N eth ; B 80 -23 576 743 ; C -1 ; WX 556 ; N uring ; B 88 -23 594 754 ; C -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ; C -1 ; WX 333 ; N commaaccent ; B 57 -284 205 -60 ; C -1 ; WX 737 ; N copyright ; B 55 -22 836 742 ; C -1 ; WX 737 ; N registered ; B 55 -22 836 742 ; C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; C -1 ; WX 278 ; N idieresis ; B 94 0 419 708 ; C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; C -1 ; WX 712 ; N Delta ; B 10 0 701 729 ; C -1 ; WX 584 ; N notequal ; B 74 2 609 480 ; C -1 ; WX 542 ; N radical ; B 102 -36 705 913 ; C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; C -1 ; WX 667 ; N Aacute ; B 17 0 667 939 ; C -1 ; WX 584 ; N lessequal ; B 45 0 659 584 ; C -1 ; WX 584 ; N greaterequal ; B 56 0 626 584 ; C -1 ; WX 584 ; N logicalnot ; B 99 86 619 377 ; C -1 ; WX 711 ; N summation ; B -18 -97 760 762 ; C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -284 801 729 ; C -1 ; WX 556 ; N dcroat ; B 73 -23 695 729 ; C -1 ; WX 260 ; N brokenbar ; B 54 -212 315 729 ; C -1 ; WX 556 ; N Lcommaaccent ; B 80 -284 551 729 ; C -1 ; WX 667 ; N Adieresis ; B 17 0 662 914 ; C -1 ; WX 556 ; N mu ; B 18 -220 593 524 ; C -1 ; WX 278 ; N .notdef ; B 213 0 213 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -41 KPX A Ccedilla -41 KPX A G -41 KPX A O -37 KPX A Odieresis -37 KPX A Q -38 KPX A T -103 KPX A U -42 KPX A Uacute -42 KPX A Ucircumflex -42 KPX A Udieresis -42 KPX A Ugrave -42 KPX A V -81 KPX A W -57 KPX A Y -104 KPX A a -16 KPX A b -5 KPX A c -16 KPX A ccedilla -16 KPX A comma -4 KPX A d -14 KPX A e -22 KPX A g -17 KPX A guillemotleft -51 KPX A guilsinglleft -47 KPX A hyphen -8 KPX A o -19 KPX A period -2 KPX A q -15 KPX A quotedblright -60 KPX A quoteright -68 KPX A t -22 KPX A u -18 KPX A v -40 KPX A w -29 KPX A y -44 KPX Aacute C -42 KPX Aacute G -42 KPX Aacute O -38 KPX Aacute Q -39 KPX Aacute T -103 KPX Aacute U -43 KPX Aacute V -81 KPX Aacute W -57 KPX Aacute Y -104 KPX Aacute a -16 KPX Aacute b -6 KPX Aacute c -17 KPX Aacute comma -4 KPX Aacute d -15 KPX Aacute e -23 KPX Aacute g -17 KPX Aacute guillemotleft -51 KPX Aacute guilsinglleft -48 KPX Aacute hyphen -9 KPX Aacute o -20 KPX Aacute period -3 KPX Aacute q -16 KPX Aacute quoteright -68 KPX Aacute t -23 KPX Aacute u -20 KPX Aacute v -40 KPX Aacute w -29 KPX Aacute y -44 KPX Acircumflex C -41 KPX Acircumflex G -41 KPX Acircumflex O -37 KPX Acircumflex Q -38 KPX Acircumflex T -103 KPX Acircumflex U -42 KPX Acircumflex V -81 KPX Acircumflex W -57 KPX Acircumflex Y -104 KPX Acircumflex comma -4 KPX Acircumflex period -2 KPX Adieresis C -42 KPX Adieresis G -41 KPX Adieresis O -38 KPX Adieresis Q -39 KPX Adieresis T -103 KPX Adieresis U -43 KPX Adieresis V -81 KPX Adieresis W -57 KPX Adieresis Y -104 KPX Adieresis a -16 KPX Adieresis b -5 KPX Adieresis c -17 KPX Adieresis comma -4 KPX Adieresis d -14 KPX Adieresis g -17 KPX Adieresis guillemotleft -51 KPX Adieresis guilsinglleft -48 KPX Adieresis hyphen -8 KPX Adieresis o -19 KPX Adieresis period -3 KPX Adieresis q -15 KPX Adieresis quotedblright -60 KPX Adieresis quoteright -68 KPX Adieresis t -22 KPX Adieresis u -19 KPX Adieresis v -40 KPX Adieresis w -29 KPX Adieresis y -44 KPX Agrave C -41 KPX Agrave G -41 KPX Agrave O -37 KPX Agrave Q -38 KPX Agrave T -103 KPX Agrave U -42 KPX Agrave V -81 KPX Agrave W -57 KPX Agrave Y -104 KPX Agrave comma -4 KPX Agrave period -2 KPX Aring C -41 KPX Aring G -41 KPX Aring O -37 KPX Aring Q -38 KPX Aring T -103 KPX Aring U -42 KPX Aring V -81 KPX Aring W -57 KPX Aring Y -104 KPX Aring a -16 KPX Aring b -5 KPX Aring c -16 KPX Aring comma -4 KPX Aring d -14 KPX Aring e -22 KPX Aring g -17 KPX Aring guillemotleft -51 KPX Aring guilsinglleft -47 KPX Aring hyphen -8 KPX Aring o -19 KPX Aring period -2 KPX Aring q -15 KPX Aring quotedblright -60 KPX Aring quoteright -68 KPX Aring t -22 KPX Aring u -18 KPX Aring v -40 KPX Aring w -29 KPX Aring y -44 KPX Atilde C -43 KPX Atilde G -42 KPX Atilde O -39 KPX Atilde Q -40 KPX Atilde T -103 KPX Atilde U -44 KPX Atilde V -81 KPX Atilde W -57 KPX Atilde Y -104 KPX Atilde comma -4 KPX Atilde period -4 KPX B A -28 KPX B AE -29 KPX B Aacute -28 KPX B Acircumflex -28 KPX B Adieresis -28 KPX B Aring -28 KPX B Atilde -28 KPX B O -14 KPX B OE -11 KPX B Oacute -14 KPX B Ocircumflex -14 KPX B Odieresis -14 KPX B Ograve -14 KPX B Oslash -2 KPX B V -49 KPX B W -27 KPX B Y -56 KPX C A -43 KPX C AE -44 KPX C Aacute -43 KPX C Adieresis -43 KPX C Aring -43 KPX C H -22 KPX C K -20 KPX C O -18 KPX C Oacute -18 KPX C Odieresis -18 KPX Ccedilla A -44 KPX D A -50 KPX D Aacute -50 KPX D Acircumflex -50 KPX D Adieresis -50 KPX D Agrave -50 KPX D Aring -50 KPX D Atilde -50 KPX D J -13 KPX D T -56 KPX D V -54 KPX D W -31 KPX D X -58 KPX D Y -74 KPX F A -78 KPX F Aacute -78 KPX F Acircumflex -78 KPX F Adieresis -78 KPX F Agrave -78 KPX F Aring -78 KPX F Atilde -78 KPX F J -59 KPX F O -30 KPX F Odieresis -30 KPX F a -45 KPX F aacute -45 KPX F adieresis -45 KPX F ae -41 KPX F aring -45 KPX F comma -113 KPX F e -33 KPX F eacute -33 KPX F hyphen -20 KPX F i -19 KPX F j -19 KPX F o -30 KPX F oacute -30 KPX F odieresis -30 KPX F oe -33 KPX F oslash -30 KPX F period -113 KPX F r -44 KPX F u -42 KPX G A -14 KPX G AE -11 KPX G Aacute -14 KPX G Acircumflex -14 KPX G Adieresis -14 KPX G Agrave -14 KPX G Aring -14 KPX G Atilde -14 KPX G T -53 KPX G V -53 KPX G W -31 KPX G Y -72 KPX J A -39 KPX J AE -39 KPX J Adieresis -39 KPX J Aring -39 KPX K C -56 KPX K G -57 KPX K O -53 KPX K OE -49 KPX K Oacute -53 KPX K Odieresis -53 KPX K S -48 KPX K T 14 KPX K a -23 KPX K adieresis -23 KPX K ae -20 KPX K aring -23 KPX K e -46 KPX K hyphen -53 KPX K o -42 KPX K oacute -42 KPX K odieresis -42 KPX K u -32 KPX K udieresis -32 KPX K y -76 KPX L A 8 KPX L AE 11 KPX L Aacute 8 KPX L Adieresis 8 KPX L Aring 8 KPX L C -52 KPX L Ccedilla -51 KPX L G -53 KPX L O -51 KPX L Oacute -51 KPX L Ocircumflex -51 KPX L Odieresis -51 KPX L Ograve -51 KPX L Otilde -51 KPX L S -28 KPX L T -112 KPX L U -46 KPX L Udieresis -46 KPX L V -115 KPX L W -77 KPX L Y -128 KPX L hyphen -140 KPX L quotedblright -145 KPX L quoteright -153 KPX L u -17 KPX L udieresis -17 KPX L y -68 KPX N A -19 KPX N AE -16 KPX N Aacute -19 KPX N Adieresis -19 KPX N Aring -19 KPX N C -15 KPX N Ccedilla -14 KPX N G -14 KPX N O -11 KPX N Oacute -11 KPX N Odieresis -11 KPX N a -17 KPX N aacute -17 KPX N adieresis -17 KPX N ae -13 KPX N aring -17 KPX N comma -15 KPX N e -11 KPX N eacute -11 KPX N o -8 KPX N oacute -8 KPX N odieresis -8 KPX N oslash -4 KPX N period -15 KPX N u -8 KPX N udieresis -9 KPX O A -43 KPX O AE -47 KPX O Aacute -43 KPX O Adieresis -43 KPX O Aring -43 KPX O T -54 KPX O V -48 KPX O W -25 KPX O X -52 KPX O Y -71 KPX Oacute A -43 KPX Oacute T -54 KPX Oacute V -48 KPX Oacute W -25 KPX Oacute Y -71 KPX Ocircumflex T -54 KPX Ocircumflex V -48 KPX Ocircumflex Y -71 KPX Odieresis A -43 KPX Odieresis T -54 KPX Odieresis V -48 KPX Odieresis W -25 KPX Odieresis X -52 KPX Odieresis Y -71 KPX Ograve T -54 KPX Ograve V -48 KPX Ograve Y -71 KPX Oslash A -47 KPX Otilde T -54 KPX Otilde V -48 KPX Otilde Y -71 KPX P A -86 KPX P AE -93 KPX P Aacute -86 KPX P Adieresis -86 KPX P Aring -86 KPX P J -85 KPX P a -39 KPX P aacute -39 KPX P adieresis -39 KPX P ae -35 KPX P aring -39 KPX P comma -138 KPX P e -38 KPX P eacute -38 KPX P hyphen -45 KPX P o -34 KPX P oacute -34 KPX P odieresis -34 KPX P oe -38 KPX P oslash -35 KPX P period -138 KPX R C -21 KPX R Ccedilla -21 KPX R G -21 KPX R O -17 KPX R OE -14 KPX R Oacute -17 KPX R Odieresis -17 KPX R T -33 KPX R U -21 KPX R Udieresis -21 KPX R V -49 KPX R W -27 KPX R Y -54 KPX R a -21 KPX R aacute -21 KPX R adieresis -21 KPX R ae -17 KPX R aring -21 KPX R e -16 KPX R eacute -16 KPX R hyphen -4 KPX R o -13 KPX R oacute -13 KPX R odieresis -13 KPX R oe -16 KPX R u -13 KPX R uacute -14 KPX R udieresis -14 KPX R y -16 KPX S A -31 KPX S AE -31 KPX S Aacute -31 KPX S Adieresis -31 KPX S Aring -31 KPX S T -38 KPX S V -52 KPX S W -31 KPX S Y -58 KPX S t -11 KPX T A -104 KPX T AE -106 KPX T Aacute -104 KPX T Acircumflex -104 KPX T Adieresis -104 KPX T Agrave -104 KPX T Aring -104 KPX T Atilde -104 KPX T C -53 KPX T G -55 KPX T J -108 KPX T O -50 KPX T OE -44 KPX T Oacute -50 KPX T Ocircumflex -50 KPX T Odieresis -50 KPX T Ograve -50 KPX T Oslash -42 KPX T Otilde -50 KPX T S -32 KPX T V 2 KPX T W 7 KPX T Y 10 KPX T a -107 KPX T ae -104 KPX T c -96 KPX T colon -152 KPX T comma -105 KPX T e -102 KPX T g -94 KPX T guillemotleft -126 KPX T guilsinglleft -123 KPX T hyphen -82 KPX T i -12 KPX T j -12 KPX T o -99 KPX T oslash -94 KPX T period -105 KPX T r -98 KPX T s -98 KPX T semicolon -140 KPX T u -98 KPX T v -106 KPX T w -103 KPX T y -110 KPX U A -45 KPX U AE -48 KPX U Aacute -45 KPX U Acircumflex -45 KPX U Adieresis -45 KPX U Aring -45 KPX U Atilde -45 KPX U comma -35 KPX U m -17 KPX U n -16 KPX U p -8 KPX U period -32 KPX U r -16 KPX Uacute A -45 KPX Uacute comma -35 KPX Uacute m -17 KPX Uacute n -16 KPX Uacute p -8 KPX Uacute period -32 KPX Uacute r -16 KPX Ucircumflex A -45 KPX Udieresis A -44 KPX Udieresis b -8 KPX Udieresis comma -35 KPX Udieresis m -17 KPX Udieresis n -16 KPX Udieresis p -8 KPX Udieresis period -32 KPX Udieresis r -16 KPX Ugrave A -45 KPX V A -77 KPX V AE -84 KPX V Aacute -77 KPX V Acircumflex -77 KPX V Adieresis -77 KPX V Agrave -77 KPX V Aring -77 KPX V Atilde -77 KPX V C -50 KPX V G -50 KPX V O -46 KPX V Oacute -46 KPX V Ocircumflex -46 KPX V Odieresis -46 KPX V Ograve -46 KPX V Oslash -34 KPX V Otilde -46 KPX V S -44 KPX V T 7 KPX V a -71 KPX V ae -66 KPX V colon -76 KPX V comma -94 KPX V e -64 KPX V g -57 KPX V guillemotleft -88 KPX V guilsinglleft -84 KPX V hyphen -44 KPX V i -14 KPX V o -61 KPX V oslash -57 KPX V period -94 KPX V r -51 KPX V semicolon -75 KPX V u -52 KPX V y -28 KPX W A -56 KPX W AE -62 KPX W Aacute -56 KPX W Acircumflex -56 KPX W Adieresis -56 KPX W Agrave -56 KPX W Aring -56 KPX W Atilde -56 KPX W C -30 KPX W G -30 KPX W O -26 KPX W Oacute -26 KPX W Ocircumflex -26 KPX W Odieresis -26 KPX W Ograve -26 KPX W Oslash -14 KPX W Otilde -26 KPX W S -31 KPX W T 11 KPX W a -46 KPX W ae -42 KPX W colon -62 KPX W comma -62 KPX W e -39 KPX W g -32 KPX W guillemotleft -63 KPX W guilsinglleft -60 KPX W hyphen -19 KPX W i -10 KPX W o -36 KPX W oslash -32 KPX W period -62 KPX W r -36 KPX W semicolon -62 KPX W u -36 KPX W y -15 KPX X C -53 KPX X O -50 KPX X Odieresis -50 KPX X Q -51 KPX X a -27 KPX X e -51 KPX X hyphen -57 KPX X o -46 KPX X u -36 KPX X y -67 KPX Y A -102 KPX Y AE -108 KPX Y Aacute -102 KPX Y Acircumflex -102 KPX Y Adieresis -102 KPX Y Agrave -102 KPX Y Aring -102 KPX Y Atilde -102 KPX Y C -68 KPX Y G -69 KPX Y O -64 KPX Y Oacute -64 KPX Y Ocircumflex -64 KPX Y Odieresis -64 KPX Y Ograve -64 KPX Y Oslash -55 KPX Y Otilde -64 KPX Y S -49 KPX Y T 15 KPX Y a -100 KPX Y ae -95 KPX Y colon -97 KPX Y comma -117 KPX Y e -97 KPX Y g -89 KPX Y guillemotleft -128 KPX Y guilsinglleft -124 KPX Y hyphen -89 KPX Y i -6 KPX Y o -93 KPX Y oslash -89 KPX Y p -63 KPX Y period -117 KPX Y semicolon -97 KPX Y u -73 KPX Y v -48 KPX Z v -44 KPX Z y -44 KPX a j -10 KPX a quoteright -23 KPX a v -26 KPX a w -16 KPX a y -33 KPX aacute v -26 KPX aacute w -16 KPX aacute y -33 KPX adieresis v -26 KPX adieresis w -16 KPX adieresis y -33 KPX ae v -26 KPX ae w -15 KPX ae y -32 KPX agrave v -26 KPX agrave w -16 KPX agrave y -33 KPX aring v -26 KPX aring w -16 KPX aring y -33 KPX b v -21 KPX b w -10 KPX b y -28 KPX c h -7 KPX c k -1 KPX comma one -105 KPX comma quotedblright -47 KPX comma quoteright -55 KPX e quoteright -20 KPX e t -16 KPX e v -26 KPX e w -16 KPX e x -35 KPX e y -33 KPX eacute v -26 KPX eacute w -16 KPX eacute y -33 KPX ecircumflex v -26 KPX ecircumflex w -16 KPX ecircumflex y -33 KPX eight four -6 KPX eight one -55 KPX eight seven -43 KPX f a -20 KPX f aacute -20 KPX f adieresis -20 KPX f ae -15 KPX f aring -20 KPX f e -21 KPX f eacute -21 KPX f f 12 KPX f i -10 KPX f j -11 KPX f l -12 KPX f o -18 KPX f oacute -18 KPX f odieresis -18 KPX f oe -20 KPX f oslash -16 KPX f quoteright -8 KPX f s -8 KPX f t 16 KPX five four -7 KPX five one -83 KPX five seven -32 KPX four four -3 KPX four one -88 KPX four seven -65 KPX g a -17 KPX g adieresis -17 KPX g ae -13 KPX g aring -17 KPX g e -11 KPX g eacute -11 KPX g l -8 KPX g oacute -8 KPX g odieresis -8 KPX g r -9 KPX guillemotright A -58 KPX guillemotright AE -62 KPX guillemotright Aacute -58 KPX guillemotright Adieresis -58 KPX guillemotright Aring -58 KPX guillemotright T -132 KPX guillemotright V -96 KPX guillemotright W -68 KPX guillemotright Y -137 KPX guilsinglright A -52 KPX guilsinglright AE -56 KPX guilsinglright Aacute -52 KPX guilsinglright Adieresis -52 KPX guilsinglright Aring -52 KPX guilsinglright T -126 KPX guilsinglright V -90 KPX guilsinglright W -62 KPX guilsinglright Y -131 KPX h quoteright -19 KPX h y -31 KPX hyphen A -12 KPX hyphen AE -17 KPX hyphen Aacute -12 KPX hyphen Adieresis -12 KPX hyphen Aring -12 KPX hyphen T -86 KPX hyphen V -51 KPX hyphen W -24 KPX hyphen Y -97 KPX i T -16 KPX i j -10 KPX k a -14 KPX k aacute -14 KPX k adieresis -14 KPX k ae -12 KPX k aring -14 KPX k comma -13 KPX k e -33 KPX k eacute -33 KPX k g -26 KPX k hyphen -49 KPX k o -30 KPX k oacute -30 KPX k odieresis -30 KPX k period -13 KPX k s -14 KPX k u -22 KPX k udieresis -16 KPX l v -11 KPX l y -15 KPX m p -3 KPX m v -24 KPX m w -14 KPX m y -30 KPX n T -103 KPX n p -3 KPX n quoteright -19 KPX n v -24 KPX n w -14 KPX n y -31 KPX nine four -12 KPX nine one -55 KPX nine seven -50 KPX o T -106 KPX o quoteright -23 KPX o t -17 KPX o v -27 KPX o w -16 KPX o x -35 KPX o y -34 KPX oacute v -27 KPX oacute w -16 KPX oacute y -34 KPX ocircumflex t -17 KPX odieresis t -17 KPX odieresis v -27 KPX odieresis w -16 KPX odieresis x -35 KPX odieresis y -34 KPX ograve v -27 KPX ograve w -16 KPX ograve y -34 KPX one comma -82 KPX one eight -73 KPX one five -72 KPX one four -88 KPX one nine -71 KPX one one -125 KPX one period -82 KPX one seven -98 KPX one six -71 KPX one three -75 KPX one two -78 KPX one zero -71 KPX p t -10 KPX p y -28 KPX period one -106 KPX period quotedblright -48 KPX period quoteright -56 KPX q c -2 KPX q u -5 KPX quotedblbase A 21 KPX quotedblbase AE 21 KPX quotedblbase T -80 KPX quotedblbase V -74 KPX quotedblbase W -39 KPX quotedblbase Y -96 KPX quotedblleft A -58 KPX quotedblleft AE -70 KPX quotedblleft Aacute -58 KPX quotedblleft Adieresis -58 KPX quotedblleft Aring -58 KPX quotedblleft T 1 KPX quotedblleft V 10 KPX quotedblleft W 22 KPX quotedblleft Y -1 KPX quotedblright A -60 KPX quotedblright AE -72 KPX quotedblright Aacute -60 KPX quotedblright Adieresis -60 KPX quotedblright Aring -60 KPX quotedblright T 2 KPX quotedblright V 9 KPX quotedblright W 21 KPX quotedblright Y -2 KPX quoteleft A -74 KPX quoteleft AE -86 KPX quoteleft Aacute -74 KPX quoteleft Adieresis -74 KPX quoteleft Aring -74 KPX quoteleft T -14 KPX quoteleft V -5 KPX quoteleft W 6 KPX quoteleft Y -17 KPX quoteright A -76 KPX quoteright AE -88 KPX quoteright Aacute -76 KPX quoteright Adieresis -76 KPX quoteright Aring -76 KPX quoteright comma -68 KPX quoteright d -25 KPX quoteright o -31 KPX quoteright period -68 KPX quoteright r -24 KPX quoteright s -23 KPX quoteright t -14 KPX quoteright v -10 KPX quoteright w -5 KPX quoteright y -14 KPX r a -16 KPX r aacute -16 KPX r acircumflex -16 KPX r adieresis -16 KPX r ae -11 KPX r agrave -16 KPX r aring -16 KPX r c -11 KPX r ccedilla -11 KPX r colon -31 KPX r comma -77 KPX r d -8 KPX r e -17 KPX r eacute -17 KPX r ecircumflex -17 KPX r egrave -17 KPX r f 17 KPX r g -8 KPX r h -8 KPX r hyphen -54 KPX r i -6 KPX r j -6 KPX r k -2 KPX r l -7 KPX r m -9 KPX r n -8 KPX r o -14 KPX r oacute -14 KPX r ocircumflex -14 KPX r odieresis -14 KPX r oe -16 KPX r ograve -14 KPX r oslash -14 KPX r p 0 KPX r period -77 KPX r q -10 KPX r quoteright -6 KPX r r -8 KPX r s -4 KPX r semicolon -30 KPX r t 21 KPX r u -7 KPX r v 18 KPX r w 21 KPX r x 9 KPX r y 15 KPX r z 0 KPX s quoteright -24 KPX s t -15 KPX seven colon -84 KPX seven comma -123 KPX seven eight -34 KPX seven five -37 KPX seven four -95 KPX seven one -58 KPX seven period -123 KPX seven seven -11 KPX seven six -44 KPX seven three -29 KPX seven two -31 KPX six four -7 KPX six one -52 KPX six seven -40 KPX t S -17 KPX t a -10 KPX t aacute -10 KPX t adieresis -10 KPX t ae -7 KPX t aring -10 KPX t colon -37 KPX t e -22 KPX t eacute -22 KPX t h -14 KPX t o -19 KPX t oacute -19 KPX t odieresis -19 KPX t quoteright -7 KPX t semicolon -36 KPX three four -9 KPX three one -57 KPX three seven -45 KPX two four -43 KPX two one -45 KPX two seven -38 KPX u quoteright -14 KPX v a -30 KPX v aacute -30 KPX v acircumflex -30 KPX v adieresis -30 KPX v ae -25 KPX v agrave -30 KPX v aring -30 KPX v atilde -30 KPX v c -22 KPX v colon -32 KPX v comma -76 KPX v e -29 KPX v eacute -29 KPX v ecircumflex -29 KPX v egrave -29 KPX v g -20 KPX v hyphen -19 KPX v l -8 KPX v o -25 KPX v oacute -25 KPX v odieresis -25 KPX v ograve -25 KPX v oslash -25 KPX v period -76 KPX v s -17 KPX v semicolon -31 KPX w a -26 KPX w aacute -26 KPX w acircumflex -26 KPX w adieresis -26 KPX w ae -22 KPX w agrave -26 KPX w aring -26 KPX w atilde -26 KPX w c -14 KPX w colon -32 KPX w comma -57 KPX w e -20 KPX w eacute -20 KPX w ecircumflex -20 KPX w egrave -20 KPX w g -13 KPX w hyphen -8 KPX w l -8 KPX w o -17 KPX w oacute -17 KPX w odieresis -17 KPX w ograve -17 KPX w oslash -14 KPX w period -57 KPX w s -14 KPX w semicolon -31 KPX x a -30 KPX x c -30 KPX x e -36 KPX x eacute -36 KPX x o -33 KPX x q -28 KPX y a -36 KPX y aacute -36 KPX y acircumflex -36 KPX y adieresis -36 KPX y ae -31 KPX y agrave -36 KPX y aring -36 KPX y atilde -36 KPX y c -28 KPX y colon -40 KPX y comma -80 KPX y e -35 KPX y eacute -35 KPX y ecircumflex -35 KPX y egrave -35 KPX y g -26 KPX y hyphen -24 KPX y l -14 KPX y o -31 KPX y oacute -31 KPX y odieresis -31 KPX y ograve -31 KPX y oslash -30 KPX y period -80 KPX y s -23 KPX y semicolon -40 KPX zero four -11 KPX zero one -56 KPX zero seven -50 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n019023l.pfb0000644000076500001440000011265207056046552016424 0ustar fnevgenyusers€n%!PS-AdobeFont-1.0: NimbusSanL-ReguItal 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Sans L Regular Italic) readonly def /FamilyName (Nimbus Sans L) readonly def /Weight (Regular) readonly def /ItalicAngle -12.0 def /isFixedPitch false def /UnderlinePosition -151 def /UnderlineThickness 50 def end readonly def /FontName /NimbusSanL-ReguItal def /PaintType 0 def /WMode 0 def /FontBBox {-178 -284 1108 953} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020908 def currentdict end currentfile eexec €é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>niË…Ô‹Z'pÈAáÏ•ôœ^‡ õs¨INÉÏŒdwuNP¦˜t¢¿ÝÈÝØtÔxÜœÚàêÚv.µMƒË<*\Ì’ïz¢Ux?Ôyu¸˜Ä6‘ÇÔêÚy…ÑFÿ¡É .ä;Zýê"(ÐЊ;¬ S{˜* ïãR-A¿\Êî3-€ˆO8”4s©[ë=YM|âÔŒËG‰‘ÀÏxõƒR–ú)3g£ÂwˆO<’p9ÛSBÕ¨þ"A¿ûiͤ5Õ4èÌÄIô`2êZÙi#8^” "ÅÑ7lò Qªÿ¿IëÍŒ'.¯gæÄ­“Juº"Bf_ÕòY¾í»^—ÖãÊçnËóÛ¬e>©"}\äž~´ä8͘ž±dW; cmè›AÎ׫-׬L÷t’‚ÝH+å™8`|c&ÒÙ¸RÊo˜ãþCâ¯ßÖ ç]vtõ©ófcQšJº}XÈ€H=)†@ÆCμîÿ¢_›’vM©rIÌŽìïu’ÓóÿcðÈCt ©IÕN…Är0€™-aJN‰UÜÜn½» X8Û|\†Ãú5cJþÝ÷[Iô—Î\ø@ÆÛVð ºÚ°£Nœ®¦&åt€ëPŠup|‰hÉز36 B?Ì“w Óz‹RüÜC××…ùR¨@ò|Ú™àŸŽï¾d|ò7˜a Òæ œ¤%óÀ.WmCÎ X8í¾ëÓþšy oC‹ÄZÍC×.€æŽæ˜ïÞÕ€ê`£^Ÿ7U'C‰p‡G~÷ùh31êËáÓð&R|"UÖFðã0Ó·ÝéÈ=ÔȬLvÕï_Zš^kÎe?¼*ÊîI¦+Æxvä@Bn¨™Óš=§^°“Gk(ø´¹hëÊ»Š±Œ™Q+ÚnaæF½–פ…¯‘Å9xÐCànÈòàžnÄcuðБPÈ…åwé¤ù~—·i‘ûph|Ö—÷àq¸¹¿ÔwÅ*òÀUW•.Zxþÿ_:TºyØ€’àYñ„©U?áH9£d‰ÌeCªËs‚X(!uÀ…¨ÍýeÝÇ/è7\¹?Å)¦ßs§X®Ä1HAʈ‚iÂ`ÆpÕë[è»w€œÝt[§‘óŸŠ’‡ ?Θà|.¬z€¾äÇ&ï2$SKóÂ.oºŽ›"rÝ)˜õÛ:Ñ¢¬×¯Ó‘O–ÓkÔñGh*§Zލ¥½1X_n‘´@ Ê6"P—~ :”^ˆf"™OÚ$®ê»²>Éx½w®mø‚a‡¦¬mA(Ìn×™Š:GkFyab^~¦½¸$ìa5CG öí§|±±ÖòΩˮW66¨¯±<¾s \?s<–¤êâd9WDðmg»(Ë>Zè1³çŸókµfÓŸñ~â$\˜5¹þvõÌ|1Øû+‘öäzÍ#ƒV̉`ß8þ¢B†·Š<¥©Jˆj¾ íp½_íݪRz-ÑDp<MØ[úOèjiä‡ãܪŽDXW<ýŽ G%ëûÏÇ6iö¸e}»¹4<]›&£æ2Ë-Ž¡“hõ¾ìÃÝ*=U©Ø¿bÌ;×Yè\ ªPjÑXuZúUˆ¿IÌùyy+ 3í]n1T•âÖ†âBø=“gºÒ7ž(QñÐeèlª·–×?¡y5±RTÚ–g7ýZHÇÙW¾¯+ýÁ)Ljmo+³F/Î4±é°3Âw/öoFÛi×l;»BšÕ5ã\T¢LÅ—³•ß ¬¦Èççš™êDèîFoÁ¡ƒ”t\À&D0To™;unÎçZöÚnã8ÿkšÜ ‹Îé„ít°Sûƨ-Ðê Ù©ýõâi°hùuh*ã]F#y‰–ÜÓ6ØÆL^fˆ?íϳv˜C9gºEªÞêÇA½hþ˜£i«ò®v‹bºÎ®Ìpsìó*S*ô:…Sð“p•ˆ„î# Á[°ÊY¥“`Žf¦›\VoÉ®âf|þûÖ¯¯.|Øì’Áòµµ¬>MxáÇTp‡h¥…óø¬'t6ò–q6'q¼ïþ¯žé!ì3!}Ã~Ž\:Ó%°Pö• ‹ùl•æj«öÈ ÷‰í¯Vv4—¬âH'–÷üõÚO–â§þWÀ*½¥ôÚ¶'ý¨ìàë°Û€£’~)_¤‡º™#V•¥4…{£f ¬ØwB¶CœÜ6çÛ™Òœ7Ý*z®=éµ*Ê’ú ö ¤Ù°K—o^œ‚$l™/NÜq^;’I;¶óá.Ó‘Íí!DNãrºW¥¨Ç3÷õíV“õÛo /eú.ì<T§®C"¿;dÑ-©vqO&>¯Ίüìúï |¹â§`*¿VK{ËȃÖ)jçkìK´øàmŸG]¸Š\ºH×,’TŸ½ñ\3¶k»Ÿƒä°eå®& %çÆž/÷|'=a@œ›’/æœÉaDeŸ´0üu¡ µØ„¹6 -ÁíÅxò=iÓsâB˜‚!:§î"‡({‡ÐŸt #$©Æš œ éùN¨Ô–™µv÷ŒR!ä¿ÀÙ¨UòüeVÁÌjˆê„…f.£.¸F2hÜÄšÆ Š2òRÒýt_ZÀ}|ÓSÙ¦» Õ–ø†K8 7ˆ m]Â?_~ÄjîšécqyÈ$ïwÀÊR·k¾‚WJsÞøœã/Âd•"°õ˜¿% ëâëüV~o´jŠÜ7æÓÌ0i¾h‰›¬lY[3]0 GZ©õ÷ƽj¼†*F©¬µø6D·2G‚¤ª‡ÒÒK³Mtö4𷘱nV9§Îf €Ž 1¥‰Ðp”'’ßà©üEùbÂäèÑ0‚´üTŸªÀO¿¾µ'Aˆ« éÊgpgÕ íqP³Iuõz*Çuõí¿§höß4šnšÒØØ£…¨˜›„܉Et–‰ôÐDt¬—e2Ç7~½%åÐ÷2Äñš ™¹@îiÔ$LK-øŽëøßà )þ5¹qr%5¢UÆeüá¨PTÒ:4°ŸD²o³`ŽD•Yô`&'Êv†dÈðIΊA†5ç ¼´w¹O¬ýa[»9°ÈSa*3G¥ww©)L—#’™ÿŸoU“!n•o&… ߊˆ¨ ÈÞÐÃýŸ9ñÅ¿*‚Mxéx)ͺ0_›¶~ÿʆÔýBy¹É5‘¹‚1\]N9•rÊQê\”_3º½ÖûJ“ y¤¦fI*FƒYù~Ê26q‡QLââþ¢Ä$xV#h{&æ÷ÊE呚;6f­àf41`35XŽ£I¨iÇcèzJ±d"Æå |÷×ÿЪKœ’h÷¢ÃV3ÊN²ÁsWÔáOSc§Ä¥]³†¶—^+`ú¹´lòDCœ‡Q¡Üñ­¹cUA]‹lBe*—HÄáÖIœsМÈ5y•(F°­ž b^b¨`Ç|ßÃûÃ:Ò@"Œ(Úâ¿ ?&$æÍÖ.µ¼„ ‡ùýPQ³×C¯ïÙN«jŠøÛ\ù¯ðñÒ–@)ôYÚ¤ ~™ë°4©|BŠ9M)]-— $}Úaåð+⸎Lš${ÃB漣Èká™"µ~³PÞÀi‹ŸHWYƒ0íÆÝé98p»7@!ù‚hÜxÁû¦/ãF…’ª4|Óò¹«Ý(Ý‘ë `ZêLgÃd›éX-ìAM"# õwµíÂÈþîtCUþ±Ÿ×Ðw·Â …Æ‹wÐB÷œzlCÜ«;+}#>Y9zÓÇš‰-½J¬4_ ²σàLÖ‘¶m du¹ñ• ñÄé½Ä¢ïÛ ¢‘†¼ÀxVÉžtÝ2ùâßn~-½ñ?´-œžF•bW9üé›dÕo¥Ø¶§ÖwŸ¸# B÷Äž=êÌf‚ÎÔûrzÚJïBgtŸ½õ_JeFGxå€óɇ?P„tÏÍï*‹à*Jkú[ ºI>?"W™vžíèT¾ t–)ø]"S7§%õœÓÿ߉LªJ×»°òt¸Œßѹ#+#Ù_‚P -ÊX¤ìaZ÷ QL ÖŽ€ÑTà•]ñ6!¶÷ÏJØ!E½ûj5#cuðS%79-ü_ÁãRçölt=ë¹`äùSW¸Jëi6Ÿs®lÓkgá+U3ex¹†K@"bj2¶äIà1ŽÄqnûÕ½¯áåÉeßÈè»òlã¼Åè3Ë—Þ––D 4××»©tò½óyq(Íñ%ŽX'ÌkÞjÎ!Ðrô¯~ \›|=k‘ƒñÛØCæè0'}m6Ñ9XÖŸÇ?lÊ9?òË9P §ó'n£s–3Û\»¦æGÕtAºê¾„±NË\Ä÷ì*ÊC4│p!HR|ÑËîš}ʤñ ) ]r>]¤6•¥ë -$¶*èphÈ—\ظ®\G¦êºÚœÊOšPW$6ì4×Óðµ'ìyO7;“í¯+ÒÓ/Ù< ;•–—fr_ˆ¿$ù™I*M¹1~ç%×3Ñ—ÕÔYGH×-1È>»úÏOTVFøA˜½×Y¡  ,67ÔŒ¯Š!ñÅ)' õáå­ció-zGv†ºôÅÈß#­¾»kŸWãµ4B¾T8îLK2Iϰròåf¯NÍ44a ;±3€3¯>ÊðÔnÃáç#PÝÏpðó,€³à `(`_ý|¿'§ŽÀÿž 1ø4@ÊXj¼ž6²ˆSÞë°ÄfáC°A»¿Ï›øÅ~Ñ"xc‰èœ®ê–á JÄ{zRÀ¬w Õ‰Q„3„xîmÅ\GëÊÕÆ¤“.<*ëásò»ÀΪ¼cÍXçH@3­ÙçŽÔxYA»Š×ý¶7ù’U$ ¼éCv$³Î 9ß°÷âøJƒ±s¾°Ÿ3ð_žEqÄf¯ýÚ½„¥KX2Ì9•|öüöl(á¢`JrÿƘ@äFa(ø™+_î’0õvYL‹"ÛiË Œ²M«©¼ 5Ìa‰KíPú[ä4J¼g{›Ài¨¾‚r'/>>À—6No4Aóý÷÷Ñ{Úlun0•€Õ3JR>8ÉÃ4Î;Pð›1£Ã˜Á×õB NÕå¶ð5Å[$U(n+uý›ê³ý"gäZ»Ÿûì+Ø’§™Ð¢wGݵ¾ÂuNÔøâîXâñÙÆ ìI u>p2D@ŸÉS{Àù­ÒÀBfî8È"·ÍÍg ²)ѸzÔ6¿›‡ ÏJà<0³Ök¾4ß׃oçBx[`¤?“¥ÌÊñ=Ôa|”œ=€î2ë’ªsH¸“ŠŒÑ%ž½ÆPÕ5§×Tæò¡Ça<ÄOrÄL…ÊÇ%£T*"§‹ˆX}ô•¦ÚOT¾ÚŽ0ÒÓà¨H„çÝ þhâ~y ëÄ'4 7àŒ&76wÑ)ƒ~n|=ÛWàÈIø¿¹ûy!A(t$âkfòŸ´l_¥±&M¸r˜“7wUf‰÷뀂«Šv(ERöÜTýwÝz&¹èÂR„–ίÿaˆÌNfXÐ'T\QSýp¤aØÖuOfBYMÜ‘‰€ÖLâø»*œ0Žƒ¿‡,N µ]ÕäéüA<¯Ò6ýØ$çÇ5%ppBç6ÿâhO}–l"–Î@nM’íX½¥“HE%o< t7 &ýp#…7¼™ž¥Ýnzp®—­šGüœ“Ã…¡/òÐo¼ÉÀ±ì¡öÿ\š”)w~JMVhpÖ^_È2-ldÐÚ²Ñ*æ®;‰ø~S÷•¦òBd!ð <`Énîû¸É°ú¯o*sÞ!ß::é~úxTǤ%5õÁ“V‰ÜõY/— ôØf’E£Ç³Ç*3˜õ~ï@æo•Î’'Ó®ÀæÅXÖ¨J{‡w3—h@¤×¦É ny½…¿I1‚Ô~ŸóOx \ëck‚I¨¦¨Ó‰¸>ÃÚlfS˜zøëíòvÚ@Œñ#tð†xIÄñÅl°/(SYR%«…SlBÄDK¾Ë½`â!R§xAË53ðjbGsÃê™×ÊÆsW¯ ¸—œ`eòùVà{C œê«t¢8@G=û©iâ)Ü]ßjn«ãÃ÷ ÊhMb(fß/­4¡ Ïu¼»&˜ÿã÷,}AÈÌPâ SEœÐT×M—÷º,¿€tuþîî†ì”Ua oükÍ·E«¡bºÛƒDÃè]ÅE)»Ãòµ‡‡3Gϼ=æª~äG.è® 4*­žt¯¬G÷è…1dz¨O…Y€Ôò Üʯ[™åUfi߯V™ë&ÂM˜Ë€HýûÂ}ÄdhúpâGÏ »‚‘B—íL%¼îú%‰G>òÖ"AlãAµ•iãÐÕMŽ ¨8DœržÒfË£’Å:ÝØZõ<1È7R­Â¦yÓ¸æ”ܲƴz”|?òs- —·úv?þF;ó-{»[Ûî/ÈùšÀo91–Kš*é0\e×Á—¦gwºKüÄáÔvêø[¦¦E±`>ï‰l~35©è>(º(ÜŽ–W˜úÐýƒ;'"ÌÙ¿u˜hlQ–g;¤v9.@ké¼»¹þQyª±2È,„âÎgZqÑñ¨i‰bà~lÇh¼˜È¥*ròhÄxe ܈xdˆÿþÒyW7Z$J.«{3I³>M ŒÜ ÁÕõYÓ‘w"¢cAªZÂÜâf†fq.™|Šu–›€5½·B×…áÐåŽÕô²X®ª¢m -Ø’x:ÿÎ<ìyÇeZ°&Fåº2Ž_jkµóŒ™4ÿ®˜þµ0lA!oƼoQÂv žZÔà ¤± ŸÃülŠ¥b6ÿ©°$Ç@°®¢‰i—ΩT(„JÔäÐ6Ä P«”°:Ô€!p U$}Žðrã'èù”±ÀÄãd+ü¥è$ò~Ž×’ÈÖËigWÌ7Byì¾Oèfw§ó&KqÝÞLæµw²T—!2å~n^“ÃÏê_äÀÏv’ûaë€m´¦%+psޱ-¡÷· zßésÖÝ ’ÃÉ7~…AHœ+ì7Ëø¸ä/gX4® ˜’(ôtÄNN{-O¹;‡/øiÎüF¨Ñ•ä=pÜÚÃg—8sÔbÚ ÑaÇP°Ù¢_ÂØ˜ß_ 5#:Ý^vÃÕ@XÂò<¥i :aÐörzúè–Éú/0DÒ>[§ð9¯³¼¹*Tüøg—-À­7 YÃÈZ@Xév{v¥Ò$#IÕß [ÿ5ø¡ðmê‚yÿäb’èñtW­˜÷OÐ7C¿ð 9 g¶ƒ_Jþà=FkSŸSÖ 9€[CJš VôŽØžAt=éQ]A¬ò8‹y#•zÑò KÌ ÕjÔt™í_]b*æ3Z>_f! ývšœæ©­øUÁ!J®fÜ76¿¿è6<8Á®9FE;¡£G0³Hÿä‡7 f­&”> :/ƒ› ˜"Úa „»õ.{F¸³Ïz°QH wlfŧ˜¨¸bß1K ;C=Ò³õ~—ôA·3WÊTð=² ”6Ú"GY…eG–ÁõsWôõ®Í?Ûóˆªý9±íŒÞ¸ðPÞ(|)ýCø.÷!Jb¥»±û Ùã4©U×MU’#áÒÉ$*¤yaOrg–N—ªüÏJŒðDˆ±Z"$ûXæí¬nBØ,FU"ýø rÊžoãû«o¹vº]'˜se} *—Ó„ó~ð‡s#¡g{Ì͈^” ±yÉ5¯ÏÂ2ðpgE·=|*±|Z Œ«ãPbîh YÂË%GO܇ˣÔë'M«ïÓ]+Ñ rN͉\M nHm9Ý8þ¾å¨Ç–Á@<£›¹Ëÿž|m ‚ôb“ÊóßX'Œ,ñ‘•yÀêÁ‹´±^G´ó¯m‰ ]é$¬cÿ4ܧ‹êzÙÎ w…™€>›‘笲MâÇiæî !Þ6¡Ó-Á>÷Ó^(޵Œ÷þø=´¡M¶kÔ“I¾3D/bØŸ¯#¡nd˜Y¬¼%1 ½!&iR–·2fü?;v^Ѹ¦:ÌüË«~î äN <Ëü'^sqæÐ¡/”}dºÞRpãлÃåÒFð÷<ý†ÄH ½†=;uaƒ•Ýe&Vªé3AïW‡:`M°‹´×©³E;k°ÈÊM¤*On!¥÷izinÀË­å;WÆ4-sòžf¸dRêLtÔˆVhBÁ½g {k¤‚ªaæÜ+¿í°òÄ0FJG&žˆ’$mà%z 2ïÏtÇÄ2h¥gÄ¡¼Í:'‹Áè0œB_rÙÙÏŒ_eòÀn+˜Þ‘bà AëÐÌmq¢›Ìb@ÿèZÕØ¼ ë…™;)„ç:²Ä†²×“Q'îúÇû±_C[è£è2{ÒÓ–ÃËòáwÌ)RãTðºxŠÁ#™8ƒœÝ.uú«qs)!,ÄkáUò×#¾‘j*ÄjÏáÔ’°qÒÁ‰ËÁΚÑûÏ.^PI±ïd©„Wô¤+é¨M=kcYÕ„—ìq7»ÿcj=6Øg‚ìˆëÃ˳,ØCq+GQw]ú3h¹GóØ«ÞJ±VûBQ›M"!&²ö•ñ§Ü)á[Êí µÑA­×ÌÞN;³°7²£‡PŽ0M×%Ó¯^î°ÙRRôô+f–êQŸ"¤èlQk{Û ±XažÚ\¹ÞøZàŽVWm!H$öA*¶*!—ĸ1ײ‹!~“mH?²Mt¶¤âw©Ìï %ùºüŽÐ[ú€2\< ¦3Ä$Ös÷@ܾëÔšlMgêP£N—™}Öw&j9³OK?Bʾ:+a9͸¸˜©K\(s-`c;YÂÛ™â¥Pùˆ!{^Æäzy ”Œ#G7¨Îͨ HϺúJïkó9˜Ñìêéâ|`짺ˆ¾{µVü„-iMø²m¡ Ð Ïë÷È™;¹/ÒWEN%üõú6sB™Õ%Á®Æq ç!‰€†íÕ³iÑžó‹ýƒKÝ[dßjoª+ÔUÛšæŽÊ]RV“¦­¥;“Ç¥sn“¯¯Îí&§*ÜMž7³-×;£¾‡øzÎ&¤w$Iê‰xîwŸ^â׃îý´=íZõ…É8¨V¹w‚˜´gж`”#AY'½aŒ'¼n÷áîhó_þë*Ö¡Ÿ¼K)f÷/Ú P*ëï’åÃ÷È´wÿ‰eO÷¾ZM!²M †v"—îá ËX­¯Æº'Ó%ß ö¿ºð?‚—ÉäïNÿœ‚ìÛ/¡~ƒºxãyÞ«óäyèuOzGõ~Å‚bå*0Ì“CÏ›’ÏËOn{[k;a«tê"ŽÿFØ y…lBxkÖógý!q˜jäÝW«Ø®ƒÍh6¢ØåPá¦ç*×¼êÝrŒ¢¥a‰@”áÀ¬géh@ÔÌžXH³*Û`?³ºuÐ#Ñ6 ¯»s^Qqƒ9ŽNpSÙPΜ)Å™ðáG¢áƒ:^›@ýìÖh;jÒôØÃJø’ÍZ¡žèIÒº²Ô‘êÑ‚ç|« AoéÒ:Ÿ3Øú‚Osã|x.=Bal¥‰K´—z¸O`e #–ˆ¶ð·J| à Cvè×SSZâèá·ÆˆDÂqâ2uáhO7[Eò´øIHϬþ 5=€,² supKF6?ůíãPit„¬`^2(£å'¦G(ìïêŒÉFF5 š¸W‹Úµ>L§ò6ÙÜ/ß§ÊÂ_ÊÜá¤Ø9Õ‚…¾†tŽéœè½OW6ÆÉ9÷mÄÜ&ª…íï´”ËdŸ1/ÜÉ÷gÆ—Ô}L® ãÈþ“{fÖ õ­ŒZz‡^Ù®êÊíðiLÝþœmÑÊ5§Á™›KÔSZ{€Yx}å×BȪJG 2†ÆyŽDìFmU=Ž–¶f-8o°B¨­I¿S½DÈXÇôÂ(èsó<öÅ£ÃúÖéè³±kå౬N–ôø XÖÿhÌz‹ Ùæl\´ºRð¹h±qŒ\ _ÙÓϫۖÇ!BQQ¿= çû^uØá¹¥R@VÒÂs°Ò7Ö+2§°^ÌÚÞis.Wéí‹r;/‹ã­ +1r\ êÿ…mqâ-|2Ýj%ídR­õ8Òhïк÷Sa’jée'ÈäøÇLñ{› ü1Â/µr,gÿn yÖÊ0Ñ/÷¨Ó{·´bpÄOèVЂî={<­FdŒŠ8H°ßÜäGÏòî%è'›+É¥mëzy§ŠP …¿šlj‚Ú…*ROÄÈc®€þ\võ˜T7ã½gÅó/õ~½"ÿâMë*RX˜©8fa¨ãb,°C "¥J?íR“ÊK_ÌÚƒ~m¤ m~'QjرÅz·WˆçN(©·…zŠîÁŸ§g¥}þÌw§?%4‹`誩2Üžþ;À*¥&¿n¿…(áŒT@v¿,O›é½w§³.ëÿÞ©Ðþ±ª¢½[bÆW¸y¨•™øNͳQ¬TS¸Î¢;¥_M΂¶ Bû‰ÒG‘+÷èîö¸ÎC„ع³&×#†ƒ[=¾Çi—öÚÛU± ö[ñÛ,4/Heñ;.Ofd¨5BpXl÷¼ÅìêåìrQ°W1Te:|ñØ)%cß©èE Ëö ç}Áî&Õê'°«†P:Ó#ß’äJN5›æ§o4Ðtææ¨ÚÆI±›ØTóÑ×q¦‡ÁÚÌ4å¤ÅŽ–¬¯×ì~ßã±ÄDÛ¦i)w=Ð'8Ó·€W{c§û6Ö9ÉíèNuüiW'Ë’„dŠÄôšÊ”§Éþ›5ÒvÆvY÷ZŸˆæ?Ù dè;?HÖˆPÖª‘¤_Å\üpQò?UzV<ØÄó¼CÁü„ÈBÃåVPŠ‚Ô:}_:vqŠÙ– T¬î8Q´õÑî2À»÷o“­8.öþñ‰&§•V‚äOc=k¡ª­î.¸ìEåó&£þ£Ž@ÁñÐ Íæ!9$ùzR 'ÙBr|ü¢È”ÉÒQ†[Gq$›À’¢ÈSY]PÚ < äuô:ð´®ÔØ1o’Zj¼Y¾Y*µ÷€fðÂuæôU´‹´¶mFL$–cÿÞ¾;ñ$錾<Œ§îå´çðHY²m§abŒÇAÕ)ÅÁo»±(-Ï@C+ïÕþ ½<¢ÔxÁû‚ýçè^$ë6N„=+¾? ¹$ûáxfBJOwß·“5xmJ܉~ÜÁ¯‘ò!ÜQã20£k7€¡Ù™ÏsñÖϱ¶Òjrø‚§C«¸8¢õvÿ»|z›Ñº>3 D·È,`™]A@ðÀéW¡îÈtHÅ®Á= WÇ¥J¦z2(8×-Ô^¦ÈOÃ…~‘ì‡&\ÜÀMdx§—äòz©’‘–°˜âš~ßýΗzI~xkSú)¨=JE?ÐV‘½;Þ3!¾å!r`ìèé%ðÑñVqÓî°•küJËt’Äl¬†oétÃçñà™4sÝ ‡ÿøŠœÕª#æ‘™€ 5ô™š©ÝÁ#‹'ÓhÈX0X<øY0ƒ«àEEµžó]¡±už–ÕxM6©oSW®¢ÉvòH$N³ýkÈ^䇕b[j˜ëI9ðš‰Òt€HÉ€ÏÁUQ•éæ !"(GÌå1!¤•PáþyˆêÃ_aœÒG åÌ{Ž”QK8þ¨ƒ*U ^ì¥iÁ+ŠíÞfÃFcéÿMÓÏZe ÎÑMÖÂÝ?^%ƒþ¯sÎ3R7y¶(÷ªyv†FÕn$]>ÌœÇÕªvcTËb¡bç\„ªsö‚ÖS° Xo~´C<Jø¢ô¶è5qq¥öÞ|Û÷ôžÀðCëª3Y*¶èŠ¡n­Ëu å;¯£ræÑ×p`®$ùæNH*9wúÆ¡5öùÅX€Û%ÆÑ(ƒÜl­7,¿û%‡£gkCا_åÀgkÓ1fK»™ ã«ÕùÒbÈêí€KW™h«%I—à‹‹Ü*"ýñ‹½w*+ zÁNÊüTõH•½‡B€ÑÞÜ=׉¥vO нdÊÎËÎðñžYkÉ6ÆEÈo€ºW \/³v\N_AñêƒßyGÿ#È`Â3…¥>M¨WÿPû3Ñ„€±dÐîU%ÊÞøb&Eòf`º)Ø ¥:Îò8e“ò§®Emqp´Q>ñ‰ÈFË2êV‰6(üªÈf¿,mÖr‹5ÈLÃý'5¦lœÕ<_«9€V¿&ï<‡|Âñq°RÇ_(íÚŽáªK­vì…fü·¤T$™©îog Ö]É­[F<Ð;dó+hm/müökk;ôÝ'Õ×ÿ g¦UùQìwd{lëNhO<ÈñIZ)Àƒv`Ò¤¤f-×wžÆ™@´.-/0I&í•ïYRÆOѸ}µR}¦ÿ¯}>^uErËé…í^fìÀx ñ‰>éÚªà¨ÁŠ÷8XK&ÀË4+Þñ¥Z`€©êÊ4“ è0»èn Pû‰“Ì)Däq/e8›€€«ZýÃX!¾çÓrÅŠ‚8Í~;뇒¬‚¥§Q»'vVáìµÈÓ§T%6;,¡TpJX|¦ÈxÛ¶ÌpšOD²j$½Å6ãN¶p¥¥FaT“9µ•þŒÝ’«p½R\çä·§Ú÷ 8b¶îÄô“§ט’ŠÎ Ò7T‡-c´¶\Ÿ‹íô"Ë (Ã9ŽÕx Ä"°Xœž¢_«×*â£@‹JÕ?(¬™¿Ø13KKÿ½ï_G8×2””c ®Ú~›&uodVK¬|ÙÒL;íæ(õŠi¨d:êМÛ~)î³Ü uGÍ$œJá…ümFóËåb(Tc Ò¬ô™-‹ÄÏuÈÊlæäKÜ¢¡ÖDàþ­áÎñ´ˆáU"ÄžjU)›îÊ¿G\H ÜòFõ¶sÐ6Œ„°D G”}÷=Ð…¥qsÇì×R‡ŒgtŠcLäø3“€‚îÂ:¢¼rö¨B\²ÏEÍÕ j£pêw 4¬xt©ï®¼ËÓÛ?&ý—è£i>ÌpqþëþcÌQxåäÍ«GèRó+º-íâ•ÕŽ¾÷r4¡¢V¯£D¥¨õèþêq] Ì3K¯+ô!a‰-Þ9âºÿg¦*VVCî„h½Ú›ü3L’‹æc¸+_:ÃzÏŠºíÜN«Ae¤M}‹]^IÜìeráqÐÓ¿ %m:ù匚ìz½ªjVž`²¸©a-Óœv{sŽY½$tÀòèç¦ÿ²ï×  ƒûi›NW}ÓësëXEŠå•íZéÔÆv(÷ʰ/•MœáÖ3WÚ;ÍC ¤Î‚óôÐ:,ADÛQ’F‰ÿEäFuShò6mMœ·œ\¹IÐ h†ÑÕu“ýSi0]o½… ›kô3_¡ì!,ª|aÛ}ô½áßd ¢ûT?\ðx#„ÏÄq¿va ·÷ 6Ž5l˜Íæh#ã°ðn¹yiïƒUú¥‘Û™ª<ÑÚØÈú¾¨†ÂYd{Ìk«æö¼Î?ȹœÅ’–q‚Jeö‰”‡ô^ιOa~’XY·²D0XFŸ' ~®5ñn°²)¥ƒhDò-bÑcÇZ£Ï+tÃ]}Çhȱ\€¢vN»ÖòF7{GRSÉk÷9/8úŽv–žžËCPØÒî¼'RÞknnA×|½_éýW R‰!X^å¥UêèÊ{iöÒ&%hAZ鯄LÔG9ž1reöÒ³q7°ø öÛ/”I{ŠHw¨§)§" 8sOøhÆ”:Ô¢ø••ÅøØ£œá XYtC_2Å\geGï Î~Ž€ÃÈ竪ËM`Nþ¬îûXaiÜÓ~Ål=O[kZ?5El—Þ¶fzJ¹¶^™—ˆîZQ·IÊK• /þçÄݲàn#ôC8¬A‘á(vÓ2È œù,é>V1Â_‚Vâ2:Ü^:s ø˜…‘yN‹ŒÝ ÄC¾ê4ͶgÆ·ÛÈ*³«@F<µžšÜûmž'»¸dÇòtgB×Lë‚ÆL[=ÎÚCðȃ‡­ù©vª$Û›ý´Yä,ö°›+ß[àaÊ<è¢ò=cCKò{7‰û˜kÓ?¤­íx˜vÉ!KUüm¡Ý4›«LŠÜKt—tzÓwëàæûâdƒ3§ó:>ñ2Ƴ©ç©³©ä×…9Ãޛ˄ƿl÷>aä>Z"%åÞHzTï™Äî­HØK[Uýû†Ÿý±«O›;Øÿ嘃È;QN›€uÅ‚µŸi)e-‡™†çîù§vÏàã  Æ”Á²b«ýX/2ù™c¥œ¯.ôîÃq½à½Õ‹TÓâ_¥û«ì/»ô_ðçqÖkÚ^Ä+‹è¢ä¤[B*_T¸{.òúdÀQÍíW·Ž0dn©aÇtå$IGÁ¤wŽÿæ_º¡{\e`’§5z†aÎaõÉ}ž8†ÓÓ(y¥õH+R]e4.Ì‹dÇ8íå¿c.ÖØ"G$Ý•ùùL“Óv¥Ñ£G“äÛ: P†  A¹ehXã±R¨÷.cžo$¥zØ 3±Kû´7‹×Csjm¥üJÖ›hŒi™8cµØÞdRˆºH颾3÷—aÄ£i^f°¶Êù݇¸£ñØ“S;6ÃÆ…SÉèóqq4ÚñРeF&ûÖ£ÆS|~3–#´Äb-‘G@·éa5±hõÑÁô]x¿.Ãâñy±i¢G|(l¦ž9³IÁ“Šy¦Í\Ü ÒÖyw¿ä&ý–-ïÎHV8\Þt\„ïŽÄè¤äMÀôØIa b™õÕ„ý®üg{wh„<áÛ·?ñbš“·#&Ï;¯V#J–ýÇXðþ@ЀcØWÊoAœïÈð§]¡Ú ”Y-XÖnßıZ2Þp3‡>|}°Q:¦f§E+#Îè&òÆ’÷ úΖÃÇ {Ö­N*5†~R÷Ø|WöÊ£F¥¾ Öi ìp{h`×øõé`á#¸N#‡ÉoæÊ¬BímkŒÏÖKItÁëcHŸ«|(Ü¥)uŸ„ÂÄ áÞ89–"œ« Q úÁ¿D\$A´V µ‚ç“è¸SŠ2cœÑrWÉh“M6g[!¨ h®Q+¨:̾¤èMÝ¡Q÷—ߣÜ-~¡yy,ž9ø˜ß±§w íä’Ã;~Õ&Õà<¥(!†©*|¡s(”_5­I @µ‡9û;þòžêø‘»BŽN°ÜŸå~™#_n×; „_[Uj²Ù‘>Á™—<é%ëqÉXÔè¾ý˜J…Ú|)‡’Y/Å·Â ßX4W[0Žh³kt1ê39B« †K­òFÃ_×èäžÐÜ”jÌÄÿìâ;J›ÁúŽc´föió”ú —1?ž®}xŽ"D}9®N=ôU®r‘ÂIJ»/Ra_Oà¼JúEÆöBøõfÏêA¾~ԴꞬ5„XóBêÛ|òáµãæÊΨvQºq¸ a“C)Ù`QÆ¿í.–"åmäÑŒÜ5#ËÀ¥tÚÊ`àiPã2't²ä'éÉa{wõ”ˬd½G;ì¿Ò(ËŽ¦ÓDcŒ;´W hŽÒ|Ù¬ý$°»¸ec »R+2™[2‹±Íº-‰‡µ»[ÙX/0 ÍBž÷HŽ~\¬êí À§+Ã¥æJVm¯æezUXÐÞ©˜H"£¬Œìøxú{üÆ„«4hÂíSZŽ FÓ¾ rpäý¡/p«hŒõÈ‚dò²gæ~‚d°·üë2Ó7ÂïvN_˜–©ESC'œ“…,¥$''ÍVJhá1±dⱉ«0Y~£=mîðC&¬T pèǸÀÜOéL÷b’|üÌØ¢#œBO‚t×,b?¥KÄã¯8[Ò ñ;Q‚äÙl  ”̧œ$-ã×~4­è_õ =qXŠ jZó1íë%øÖ±Z"g±©Ê9à×ÚȘy*Zv9Õm¸ªúnNþ~drk-d ŸÒNžT.êPµï}ú[¬ŒÂ«A>Nþ^ 62ò9!°ÇM•ã·˜Ú} Bo®ðõd×ÍN¹'Ë¿ÙëÈi–»vã`€`.&>.è,Mí;ykÆ­&_½ÔŠÌLîÄÜ™d戕he—"$†€ÜIon^-“ -Ë3lÜ ÑÕÎì=48§U oñF¾ñ  I÷ÚRZ¿ÀÌ1½±‡éw‚zÒl×tWMV¹DДˆ\yÆ( ˜Ä߈(«øiY1í[8™ž!éH cÃþn' -úàRâ–•öæmPÀïtHUb\õebÂÒú¥™}%9Æê7/YLõÚ4dÃ"í 7Ó¿k Y‚ýUˆÄíà‚`Î’£ØÕ‡ùeü{g¾™mùÌæi6cV5itŸzÊý ±:¸³¨†Bùñæeÿ „ÅGÏ80H“Žt>SœvÞBÈ•ÑÅå‘fÂ-g‘§*1 ˆlÉU™wh‰ýÆ&K®üÙR9wÙÈ‘Xió˜ã®P³Š±`}Uå—¾a_ë-¦W˜™åÕ®œG¤vrYTî"+Zàlœ‰@·¸9ÚÔÉ…ÊÔ´ç Ï^Àˆ>T›íÐ9L*¶äù%ZH—ï|c¿†mf‚\QehA@ÌÙ(ûËèsR¤ z!vAU½šiî´MR"õ|ú\Ë„…“õ4Û«]ŠOÕÈ—¤RFÐ%z½"Ôrµ1V!sª:Ì“,ëý‹EßéÑÞžvÉ\/<>ôôÖ„¬`a˜;Dz©JzÞ¾•\_ÅJ~TC¸‘úl±!ŶÖ}yˆDÞˆûòÖ¹O4‰®~P‰cÓÿœóIo §ª¸«9^FC=ƒogcÙ‰ V|‚¤iÁ@ÔG$É|M:Oâ“/žv¨„h–[Ó_jÇs#aTf´"ÂUÔŽ`™dI »$Ý Hl7¥•œoXXI9±Ó!ÙÙ W)£ÍÒJ¦œ\ÿÔ/€«æÃ¯ˆÌºf‹9(œí Ú§ ÐÂx»…ƒiÖÓ|XÖ8oÇe3qå‚#S¨kÇ4‚]¾WäæÏ=¤ÑøÖ ­aí”Å K™«LˆsíºKnºã¯Oýn-¦çÃ?'yÌ®£i4e¥1“»hRóåZ½áhG©cZ´|¾ˆ+7¢Ã¥&˜T»?'-ر3Ê‹`.È¿1U<{šöÆu’BŽøÔ+ ÄÔe×HÝ?‡¤bªÄ°¡LM$—¾–‹[#¼šç:6“Þð.êÎÖè}’u¦Týÿ# ÆP(ÏNµsmÍ]ß`üyVnû’újb[¡BlhT:`v¹ñÅÉÔG^(6¼ƒ»Å™ú„e»+^E‰¤Â 4÷°À$V˜éÙ„B-B‚A(Ó›ë·Jk›˜Z2<ô§”zjVéþ$›\‡âpå–(`‚§#§úÈÐûr¬pØÙÐ%£'ÊoÙ(e¬,MQWñ2ÒK:¤­ô£•A¿L ¯#ârjŸ3_Ç×åø!X úMæ™°ÈL5¥¿~dDi¯2¢adÈ "Ÿ‘’Õ:ª™‚Œ:œ‚ŽYl.;°R6Li]æŒÊ“u¿ù‚á h¹9][º:ØêËf1‹?¼±qQí@ÅI)“C·—ùFì·[Ól{¸ÃÔØÙž±"y”WyöÒ±eD}ªcúÜøÖ4"—°¬pe½àìÜoË¿¼sŒˆæè¢ ÙSÉÀ´¸Ž@+ÖKßÃ$¡É=X¼Ø Çø†)L½è{öÐô u«c®>|á®_ÂìÁމ3Å»›sæPÿ·ê> c7giC©yŽÕÊ@÷’0Ýž3Cƒ=/)ŽKÓÕû,QVlÁyo,>µb#[‘oê}8ro*‘Üç16ƒ=‘| ZßAÜ?ìÁÝf úÅ|â̺ÑlÚIÂ…N·—kÛ ©T¥S.<ïµøw{˜ŸŸ‚^‚Å–4<Ÿ"û™–D$$¤›ºÆ=pŠ8¦n‰|ÎøFՃ܎j7°1å:”‹V ÊîÃg£²X¦–šH˶ݘ†ì†Ÿåø÷¨¯©7òw Àbaǰ#ðù±?ô% ²Üáþn·rK¤Á‡“HßÊÑÅÉ5SD¦ž˜ÖqíÄ!MtTÕ6p¡ö—8 ýzío8g’"CMt¥“ü™Hó€–!žiä¤ðd)¬—¡”í¬ÏåX0§lk$¬D³+LË #ø@I¸Y9Çn¡z¬à…žÿ^ás-6BË5A‘—÷Ü÷IÔiøèŠë¾«¹_W9z1Éú#Nøú¬_î¢w·Š|ñ„E‹ç#_zþÖØ‚L„ãÑÚšíÆâ'+÷¦3Ö£çw4¶ƒr´Ul±W/ j­ù}N=·ÈHõ(µƒºYÙ÷Ã$b“ëûï þ[åAÙsL¬E†mkÃ&X?ôR «§Ñ{ÐÙ• y÷«Ùн\út”eÏbpûK%©ãCñ3´×‡•j!ô7**¶Á¦±Å¶J}”öÀGÔÕpeCRœUbŠfF¢šŸ uêè_8Â˯˜õÕ–ý2pÎ>°aHÞ‰¨GßYuÚþéLú3û` Å2~вÔ"ßv+¿ÜfÑ£&à0ÏÇqÇDíê$éŒEk‚ÿxhsÈÙëÑy³KÐϹr›“ ‹v…òY^Éq=pDóˆŠøöã°û¾ð q9mfY„@ªƒ¡aŽ'€ ™;vJr‰ÉtuÏPûŽ{žÅ’ð—i¹ŸT|æñ+fQíÇÃ)^»ƒßœ âNqóéÓÃhù-{ˆ¬ÚºayL‡}²=§é>Smƒ–ÃûþùCEçè¹€s¶½ß"¦ •p²ú2œº€øœkÛ·"ÉP”põ£Êæ?xe¼/á®!0™…jaC2û[CÊ:ÈÎï´šF=G¾–Á@BÁð´‰l’{ç}칋WñF¥’T6(È<`Iöª)Ä¥î¸üB,(f®Â2¯Dò6ÔµÇð^ÑxYÚ:£EpLIãp†Ž£÷œK˜ÕÆC–hÌk[û ]„­á´Ä;ÿ ^exR}‰ÙÌõ&ŽÌâð–¶W6>çÃçCÇÅ¡Á»ZÆlý£ÓÜßVh¢‚H³£”¶œ<‰o Y:ÎEʶ—dA×'j gxQß] a^"TÉ lЮ6ÓMáª÷1PeÏN÷Äš9 :ƒ—߇ê›­¼Ij)p´g`4¶9s`™Ì.pߌdËW3 9LÌñÄ…Ò5³ûäN°ä¡½›X=üÅT ÀIün#8øûÁ%þóoâ=šÓˆ^Ã1ÒA(Sf´¤.ݲ—ÁŒže×#^¬º—×ù[º7z A,?‘‘,H\];ínP~;|fx8UíãkU zÚa,ê“<%,3]û;‰BIŽ«”QÄÁ"˜«/Ylª¿Žºô'µ>5Öº>¦0€f>-·[gÊ’]zKÑqr,8ŠªNVÁœ6Tä5m{wïÙæVD˜Dýd|Ñ–ùñY µ¯ØŸfLjö¯Ö·N ö‰“R‡¬–ƒ2ûäÁ¿â³ßßNÔuÆ wÃ@Æw‡a„|?U}-‡ÕèLüŽ온På±bù‰ÔÃÜþâñ-V{ ;¤˜Õü ƒøV8»#2°&£Í%U¬ŽBa½›º¿v p@9glu 4JŒhÿF ¼#­²Þ‰™Ìf £¨aGfgã,–JöJ!m5¸ªãs0ŒuHWÁº¥WÙxBrÉ’»åÿ[7¿“º“lj]¬±þv±®w3€ ŸÝò‹†ï8õ¿÷= u¯Êm®Ô´pÕÔNRxí몎ÀrL’³OûbsïOT_WS¥oò£´ˆ@PQm9k[ØkKNXÉÅíßg òÎ8.gµ¾ØAÀæ”å4ž@磵4ÙÖYpï;Ù…À«/ZÎyË´›E÷Çmÿu¨;(7O¤d¹òPyºÐ§Ïê©iE6e\\-Hœv÷l€iìGå3;XŠJo¦Ñ>ŸR •!§Òg©Ò:ÖØÜNìüf‡ð¾ ¢­ãçð§ò<ž6¬á&âM§ò’6ŠŽ‡Ãl¹ j5ãHQñ^0.ã. M3@¡z~%3ÿ•pºq’5“yc»M.4Å(bä<òÂ"ÝË…ÑNã«{¹fS¿!!Üe3Jââ9Ú*[JUü,æ4Ư2f3R~ƒ—³£é'—ðTpWjãÅQ%»´7(ÍdœøY9c"OÄR®Š„¬¾æ°F+K¥æº²ý]›¾ÇTqküÅtß4r0ÞÞrLÐT|$·ÚÅ„¿Òˆ½´Ne:`bÁt¿m䵌ŸG{5Ce—Òà÷U™«Áƒ˜&ªìî'%«-&­½ü‰fÙ^F„Gʰû%ïÿÞ·0¶³Î3­#ŒV\+E~dˆóêÀH!ÔÇqP-P{éªKW—*4ËVúB ÍS½ª%»² ækjÔüþÐõ V>wùô\ʽ‡>ÓP ¶šÒZbaás~½åÝךU%Ü\ô¤> a&¯‹¬Ð·™{n‰¡ïN” öªËràO ”0k·1´ŸÆ‹‰´[,—Z„,rŒf]ômEáþ3åñégˆÉ•É5m1gý€\ɯ%]o-вš{@j ë,=Ú²Yê$[tÈi‡­ã¥¯UzQc6ûï὞‘‘U™y'‘H‡ teç=ápÓà…[4£PG5â踟G‚$;|þ×YÎIUÉ„ÌËš*w°Ìƒ´ƒã±JsÎxÿW0æD«Lú¼TóM>±Ë@Ê 4‹›Íã• ¥@ñ9güÝšV{#lÎQ2ö#Ýx7êáÈ-Îî§)8Þ2éÊçsí¤…Ý·ÇNÛË-j¯ßì°Q²²¨f4Hº»®ÝT„ïeJfà@C„ËppOóë¼Ì…hº4B|ÿÁva•ˆ”§Þ‰A m…ö܃aVÁ墢çê<Ç®gëó›°›sÝ¥?D¶WÏɬÔàÃoÿ;*49ÒÆWúvÒ¬J6H‹]o c"öLšÅä<Ô³Ábkªqoº:xˆ*3¬[AZÍ,í$¸%KS[Ò'j]¤êqè@ƒâφŒ¢ÈÙ?i¹b­ÔÑ£ë'(â¹ðhqü‚;Æ) áˆÄHµé²h Ý2Ùm\q_¶ÿóû3~6Y¾˜îd4;GœÝ—tðtäy>¥$ì̼>$¶ô¿á®…Ys5gv´RjæOzq­‡¾€ÀÔ=P`·;g D±Ð½uˆ«{2Ý3Î&Îï°Ø¶0’@f ›²bT{ÆtýsO–g,j“l] à@—~Ôa8šÿÙü42D‘ñÓo„Ž±ì ²úÌÒU/×ÜEŽ+$øœß°¡î (­´®Iä¨ ß±»›¨P –+~=â÷ÚˆX ‡íâôêç^\W’Uâ"ª~&²(öP{@Þ0¨áæ¥Ózs\e#þÈd¦W=?•œÊbX?é;}bxe?®rm³?*XH†Òñ8 •*]•›€¦a!–î‰Rè#)›÷¤þ* Áyí¬­´Æ¤¹ø~úWÆÔ [þ*¾h&,¼Ò–he¶ÿV°µ;ÿ·OdÈb£Îýkœ*¹)@Â7ÍÄ{íy‰ÜîG* ý2ó±e#écXš E[¼ëUm\YˆÐàΜíV5Z™} È3ò—ZU‰Ä9°\LÊd-Yø*‰4~qv4©½ŸUnU±µÞ«›b…‰Œ²¦-:†`‹:ûƒÑÐkê;œ?<‚7&4ÿÌ»#@@ÖÏÇåˆé°¾(VûÁ¦¨‘Q0aÓÎ÷´*’¶´œ(ÿ=OΊ´ôuÐùÀR=»_±0Kß¾çqY¬ÙIHcn³‘%Mö_Ó{åOû²:Ž‹Û>­€í·òï[õ@“јY™×&¼÷óÎèÕ&&ŠJÜpU W™ ½[öÆÆ€C^Ƨjyì/ÅîýeøcçD§ÚÁîç…Qô;%òdeq ÔŽh¯Ç^ÕäSÔI4È™½®eˆÙú¢¤ôl¿³]Iú%nÿÓ£zO‰Ãhj¡ª–Þ Ž€ Ò­pá`æOÇëê¦;‡À´,€ #1¼ ]‚U_WÞ+M`Ë4Õ´Äš2Â<-)›Ú¹WiçÑâƒÎZŸ8b ¡ÿãçûgs}b5W|ßœ}f} (7È[6x‹]_£½¹RjûÕ‡šx îENžé®V`1ܯ%ºÄïZ¶iŠD~éºaFf0üxŸn Gê …C4˜i®(É$à.°ÏÙ„ ì‚Û®u äQSåwQùûÜnùTŸt2Èë|©“Q–gÅŒ¥`P(ÅÅØ7…%OŸ(Z©< ÆíéÈl‚ -”ûy­™mæôȶ[tͦ ¤ c rékA}þ3´D, ˆ—r ^OùF­€›¼T%+˜ÛËoÆÕÚЉÈè4AhFz"®Ã†D_P^/Èø$b‚[b%ó[ÛM¬å®(¾koèéB„€m„ׇEsœÖ2ÞŠT]ÌwT²+?9Ñýr¹Š/s…úû³dÁ}¡~‹j#ÌYçX¦þäå†{(ZŒqK8ãIð&IlÈÃG Þ=}Ǥ›¼Ð¿â7ƒ!«.l½:¬YÑ%¶­³)‹xƒàÚ%U“1±Å¡›#AªÒÞÀÿERé~Ô?_q#)ÏÇó¾Œk7V9³‡ô-…Tã32ÌA[,}‚¡€7ÒÖ É»é6‰@ç Ê@|fÈ]–8 ¤¤>ø7¤Df¼ì˜œ½‹poÍ)H_W˜¥%~ÇãÌ•·,.úÛ÷ãŒê f›ì¾vÐÙ¦DêÑX5ÒE[×G@VƼg rb…)«òüw ›Y°9òµ4€àžð0VùÎ{¿ÙÀR•vÉjžo›ÞXŽc,£8û‘ˆ#—dÕ ð²ã;kß~pŸÈçŸbÿ3tµƒÚNE(=Œ8võZäüg¯àÊLÛ¾X‰qíÉ ±'q.€é||s,½z|:ÓR7ÑóH(xc‰ÖÍYAY`ôÆÿwQ%uâÄ÷\¥NX2¦1/ê KM7,¡qoûÈ3!Övèýíᮥ'Î o«"Í}[¼®Í0Ï4$…C<4Þ+nI P‡йbltÉúLK§¹  ååRn ¯µv¤t~k¢ –Ã¥ƒâùº°HùVãt<ÀÒ_¦T‚íÏPÝ*ªgؼV)?ëI5NSJPƒÇÃz‹ q÷Ûkì§u.w̱§ë>"wš/òÚ³ÝãüßÓº¿ü*À<[Žïþ£h20TÖM¹äÙÒPûÇ5qÜ–%´x É÷ ¤3rŠ© jÖ^°ÝykypöyŒÊ˜ ™Æh ´%±Ü¬Ô.sŸžx¯½NJäløä“r(Rzá½T}¥¶ =¢Ô覡 |þ Ò3EWTz-[¡yI¸AѾõÖY.â!NÍyªŒ¥rá] ñª&ŒÎb­Sé~¸¼ tb)¾ f ÓŤWÃú¢{1ÕpñDTbWµ~röšs[”I1ÙüAçJRŸŠCm=n¸HtàY_÷™_ÔêfjÄ Ý]o²Âàš6~j‘ï÷Æä»‰J(+Và|tµìܸ8@§¼2†x/JÈÆŽGO111Ø%}®hÚ÷ˆ€ÉV“zbкìˆ7J–‹ð´J×racn…ép_}s‹/@\—¯p"³ÏY©-’&üY©K¯BŸçŒ`RÝÈžÊPÄû4¿4HJTß fñhèÁò í v˜<®l ¡îFÕÂ÷qY*߯œNÔëdL² 3jæè¼Çñ ¿œÊ™ƒ‘FÄÕLýPéVæsŸ­ðÙÚê{3ýÇì ȼJiéø|º<—®Èc¶ ½&rÛ •n²ÉÕ®bO°ÆîàvrfÇÐ¡Š™9±YãíJàTpHȳ¥ÌqƒìîZ ¨bËñ}àU*Ú>¼÷FûÒ´ÌП½|Â]1|ç«CŸœfÌ©Jë.ÚMâÛV-‡…Çñ±Ñ±Xœ\t /®8bÎoÄÅfKûXŸ¯0ŠVrÃ|Øì 4ÿŠðã꬙`sp…„&ù8ãÏÅJFônC%Cµ4ÿAîtkÃÕë¿Ôš®W2‰nÉUo?ˆ¸  Ao\ðÜ[˜IÔÆ8ƒ]ؔ͡„’šG‹˜ЩÜý^ÍmÕH(ÄLN¬"v´¯ O4•ôG—©OÚdžS tyÜv¬Û²>˦ÎeO“8kh-êG˜0ÅIÕúH¤‹€º¿a÷€Ò”*ÿ.®y¨Ëø:ó.?+AÛmœPfÁ²U5©Ù0¢Oº\£ZùB+Qëz£€þÈôS8I´S „Eèœïáßµ&¼.÷(S8Z™1‹ÆÂñ»s©/‰-·¨ˆÂó!<Ô/ýÔ¢u3ðz¯ ›9«&p¤ä¹´rÇ!êÀ {Y] «=ÀFHo€¯Öͱ 7w&?á$sD·U¯¯Cq½ºÅÙ ÕÇ*t¬íø…bŽý¹g(üÃãǦ~ïz)…ê]øy¨~åX5¤ß‘Kéø‹~DŒƒ+}½Q `¬‰ÑU²ˆN¨Ûp¡„·è'/·‰cÁ_÷ ;Üïi]–øù7oÀѾ0ʰ¼®ýtÖ~£ËqñKU†ðr%Í^ZSe4•W®¨g¿å7"Ä›ðŽö\¼pÕ@¯É2-tªÕâõ‘8¬>™_=Á[4êûQ8 á|DW,ÆÆú•¢ËTM i xß8¢u¨(\›QRøà ÅÅv<šMï¸y­8Þ»‹ƒ …™¬p^Vô‚EƬÂc0ÞJÐg(ÞèÀ´@Ì2á t ~šÙJ¥å’ë¾0_Ð}î3f9§yR9¦ˆ ”SG—Ñ ·..2‰K.:a[Q™pWǧ¤ÜF^m¢(=`©BøÊ“™Ù &Š,¹vXáxekàlqÀ+‚®¿ÎÛQ €¡…Ì,\´S“µ˜¨2 ,ÄʹH!_:Ž÷µ†__5!Á,<³x†”dÍ´å¹"ó-‡íÇ) hè+YŠ.°šUÛ)8ˆy¶]#}‚óBp¾GŠtUoö›€CI'mN~É<,“7 êjþÙžù²H U±8H|Íÿ>˜^¿|ÌÒ[çÒ(LDª)“uÛH‚L“‹t: l$ŽWgÖˆd¾“ZJˆùõV&ª …ìoŒÓË´‘Òf7àn¯Ä» FÖ 5 IGS®àvdŽ:]á u²eÞâà0Ù4”6/)]U³’Z,IW‘ðúȯ…\d3¼½ÛS¿øÈÀyBƒ½P›ûAþ³ºŒ'äÆtçÿ^¹¸‹JXʼn8¤úÎ]€hxýÈQÌ]T–È{UÝ…@ЇMjxÌqé,³kÎ3Æù§óµIRFd“­ÂØËËV*'þÍÛzT½ë.³^‡¦v› /`!ŠæÖÕä›­o©…Â\ 3þQÃ(4öœÅük¨©%i¬*v]Æœ ,Ég³qfX²ÈX”9¡=xÙrq›ºG6‘Ïê,Œ‚q¥/$HJ0w_Á}²)F›p|Eþ+üMS¼&,v¸„ÅL3î,1ú›'ô,©ŽùL!mæV™éúmêž í6$yL•c}–Šã˜Q Ç'3´:šž¾Cî•ò¾äÛwÑ⃠7ª;¡ã Ò‚àHÿ°/.q8 }ÅXðü=8 °w/ÚÆUS›`/Èkáñ*ãø,ÙNÎmÛB}Z÷<¬|«ÓO«6ö™Ò4ÍùµUDÔ1Æ~#%ûp~ÙRnÐT8­¹¼³ kw¤¦0«°‘_Lþ-÷à¡™õû¯ðcó6;2nX(—ÈüxúEše™–£™Ë×’þ8UUB¬Eº@kŠÙ­n­slØßH’ßÄßáiøQ²-§ºÌj;tI/ŽÑÇ™õQ¡‰'ŽãJ@AsÔÇE/ÓòiÄ6äñmt{CXLAF´‚Aó;Eršgâ˜[ëÈ'Bçíýè¥8g Ö³Åd ¨‹ØäœU¼h[«Ÿ žÐ¹|éVc³ätæÐ[ýsI ‚Ï"(¸oÈj-$ïf<ä¶RIÌEÀQÒÅÞí–fç¥çüÃ5€²¢Ö†Pù{î@\cœ‚dÚÖÏÛÅ,’G· Äç bmÍ/ üª 1ð¨\ét›£¦g¢gãµF“/**ˆ"C³JÞÜ!ÍQ ìåÏu2°·Á¯²c úÆ•$Œ€J`)pŒš€ÎaÉšT o5yâROFË©(æ›H‚]پ˛šÍÕˆá1M†ƒ¶!R'þÀ;Áû²Í9ëàÚr¥î:Ù!çQéeªuýhš%¹ú1ÆåÂ䥈m9¹W¤I׺(¹‹.fžöè]Ì»·,•ØÛ†ÞD‰ŠàƒúJ…õ­.Ðìœ^*TYB.³DWik˜â3Œ–»Y Ð;8c¨­ï_F;Xq‘¸[•V?~}»›:ʾ?sô» sŒ=P6—@³ìë%sËøÚ“B*¾(°™Xåó݇´¸5ÇÞG.›;0I™žáYQ"Ú@¡'[ˆ—JíCÞù a$>bBìwä~ƶv5T¸E†) ¾³ùk™(E¡ùÛùh€y"æ•{çÔ‰7¤F÷yp Y›üÌÕ÷·¨ÚwÌãƒ"ge6àäâòŸÐÑ…Kø_ªeŸ✠£;v_ åølc4|pm;}^Ñ`¦3}Óè®d××5a&è[è)º¢5EÔ 'ËÜái!åÖòþ.Nµ¶å,h@Êu¼|¥¦~ö»,>áóÂíF•·LÿÉp8`9vÁ»¸ÜÖåNý =OHú&¡gµö*Ä™ÄH¹2ÓŒŒJò“KAëPšïaìézÿ{îD‡'&˜†(IŸîÎÇ©+U{6}*áÎl´FÛ›JÞ ÄÄÒÇçþòŸ±˜}»¤Ï 3)/à9Üõsµ e]^†ä§½£ª¨ìÄVmv%_ޤf7Ô}ûD@v›2c†@WrJÖѬaQT ‡½æ2cè4I»µGèÚAÔºjýYìcÃ¥y®W eÞ­„ÒÉâ&Ì+qE¥(§·õm­P%§•ÏqtôD¼Ù,¢L¹žl‚³‘Ʊ‘;¥8ðŸøæï¥ž_pQð·²tú8¡È{æp¿ðw´Yã‘= ªDãJI5mvãG°…ƒÒ?ï‚ϰ7ø/¯ó?t&:Ó{Ìo×´]:(ëLGÈYÏ©].X+íGþÿ²¯·ýýÌ ¥Ñúï›Éyõ®é'”0¾‹°ã+±hí‡Õ01-¡`ŒÆ¥Ë¶WÅkôù%ë†J*Þv¸۽ë̀ä;ÖY- Ù#_bâƒqTòZ1òº›¢‰q½?+¼áûBL—R”z|Ôy 9h·nÅ´ùrÓh;Ê@(2å)Þ%·råÖåa@k*M ÇU~ECeÚŽaB1q)]YŠ…g4Eñ—ˆ±H¡KVèÔ?ëùÇ=µ×æü„¼¨†´§¯Mõèº@Uo)­ƒ¢>í½ºx憀“)´xnÒ4‹‚ŠÇY5Jôz ß}§ZðU]qVwÍ ï‚/Môpé/Ì()S©£FÓ'±L~ràY•ÐòO’l?øY^îÀát% ÃŒ¹X¼BN#¹ååÜÃõr®U•þ¦ã${É_Mo¡$°~ÖL¡é¢Úª&{ÔÀ ×:XÔä.—’Z:Éæ§|Ò@ƒ"¼!¤y ¤”­û?ò³æFK¹›%uB\ç%ËÞÊ϶o &.áè®}a›:sÌÊþòßnlƒ nÅ>© £ŸMèçtûËžŒFÌÁÙ(½NYÝê)M:Í‚Â7@4ŸLpèeð£ÅÁã1™x1átÙÄòrQ‘¤¾²ó3AÚc´²_ÆR!¶YC^üÔð%ì¤%gÞššÄ÷Uór#TÒF‚ö”·Ê%[õpÒ¨<©!ï èÇWÃçs(3¬×t70å÷JqŽt›ÁWgKïÌäÕE:~ÒÂòæh½®;}jA…Í̪7ðzØ¿”áMÅ&ý¥š žâ¼{UÅ¥‰ªw¿®× Þþ7q>Q*»Dµ of wÓÙ™,Ì„™Ï¤µWÅÇ®ÖAvÖæq?ì0§~éK1<õEòì¨æëls†€uÆoí×,„ãS9§µçdOÑ”B7ië[FRƒ¥äÜòPR:áÉÔ§˜¬þÎv”š+ 3gØ[ø«l4pɵ‹”hø@Ì„>Û½¿±c%+ëñ½?θ3=HKÁÒÝ´P=Îm{4ŽÓ‘Úþv$~èË”X¼… HT©>X!T=‚¬Š¯A¡›GqP"mvæ™ø=ŠBÝ-¡iÉÿ–Ø›3¦ùíÙBõ 5hËl,ôP|}üe*vŠì­·L þÜÞa®¬m»Ÿ£¤ûÂCKnl©ž37o»9«Î󨕖´•ÕfÌ{ò³îB/Gõäçfä¤yÀ±  Ü8ŒlZN@‚ :½ȳܱ‡:»éb—m”m3éV~£Ê Š3ÏÈ’ý"œ ßú’„©›š=TtgÆÞÞ¡O§G|!|ÄÚoøcغU.²¸'—ÜÀ rýY¹›ZPßñºâ]U0Omý{ iÙœØêq=ÕÓßÐ3’÷ÿ6®¨¼æx“X|×Lìœ.*ljRXÊŽ/,I5¨ÑøÒ}bå„V¢·äâ+2×üt|Ùb t˜ñK³¦|å%?å²ä 5·KäY³zhf e_ÌT„­#¼NMÍä±l`aŠ®yöQæõ6Õæx(£7öePŠPðlÔ½è™'òe›’úëd6òV”ÉcVå—¹¼?‰g¹<¿©:©“˜<ÇÕ(Rm1¡³·ruûwü)ÝMgÑæåê}‹gCG,¤8é0"©ž„ÔþÊáá.m4  ¥µ¬V¶¦YïQ#XMZ5j;Œi‡×§X)Zý©}î`=¨žlP~8“\ ‡…#5$ ¨¢RË;;½l¾zš¿ÊàÃÆÒ}‡DWæ7³»½9®ÿ4½.[õ ÐôÂ]åu>ÁX¶_]C& MûB…™QÅö5.y€ÓßëEûÎ%¬p·áÝÅ‘¥§÷æ¹½)±î×WE0>`¬hË¿öVžÉ>‘(¼++=nÔìfÕ€»ŒÐp~ùd³ºÒüÛá?‚Ñm£ÂÂ(%sçlzX1i'A q³Èî°W%&Eå gHü¥MP¢%LY…`è³Pèäóá"e-ÆÛ?¼sˆ>ø@qYˆ«ö¥¤Ù 3l/ØõsqÖuîOr SÞõ22 ?bÂŽ7[ÿŠË#‰‡R;oŒCKûpEÉÙ»=ãÙÇ"ºÇäXX°¯¡/mð(èîNýþâû`ÊeK§ø2 ƒÊâºP&¡ž´”õÒ‚ã~‰’b”3†• Ó†ù¨]¿¬W®z''_ ˆ3ô$þG~‰Çˆ ”‰b~ª€‘ ç”” ¸Ò ¤s®rB)ê )Ouд ÚÛ»g²&ŸUþ<³n¿×ÏND@Çw¶@E´^ÒŽ–ÒRÇŸ6¹²ƒ>XjñhŸç||‹‡±SM‘®lËÞªJTЦ©Žâ(@m„œå¥s[¾À®&óß¹Á$'KH~¥ðŸôŸŒ+¬u}²ÆïeÍqU›O™K™± Sä€Ð„U½ôûzr6pÆ ô¶¨{‡žšd¼å¥7’ ®°èUuÉOM¡ü3ýè&ÔàöJ·ÉëB¹¡5Cë GK³<ÄÞ€³U·êÍÔZ™ìÊ\ÏŠ§æÞq5•Ž~f¨‚í!M®ô#4!ÿ™¼¬-TÿŒ;©¼Lå{áÚÛÀÍ‹R Ø"ܘŸ7Uw²M°g©”TpÒ¡*(¦îÎÓ$i@÷ÈKûR N Šü›jɸ G8ï¶x£xÐööHÎS½Û4ÅÒæOGªÀ VáycCï>%õ·BK.äۈ짜¯î#=ŸN8iü5މ“žâ‰A‡\3ÝŽ·ø@ãW|RRlï, ξ»¯S@Stbæ¼æFÁpy9¶‘`æ¼f¶Øt5£Ï6[hî+´ý &†ìÓ‡ª³7pä>ÊùÛZ?6ùeô%G£> X~â]óuNp éȇCê s(×(˵økL”˜aÄcY£8QtSa%³uñø›[ÔñÕ°i›b¾ÑËÍRÎ0ˆ—î¼½±°máXh°Ó0ÿ&‚÷ë0ˆÙe j¸UÓ“•®iäwÈ è¶ÕžQ‰¥j!Âì•ád÷˜øúG×.ljœy–Æ’ÒñŸ÷°üeI?bfò¯•¶ÀV~Q@)4yV¼Z~‰ãí»Üù×)(xØý—‚3CÀ2E%ÑéDÂ*<Þƒã4°µÁ%p¥èBHÚADÌŽf$àþy™ =ç+pVRhwKÏxwÀ݇‰/Õ £ìÿ±öË»Ø{ßqV' 0EÆÁ›F7Š"hö{¨ñÑVìŒ".! Á2ȽêZÃHG ïU?)©Ÿ4¾…ßö~4§€ÒR¸;|šmUrkÊ=Û¼ˆeË!õ¢AøïOÍûNTcÂñÐöØÈ-k—Á0øƒ1Ç¥ qNr~*ºæú@áçêIªºu®îc Gí ƒËw«8‚Ûhß:¯éö. Æ—Œ¬ò]ñt»RpÔR˜_%H­€¹ÿg4J-øœ›º?î³bvi…únͰÚ% ûo0j)F¥dޤL¤\m‘õé'óƒÖèþè9â³udâª÷H’ùYó°mÞ ßp1-ÕÚžDPJ£ w&L†óœä&z}ø3#º]³ ëÒë×s&üÞ9&ÞÄ%ðWvû@-òé't!v(¨Wƒ£KÛUlÈÝP/WnÐÉ![·Ü oØafMsôoŽ–2.+‘eMô5’Ó|¦¿ÑÇÏÎ å‰îkk]Cuò× @®&Êý{‰À‚¿‚[X°ãáAd&ÕéÑœÙ媟闎Q•tuµq†: Á £Z¨Å]¦V`ÎåD'rðaOÔ©k(d¡Èéýö½{ª›¬‡Íãdy*Ka $å}Y¬Y]”læo4ÊwßLBú9BDÍÖ29AUgénÔÝwu gHå?±Ô4ý«YþYòžJ6½y37½5CÒÕÀ¢&ÔRøf½…7åu^ªÓÂÙ컥+¤Ž%€fæÒ~’*­tMhSßKV%»ùï®õ¸Û©»’ÞH,µS{yÏѪߊÔ&r0­·ýÂM½ŸX·J2:Ƥ¡€ò–HûB~<,ëà{*ùŽ„æËw¯Â„»ƒ¡tò:Å–Õ Wë”}c „ÁÔFm/냅¨ÌG»è'–8 ß`­M+üE{Ùê‰l½%NPaÈ7jäØß}è -[n96CÀyªÑݱÂùNÊE¿`›j—Ç´ ´ Þ BàhËç7V<ЗU_+²)×°}‰Oë°{3NñþÉÓ×ÁF/’ñ°‚ØòÓª´tÔôw"„|ˆÉÀ¢.û}p³i·î4J,{9¼ç¿\ÇrbÖó†‹óàO7¨PR.šÖû´ö:q’_Ë÷ !‰9ÂtE=9XwZ¦ÁœÞwRkûs•s0g \ÌâÁŠüyfŸã­5éÈ5/ιZ)KfìT“eöÂ"O)ì1â0ûù)8S¶ÚiC óø]vGTÃzœ$NmlÎÏ£ˆ *“P~’Ípëvý'Åd ±q9J7Áê÷~m?Ћ•UÞ@mf´Ï­ÝWí…3ùðD"¤Bu$[ý!þÓäX/T-5;(m”/rÑ·¥ˆ]…¨Æž+ˆ.Öx‰2P€óüqlF­liñûsYæâ]¦…áQ³ÒeD–J #°Ü¤HàAæuôoâ Äkñ<<ÉbJuÀ§Ê:sª¿K±%…Q€m¦¦ât…2ö­cMJüfÒužý†ÃþRBäA¼åü?%_Ïû[ý@Oh"u¤º×§sˆ(ÝhNkNYQ)ëÓ².Íá\e'FViå*j¾àiÅÓ36§')§èmÕÚ¬h) êh˜:h¿.À‘)Kk#t3rÕi=*P9O¿0-|ä l štå¢èÔþ^Ü@?m¤cèuÛžº n8¼ÿÌù‡Œrôøe)ß:žFðàü'j–Ô߻ӂڒn„>ÏZ½O´‘Ü.J«sì=ÞáC2"d80&7uìݦp~ÙV 2FP¥1øCu-Ðlóà©-i1¤§íšÿ X—nv•j¢ôY®E@bPƒ­…î‘/³h),¨8ô Ùw Ù =-yÃ… Œ °»ŒÉÀúfƒo“qf÷˜z2´R[¬L²æ4œÅ‰¬£‰qŒ—M¨eŒìábò@ Ùd=F vÑ’C…z„R¦Wݱ£QÂèªj­fV.’  ´ù¬3÷^ÇÉ¿~x˜^ÜôåTþÖû̺« óñ“¿çó™]çЉÚΛ»£F¬ht¦-üD¸ÍõW€f}rJ_xMLdv¼Ø°qç¼4Ð;\NÆ–Ç•aº¹‡áhÇWF-]#êo˜ï½RI¶ÞŠàŒƒ 7ükbû Ôj!,õà87ç&\3œNØÊ=zËEI ñ‹êÆu†o°’ŽùÉdR7.,ÒÀ¹‘V¦ªÞpVø]¿ÁDÄšNH¬›]E´NªÅ%i´§PÇ"¯SÔ.ì)©Qh³‚W¾õ›Ø¼éd9ŒîÖ|q?蛌=ª¶®\¹j7ÅîäžñC)kÁ†@+; ÝmÙñ¦^è¿O?B'§ŒÃ3],ôuKÆO?pYŽ‘û‹fð?y¾m3!·†Y7Vìt¯¢Qœ{M!¶8:Ön{\ŠˆÑ°,V’úmÅÛº…zš$sa…-/{Ì"óxPG |¡Ü‡GLI¨+o쉛hÍS°­Y¿ÈPêI€í©=ÿýž¨*ñ¨öž¹n3£´•ò Ÿ¨›šÐå§—Orp$pÐúäð ¼2;µ<Â,¶ê¢iv;Ó‚6³}9 €ÏËbùàª[”_Ó­ÀÁpûæùm]Ps½Ê™ßY8âý6&Ÿùb „!y€ÄáPxûÛò)ÇÃŒâ%¾ºv¯#™¹K¼ ±åÞiiu2zdóvÒkZvÜ ü¥ùíi4œ‰©n¢h1ÀsDÏÛoßwvÏJïN`rŒ¾Pvr„ûÈ¡VÛôŒ¢c]×+ùh\Vm“çMùÛHŒ¤r8Y{åQÔ¸ë¾åOšXŽ«wî§@ÍL ¶zÍ\e­Ú²éB(5)2ÍÎíG¦“ƒã©ð÷û„ê´»€WÌO’ÌùÊ¢ŒŠCñAKÑXX®¨ ÚY­ßCp6'ÉÚE-Mò!l‚ø}v¨ER5Oñ“Êš7ñFÞÙ> ÂZ«+¡¿'iéÄ'Ák&º/•¾µþ“g ¤t›|xÏð4{¤'0TÈíò/}~[ùëõ“¶Uφ£Ñ ½L]˜œ·2[Ö `x§zίp`!<µ¡‰„Ø) „uPèµ~ùJ&C®y\POü¤¯ÖØ#äñ¨§iðr6‡Ç \6JÕ;‰µÐb›W’=wÁoía5`Ú0g¶o2™ß,ŽlꞸ<ìL>r*]ÐgZWŠíWsH‹lÞ}VCæ]&U(„³@OÛ‡Ãÿl(Ï™ŸjÓTùn®4m©í¸tSÙãùþPßónGÖE/ãN–,Y ž4„¿q×ãô$w„'hò·^Qü“´k3 ŠÆ#!ñ¯gï3vøÕ‰”BÉ™ŽL‚¹Ruáš™þwè3â·ÀCs[‚ƒ³ øTó®O ¤ ¡ºñï'@*/¡[öOL$ío::Å;ùþ†Šùä}Ÿ}UPHˆ•?Bn-; ÍE1*€uô¨}ª÷q[“¿Cñ2@TS„ãmp!óvmxo*©›RxÅ‚¿çí긙á²L'À9ãOü|óŠç!j—Ûüí‹IV·£â¨Ÿj”\U@X·ß4KY+[µ½Sý§²9gÔÒuc B»Ob1ÉÖÚ'âgúgGÙ ¬ö¨¬u8#º 9p{_ÝMÞ]šB%#6 F)±lÓE˜Ü¡Åt ÕìÀÀŠ9BÆÌ¯ÔyÜôFÆûŠŒØÛÚt»¦>ÕÀY@’[£Ü`Ö›BZp2ÚuÎ,dhLˆu÷5ÜŸ‡{féx˜ßÉ.¡5~ƒfO5]ñ¡ÈÐ¿Š =+¶ûÀá¹,¾¾ˆ‘2µô:È&>¼ ªûð§ÞÇVà 9ÛYE_\°Xr¦œ$×üœó›O~d’4yù ½ˆ¬ñ@ÿ>^‚¸]öËM®Ûtäæ?éÛ/Lß÷/ßuºõs¬°zþ¼ŒW¨H’æûHó½žÏŠ.7½Ãøý‚üÒÝ¿Œ:éo@YÇYªó’LÞ0n!ãðø«ÀÇåäM/kН ÞQ‘“LR<¦/á¨u¥5ô•Cé{DoÈÍ»ý ðG‹«B­¦k!þ›0AHr°|Cˆ:´LóK¢‹80ë5=çŽ{àúƒã7¿ŽË™ š¢Ÿh§h!ÐŲ —â £%,GEÙi¤”Lûžü©ÿ}ãè-¥þGë)Tœâë;…†bj²>@â¹')_Ød¼ÖÊm…Óeì‘Êð­ÃµÕO‡¤m´ÎŸ¸­ÏÑ´"@÷.²/>.{ÿS»LvàÆs è2Ü’”;¬”µN9hèþööºgˆÒ+Ú’‘›ìsñº£Íßÿ„C$ÌI© Qp"%Øx³¼tØÂAC‹T·):mØê£sàƒEvØ‹“M"—ÉߺqÚÃSJg€_ܼ†^rjgñ6ðé0DÓ) I\H`š…±ÙkÊ €ÇVç7Má;ªà%‰p®ÌÉ$q§à ðÔkMèB,‚x¶†é‚`ÆŽÞóŸµÅ30"«ne¡9Æ+³q CÂdág÷ï .Ü×@*ÓR`R…˾èKá5e½Ö‘E§š¹ëô ãä¨ç‚ðÀfüæà.ÝëEÉ·Ë )”ŒŠ hš+XxX³¶!Êï+PaŸ¢üÙ™©øc:,k}"’=m(ø6ýâsU¾Î82å g¥Ü­ˆ1QbTø¨ï&oKÎú>„ÁÆÛq-ö|ŽýœÍô(ÿbÐù¶‘àPºdâ\\3Ô±n»‘6U¨(pŒÝ.Þ½Të®ëãjé3ïEÇ\Ø'/µ¨Ô¾ÌÙ˜ËX;œÆLÂÙû\ö‡5Ç_TA•~Ü¥zœYá¹ò¯ÖPÍEAF}C¨£Eø"u'„8‘ ON¾‘醑X¯ì¨ž3qê—‚3P p+ýÓ·ÒÝû`]"q\牢89mÍ[Ò]Q(=={lß`=.[jbSô€v¶’ìï¬eáÃû ":ÉŠfMJÞß{t=»@%‰Ýbú˜<šY}"ÿrõÚ£ï2IT1úYz˘hsvë´é²ØÕ¯Eðf'Dì¶Ì½œãhó"ú6uñ8o? Œwˆ(Qö¢uP•0G@ðÓu?ÅÞîÙ8†`–êšK¨…â;l  #õ±*v k£çwÈ6I×î–âêi—=J e¢ß$MÕj 3P]îÑd–PHµ‡ÆMÅMêݾ˜Ä•}ú.ê›~èoƒìSŸ‚³%û_0xe ‰®TŽþõÛ‡éÅ¿‰©°ˆ½žÃ¶¤æ¾+&Îzòø&T^oæO(Ð/È$>SfÀf1‘‘ر ÌÅçÞÕÉ4É[½Íœ`~í>ºÙ~êµ.5):ü6ª%•èG:À]lD£\²|£vP0íã¨@é¢TU è+|zõâ¹üFD¯¢J’™»üLe¾U—¢úyJšÔ#ä?'ÖÌmtxg“uM E0…R{Y4`´Mp4 :ãÛº6'oÌZSŒ´YÎàs.ǤŠÛKRíAJÔ4p)%ùài&¬–øªá¹ yÞ¨æ š8ìUo‚´öHr_»´S3Š÷íè=)\Véó3 }•*7›fã`À¼á[Ù`&ÎÏþ¦× ¢¤pY•%J¥Ëþ‹tAÂ_ÊLqXú(‰|¤_”âþ0±ÙïNþ1š6AH(´}„£Px-6-nd¬îІ#>²I2û— "$ŠÝ €«}—ñ!,°‘ÖÎÅ7¹O(Ìf—HdQì(Þc£@·-õ·3÷´Ãæ"”E_òµÐ"˜MKïdY,<â¾OhYYRA¡«8p.ÜpVáAz q5y¤0ª¦|³,"]ï|èŒeÅÌp*û¶º†LѯlcG?pÊC»5ã>¥lÉUÏÞ·Þr¶}Ã9Tz3µ\Š-0[GFÍŒ8n$4xÚ*A».Jµ‡oT]¬+AÂT!l'~ŽT±KÚÝr&›rI‡sD­Dý—éŒGgê>`û‡_…í Üj5zg¹ÖýUÝq"ÒøQ F%r™„ðñxŸžÎ%Ú‰µLZ£˜Ôycj•9:!æbxâjnªé¤Öð Ô‚õ`î94ÏtÄG±5¨¯Þæ*Žg)Û3M×6Än$ó×Ξd[™>=ýEåˆ÷ðΧFF =U2…RÓ{í|¦ÒûWtú£zD‹RKfUßlÆ%‹›¤šI3K7[û”)RÅòÒ·2IÄ0i"*T½-U3H9l`×ÏX§¼Ì}f ¤:ß×ÏZ®ÿðs½½ a)—³†Šª¢·Ëî­ñNÁë¾I;,p˜ì@õˆ”‹æn<Øópßn`ÇÉÀî´•¾ÆÙ ©ËÖ$ÂL„Å+…ÎÉRém/ãK6*@£ÐÎÃ'…Muz%ÔPY“ðsbñÅ=,àÀð(îР½*ƪª¢Ÿ©iØ.Ã*¼hap$ÜéD¹ªÕ˜1 2tÛ™M¼à‘ÙŠü‰wJ°ín¥ Vˆów×Nô .f<7—›°ºÅwŽ]…]m†µ"u(”Ãgði-•`E Û(ÆkµÆ©þfúf_².t}kñîÒ ,6¾>Ùþy¨‘‡±Ê]d8L/R–…ùŒ8š<áÔQ] t-ËÝí<#’js—k0†Õ–ÓÕæ @|Hœìr'?b‘%ke ~"5vCCm;m¶í!.+•å‡QzvøÿfFËôºÔGQóMCëí³’ŒÉìÜL§ÜÁG‹Ôƒõ¥¡å´IFXÛY®y@StàÍ_}Vì`k[Èf½êá{$i¹u»%“¯$ 'ºKüzƉª8òQ›HX„Ö|~ŒYsøi«}8-¹°Á…EÞ×”¿aõåñs«(ÃØ¨å‰Ä¤ uˤ)щœ×€AÑ»Òü¤x—ri¼|¨ß¼óš·'R÷©£Î¼ÌÍß(ðù<^!ݼ÷ç„;tâ‡aÙÏÙ,çvâ"h×ðͤ$¢ÌJ¼ÔLxõäüÂ~ÞÜ?$‹6Wr›¤wLùE©y„”OoSyôÙ5‘ÖÚ d|{R ¢kËþX4¯é¿Þ¸]™gâC:©x1hµçÜ‚«!-ÿ‡ÉVUP%ÅÑ6é˜ 'IJ#-v«É¿GÁfû'ík²ü‹ëùš" Ane"c§’Q Ä|ZêV)XÏAx“ªÁíp:Û‚pY,ž§,cƒÐî|“†ÂÊRº2‹ÍÈ=ñÛJ—ÀÌ’¤¯ôh(KÝÉX´öb!¼,0^IHçbL8Êoz¤ñU/7SÇNâQq÷OÈðÐÝ:­æ¾®A@…ôc0¿™×e%Ãi›BðÄJÑ"óÔúËúM f:d‘mL§ïh˜ ·ÊˆŽb˜Á1z X|¹¿°oãä‹YšÌ‡ÏºIÕ.RA&g^4f.FXÏè"2åBÚÂ?^m|Ág/À£€!]Àœ•ÉRœEq¤ €ÊÄŸ ‘òlùŠÛBv_EÌ:aʶw"BËÞD@/"P:€ÈwÅÿ‹R2Q`œK9$76XÒäs´óîE•âPæ¸$øÇÎaPü¢È#$í4ÑÂ+$›&)vdçSðÆß3¾D `{ËݵŸž#kœS$ªYÚ\Oú:oDÓ‰ˆÍÓOþ~{Ô_•›ŠÄçÝ„V9aÎG]ü–Æ«í&ÆŸùÁ¸ÌNmiðw£C_Y-²“¶ö9è–väZÖÇÅåMX<1 ¹+:Ý𰀺= CK\0üìhã'ÔC5¹në²AXì„ùù4HwäƒÜOÜ…à»XñãƒòIÀÅ e=†õúÃ÷ЌԥaÕx;ãòBÖÚ¢sÕáúÕ’»½´ ¶¨¹Yfäaªly˜KÁôXY0«±­Ò˜-Ϙñº_ápr‡Ë…Ö†êlÕy)2„Z$ÛäVôdŹ0ŒE¬^ñÀ0ÒÙSŸm^ø#ŒuhE¼\âo\…n]@iØG€üŠ:«‚çEÑ›–DT:‚<Õ´YxóBUÍ[^| Ö ÅR?VoˆTÇœÀVUî±TØWÛб W…5€œI¬(®1¸ Vîø ¿¿‚×ÑS‚E=Ÿh ±$0ŠóXz(+`±+å…õfL•[²çtipL‚f÷{ŠæjÈÚ Ø3“±?­HÁzj xk¼pÔ†Ž”ø©'—ê˜u†€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n019003l.afm0000644000076500001440000007602307056046552016417 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusSanL-Regu FullName Nimbus Sans L Regular FamilyName Nimbus Sans L Weight Regular ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -151 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -174 -285 1001 953 CapHeight 729 XHeight 524 Descender -218 Ascender 729 StartCharMetrics 316 C 32 ; WX 278 ; N space ; B 191 0 191 0 ; C 33 ; WX 278 ; N exclam ; B 124 0 208 729 ; C 34 ; WX 355 ; N quotedbl ; B 52 464 305 709 ; C 35 ; WX 556 ; N numbersign ; B 14 -20 542 697 ; C 36 ; WX 556 ; N dollar ; B 26 -126 518 770 ; C 37 ; WX 889 ; N percent ; B 29 -20 859 709 ; C 38 ; WX 667 ; N ampersand ; B 52 -23 637 709 ; C 39 ; WX 221 ; N quoteright ; B 64 497 157 729 ; C 40 ; WX 333 ; N parenleft ; B 73 -212 291 729 ; C 41 ; WX 333 ; N parenright ; B 38 -212 256 729 ; C 42 ; WX 389 ; N asterisk ; B 40 441 343 729 ; C 43 ; WX 584 ; N plus ; B 50 -10 534 474 ; C 44 ; WX 278 ; N comma ; B 87 -147 192 104 ; C 45 ; WX 333 ; N hyphen ; B 46 240 284 312 ; C 46 ; WX 278 ; N period ; B 87 0 191 104 ; C 47 ; WX 278 ; N slash ; B -8 -20 284 729 ; C 48 ; WX 556 ; N zero ; B 43 -23 507 709 ; C 49 ; WX 556 ; N one ; B 102 0 347 709 ; C 50 ; WX 556 ; N two ; B 34 0 511 709 ; C 51 ; WX 556 ; N three ; B 32 -23 506 709 ; C 52 ; WX 556 ; N four ; B 28 0 520 709 ; C 53 ; WX 556 ; N five ; B 35 -23 513 709 ; C 54 ; WX 556 ; N six ; B 43 -23 513 709 ; C 55 ; WX 556 ; N seven ; B 46 0 520 709 ; C 56 ; WX 556 ; N eight ; B 37 -23 513 709 ; C 57 ; WX 556 ; N nine ; B 38 -23 509 709 ; C 58 ; WX 278 ; N colon ; B 110 0 214 524 ; C 59 ; WX 278 ; N semicolon ; B 110 -147 215 524 ; C 60 ; WX 584 ; N less ; B 45 -9 534 474 ; C 61 ; WX 584 ; N equal ; B 50 111 534 353 ; C 62 ; WX 584 ; N greater ; B 50 -9 539 474 ; C 63 ; WX 556 ; N question ; B 77 0 509 741 ; C 64 ; WX 1015 ; N at ; B 34 -142 951 741 ; C 65 ; WX 667 ; N A ; B 17 0 653 729 ; C 66 ; WX 667 ; N B ; B 79 0 623 729 ; C 67 ; WX 722 ; N C ; B 48 -23 677 741 ; C 68 ; WX 722 ; N D ; B 89 0 667 729 ; C 69 ; WX 667 ; N E ; B 90 0 613 729 ; C 70 ; WX 611 ; N F ; B 90 0 579 729 ; C 71 ; WX 778 ; N G ; B 44 -23 709 741 ; C 72 ; WX 722 ; N H ; B 83 0 644 729 ; C 73 ; WX 278 ; N I ; B 100 0 194 729 ; C 74 ; WX 500 ; N J ; B 17 -23 426 729 ; C 75 ; WX 667 ; N K ; B 79 0 658 729 ; C 76 ; WX 556 ; N L ; B 80 0 533 729 ; C 77 ; WX 833 ; N M ; B 75 0 761 729 ; C 78 ; WX 722 ; N N ; B 76 0 646 729 ; C 79 ; WX 778 ; N O ; B 38 -23 742 741 ; C 80 ; WX 667 ; N P ; B 91 0 617 729 ; C 81 ; WX 778 ; N Q ; B 38 -59 742 741 ; C 82 ; WX 722 ; N R ; B 93 0 679 729 ; C 83 ; WX 667 ; N S ; B 48 -23 621 741 ; C 84 ; WX 611 ; N T ; B 21 0 593 729 ; C 85 ; WX 722 ; N U ; B 85 -23 645 729 ; C 86 ; WX 667 ; N V ; B 30 0 645 729 ; C 87 ; WX 944 ; N W ; B 22 0 929 729 ; C 88 ; WX 667 ; N X ; B 22 0 649 729 ; C 89 ; WX 667 ; N Y ; B 13 0 661 729 ; C 90 ; WX 611 ; N Z ; B 28 0 583 729 ; C 91 ; WX 278 ; N bracketleft ; B 64 -212 250 729 ; C 92 ; WX 278 ; N backslash ; B -8 -20 284 729 ; C 93 ; WX 278 ; N bracketright ; B 23 -212 209 729 ; C 94 ; WX 469 ; N asciicircum ; B 44 329 425 709 ; C 95 ; WX 556 ; N underscore ; B -22 -176 578 -126 ; C 96 ; WX 222 ; N quoteleft ; B 65 477 158 709 ; C 97 ; WX 556 ; N a ; B 42 -23 535 539 ; C 98 ; WX 556 ; N b ; B 54 -23 523 729 ; C 99 ; WX 500 ; N c ; B 31 -23 477 539 ; C 100 ; WX 556 ; N d ; B 26 -23 495 729 ; C 101 ; WX 556 ; N e ; B 40 -23 513 539 ; C 102 ; WX 278 ; N f ; B 18 0 258 732 ; C 103 ; WX 556 ; N g ; B 29 -218 489 539 ; C 104 ; WX 556 ; N h ; B 70 0 486 729 ; C 105 ; WX 222 ; N i ; B 66 0 150 729 ; C 106 ; WX 222 ; N j ; B -18 -218 153 729 ; C 107 ; WX 500 ; N k ; B 58 0 502 729 ; C 108 ; WX 222 ; N l ; B 68 0 152 729 ; C 109 ; WX 833 ; N m ; B 70 0 762 539 ; C 110 ; WX 556 ; N n ; B 70 0 487 539 ; C 111 ; WX 556 ; N o ; B 36 -23 510 539 ; C 112 ; WX 556 ; N p ; B 54 -218 523 539 ; C 113 ; WX 556 ; N q ; B 26 -218 495 539 ; C 114 ; WX 333 ; N r ; B 69 0 321 539 ; C 115 ; WX 500 ; N s ; B 34 -23 459 539 ; C 116 ; WX 278 ; N t ; B 14 -23 254 668 ; C 117 ; WX 556 ; N u ; B 65 -23 482 524 ; C 118 ; WX 500 ; N v ; B 10 0 486 524 ; C 119 ; WX 722 ; N w ; B 6 0 708 524 ; C 120 ; WX 500 ; N x ; B 17 0 473 524 ; C 121 ; WX 500 ; N y ; B 20 -218 478 524 ; C 122 ; WX 500 ; N z ; B 31 0 457 524 ; C 123 ; WX 334 ; N braceleft ; B 43 -212 276 729 ; C 124 ; WX 260 ; N bar ; B 100 -212 160 729 ; C 125 ; WX 334 ; N braceright ; B 29 -212 262 729 ; C 126 ; WX 584 ; N asciitilde ; B 75 268 508 438 ; C 161 ; WX 333 ; N exclamdown ; B 121 -205 205 524 ; C 162 ; WX 556 ; N cent ; B 52 -120 510 628 ; C 163 ; WX 556 ; N sterling ; B 26 -23 535 729 ; C 164 ; WX 167 ; N fraction ; B -174 -20 336 709 ; C 165 ; WX 556 ; N yen ; B 11 0 545 709 ; C 166 ; WX 556 ; N florin ; B 11 -212 542 738 ; C 167 ; WX 556 ; N section ; B 43 -213 506 729 ; C 168 ; WX 556 ; N currency ; B 67 133 489 551 ; C 169 ; WX 191 ; N quotesingle ; B 48 464 142 709 ; C 170 ; WX 333 ; N quotedblleft ; B 48 477 299 709 ; C 171 ; WX 556 ; N guillemotleft ; B 98 106 455 438 ; C 172 ; WX 333 ; N guilsinglleft ; B 91 106 243 438 ; C 173 ; WX 333 ; N guilsinglright ; B 85 106 239 438 ; C 174 ; WX 500 ; N fi ; B 12 0 436 732 ; C 175 ; WX 500 ; N fl ; B 17 0 430 732 ; C 177 ; WX 556 ; N endash ; B -5 240 561 312 ; C 178 ; WX 556 ; N dagger ; B 38 -177 513 709 ; C 179 ; WX 556 ; N daggerdbl ; B 38 -177 513 709 ; C 180 ; WX 278 ; N periodcentered ; B 87 302 211 427 ; C 182 ; WX 537 ; N paragraph ; B 48 -177 522 729 ; C 183 ; WX 350 ; N bullet ; B 50 220 300 470 ; C 184 ; WX 222 ; N quotesinglbase ; B 64 -128 158 104 ; C 185 ; WX 333 ; N quotedblbase ; B 47 -128 300 104 ; C 186 ; WX 333 ; N quotedblright ; B 49 477 302 709 ; C 187 ; WX 556 ; N guillemotright ; B 98 106 451 438 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ; C 189 ; WX 1000 ; N perthousand ; B 9 -22 993 738 ; C 191 ; WX 611 ; N questiondown ; B 95 -217 528 524 ; C 193 ; WX 333 ; N grave ; B 22 592 231 740 ; C 194 ; WX 333 ; N acute ; B 92 592 301 740 ; C 195 ; WX 333 ; N circumflex ; B 20 591 307 741 ; C 196 ; WX 333 ; N tilde ; B 5 613 319 717 ; C 197 ; WX 333 ; N macron ; B 28 631 302 701 ; C 198 ; WX 333 ; N breve ; B 15 597 316 732 ; C 199 ; WX 333 ; N dotaccent ; B 115 612 219 716 ; C 200 ; WX 333 ; N dieresis ; B 30 612 296 715 ; C 202 ; WX 333 ; N ring ; B 79 579 255 754 ; C 203 ; WX 333 ; N cedilla ; B 39 -214 287 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -35 590 348 740 ; C 206 ; WX 333 ; N ogonek ; B 57 -205 265 0 ; C 207 ; WX 333 ; N caron ; B 19 591 306 741 ; C 208 ; WX 1000 ; N emdash ; B -9 240 1001 312 ; C 225 ; WX 1000 ; N AE ; B 11 0 950 729 ; C 227 ; WX 370 ; N ordfeminine ; B 37 303 333 742 ; C 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ; C 233 ; WX 778 ; N Oslash ; B 30 -23 744 755 ; C 234 ; WX 1000 ; N OE ; B 43 -20 959 741 ; C 235 ; WX 365 ; N ordmasculine ; B 40 303 324 742 ; C 241 ; WX 889 ; N ae ; B 34 -23 845 539 ; C 245 ; WX 278 ; N dotlessi ; B 94 0 178 524 ; C 248 ; WX 222 ; N lslash ; B 0 0 212 729 ; C 249 ; WX 611 ; N oslash ; B 18 -30 529 539 ; C 250 ; WX 944 ; N oe ; B 40 -23 899 539 ; C 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ; C -1 ; WX 722 ; N Udieresis ; B 85 -23 645 914 ; C -1 ; WX 722 ; N Uacute ; B 85 -23 645 939 ; C -1 ; WX 667 ; N Scedilla ; B 45 -214 621 741 ; C -1 ; WX 611 ; N Tcaron ; B 21 0 593 940 ; C -1 ; WX 667 ; N Scaron ; B 48 -23 621 940 ; C -1 ; WX 722 ; N Rcaron ; B 93 0 679 940 ; C -1 ; WX 722 ; N Racute ; B 93 0 679 939 ; C -1 ; WX 667 ; N Sacute ; B 48 -23 621 939 ; C -1 ; WX 778 ; N Otilde ; B 38 -23 742 916 ; C -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 38 -23 742 939 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 85 -23 645 939 ; C -1 ; WX 666 ; N Yacute ; B 13 0 661 939 ; C -1 ; WX 722 ; N Eth ; B 20 0 667 729 ; C -1 ; WX 722 ; N Dcroat ; B 20 0 667 729 ; C -1 ; WX 611 ; N Zacute ; B 28 0 583 939 ; C -1 ; WX 722 ; N Uring ; B 85 -23 645 953 ; C -1 ; WX 556 ; N gbreve ; B 29 -218 489 732 ; C -1 ; WX 556 ; N eogonek ; B 40 -204 514 539 ; C -1 ; WX 556 ; N edotaccent ; B 40 -23 513 716 ; C -1 ; WX 556 ; N ecaron ; B 40 -23 513 741 ; C -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ; C -1 ; WX 666 ; N Thorn ; B 91 0 616 729 ; C -1 ; WX 556 ; N eacute ; B 40 -23 513 740 ; C -1 ; WX 556 ; N edieresis ; B 40 -23 513 715 ; C -1 ; WX 635 ; N dcaron ; B 26 -23 648 729 ; C -1 ; WX 500 ; N ccedilla ; B 31 -214 477 539 ; C -1 ; WX 500 ; N ccaron ; B 31 -23 477 741 ; C -1 ; WX 500 ; N cacute ; B 31 -23 477 740 ; C -1 ; WX 556 ; N aogonek ; B 43 -205 596 539 ; C -1 ; WX 556 ; N aring ; B 42 -23 535 754 ; C -1 ; WX 556 ; N atilde ; B 42 -23 535 717 ; C -1 ; WX 556 ; N abreve ; B 42 -23 535 732 ; C -1 ; WX 556 ; N egrave ; B 40 -23 513 740 ; C -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ; C -1 ; WX 556 ; N aacute ; B 42 -23 535 740 ; C -1 ; WX 556 ; N adieresis ; B 42 -23 535 715 ; C -1 ; WX 722 ; N Uogonek ; B 85 -205 645 729 ; C -1 ; WX 556 ; N ugrave ; B 65 -23 482 740 ; C -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ; C -1 ; WX 556 ; N udieresis ; B 65 -23 482 715 ; C -1 ; WX 308 ; N tcaron ; B 14 -23 321 800 ; C -1 ; WX 500 ; N scommaaccent ; B 34 -285 459 539 ; C -1 ; WX 611 ; N Zcaron ; B 28 0 583 940 ; C -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ; C -1 ; WX 722 ; N Ucircumflex ; B 85 -23 645 940 ; C -1 ; WX 556 ; N acircumflex ; B 42 -23 535 741 ; C -1 ; WX 611 ; N Zdotaccent ; B 28 0 583 915 ; C -1 ; WX 500 ; N scaron ; B 34 -23 459 741 ; C -1 ; WX 667 ; N Amacron ; B 17 0 653 900 ; C -1 ; WX 500 ; N sacute ; B 34 -23 459 740 ; C -1 ; WX 611 ; N Tcommaaccent ; B 21 -285 593 729 ; C -1 ; WX 667 ; N Ydieresis ; B 13 0 661 914 ; C -1 ; WX 555 ; N thorn ; B 54 -218 522 714 ; C -1 ; WX 667 ; N Emacron ; B 90 0 613 900 ; C -1 ; WX 778 ; N Ograve ; B 38 -23 742 939 ; C -1 ; WX 778 ; N Oacute ; B 38 -23 742 939 ; C -1 ; WX 778 ; N Odieresis ; B 38 -23 742 914 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 646 916 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 646 940 ; C -1 ; WX 722 ; N Nacute ; B 76 0 646 939 ; C -1 ; WX 556 ; N Lcaron ; B 80 0 533 729 ; C -1 ; WX 556 ; N Lacute ; B 70 0 533 939 ; C -1 ; WX 278 ; N Idotaccent ; B 92 0 196 915 ; C -1 ; WX 333 ; N racute ; B 69 0 331 740 ; C -1 ; WX 278 ; N Icircumflex ; B -1 0 286 940 ; C -1 ; WX 556 ; N ohungarumlaut ; B 36 -23 526 740 ; C -1 ; WX 556 ; N otilde ; B 36 -23 510 717 ; C -1 ; WX 556 ; N Euro ; B 2 -23 543 709 ; C -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ; C -1 ; WX 351 ; N onesuperior ; B 61 284 222 709 ; C -1 ; WX 351 ; N twosuperior ; B 19 284 326 709 ; C -1 ; WX 351 ; N threesuperior ; B 16 270 322 709 ; C -1 ; WX 278 ; N Igrave ; B 1 0 210 939 ; C -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ; C -1 ; WX 278 ; N Imacron ; B 20 0 274 900 ; C -1 ; WX 278 ; N Iogonek ; B 66 -204 234 729 ; C -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ; C -1 ; WX 778 ; N Gbreve ; B 44 -23 709 931 ; C -1 ; WX 722 ; N Umacron ; B 85 -23 645 900 ; C -1 ; WX 667 ; N Kcommaaccent ; B 79 -285 658 729 ; C -1 ; WX 556 ; N ograve ; B 36 -23 510 740 ; C -1 ; WX 667 ; N Scommaaccent ; B 48 -285 621 741 ; C -1 ; WX 667 ; N Eogonek ; B 90 -205 652 729 ; C -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ; C -1 ; WX 667 ; N Edotaccent ; B 90 0 613 915 ; C -1 ; WX 222 ; N iogonek ; B 25 -204 190 729 ; C -1 ; WX 556 ; N gcommaaccent ; B 29 -218 489 817 ; C -1 ; WX 556 ; N odieresis ; B 36 -23 510 715 ; C -1 ; WX 556 ; N ntilde ; B 70 0 487 717 ; C -1 ; WX 556 ; N ncaron ; B 70 0 487 741 ; C -1 ; WX 667 ; N Ecaron ; B 90 0 613 940 ; C -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ; C -1 ; WX 500 ; N scedilla ; B 34 -214 459 539 ; C -1 ; WX 333 ; N rcaron ; B 48 0 335 741 ; C -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ; C -1 ; WX 667 ; N Eacute ; B 90 0 613 939 ; C -1 ; WX 778 ; N Gcommaaccent ; B 44 -285 709 741 ; C -1 ; WX 722 ; N Rcommaaccent ; B 93 -285 679 729 ; C -1 ; WX 667 ; N Edieresis ; B 90 0 613 914 ; C -1 ; WX 556 ; N nacute ; B 70 0 487 740 ; C -1 ; WX 556 ; N uogonek ; B 65 -204 521 524 ; C -1 ; WX 556 ; N umacron ; B 65 -23 482 701 ; C -1 ; WX 722 ; N Dcaron ; B 89 0 667 940 ; C -1 ; WX 292 ; N lcaron ; B 68 0 305 729 ; C -1 ; WX 722 ; N Ccaron ; B 48 -23 677 940 ; C -1 ; WX 722 ; N Cacute ; B 48 -23 677 939 ; C -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ; C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; C -1 ; WX 667 ; N Aogonek ; B 17 -205 692 729 ; C -1 ; WX 584 ; N minus ; B 40 197 544 267 ; C -1 ; WX 584 ; N multiply ; B 95 34 488 427 ; C -1 ; WX 584 ; N divide ; B 50 0 534 472 ; C -1 ; WX 667 ; N Aring ; B 17 0 653 953 ; C -1 ; WX 1000 ; N trademark ; B 63 292 938 729 ; C -1 ; WX 333 ; N rcommaaccent ; B 65 -285 321 539 ; C -1 ; WX 222 ; N lacute ; B 63 0 272 939 ; C -1 ; WX 556 ; N omacron ; B 36 -23 510 701 ; C -1 ; WX 667 ; N Atilde ; B 17 0 653 916 ; C -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ; C -1 ; WX 278 ; N igrave ; B -5 0 204 740 ; C -1 ; WX 556 ; N ncommaaccent ; B 70 -285 487 539 ; C -1 ; WX 222 ; N lcommaaccent ; B 63 -285 163 729 ; C -1 ; WX 584 ; N plusminus ; B 50 -11 534 623 ; C -1 ; WX 869 ; N onehalf ; B 61 -20 844 709 ; C -1 ; WX 869 ; N onequarter ; B 61 -20 849 709 ; C -1 ; WX 869 ; N threequarters ; B 16 -20 849 709 ; C -1 ; WX 278 ; N iacute ; B 65 0 274 740 ; C -1 ; WX 667 ; N Abreve ; B 17 0 653 931 ; C -1 ; WX 500 ; N kcommaaccent ; B 58 -285 502 729 ; C -1 ; WX 778 ; N Omacron ; B 38 -23 742 900 ; C -1 ; WX 222 ; N imacron ; B -16 0 231 701 ; C -1 ; WX 556 ; N emacron ; B 40 -23 513 701 ; C -1 ; WX 556 ; N amacron ; B 42 -23 535 701 ; C -1 ; WX 278 ; N tcommaaccent ; B 14 -285 254 668 ; C -1 ; WX 500 ; N ydieresis ; B 20 -218 478 715 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 457 716 ; C -1 ; WX 500 ; N zcaron ; B 31 0 457 741 ; C -1 ; WX 500 ; N zacute ; B 31 0 457 740 ; C -1 ; WX 500 ; N yacute ; B 20 -218 478 740 ; C -1 ; WX 556 ; N uhungarumlaut ; B 65 -23 530 740 ; C -1 ; WX 556 ; N eth ; B 36 -23 510 743 ; C -1 ; WX 556 ; N uring ; B 65 -23 482 754 ; C -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ; C -1 ; WX 333 ; N commaaccent ; B 116 -285 216 -60 ; C -1 ; WX 737 ; N copyright ; B -13 -22 751 742 ; C -1 ; WX 737 ; N registered ; B -13 -22 751 742 ; C -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ; C -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ; C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; C -1 ; WX 711 ; N Delta ; B 10 0 701 729 ; C -1 ; WX 548 ; N notequal ; B 32 -25 516 486 ; C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; C -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ; C -1 ; WX 667 ; N Aacute ; B 17 0 653 939 ; C -1 ; WX 584 ; N lessequal ; B 45 -11 534 639 ; C -1 ; WX 584 ; N greaterequal ; B 45 -11 534 639 ; C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; C -1 ; WX 711 ; N summation ; B 17 -97 694 760 ; C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -285 646 729 ; C -1 ; WX 556 ; N dcroat ; B 26 -23 557 729 ; C -1 ; WX 260 ; N brokenbar ; B 100 -212 160 729 ; C -1 ; WX 556 ; N Lcommaaccent ; B 80 -285 533 729 ; C -1 ; WX 667 ; N Adieresis ; B 17 0 653 914 ; C -1 ; WX 556 ; N mu ; B 65 -220 544 524 ; C -1 ; WX 278 ; N .notdef ; B 191 0 191 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -36 KPX A Ccedilla -36 KPX A G -35 KPX A O -33 KPX A Odieresis -33 KPX A Q -32 KPX A T -93 KPX A U -37 KPX A Uacute -37 KPX A Ucircumflex -37 KPX A Udieresis -37 KPX A Ugrave -37 KPX A V -75 KPX A W -51 KPX A Y -99 KPX A a -4 KPX A b 4 KPX A c -11 KPX A ccedilla -10 KPX A comma 5 KPX A d -8 KPX A e -16 KPX A g -10 KPX A guillemotleft -44 KPX A guilsinglleft -40 KPX A hyphen -3 KPX A o -13 KPX A period 5 KPX A q -8 KPX A quotedblright -56 KPX A quoteright -65 KPX A t -16 KPX A u -12 KPX A v -31 KPX A w -21 KPX A y -34 KPX Aacute C -36 KPX Aacute G -35 KPX Aacute O -33 KPX Aacute Q -32 KPX Aacute T -93 KPX Aacute U -37 KPX Aacute V -75 KPX Aacute W -51 KPX Aacute Y -99 KPX Aacute a -4 KPX Aacute b 4 KPX Aacute c -11 KPX Aacute comma 5 KPX Aacute d -8 KPX Aacute e -16 KPX Aacute g -10 KPX Aacute guillemotleft -44 KPX Aacute guilsinglleft -40 KPX Aacute hyphen -3 KPX Aacute o -13 KPX Aacute period 5 KPX Aacute q -8 KPX Aacute quoteright -65 KPX Aacute t -16 KPX Aacute u -12 KPX Aacute v -31 KPX Aacute w -21 KPX Aacute y -34 KPX Acircumflex C -36 KPX Acircumflex G -35 KPX Acircumflex O -33 KPX Acircumflex Q -32 KPX Acircumflex T -93 KPX Acircumflex U -37 KPX Acircumflex V -75 KPX Acircumflex W -51 KPX Acircumflex Y -99 KPX Acircumflex comma 5 KPX Acircumflex period 5 KPX Adieresis C -36 KPX Adieresis G -35 KPX Adieresis O -33 KPX Adieresis Q -32 KPX Adieresis T -93 KPX Adieresis U -37 KPX Adieresis V -75 KPX Adieresis W -51 KPX Adieresis Y -99 KPX Adieresis a -4 KPX Adieresis b 4 KPX Adieresis c -11 KPX Adieresis comma 5 KPX Adieresis d -8 KPX Adieresis g -10 KPX Adieresis guillemotleft -44 KPX Adieresis guilsinglleft -40 KPX Adieresis hyphen -3 KPX Adieresis o -13 KPX Adieresis period 5 KPX Adieresis q -8 KPX Adieresis quotedblright -56 KPX Adieresis quoteright -65 KPX Adieresis t -16 KPX Adieresis u -12 KPX Adieresis v -31 KPX Adieresis w -21 KPX Adieresis y -34 KPX Agrave C -36 KPX Agrave G -35 KPX Agrave O -33 KPX Agrave Q -32 KPX Agrave T -93 KPX Agrave U -37 KPX Agrave V -75 KPX Agrave W -51 KPX Agrave Y -99 KPX Agrave comma 5 KPX Agrave period 5 KPX Aring C -36 KPX Aring G -35 KPX Aring O -33 KPX Aring Q -32 KPX Aring T -93 KPX Aring U -37 KPX Aring V -75 KPX Aring W -51 KPX Aring Y -99 KPX Aring a -4 KPX Aring b 4 KPX Aring c -11 KPX Aring comma 5 KPX Aring d -8 KPX Aring e -16 KPX Aring g -10 KPX Aring guillemotleft -44 KPX Aring guilsinglleft -40 KPX Aring hyphen -3 KPX Aring o -13 KPX Aring period 5 KPX Aring q -8 KPX Aring quotedblright -56 KPX Aring quoteright -65 KPX Aring t -16 KPX Aring u -12 KPX Aring v -31 KPX Aring w -21 KPX Aring y -34 KPX Atilde C -36 KPX Atilde G -35 KPX Atilde O -33 KPX Atilde Q -32 KPX Atilde T -93 KPX Atilde U -37 KPX Atilde V -75 KPX Atilde W -51 KPX Atilde Y -99 KPX Atilde comma 5 KPX Atilde period 5 KPX B A -21 KPX B AE -21 KPX B Aacute -21 KPX B Acircumflex -21 KPX B Adieresis -21 KPX B Aring -21 KPX B Atilde -21 KPX B O -7 KPX B OE -5 KPX B Oacute -7 KPX B Ocircumflex -7 KPX B Odieresis -7 KPX B Ograve -7 KPX B Oslash -1 KPX B V -41 KPX B W -25 KPX B Y -44 KPX C A -32 KPX C AE -33 KPX C Aacute -32 KPX C Adieresis -32 KPX C Aring -32 KPX C H -12 KPX C K -10 KPX C O -8 KPX C Oacute -8 KPX C Odieresis -8 KPX Ccedilla A -31 KPX D A -42 KPX D Aacute -42 KPX D Acircumflex -42 KPX D Adieresis -42 KPX D Agrave -42 KPX D Aring -42 KPX D Atilde -42 KPX D J -5 KPX D T -45 KPX D V -51 KPX D W -29 KPX D X -53 KPX D Y -63 KPX F A -69 KPX F Aacute -69 KPX F Acircumflex -69 KPX F Adieresis -69 KPX F Agrave -69 KPX F Aring -69 KPX F Atilde -69 KPX F J -51 KPX F O -22 KPX F Odieresis -22 KPX F a -33 KPX F aacute -33 KPX F adieresis -33 KPX F ae -29 KPX F aring -33 KPX F comma -108 KPX F e -24 KPX F eacute -24 KPX F hyphen -14 KPX F i -10 KPX F j -12 KPX F o -21 KPX F oacute -21 KPX F odieresis -21 KPX F oe -23 KPX F oslash -21 KPX F period -108 KPX F r -35 KPX F u -33 KPX G A -6 KPX G AE -3 KPX G Aacute -6 KPX G Acircumflex -6 KPX G Adieresis -6 KPX G Agrave -6 KPX G Aring -6 KPX G Atilde -6 KPX G T -44 KPX G V -50 KPX G W -28 KPX G Y -62 KPX J A -32 KPX J AE -31 KPX J Adieresis -32 KPX J Aring -32 KPX K C -51 KPX K G -51 KPX K O -48 KPX K OE -45 KPX K Oacute -48 KPX K Odieresis -48 KPX K S -38 KPX K T 20 KPX K a -11 KPX K adieresis -11 KPX K ae -7 KPX K aring -11 KPX K e -32 KPX K hyphen -47 KPX K o -29 KPX K oacute -29 KPX K odieresis -29 KPX K u -19 KPX K udieresis -19 KPX K y -62 KPX L A 17 KPX L AE 20 KPX L Aacute 17 KPX L Adieresis 17 KPX L Aring 17 KPX L C -41 KPX L Ccedilla -37 KPX L G -42 KPX L O -41 KPX L Oacute -41 KPX L Ocircumflex -41 KPX L Odieresis -41 KPX L Ograve -41 KPX L Otilde -41 KPX L S -19 KPX L T -105 KPX L U -35 KPX L Udieresis -35 KPX L V -105 KPX L W -68 KPX L Y -121 KPX L hyphen -125 KPX L quotedblright -141 KPX L quoteright -149 KPX L u -7 KPX L udieresis -7 KPX L y -56 KPX N A -9 KPX N AE -6 KPX N Aacute -9 KPX N Adieresis -9 KPX N Aring -9 KPX N C -3 KPX N Ccedilla -3 KPX N G -2 KPX N O 0 KPX N Oacute 0 KPX N Odieresis 0 KPX N a -5 KPX N aacute -5 KPX N adieresis -5 KPX N ae -2 KPX N aring -5 KPX N comma -7 KPX N e 0 KPX N eacute 0 KPX N o 2 KPX N oacute 2 KPX N odieresis 2 KPX N oslash 4 KPX N period -7 KPX N u 0 KPX N udieresis 0 KPX O A -35 KPX O AE -39 KPX O Aacute -35 KPX O Adieresis -35 KPX O Aring -35 KPX O T -42 KPX O V -45 KPX O W -23 KPX O X -46 KPX O Y -59 KPX Oacute A -35 KPX Oacute T -42 KPX Oacute V -45 KPX Oacute W -23 KPX Oacute Y -59 KPX Ocircumflex T -42 KPX Ocircumflex V -45 KPX Ocircumflex Y -59 KPX Odieresis A -35 KPX Odieresis T -42 KPX Odieresis V -45 KPX Odieresis W -23 KPX Odieresis X -46 KPX Odieresis Y -59 KPX Ograve T -42 KPX Ograve V -45 KPX Ograve Y -59 KPX Oslash A -33 KPX Otilde T -42 KPX Otilde V -45 KPX Otilde Y -59 KPX P A -78 KPX P AE -86 KPX P Aacute -78 KPX P Adieresis -78 KPX P Aring -78 KPX P J -78 KPX P a -28 KPX P aacute -28 KPX P adieresis -28 KPX P ae -24 KPX P aring -28 KPX P comma -135 KPX P e -31 KPX P eacute -31 KPX P hyphen -40 KPX P o -27 KPX P oacute -27 KPX P odieresis -27 KPX P oe -28 KPX P oslash -27 KPX P period -135 KPX R C -16 KPX R Ccedilla -16 KPX R G -15 KPX R O -13 KPX R OE -11 KPX R Oacute -13 KPX R Odieresis -13 KPX R T -23 KPX R U -17 KPX R Udieresis -17 KPX R V -39 KPX R W -27 KPX R Y -43 KPX R a -15 KPX R aacute -15 KPX R adieresis -15 KPX R ae -12 KPX R aring -15 KPX R e -12 KPX R eacute -12 KPX R hyphen -2 KPX R o -9 KPX R oacute -9 KPX R odieresis -9 KPX R oe -11 KPX R u -9 KPX R uacute -9 KPX R udieresis -9 KPX R y -8 KPX S A -22 KPX S AE -22 KPX S Aacute -22 KPX S Adieresis -22 KPX S Aring -22 KPX S T -28 KPX S V -42 KPX S W -28 KPX S Y -48 KPX S t -3 KPX T A -95 KPX T AE -97 KPX T Aacute -95 KPX T Acircumflex -95 KPX T Adieresis -95 KPX T Agrave -95 KPX T Aring -95 KPX T Atilde -95 KPX T C -44 KPX T G -45 KPX T J -100 KPX T O -42 KPX T OE -35 KPX T Oacute -42 KPX T Ocircumflex -42 KPX T Odieresis -42 KPX T Ograve -42 KPX T Oslash -41 KPX T Otilde -42 KPX T S -24 KPX T V 12 KPX T W 16 KPX T Y 20 KPX T a -100 KPX T ae -97 KPX T c -90 KPX T colon -133 KPX T comma -100 KPX T e -95 KPX T g -89 KPX T guillemotleft -121 KPX T guilsinglleft -117 KPX T hyphen -77 KPX T i -3 KPX T j -5 KPX T o -92 KPX T oslash -87 KPX T period -100 KPX T r -92 KPX T s -92 KPX T semicolon -129 KPX T u -91 KPX T v -95 KPX T w -93 KPX T y -100 KPX U A -36 KPX U AE -39 KPX U Aacute -36 KPX U Acircumflex -36 KPX U Adieresis -36 KPX U Aring -36 KPX U Atilde -36 KPX U comma -27 KPX U m -4 KPX U n -4 KPX U p 3 KPX U period -25 KPX U r -4 KPX Uacute A -36 KPX Uacute comma -27 KPX Uacute m -4 KPX Uacute n -4 KPX Uacute p 3 KPX Uacute period -25 KPX Uacute r -4 KPX Ucircumflex A -36 KPX Udieresis A -36 KPX Udieresis b 3 KPX Udieresis comma -27 KPX Udieresis m -4 KPX Udieresis n -4 KPX Udieresis p 3 KPX Udieresis period -25 KPX Udieresis r -4 KPX Ugrave A -36 KPX V A -71 KPX V AE -78 KPX V Aacute -71 KPX V Acircumflex -71 KPX V Adieresis -71 KPX V Agrave -71 KPX V Aring -71 KPX V Atilde -71 KPX V C -43 KPX V G -42 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Oslash -33 KPX V Otilde -40 KPX V S -35 KPX V T 15 KPX V a -59 KPX V ae -55 KPX V colon -66 KPX V comma -89 KPX V e -57 KPX V g -50 KPX V guillemotleft -83 KPX V guilsinglleft -80 KPX V hyphen -38 KPX V i -5 KPX V o -54 KPX V oslash -50 KPX V period -89 KPX V r -42 KPX V semicolon -66 KPX V u -41 KPX V y -20 KPX W A -50 KPX W AE -56 KPX W Aacute -50 KPX W Acircumflex -50 KPX W Adieresis -50 KPX W Agrave -50 KPX W Aring -50 KPX W Atilde -50 KPX W C -23 KPX W G -22 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Oslash -13 KPX W Otilde -20 KPX W S -24 KPX W T 19 KPX W a -38 KPX W ae -34 KPX W colon -52 KPX W comma -56 KPX W e -32 KPX W g -25 KPX W guillemotleft -58 KPX W guilsinglleft -54 KPX W hyphen -13 KPX W i -1 KPX W o -29 KPX W oslash -25 KPX W period -56 KPX W r -28 KPX W semicolon -53 KPX W u -28 KPX W y -6 KPX X C -48 KPX X O -45 KPX X Odieresis -45 KPX X Q -44 KPX X a -15 KPX X e -36 KPX X hyphen -51 KPX X o -33 KPX X u -24 KPX X y -61 KPX Y A -96 KPX Y AE -103 KPX Y Aacute -96 KPX Y Acircumflex -96 KPX Y Adieresis -96 KPX Y Agrave -96 KPX Y Aring -96 KPX Y Atilde -96 KPX Y C -58 KPX Y G -58 KPX Y O -56 KPX Y Oacute -56 KPX Y Ocircumflex -56 KPX Y Odieresis -56 KPX Y Ograve -56 KPX Y Oslash -54 KPX Y Otilde -56 KPX Y S -41 KPX Y T 23 KPX Y a -88 KPX Y ae -84 KPX Y colon -87 KPX Y comma -111 KPX Y e -89 KPX Y g -83 KPX Y guillemotleft -123 KPX Y guilsinglleft -119 KPX Y hyphen -84 KPX Y i 3 KPX Y o -86 KPX Y oslash -82 KPX Y p -54 KPX Y period -111 KPX Y semicolon -88 KPX Y u -63 KPX Y v -36 KPX Z v -33 KPX Z y -38 KPX a j -4 KPX a quoteright -23 KPX a v -21 KPX a w -13 KPX a y -26 KPX aacute v -21 KPX aacute w -13 KPX aacute y -26 KPX adieresis v -21 KPX adieresis w -13 KPX adieresis y -26 KPX ae v -16 KPX ae w -10 KPX ae y -20 KPX agrave v -21 KPX agrave w -13 KPX agrave y -26 KPX aring v -21 KPX aring w -13 KPX aring y -26 KPX b v -11 KPX b w -3 KPX b y -15 KPX c h 1 KPX c k 7 KPX comma one -100 KPX comma quotedblright -41 KPX comma quoteright -50 KPX e quoteright -18 KPX e t -10 KPX e v -15 KPX e w -9 KPX e x -27 KPX e y -19 KPX eacute v -15 KPX eacute w -9 KPX eacute y -19 KPX ecircumflex v -15 KPX ecircumflex w -9 KPX ecircumflex y -19 KPX eight four 1 KPX eight one -48 KPX eight seven -33 KPX f a -9 KPX f aacute -9 KPX f adieresis -9 KPX f ae -5 KPX f aring -9 KPX f e -15 KPX f eacute -15 KPX f f 22 KPX f i -2 KPX f j -4 KPX f l -3 KPX f o -10 KPX f oacute -10 KPX f odieresis -10 KPX f oe -12 KPX f oslash -9 KPX f quoteright 0 KPX f s 0 KPX f t 24 KPX five four 1 KPX five one -76 KPX five seven -26 KPX four four 5 KPX four one -84 KPX four seven -56 KPX g a -5 KPX g adieresis -5 KPX g ae -1 KPX g aring -5 KPX g e 0 KPX g eacute 0 KPX g l 0 KPX g oacute 3 KPX g odieresis 3 KPX g r 0 KPX guillemotright A -50 KPX guillemotright AE -54 KPX guillemotright Aacute -50 KPX guillemotright Adieresis -50 KPX guillemotright Aring -50 KPX guillemotright T -126 KPX guillemotright V -93 KPX guillemotright W -66 KPX guillemotright Y -133 KPX guilsinglright A -44 KPX guilsinglright AE -48 KPX guilsinglright Aacute -44 KPX guilsinglright Adieresis -44 KPX guilsinglright Aring -44 KPX guilsinglright T -121 KPX guilsinglright V -88 KPX guilsinglright W -60 KPX guilsinglright Y -128 KPX h quoteright -15 KPX h y -18 KPX hyphen A -7 KPX hyphen AE -11 KPX hyphen Aacute -7 KPX hyphen Adieresis -7 KPX hyphen Aring -7 KPX hyphen T -80 KPX hyphen V -46 KPX hyphen W -19 KPX hyphen Y -92 KPX i T -7 KPX i j -3 KPX k a -2 KPX k aacute -2 KPX k adieresis -2 KPX k ae 2 KPX k aring -2 KPX k comma 0 KPX k e -21 KPX k eacute -21 KPX k g -16 KPX k hyphen -41 KPX k o -19 KPX k oacute -19 KPX k odieresis -19 KPX k period 0 KPX k s -3 KPX k u -11 KPX k udieresis -6 KPX l v 0 KPX l y -5 KPX m p 5 KPX m v -13 KPX m w -7 KPX m y -18 KPX n T -96 KPX n p 5 KPX n quoteright -14 KPX n v -13 KPX n w -7 KPX n y -18 KPX nine four -3 KPX nine one -43 KPX nine seven -37 KPX o T -99 KPX o quoteright -21 KPX o t -10 KPX o v -18 KPX o w -10 KPX o x -27 KPX o y -22 KPX oacute v -18 KPX oacute w -10 KPX oacute y -22 KPX ocircumflex t -10 KPX odieresis t -10 KPX odieresis v -18 KPX odieresis w -10 KPX odieresis x -27 KPX odieresis y -22 KPX ograve v -18 KPX ograve w -10 KPX ograve y -22 KPX one comma -74 KPX one eight -65 KPX one five -67 KPX one four -81 KPX one nine -65 KPX one one -118 KPX one period -74 KPX one seven -90 KPX one six -62 KPX one three -67 KPX one two -69 KPX one zero -62 KPX p t -4 KPX p y -16 KPX period one -101 KPX period quotedblright -41 KPX period quoteright -51 KPX q c 8 KPX q u 4 KPX quotedblbase A 30 KPX quotedblbase AE 30 KPX quotedblbase T -75 KPX quotedblbase V -69 KPX quotedblbase W -34 KPX quotedblbase Y -91 KPX quotedblleft A -52 KPX quotedblleft AE -64 KPX quotedblleft Aacute -52 KPX quotedblleft Adieresis -52 KPX quotedblleft Aring -52 KPX quotedblleft T 9 KPX quotedblleft V 15 KPX quotedblleft W 27 KPX quotedblleft Y 5 KPX quotedblright A -53 KPX quotedblright AE -66 KPX quotedblright Aacute -53 KPX quotedblright Adieresis -53 KPX quotedblright Aring -53 KPX quotedblright T 11 KPX quotedblright V 15 KPX quotedblright W 26 KPX quotedblright Y 7 KPX quoteleft A -67 KPX quoteleft AE -79 KPX quoteleft Aacute -67 KPX quoteleft Adieresis -67 KPX quoteleft Aring -67 KPX quoteleft T -5 KPX quoteleft V 0 KPX quoteleft W 12 KPX quoteleft Y -9 KPX quoteright A -72 KPX quoteright AE -85 KPX quoteright Aacute -72 KPX quoteright Adieresis -72 KPX quoteright Aring -72 KPX quoteright comma -60 KPX quoteright d -20 KPX quoteright o -26 KPX quoteright period -60 KPX quoteright r -18 KPX quoteright s -18 KPX quoteright t -7 KPX quoteright v -2 KPX quoteright w 2 KPX quoteright y -6 KPX r a -5 KPX r aacute -5 KPX r acircumflex -5 KPX r adieresis -5 KPX r ae -1 KPX r agrave -5 KPX r aring -5 KPX r c -6 KPX r ccedilla -9 KPX r colon -22 KPX r comma -69 KPX r d -1 KPX r e -11 KPX r eacute -11 KPX r ecircumflex -11 KPX r egrave -11 KPX r f 26 KPX r g -4 KPX r h 0 KPX r hyphen -47 KPX r i 1 KPX r j 0 KPX r k 6 KPX r l 1 KPX r m 0 KPX r n 0 KPX r o -6 KPX r oacute -6 KPX r ocircumflex -6 KPX r odieresis -6 KPX r oe -8 KPX r ograve -6 KPX r oslash -6 KPX r p 8 KPX r period -69 KPX r q -3 KPX r quoteright 1 KPX r r 0 KPX r s 4 KPX r semicolon -22 KPX r t 28 KPX r u 2 KPX r v 29 KPX r w 31 KPX r x 20 KPX r y 24 KPX r z 9 KPX s quoteright -22 KPX s t -3 KPX seven colon -77 KPX seven comma -119 KPX seven eight -28 KPX seven five -30 KPX seven four -93 KPX seven one -53 KPX seven period -119 KPX seven seven -4 KPX seven six -40 KPX seven three -23 KPX seven two -28 KPX six four 1 KPX six one -43 KPX six seven -30 KPX t S -8 KPX t a -1 KPX t aacute -1 KPX t adieresis -1 KPX t ae 2 KPX t aring -1 KPX t colon -28 KPX t e -14 KPX t eacute -14 KPX t h -3 KPX t o -12 KPX t oacute -12 KPX t odieresis -12 KPX t quoteright -1 KPX t semicolon -28 KPX three four -2 KPX three one -49 KPX three seven -33 KPX two four -37 KPX two one -36 KPX two seven -25 KPX u quoteright -8 KPX v a -18 KPX v aacute -18 KPX v acircumflex -18 KPX v adieresis -18 KPX v ae -14 KPX v agrave -18 KPX v aring -18 KPX v atilde -18 KPX v c -16 KPX v colon -23 KPX v comma -69 KPX v e -21 KPX v eacute -21 KPX v ecircumflex -21 KPX v egrave -21 KPX v g -14 KPX v hyphen -12 KPX v l 0 KPX v o -17 KPX v oacute -17 KPX v odieresis -17 KPX v ograve -17 KPX v oslash -17 KPX v period -69 KPX v s -9 KPX v semicolon -23 KPX w a -15 KPX w aacute -15 KPX w acircumflex -15 KPX w adieresis -15 KPX w ae -11 KPX w agrave -15 KPX w aring -15 KPX w atilde -15 KPX w c -7 KPX w colon -23 KPX w comma -50 KPX w e -12 KPX w eacute -12 KPX w ecircumflex -12 KPX w egrave -12 KPX w g -6 KPX w hyphen -1 KPX w l 0 KPX w o -9 KPX w oacute -9 KPX w odieresis -9 KPX w ograve -9 KPX w oslash -6 KPX w period -50 KPX w s -5 KPX w semicolon -23 KPX x a -17 KPX x c -23 KPX x e -28 KPX x eacute -28 KPX x o -25 KPX x q -20 KPX y a -22 KPX y aacute -22 KPX y acircumflex -22 KPX y adieresis -22 KPX y ae -18 KPX y agrave -22 KPX y aring -22 KPX y atilde -22 KPX y c -19 KPX y colon -27 KPX y comma -70 KPX y e -24 KPX y eacute -24 KPX y ecircumflex -24 KPX y egrave -24 KPX y g -17 KPX y hyphen -14 KPX y l -4 KPX y o -20 KPX y oacute -20 KPX y odieresis -20 KPX y ograve -20 KPX y oslash -19 KPX y period -70 KPX y s -12 KPX y semicolon -27 KPX zero four -2 KPX zero one -46 KPX zero seven -39 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n022024l.afm0000644000076500001440000007633107056046554016420 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusMonL-BoldObli FullName Nimbus Mono L Bold Oblique FamilyName Nimbus Mono L Weight Bold ItalicAngle -12.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -61 -278 840 871 CapHeight 583 XHeight 437 Descender -205 Ascender 624 StartCharMetrics 316 C 32 ; WX 600 ; N space ; B 386 0 386 0 ; C 33 ; WX 600 ; N exclam ; B 234 -15 501 638 ; C 34 ; WX 600 ; N quotedbl ; B 243 312 592 602 ; C 35 ; WX 600 ; N numbersign ; B 101 -92 623 675 ; C 36 ; WX 600 ; N dollar ; B 100 -123 610 684 ; C 37 ; WX 600 ; N percent ; B 131 -15 599 617 ; C 38 ; WX 600 ; N ampersand ; B 102 -14 557 550 ; C 39 ; WX 600 ; N quoteright ; B 222 331 483 623 ; C 40 ; WX 600 ; N parenleft ; B 304 -153 613 632 ; C 41 ; WX 600 ; N parenright ; B 94 -153 403 632 ; C 42 ; WX 600 ; N asterisk ; B 178 208 614 622 ; C 43 ; WX 600 ; N plus ; B 101 0 619 560 ; C 44 ; WX 600 ; N comma ; B 118 -158 379 134 ; C 45 ; WX 600 ; N hyphen ; B 101 229 619 329 ; C 46 ; WX 600 ; N period ; B 234 -15 387 117 ; C 47 ; WX 600 ; N slash ; B 69 -113 656 695 ; C 48 ; WX 600 ; N zero ; B 130 -15 602 638 ; C 49 ; WX 600 ; N one ; B 93 0 529 638 ; C 50 ; WX 600 ; N two ; B 54 0 602 638 ; C 51 ; WX 600 ; N three ; B 80 -15 609 638 ; C 52 ; WX 600 ; N four ; B 104 0 579 622 ; C 53 ; WX 600 ; N five ; B 83 -15 610 622 ; C 54 ; WX 600 ; N six ; B 154 -15 663 638 ; C 55 ; WX 600 ; N seven ; B 184 -1 640 622 ; C 56 ; WX 600 ; N eight ; B 114 -15 608 638 ; C 57 ; WX 600 ; N nine ; B 115 -15 624 638 ; C 58 ; WX 600 ; N colon ; B 234 -15 455 437 ; C 59 ; WX 600 ; N semicolon ; B 118 -158 431 437 ; C 60 ; WX 600 ; N less ; B 102 54 642 501 ; C 61 ; WX 600 ; N equal ; B 81 138 638 422 ; C 62 ; WX 600 ; N greater ; B 76 53 616 500 ; C 63 ; WX 600 ; N question ; B 197 -15 608 598 ; C 64 ; WX 600 ; N at ; B 98 -152 582 620 ; C 65 ; WX 600 ; N A ; B -11 0 633 583 ; C 66 ; WX 600 ; N B ; B 22 0 620 583 ; C 67 ; WX 600 ; N C ; B 80 -14 663 597 ; C 68 ; WX 600 ; N D ; B 23 0 622 583 ; C 69 ; WX 600 ; N E ; B 23 0 652 583 ; C 70 ; WX 600 ; N F ; B 23 0 674 583 ; C 71 ; WX 600 ; N G ; B 79 -14 667 597 ; C 72 ; WX 600 ; N H ; B 32 0 675 583 ; C 73 ; WX 600 ; N I ; B 93 0 632 583 ; C 74 ; WX 600 ; N J ; B 64 -14 727 583 ; C 75 ; WX 600 ; N K ; B 22 0 687 583 ; C 76 ; WX 600 ; N L ; B 42 0 616 583 ; C 77 ; WX 600 ; N M ; B -10 0 728 583 ; C 78 ; WX 600 ; N N ; B 21 0 706 583 ; C 79 ; WX 600 ; N O ; B 75 -14 649 597 ; C 80 ; WX 600 ; N P ; B 23 0 617 583 ; C 81 ; WX 600 ; N Q ; B 75 -145 649 597 ; C 82 ; WX 600 ; N R ; B 23 0 631 583 ; C 83 ; WX 600 ; N S ; B 72 -14 634 597 ; C 84 ; WX 600 ; N T ; B 121 0 682 583 ; C 85 ; WX 600 ; N U ; B 110 -14 705 583 ; C 86 ; WX 600 ; N V ; B 91 0 735 583 ; C 87 ; WX 600 ; N W ; B 98 0 725 583 ; C 88 ; WX 600 ; N X ; B 19 0 692 583 ; C 89 ; WX 600 ; N Y ; B 128 0 694 583 ; C 90 ; WX 600 ; N Z ; B 73 0 628 583 ; C 91 ; WX 600 ; N bracketleft ; B 219 -148 598 627 ; C 92 ; WX 600 ; N backslash ; B 219 -113 504 695 ; C 93 ; WX 600 ; N bracketright ; B 104 -148 483 627 ; C 94 ; WX 600 ; N asciicircum ; B 161 325 598 652 ; C 95 ; WX 600 ; N underscore ; B -61 -125 564 -75 ; C 96 ; WX 600 ; N quoteleft ; B 377 348 534 602 ; C 97 ; WX 600 ; N a ; B 65 -16 583 450 ; C 98 ; WX 600 ; N b ; B 2 -14 623 624 ; C 99 ; WX 600 ; N c ; B 93 -16 626 450 ; C 100 ; WX 600 ; N d ; B 74 -14 664 624 ; C 101 ; WX 600 ; N e ; B 74 -16 600 450 ; C 102 ; WX 600 ; N f ; B 84 0 691 623 ; C 103 ; WX 600 ; N g ; B 73 -205 675 451 ; C 104 ; WX 600 ; N h ; B 33 0 593 624 ; C 105 ; WX 600 ; N i ; B 72 0 550 623 ; C 106 ; WX 600 ; N j ; B 83 -205 581 623 ; C 107 ; WX 600 ; N k ; B 42 0 606 624 ; C 108 ; WX 600 ; N l ; B 72 0 550 624 ; C 109 ; WX 600 ; N m ; B -9 0 635 450 ; C 110 ; WX 600 ; N n ; B 33 0 583 450 ; C 111 ; WX 600 ; N o ; B 84 -16 609 450 ; C 112 ; WX 600 ; N p ; B -42 -205 623 450 ; C 113 ; WX 600 ; N q ; B 75 -205 696 450 ; C 114 ; WX 600 ; N r ; B 64 0 650 449 ; C 115 ; WX 600 ; N s ; B 83 -16 592 450 ; C 116 ; WX 600 ; N t ; B 94 -16 547 591 ; C 117 ; WX 600 ; N u ; B 94 -13 603 437 ; C 118 ; WX 600 ; N v ; B 81 0 683 437 ; C 119 ; WX 600 ; N w ; B 82 0 684 437 ; C 120 ; WX 600 ; N x ; B 30 0 641 437 ; C 121 ; WX 600 ; N y ; B -13 -205 662 437 ; C 122 ; WX 600 ; N z ; B 85 0 599 437 ; C 123 ; WX 600 ; N braceleft ; B 217 -153 556 623 ; C 124 ; WX 600 ; N bar ; B 227 -153 472 622 ; C 125 ; WX 600 ; N braceright ; B 144 -153 483 623 ; C 126 ; WX 600 ; N asciitilde ; B 114 179 606 385 ; C 161 ; WX 600 ; N exclamdown ; B 186 -227 453 426 ; C 162 ; WX 600 ; N cent ; B 144 -44 593 661 ; C 163 ; WX 600 ; N sterling ; B 64 0 571 598 ; C 164 ; WX 600 ; N fraction ; B 52 102 676 500 ; C 165 ; WX 600 ; N yen ; B 133 0 693 580 ; C 166 ; WX 600 ; N florin ; B 43 -123 672 638 ; C 167 ; WX 600 ; N section ; B 45 -170 643 583 ; C 168 ; WX 600 ; N currency ; B 96 64 626 519 ; C 169 ; WX 600 ; N quotesingle ; B 343 312 492 602 ; C 170 ; WX 600 ; N quotedblleft ; B 226 348 583 602 ; C 171 ; WX 600 ; N guillemotleft ; B 80 20 654 415 ; C 172 ; WX 600 ; N guilsinglleft ; B 80 20 425 415 ; C 173 ; WX 600 ; N guilsinglright ; B 273 20 617 415 ; C 174 ; WX 600 ; N fi ; B -4 0 633 624 ; C 175 ; WX 600 ; N fl ; B -8 0 645 623 ; C 177 ; WX 600 ; N endash ; B 101 229 619 329 ; C 178 ; WX 600 ; N dagger ; B 175 -92 589 622 ; C 179 ; WX 600 ; N daggerdbl ; B 123 -92 589 622 ; C 180 ; WX 600 ; N periodcentered ; B 283 214 436 346 ; C 182 ; WX 600 ; N paragraph ; B 108 -174 672 583 ; C 183 ; WX 600 ; N bullet ; B 211 154 517 453 ; C 184 ; WX 600 ; N quotesinglbase ; B 118 -158 379 134 ; C 185 ; WX 600 ; N quotedblbase ; B 66 -120 519 134 ; C 186 ; WX 600 ; N quotedblright ; B 166 348 619 602 ; C 187 ; WX 600 ; N guillemotright ; B 43 20 617 415 ; C 188 ; WX 600 ; N ellipsis ; B 34 -15 587 117 ; C 189 ; WX 600 ; N perthousand ; B 104 0 627 618 ; C 191 ; WX 600 ; N questiondown ; B 70 -227 481 386 ; C 193 ; WX 600 ; N grave ; B 264 496 464 696 ; C 194 ; WX 600 ; N acute ; B 362 496 616 696 ; C 195 ; WX 600 ; N circumflex ; B 237 497 590 696 ; C 196 ; WX 600 ; N tilde ; B 233 523 619 656 ; C 197 ; WX 600 ; N macron ; B 249 546 600 626 ; C 198 ; WX 600 ; N breve ; B 261 503 614 687 ; C 199 ; WX 600 ; N dotaccent ; B 365 534 488 654 ; C 200 ; WX 600 ; N dieresis ; B 261 534 592 654 ; C 202 ; WX 600 ; N ring ; B 303 486 554 727 ; C 203 ; WX 600 ; N cedilla ; B 143 -229 381 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 237 496 616 694 ; C 206 ; WX 600 ; N ogonek ; B 222 -208 433 0 ; C 207 ; WX 600 ; N caron ; B 264 497 617 696 ; C 208 ; WX 600 ; N emdash ; B 30 229 690 329 ; C 225 ; WX 600 ; N AE ; B -10 0 717 583 ; C 227 ; WX 600 ; N ordfeminine ; B 170 182 559 595 ; C 232 ; WX 600 ; N Lslash ; B 43 0 616 583 ; C 233 ; WX 600 ; N Oslash ; B 4 -70 717 638 ; C 234 ; WX 600 ; N OE ; B 34 0 717 583 ; C 235 ; WX 600 ; N ordmasculine ; B 168 182 566 595 ; C 241 ; WX 600 ; N ae ; B 14 -16 665 450 ; C 245 ; WX 600 ; N dotlessi ; B 72 0 550 437 ; C 248 ; WX 600 ; N lslash ; B 72 0 557 624 ; C 249 ; WX 600 ; N oslash ; B 17 -70 669 494 ; C 250 ; WX 600 ; N oe ; B 28 -16 666 450 ; C 251 ; WX 600 ; N germandbls ; B 22 -16 569 623 ; C -1 ; WX 600 ; N Udieresis ; B 110 -14 705 800 ; C -1 ; WX 600 ; N Uacute ; B 110 -14 705 839 ; C -1 ; WX 600 ; N Scedilla ; B 72 -229 634 597 ; C -1 ; WX 600 ; N Tcaron ; B 121 0 682 839 ; C -1 ; WX 600 ; N Scaron ; B 72 -14 657 839 ; C -1 ; WX 600 ; N Rcaron ; B 23 0 631 839 ; C -1 ; WX 600 ; N Racute ; B 23 0 631 839 ; C -1 ; WX 600 ; N Sacute ; B 72 -14 634 839 ; C -1 ; WX 600 ; N Otilde ; B 75 -14 656 799 ; C -1 ; WX 600 ; N ucircumflex ; B 94 -13 603 696 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 75 -14 680 837 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 110 -14 705 837 ; C -1 ; WX 600 ; N Yacute ; B 128 0 694 839 ; C -1 ; WX 600 ; N Eth ; B 23 0 622 583 ; C -1 ; WX 600 ; N Dcroat ; B 23 0 622 583 ; C -1 ; WX 600 ; N Zacute ; B 73 0 628 839 ; C -1 ; WX 600 ; N Uring ; B 110 -14 705 871 ; C -1 ; WX 600 ; N gbreve ; B 73 -205 675 687 ; C -1 ; WX 600 ; N eogonek ; B 74 -208 600 450 ; C -1 ; WX 600 ; N edotaccent ; B 74 -16 600 654 ; C -1 ; WX 600 ; N ecaron ; B 74 -16 617 696 ; C -1 ; WX 600 ; N Ugrave ; B 110 -14 705 839 ; C -1 ; WX 600 ; N Thorn ; B 23 0 588 583 ; C -1 ; WX 600 ; N eacute ; B 74 -16 600 696 ; C -1 ; WX 600 ; N edieresis ; B 74 -16 600 654 ; C -1 ; WX 740 ; N dcaron ; B 74 -14 840 639 ; C -1 ; WX 600 ; N ccedilla ; B 92 -229 626 450 ; C -1 ; WX 600 ; N ccaron ; B 93 -16 627 696 ; C -1 ; WX 600 ; N cacute ; B 93 -16 626 696 ; C -1 ; WX 600 ; N aogonek ; B 65 -208 583 450 ; C -1 ; WX 600 ; N aring ; B 65 -16 583 727 ; C -1 ; WX 600 ; N atilde ; B 65 -16 612 656 ; C -1 ; WX 600 ; N abreve ; B 65 -16 614 687 ; C -1 ; WX 600 ; N egrave ; B 74 -16 600 696 ; C -1 ; WX 600 ; N agrave ; B 65 -16 583 696 ; C -1 ; WX 600 ; N aacute ; B 66 -16 584 696 ; C -1 ; WX 600 ; N adieresis ; B 65 -16 583 654 ; C -1 ; WX 600 ; N Uogonek ; B 110 -208 705 583 ; C -1 ; WX 600 ; N ugrave ; B 94 -13 603 696 ; C -1 ; WX 600 ; N uacute ; B 94 -13 603 696 ; C -1 ; WX 600 ; N udieresis ; B 94 -13 603 654 ; C -1 ; WX 600 ; N tcaron ; B 94 -16 700 639 ; C -1 ; WX 600 ; N scommaaccent ; B 83 -278 592 450 ; C -1 ; WX 600 ; N Zcaron ; B 73 0 644 839 ; C -1 ; WX 600 ; N ecircumflex ; B 74 -16 600 696 ; C -1 ; WX 600 ; N Ucircumflex ; B 110 -14 705 839 ; C -1 ; WX 600 ; N acircumflex ; B 65 -16 583 696 ; C -1 ; WX 600 ; N Zdotaccent ; B 73 0 628 793 ; C -1 ; WX 600 ; N scaron ; B 83 -16 627 696 ; C -1 ; WX 600 ; N Amacron ; B -11 0 633 776 ; C -1 ; WX 600 ; N sacute ; B 83 -16 616 696 ; C -1 ; WX 600 ; N Tcommaaccent ; B 121 -278 682 583 ; C -1 ; WX 600 ; N Ydieresis ; B 128 0 694 800 ; C -1 ; WX 600 ; N thorn ; B -42 -205 623 624 ; C -1 ; WX 600 ; N Emacron ; B 23 0 652 776 ; C -1 ; WX 600 ; N Ograve ; B 75 -14 649 839 ; C -1 ; WX 600 ; N Oacute ; B 75 -14 649 839 ; C -1 ; WX 600 ; N Odieresis ; B 75 -14 649 800 ; C -1 ; WX 600 ; N Ntilde ; B 21 0 706 799 ; C -1 ; WX 600 ; N Ncaron ; B 21 0 706 839 ; C -1 ; WX 600 ; N Nacute ; B 21 0 706 839 ; C -1 ; WX 600 ; N Lcaron ; B 42 0 680 598 ; C -1 ; WX 600 ; N Lacute ; B 42 0 616 839 ; C -1 ; WX 600 ; N Idotaccent ; B 93 0 632 793 ; C -1 ; WX 600 ; N racute ; B 64 0 650 696 ; C -1 ; WX 600 ; N Icircumflex ; B 93 0 632 839 ; C -1 ; WX 600 ; N ohungarumlaut ; B 84 -16 616 694 ; C -1 ; WX 600 ; N otilde ; B 84 -16 626 656 ; C -1 ; WX 600 ; N Euro ; B 54 -14 639 597 ; C -1 ; WX 600 ; N ocircumflex ; B 84 -16 609 696 ; C -1 ; WX 600 ; N onesuperior ; B 224 247 494 638 ; C -1 ; WX 600 ; N twosuperior ; B 202 247 538 637 ; C -1 ; WX 600 ; N threesuperior ; B 218 238 543 637 ; C -1 ; WX 600 ; N Igrave ; B 93 0 632 839 ; C -1 ; WX 600 ; N Iacute ; B 93 0 632 839 ; C -1 ; WX 600 ; N Imacron ; B 93 0 632 776 ; C -1 ; WX 600 ; N Iogonek ; B 93 -208 632 583 ; C -1 ; WX 600 ; N Idieresis ; B 93 0 632 800 ; C -1 ; WX 600 ; N Gbreve ; B 79 -14 667 831 ; C -1 ; WX 600 ; N Umacron ; B 110 -14 705 776 ; C -1 ; WX 600 ; N Kcommaaccent ; B 22 -278 687 583 ; C -1 ; WX 600 ; N ograve ; B 84 -16 609 696 ; C -1 ; WX 600 ; N Scommaaccent ; B 72 -278 634 597 ; C -1 ; WX 600 ; N Eogonek ; B 23 -208 652 583 ; C -1 ; WX 600 ; N oacute ; B 84 -16 609 696 ; C -1 ; WX 600 ; N Edotaccent ; B 23 0 652 793 ; C -1 ; WX 600 ; N iogonek ; B 72 -208 550 623 ; C -1 ; WX 600 ; N gcommaaccent ; B 73 -205 675 722 ; C -1 ; WX 600 ; N odieresis ; B 84 -16 609 654 ; C -1 ; WX 600 ; N ntilde ; B 33 0 613 656 ; C -1 ; WX 600 ; N ncaron ; B 33 0 617 696 ; C -1 ; WX 600 ; N Ecaron ; B 23 0 652 839 ; C -1 ; WX 600 ; N Ecircumflex ; B 23 0 652 839 ; C -1 ; WX 600 ; N scedilla ; B 83 -229 592 450 ; C -1 ; WX 600 ; N rcaron ; B 64 0 650 696 ; C -1 ; WX 600 ; N Egrave ; B 23 0 652 839 ; C -1 ; WX 600 ; N Eacute ; B 23 0 652 839 ; C -1 ; WX 600 ; N Gcommaaccent ; B 79 -278 667 597 ; C -1 ; WX 600 ; N Rcommaaccent ; B 23 -278 631 583 ; C -1 ; WX 600 ; N Edieresis ; B 23 0 652 800 ; C -1 ; WX 600 ; N nacute ; B 33 0 616 696 ; C -1 ; WX 600 ; N uogonek ; B 94 -208 603 437 ; C -1 ; WX 600 ; N umacron ; B 94 -13 603 626 ; C -1 ; WX 600 ; N Dcaron ; B 23 0 622 839 ; C -1 ; WX 600 ; N lcaron ; B 72 0 700 639 ; C -1 ; WX 600 ; N Ccaron ; B 80 -14 663 839 ; C -1 ; WX 600 ; N Cacute ; B 80 -14 663 839 ; C -1 ; WX 600 ; N Ccedilla ; B 80 -229 663 597 ; C -1 ; WX 600 ; N degree ; B 210 243 568 596 ; C -1 ; WX 600 ; N Aogonek ; B -11 -208 633 583 ; C -1 ; WX 600 ; N minus ; B 101 230 619 330 ; C -1 ; WX 600 ; N multiply ; B 126 80 592 480 ; C -1 ; WX 600 ; N divide ; B 101 28 619 532 ; C -1 ; WX 600 ; N Aring ; B -11 0 633 871 ; C -1 ; WX 600 ; N trademark ; B 60 220 732 583 ; C -1 ; WX 600 ; N rcommaaccent ; B 64 -278 650 449 ; C -1 ; WX 600 ; N lacute ; B 72 0 600 839 ; C -1 ; WX 600 ; N omacron ; B 84 -16 609 626 ; C -1 ; WX 600 ; N Atilde ; B -11 0 633 799 ; C -1 ; WX 600 ; N icircumflex ; B 72 0 573 696 ; C -1 ; WX 600 ; N igrave ; B 72 0 550 696 ; C -1 ; WX 600 ; N ncommaaccent ; B 33 -278 583 450 ; C -1 ; WX 600 ; N lcommaaccent ; B 72 -278 550 624 ; C -1 ; WX 600 ; N plusminus ; B 52 0 640 624 ; C -1 ; WX 600 ; N onehalf ; B 25 0 685 638 ; C -1 ; WX 600 ; N onequarter ; B 25 0 673 638 ; C -1 ; WX 600 ; N threequarters ; B 18 0 673 637 ; C -1 ; WX 600 ; N iacute ; B 71 0 574 696 ; C -1 ; WX 600 ; N Abreve ; B -11 0 633 831 ; C -1 ; WX 600 ; N kcommaaccent ; B 42 -278 606 624 ; C -1 ; WX 600 ; N Omacron ; B 75 -14 649 776 ; C -1 ; WX 600 ; N imacron ; B 72 0 600 626 ; C -1 ; WX 600 ; N emacron ; B 74 -16 600 626 ; C -1 ; WX 600 ; N amacron ; B 65 -16 600 626 ; C -1 ; WX 600 ; N tcommaaccent ; B 94 -278 547 591 ; C -1 ; WX 600 ; N ydieresis ; B -13 -205 662 654 ; C -1 ; WX 600 ; N zdotaccent ; B 85 0 599 654 ; C -1 ; WX 600 ; N zcaron ; B 85 0 619 696 ; C -1 ; WX 600 ; N zacute ; B 85 0 616 696 ; C -1 ; WX 600 ; N yacute ; B -13 -205 662 696 ; C -1 ; WX 600 ; N uhungarumlaut ; B 94 -13 616 694 ; C -1 ; WX 600 ; N eth ; B 83 -16 617 646 ; C -1 ; WX 600 ; N uring ; B 94 -13 603 727 ; C -1 ; WX 600 ; N Ocircumflex ; B 75 -14 649 839 ; C -1 ; WX 600 ; N commaaccent ; B 147 -278 342 -59 ; C -1 ; WX 600 ; N copyright ; B 48 -15 675 598 ; C -1 ; WX 600 ; N registered ; B 48 -15 675 598 ; C -1 ; WX 600 ; N Acircumflex ; B -11 0 633 839 ; C -1 ; WX 600 ; N idieresis ; B 72 0 575 656 ; C -1 ; WX 600 ; N lozenge ; B 133 -19 590 593 ; C -1 ; WX 600 ; N Delta ; B 15 0 585 583 ; C -1 ; WX 600 ; N notequal ; B 81 22 638 525 ; C -1 ; WX 600 ; N radical ; B 74 -60 782 697 ; C -1 ; WX 600 ; N Agrave ; B -11 0 633 839 ; C -1 ; WX 600 ; N Aacute ; B -11 0 633 839 ; C -1 ; WX 600 ; N lessequal ; B 50 0 666 591 ; C -1 ; WX 600 ; N greaterequal ; B 52 0 660 591 ; C -1 ; WX 600 ; N logicalnot ; B 125 115 560 445 ; C -1 ; WX 600 ; N summation ; B 32 -97 668 671 ; C -1 ; WX 600 ; N partialdiff ; B 138 -16 579 590 ; C -1 ; WX 600 ; N Ncommaaccent ; B 21 -278 706 583 ; C -1 ; WX 600 ; N dcroat ; B 74 -14 712 624 ; C -1 ; WX 600 ; N brokenbar ; B 227 -153 472 622 ; C -1 ; WX 600 ; N Lcommaaccent ; B 42 -278 616 583 ; C -1 ; WX 600 ; N Adieresis ; B -11 0 633 800 ; C -1 ; WX 600 ; N mu ; B 72 -153 603 440 ; C -1 ; WX 600 ; N .notdef ; B 386 0 386 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -24 KPX A Ccedilla -30 KPX A G -20 KPX A O -26 KPX A Odieresis -26 KPX A Q -25 KPX A T -35 KPX A U -33 KPX A Uacute -33 KPX A Ucircumflex -33 KPX A Udieresis -33 KPX A Ugrave -33 KPX A V -63 KPX A W -21 KPX A Y -34 KPX A a 8 KPX A b 39 KPX A c -12 KPX A ccedilla -15 KPX A comma -52 KPX A d -4 KPX A e -5 KPX A g -5 KPX A guillemotleft -44 KPX A guilsinglleft -44 KPX A hyphen -23 KPX A o -11 KPX A period -67 KPX A q -10 KPX A quotedblright -89 KPX A quoteright -116 KPX A t -25 KPX A u -18 KPX A v -41 KPX A w -15 KPX A y -41 KPX Aacute C -24 KPX Aacute G -20 KPX Aacute O -26 KPX Aacute Q -25 KPX Aacute T -35 KPX Aacute U -33 KPX Aacute V -63 KPX Aacute W -21 KPX Aacute Y -34 KPX Aacute a 8 KPX Aacute b 39 KPX Aacute c -12 KPX Aacute comma -52 KPX Aacute d -4 KPX Aacute e -5 KPX Aacute g -5 KPX Aacute guillemotleft -44 KPX Aacute guilsinglleft -44 KPX Aacute hyphen -23 KPX Aacute o -11 KPX Aacute period -67 KPX Aacute q -10 KPX Aacute quoteright -116 KPX Aacute t -25 KPX Aacute u -18 KPX Aacute v -41 KPX Aacute w -15 KPX Aacute y -41 KPX Acircumflex C -24 KPX Acircumflex G -20 KPX Acircumflex O -26 KPX Acircumflex Q -25 KPX Acircumflex T -35 KPX Acircumflex U -33 KPX Acircumflex V -63 KPX Acircumflex W -21 KPX Acircumflex Y -34 KPX Acircumflex comma -52 KPX Acircumflex period -67 KPX Adieresis C -24 KPX Adieresis G -20 KPX Adieresis O -26 KPX Adieresis Q -25 KPX Adieresis T -35 KPX Adieresis U -33 KPX Adieresis V -63 KPX Adieresis W -21 KPX Adieresis Y -34 KPX Adieresis a 8 KPX Adieresis b 39 KPX Adieresis c -12 KPX Adieresis comma -52 KPX Adieresis d -4 KPX Adieresis g -5 KPX Adieresis guillemotleft -44 KPX Adieresis guilsinglleft -44 KPX Adieresis hyphen -23 KPX Adieresis o -11 KPX Adieresis period -67 KPX Adieresis q -10 KPX Adieresis quotedblright -89 KPX Adieresis quoteright -116 KPX Adieresis t -25 KPX Adieresis u -18 KPX Adieresis v -41 KPX Adieresis w -15 KPX Adieresis y -41 KPX Agrave C -24 KPX Agrave G -20 KPX Agrave O -26 KPX Agrave Q -25 KPX Agrave T -35 KPX Agrave U -33 KPX Agrave V -63 KPX Agrave W -21 KPX Agrave Y -34 KPX Agrave comma -52 KPX Agrave period -67 KPX Aring C -24 KPX Aring G -20 KPX Aring O -26 KPX Aring Q -25 KPX Aring T -35 KPX Aring U -33 KPX Aring V -63 KPX Aring W -21 KPX Aring Y -34 KPX Aring a 8 KPX Aring b 39 KPX Aring c -12 KPX Aring comma -52 KPX Aring d -4 KPX Aring e -5 KPX Aring g -5 KPX Aring guillemotleft -44 KPX Aring guilsinglleft -44 KPX Aring hyphen -23 KPX Aring o -11 KPX Aring period -67 KPX Aring q -10 KPX Aring quotedblright -89 KPX Aring quoteright -116 KPX Aring t -25 KPX Aring u -18 KPX Aring v -41 KPX Aring w -15 KPX Aring y -41 KPX Atilde C -24 KPX Atilde G -20 KPX Atilde O -26 KPX Atilde Q -25 KPX Atilde T -35 KPX Atilde U -33 KPX Atilde V -63 KPX Atilde W -21 KPX Atilde Y -34 KPX Atilde comma -52 KPX Atilde period -67 KPX B A -2 KPX B AE -3 KPX B Aacute -2 KPX B Acircumflex -2 KPX B Adieresis -2 KPX B Aring -2 KPX B Atilde -2 KPX B O -14 KPX B OE 7 KPX B Oacute -14 KPX B Ocircumflex -14 KPX B Odieresis -14 KPX B Ograve -14 KPX B Oslash -12 KPX B V -29 KPX B W -10 KPX B Y -50 KPX C A 2 KPX C AE 2 KPX C Aacute 2 KPX C Adieresis 2 KPX C Aring 2 KPX C H -18 KPX C K -13 KPX C O -19 KPX C Oacute -19 KPX C Odieresis -19 KPX Ccedilla A -5 KPX D A -32 KPX D Aacute -32 KPX D Acircumflex -32 KPX D Adieresis -32 KPX D Agrave -32 KPX D Aring -32 KPX D Atilde -32 KPX D J -38 KPX D T -36 KPX D V -40 KPX D W -16 KPX D X -40 KPX D Y -61 KPX F A -47 KPX F Aacute -47 KPX F Acircumflex -47 KPX F Adieresis -47 KPX F Agrave -47 KPX F Aring -47 KPX F Atilde -47 KPX F J -83 KPX F O -32 KPX F Odieresis -32 KPX F a -44 KPX F aacute -45 KPX F adieresis -44 KPX F ae -22 KPX F aring -44 KPX F comma -172 KPX F e -51 KPX F eacute -51 KPX F hyphen -61 KPX F i -50 KPX F j -58 KPX F o -55 KPX F oacute -55 KPX F odieresis -55 KPX F oe -20 KPX F oslash -55 KPX F period -191 KPX F r -37 KPX F u -6 KPX G A 0 KPX G AE 0 KPX G Aacute 0 KPX G Acircumflex 0 KPX G Adieresis 0 KPX G Agrave 0 KPX G Aring 0 KPX G Atilde 0 KPX G T -30 KPX G V 1 KPX G W 5 KPX G Y -20 KPX J A -15 KPX J AE -24 KPX J Adieresis -15 KPX J Aring -15 KPX K C -32 KPX K G -30 KPX K O -31 KPX K OE -9 KPX K Oacute -31 KPX K Odieresis -31 KPX K S -17 KPX K T -20 KPX K a -1 KPX K adieresis -1 KPX K ae 23 KPX K aring -1 KPX K e -14 KPX K hyphen -50 KPX K o -20 KPX K oacute -20 KPX K odieresis -20 KPX K u -30 KPX K udieresis -30 KPX K y -56 KPX L A 9 KPX L AE 9 KPX L Aacute 9 KPX L Adieresis 9 KPX L Aring 9 KPX L C -19 KPX L Ccedilla -19 KPX L G -19 KPX L O -16 KPX L Oacute -16 KPX L Ocircumflex -16 KPX L Odieresis -16 KPX L Ograve -16 KPX L Otilde -16 KPX L S -32 KPX L T -60 KPX L U -31 KPX L Udieresis -31 KPX L V -61 KPX L W -23 KPX L Y -59 KPX L hyphen 5 KPX L quotedblright -82 KPX L quoteright -107 KPX L u -13 KPX L udieresis -14 KPX L y -36 KPX N A -10 KPX N AE -11 KPX N Aacute -10 KPX N Adieresis -10 KPX N Aring -10 KPX N C -13 KPX N Ccedilla -10 KPX N G -12 KPX N O -10 KPX N Oacute -10 KPX N Odieresis -10 KPX N a -14 KPX N aacute -15 KPX N adieresis -14 KPX N ae 14 KPX N aring -14 KPX N comma -79 KPX N e -7 KPX N eacute -7 KPX N o -12 KPX N oacute -12 KPX N odieresis -12 KPX N oslash -6 KPX N period -98 KPX N u -12 KPX N udieresis -12 KPX O A -21 KPX O AE -20 KPX O Aacute -21 KPX O Adieresis -21 KPX O Aring -21 KPX O T -23 KPX O V -32 KPX O W -4 KPX O X -28 KPX O Y -51 KPX Oacute A -21 KPX Oacute T -23 KPX Oacute V -32 KPX Oacute W -4 KPX Oacute Y -51 KPX Ocircumflex T -23 KPX Ocircumflex V -32 KPX Ocircumflex Y -51 KPX Odieresis A -21 KPX Odieresis T -23 KPX Odieresis V -32 KPX Odieresis W -4 KPX Odieresis X -28 KPX Odieresis Y -51 KPX Ograve T -23 KPX Ograve V -32 KPX Ograve Y -51 KPX Oslash A -13 KPX Otilde T -23 KPX Otilde V -32 KPX Otilde Y -51 KPX P A -65 KPX P AE -63 KPX P Aacute -65 KPX P Adieresis -65 KPX P Aring -65 KPX P J -80 KPX P a -54 KPX P aacute -54 KPX P adieresis -54 KPX P ae -31 KPX P aring -54 KPX P comma -164 KPX P e -43 KPX P eacute -43 KPX P hyphen -39 KPX P o -47 KPX P oacute -47 KPX P odieresis -47 KPX P oe -18 KPX P oslash -46 KPX P period -183 KPX R C -19 KPX R Ccedilla -18 KPX R G -18 KPX R O -18 KPX R OE 3 KPX R Oacute -18 KPX R Odieresis -18 KPX R T -36 KPX R U -20 KPX R Udieresis -21 KPX R V -34 KPX R W -10 KPX R Y -35 KPX R a 7 KPX R aacute 6 KPX R adieresis 7 KPX R ae 32 KPX R aring 7 KPX R e -4 KPX R eacute -4 KPX R hyphen -30 KPX R o -9 KPX R oacute -9 KPX R odieresis -9 KPX R oe 24 KPX R u -9 KPX R uacute -9 KPX R udieresis -9 KPX R y -22 KPX S A -16 KPX S AE -16 KPX S Aacute -16 KPX S Adieresis -16 KPX S Aring -16 KPX S T -47 KPX S V -16 KPX S W -15 KPX S Y -37 KPX S t -20 KPX T A -35 KPX T AE -35 KPX T Aacute -35 KPX T Acircumflex -35 KPX T Adieresis -35 KPX T Agrave -35 KPX T Aring -35 KPX T Atilde -35 KPX T C -27 KPX T G -27 KPX T J -72 KPX T O -22 KPX T OE 0 KPX T Oacute -22 KPX T Ocircumflex -22 KPX T Odieresis -22 KPX T Ograve -22 KPX T Oslash -23 KPX T Otilde -22 KPX T S -49 KPX T V 4 KPX T W -2 KPX T Y -17 KPX T a -39 KPX T ae -17 KPX T c -42 KPX T colon -119 KPX T comma -136 KPX T e -31 KPX T g -28 KPX T guillemotleft -81 KPX T guilsinglleft -81 KPX T hyphen -96 KPX T i -46 KPX T j -53 KPX T o -36 KPX T oslash -36 KPX T period -154 KPX T r -33 KPX T s -43 KPX T semicolon -106 KPX T u -1 KPX T v 6 KPX T w 5 KPX T y -4 KPX U A -23 KPX U AE -22 KPX U Aacute -23 KPX U Acircumflex -23 KPX U Adieresis -23 KPX U Aring -23 KPX U Atilde -23 KPX U comma -98 KPX U m 14 KPX U n -10 KPX U p -3 KPX U period -118 KPX U r -36 KPX Uacute A -23 KPX Uacute comma -98 KPX Uacute m 14 KPX Uacute n -10 KPX Uacute p -3 KPX Uacute period -118 KPX Uacute r -36 KPX Ucircumflex A -23 KPX Udieresis A -23 KPX Udieresis b 20 KPX Udieresis comma -98 KPX Udieresis m 14 KPX Udieresis n -10 KPX Udieresis p -3 KPX Udieresis period -118 KPX Udieresis r -36 KPX Ugrave A -23 KPX V A -12 KPX V AE -21 KPX V Aacute -12 KPX V Acircumflex -12 KPX V Adieresis -12 KPX V Agrave -12 KPX V Aring -12 KPX V Atilde -12 KPX V C -34 KPX V G -34 KPX V O -32 KPX V Oacute -32 KPX V Ocircumflex -32 KPX V Odieresis -32 KPX V Ograve -32 KPX V Oslash -32 KPX V Otilde -32 KPX V S -35 KPX V T 3 KPX V a -59 KPX V ae -30 KPX V colon -139 KPX V comma -150 KPX V e -51 KPX V g -50 KPX V guillemotleft -83 KPX V guilsinglleft -83 KPX V hyphen -45 KPX V i -64 KPX V o -56 KPX V oslash -51 KPX V period -169 KPX V r -51 KPX V semicolon -127 KPX V u -21 KPX V y -22 KPX W A -15 KPX W AE -14 KPX W Aacute -15 KPX W Acircumflex -15 KPX W Adieresis -15 KPX W Agrave -15 KPX W Aring -15 KPX W Atilde -15 KPX W C -9 KPX W G -8 KPX W O -7 KPX W Oacute -7 KPX W Ocircumflex -7 KPX W Odieresis -7 KPX W Ograve -7 KPX W Oslash -3 KPX W Otilde -7 KPX W S -21 KPX W T -1 KPX W a -14 KPX W ae 15 KPX W colon -103 KPX W comma -86 KPX W e -6 KPX W g -5 KPX W guillemotleft -38 KPX W guilsinglleft -38 KPX W hyphen -3 KPX W i -40 KPX W o -11 KPX W oslash -6 KPX W period -105 KPX W r -28 KPX W semicolon -86 KPX W u -3 KPX W y -6 KPX X C -33 KPX X O -31 KPX X Odieresis -31 KPX X Q -30 KPX X a -7 KPX X e -20 KPX X hyphen -55 KPX X o -26 KPX X u -36 KPX X y -49 KPX Y A -32 KPX Y AE -35 KPX Y Aacute -32 KPX Y Acircumflex -32 KPX Y Adieresis -32 KPX Y Agrave -32 KPX Y Aring -32 KPX Y Atilde -32 KPX Y C -54 KPX Y G -54 KPX Y O -52 KPX Y Oacute -52 KPX Y Ocircumflex -52 KPX Y Odieresis -52 KPX Y Ograve -52 KPX Y Oslash -50 KPX Y Otilde -52 KPX Y S -55 KPX Y T -17 KPX Y a -61 KPX Y ae -36 KPX Y colon -157 KPX Y comma -123 KPX Y e -63 KPX Y g -62 KPX Y guillemotleft -99 KPX Y guilsinglleft -99 KPX Y hyphen -87 KPX Y i -63 KPX Y o -68 KPX Y oslash -56 KPX Y p -34 KPX Y period -141 KPX Y semicolon -139 KPX Y u -48 KPX Y v -38 KPX Z v -47 KPX Z y -55 KPX a j -85 KPX a quoteright -79 KPX a v -25 KPX a w -13 KPX a y -36 KPX aacute v -25 KPX aacute w -13 KPX aacute y -36 KPX adieresis v -25 KPX adieresis w -13 KPX adieresis y -36 KPX ae v 24 KPX ae w 31 KPX ae y 13 KPX agrave v -25 KPX agrave w -13 KPX agrave y -36 KPX aring v -25 KPX aring w -13 KPX aring y -36 KPX b v -4 KPX b w 3 KPX b y -15 KPX c h 8 KPX c k 3 KPX comma one -133 KPX comma quotedblright -142 KPX comma quoteright -170 KPX e quoteright -64 KPX e t -16 KPX e v -14 KPX e w -4 KPX e x 3 KPX e y -25 KPX eacute v -14 KPX eacute w -4 KPX eacute y -25 KPX ecircumflex v -14 KPX ecircumflex w -4 KPX ecircumflex y -25 KPX eight four -63 KPX eight one -80 KPX eight seven -75 KPX f a -38 KPX f aacute -38 KPX f adieresis -38 KPX f ae -13 KPX f aring -38 KPX f e -46 KPX f eacute -46 KPX f f -46 KPX f i -40 KPX f j -63 KPX f l -30 KPX f o -51 KPX f oacute -51 KPX f odieresis -48 KPX f oe -17 KPX f oslash -34 KPX f quoteright -78 KPX f s -46 KPX f t -10 KPX five four -58 KPX five one -80 KPX five seven -80 KPX four four -68 KPX four one -72 KPX four seven -100 KPX g a -7 KPX g adieresis -7 KPX g ae 21 KPX g aring -7 KPX g e -1 KPX g eacute -1 KPX g l -38 KPX g oacute -6 KPX g odieresis -6 KPX g r -5 KPX guillemotright A -42 KPX guillemotright AE -39 KPX guillemotright Aacute -42 KPX guillemotright Adieresis -42 KPX guillemotright Aring -42 KPX guillemotright T -81 KPX guillemotright V -80 KPX guillemotright W -35 KPX guillemotright Y -96 KPX guilsinglright A -42 KPX guilsinglright AE -39 KPX guilsinglright Aacute -42 KPX guilsinglright Adieresis -42 KPX guilsinglright Aring -42 KPX guilsinglright T -81 KPX guilsinglright V -80 KPX guilsinglright W -35 KPX guilsinglright Y -96 KPX h quoteright -71 KPX h y -29 KPX hyphen A -21 KPX hyphen AE -17 KPX hyphen Aacute -21 KPX hyphen Adieresis -21 KPX hyphen Aring -21 KPX hyphen T -93 KPX hyphen V -41 KPX hyphen W -1 KPX hyphen Y -84 KPX i T -64 KPX i j -145 KPX k a -5 KPX k aacute -5 KPX k adieresis -5 KPX k ae 20 KPX k aring -5 KPX k comma -67 KPX k e -17 KPX k eacute -17 KPX k g -16 KPX k hyphen -53 KPX k o -22 KPX k oacute -22 KPX k odieresis -22 KPX k period -80 KPX k s -13 KPX k u -7 KPX k udieresis -7 KPX l v -77 KPX l y -78 KPX m p 31 KPX m v 13 KPX m w 22 KPX m y 2 KPX n T -47 KPX n p 2 KPX n quoteright -69 KPX n v -17 KPX n w -6 KPX n y -28 KPX nine four -59 KPX nine one -76 KPX nine seven -68 KPX o T -39 KPX o quoteright -61 KPX o t -16 KPX o v -10 KPX o w -3 KPX o x -10 KPX o y -21 KPX oacute v -10 KPX oacute w -3 KPX oacute y -21 KPX ocircumflex t -16 KPX odieresis t -16 KPX odieresis v -10 KPX odieresis w -3 KPX odieresis x -10 KPX odieresis y -21 KPX ograve v -10 KPX ograve w -3 KPX ograve y -21 KPX one comma -104 KPX one eight -83 KPX one five -63 KPX one four -95 KPX one nine -80 KPX one one -68 KPX one period -119 KPX one seven -146 KPX one six -107 KPX one three -62 KPX one two -53 KPX one zero -95 KPX p t -7 KPX p y -12 KPX period one -118 KPX period quotedblright -137 KPX period quoteright -165 KPX q c 0 KPX q u 37 KPX quotedblbase A -10 KPX quotedblbase AE -11 KPX quotedblbase T -92 KPX quotedblbase V -108 KPX quotedblbase W -46 KPX quotedblbase Y -80 KPX quotedblleft A -66 KPX quotedblleft AE -64 KPX quotedblleft Aacute -66 KPX quotedblleft Adieresis -66 KPX quotedblleft Aring -66 KPX quotedblleft T -28 KPX quotedblleft V -20 KPX quotedblleft W -15 KPX quotedblleft Y -50 KPX quotedblright A -81 KPX quotedblright AE -79 KPX quotedblright Aacute -81 KPX quotedblright Adieresis -81 KPX quotedblright Aring -81 KPX quotedblright T -45 KPX quotedblright V -35 KPX quotedblright W -30 KPX quotedblright Y -57 KPX quoteleft A -90 KPX quoteleft AE -88 KPX quoteleft Aacute -90 KPX quoteleft Adieresis -90 KPX quoteleft Aring -90 KPX quoteleft T -52 KPX quoteleft V -45 KPX quoteleft W -40 KPX quoteleft Y -74 KPX quoteright A -160 KPX quoteright AE -158 KPX quoteright Aacute -160 KPX quoteright Adieresis -160 KPX quoteright Aring -160 KPX quoteright comma -234 KPX quoteright d -146 KPX quoteright o -148 KPX quoteright period -251 KPX quoteright r -155 KPX quoteright s -154 KPX quoteright t -121 KPX quoteright v -114 KPX quoteright w -109 KPX quoteright y -120 KPX r a -22 KPX r aacute -22 KPX r acircumflex -22 KPX r adieresis -22 KPX r ae 0 KPX r agrave -22 KPX r aring -22 KPX r c -23 KPX r ccedilla -18 KPX r colon -100 KPX r comma -112 KPX r d -13 KPX r e -11 KPX r eacute -11 KPX r ecircumflex -11 KPX r egrave -11 KPX r f -20 KPX r g -9 KPX r h -23 KPX r hyphen -48 KPX r i -30 KPX r j -38 KPX r k -33 KPX r l -50 KPX r m 31 KPX r n 5 KPX r o -16 KPX r oacute -16 KPX r ocircumflex -16 KPX r odieresis -16 KPX r oe 15 KPX r ograve -16 KPX r oslash -16 KPX r p 25 KPX r period -126 KPX r q -8 KPX r quoteright -45 KPX r r -17 KPX r s -25 KPX r semicolon -88 KPX r t 15 KPX r u 15 KPX r v 22 KPX r w 21 KPX r x 2 KPX r y 10 KPX r z -24 KPX s quoteright -62 KPX s t -14 KPX seven colon -162 KPX seven comma -160 KPX seven eight -79 KPX seven five -87 KPX seven four -105 KPX seven one -72 KPX seven period -179 KPX seven seven -69 KPX seven six -98 KPX seven three -78 KPX seven two -70 KPX six four -54 KPX six one -60 KPX six seven -55 KPX t S -40 KPX t a -21 KPX t aacute -21 KPX t adieresis -21 KPX t ae 4 KPX t aring -21 KPX t colon -121 KPX t e -30 KPX t eacute -30 KPX t h -8 KPX t o -36 KPX t oacute -36 KPX t odieresis -36 KPX t quoteright -102 KPX t semicolon -107 KPX three four -58 KPX three one -79 KPX three seven -74 KPX two four -75 KPX two one -73 KPX two seven -78 KPX u quoteright -58 KPX v a -7 KPX v aacute -7 KPX v acircumflex -7 KPX v adieresis -7 KPX v ae 15 KPX v agrave -7 KPX v aring -7 KPX v atilde -7 KPX v c -17 KPX v colon -86 KPX v comma -139 KPX v e -6 KPX v eacute -6 KPX v ecircumflex -6 KPX v egrave -6 KPX v g -2 KPX v hyphen -28 KPX v l -79 KPX v o -11 KPX v oacute -11 KPX v odieresis -11 KPX v ograve -11 KPX v oslash -10 KPX v period -159 KPX v s -15 KPX v semicolon -74 KPX w a -6 KPX w aacute -7 KPX w acircumflex -6 KPX w adieresis -6 KPX w ae 22 KPX w agrave -6 KPX w aring -6 KPX w atilde -6 KPX w c -8 KPX w colon -86 KPX w comma -93 KPX w e 0 KPX w eacute 0 KPX w ecircumflex 0 KPX w egrave 0 KPX w g 2 KPX w hyphen -1 KPX w l -51 KPX w o -4 KPX w oacute -4 KPX w odieresis -4 KPX w ograve -4 KPX w oslash 0 KPX w period -112 KPX w s -13 KPX w semicolon -74 KPX x a -1 KPX x c -16 KPX x e -7 KPX x eacute -7 KPX x o -12 KPX x q -9 KPX y a -17 KPX y aacute -18 KPX y acircumflex -17 KPX y adieresis -17 KPX y ae 4 KPX y agrave -17 KPX y aring -17 KPX y atilde -17 KPX y c -25 KPX y colon -96 KPX y comma -137 KPX y e -14 KPX y eacute -14 KPX y ecircumflex -14 KPX y egrave -14 KPX y g -11 KPX y hyphen -23 KPX y l -79 KPX y o -20 KPX y oacute -20 KPX y odieresis -20 KPX y ograve -20 KPX y oslash -19 KPX y period -158 KPX y s -24 KPX y semicolon -84 KPX zero four -65 KPX zero one -81 KPX zero seven -79 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n021023l.afm0000644000076500001440000007626007056046553016416 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusRomNo9L-ReguItal FullName Nimbus Roman No9 L Regular Italic FamilyName Nimbus Roman No9 L Weight Regular ItalicAngle -15.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -169 -270 1010 924 CapHeight 653 XHeight 432 Descender -205 Ascender 683 StartCharMetrics 316 C 32 ; WX 250 ; N space ; B 125 0 125 0 ; C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ; C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; C 49 ; WX 500 ; N one ; B 49 0 409 676 ; C 50 ; WX 500 ; N two ; B 12 0 452 676 ; C 51 ; WX 500 ; N three ; B 15 -7 466 676 ; C 52 ; WX 500 ; N four ; B 1 0 479 676 ; C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; C 60 ; WX 675 ; N less ; B 84 -10 592 516 ; C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; C 62 ; WX 675 ; N greater ; B 84 -10 592 516 ; C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; C 65 ; WX 611 ; N A ; B -51 0 564 668 ; C 66 ; WX 611 ; N B ; B -8 0 588 653 ; C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; C 68 ; WX 722 ; N D ; B -8 0 700 653 ; C 69 ; WX 611 ; N E ; B -1 0 634 653 ; C 70 ; WX 611 ; N F ; B 8 0 645 653 ; C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; C 72 ; WX 722 ; N H ; B -8 0 767 653 ; C 73 ; WX 333 ; N I ; B -8 0 384 653 ; C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; C 75 ; WX 667 ; N K ; B 7 0 722 653 ; C 76 ; WX 556 ; N L ; B -8 0 559 653 ; C 77 ; WX 833 ; N M ; B -18 0 873 653 ; C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; C 79 ; WX 722 ; N O ; B 60 -18 706 666 ; C 80 ; WX 611 ; N P ; B 0 0 605 653 ; C 81 ; WX 722 ; N Q ; B 59 -183 699 666 ; C 82 ; WX 611 ; N R ; B -13 0 588 653 ; C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; C 84 ; WX 556 ; N T ; B 59 0 633 653 ; C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; C 88 ; WX 611 ; N X ; B -29 0 655 653 ; C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; C 108 ; WX 278 ; N l ; B 40 -11 279 683 ; C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; C 112 ; WX 500 ; N p ; B -75 -205 469 442 ; C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; C 114 ; WX 389 ; N r ; B 45 0 412 441 ; C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; C 124 ; WX 275 ; N bar ; B 105 -18 171 666 ; C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; C 126 ; WX 541 ; N asciitilde ; B 40 186 502 320 ; C 161 ; WX 389 ; N exclamdown ; B 59 -205 321 474 ; C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ; C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ; C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; C 168 ; WX 500 ; N currency ; B -22 53 522 597 ; C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ; C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ; C 177 ; WX 500 ; N endash ; B -6 197 505 243 ; C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ; C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ; C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; C 191 ; WX 500 ; N questiondown ; B 28 -205 367 473 ; C 193 ; WX 333 ; N grave ; B 121 492 311 664 ; C 194 ; WX 333 ; N acute ; B 180 494 403 664 ; C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ; C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ; C 197 ; WX 333 ; N macron ; B 99 532 411 583 ; C 198 ; WX 333 ; N breve ; B 117 492 418 650 ; C 199 ; WX 333 ; N dotaccent ; B 207 508 305 606 ; C 200 ; WX 333 ; N dieresis ; B 107 508 405 606 ; C 202 ; WX 333 ; N ring ; B 155 508 355 707 ; C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; C 206 ; WX 333 ; N ogonek ; B -20 -169 200 40 ; C 207 ; WX 333 ; N caron ; B 121 492 426 661 ; C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ; C 225 ; WX 889 ; N AE ; B -27 0 911 653 ; C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ; C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ; C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ; C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; C 248 ; WX 278 ; N lslash ; B 37 -11 307 683 ; C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ; C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ; C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; C -1 ; WX 722 ; N Otilde ; B 60 -18 706 836 ; C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 706 876 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ; C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ; C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; C -1 ; WX 722 ; N Uring ; B 102 -18 765 919 ; C -1 ; WX 500 ; N gbreve ; B 8 -206 502 650 ; C -1 ; WX 444 ; N eogonek ; B 31 -169 444 441 ; C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ; C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ; C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; C -1 ; WX 521 ; N dcaron ; B 15 -13 641 683 ; C -1 ; WX 444 ; N ccedilla ; B 26 -217 425 441 ; C -1 ; WX 444 ; N ccaron ; B 30 -11 484 661 ; C -1 ; WX 444 ; N cacute ; B 30 -11 458 664 ; C -1 ; WX 500 ; N aogonek ; B 17 -169 500 441 ; C -1 ; WX 500 ; N aring ; B 17 -11 476 707 ; C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ; C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ; C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ; C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ; C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; C -1 ; WX 722 ; N Uogonek ; B 102 -169 765 653 ; C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ; C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; C -1 ; WX 278 ; N tcaron ; B 37 -11 378 666 ; C -1 ; WX 389 ; N scommaaccent ; B 16 -270 366 442 ; C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ; C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; C -1 ; WX 556 ; N Tcommaaccent ; B 59 -270 633 653 ; C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ; C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; C -1 ; WX 722 ; N Ograve ; B 60 -18 706 876 ; C -1 ; WX 722 ; N Oacute ; B 60 -18 706 876 ; C -1 ; WX 722 ; N Odieresis ; B 60 -18 706 818 ; C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; C -1 ; WX 556 ; N Lcaron ; B -8 0 596 666 ; C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 570 664 ; C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ; C -1 ; WX 500 ; N Euro ; B 57 0 668 693 ; C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ; C -1 ; WX 333 ; N Iacute ; B -8 0 403 876 ; C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; C -1 ; WX 667 ; N Kcommaaccent ; B 7 -270 722 653 ; C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ; C -1 ; WX 500 ; N Scommaaccent ; B 17 -270 508 667 ; C -1 ; WX 611 ; N Eogonek ; B -1 -169 651 653 ; C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ; C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; C -1 ; WX 278 ; N iogonek ; B 49 -169 278 654 ; C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; C -1 ; WX 389 ; N scedilla ; B -2 -217 366 442 ; C -1 ; WX 389 ; N rcaron ; B 45 0 454 661 ; C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ; C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ; C -1 ; WX 722 ; N Gcommaaccent ; B 52 -270 722 666 ; C -1 ; WX 611 ; N Rcommaaccent ; B -13 -270 588 653 ; C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; C -1 ; WX 500 ; N nacute ; B 14 -9 487 664 ; C -1 ; WX 500 ; N uogonek ; B 42 -169 500 441 ; C -1 ; WX 500 ; N umacron ; B 42 -11 495 583 ; C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; C -1 ; WX 278 ; N lcaron ; B 40 -11 395 683 ; C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; C -1 ; WX 667 ; N Cacute ; B 66 -18 689 876 ; C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; C -1 ; WX 400 ; N degree ; B 101 390 387 676 ; C -1 ; WX 611 ; N Aogonek ; B -51 -169 707 668 ; C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ; C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ; C -1 ; WX 611 ; N Aring ; B -51 0 564 904 ; C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ; C -1 ; WX 389 ; N rcommaaccent ; B 35 -270 412 441 ; C -1 ; WX 278 ; N lacute ; B 40 -11 376 876 ; C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ; C -1 ; WX 278 ; N icircumflex ; B 34 -11 328 661 ; C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ; C -1 ; WX 500 ; N ncommaaccent ; B 14 -270 474 441 ; C -1 ; WX 278 ; N lcommaaccent ; B -21 -270 279 683 ; C -1 ; WX 675 ; N plusminus ; B 86 0 590 568 ; C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; C -1 ; WX 278 ; N iacute ; B 49 -11 356 664 ; C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; C -1 ; WX 444 ; N kcommaaccent ; B 14 -270 461 683 ; C -1 ; WX 722 ; N Omacron ; B 60 -18 706 795 ; C -1 ; WX 278 ; N imacron ; B 49 -11 384 583 ; C -1 ; WX 444 ; N emacron ; B 31 -11 467 583 ; C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; C -1 ; WX 278 ; N tcommaaccent ; B -21 -270 296 546 ; C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ; C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 570 664 ; C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ; C -1 ; WX 500 ; N uring ; B 42 -11 475 707 ; C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 706 873 ; C -1 ; WX 333 ; N commaaccent ; B 7 -270 146 -40 ; C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ; C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ; C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; C -1 ; WX 278 ; N idieresis ; B 49 -11 353 606 ; C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 564 ; N notequal ; B 30 -3 534 509 ; C -1 ; WX 549 ; N radical ; B -2 -65 526 924 ; C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ; C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ; C -1 ; WX 675 ; N lessequal ; B 84 0 592 628 ; C -1 ; WX 675 ; N greaterequal ; B 84 0 592 628 ; C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; C -1 ; WX 494 ; N partialdiff ; B 26 -10 462 753 ; C -1 ; WX 667 ; N Ncommaaccent ; B -20 -270 727 653 ; C -1 ; WX 500 ; N dcroat ; B 15 -13 558 683 ; C -1 ; WX 275 ; N brokenbar ; B 105 -18 171 666 ; C -1 ; WX 556 ; N Lcommaaccent ; B -8 -270 559 653 ; C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ; C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -50 KPX A Ccedilla -50 KPX A G -44 KPX A O -45 KPX A Odieresis -45 KPX A Q -44 KPX A T -14 KPX A U -57 KPX A Uacute -57 KPX A Ucircumflex -57 KPX A Udieresis -57 KPX A Ugrave -57 KPX A V -81 KPX A W -75 KPX A Y -21 KPX A a -4 KPX A b 0 KPX A c -18 KPX A ccedilla -28 KPX A comma 8 KPX A d -4 KPX A e -17 KPX A g -25 KPX A guillemotleft -44 KPX A guilsinglleft -43 KPX A hyphen -13 KPX A o -17 KPX A period 8 KPX A q -12 KPX A quotedblright -92 KPX A quoteright -92 KPX A t -6 KPX A u -9 KPX A v -50 KPX A w -44 KPX A y -57 KPX Aacute C -50 KPX Aacute G -44 KPX Aacute O -45 KPX Aacute Q -44 KPX Aacute T -14 KPX Aacute U -57 KPX Aacute V -81 KPX Aacute W -75 KPX Aacute Y -21 KPX Aacute a -4 KPX Aacute b 0 KPX Aacute c -18 KPX Aacute comma 8 KPX Aacute d -4 KPX Aacute e -17 KPX Aacute g -25 KPX Aacute guillemotleft -44 KPX Aacute guilsinglleft -43 KPX Aacute hyphen -13 KPX Aacute o -17 KPX Aacute period 8 KPX Aacute q -12 KPX Aacute quoteright -92 KPX Aacute t -6 KPX Aacute u -9 KPX Aacute v -50 KPX Aacute w -44 KPX Aacute y -57 KPX Acircumflex C -50 KPX Acircumflex G -44 KPX Acircumflex O -45 KPX Acircumflex Q -44 KPX Acircumflex T -14 KPX Acircumflex U -57 KPX Acircumflex V -81 KPX Acircumflex W -75 KPX Acircumflex Y -21 KPX Acircumflex comma 8 KPX Acircumflex period 8 KPX Adieresis C -50 KPX Adieresis G -44 KPX Adieresis O -45 KPX Adieresis Q -44 KPX Adieresis T -14 KPX Adieresis U -57 KPX Adieresis V -81 KPX Adieresis W -75 KPX Adieresis Y -21 KPX Adieresis a -4 KPX Adieresis b 0 KPX Adieresis c -18 KPX Adieresis comma 8 KPX Adieresis d -4 KPX Adieresis g -25 KPX Adieresis guillemotleft -44 KPX Adieresis guilsinglleft -43 KPX Adieresis hyphen -13 KPX Adieresis o -17 KPX Adieresis period 8 KPX Adieresis q -12 KPX Adieresis quotedblright -92 KPX Adieresis quoteright -92 KPX Adieresis t -6 KPX Adieresis u -9 KPX Adieresis v -50 KPX Adieresis w -44 KPX Adieresis y -57 KPX Agrave C -50 KPX Agrave G -44 KPX Agrave O -45 KPX Agrave Q -44 KPX Agrave T -14 KPX Agrave U -57 KPX Agrave V -81 KPX Agrave W -75 KPX Agrave Y -21 KPX Agrave comma 8 KPX Agrave period 8 KPX Aring C -50 KPX Aring G -44 KPX Aring O -45 KPX Aring Q -44 KPX Aring T -14 KPX Aring U -57 KPX Aring V -81 KPX Aring W -75 KPX Aring Y -21 KPX Aring a -4 KPX Aring b 0 KPX Aring c -18 KPX Aring comma 8 KPX Aring d -4 KPX Aring e -17 KPX Aring g -25 KPX Aring guillemotleft -44 KPX Aring guilsinglleft -43 KPX Aring hyphen -13 KPX Aring o -17 KPX Aring period 8 KPX Aring q -12 KPX Aring quotedblright -92 KPX Aring quoteright -92 KPX Aring t -6 KPX Aring u -9 KPX Aring v -50 KPX Aring w -44 KPX Aring y -57 KPX Atilde C -50 KPX Atilde G -44 KPX Atilde O -45 KPX Atilde Q -44 KPX Atilde T -14 KPX Atilde U -57 KPX Atilde V -81 KPX Atilde W -75 KPX Atilde Y -21 KPX Atilde comma 7 KPX Atilde period 7 KPX B A -23 KPX B AE -35 KPX B Aacute -23 KPX B Acircumflex -23 KPX B Adieresis -23 KPX B Aring -23 KPX B Atilde -23 KPX B O -14 KPX B OE -6 KPX B Oacute -14 KPX B Ocircumflex -14 KPX B Odieresis -14 KPX B Ograve -14 KPX B Oslash -14 KPX B V -32 KPX B W -29 KPX B Y -39 KPX C A -14 KPX C AE -30 KPX C Aacute -14 KPX C Adieresis -14 KPX C Aring -14 KPX C H -13 KPX C K -21 KPX C O -19 KPX C Oacute -19 KPX C Odieresis -19 KPX Ccedilla A -18 KPX D A -36 KPX D Aacute -36 KPX D Acircumflex -36 KPX D Adieresis -36 KPX D Agrave -36 KPX D Aring -36 KPX D Atilde -36 KPX D J -32 KPX D T -9 KPX D V -42 KPX D W -36 KPX D X -40 KPX D Y -50 KPX F A -72 KPX F Aacute -72 KPX F Acircumflex -72 KPX F Adieresis -72 KPX F Agrave -72 KPX F Aring -72 KPX F Atilde -72 KPX F J -60 KPX F O -40 KPX F Odieresis -40 KPX F a -77 KPX F aacute -78 KPX F adieresis -52 KPX F ae -82 KPX F aring -70 KPX F comma -95 KPX F e -83 KPX F eacute -83 KPX F hyphen -45 KPX F i -36 KPX F j -41 KPX F o -79 KPX F oacute -79 KPX F odieresis -52 KPX F oe -75 KPX F oslash -80 KPX F period -99 KPX F r -52 KPX F u -50 KPX G A -17 KPX G AE -29 KPX G Aacute -17 KPX G Acircumflex -17 KPX G Adieresis -17 KPX G Agrave -17 KPX G Aring -17 KPX G Atilde -17 KPX G T -13 KPX G V -5 KPX G W -2 KPX G Y -12 KPX J A -40 KPX J AE -52 KPX J Adieresis -40 KPX J Aring -40 KPX K C -55 KPX K G -53 KPX K O -46 KPX K OE -45 KPX K Oacute -46 KPX K Odieresis -46 KPX K S 6 KPX K T 21 KPX K a -5 KPX K adieresis -5 KPX K ae -5 KPX K aring -5 KPX K e -18 KPX K hyphen -57 KPX K o -18 KPX K oacute -18 KPX K odieresis -18 KPX K u -10 KPX K udieresis -10 KPX K y -89 KPX L A 44 KPX L AE 32 KPX L Aacute 44 KPX L Adieresis 44 KPX L Aring 44 KPX L C 6 KPX L Ccedilla 4 KPX L G 11 KPX L O 10 KPX L Oacute 10 KPX L Ocircumflex 10 KPX L Odieresis 10 KPX L Ograve 10 KPX L Otilde 10 KPX L S 20 KPX L T -13 KPX L U -8 KPX L Udieresis -8 KPX L V -55 KPX L W -48 KPX L Y -20 KPX L hyphen 47 KPX L quotedblright -92 KPX L quoteright -92 KPX L u 12 KPX L udieresis 10 KPX L y -26 KPX N A -20 KPX N AE -32 KPX N Aacute -20 KPX N Adieresis -20 KPX N Aring -20 KPX N C -21 KPX N Ccedilla -20 KPX N G -14 KPX N O -20 KPX N Oacute -20 KPX N Odieresis -20 KPX N a -22 KPX N aacute -23 KPX N adieresis -23 KPX N ae -27 KPX N aring -23 KPX N comma -13 KPX N e -28 KPX N eacute -30 KPX N o -25 KPX N oacute -27 KPX N odieresis -27 KPX N oslash -27 KPX N period -16 KPX N u -24 KPX N udieresis -25 KPX O A -38 KPX O AE -70 KPX O Aacute -38 KPX O Adieresis -38 KPX O Aring -38 KPX O T -3 KPX O V -45 KPX O W -39 KPX O X -41 KPX O Y -51 KPX Oacute A -38 KPX Oacute T -3 KPX Oacute V -45 KPX Oacute W -39 KPX Oacute Y -51 KPX Ocircumflex T -3 KPX Ocircumflex V -45 KPX Ocircumflex Y -51 KPX Odieresis A -38 KPX Odieresis T -3 KPX Odieresis V -45 KPX Odieresis W -39 KPX Odieresis X -41 KPX Odieresis Y -51 KPX Ograve T -3 KPX Ograve V -45 KPX Ograve Y -51 KPX Oslash A -38 KPX Otilde T -3 KPX Otilde V -45 KPX Otilde Y -51 KPX P A -79 KPX P AE -116 KPX P Aacute -79 KPX P Adieresis -79 KPX P Aring -79 KPX P J -89 KPX P a -74 KPX P aacute -74 KPX P adieresis -64 KPX P ae -80 KPX P aring -74 KPX P comma -118 KPX P e -79 KPX P eacute -79 KPX P hyphen -64 KPX P o -73 KPX P oacute -73 KPX P odieresis -64 KPX P oe -67 KPX P oslash -74 KPX P period -121 KPX R C -26 KPX R Ccedilla -25 KPX R G -20 KPX R O -26 KPX R OE -18 KPX R Oacute -26 KPX R Odieresis -26 KPX R T 0 KPX R U -36 KPX R Udieresis -36 KPX R V -31 KPX R W -28 KPX R Y -19 KPX R a -3 KPX R aacute -3 KPX R adieresis -3 KPX R ae -3 KPX R aring -3 KPX R e -15 KPX R eacute -15 KPX R hyphen -29 KPX R o -15 KPX R oacute -15 KPX R odieresis -15 KPX R oe -15 KPX R u -7 KPX R uacute -7 KPX R udieresis -7 KPX R y 0 KPX S A -2 KPX S AE -14 KPX S Aacute -2 KPX S Adieresis -2 KPX S Aring -2 KPX S T 1 KPX S V 5 KPX S W 8 KPX S Y -1 KPX S t -13 KPX T A -33 KPX T AE -45 KPX T Aacute -33 KPX T Acircumflex -33 KPX T Adieresis -33 KPX T Agrave -33 KPX T Aring -33 KPX T Atilde -33 KPX T C -15 KPX T G -7 KPX T J -39 KPX T O -20 KPX T OE -8 KPX T Oacute -20 KPX T Ocircumflex -20 KPX T Odieresis -20 KPX T Ograve -20 KPX T Oslash -20 KPX T Otilde -20 KPX T S -2 KPX T V 41 KPX T W 43 KPX T Y 33 KPX T a -81 KPX T ae -81 KPX T c -86 KPX T colon -84 KPX T comma -70 KPX T e -90 KPX T g -102 KPX T guillemotleft -102 KPX T guilsinglleft -101 KPX T hyphen -68 KPX T i -16 KPX T j -20 KPX T o -87 KPX T oslash -89 KPX T period -71 KPX T r -87 KPX T s -74 KPX T semicolon -92 KPX T u -86 KPX T v -72 KPX T w -69 KPX T y -70 KPX U A -50 KPX U AE -69 KPX U Aacute -50 KPX U Acircumflex -50 KPX U Adieresis -50 KPX U Aring -50 KPX U Atilde -50 KPX U comma -35 KPX U m -28 KPX U n -29 KPX U p -32 KPX U period -39 KPX U r -41 KPX Uacute A -50 KPX Uacute comma -35 KPX Uacute m -28 KPX Uacute n -29 KPX Uacute p -32 KPX Uacute period -39 KPX Uacute r -41 KPX Ucircumflex A -50 KPX Udieresis A -50 KPX Udieresis b 1 KPX Udieresis comma -35 KPX Udieresis m -28 KPX Udieresis n -29 KPX Udieresis p -32 KPX Udieresis period -39 KPX Udieresis r -41 KPX Ugrave A -50 KPX V A -66 KPX V AE -102 KPX V Aacute -66 KPX V Acircumflex -66 KPX V Adieresis -66 KPX V Agrave -66 KPX V Aring -66 KPX V Atilde -66 KPX V C -48 KPX V G -42 KPX V O -48 KPX V Oacute -48 KPX V Ocircumflex -48 KPX V Odieresis -48 KPX V Ograve -48 KPX V Oslash -48 KPX V Otilde -48 KPX V S -15 KPX V T 32 KPX V a -67 KPX V ae -72 KPX V colon -82 KPX V comma -76 KPX V e -74 KPX V g -84 KPX V guillemotleft -82 KPX V guilsinglleft -81 KPX V hyphen -45 KPX V i -16 KPX V o -70 KPX V oslash -72 KPX V period -80 KPX V r -45 KPX V semicolon -79 KPX V u -40 KPX V y -16 KPX W A -57 KPX W AE -85 KPX W Aacute -57 KPX W Acircumflex -57 KPX W Adieresis -57 KPX W Agrave -57 KPX W Aring -57 KPX W Atilde -57 KPX W C -39 KPX W G -33 KPX W O -39 KPX W Oacute -39 KPX W Ocircumflex -39 KPX W Odieresis -39 KPX W Ograve -39 KPX W Oslash -39 KPX W Otilde -39 KPX W S -17 KPX W T 30 KPX W a -53 KPX W ae -58 KPX W colon -77 KPX W comma -58 KPX W e -60 KPX W g -75 KPX W guillemotleft -68 KPX W guilsinglleft -67 KPX W hyphen -32 KPX W i -18 KPX W o -56 KPX W oslash -58 KPX W period -62 KPX W r -40 KPX W semicolon -74 KPX W u -35 KPX W y -11 KPX X C -50 KPX X O -44 KPX X Odieresis -44 KPX X Q -42 KPX X a -3 KPX X e -15 KPX X hyphen -41 KPX X o -15 KPX X u -7 KPX X y -67 KPX Y A -27 KPX Y AE -39 KPX Y Aacute -27 KPX Y Acircumflex -27 KPX Y Adieresis -27 KPX Y Agrave -27 KPX Y Aring -27 KPX Y Atilde -27 KPX Y C -52 KPX Y G -45 KPX Y O -52 KPX Y Oacute -52 KPX Y Ocircumflex -52 KPX Y Odieresis -52 KPX Y Ograve -52 KPX Y Oslash -52 KPX Y Otilde -52 KPX Y S -15 KPX Y T 32 KPX Y a -72 KPX Y ae -75 KPX Y colon -78 KPX Y comma -64 KPX Y e -78 KPX Y g -94 KPX Y guillemotleft -93 KPX Y guilsinglleft -92 KPX Y hyphen -60 KPX Y i -16 KPX Y o -75 KPX Y oslash -77 KPX Y p -52 KPX Y period -65 KPX Y semicolon -86 KPX Y u -58 KPX Y v -32 KPX Z v -12 KPX Z y -28 KPX a j -22 KPX a quoteright -28 KPX a v 1 KPX a w 4 KPX a y 2 KPX aacute v 1 KPX aacute w 4 KPX aacute y 2 KPX adieresis v 1 KPX adieresis w 4 KPX adieresis y 2 KPX ae v 2 KPX ae w 5 KPX ae y 6 KPX agrave v 1 KPX agrave w 4 KPX agrave y 2 KPX aring v 1 KPX aring w 4 KPX aring y 2 KPX b v -10 KPX b w -7 KPX b y -3 KPX c h -30 KPX c k -29 KPX comma one -40 KPX comma quotedblright -39 KPX comma quoteright -39 KPX e quoteright -21 KPX e t -16 KPX e v 0 KPX e w 2 KPX e x -10 KPX e y 4 KPX eacute v 0 KPX eacute w 2 KPX eacute y 4 KPX ecircumflex v 0 KPX ecircumflex w 2 KPX ecircumflex y 4 KPX eight four 13 KPX eight one -50 KPX eight seven -1 KPX f a -26 KPX f aacute -27 KPX f adieresis -2 KPX f ae -30 KPX f aring -17 KPX f e -32 KPX f eacute -34 KPX f f 30 KPX f i 17 KPX f j 13 KPX f l 42 KPX f o -29 KPX f oacute -30 KPX f odieresis -2 KPX f oe -24 KPX f oslash -31 KPX f quoteright 18 KPX f s -20 KPX f t 18 KPX five four -5 KPX five one -71 KPX five seven -28 KPX four four 12 KPX four one -69 KPX four seven -27 KPX g a -41 KPX g adieresis -42 KPX g ae -46 KPX g aring -42 KPX g e -45 KPX g eacute -45 KPX g l -46 KPX g oacute -41 KPX g odieresis -41 KPX g r -21 KPX guillemotright A -25 KPX guillemotright AE -51 KPX guillemotright Aacute -25 KPX guillemotright Adieresis -25 KPX guillemotright Aring -25 KPX guillemotright T -77 KPX guillemotright V -76 KPX guillemotright W -67 KPX guillemotright Y -81 KPX guilsinglright A -24 KPX guilsinglright AE -50 KPX guilsinglright Aacute -24 KPX guilsinglright Adieresis -24 KPX guilsinglright Aring -24 KPX guilsinglright T -76 KPX guilsinglright V -75 KPX guilsinglright W -66 KPX guilsinglright Y -80 KPX h quoteright -31 KPX h y -4 KPX hyphen A 3 KPX hyphen AE -23 KPX hyphen Aacute 3 KPX hyphen Adieresis 3 KPX hyphen Aring 3 KPX hyphen T -46 KPX hyphen V -43 KPX hyphen W -34 KPX hyphen Y -53 KPX i T -10 KPX i j -31 KPX k a 12 KPX k aacute 12 KPX k adieresis 12 KPX k ae 9 KPX k aring 12 KPX k comma 27 KPX k e 5 KPX k eacute 5 KPX k g -27 KPX k hyphen -27 KPX k o 6 KPX k oacute 6 KPX k odieresis 6 KPX k period 26 KPX k s 7 KPX k u 8 KPX k udieresis 8 KPX l v -12 KPX l y -11 KPX m p -4 KPX m v -6 KPX m w -4 KPX m y -3 KPX n T -41 KPX n p -7 KPX n quoteright -34 KPX n v -10 KPX n w -7 KPX n y -6 KPX nine four 2 KPX nine one -64 KPX nine seven -5 KPX o T -63 KPX o quoteright -24 KPX o t -15 KPX o v -18 KPX o w -15 KPX o x -33 KPX o y -10 KPX oacute v -18 KPX oacute w -15 KPX oacute y -10 KPX ocircumflex t -16 KPX odieresis t -16 KPX odieresis v -18 KPX odieresis w -15 KPX odieresis x -33 KPX odieresis y -10 KPX ograve v -18 KPX ograve w -15 KPX ograve y -10 KPX one comma -52 KPX one eight -57 KPX one five -55 KPX one four -69 KPX one nine -61 KPX one one -69 KPX one period -56 KPX one seven -60 KPX one six -50 KPX one three -55 KPX one two -50 KPX one zero -41 KPX p t -14 KPX p y -4 KPX period one -39 KPX period quotedblright -38 KPX period quoteright -38 KPX q c -13 KPX q u -11 KPX quotedblbase A 1 KPX quotedblbase AE -13 KPX quotedblbase T -64 KPX quotedblbase V -96 KPX quotedblbase W -84 KPX quotedblbase Y -69 KPX quotedblleft A -88 KPX quotedblleft AE -141 KPX quotedblleft Aacute -88 KPX quotedblleft Adieresis -88 KPX quotedblleft Aring -88 KPX quotedblleft T -19 KPX quotedblleft V -17 KPX quotedblleft W -15 KPX quotedblleft Y -25 KPX quotedblright A -94 KPX quotedblright AE -147 KPX quotedblright Aacute -94 KPX quotedblright Adieresis -94 KPX quotedblright Aring -94 KPX quotedblright T -21 KPX quotedblright V -22 KPX quotedblright W -19 KPX quotedblright Y -30 KPX quoteleft A -78 KPX quoteleft AE -131 KPX quoteleft Aacute -78 KPX quoteleft Adieresis -78 KPX quoteleft Aring -78 KPX quoteleft T -9 KPX quoteleft V -8 KPX quoteleft W -5 KPX quoteleft Y -15 KPX quoteright A -87 KPX quoteright AE -140 KPX quoteright Aacute -87 KPX quoteright Adieresis -87 KPX quoteright Aring -87 KPX quoteright comma -73 KPX quoteright d -79 KPX quoteright o -78 KPX quoteright period -78 KPX quoteright r -57 KPX quoteright s -63 KPX quoteright t -49 KPX quoteright v -28 KPX quoteright w -26 KPX quoteright y -28 KPX r a -29 KPX r aacute -29 KPX r acircumflex -29 KPX r adieresis -29 KPX r ae -36 KPX r agrave -29 KPX r aring -29 KPX r c -26 KPX r ccedilla -17 KPX r colon -28 KPX r comma -68 KPX r d -31 KPX r e -35 KPX r eacute -35 KPX r ecircumflex -35 KPX r egrave -35 KPX r f 23 KPX r g -21 KPX r h -17 KPX r hyphen -52 KPX r i 8 KPX r j 4 KPX r k -15 KPX r l -21 KPX r m 17 KPX r n 16 KPX r o -28 KPX r oacute -28 KPX r ocircumflex -28 KPX r odieresis -28 KPX r oe -23 KPX r ograve -28 KPX r oslash -29 KPX r p 13 KPX r period -72 KPX r q -31 KPX r quoteright -4 KPX r r 4 KPX r s -17 KPX r semicolon -28 KPX r t 12 KPX r u 11 KPX r v 30 KPX r w 32 KPX r x 7 KPX r y 33 KPX r z 0 KPX s quoteright -20 KPX s t -12 KPX seven colon -88 KPX seven comma -79 KPX seven eight -32 KPX seven five -53 KPX seven four -65 KPX seven one -47 KPX seven period -83 KPX seven seven -11 KPX seven six -37 KPX seven three -42 KPX seven two -13 KPX six four 17 KPX six one -64 KPX six seven -37 KPX t S -9 KPX t a -6 KPX t aacute -6 KPX t adieresis -6 KPX t ae -10 KPX t aring -6 KPX t colon -29 KPX t e -13 KPX t eacute -13 KPX t h -11 KPX t o -11 KPX t oacute -11 KPX t odieresis -11 KPX t quoteright -19 KPX t semicolon -26 KPX three four -9 KPX three one -76 KPX three seven -15 KPX two four -12 KPX two one -45 KPX two seven -22 KPX u quoteright -31 KPX v a -24 KPX v aacute -26 KPX v acircumflex -26 KPX v adieresis -26 KPX v ae -29 KPX v agrave -26 KPX v aring -26 KPX v atilde -26 KPX v c -26 KPX v colon -48 KPX v comma -46 KPX v e -30 KPX v eacute -32 KPX v ecircumflex -32 KPX v egrave -32 KPX v g -36 KPX v hyphen 0 KPX v l -29 KPX v o -26 KPX v oacute -28 KPX v odieresis -28 KPX v ograve -28 KPX v oslash -29 KPX v period -51 KPX v s -30 KPX v semicolon -48 KPX w a -26 KPX w aacute -28 KPX w acircumflex -28 KPX w adieresis -28 KPX w ae -31 KPX w agrave -28 KPX w aring -28 KPX w atilde -28 KPX w c -28 KPX w colon -49 KPX w comma -47 KPX w e -32 KPX w eacute -34 KPX w ecircumflex -34 KPX w egrave -34 KPX w g -38 KPX w hyphen -4 KPX w l -30 KPX w o -28 KPX w oacute -30 KPX w odieresis -30 KPX w ograve -30 KPX w oslash -31 KPX w period -51 KPX w s -32 KPX w semicolon -49 KPX x a 6 KPX x c 0 KPX x e 0 KPX x eacute 0 KPX x o 1 KPX x q 2 KPX y a -12 KPX y aacute -12 KPX y acircumflex -12 KPX y adieresis -12 KPX y ae -17 KPX y agrave -12 KPX y aring -12 KPX y atilde -12 KPX y c -15 KPX y colon -48 KPX y comma -21 KPX y e -19 KPX y eacute -19 KPX y ecircumflex -19 KPX y egrave -19 KPX y g -34 KPX y hyphen 7 KPX y l -18 KPX y o -15 KPX y oacute -15 KPX y odieresis -15 KPX y ograve -15 KPX y oslash -16 KPX y period -25 KPX y s -19 KPX y semicolon -45 KPX zero four 14 KPX zero one -50 KPX zero seven -3 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n021004l.afm0000644000076500001440000007622107056046553016412 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusRomNo9L-Medi FullName Nimbus Roman No9 L Medium FamilyName Nimbus Roman No9 L Weight Bold ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -100 UnderlineThickness 50 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -168 -341 1000 960 CapHeight 676 XHeight 461 Descender -205 Ascender 676 StartCharMetrics 316 C 32 ; WX 250 ; N space ; B 125 0 125 0 ; C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ; C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; C 49 ; WX 500 ; N one ; B 65 0 442 688 ; C 50 ; WX 500 ; N two ; B 17 0 478 688 ; C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; C 52 ; WX 500 ; N four ; B 19 0 475 688 ; C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; C 60 ; WX 570 ; N less ; B 31 -12 539 518 ; C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; C 62 ; WX 570 ; N greater ; B 31 -12 539 518 ; C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; C 65 ; WX 722 ; N A ; B 9 0 689 690 ; C 66 ; WX 667 ; N B ; B 16 0 619 676 ; C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; C 68 ; WX 722 ; N D ; B 14 0 690 676 ; C 69 ; WX 667 ; N E ; B 16 0 641 676 ; C 70 ; WX 611 ; N F ; B 16 0 583 676 ; C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; C 72 ; WX 778 ; N H ; B 21 0 759 676 ; C 73 ; WX 389 ; N I ; B 20 0 370 676 ; C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; C 75 ; WX 778 ; N K ; B 30 0 769 676 ; C 76 ; WX 667 ; N L ; B 19 0 638 676 ; C 77 ; WX 944 ; N M ; B 14 0 921 676 ; C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; C 80 ; WX 611 ; N P ; B 16 0 600 676 ; C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; C 82 ; WX 722 ; N R ; B 26 0 715 676 ; C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; C 84 ; WX 667 ; N T ; B 31 0 636 676 ; C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; C 88 ; WX 722 ; N X ; B 16 0 699 676 ; C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; C 102 ; WX 333 ; N f ; B 14 0 389 691 ; C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; C 104 ; WX 556 ; N h ; B 16 0 534 676 ; C 105 ; WX 278 ; N i ; B 16 0 255 691 ; C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; C 107 ; WX 556 ; N k ; B 22 0 543 676 ; C 108 ; WX 278 ; N l ; B 16 0 255 676 ; C 109 ; WX 833 ; N m ; B 16 0 814 473 ; C 110 ; WX 556 ; N n ; B 21 0 539 473 ; C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; C 114 ; WX 444 ; N r ; B 29 0 434 473 ; C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; C 120 ; WX 500 ; N x ; B 12 0 484 461 ; C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; C 122 ; WX 444 ; N z ; B 21 0 420 461 ; C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; C 124 ; WX 220 ; N bar ; B 66 -19 154 691 ; C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; C 126 ; WX 520 ; N asciitilde ; B 29 175 491 331 ; C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ; C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ; C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; C 168 ; WX 500 ; N currency ; B -26 61 526 613 ; C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; C 174 ; WX 556 ; N fi ; B 14 0 536 691 ; C 175 ; WX 556 ; N fl ; B 14 0 536 691 ; C 177 ; WX 500 ; N endash ; B 0 181 500 271 ; C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ; C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ; C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; C 193 ; WX 333 ; N grave ; B 8 528 246 713 ; C 194 ; WX 333 ; N acute ; B 86 528 324 713 ; C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ; C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ; C 197 ; WX 333 ; N macron ; B 1 565 331 637 ; C 198 ; WX 333 ; N breve ; B 15 528 318 691 ; C 199 ; WX 333 ; N dotaccent ; B 103 537 232 666 ; C 200 ; WX 333 ; N dieresis ; B -2 537 337 666 ; C 202 ; WX 333 ; N ring ; B 60 537 273 750 ; C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; C 206 ; WX 333 ; N ogonek ; B 90 -173 319 44 ; C 207 ; WX 333 ; N caron ; B -2 528 335 704 ; C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ; C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ; C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ; C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ; C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ; C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ; C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ; C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 876 ; C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ; C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ; C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; C -1 ; WX 722 ; N Uring ; B 16 -19 701 960 ; C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; C -1 ; WX 444 ; N eogonek ; B 25 -173 444 473 ; C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 666 ; C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ; C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ; C -1 ; WX 444 ; N edieresis ; B 25 -14 426 666 ; C -1 ; WX 665 ; N dcaron ; B 25 -14 665 691 ; C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; C -1 ; WX 500 ; N aogonek ; B 25 -173 500 473 ; C -1 ; WX 500 ; N aring ; B 25 -14 488 750 ; C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ; C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ; C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ; C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ; C -1 ; WX 500 ; N adieresis ; B 25 -14 488 666 ; C -1 ; WX 722 ; N Uogonek ; B 16 -173 701 676 ; C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ; C -1 ; WX 556 ; N udieresis ; B 16 -14 537 666 ; C -1 ; WX 400 ; N tcaron ; B 20 -12 400 691 ; C -1 ; WX 389 ; N scommaaccent ; B 25 -341 361 473 ; C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 876 ; C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ; C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; C -1 ; WX 667 ; N Tcommaaccent ; B 31 -341 636 676 ; C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 876 ; C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ; C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 876 ; C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; C -1 ; WX 667 ; N Lcaron ; B 19 0 638 691 ; C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 876 ; C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 509 713 ; C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ; C -1 ; WX 500 ; N Euro ; B -36 -24 478 671 ; C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ; C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ; C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; C -1 ; WX 389 ; N Iogonek ; B 20 -173 505 676 ; C -1 ; WX 389 ; N Idieresis ; B 20 0 370 876 ; C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; C -1 ; WX 778 ; N Kcommaaccent ; B 30 -341 769 676 ; C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ; C -1 ; WX 556 ; N Scommaaccent ; B 35 -341 513 692 ; C -1 ; WX 667 ; N Eogonek ; B 16 -173 737 676 ; C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ; C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 876 ; C -1 ; WX 278 ; N iogonek ; B 16 -173 388 691 ; C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 811 ; C -1 ; WX 500 ; N odieresis ; B 25 -14 476 666 ; C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ; C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ; C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ; C -1 ; WX 778 ; N Gcommaaccent ; B 37 -341 755 691 ; C -1 ; WX 722 ; N Rcommaaccent ; B 26 -341 715 676 ; C -1 ; WX 667 ; N Edieresis ; B 16 0 641 876 ; C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; C -1 ; WX 556 ; N uogonek ; B 16 -173 556 461 ; C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; C -1 ; WX 396 ; N lcaron ; B 16 0 396 691 ; C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; C -1 ; WX 400 ; N degree ; B 57 402 343 688 ; C -1 ; WX 722 ; N Aogonek ; B 9 -173 822 690 ; C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ; C -1 ; WX 722 ; N Aring ; B 9 0 689 948 ; C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ; C -1 ; WX 444 ; N rcommaaccent ; B 29 -341 434 473 ; C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ; C -1 ; WX 278 ; N icircumflex ; B -36 0 301 704 ; C -1 ; WX 278 ; N igrave ; B -26 0 255 713 ; C -1 ; WX 556 ; N ncommaaccent ; B 21 -341 539 473 ; C -1 ; WX 278 ; N lcommaaccent ; B 16 -341 255 676 ; C -1 ; WX 570 ; N plusminus ; B 33 0 537 568 ; C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; C -1 ; WX 278 ; N iacute ; B 16 0 290 713 ; C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; C -1 ; WX 556 ; N kcommaaccent ; B 22 -341 543 676 ; C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; C -1 ; WX 278 ; N imacron ; B -27 0 303 637 ; C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; C -1 ; WX 333 ; N tcommaaccent ; B 20 -341 332 630 ; C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 666 ; C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 666 ; C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ; C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ; C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 537 713 ; C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ; C -1 ; WX 556 ; N uring ; B 16 -14 537 750 ; C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; C -1 ; WX 333 ; N commaaccent ; B 84 -341 249 -40 ; C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ; C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ; C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; C -1 ; WX 278 ; N idieresis ; B -36 0 303 666 ; C -1 ; WX 494 ; N lozenge ; B 18 0 466 740 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 570 ; N notequal ; B 33 -13 537 519 ; C -1 ; WX 549 ; N radical ; B -17 -35 535 916 ; C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ; C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ; C -1 ; WX 570 ; N lessequal ; B 31 0 539 642 ; C -1 ; WX 570 ; N greaterequal ; B 31 0 539 642 ; C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; C -1 ; WX 713 ; N summation ; B 14 -123 695 752 ; C -1 ; WX 494 ; N partialdiff ; B 16 -20 472 743 ; C -1 ; WX 722 ; N Ncommaaccent ; B 16 -341 701 676 ; C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; C -1 ; WX 220 ; N brokenbar ; B 66 -19 154 691 ; C -1 ; WX 667 ; N Lcommaaccent ; B 19 -341 638 676 ; C -1 ; WX 722 ; N Adieresis ; B 9 0 689 876 ; C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ; C -1 ; WX 250 ; N .notdef ; B 125 0 125 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -73 KPX A Ccedilla -77 KPX A G -68 KPX A O -68 KPX A Odieresis -68 KPX A Q -68 KPX A T -59 KPX A U -66 KPX A Uacute -66 KPX A Ucircumflex -66 KPX A Udieresis -66 KPX A Ugrave -66 KPX A V -130 KPX A W -116 KPX A Y -74 KPX A a -5 KPX A b -22 KPX A c -35 KPX A ccedilla -43 KPX A comma 1 KPX A d -28 KPX A e -32 KPX A g -7 KPX A guillemotleft -53 KPX A guilsinglleft -67 KPX A hyphen -30 KPX A o -37 KPX A period 0 KPX A q -38 KPX A quotedblright -76 KPX A quoteright -108 KPX A t -27 KPX A u -30 KPX A v -84 KPX A w -79 KPX A y -83 KPX Aacute C -73 KPX Aacute G -68 KPX Aacute O -68 KPX Aacute Q -68 KPX Aacute T -59 KPX Aacute U -66 KPX Aacute V -130 KPX Aacute W -116 KPX Aacute Y -74 KPX Aacute a -5 KPX Aacute b -22 KPX Aacute c -35 KPX Aacute comma 1 KPX Aacute d -28 KPX Aacute e -32 KPX Aacute g -7 KPX Aacute guillemotleft -53 KPX Aacute guilsinglleft -67 KPX Aacute hyphen -30 KPX Aacute o -37 KPX Aacute period 0 KPX Aacute q -38 KPX Aacute quoteright -108 KPX Aacute t -27 KPX Aacute u -30 KPX Aacute v -84 KPX Aacute w -79 KPX Aacute y -83 KPX Acircumflex C -73 KPX Acircumflex G -68 KPX Acircumflex O -68 KPX Acircumflex Q -68 KPX Acircumflex T -59 KPX Acircumflex U -66 KPX Acircumflex V -130 KPX Acircumflex W -116 KPX Acircumflex Y -74 KPX Acircumflex comma 1 KPX Acircumflex period 0 KPX Adieresis C -73 KPX Adieresis G -68 KPX Adieresis O -68 KPX Adieresis Q -68 KPX Adieresis T -59 KPX Adieresis U -66 KPX Adieresis V -130 KPX Adieresis W -116 KPX Adieresis Y -74 KPX Adieresis a -5 KPX Adieresis b -22 KPX Adieresis c -35 KPX Adieresis comma 1 KPX Adieresis d -28 KPX Adieresis g -7 KPX Adieresis guillemotleft -53 KPX Adieresis guilsinglleft -67 KPX Adieresis hyphen -30 KPX Adieresis o -37 KPX Adieresis period 0 KPX Adieresis q -38 KPX Adieresis quotedblright -76 KPX Adieresis quoteright -108 KPX Adieresis t -27 KPX Adieresis u -30 KPX Adieresis v -84 KPX Adieresis w -79 KPX Adieresis y -83 KPX Agrave C -73 KPX Agrave G -68 KPX Agrave O -68 KPX Agrave Q -68 KPX Agrave T -59 KPX Agrave U -66 KPX Agrave V -130 KPX Agrave W -116 KPX Agrave Y -74 KPX Agrave comma 1 KPX Agrave period 0 KPX Aring C -73 KPX Aring G -68 KPX Aring O -68 KPX Aring Q -68 KPX Aring T -59 KPX Aring U -66 KPX Aring V -130 KPX Aring W -116 KPX Aring Y -74 KPX Aring a -5 KPX Aring b -22 KPX Aring c -35 KPX Aring comma 1 KPX Aring d -28 KPX Aring e -32 KPX Aring g -7 KPX Aring guillemotleft -53 KPX Aring guilsinglleft -67 KPX Aring hyphen -30 KPX Aring o -37 KPX Aring period 0 KPX Aring q -38 KPX Aring quotedblright -76 KPX Aring quoteright -108 KPX Aring t -27 KPX Aring u -30 KPX Aring v -84 KPX Aring w -79 KPX Aring y -83 KPX Atilde C -73 KPX Atilde G -68 KPX Atilde O -68 KPX Atilde Q -68 KPX Atilde T -59 KPX Atilde U -66 KPX Atilde V -130 KPX Atilde W -116 KPX Atilde Y -74 KPX Atilde comma 1 KPX Atilde period 0 KPX B A -34 KPX B AE -32 KPX B Aacute -34 KPX B Acircumflex -34 KPX B Adieresis -34 KPX B Aring -34 KPX B Atilde -34 KPX B O -12 KPX B OE -4 KPX B Oacute -12 KPX B Ocircumflex -12 KPX B Odieresis -12 KPX B Ograve -12 KPX B Oslash -11 KPX B V -45 KPX B W -46 KPX B Y -44 KPX C A -25 KPX C AE -22 KPX C Aacute -25 KPX C Adieresis -25 KPX C Aring -25 KPX C H -2 KPX C K -6 KPX C O -14 KPX C Oacute -14 KPX C Odieresis -14 KPX Ccedilla A -33 KPX D A -55 KPX D Aacute -55 KPX D Acircumflex -55 KPX D Adieresis -55 KPX D Agrave -55 KPX D Aring -55 KPX D Atilde -55 KPX D J -40 KPX D T -7 KPX D V -60 KPX D W -50 KPX D X -51 KPX D Y -59 KPX F A -79 KPX F Aacute -79 KPX F Acircumflex -79 KPX F Adieresis -79 KPX F Agrave -79 KPX F Aring -79 KPX F Atilde -79 KPX F J -42 KPX F O -7 KPX F Odieresis -7 KPX F a -50 KPX F aacute -50 KPX F adieresis -22 KPX F ae -53 KPX F aring -50 KPX F comma -59 KPX F e -51 KPX F eacute -51 KPX F hyphen -34 KPX F i -1 KPX F j -26 KPX F o -54 KPX F oacute -54 KPX F odieresis -24 KPX F oe -51 KPX F oslash -53 KPX F period -60 KPX F r -7 KPX F u -10 KPX G A -27 KPX G AE -24 KPX G Aacute -27 KPX G Acircumflex -27 KPX G Adieresis -27 KPX G Agrave -27 KPX G Aring -27 KPX G Atilde -27 KPX G T -41 KPX G V -33 KPX G W -35 KPX G Y -33 KPX J A -30 KPX J AE -27 KPX J Adieresis -30 KPX J Aring -30 KPX K C -61 KPX K G -56 KPX K O -56 KPX K OE -46 KPX K Oacute -56 KPX K Odieresis -56 KPX K S 13 KPX K T -2 KPX K a 6 KPX K adieresis 6 KPX K ae 3 KPX K aring 6 KPX K e -20 KPX K hyphen -47 KPX K o -25 KPX K oacute -25 KPX K odieresis -25 KPX K u -18 KPX K udieresis -18 KPX K y -83 KPX L A -1 KPX L AE 1 KPX L Aacute -1 KPX L Adieresis -1 KPX L Aring -1 KPX L C -11 KPX L Ccedilla -14 KPX L G -5 KPX L O -5 KPX L Oacute -5 KPX L Ocircumflex -5 KPX L Odieresis -5 KPX L Ograve -5 KPX L Otilde -5 KPX L S 2 KPX L T -74 KPX L U -29 KPX L Udieresis -29 KPX L V -106 KPX L W -87 KPX L Y -89 KPX L hyphen 24 KPX L quotedblright -37 KPX L quoteright -69 KPX L u -11 KPX L udieresis -12 KPX L y -49 KPX N A -19 KPX N AE -16 KPX N Aacute -19 KPX N Adieresis -19 KPX N Aring -19 KPX N C -22 KPX N Ccedilla -22 KPX N G -16 KPX N O -15 KPX N Oacute -15 KPX N Odieresis -15 KPX N a -16 KPX N aacute -16 KPX N adieresis -16 KPX N ae -18 KPX N aring -16 KPX N comma 1 KPX N e -13 KPX N eacute -13 KPX N o -16 KPX N oacute -16 KPX N odieresis -16 KPX N oslash -15 KPX N period 0 KPX N u -17 KPX N udieresis -17 KPX O A -55 KPX O AE -54 KPX O Aacute -55 KPX O Adieresis -55 KPX O Aring -55 KPX O T -9 KPX O V -60 KPX O W -54 KPX O X -51 KPX O Y -59 KPX Oacute A -55 KPX Oacute T -9 KPX Oacute V -60 KPX Oacute W -54 KPX Oacute Y -59 KPX Ocircumflex T -9 KPX Ocircumflex V -60 KPX Ocircumflex Y -59 KPX Odieresis A -55 KPX Odieresis T -9 KPX Odieresis V -60 KPX Odieresis W -54 KPX Odieresis X -51 KPX Odieresis Y -59 KPX Ograve T -9 KPX Ograve V -60 KPX Ograve Y -59 KPX Oslash A -52 KPX Otilde T -9 KPX Otilde V -60 KPX Otilde Y -59 KPX P A -81 KPX P AE -94 KPX P Aacute -81 KPX P Adieresis -81 KPX P Aring -81 KPX P J -68 KPX P a -19 KPX P aacute -19 KPX P adieresis -19 KPX P ae -22 KPX P aring -19 KPX P comma -85 KPX P e -29 KPX P eacute -29 KPX P hyphen -39 KPX P o -33 KPX P oacute -33 KPX P odieresis -22 KPX P oe -30 KPX P oslash -33 KPX P period -86 KPX R C -36 KPX R Ccedilla -37 KPX R G -30 KPX R O -29 KPX R OE -22 KPX R Oacute -29 KPX R Odieresis -29 KPX R T -26 KPX R U -37 KPX R Udieresis -37 KPX R V -53 KPX R W -55 KPX R Y -53 KPX R a 7 KPX R aacute 7 KPX R adieresis 7 KPX R ae 4 KPX R aring 7 KPX R e -19 KPX R eacute -19 KPX R hyphen -30 KPX R o -24 KPX R oacute -24 KPX R odieresis -24 KPX R oe -21 KPX R u -17 KPX R uacute -17 KPX R udieresis -17 KPX R y -27 KPX S A -24 KPX S AE -21 KPX S Aacute -24 KPX S Adieresis -24 KPX S Aring -24 KPX S T -16 KPX S V -9 KPX S W -10 KPX S Y -8 KPX S t -10 KPX T A -46 KPX T AE -44 KPX T Aacute -46 KPX T Acircumflex -46 KPX T Adieresis -46 KPX T Agrave -46 KPX T Aring -46 KPX T Atilde -46 KPX T C -17 KPX T G -11 KPX T J -43 KPX T O -9 KPX T OE -3 KPX T Oacute -9 KPX T Ocircumflex -9 KPX T Odieresis -9 KPX T Ograve -9 KPX T Oslash -11 KPX T Otilde -9 KPX T S -2 KPX T V 11 KPX T W 9 KPX T Y 11 KPX T a -65 KPX T ae -69 KPX T c -88 KPX T colon -85 KPX T comma -63 KPX T e -85 KPX T g -68 KPX T guillemotleft -99 KPX T guilsinglleft -113 KPX T hyphen -73 KPX T i -16 KPX T j -40 KPX T o -88 KPX T oslash -87 KPX T period -64 KPX T r -61 KPX T s -59 KPX T semicolon -85 KPX T u -89 KPX T v -106 KPX T w -107 KPX T y -104 KPX U A -54 KPX U AE -52 KPX U Aacute -54 KPX U Acircumflex -54 KPX U Adieresis -54 KPX U Aring -54 KPX U Atilde -54 KPX U comma -17 KPX U m -23 KPX U n -25 KPX U p -28 KPX U period -18 KPX U r -29 KPX Uacute A -54 KPX Uacute comma -17 KPX Uacute m -23 KPX Uacute n -25 KPX Uacute p -28 KPX Uacute period -18 KPX Uacute r -29 KPX Ucircumflex A -54 KPX Udieresis A -54 KPX Udieresis b 10 KPX Udieresis comma -17 KPX Udieresis m -23 KPX Udieresis n -25 KPX Udieresis p -28 KPX Udieresis period -18 KPX Udieresis r -29 KPX Ugrave A -54 KPX V A -113 KPX V AE -113 KPX V Aacute -113 KPX V Acircumflex -113 KPX V Adieresis -113 KPX V Agrave -113 KPX V Aring -113 KPX V Atilde -113 KPX V C -70 KPX V G -64 KPX V O -63 KPX V Oacute -63 KPX V Ocircumflex -63 KPX V Odieresis -63 KPX V Ograve -63 KPX V Oslash -65 KPX V Otilde -63 KPX V S -25 KPX V T 8 KPX V a -87 KPX V ae -90 KPX V colon -94 KPX V comma -94 KPX V e -86 KPX V g -86 KPX V guillemotleft -98 KPX V guilsinglleft -112 KPX V hyphen -68 KPX V i -13 KPX V o -89 KPX V oslash -87 KPX V period -95 KPX V r -60 KPX V semicolon -94 KPX V u -58 KPX V y -56 KPX W A -98 KPX W AE -102 KPX W Aacute -98 KPX W Acircumflex -98 KPX W Adieresis -98 KPX W Agrave -98 KPX W Aring -98 KPX W Atilde -98 KPX W C -58 KPX W G -52 KPX W O -51 KPX W Oacute -51 KPX W Ocircumflex -51 KPX W Odieresis -51 KPX W Ograve -51 KPX W Oslash -50 KPX W Otilde -51 KPX W S -24 KPX W T 9 KPX W a -70 KPX W ae -73 KPX W colon -81 KPX W comma -72 KPX W e -67 KPX W g -70 KPX W guillemotleft -79 KPX W guilsinglleft -93 KPX W hyphen -49 KPX W i -12 KPX W o -70 KPX W oslash -69 KPX W period -73 KPX W r -49 KPX W semicolon -80 KPX W u -45 KPX W y -44 KPX X C -63 KPX X O -56 KPX X Odieresis -56 KPX X Q -57 KPX X a 0 KPX X e -27 KPX X hyphen -43 KPX X o -32 KPX X u -25 KPX X y -90 KPX Y A -64 KPX Y AE -62 KPX Y Aacute -64 KPX Y Acircumflex -64 KPX Y Adieresis -64 KPX Y Agrave -64 KPX Y Aring -64 KPX Y Atilde -64 KPX Y C -71 KPX Y G -65 KPX Y O -64 KPX Y Oacute -64 KPX Y Ocircumflex -64 KPX Y Odieresis -64 KPX Y Ograve -64 KPX Y Oslash -68 KPX Y Otilde -64 KPX Y S -26 KPX Y T 7 KPX Y a -83 KPX Y ae -87 KPX Y colon -103 KPX Y comma -80 KPX Y e -93 KPX Y g -86 KPX Y guillemotleft -111 KPX Y guilsinglleft -125 KPX Y hyphen -87 KPX Y i -14 KPX Y o -96 KPX Y oslash -95 KPX Y p -72 KPX Y period -81 KPX Y semicolon -103 KPX Y u -76 KPX Y v -78 KPX Z v -45 KPX Z y -44 KPX a j -39 KPX a quoteright -34 KPX a v -39 KPX a w -40 KPX a y -44 KPX aacute v -39 KPX aacute w -40 KPX aacute y -44 KPX adieresis v -39 KPX adieresis w -40 KPX adieresis y -44 KPX ae v -34 KPX ae w -35 KPX ae y -37 KPX agrave v -39 KPX agrave w -40 KPX agrave y -44 KPX aring v -39 KPX aring w -40 KPX aring y -44 KPX b v -39 KPX b w -40 KPX b y -42 KPX c h -17 KPX c k -18 KPX comma one -12 KPX comma quotedblright 9 KPX comma quoteright -23 KPX e quoteright -19 KPX e t -10 KPX e v -29 KPX e w -30 KPX e x -19 KPX e y -31 KPX eacute v -29 KPX eacute w -30 KPX eacute y -31 KPX ecircumflex v -29 KPX ecircumflex w -30 KPX ecircumflex y -31 KPX eight four 11 KPX eight one -19 KPX eight seven 0 KPX f a -17 KPX f aacute -17 KPX f adieresis 14 KPX f ae -21 KPX f aring -15 KPX f e -29 KPX f eacute -29 KPX f f 12 KPX f i 22 KPX f j -1 KPX f l 33 KPX f o -32 KPX f oacute -32 KPX f odieresis 11 KPX f oe -29 KPX f oslash -31 KPX f quoteright 18 KPX f s -8 KPX f t -3 KPX five four 1 KPX five one -28 KPX five seven -9 KPX four four 13 KPX four one -35 KPX four seven -16 KPX g a -15 KPX g adieresis -15 KPX g ae -18 KPX g aring -15 KPX g e -20 KPX g eacute -20 KPX g l 0 KPX g oacute -20 KPX g odieresis -20 KPX g r 1 KPX guillemotright A -40 KPX guillemotright AE -46 KPX guillemotright Aacute -40 KPX guillemotright Adieresis -40 KPX guillemotright Aring -40 KPX guillemotright T -100 KPX guillemotright V -102 KPX guillemotright W -84 KPX guillemotright Y -106 KPX guilsinglright A -54 KPX guilsinglright AE -60 KPX guilsinglright Aacute -54 KPX guilsinglright Adieresis -54 KPX guilsinglright Aring -54 KPX guilsinglright T -114 KPX guilsinglright V -116 KPX guilsinglright W -98 KPX guilsinglright Y -120 KPX h quoteright -30 KPX h y -34 KPX hyphen A -18 KPX hyphen AE -24 KPX hyphen Aacute -18 KPX hyphen Adieresis -18 KPX hyphen Aring -18 KPX hyphen T -74 KPX hyphen V -72 KPX hyphen W -54 KPX hyphen Y -83 KPX i T -18 KPX i j -36 KPX k a -3 KPX k aacute -3 KPX k adieresis -3 KPX k ae -7 KPX k aring -3 KPX k comma 0 KPX k e -33 KPX k eacute -33 KPX k g -4 KPX k hyphen -47 KPX k o -38 KPX k oacute -38 KPX k odieresis -38 KPX k period 0 KPX k s 5 KPX k u -5 KPX k udieresis -5 KPX l v -22 KPX l y -19 KPX m p -16 KPX m v -32 KPX m w -33 KPX m y -33 KPX n T -56 KPX n p -14 KPX n quoteright -28 KPX n v -31 KPX n w -32 KPX n y -32 KPX nine four 2 KPX nine one -26 KPX nine seven 10 KPX o T -88 KPX o quoteright -27 KPX o t -10 KPX o v -42 KPX o w -38 KPX o x -29 KPX o y -42 KPX oacute v -42 KPX oacute w -38 KPX oacute y -42 KPX ocircumflex t -10 KPX odieresis t -10 KPX odieresis v -42 KPX odieresis w -38 KPX odieresis x -29 KPX odieresis y -42 KPX ograve v -42 KPX ograve w -38 KPX ograve y -42 KPX one comma -16 KPX one eight -34 KPX one five -16 KPX one four -56 KPX one nine -9 KPX one one -27 KPX one period -17 KPX one seven -56 KPX one six -47 KPX one three -10 KPX one two -2 KPX one zero -35 KPX p t -11 KPX p y -34 KPX period one -21 KPX period quotedblright 5 KPX period quoteright -27 KPX q c -13 KPX q u -15 KPX quotedblbase A 19 KPX quotedblbase AE 20 KPX quotedblbase T -59 KPX quotedblbase V -98 KPX quotedblbase W -75 KPX quotedblbase Y -73 KPX quotedblleft A -59 KPX quotedblleft AE -78 KPX quotedblleft Aacute -59 KPX quotedblleft Adieresis -59 KPX quotedblleft Aring -59 KPX quotedblleft T 9 KPX quotedblleft V 15 KPX quotedblleft W 13 KPX quotedblleft Y 15 KPX quotedblright A -72 KPX quotedblright AE -91 KPX quotedblright Aacute -72 KPX quotedblright Adieresis -72 KPX quotedblright Aring -72 KPX quotedblright T 4 KPX quotedblright V 5 KPX quotedblright W 4 KPX quotedblright Y 6 KPX quoteleft A -92 KPX quoteleft AE -111 KPX quoteleft Aacute -92 KPX quoteleft Adieresis -92 KPX quoteleft Aring -92 KPX quoteleft T -22 KPX quoteleft V -17 KPX quoteleft W -19 KPX quoteleft Y -17 KPX quoteright A -91 KPX quoteright AE -110 KPX quoteright Aacute -91 KPX quoteright Adieresis -91 KPX quoteright Aring -91 KPX quoteright comma -34 KPX quoteright d -31 KPX quoteright o -34 KPX quoteright period -35 KPX quoteright r -26 KPX quoteright s -17 KPX quoteright t -19 KPX quoteright v -25 KPX quoteright w -23 KPX quoteright y -22 KPX r a -6 KPX r aacute -6 KPX r acircumflex -6 KPX r adieresis -6 KPX r ae -8 KPX r agrave -6 KPX r aring -6 KPX r c -15 KPX r ccedilla -10 KPX r colon -16 KPX r comma -67 KPX r d -13 KPX r e -11 KPX r eacute -11 KPX r ecircumflex -11 KPX r egrave -11 KPX r f 11 KPX r g -5 KPX r h -15 KPX r hyphen -18 KPX r i 6 KPX r j -12 KPX r k -15 KPX r l -14 KPX r m 6 KPX r n 4 KPX r o -14 KPX r oacute -14 KPX r ocircumflex -14 KPX r odieresis -14 KPX r oe -12 KPX r ograve -14 KPX r oslash -14 KPX r p 4 KPX r period -68 KPX r q -15 KPX r quoteright -8 KPX r r 0 KPX r s 0 KPX r semicolon -16 KPX r t 9 KPX r u 9 KPX r v 8 KPX r w 7 KPX r x 11 KPX r y 9 KPX r z -1 KPX s quoteright -17 KPX s t -7 KPX seven colon -64 KPX seven comma -57 KPX seven eight -18 KPX seven five -34 KPX seven four -54 KPX seven one -25 KPX seven period -58 KPX seven seven -6 KPX seven six -37 KPX seven three -20 KPX seven two -21 KPX six four 13 KPX six one -43 KPX six seven -7 KPX t S 11 KPX t a 11 KPX t aacute 11 KPX t adieresis 11 KPX t ae 7 KPX t aring 11 KPX t colon -12 KPX t e -1 KPX t eacute -1 KPX t h -4 KPX t o -4 KPX t oacute -4 KPX t odieresis -4 KPX t quoteright -31 KPX t semicolon -12 KPX three four 9 KPX three one -33 KPX three seven -15 KPX two four 14 KPX two one -29 KPX two seven -7 KPX u quoteright -25 KPX v a -23 KPX v aacute -23 KPX v acircumflex -23 KPX v adieresis -23 KPX v ae -25 KPX v agrave -23 KPX v aring -23 KPX v atilde -23 KPX v c -40 KPX v colon -23 KPX v comma -56 KPX v e -35 KPX v eacute -35 KPX v ecircumflex -35 KPX v egrave -35 KPX v g -22 KPX v hyphen -27 KPX v l -16 KPX v o -40 KPX v oacute -40 KPX v odieresis -40 KPX v ograve -40 KPX v oslash -39 KPX v period -57 KPX v s -16 KPX v semicolon -23 KPX w a -23 KPX w aacute -23 KPX w acircumflex -23 KPX w adieresis -23 KPX w ae -25 KPX w agrave -23 KPX w aring -23 KPX w atilde -23 KPX w c -36 KPX w colon -23 KPX w comma -50 KPX w e -33 KPX w eacute -33 KPX w ecircumflex -33 KPX w egrave -33 KPX w g -22 KPX w hyphen -23 KPX w l -16 KPX w o -36 KPX w oacute -36 KPX w odieresis -36 KPX w ograve -36 KPX w oslash -35 KPX w period -51 KPX w s -16 KPX w semicolon -23 KPX x a -2 KPX x c -30 KPX x e -27 KPX x eacute -27 KPX x o -30 KPX x q -32 KPX y a -32 KPX y aacute -32 KPX y acircumflex -32 KPX y adieresis -32 KPX y ae -34 KPX y agrave -32 KPX y aring -32 KPX y atilde -32 KPX y c -42 KPX y colon -28 KPX y comma -56 KPX y e -40 KPX y eacute -40 KPX y ecircumflex -40 KPX y egrave -40 KPX y g -31 KPX y hyphen -29 KPX y l -19 KPX y o -42 KPX y oacute -42 KPX y odieresis -42 KPX y ograve -42 KPX y oslash -41 KPX y period -57 KPX y s -24 KPX y semicolon -28 KPX zero four 11 KPX zero one -31 KPX zero seven 7 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n019004l.afm0000644000076500001440000007555307056046552016427 0ustar fnevgenyusersStartFontMetrics 3.0 Comment Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development Comment Creation Date: 12/22/1999 Comment See the file COPYING (GNU General Public License) for license conditions. FontName NimbusSanL-Bold FullName Nimbus Sans L Bold FamilyName Nimbus Sans L Weight Bold ItalicAngle 0.0 IsFixedPitch false UnderlinePosition -155 UnderlineThickness 69 Version 1.05 Notice (URW)++,Copyright 1999 by (URW)++ Design & Development EncodingScheme AdobeStandardEncoding FontBBox -173 -307 1003 949 CapHeight 729 XHeight 540 Descender -217 Ascender 729 StartCharMetrics 316 C 32 ; WX 278 ; N space ; B 214 0 214 0 ; C 33 ; WX 333 ; N exclam ; B 112 0 262 726 ; C 34 ; WX 474 ; N quotedbl ; B 50 470 424 729 ; C 35 ; WX 556 ; N numbersign ; B 3 -32 553 697 ; C 36 ; WX 556 ; N dollar ; B 22 -126 527 763 ; C 37 ; WX 889 ; N percent ; B 22 -20 863 709 ; C 38 ; WX 722 ; N ampersand ; B 55 -23 694 723 ; C 39 ; WX 278 ; N quoteright ; B 66 469 201 729 ; C 40 ; WX 333 ; N parenleft ; B 40 -200 303 729 ; C 41 ; WX 333 ; N parenright ; B 22 -200 285 729 ; C 42 ; WX 389 ; N asterisk ; B 23 407 357 729 ; C 43 ; WX 584 ; N plus ; B 50 -10 533 473 ; C 44 ; WX 278 ; N comma ; B 64 -174 214 146 ; C 45 ; WX 333 ; N hyphen ; B 26 207 298 342 ; C 46 ; WX 278 ; N period ; B 64 0 214 146 ; C 47 ; WX 278 ; N slash ; B 2 -14 275 714 ; C 48 ; WX 556 ; N zero ; B 29 -23 517 724 ; C 49 ; WX 556 ; N one ; B 68 0 378 709 ; C 50 ; WX 556 ; N two ; B 30 0 515 724 ; C 51 ; WX 556 ; N three ; B 29 -23 516 724 ; C 52 ; WX 556 ; N four ; B 24 0 522 709 ; C 53 ; WX 556 ; N five ; B 27 -23 517 709 ; C 54 ; WX 556 ; N six ; B 32 -23 519 724 ; C 55 ; WX 556 ; N seven ; B 29 0 528 709 ; C 56 ; WX 556 ; N eight ; B 22 -23 525 724 ; C 57 ; WX 556 ; N nine ; B 28 -24 516 724 ; C 58 ; WX 333 ; N colon ; B 113 0 263 520 ; C 59 ; WX 333 ; N semicolon ; B 113 -174 263 520 ; C 60 ; WX 584 ; N less ; B 40 -10 529 474 ; C 61 ; WX 584 ; N equal ; B 50 52 534 411 ; C 62 ; WX 584 ; N greater ; B 40 -10 529 474 ; C 63 ; WX 611 ; N question ; B 64 0 556 744 ; C 64 ; WX 975 ; N at ; B 27 -138 947 745 ; C 65 ; WX 722 ; N A ; B 26 0 703 729 ; C 66 ; WX 722 ; N B ; B 82 0 666 729 ; C 67 ; WX 722 ; N C ; B 44 -23 685 741 ; C 68 ; WX 722 ; N D ; B 77 0 681 729 ; C 69 ; WX 667 ; N E ; B 79 0 624 729 ; C 70 ; WX 611 ; N F ; B 74 0 586 729 ; C 71 ; WX 778 ; N G ; B 42 -23 711 741 ; C 72 ; WX 722 ; N H ; B 68 0 657 729 ; C 73 ; WX 278 ; N I ; B 63 0 213 729 ; C 74 ; WX 556 ; N J ; B 24 -23 486 729 ; C 75 ; WX 722 ; N K ; B 74 0 717 729 ; C 76 ; WX 611 ; N L ; B 80 0 579 729 ; C 77 ; WX 833 ; N M ; B 66 0 776 729 ; C 78 ; WX 722 ; N N ; B 68 0 661 729 ; C 79 ; WX 778 ; N O ; B 40 -23 742 741 ; C 80 ; WX 667 ; N P ; B 76 0 633 729 ; C 81 ; WX 778 ; N Q ; B 43 -54 745 741 ; C 82 ; WX 722 ; N R ; B 80 0 677 729 ; C 83 ; WX 667 ; N S ; B 32 -23 633 741 ; C 84 ; WX 611 ; N T ; B 14 0 598 729 ; C 85 ; WX 722 ; N U ; B 76 -23 654 729 ; C 86 ; WX 667 ; N V ; B 24 0 647 729 ; C 87 ; WX 944 ; N W ; B 13 0 932 729 ; C 88 ; WX 667 ; N X ; B 22 0 653 729 ; C 89 ; WX 667 ; N Y ; B 27 0 650 729 ; C 90 ; WX 611 ; N Z ; B 30 0 578 729 ; C 91 ; WX 333 ; N bracketleft ; B 66 -200 308 729 ; C 92 ; WX 278 ; N backslash ; B -12 -14 289 714 ; C 93 ; WX 333 ; N bracketright ; B 18 -200 260 729 ; C 94 ; WX 584 ; N asciicircum ; B 61 270 522 695 ; C 95 ; WX 556 ; N underscore ; B -22 -189 578 -120 ; C 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ; C 97 ; WX 556 ; N a ; B 28 -23 524 549 ; C 98 ; WX 611 ; N b ; B 59 -23 575 729 ; C 99 ; WX 556 ; N c ; B 34 -23 522 549 ; C 100 ; WX 611 ; N d ; B 29 -23 545 729 ; C 101 ; WX 556 ; N e ; B 22 -23 525 549 ; C 102 ; WX 333 ; N f ; B 14 0 313 729 ; C 103 ; WX 611 ; N g ; B 34 -218 541 549 ; C 104 ; WX 611 ; N h ; B 67 0 541 729 ; C 105 ; WX 278 ; N i ; B 67 0 207 729 ; C 106 ; WX 278 ; N j ; B 4 -218 210 729 ; C 107 ; WX 556 ; N k ; B 59 0 548 729 ; C 108 ; WX 278 ; N l ; B 67 0 207 729 ; C 109 ; WX 889 ; N m ; B 60 0 824 549 ; C 110 ; WX 611 ; N n ; B 63 0 546 549 ; C 111 ; WX 611 ; N o ; B 35 -23 569 549 ; C 112 ; WX 611 ; N p ; B 58 -218 574 549 ; C 113 ; WX 611 ; N q ; B 28 -218 544 549 ; C 114 ; WX 389 ; N r ; B 63 0 370 549 ; C 115 ; WX 556 ; N s ; B 29 -23 520 549 ; C 116 ; WX 333 ; N t ; B 14 -23 301 674 ; C 117 ; WX 611 ; N u ; B 58 -23 541 540 ; C 118 ; WX 556 ; N v ; B 14 0 536 540 ; C 119 ; WX 778 ; N w ; B 5 0 766 540 ; C 120 ; WX 556 ; N x ; B 16 0 535 540 ; C 121 ; WX 556 ; N y ; B 9 -219 538 540 ; C 122 ; WX 500 ; N z ; B 21 0 468 540 ; C 123 ; WX 389 ; N braceleft ; B 37 -200 317 729 ; C 124 ; WX 280 ; N bar ; B 100 -200 180 729 ; C 125 ; WX 389 ; N braceright ; B 72 -200 352 729 ; C 126 ; WX 584 ; N asciitilde ; B 60 142 519 314 ; C 161 ; WX 333 ; N exclamdown ; B 66 -186 216 540 ; C 162 ; WX 556 ; N cent ; B 36 -124 522 634 ; C 163 ; WX 556 ; N sterling ; B 31 -23 537 715 ; C 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ; C 165 ; WX 556 ; N yen ; B 5 0 552 704 ; C 166 ; WX 556 ; N florin ; B 21 -220 535 744 ; C 167 ; WX 556 ; N section ; B 33 -201 518 723 ; C 168 ; WX 556 ; N currency ; B 26 100 530 604 ; C 169 ; WX 238 ; N quotesingle ; B 50 470 188 729 ; C 170 ; WX 500 ; N quotedblleft ; B 71 469 433 729 ; C 171 ; WX 556 ; N guillemotleft ; B 88 72 468 481 ; C 172 ; WX 333 ; N guilsinglleft ; B 83 72 250 481 ; C 173 ; WX 333 ; N guilsinglright ; B 80 72 247 481 ; C 174 ; WX 611 ; N fi ; B 9 0 548 729 ; C 175 ; WX 611 ; N fl ; B 12 0 546 729 ; C 177 ; WX 556 ; N endash ; B -9 207 557 311 ; C 178 ; WX 556 ; N dagger ; B 31 -194 523 709 ; C 179 ; WX 556 ; N daggerdbl ; B 28 -194 520 709 ; C 180 ; WX 278 ; N periodcentered ; B 64 169 188 292 ; C 182 ; WX 556 ; N paragraph ; B 19 -191 529 729 ; C 183 ; WX 350 ; N bullet ; B 50 175 300 425 ; C 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ; C 185 ; WX 500 ; N quotedblbase ; B 72 -135 432 125 ; C 186 ; WX 500 ; N quotedblright ; B 73 469 440 729 ; C 187 ; WX 556 ; N guillemotright ; B 88 72 462 481 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; C 189 ; WX 1000 ; N perthousand ; B 11 -22 990 739 ; C 191 ; WX 611 ; N questiondown ; B 51 -204 544 540 ; C 193 ; WX 333 ; N grave ; B 17 607 213 757 ; C 194 ; WX 333 ; N acute ; B 121 607 317 757 ; C 195 ; WX 333 ; N circumflex ; B 8 607 326 757 ; C 196 ; WX 333 ; N tilde ; B -9 621 345 749 ; C 197 ; WX 333 ; N macron ; B 16 640 315 719 ; C 198 ; WX 333 ; N breve ; B 35 605 299 748 ; C 199 ; WX 333 ; N dotaccent ; B 112 621 222 743 ; C 200 ; WX 333 ; N dieresis ; B 18 621 314 743 ; C 202 ; WX 333 ; N ring ; B 77 590 257 770 ; C 203 ; WX 333 ; N cedilla ; B 27 -220 294 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -44 610 340 757 ; C 206 ; WX 333 ; N ogonek ; B 45 -234 268 0 ; C 207 ; WX 333 ; N caron ; B 9 607 327 757 ; C 208 ; WX 1000 ; N emdash ; B -7 207 1003 311 ; C 225 ; WX 1000 ; N AE ; B 1 0 966 729 ; C 227 ; WX 370 ; N ordfeminine ; B 31 262 329 729 ; C 232 ; WX 611 ; N Lslash ; B 0 0 597 729 ; C 233 ; WX 778 ; N Oslash ; B 31 -39 755 749 ; C 234 ; WX 1000 ; N OE ; B 28 -23 970 741 ; C 235 ; WX 365 ; N ordmasculine ; B 23 262 343 729 ; C 241 ; WX 889 ; N ae ; B 27 -24 857 549 ; C 245 ; WX 278 ; N dotlessi ; B 67 0 207 540 ; C 248 ; WX 278 ; N lslash ; B 0 0 252 729 ; C 249 ; WX 611 ; N oslash ; B 11 -38 598 557 ; C 250 ; WX 944 ; N oe ; B 23 -23 920 549 ; C 251 ; WX 611 ; N germandbls ; B 67 -17 575 729 ; C -1 ; WX 722 ; N Udieresis ; B 76 -23 654 922 ; C -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ; C -1 ; WX 667 ; N Scedilla ; B 32 -220 633 741 ; C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; C -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ; C -1 ; WX 722 ; N Rcaron ; B 80 0 677 936 ; C -1 ; WX 722 ; N Racute ; B 80 0 677 936 ; C -1 ; WX 667 ; N Sacute ; B 32 -23 633 936 ; C -1 ; WX 778 ; N Otilde ; B 40 -23 742 928 ; C -1 ; WX 611 ; N ucircumflex ; B 58 -23 541 757 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 40 -23 742 936 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 76 -23 654 936 ; C -1 ; WX 667 ; N Yacute ; B 27 0 650 936 ; C -1 ; WX 722 ; N Eth ; B 0 0 681 729 ; C -1 ; WX 722 ; N Dcroat ; B 0 0 681 729 ; C -1 ; WX 611 ; N Zacute ; B 30 0 578 936 ; C -1 ; WX 722 ; N Uring ; B 76 -23 654 949 ; C -1 ; WX 611 ; N gbreve ; B 34 -218 541 748 ; C -1 ; WX 556 ; N eogonek ; B 21 -234 525 549 ; C -1 ; WX 556 ; N edotaccent ; B 22 -23 525 743 ; C -1 ; WX 556 ; N ecaron ; B 22 -23 525 757 ; C -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ; C -1 ; WX 667 ; N Thorn ; B 76 0 633 729 ; C -1 ; WX 556 ; N eacute ; B 22 -23 525 757 ; C -1 ; WX 556 ; N edieresis ; B 22 -23 525 743 ; C -1 ; WX 707 ; N dcaron ; B 29 -23 720 729 ; C -1 ; WX 556 ; N ccedilla ; B 34 -220 522 549 ; C -1 ; WX 556 ; N ccaron ; B 34 -23 522 757 ; C -1 ; WX 556 ; N cacute ; B 34 -23 522 757 ; C -1 ; WX 556 ; N aogonek ; B 28 -233 548 549 ; C -1 ; WX 556 ; N aring ; B 28 -23 524 770 ; C -1 ; WX 556 ; N atilde ; B 28 -23 524 749 ; C -1 ; WX 556 ; N abreve ; B 28 -23 524 748 ; C -1 ; WX 556 ; N egrave ; B 22 -23 525 757 ; C -1 ; WX 556 ; N agrave ; B 28 -23 524 757 ; C -1 ; WX 556 ; N aacute ; B 28 -23 524 757 ; C -1 ; WX 556 ; N adieresis ; B 28 -23 524 743 ; C -1 ; WX 722 ; N Uogonek ; B 76 -234 654 729 ; C -1 ; WX 611 ; N ugrave ; B 58 -23 541 757 ; C -1 ; WX 611 ; N uacute ; B 58 -23 541 757 ; C -1 ; WX 611 ; N udieresis ; B 58 -23 541 743 ; C -1 ; WX 385 ; N tcaron ; B 14 -23 398 829 ; C -1 ; WX 556 ; N scommaaccent ; B 29 -307 520 549 ; C -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ; C -1 ; WX 556 ; N ecircumflex ; B 22 -23 525 757 ; C -1 ; WX 722 ; N Ucircumflex ; B 76 -23 654 936 ; C -1 ; WX 556 ; N acircumflex ; B 28 -23 524 757 ; C -1 ; WX 611 ; N Zdotaccent ; B 30 0 578 922 ; C -1 ; WX 556 ; N scaron ; B 29 -23 520 757 ; C -1 ; WX 722 ; N Amacron ; B 26 0 703 898 ; C -1 ; WX 556 ; N sacute ; B 29 -23 520 757 ; C -1 ; WX 611 ; N Tcommaaccent ; B 14 -307 598 729 ; C -1 ; WX 667 ; N Ydieresis ; B 27 0 650 922 ; C -1 ; WX 611 ; N thorn ; B 58 -218 574 729 ; C -1 ; WX 667 ; N Emacron ; B 79 0 624 898 ; C -1 ; WX 778 ; N Ograve ; B 40 -23 742 936 ; C -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ; C -1 ; WX 778 ; N Odieresis ; B 40 -23 742 922 ; C -1 ; WX 722 ; N Ntilde ; B 68 0 661 928 ; C -1 ; WX 722 ; N Ncaron ; B 68 0 661 936 ; C -1 ; WX 722 ; N Nacute ; B 68 0 661 936 ; C -1 ; WX 611 ; N Lcaron ; B 80 0 579 729 ; C -1 ; WX 611 ; N Lacute ; B 80 0 579 936 ; C -1 ; WX 278 ; N Idotaccent ; B 63 0 213 922 ; C -1 ; WX 389 ; N racute ; B 63 0 370 757 ; C -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ; C -1 ; WX 611 ; N ohungarumlaut ; B 35 -23 569 757 ; C -1 ; WX 611 ; N otilde ; B 35 -23 569 749 ; C -1 ; WX 556 ; N Euro ; B 6 -23 546 724 ; C -1 ; WX 611 ; N ocircumflex ; B 35 -23 569 757 ; C -1 ; WX 351 ; N onesuperior ; B 40 284 242 709 ; C -1 ; WX 351 ; N twosuperior ; B 16 284 328 718 ; C -1 ; WX 351 ; N threesuperior ; B 15 271 329 718 ; C -1 ; WX 278 ; N Igrave ; B -10 0 213 936 ; C -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ; C -1 ; WX 278 ; N Imacron ; B 2 0 274 898 ; C -1 ; WX 278 ; N Iogonek ; B 34 -233 237 729 ; C -1 ; WX 278 ; N Idieresis ; B -9 0 287 922 ; C -1 ; WX 778 ; N Gbreve ; B 42 -23 711 927 ; C -1 ; WX 722 ; N Umacron ; B 76 -23 654 898 ; C -1 ; WX 722 ; N Kcommaaccent ; B 74 -307 717 729 ; C -1 ; WX 611 ; N ograve ; B 35 -23 569 757 ; C -1 ; WX 667 ; N Scommaaccent ; B 32 -307 633 741 ; C -1 ; WX 667 ; N Eogonek ; B 79 -233 648 729 ; C -1 ; WX 611 ; N oacute ; B 35 -23 569 757 ; C -1 ; WX 667 ; N Edotaccent ; B 79 0 624 922 ; C -1 ; WX 278 ; N iogonek ; B 34 -233 231 729 ; C -1 ; WX 611 ; N gcommaaccent ; B 34 -218 541 853 ; C -1 ; WX 611 ; N odieresis ; B 35 -23 569 743 ; C -1 ; WX 611 ; N ntilde ; B 63 0 546 749 ; C -1 ; WX 611 ; N ncaron ; B 63 0 546 757 ; C -1 ; WX 667 ; N Ecaron ; B 79 0 624 936 ; C -1 ; WX 667 ; N Ecircumflex ; B 79 0 624 936 ; C -1 ; WX 556 ; N scedilla ; B 29 -220 520 549 ; C -1 ; WX 389 ; N rcaron ; B 54 0 372 757 ; C -1 ; WX 667 ; N Egrave ; B 79 0 624 936 ; C -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 42 -307 711 741 ; C -1 ; WX 722 ; N Rcommaaccent ; B 80 -307 677 729 ; C -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ; C -1 ; WX 611 ; N nacute ; B 63 0 546 757 ; C -1 ; WX 611 ; N uogonek ; B 58 -233 564 540 ; C -1 ; WX 611 ; N umacron ; B 58 -23 541 719 ; C -1 ; WX 722 ; N Dcaron ; B 77 0 681 936 ; C -1 ; WX 369 ; N lcaron ; B 67 0 382 729 ; C -1 ; WX 722 ; N Ccaron ; B 44 -23 685 936 ; C -1 ; WX 722 ; N Cacute ; B 44 -23 685 936 ; C -1 ; WX 722 ; N Ccedilla ; B 44 -220 685 741 ; C -1 ; WX 606 ; N degree ; B 151 383 454 686 ; C -1 ; WX 722 ; N Aogonek ; B 26 -233 723 729 ; C -1 ; WX 584 ; N minus ; B 40 172 544 291 ; C -1 ; WX 584 ; N multiply ; B 79 18 505 444 ; C -1 ; WX 584 ; N divide ; B 50 -11 534 474 ; C -1 ; WX 722 ; N Aring ; B 26 0 703 949 ; C -1 ; WX 1000 ; N trademark ; B 71 273 929 729 ; C -1 ; WX 389 ; N rcommaaccent ; B 63 -307 370 549 ; C -1 ; WX 278 ; N lacute ; B 67 0 278 936 ; C -1 ; WX 611 ; N omacron ; B 35 -23 569 719 ; C -1 ; WX 722 ; N Atilde ; B 26 0 703 928 ; C -1 ; WX 278 ; N icircumflex ; B -19 0 299 757 ; C -1 ; WX 278 ; N igrave ; B -10 0 207 757 ; C -1 ; WX 611 ; N ncommaaccent ; B 63 -307 546 549 ; C -1 ; WX 278 ; N lcommaaccent ; B 67 -307 207 729 ; C -1 ; WX 584 ; N plusminus ; B 56 -16 527 608 ; C -1 ; WX 869 ; N onehalf ; B 40 -20 846 715 ; C -1 ; WX 869 ; N onequarter ; B 40 -20 850 715 ; C -1 ; WX 869 ; N threequarters ; B 15 -20 850 718 ; C -1 ; WX 278 ; N iacute ; B 67 0 290 757 ; C -1 ; WX 722 ; N Abreve ; B 26 0 703 927 ; C -1 ; WX 556 ; N kcommaaccent ; B 59 -307 548 729 ; C -1 ; WX 778 ; N Omacron ; B 40 -23 742 898 ; C -1 ; WX 278 ; N imacron ; B 7 0 266 719 ; C -1 ; WX 556 ; N emacron ; B 22 -23 525 719 ; C -1 ; WX 556 ; N amacron ; B 28 -23 524 719 ; C -1 ; WX 333 ; N tcommaaccent ; B 14 -307 301 674 ; C -1 ; WX 556 ; N ydieresis ; B 9 -219 538 743 ; C -1 ; WX 500 ; N zdotaccent ; B 21 0 468 743 ; C -1 ; WX 500 ; N zcaron ; B 21 0 468 757 ; C -1 ; WX 500 ; N zacute ; B 21 0 468 757 ; C -1 ; WX 556 ; N yacute ; B 9 -219 538 757 ; C -1 ; WX 611 ; N uhungarumlaut ; B 58 -23 559 757 ; C -1 ; WX 611 ; N eth ; B 35 -23 569 744 ; C -1 ; WX 611 ; N uring ; B 58 -23 541 770 ; C -1 ; WX 778 ; N Ocircumflex ; B 40 -23 742 936 ; C -1 ; WX 333 ; N commaaccent ; B 112 -307 234 -60 ; C -1 ; WX 737 ; N copyright ; B -14 -22 751 743 ; C -1 ; WX 737 ; N registered ; B -14 -22 751 743 ; C -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ; C -1 ; WX 278 ; N idieresis ; B -9 0 287 743 ; C -1 ; WX 489 ; N lozenge ; B 16 0 462 744 ; C -1 ; WX 729 ; N Delta ; B 8 0 721 729 ; C -1 ; WX 548 ; N notequal ; B 50 -69 534 528 ; C -1 ; WX 542 ; N radical ; B 7 -36 512 913 ; C -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ; C -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ; C -1 ; WX 584 ; N lessequal ; B 45 -10 534 639 ; C -1 ; WX 584 ; N greaterequal ; B 45 -10 534 639 ; C -1 ; WX 584 ; N logicalnot ; B 40 86 544 375 ; C -1 ; WX 711 ; N summation ; B 17 -96 694 760 ; C -1 ; WX 490 ; N partialdiff ; B 22 -15 458 750 ; C -1 ; WX 722 ; N Ncommaaccent ; B 68 -307 661 729 ; C -1 ; WX 611 ; N dcroat ; B 29 -23 605 729 ; C -1 ; WX 280 ; N brokenbar ; B 100 -200 180 729 ; C -1 ; WX 611 ; N Lcommaaccent ; B 80 -307 579 729 ; C -1 ; WX 722 ; N Adieresis ; B 26 0 703 922 ; C -1 ; WX 611 ; N mu ; B 58 -220 573 540 ; C -1 ; WX 278 ; N .notdef ; B 214 0 214 0 ; EndCharMetrics StartKernData StartKernPairs 998 KPX A C -33 KPX A Ccedilla -33 KPX A G -35 KPX A O -34 KPX A Odieresis -34 KPX A Q -35 KPX A T -81 KPX A U -32 KPX A Uacute -32 KPX A Ucircumflex -32 KPX A Udieresis -32 KPX A Ugrave -32 KPX A V -66 KPX A W -51 KPX A Y -90 KPX A a -1 KPX A b -1 KPX A c -14 KPX A ccedilla -14 KPX A comma 19 KPX A d -13 KPX A e -9 KPX A g -14 KPX A guillemotleft -43 KPX A guilsinglleft -40 KPX A hyphen 7 KPX A o -16 KPX A period 19 KPX A q -12 KPX A quotedblright -65 KPX A quoteright -61 KPX A t -18 KPX A u -12 KPX A v -37 KPX A w -23 KPX A y -35 KPX Aacute C -33 KPX Aacute G -35 KPX Aacute O -34 KPX Aacute Q -35 KPX Aacute T -81 KPX Aacute U -32 KPX Aacute V -66 KPX Aacute W -51 KPX Aacute Y -90 KPX Aacute a -1 KPX Aacute b -1 KPX Aacute c -14 KPX Aacute comma 19 KPX Aacute d -13 KPX Aacute e -9 KPX Aacute g -14 KPX Aacute guillemotleft -43 KPX Aacute guilsinglleft -40 KPX Aacute hyphen 7 KPX Aacute o -16 KPX Aacute period 19 KPX Aacute q -12 KPX Aacute quoteright -61 KPX Aacute t -18 KPX Aacute u -12 KPX Aacute v -37 KPX Aacute w -23 KPX Aacute y -35 KPX Acircumflex C -33 KPX Acircumflex G -35 KPX Acircumflex O -34 KPX Acircumflex Q -35 KPX Acircumflex T -81 KPX Acircumflex U -32 KPX Acircumflex V -66 KPX Acircumflex W -51 KPX Acircumflex Y -90 KPX Acircumflex comma 19 KPX Acircumflex period 19 KPX Adieresis C -33 KPX Adieresis G -35 KPX Adieresis O -34 KPX Adieresis Q -35 KPX Adieresis T -81 KPX Adieresis U -32 KPX Adieresis V -66 KPX Adieresis W -51 KPX Adieresis Y -90 KPX Adieresis a -1 KPX Adieresis b -1 KPX Adieresis c -14 KPX Adieresis comma 19 KPX Adieresis d -13 KPX Adieresis g -14 KPX Adieresis guillemotleft -43 KPX Adieresis guilsinglleft -40 KPX Adieresis hyphen 7 KPX Adieresis o -16 KPX Adieresis period 19 KPX Adieresis q -12 KPX Adieresis quotedblright -65 KPX Adieresis quoteright -61 KPX Adieresis t -18 KPX Adieresis u -12 KPX Adieresis v -37 KPX Adieresis w -23 KPX Adieresis y -35 KPX Agrave C -33 KPX Agrave G -35 KPX Agrave O -34 KPX Agrave Q -35 KPX Agrave T -81 KPX Agrave U -32 KPX Agrave V -66 KPX Agrave W -51 KPX Agrave Y -90 KPX Agrave comma 19 KPX Agrave period 19 KPX Aring C -33 KPX Aring G -35 KPX Aring O -34 KPX Aring Q -35 KPX Aring T -81 KPX Aring U -32 KPX Aring V -66 KPX Aring W -51 KPX Aring Y -90 KPX Aring a -1 KPX Aring b -1 KPX Aring c -14 KPX Aring comma 19 KPX Aring d -13 KPX Aring e -9 KPX Aring g -14 KPX Aring guillemotleft -43 KPX Aring guilsinglleft -40 KPX Aring hyphen 7 KPX Aring o -16 KPX Aring period 19 KPX Aring q -12 KPX Aring quotedblright -65 KPX Aring quoteright -61 KPX Aring t -18 KPX Aring u -12 KPX Aring v -37 KPX Aring w -23 KPX Aring y -35 KPX Atilde C -33 KPX Atilde G -35 KPX Atilde O -34 KPX Atilde Q -35 KPX Atilde T -81 KPX Atilde U -32 KPX Atilde V -66 KPX Atilde W -51 KPX Atilde Y -90 KPX Atilde comma 19 KPX Atilde period 19 KPX B A -32 KPX B AE -20 KPX B Aacute -32 KPX B Acircumflex -32 KPX B Adieresis -32 KPX B Aring -32 KPX B Atilde -32 KPX B O -11 KPX B OE -2 KPX B Oacute -11 KPX B Ocircumflex -11 KPX B Odieresis -11 KPX B Ograve -11 KPX B Oslash -5 KPX B V -39 KPX B W -27 KPX B Y -51 KPX C A -29 KPX C AE -17 KPX C Aacute -29 KPX C Adieresis -29 KPX C Aring -29 KPX C H 5 KPX C K 2 KPX C O -6 KPX C Oacute -6 KPX C Odieresis -6 KPX Ccedilla A -28 KPX D A -37 KPX D Aacute -37 KPX D Acircumflex -37 KPX D Adieresis -37 KPX D Agrave -37 KPX D Aring -37 KPX D Atilde -37 KPX D J 2 KPX D T -17 KPX D V -35 KPX D W -20 KPX D X -35 KPX D Y -56 KPX F A -63 KPX F Aacute -63 KPX F Acircumflex -63 KPX F Adieresis -63 KPX F Agrave -63 KPX F Aring -63 KPX F Atilde -63 KPX F J -25 KPX F O -16 KPX F Odieresis -16 KPX F a -15 KPX F aacute -15 KPX F adieresis -15 KPX F ae -17 KPX F aring -15 KPX F comma -76 KPX F e -7 KPX F eacute -7 KPX F hyphen 11 KPX F i -7 KPX F j -9 KPX F o -14 KPX F oacute -14 KPX F odieresis -14 KPX F oe -8 KPX F oslash -15 KPX F period -75 KPX F r -27 KPX F u -24 KPX G A -8 KPX G AE 4 KPX G Aacute -8 KPX G Acircumflex -8 KPX G Adieresis -8 KPX G Agrave -8 KPX G Aring -8 KPX G Atilde -8 KPX G T -17 KPX G V -36 KPX G W -20 KPX G Y -56 KPX J A -32 KPX J AE -20 KPX J Adieresis -32 KPX J Aring -32 KPX K C -53 KPX K G -55 KPX K O -54 KPX K OE -44 KPX K Oacute -54 KPX K Odieresis -54 KPX K S -30 KPX K T 13 KPX K a -3 KPX K adieresis -3 KPX K ae 0 KPX K aring -3 KPX K e -25 KPX K hyphen -44 KPX K o -33 KPX K oacute -33 KPX K odieresis -33 KPX K u -23 KPX K udieresis -23 KPX K y -65 KPX L A 9 KPX L AE 21 KPX L Aacute 9 KPX L Adieresis 9 KPX L Aring 9 KPX L C -26 KPX L Ccedilla -26 KPX L G -30 KPX L O -29 KPX L Oacute -29 KPX L Ocircumflex -29 KPX L Odieresis -29 KPX L Ograve -29 KPX L Otilde -29 KPX L S -2 KPX L T -95 KPX L U -24 KPX L Udieresis -24 KPX L V -90 KPX L W -68 KPX L Y -112 KPX L hyphen -12 KPX L quotedblright -141 KPX L quoteright -138 KPX L u -7 KPX L udieresis -7 KPX L y -55 KPX N A -5 KPX N AE 7 KPX N Aacute -5 KPX N Adieresis -5 KPX N Aring -5 KPX N C 9 KPX N Ccedilla 9 KPX N G 8 KPX N O 8 KPX N Oacute 8 KPX N Odieresis 8 KPX N a 13 KPX N aacute 13 KPX N adieresis 13 KPX N ae 13 KPX N aring 13 KPX N comma 15 KPX N e 18 KPX N eacute 18 KPX N o 11 KPX N oacute 11 KPX N odieresis 11 KPX N oslash 11 KPX N period 16 KPX N u 12 KPX N udieresis 12 KPX O A -37 KPX O AE -26 KPX O Aacute -37 KPX O Adieresis -37 KPX O Aring -37 KPX O T -20 KPX O V -36 KPX O W -21 KPX O X -36 KPX O Y -59 KPX Oacute A -37 KPX Oacute T -20 KPX Oacute V -36 KPX Oacute W -21 KPX Oacute Y -59 KPX Ocircumflex T -20 KPX Ocircumflex V -36 KPX Ocircumflex Y -59 KPX Odieresis A -37 KPX Odieresis T -20 KPX Odieresis V -36 KPX Odieresis W -21 KPX Odieresis X -36 KPX Odieresis Y -59 KPX Ograve T -20 KPX Ograve V -36 KPX Ograve Y -59 KPX Oslash A -32 KPX Otilde T -20 KPX Otilde V -36 KPX Otilde Y -59 KPX P A -65 KPX P AE -54 KPX P Aacute -65 KPX P Adieresis -65 KPX P Aring -65 KPX P J -44 KPX P a -7 KPX P aacute -7 KPX P adieresis -7 KPX P ae -8 KPX P aring -7 KPX P comma -94 KPX P e -8 KPX P eacute -8 KPX P hyphen 0 KPX P o -14 KPX P oacute -14 KPX P odieresis -14 KPX P oe -8 KPX P oslash -17 KPX P period -94 KPX R C -5 KPX R Ccedilla -5 KPX R G -6 KPX R O -6 KPX R OE 3 KPX R Oacute -6 KPX R Odieresis -6 KPX R T 0 KPX R U -4 KPX R Udieresis -4 KPX R V -26 KPX R W -17 KPX R Y -37 KPX R a 0 KPX R aacute 0 KPX R adieresis 0 KPX R ae 0 KPX R aring 0 KPX R e 2 KPX R eacute 2 KPX R hyphen 15 KPX R o -4 KPX R oacute -4 KPX R odieresis -4 KPX R oe 1 KPX R u 0 KPX R uacute 0 KPX R udieresis 0 KPX R y 5 KPX S A -20 KPX S AE -8 KPX S Aacute -20 KPX S Adieresis -20 KPX S Aring -20 KPX S T -5 KPX S V -31 KPX S W -17 KPX S Y -43 KPX S t 1 KPX T A -87 KPX T AE -75 KPX T Aacute -87 KPX T Acircumflex -87 KPX T Adieresis -87 KPX T Agrave -87 KPX T Aring -87 KPX T Atilde -87 KPX T C -20 KPX T G -22 KPX T J -87 KPX T O -22 KPX T OE -11 KPX T Oacute -22 KPX T Ocircumflex -22 KPX T Odieresis -22 KPX T Ograve -22 KPX T Oslash -23 KPX T Otilde -22 KPX T S 3 KPX T V 18 KPX T W 24 KPX T Y 16 KPX T a -73 KPX T ae -73 KPX T c -74 KPX T colon -97 KPX T comma -67 KPX T e -69 KPX T g -75 KPX T guillemotleft -101 KPX T guilsinglleft -98 KPX T hyphen -48 KPX T i -1 KPX T j -3 KPX T o -76 KPX T oslash -73 KPX T period -67 KPX T r -71 KPX T s -74 KPX T semicolon -98 KPX T u -72 KPX T v -82 KPX T w -77 KPX T y -80 KPX U A -34 KPX U AE -22 KPX U Aacute -34 KPX U Acircumflex -34 KPX U Adieresis -34 KPX U Aring -34 KPX U Atilde -34 KPX U comma -7 KPX U m 6 KPX U n 5 KPX U p 7 KPX U period -4 KPX U r 5 KPX Uacute A -34 KPX Uacute comma -7 KPX Uacute m 6 KPX Uacute n 5 KPX Uacute p 7 KPX Uacute period -4 KPX Uacute r 5 KPX Ucircumflex A -34 KPX Udieresis A -34 KPX Udieresis b 6 KPX Udieresis comma -7 KPX Udieresis m 6 KPX Udieresis n 5 KPX Udieresis p 7 KPX Udieresis period -4 KPX Udieresis r 5 KPX Ugrave A -34 KPX V A -71 KPX V AE -59 KPX V Aacute -71 KPX V Acircumflex -71 KPX V Adieresis -71 KPX V Agrave -71 KPX V Aring -71 KPX V Atilde -71 KPX V C -36 KPX V G -38 KPX V O -37 KPX V Oacute -37 KPX V Ocircumflex -37 KPX V Odieresis -37 KPX V Ograve -37 KPX V Oslash -31 KPX V Otilde -37 KPX V S -21 KPX V T 21 KPX V a -47 KPX V ae -48 KPX V colon -65 KPX V comma -69 KPX V e -43 KPX V g -49 KPX V guillemotleft -74 KPX V guilsinglleft -72 KPX V hyphen -21 KPX V i -5 KPX V o -50 KPX V oslash -48 KPX V period -69 KPX V r -34 KPX V semicolon -67 KPX V u -34 KPX V y -10 KPX W A -54 KPX W AE -43 KPX W Aacute -54 KPX W Acircumflex -54 KPX W Adieresis -54 KPX W Agrave -54 KPX W Aring -54 KPX W Atilde -54 KPX W C -20 KPX W G -22 KPX W O -21 KPX W Oacute -21 KPX W Ocircumflex -21 KPX W Odieresis -21 KPX W Ograve -21 KPX W Oslash -15 KPX W Otilde -21 KPX W S -12 KPX W T 25 KPX W a -29 KPX W ae -29 KPX W colon -53 KPX W comma -45 KPX W e -24 KPX W g -30 KPX W guillemotleft -55 KPX W guilsinglleft -53 KPX W hyphen -3 KPX W i -1 KPX W o -31 KPX W oslash -29 KPX W period -45 KPX W r -24 KPX W semicolon -54 KPX W u -23 KPX W y 0 KPX X C -34 KPX X O -35 KPX X Odieresis -35 KPX X Q -37 KPX X a -5 KPX X e -25 KPX X hyphen -27 KPX X o -32 KPX X u -25 KPX X y -40 KPX Y A -86 KPX Y AE -74 KPX Y Aacute -86 KPX Y Acircumflex -86 KPX Y Adieresis -86 KPX Y Agrave -86 KPX Y Aring -86 KPX Y Atilde -86 KPX Y C -52 KPX Y G -54 KPX Y O -54 KPX Y Oacute -54 KPX Y Ocircumflex -54 KPX Y Odieresis -54 KPX Y Ograve -54 KPX Y Oslash -47 KPX Y Otilde -54 KPX Y S -29 KPX Y T 22 KPX Y a -66 KPX Y ae -67 KPX Y colon -81 KPX Y comma -78 KPX Y e -63 KPX Y g -68 KPX Y guillemotleft -98 KPX Y guilsinglleft -96 KPX Y hyphen -50 KPX Y i -3 KPX Y o -70 KPX Y oslash -67 KPX Y p -45 KPX Y period -78 KPX Y semicolon -83 KPX Y u -48 KPX Y v -27 KPX Z v -11 KPX Z y -9 KPX a j -1 KPX a quoteright -11 KPX a v -19 KPX a w -5 KPX a y -17 KPX aacute v -19 KPX aacute w -5 KPX aacute y -17 KPX adieresis v -19 KPX adieresis w -5 KPX adieresis y -17 KPX ae v -21 KPX ae w -7 KPX ae y -19 KPX agrave v -19 KPX agrave w -5 KPX agrave y -17 KPX aring v -19 KPX aring w -5 KPX aring y -17 KPX b v -20 KPX b w -7 KPX b y -20 KPX c h 0 KPX c k 3 KPX comma one -73 KPX comma quotedblright -33 KPX comma quoteright -30 KPX e quoteright -12 KPX e t -4 KPX e v -19 KPX e w -6 KPX e x -21 KPX e y -17 KPX eacute v -19 KPX eacute w -6 KPX eacute y -17 KPX ecircumflex v -19 KPX ecircumflex w -6 KPX ecircumflex y -17 KPX eight four 10 KPX eight one -23 KPX eight seven -6 KPX f a 1 KPX f aacute 1 KPX f adieresis 1 KPX f ae 0 KPX f aring 1 KPX f e -3 KPX f eacute -3 KPX f f 21 KPX f i -3 KPX f j -6 KPX f l -3 KPX f o -9 KPX f oacute -9 KPX f odieresis -9 KPX f oe -3 KPX f oslash -9 KPX f quoteright 10 KPX f s -1 KPX f t 21 KPX five four 6 KPX five one -29 KPX five seven -10 KPX four four 9 KPX four one -50 KPX four seven -28 KPX g a 3 KPX g adieresis 3 KPX g ae 3 KPX g aring 3 KPX g e 8 KPX g eacute 8 KPX g l 0 KPX g oacute 1 KPX g odieresis 1 KPX g r 1 KPX guillemotright A -51 KPX guillemotright AE -39 KPX guillemotright Aacute -51 KPX guillemotright Adieresis -51 KPX guillemotright Aring -51 KPX guillemotright T -108 KPX guillemotright V -78 KPX guillemotright W -60 KPX guillemotright Y -111 KPX guilsinglright A -46 KPX guilsinglright AE -35 KPX guilsinglright Aacute -46 KPX guilsinglright Adieresis -46 KPX guilsinglright Aring -46 KPX guilsinglright T -104 KPX guilsinglright V -74 KPX guilsinglright W -56 KPX guilsinglright Y -107 KPX h quoteright -14 KPX h y -21 KPX hyphen A -1 KPX hyphen AE 10 KPX hyphen Aacute -1 KPX hyphen Adieresis -1 KPX hyphen Aring -1 KPX hyphen T -57 KPX hyphen V -27 KPX hyphen W -9 KPX hyphen Y -64 KPX i T -4 KPX i j -2 KPX k a -2 KPX k aacute -2 KPX k adieresis -2 KPX k ae 1 KPX k aring -2 KPX k comma 7 KPX k e -15 KPX k eacute -15 KPX k g -21 KPX k hyphen -25 KPX k o -22 KPX k oacute -22 KPX k odieresis -22 KPX k period 6 KPX k s -10 KPX k u -1 KPX k udieresis -1 KPX l v -5 KPX l y -2 KPX m p 6 KPX m v -19 KPX m w -6 KPX m y -18 KPX n T -80 KPX n p 5 KPX n quoteright -12 KPX n v -20 KPX n w -7 KPX n y -19 KPX nine four 4 KPX nine one -21 KPX nine seven -17 KPX o T -84 KPX o quoteright -17 KPX o t -8 KPX o v -23 KPX o w -10 KPX o x -25 KPX o y -22 KPX oacute v -23 KPX oacute w -10 KPX oacute y -22 KPX ocircumflex t -8 KPX odieresis t -8 KPX odieresis v -23 KPX odieresis w -10 KPX odieresis x -25 KPX odieresis y -22 KPX ograve v -23 KPX ograve w -10 KPX ograve y -22 KPX one comma -42 KPX one eight -37 KPX one five -43 KPX one four -56 KPX one nine -39 KPX one one -85 KPX one period -42 KPX one seven -65 KPX one six -37 KPX one three -44 KPX one two -47 KPX one zero -34 KPX p t -5 KPX p y -20 KPX period one -73 KPX period quotedblright -32 KPX period quoteright -29 KPX q c 4 KPX q u 4 KPX quotedblbase A 12 KPX quotedblbase AE 24 KPX quotedblbase T -75 KPX quotedblbase V -73 KPX quotedblbase W -51 KPX quotedblbase Y -92 KPX quotedblleft A -68 KPX quotedblleft AE -57 KPX quotedblleft Aacute -68 KPX quotedblleft Adieresis -68 KPX quotedblleft Aring -68 KPX quotedblleft T -2 KPX quotedblleft V 6 KPX quotedblleft W 16 KPX quotedblleft Y -9 KPX quotedblright A -69 KPX quotedblright AE -57 KPX quotedblright Aacute -69 KPX quotedblright Adieresis -69 KPX quotedblright Aring -69 KPX quotedblright T 1 KPX quotedblright V 7 KPX quotedblright W 17 KPX quotedblright Y -7 KPX quoteleft A -73 KPX quoteleft AE -62 KPX quoteleft Aacute -73 KPX quoteleft Adieresis -73 KPX quoteleft Aring -73 KPX quoteleft T -7 KPX quoteleft V 2 KPX quoteleft W 11 KPX quoteleft Y -13 KPX quoteright A -77 KPX quoteright AE -66 KPX quoteright Aacute -77 KPX quoteright Adieresis -77 KPX quoteright Aring -77 KPX quoteright comma -46 KPX quoteright d -27 KPX quoteright o -30 KPX quoteright period -45 KPX quoteright r -15 KPX quoteright s -22 KPX quoteright t -4 KPX quoteright v -5 KPX quoteright w 1 KPX quoteright y -3 KPX r a 6 KPX r aacute 6 KPX r acircumflex 6 KPX r adieresis 6 KPX r ae 4 KPX r agrave 6 KPX r aring 6 KPX r c 0 KPX r ccedilla 0 KPX r colon -27 KPX r comma -57 KPX r d 0 KPX r e 4 KPX r eacute 4 KPX r ecircumflex 4 KPX r egrave 4 KPX r f 22 KPX r g -2 KPX r h -4 KPX r hyphen -35 KPX r i -4 KPX r j -6 KPX r k 0 KPX r l -4 KPX r m -1 KPX r n -2 KPX r o -1 KPX r oacute -1 KPX r ocircumflex -1 KPX r odieresis -1 KPX r oe 5 KPX r ograve -1 KPX r oslash -4 KPX r p 0 KPX r period -57 KPX r q 1 KPX r quoteright 14 KPX r r -2 KPX r s 3 KPX r semicolon -27 KPX r t 22 KPX r u 0 KPX r v 21 KPX r w 26 KPX r x 17 KPX r y 23 KPX r z 9 KPX s quoteright -12 KPX s t -1 KPX seven colon -63 KPX seven comma -88 KPX seven eight -3 KPX seven five -21 KPX seven four -62 KPX seven one -14 KPX seven period -87 KPX seven seven 9 KPX seven six -13 KPX seven three 0 KPX seven two -4 KPX six four 7 KPX six one -21 KPX six seven -3 KPX t S 0 KPX t a 6 KPX t aacute 6 KPX t adieresis 6 KPX t ae 7 KPX t aring 6 KPX t colon -25 KPX t e -3 KPX t eacute -3 KPX t h 2 KPX t o -10 KPX t oacute -10 KPX t odieresis -10 KPX t quoteright 4 KPX t semicolon -25 KPX three four 6 KPX three one -27 KPX three seven -10 KPX two four -9 KPX two one -16 KPX two seven -3 KPX u quoteright -2 KPX v a -15 KPX v aacute -15 KPX v acircumflex -15 KPX v adieresis -15 KPX v ae -16 KPX v agrave -15 KPX v aring -15 KPX v atilde -15 KPX v c -20 KPX v colon -32 KPX v comma -51 KPX v e -15 KPX v eacute -15 KPX v ecircumflex -15 KPX v egrave -15 KPX v g -21 KPX v hyphen 0 KPX v l -5 KPX v o -22 KPX v oacute -22 KPX v odieresis -22 KPX v ograve -22 KPX v oslash -20 KPX v period -50 KPX v s -17 KPX v semicolon -34 KPX w a -7 KPX w aacute -7 KPX w acircumflex -7 KPX w adieresis -7 KPX w ae -8 KPX w agrave -7 KPX w aring -7 KPX w atilde -7 KPX w c -8 KPX w colon -27 KPX w comma -33 KPX w e -3 KPX w eacute -3 KPX w ecircumflex -3 KPX w egrave -3 KPX w g -9 KPX w hyphen 11 KPX w l -1 KPX w o -10 KPX w oacute -10 KPX w odieresis -10 KPX w ograve -10 KPX w oslash -8 KPX w period -32 KPX w s -9 KPX w semicolon -29 KPX x a -9 KPX x c -22 KPX x e -17 KPX x eacute -17 KPX x o -24 KPX x q -20 KPX y a -14 KPX y aacute -14 KPX y acircumflex -14 KPX y adieresis -14 KPX y ae -15 KPX y agrave -14 KPX y aring -14 KPX y atilde -14 KPX y c -21 KPX y colon -31 KPX y comma -51 KPX y e -16 KPX y eacute -16 KPX y ecircumflex -16 KPX y egrave -16 KPX y g -21 KPX y hyphen 0 KPX y l -4 KPX y o -22 KPX y oacute -22 KPX y odieresis -22 KPX y ograve -22 KPX y oslash -20 KPX y period -50 KPX y s -16 KPX y semicolon -33 KPX zero four 5 KPX zero one -19 KPX zero seven -10 EndKernPairs EndKernData EndFontMetrics grace-5.1.23/fonts/type1/n019003l.pfb0000644000076500001440000010627207056046552016423 0ustar fnevgenyusers€]%!PS-AdobeFont-1.0: NimbusSanL-Regu 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Sans L Regular) readonly def /FamilyName (Nimbus Sans L) readonly def /Weight (Regular) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -151 def /UnderlineThickness 50 def end readonly def /FontName /NimbusSanL-Regu def /PaintType 0 def /WMode 0 def /FontBBox {-174 -285 1001 953} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020902 def currentdict end currentfile eexec €5„é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>nc5+\3v,ŽIÔ5L™:v L$l¤Û¬˜º:Ñs"ÎñÞ a“æ”SÙüÇ㘧Ĝ;“@QcIzL¨ýâê6kGyå§½ò± § 裳Zfc…YíºµÀ 0@\d›ØÏà"ƒØò¬üíÌCKç#€æ Ù’¼:Ë£ónþts‰gA´hàÐx/R ÒÈõe½ä'R>{q•¹ñ'Óñ‰øXùìéã’J<2¦u—ì_l1HÚ5G‡‚ƒ­o¥q²­AðjèéLüÝà.¦=ùÍ1@눒ðu:l›N¼:ØÇݶ¯§oWˆ»oÅO„)ÃÅz‹üX&“wf\¼RsRìó¸þÕ7NŒÒpŠÂ¢_[‡æ d+¥îm)ßfŸ‹®4 dIÃm4b‹Ã}çŠ)òåÆy­òìV¦šEõê[ ø‚C1¹ +‘‚íNäéy¬™<»:“Pa æ¤4cÝfϤ¡l4c»Ã„œc§h·hU¸¬è¸Åéˆn»˜÷…ß”DJ,³û–kMõjÄÈr6q±t¸LÜù«A”c–$¢Â3TQ2ÎÛË‘é2xøgt7÷QÜl¢÷Föx 3ôô‹A4IFüÜÛ;æ€Á@4i]Æ=‘ƒUW£2}_Sì•Eµ øÌþÓïiÿŠ™m¯÷Šgáµ@äH ÜK,ªþ|zúÒl˜ˆmƒr+ˆEäiPú·~îW439˜ á>P*UþŒzñûlÆØÌW?gˆÊf¥^ëbüüþ’UŠ·:8ïÿáÖÓËbnès‰ÌB¥ýγÝ;LÖðàƒ ñdáÄÆb‰;àìxÅóš+[D*@dÄ?Ùùê¹™iÈ~žÚÓ½Zä–†Éc¨ &ãCš–Ù›äpÖàú3Ú€©©¹DÛO´É®…h²ra£.‰j3%°*Q˜Î©”¸=æÍ½px£ ·àP)xñªî;\: “ØCeþâv»T– ??G¸HBo*éßùº1ã8ŽÍôÒîË<¨á÷d¨×ü…ù/w[ýJr bÿí³r`è­‰î.Å+Ù&HŠ~ñY÷l;äýIxÑù¥6@½ºU»€I?Öl¡T¦Oú‡Ê“v¼ùcëW®ŒjK÷Wž¬Ž¿l€œõJçw,›ˆ°nX†Qû{Ñ‚oFh‹‡¼G{Á?³#_Q"P|p%BÜÄö-TAJ`ÀSMé´èÈ5°WÕ•;¥Éªv± ,^EåÐÍ2úlO?²Šó-ü×›å×®ÐTîêÈôÌâÁ¹›øU5 eKñcäq¬ô®Á ÷·Ôg. p`µa§<),Ûã¦u éû?hN…,´š½e6„ðJ´i½£m€t%Úᅳý€·myGïø5 ­·veîÒt† ; u£Çª•ÕïZ¥*ÌpɇjH° ôس¯Ð ›å Ý6S”üVÝóAyÖ艚<¥W(\…uJ[UäÁÄžÔ=pRð¨$'ûƒƒp‰S]PóÇ;Xô¼’=ÞŸ;œà'üîSŒî€²€h€pC¦‡ù±ÐBR$¨Š=ôÑTfs€7 ÆPÃ8ò^—»J@Œœˆ0¡S½(·×1R5Íœ$0gHAè"aÑeëF{°8s ê9÷ïâC6á›ÉΧ•(y,tùU.ZèªJ(Ür=†ó/[H[\öƒb^g4Š(ÌŠeoL¥Éè²N6#gÛ¸`•wK†…$qv‚©Í“¦èV8s âADÎ:H¸ðpt,ÕäN€õÔØ™&2x(”Š!ŽÚ†¿ŸUÒqè÷ˆ˜ç"¹®³oc¦÷:…ÕYQT>ˆ) ж80ü.#œ`ÌüÖlïþY!¨ÂÆd«;0ÚÁuT·“ªe“Aír9Xh:»¿m@ó”O—¹Š”Ÿ èœÕ'¹ÆÌ‚Ëy¶tn…nß ²hý £¡Û˜@ûꡦÖèmb³Ã…øF- ÚLRPÐÓͨ±2˜6Ìafò!ó.Šû;ˆB*§ðÏ; —÷ñÿG±ÑP'ú³”¡ËKÅ(ÿwÊžó?ô›£€Y h ^™Ñf(Â9Ä–^}ØO¥Ã§øzǦ€_FÝ2¤5ˆ‰öìfú rÆ®vÞm,G¡y%MÍä ‰¥q¿>ÊÊf¡ï‘]À7^“ôpCQçz4¸ö÷¾c# Pñ¦¸¶îWÆMN—«ý›æ§ð¬aà·›Ïteÿ·Øjœ«;†ÉÉh쌞€ªÑ]ÒXQý_¤@õì’“Û·D[“¨m9…ÀøÌ). Ó)C¥:»<:(À£¿*þaŒo ”…¦Ôx3pÕ1¤ÐrÔP¢òaÊ|0Í‰ŽšRàT^󀕰I¿í’‚ èè( n¡+¤ á®à¥!ÂÊc€@YSs«UÒÛ#Ò;„Ÿdw |•m‹7ì&žtôaÿßËfÑVï/Ú»aÅ—Æ›ñ‚ WEÐUqZ©Ñ^¶¤Y¡²+žu­ ].#i}Å, }­Q$H`DÕ¯\,. ªŒúœißôîô»Ù+*àN;SàDÇ„;HvFκ’Ö’ý¹F*-o£|íö‰ÈÝÇð§‹ÅAÇÝÆŠ&ázžÉ]ŽÖmÙÿ!¸M ¿ƒ·§™™šôtG™¤o’ªkÿ.5î[NÉ—cŸÚwª 5`‹²õ߬{ò|Êê}IÏÀ¦Í©*⤟Τ:‰Õ s¦«½åéåÚŘ˜2}‰`š Ã:å¡ç&È{Zó;uòÚUb KÛûw+¢V7Sš íÛ>\͈E¶º ¢ì×^OßšiÿG-x @fÉa¿F%ªˆÕSU€áÓFX,.q2Szí³b ‡£åco#íäO¬Kˆ3ŠS{d}²™…§º•q@o9½/±uÕkãp#ŸÕ"í­Šè‚¥Ÿ¼g) 5jhÁùÏ9ò•œ§Æú¶ù5¬ªª½"øSv³Ü'\•î_ŠF7ïE ÜyÑý[ §€;ÕN`=ˆ!1…QK_9&ÍGøÍÍÑww·â 87eSxZÛíQÀÌ’¸ˆÕDý‡§¸´Ÿœ"óÙsq4¼'¹Ù¯«iAoQ‹ ÂQ«¥£Š*{í|ÝõJ;©ìÄvµ!hôTÒ˜®?·› Wc$Ìè´ÓDƒ8 ËìÔå®ÇE_}ÐÚcºjÃÝù¯¨ÒÙ£ u º> ÍΗsÊíkXµqÉ0÷mÔ\ˆ¾È'\œ9 Â@Ú½#[ç_âü@P(ùcqß UÉB¬¥uÛ†Ö3) v¯“VÞ¶ò _TSZ±áýs¯´Ù5°Ÿ6¢Y=þ]Ù ¬|ìŽíªò£ûc B(§ >s2å¹:‡|õA¼°Ó´p¦ˆdƒÅ/'·"ÆíK7Ì$Çü͈֑¯ËQDÕA“‡g`RŽ'“mcó`aM1UmI›ôŸŒÂ0åÁÒîeg± à<¯–/¦Ö7ÂÇ•´ÛHÀk¹(@¢  Ö&*{$굯ž–¬öxÖõêoJ‡)ì|;NÉ»7U:5§.ÇKgˆ#*C!ŸÑ³Š0Þï^нÔ7ñå·Ú H¦ÄAVŽz‡éU˾÷Ën•ýžÔO›ß¯i´ìù&YSâ"Á«ØSG·šaU‹÷œ;Oí­¡è“¾j)X¨Ÿ?Y?2^¨C}õð*¥nkÊñÏA’*ŒøFæ~]ÏND ¾ –½£t(`Ge&²oÊ'ÌmˆÌ=¡ª’`ÎõKÜÝ¡¦PX§ï ߺöSçÛ:úç{yʺ±Ó‚ÎÂr &è ~½Hþ€g ‚YwR®Þˆ••€Î©£ ØXPØ ¦¨.óʇbÕûKìOâ;”j…[_ôì@ïáH,Á´,«'¸Cʉ‹ª,úØg`O8}†n0H„y%òž«´èa…²Žx5"P ò~ '“ò8ØÌ­^»iÛfjlþÙ¾†ó@êñÖ ¤v›4Ñ!wƒ ;[D %©i>ÃJu˜[Ê(€…Qþ³Æü*ÉİÀ¸¦àg Âi4>Ç”¢„ŠB´v•/ÒðQZbÛ ÐeÊ`Ð5æ¬pá±µ ™qX'qX«¾nŸU4G¶ ‰Mxµëê´æ;{´®Ø†ÉMø9cBº=Òö—GL¾Q_Þëª9<æioäÏ.tsÐ$0Ž !ý|#¡©9­=K¬t^\"ð¶  M¤¦¼U¤Ô§/´¤2n NdŽ0¸gõsC½¨ b4_ÔïøTXÃ.H5æ›¶UÎa³pØ”þho±WFŒ_‚Á&œO+1 ÿôÞ a¬É(?xÙ‚ÚÿʉžÝd“@¤áå¢taÛùÔl:8ýtÊn¾T[ìÁEìzΊK×Ý£³7Ààô~º(nOSpc¨R)<“À  Ñ›U3»Ó^¯uõÊWþ€~f&Á%0Wã^K¬Ê¼{\3)ü¿Ø”ÑÚ§¨ãÚU° ë·ÛŸh %îQ…æ<µ¯f[­k„Û_ ²~Ž^}•Žêã-Ôg/{>&Þäí¯— 0^8ŠþjK»¤|}s¼ªü~¡ :hk8¼¶æÞ‘W’ÄXÄ'Kl‡‰L4a{6¸ê¿-p;ã‚OÞk5ñþi)Ö̃"QÍ×l1² >Ù¿ŸÚs•CGƒ^¤^Ú.ÜÖÎv÷$Óê È;!… c÷é鵿9`‡â“Œ,9p¡Àå»@jÇùþht\0 ¢û¦g°å¶oœ³FôGÉ 68âäuÀ—rR+Þ£ š1AàhÓÝ2Ýþ“Èl?mSM14²y7Ã@¤zsÀÂ5NFKÕ‹ÿbœþИ¾4ñÿ6·Þh[ ¿—é,=j[ÑÍ¿-„úÁgQË^ÿ>ÇÌýw’yõuûäÒ._!¿#µ¤~&Ü è÷UÁ¼€ýäÈI ­ÞhÌ®€°ÿøöûƒß=ö…Â?A™8ŒI7-Úï‹ÿpÇ¡ŽÆ•‹z‡ªAÝܹ¹Qß@¦í†ZB[°¿“ÝÏv.&\Îݘ…bÃÄU½ã1§Þtí;Ë:œ>‡ß«=ʯ ÌâãáüË%’ ¸ÙÒ‡^Ÿl˜õÄâß}s¤îPäÄF«>dŒ¼_v߃DàÒ¾æA«S¤õÀ@\E° —„¬û†Ü Ø÷`莟5·¨NßyÝýÆ·Âê ³IHŽûwøe¥Z Ð:FØüÍ,Í\í¥ìêà>«úë)™…òb^ µ¶+ 0®¡ðÓ÷Äs/ÝB'n] dk¶{^^¼H/ícù ö  |¨—‚swìü¬è!aÓ³,¦L[ÝW’ ønØ?=9»’Œ¶¤µ-ˆÏ¥›zDŒÈ‹ÙŠôÝ0b͘¨pÁ=¼å Ní‚Wx¢1Ž«(Ñ$¨‰o‘çÞ²ó¥¨yºÅSóá˜(½`QÈ9°”X}R+Lüšxpßd°n¥PÖ'êï¥-š™¤}pŠÃ-ÔsŸ>Ü _®zÙôYÅ@‚/Úy%Ò­®"]Q%£Îò¶I9>S9¾ÛŠ< @§ qY Õø—ÓsÂà ÁðõôXõ ‡'ƒWØe›Ì  ¯&¬|ëB¿1”i®Ö|›¼/å7™g+ܲŠâ¿ŽŸ&}QU%PqõN‚¾¤ûâu)å¹EDî;òiN/néd˜!0þxöæÊ4¹>ÉïU;ŠÉ_¥½-½^A|p-ކÜÌÃ`Ž„iÎéðy.ÑÅTÍÞª‹†|ôšÓq2¿+wY)±$bdSOÎÄ4‘ Šê¢‡{XÏù>’ØlÃ)‡ñÖÉБöz›ƒD'ž(&"úlvðDÑX]oÍ“ÚV×2] ±¨txšæÇÙ€ű„´.¥nÁ‘ ‚/%ÒS‚àz:šÿ(:‚ã¸oo%M*ö÷tgÂ"ÀÂ6­…a´à D&;$õºU?V—ïože H !>Ù ú·¼U4·9»UØNôÖ%¨ Hd™ˆÎ!$—¡)c ,7´_GR+Ù:ÙǬ›~”Aœu+’ÙIç ‹.»Ù|¨4™Õ¶PÞ£¡£÷xÎ0Î6Ç«£iù| »‡ï™Ûãl,i‰M.l[õÁúøÙN¬çÄzÝÃÓ¼^Ïf$º¦2‚UCÐöÚÒ€$F³ãåfVœ"íóɶé[¡HPâUükÏ;˜Î"µ›¼ïÿ=(³åqV&ׯ`Ù/枺£Ò‹=T´è Jr°nÉ7XU{°ö¡¨ˆK•”FƒÚ‰·;d’L2/"Ä»ÊâñLêá f\ê={ˆšê:WÉ®³d8¹Mõa”Ë·®—Hz}(Î9ïÍ@v âá_¤‘‹‹–Ð[Dl•FŠ;‚Z¸AÚÄg”£ÊœõÎs?ÐŽrüÅ;â|îåiïЖÑcþ³e¿í ~E ;¡à±t’ )÷ϮƔÊ}´Æã[ó*CRš‰Hï4–O¢t]`k¾t-Í5è*ÏñgŸÒõi bï\³}Å_mÑã‡.ý(­ïÔ?åTÏ š¡é5¦€püõŠ’åë#î jhòÀ`ªçîÈ}æKúÁìÅpSE;SâNüœ&ÈqÙY*þdˆûf<™@)Ÿ’µÇoh-Ÿ~æ0æ¤~›‰(“•ÙÒƒu柔'.1ÚÐßß5;ÙÑ"óÿ¶\Ç»Fõe¬è>X$¤KA9è›þ¥êA:?ؤ'Í·f ÂݬUNòZn%Ž']`¼‰é^½†³¹ð©b.V1jù\p’ÖJŠ›I‘B’m¾Ä(·¡†Y4]6ÝVî÷|èÎoÝ»,ðÝ©×3HI'‰9jD‰ÐFÄÔ§YëHºëÈ(¶† L;7CªŠµ•}¦ÆË±Hº!ãbé`¸Ùi²hÚ—j]Ÿé‚Ô²ôÂ7<üªcæC@ÓE˜m–·¥"øfUK"<ƨf¯ ýÅÕ»KjÍ.Ø[°«á`ÜÝ9ftÂ_b³½ûYõÿÚiúžj^§±Cu@F€ô@Ù“…|pnBYù”.;3&-•ã@ 2› ‡ëúp—e¶SCøxò-§°©9è+ý´NUŠ€ ?£èºf£/xFG°<¡X” Y| ë æÏRe€ÝK§Ä{hg¬a,J{£Ÿ^Íš»T_…5–\5Â8YCô >9ƒ)ïÛR|çbz?,É/†¾ÝѼž 1š^·$ŠÚè¡qkÈÙ ÛúsSsÌóÅÃÕ™fsQÙçÓë´GýÊÆ_ÕêW*¸‰C86ì`S•Óô48wq–mo×öíl³~T&Û·ë WÀ"-ÌíJA–µÝsŽa ´•m`ìí5›“;ŸFøç(§˜¡þ@ž7ƒ:ý´»ª°|Oóô®ßùõÛwÔa6ËFº©BÖûÜ®a6æÎ]}ªä~k°ã§nÿš–>âÅJ`½1O1Ú«Õ#”³†M?…í™ý)¹â_fã¼0ƽñj4½ôlûÀ :¹áeZ»¥„œ´ˆŠ50pæ¾æïŸ•éØÆ;×LéPE1¤È‚xYpöúô´“ÂåÔ³,$Üh/½ƒòÓÛö7Oq™ºáô6áçèÞÁÛ ¶´õ“3yæ1ú*O/ï»Ó—óˆwr$ú/-ºšGGJ`sˆŽî½§È+Ñz­Nâj%‚Ÿ+þWJÁÀtÕ¬n3™îêÄ0’E“—J<Ê\ˉºI%•2]-ï˜QêÒÙ¤ÉÆ´n¹¿ 6VûØò’вu|3gB_ƒ)o…H?ãCÕ¾]b»nw)ÀÈå‰[õü“u31ãÂxSIʃ¦ˆ7ˆŒ‹Gh;¶w?%¸•á°BšÈW°5ÖÒpÕEmÕ C^ºY­ŠïÉT²P\u`p&Ò³v ú¹¥.F[¨üÜ…F5”ºé¦‰ýö$'SP•ùöóo» úx¡Œ!àDíµ­…,½‚Ç…-zß½›QK~IÎfE‡×HRc¢ÉTÍØˆ¦BÏâû{ÃeQ&à…š!¯­îÛ«l.®Œû ¡ÀŸë8„x„Z…{ àZ£:?„Îî×ö)ÒY­åÄðÀú–1+7l÷iSZsð£:ؘ0Ln®ðC¥ŠóÛ1‘ßÐÁËoErÅê¾øU͆ ?Ƭ6pæÙ¤­œ²†È¶ÀuÞ ÝÏÄÝ5%sÉwÈKW&ʦ[õÒÃYÉZãK¨›–ÙÜâ¶òfñ `¬Ò‘µ€>N2ÒO^[ÿÿb¤U·QåA¦«^×î”Ë)ä ûÏjÍÓ-Pmµ'úbòG¼eØ™q»U­“4 ÒdG—M]ïÓxq‘™ò!ò9¢'¢;]d3u2íSO¥|Pê¸*ï7O¹¿«C²ÏÚ¡¾rƒ9Ú: ûûïG$Á/œêÝ6T­ ×ϹVOf蹓ap•èàà 9p†‹êd&!Âîne@Õ¢`,‚l—ck©(<&.;É ÆM³z>îšXÉž‹™L¶ÎdÍÙ—c3fíEüÈï›s+LòµÜÒ2ëèzI¶A¿c~¨Í¼‡è<÷!A8]€Õ²Ôé£õµÜ®²Ê¸Ëw‚ûš¦œscç—˜Šz¿=}-ÌŸˆØ…m§hŸú2òÈãƒÖæª×¨ ò&Úd•÷‚_¯+ª`î§h4Àh zi–<x×+b{õ[\‡ çŸ^$¯°oîc·d8ðÎyÅF¥‘¸Ÿ¼¨ÎÉé«ËjßÛQб†AI› Íf£òORòÌëy„Ò¬LÏ– :TÚÇM€¥WÁéU‚ì#G©ÙÕ4gAdV:+…8ý7­ù6*Íd°}á22›#X–ÀªeÝÂRƒØêJ^ñº”W.Sã½DU¬ý˜‚ƒƒ߉yÂÇr‘¬$g•_pQð·²t¯ðzBŽÈ6,¤_©Ä˜wG[ÑQ½S¤1±†«ë˜qó'ÇÇ\®Ò’¼­X?liªÁ‰¾»©ÈœKÉãŸV4ÕŸ-xÉŒýóaÖPC¬ÔÆ RÍGR+òý¦³ ÷Eáщ}3Oª~·0':!”*gšJà°üì}Þlj]uf )ìÉE‚ºQ!Ìf„'Êîg˜-`,sQ¬ù”©w뚌…°Ñ]‡23Óq²+€Jø“ö°Ê‰%‰¦NÀê¥zÃ:”®´§‹×e¨ü€iÔÑö _é+:=ã‹ ­çkFh€|#‹ò4¨Þ(-•ã@ 2› ô÷é—â/<OÜ[· PÏP™‹±4ˈGn2* Sv·Zš—ZUª•”†"§¥Ñš-^ÃB!ÆUÉZò.Ôm ¾ðÜ«{XZaR«Qs1&pŸðƒ¸kÓy)¯xÞ†¤ÕÛ.I;Ó³z¹ƒÖ‡­ÅîÆüÝKN =ç,;âˆ!aoy=³à1<¼Ñ/KXvò$VD¡v÷wÕº(,­QHÏTÈà©‚ÄWν'SíüÃ+!-Ù”R+'Ð\\x~ÞÈÞ}íˆfÄ`㱊EÖõŒrW÷óäõJ;!†Êw?>ß®Ë Ô¶êm Qê˜Êüt‘«0 aùéš²YÕyäk•÷J‚ RpH¸]ñ¤uAê»zDXdI7Zª`‡p^©n§˜¸ªf´“õ©Ë]¨¶RFÙ>6§'g“Ñ©O Œ™… ^”à hžºÃQÑK"€hƒ‚?CÒ L"œb挧Ì*ñ$ò·ýÒæ5xt¤Iø}Q¬vªTˆ%®uvùUÛÞ€¦œé2kÿc§^ã59u]§ªQÌk!x žŒžÊ¾EŽ®û­Îf6‡lJñüµûó?.ù×íã¦ò,§í¶eïî/X— V»*D¶Æ¥9e07˜öOä+nú2î¶Fyá_þ©OVü¶9 ü¯là¹ÞY±W5=­šä`i¸++€ýn†èæ<ƒº‡Z1ÚÞ˜úDX.ypxùdœó†…­zü6®/þ]­ ´Y¢´æãdžÎŸyHÍy|“åÃì2Œ"}ñ˜ª¹=ó²ÃÂH¢î÷Vg’˜=v-õ—á) ¸JúbZ™éÛ‰Ä1Qû/ÐS³W:lRu‹ºpŠª,-síÁâÂmC k‚ :ãqwPË]x› Lá%áC£…ØN2ö¢ p§Ah4Ÿê$Wƒ’©#ÇTi»V‘Fض ñgÕß+„ÞÞ7e% ÚlÐHQŒ¾Ã”×q;áK®˜aõEB w¢#GÎ9d@éc‡ÐÈdêV[²D¬Ègì¢2ÂÀ½²¶tB½lwòíãW*O°!*JžBxý`Ð9—®€«ó%¡W­ÆXÔ"ョZŒ¬½^Š5:’ñc⊻ªì¬ÿum9G£ûºp¸ø+ãÓJPL.¸Ùæ÷ìo›1ñvLÜñËÙL’WáûM£oÃ\dc¡T˜ U¥9¡“GÓrýÂ)nqÕfeñçÀ½·\<˜±»ˆ`?¡_ e-OÏÔ¶˜:í¦`,ÂC¦QŽfüX¢ ‰:´£ÔS·§¹ÕÈ«f(üߥ6røµ ‚²)ÈD yR¯ÓG‰7Â1 òÐæè¼MZAUŸ_fI‡N<}ð` PÍ2}¼¿f[‰gv|N@ñ錄Æî&²V”bŠÄŽ´þ …¸öé— Ý¢&)Ø*¥3F¥¤ù})⦵–).±#ºˆô¼n‹è 3² .Õ§ãa)Æ3Ñ«B¼Ë¡(û䮤Rªµ‡ÿöÁü#»µ/oš{ˆÂÁSõNe% Ùñ½åÁBb£-™y¾$¦¤DÐ÷1%gÉüÛÆå—Cû ïVpåvè!ìsLÐÒ«*aomÛªr NDZ(õ̳¥¨>ô:ôâšIÒÎAûßÖTí?…c{ïD¼§¯þƒv~Š]ž³1x§ÌÆõ3WFªO-Ú*M{튡Ðd¯‘>Mñ/7• ‰Å>Ií0Ààõêš5•4Ö%ë²á²-Í0EYüâ¼XПï6%7UÜ•º!ö>!2mü*EQW±Q§•~ Ô±ógxgÔ^X´“NÇ`V;Á«·h¢c0%×kFªsîÛçˆC0ï²»fY¡u=41“Ÿþ“P‘{šLüD…Y`ÆàáØ¯Ði[H8Nþ )×ËKñ˜W¿6vÖ;¶4¥­†¶oLp…zÅ\wÇ{ÒsÄù°ðoG¡UVqÆ]0QrËɤU*ñy“pAÜåÒ[è÷¸ž4cm*–ÉFÃx†šéÙ¸hó ·ñRG5–Ýø]%5áþïß)¶ŒXZ›Ç<€‡* PQŽLç|¡ÇÈ äþ³‰‘¦¼`M}ÕÆ«%}·d}ûˆÇá"c»_³é ØŽ  B1é$ù5§9ðùÎnÉmÁ¢#Q¤ßNr¹¤oËAºz_Ê%ÚNã ¡µ)Ï”aq\ûåa v§·¯LAÝ1WL£å«ÃUƼUìspÜnÕ1 Tï»ã6ÞÁ­$ô‘#NŽw§Ê¬¶‹Ãd"Y8yüÜÑë÷GzóQV¤uŠÓõ]7€˜ÏÀêË´ƒ/ê8W% ?Åò´Æw.j Ð HR»®Á‚r ä¨WÙñdr׫”fßIÀ#ç3p[—Óïw¢ERz^Óÿ·3Þéµi ®Â5âIYF½æE…¥]ß1~nCRY.¶Z;l¾KI‰ðîD¯f­(çÙž$å#Š—êMdE7 ? çsq0Ã@%ª y@ä?®Z„^ZAלÍlʈS m6hD¯Pù.ÆO¾d·,áí Š4%ox§Ô”r¼Hg5ÿ.µ¿R–%&TËï4C~Z"ÃBƒ÷þ^#ô–“»„dûU©I¦ÔB»*ØÅOÉ7.ž•¬]}#íù l·G3/áãü‘†LZ@•†»…,yÂÞ ¼ƒk·ü|Û¬_ìXþ¶ÆÝ¶5Ï+åF ò•ÉÍ9Ù}÷ŠEóÚM;ÌÂà,×ÖÒs!ÜT`ˆT~A·„êmÌUõÕ!7½nå0?YyŠàº<Û“Ç÷¿ù)º—€Ÿ…†^Nv˜¤bÁÈù÷¯<ÚÜâþm‡UÀëžL†Ò’±T Ž9Œ7¡cBØø<“G‹÷¾…”p$ŠT”g’_‚EqJœ¡|»8ç{ ç´n¹{Ê..A¯KY¾y_p"@mðãÃUp›‰ŠÆ¿ïàÈbJSŽïºgˆ¨Z ³wÕ-ãáΔ²ñmp䉩Ì6;Y|‹ƒ®»œd ''‹K<Ò%QîŒ'#Þ+nïÊz7^3½"ÈŸ¯l0î70ñ¼5ä¼€\Ž€Dq븕L:îxÅ\—\^t©›?@nEÿ^äû¹pkôÁ˜Yyxþ-¤µ¾\ÿWǤe^ìpƒ/1ÑËÏr§WîLtMˆÄjöSØdO¨íiã´¶×ÉEÀÎ'†—ÐíÎæÎjj‰AlÌÅB‰Kú_«{žm½i_š”Oê¹\‚DQ‚ &“¶¦~ ê·"~ ýÎóJÛZÎæ¯Äâ‚ÒºRí˜~Èç±ë,Î-p¨*`bµö³â|šþFïX¡ùMüõwÄnÊQD:íB'—¿€lBî`Êø`3QA¸9ó5ø†Ûal¾w¦¹%¹®èûYûð[Ž£äþ³‰‘¦“¿ySlþÃ0L‰{ŠPŽÓƒ\|hÑ0KZ’èš+rv«  a ȉu å½eC¾ t½A5?¬‡°Í†©ãLÅìœÔu«zê[µ>1M{úÓ`ÍÊů)KbNzR¶8Û±#ÌÿiW¥º)9UŸ–žœ8Û¨ü>ÕfîÐ,$Ç}¿ÏŠYÃQˆb~gßc±X,âçÁËŒ5닪 Oá-qéd•@ÈÓÄAƙۭ‡zÕ¥æÕK3¥ç>ÛG¤–Q¶¢1œáóý#°h¬èÞ^DÒ>¦Fæi2*Ô_HÍ@šéôÚô¹˜NjŸIlŸJ¦¢cž°±—:ÉSá÷«•Ýóp7Ô$\› é>[èÍξ3‚¥×xá ¼`«±^‹]l4ß¹çcÅÖ:îåIËÈv&!ÏJ§.˜±¡m&Û5V•®˜ƒöþÙö¼ZK¹5&y¿ÒÒqéæ)걄 ¾"´êÊ¿õiÜ@ŽpbPv?œ÷o?±-1„ôpŵ×s6]òn‘# ¨±&‰…3oŒ;ý,ª3_´Áò@Žî0kOô¯{Ž™ŒígKªšÍçž@ÅØîÕtVÊÖŸÍQ»>ÐÎ+A¥´Ø+fGo¹|$hý¢Ò­Ï+X@(Må—ýj8d‰¶lÞí$ÉÌq´JR#~¼: 8PDhf9¤E²¿°­ê¯PL©øo éCÞ|{é×Fr+wE­óžò@zÅú“ÊãÀ‰èÜ5”¨ÓÜ5Bœz«,ƒ1)Ê n[pjuruî³HèÚ¸ú}“ZO×mz&ö¸UžÏ¨«d(‹ëûoé vn'˜yAÞÉWšK çK4Ý ‘Ý÷Åøä0´Ä+#Ñ3“_”ò¥ŠJDζáþv¥WFwäé[„’+ 8ð~AU:§Fü¨[  ¯¬£½H¿âG°ªŽ´‚q#ï‹×ä¾å—U$@Ò]³+Ñ GÇ»À2ÛÈ`ômÛ_Ot¿7‡ÆÅ-“¾Ú¼|GS+Kk3À)5 BFC“J­„©`’G~¤žØÊ¡.¤!ꆨ.aÕUpOeÈçù"€¼U.Íâ(ÄŒ±¾v…cn»0 ”“ÃeéU¤ÛýzOæ< 8ÁŠKåXн,…ËÖl–l@ˆ;gL/9¹:ªÇçyÖµ€;m$ç$òaJ€+/l¯: ÀÌ<Ï‚<¥édÈ÷'ð( dr™™¾x´Âæ~Xû›ãô׎»YªS™Øb —e‡w'"® Õ¢3€mœÑ6ïed„d!Rê{nq8ƒ{vN\…ØÂ}Á;ŽBäPd¶ Uy8 C+x ع@¤5¡R›M`„éLÉô¦ÙëkÏ÷@e‰Ôöµ3@=s2Yk {JdY:=yØZLžÂå¿›aÙÝþÞ1®Éwñ§o²Æ^?]€2üൠ· ñØÕ1ŠÀÆÕuw‹Œk¦«¶ú›+5‡ºáÛ›Kï ŠÀ‘ô“ov(ÞàæçŸ†ßºHFž¿Õ„ <Î)@ó7Ý| =ŠÝÒ­fub%PNvÄ0Í[‰‘_óNBn†]ȺdJ‹‹ÌÌü‹jëôn>!.*E<6sƒ;›PîÄÏð‰>e§ HNìï&na(9¸úU1]už‡Š¥=XÁÐÏV<ä_wI´§6gäû+Ü›5Â6RÁ39âµAEŸ|Œ -Èò½6ñ3èmpfZ»6S¤Y6 kOn”·Ø?yÁKð$ëS =JÁ°W·m°ÀaË'–%þNIŸ ÂÎÍŹô&áSg×!):–œáêÃ+ºàœì©Ù“9Œ³A' µê úÔnnj´©% bõ©Hv¸Ü§&šÜÞQyã÷ÔT/¬ðÌw¨¥?ç¡ú·ñ$Ü@ Ì"k…Ó¦0pî⧤lBw¹adO%´z#‡XÃȽÑ9ÕÀò©Æ²ËÚ›vHŠ'"$ÛÿY¢h9 Tg&ZOYT*±HˆçÇXÖ)ÿ+±}/'ñ-º‚:9ù%(œ^½O4wÚI%ÏI÷Qƒ>ƒ0ªL˜$̬¬%ÿæê’ž¤nÿ±,pÿí°öŒËb#Rioänp;*æã¯ÛâñxPOy¯0Úϼ×[òÁj$áô›vL«â‚ðÓ¬„ ÿ1hÔSD•Òk©ž! y)â/z©¤2õîŸìjÀoæ(ÂÞ Cõ$Œ×ʆVVÝsb)O•Q>T»›ýO×ÊdG©Dîï­üÃqºG5里†è}~+f¹T¢ ½­¤å`ŽX^šH}ŠR¥þûµÑPÜuÞ Ðœ.ÜÂ’êö¥L Õ¤j·#SÄšÈe÷äÕó¼5Kà=ú'z>\.QòoÂK’,Â-@,˜à¾ããÞàiCBd΂¹£“ü‰QWûæ*¯¶Îgñ=û‚¼¶¿¸&4¬‰N”ê,²Å aD¯ &ÔR+õ‰ŒìKá_°ÙƒôdŽ5‡|Ï~Ì Äž ®qOÛµVðÇpå¤ìú—íªHCÇü0Ü·kFÔò>a‹öÃצT:˜-x[¥F¤HÖ üe–%W´¸v·…Rë?(Ùûši÷mK~0èª1’ÕÜœžÅÞãTZ%cuF3ÂÖà´lwZ£Â‹õëž¼ˆ~îµ]>¶¼èÑônåÅ|ê‚$Øõa˜1pj³2˜„ ߟ¸œRŸ-¥&ÇèäàìBÕ±ô†x¶ äÞÅá^ŒºŽG‰a0$þòtrò{ÀÑH”«ÚU‘óº‚Ùìà%ºfIñZO5ÄSz#C}ÞµôôùÏ Aµ_Œ“—¹`ç¢õÜ›ñ„uå’Î!Ñ.>08/l5ï—nœ°k@Âo—_é…­JGíå©€·Xë {K~l0oQ¹Nvgû(E*¹öZ³Ù±¥S¾d¡LÙbU¯7¢Ý?hæ{4˜¨iÄ”¶(4Y8M,A˜4#g©dÀmñåÏ_Î멾ÌN¶zNŠW€.½BÓ»ßy›BiA2ê\ù#‰üðJ"¾Ö¸êÚ´,t.`dó(ùãØäôô¯Þü~µÑ‚Eë)Tx ÌåV)`œÛû¢ß!ü|‹2ª\ù3DHXÛÖ˜ k©!u˜~4ðÔf{JCVY«) -~Ê“­jV¨9ƒ]˜Z¬ÑÅÑâ¼àyGAŒA ¤ˆþ8¢¿Ï\  +ô­ó±m™ŒïOåyz]Ú°®¼v¹@{Fé ï Á…¤‘ù”–ÚÞWˆ ?Ê¢½TÉY7]àÒ ¢7ç¢#k?Õšøây{µ, VÄ"Ö'‘…³u:ÙíÛë×Háèq)?a4Ój:ƒ`ËcYüº÷éø•ßdŸå™ ò’Õ³Yþ4IóV†ÝuƒþKÀ££‹wÓƒkÂÖÄüÍoí7°¥ ­¹g|ÙEÃh¿‰xL ÚÛ]h Og Ö-ÝWŽ^\¯°î©Oa®îØ$|ÿ¬%¥$Öv›ýÍÝVFCkÌ]ºÁ„Ü^¹®ª:µ¥ô‹“ßJÏ¡ºÅ‚‚³Š’F##cSôŽ“MŸp ò•™ÿÝ7Ö|9Ž †ggƒ©”¸È}ÜD¿øfèE!þ-˜MížoHËÖ£üK߬a¢O1Õα>Îyv‹ùIA|ï[V¢&ÀKž™l¿Y{üPZ› ¬ÝÀq,™‡ï›åËÑ2¿_{©Ï(&ˆTóø³Ž (ÇSß ›4à›ªUžú™ÕsED%»ÃqÛé&¬ÑÂŽ˜Â­²™†Õî uÄ…Χñ‹ÓN…鎕wÞ’  ©õØ@#•^hÃt¡é_®ÅáÏsòâVT䇰qì4P%”)¢fWÇow¶—Äô¹pà;‹ºS^ÊvzÀ 5›Ž“™9ç?iý+z§hûÀ‹ßo‚Ö¬û"2€ÆÁO.à.ó2¥(¶š©~.2·qù çà”qST(~(,"l#v(𔣦•%ëà%£!n¢öüx+/Èܧ5õÂ@ªr\­¢W.nT^Ãû¶Ü33˜ñÏš‰R­BóIެñ¾T”Ü_=@¦øTfîZéBã™Þ9š½:XåëºÚê‘Ô»å.§½w60e\¢â”amô5ß…± z¢*¬˜'+â¶Á™V~N Ç9Âß.ë`q`z‡=º7È \A÷mY¹÷ Ûª3Ð jîwÊNî$©ÖDR´3ü2Mƒm üœ¿MrSìUs·Éz?§ÖT›stõ% õa–-î)áhy!wÑÃ`€:þ˜õ²î›¦/k`_°²äµxÛ¹TÆeÏU’2¯ 3=1Æl ºñÒvöaaت²¡®«˜LêÏ]`TÀ~~Î%ªp¯‹5IX^”$]žØ~å°¨ýMC8%w 16ŠhùLáÂÈ›Å+ý£0ø¢ßî17Í‹5žSm†-0¬Š~NxÞ@Ab†R?¥S¡ñJ?‡&·jú޼!`Ït F.1eçVwn‰½nÍDÈœ«S˳°r0aÍtìÎ+'ŽÁ€ßoQªn03mÒàhâÊ¥Úò1Y–ÈšæHb\IÍ÷–²Kdi}ÀÅÔ–@&'iíæš¥ÛÄû»yzUTH….‡x7³oÏ«lùç“'É´³¡öUBׇ 1ˆ]¸Ð·* k¦(äðEÕ‰Äáyúi€X˜÷J?ŠõlûGÍï¤Éå:Î[ Iå=¼¼ÕbuœÕ´rœ ¿E¨ò/Î^ù)õ>VœzËÂàõ¤oŒ]°†‹ zÚƒŠ¥(Êbç ¾ámzpbk2÷>–UC•24ÏÈŸZŽƒÏßêwAP–!àåÁal® 'é—‹7’ª×ˆ… ïÑ4Ø»ï@g®Ìv£ MÏû'½lUƒ³dEÇ!XØN©·)ù sc•!{¼†Xx˜ÒBêeÕCw=Tæ¡;I+p²ÚÐ I±´Ã šê ÚôYØX5“p`vÖ/L@ï0Wm"怒öªz€‘B.™;Wx•šµu)TTŒ{G}êc~ ï8ž”Ë%ûù)ôÉ“¨þ,KY]™ïkçèô‰Ì´èq8Ó6}÷–¤i þÒǰSªSË)Ä%\‰?wIÄF¯nÑü»À¬¾§íuŒzöÅc£X®.ˆS×®•Á˜‹‡¨#9>IÒ1pŽï$wWeÅ6Ïö[_e̼Åô.§$23M}™ìLžòÃ$SþÓ®©ð"ùÉô6Ëb >èɦóYw±7ÜH᥎|—QdNSã.´r¦·`ØJ”w\×ÀÚEi‹xÉÕ !ÒÛ²‚ZfÑA).L3Daˆ¬—Pc±:­ä)Q kÜm+®Á»ž«.Ê®˜é˜‰&gZ—b.Ò~3=§˜…^Di ´ZÿÊ„‚¦Óß"0ð¬t¨r¯o++S}„ÿÄwc¬ c¡W÷lv¬¤Ü»¡Ï¤ÚÉëV/eÃÛ‰Ò AÉÌ=KnÒò7+@Ÿ!!RB¿'€ûF‰m:Ç!CßBã¬=”ÈælZŠ®óZƒt0:f ‰@cƒ,ÕÙ÷9ë½0-ò«]ƒî;~Òô¢‘„<Ýñ“*&¶™£Ï îH? UÏç¨I'¸OÌSÉÉÔávµ ¹ƒAÈfêíŒfïß`2Uµ¨*jߨÀ]î¤Fx(FÃ#÷'ÕF³Õ8¢®ŽÁ¬ ¶“A;·£š 0ùÙS3ȱÞ@×'Ÿ7?sË|&TN«\ÀRfU mȯà<ˆþAÅÈØ¹ÎQ«r É@û[ øØÈææŠò›þÊÿ1’ðñ#Ë— ‚ä}Á€×ÚVb˜¼}ϹƅBvÿt±uÖœQY úÏ ÊËŸ[š&ÜB²R âà·T;-¢¦+ê,,œì UÚT [¦]š¡a,ÜÔD¡vˆæ£ºþ¥²<ƈÂ3åM¶(ºU¾f¸‚‹C߸ÓÀJ–l„ IkѨ²Xë㇛]½óýµùRapïêíÕ|¶ñÕŠ-íÛ 3ñyùœÀË;rC³\:ö@«ôµW´Í”ûlÿ´ÿpWN¬¹¯M#M#[_÷âK#ø¿+F‘%iÄ{¨/Ä&ÙƒEþæÀUAÀÛB>åÄT^yöv4ç Á‚ûñ„eyÛBÊO~¼&MÞr:E¼I„Ø[ôýQŒ-È¥3YÞ,ؾО––o§ Ž/óûÁpÝN¼Ý ünhÅ ÷?À˜ëŠºTž?oj9}‡!¾öjà,áQÉ2·Ú9ÀƒØñkæ^'â‡vs†„ŽQ²åç^ÃÊÞ[Ó‹Ï.dÎJÀz£–o–”Uıè>Z ÑÇlŽš:ŒÎ€eƒ¼‹TŒ=è˜ðŸâ~nû…y.xèœàL\6 Ð(ž .ìy«®¬?ç?¼='Aìš¾²½áö…¢Ž…Š«. Äâ†ßõ4Œ”3òS]C¹ÝxÛ™.{ï¨{ž)¨ow¼<öt¨8–æ)<ú'ÄÝ ìVÓò·8º¸²+‚£SØ÷B‡W|û±BŠÝŠš\Û}èc£”€]8~ì­oÒ^fì‚=Ó1ÛY¸‹")#FX:Š¿5Õ¡zÿä*`]rø€3üŸ*Ó™»HjB‡vÀ’iЂ‘ÞAýH{–O0snùü»ßjÄ ½gMwÙVP¸ŸýrËdÉÅvÈ* ?Y|ry•X#ò¸Sð»åf±óA;ði#c~è´ÑÐ>*}îeSºG›Ä=vkd›Ú/•Æ®ƒ¾{•Ȇ±Ó”‚D}zÔ¿(šÞòWÝ{æ×[é\q*Ê?Ň’4­aø†6œ¿ðÚ+B¡øªô>SLJizpÆQ²<à T9ä¯)v<Ф¾gÏÊ*X’6T Nnüµ°/CGûJ)<Ž5OÊuiíÌtHÈ]г MÖÅ{ÿÃ6bOºÒ˜a©±¾ÂÁÝ/!& l—³Q t¹]Úˬ ¼æÖê|›­Ê4?AäxÖ“pŽ^ cßím«ôgal ¥ãÇš‹À­†`òÁÔâ´äûn îBÂÑ‚î ,}òÅŠ'BðßÁ<üYa3${ØBܶS³"ã©äXSEõ*A¤Sæ$ÆÊíøŽªÚ˜E÷ÔÈ}‹,´4ÄV/ꋃºÈ募O¸ê>Ár-#è’©û ©$M‘ZÊåH´£ìøÈ%•;zÚa”að%yñ˜ðj?+]„4®÷(Ýôëî.ðß&<岯 (~D–Íq>Hd¼Âu‰•i¬jù|%×ÓTôÞôËß+ÔàQG­ÞvLäæeòw¸í[°mö‘ÂQÚ:Âõuô©yÿñ][]§@aþŰ€ÅÝ n áÆi(þ%Áš .€3( Ò-1ZGäm¢.’ÀþÌ+X²…P3m¡KžÁg?«»zR-z"à…íV‡|_f§\v‘·*ÔB½fÓ69 ;¥ˆ{´Ïk覊Ù1v+p',m4ߺœÚ`¥Óü¢M ö‹íf)Œ§o0×þƒ^<õŽM,î€^$;Ó î2éorÎ$gãî š‡K¢3€ÖÒÚ@„‡®^Ï>Ã0‘®A'´ ²÷zÃU¹°-å²™àËÓ{‘IÓ®bþ”(Ô…\£Àú‡šÇm†‹¯R9¸ù²Tz(ïÐ{œ\eÞ¯>õÞéW¡§3†ÁýXsV~ޏgÕó*[ÍE‘¢ÿʈz„ÝP}™üÅ©NH>Ÿ*ñx4Ìš\2ºtuÓÎRXþ›:¹\à-¤šœb5¹  %øè×¼÷ŽÓ"ø°ÁОze}që—6gË3n˜E©Dq²’IM ¡{àyPB¥Ü=º–l‘¿ƒ¯F2Æ‘_œ~GŽICšV£ÏõnŽ8Yéê[·Á;è"“”zDÒÂÄïdo›aAqÚ¸ø¥Ë­Š³$ÈÚg‹ö¢—“Š<˜nч"ž-È.‘)Òòød‡Ð­¸ÎɺÁO3¿—‡±ûŒB‡,B$^#üg^h —Ù@·«”Ì4¤èã$¾DÄqù]Í땹^>”~à”`ã=°f¸è„º¨ ¡üZ®"HøH;4ðœk…ºú¸4cL —ñ®Ét8Lúòäf„û³óY©cœÀ˜@GÛã/”t;w&ÓÊå¼ib).ºgUãXðíJû¸¹1‡¡!~šž2œµšQ˜`^y EˆZdã=…àœˆ­ë­µÞcQm¨j(ž“òÛ,W™ 3w––}Qp·ùÒTÃmL¼YºÛŸ2eÂ-µù05tòó,”bmö¶+{…ó‘è€S•Ç(RA9¶—Àt^1Î&ØóNŒgð°¶.ˆ`Gcη7M±Ó½ä,²j"•ég46}?¶É¸x~¶_§CP±¤tN’ýÕKÝŒ„H뱄¾KÏ]mXž¹n½»7{»À™2Nn‘ñµÿüäiô–ÁÞåУý¤—HòUc%ӥРr‹†¢yìœä0(?Ü=˜¬X¡ØRÙéß5ª©nN9Û« _$Lî¤xqSíš’ÁA€íÚ-I×Í84¢K6NÚ[rÞýÌÜ^X»µ!Õ9öQ|赚¥ÊƒÑRŽõ´3ó@ã ȇˆTßÃÑ2³V˜œa”'(+ã?ÞLþòuö.r«7»/(îíÿCPÔ=o_[ºÊ]dÉOS3>o m“¤åAØ …ùKÐR#9T€Pf7]°-^‚óùTMš¤ß™¿Ãî_*âvÚ;ûu™°.Z0ô3•E ­M¹Æ§4üßÞ}Ú§)’Á˜¬´~>ø»§ùËv<Ø—ÇüF3Ðä¤]AÅîòZ*m\ùò‘É6ÏL1ä]]⮾„éät¶˜T7aÕ"x4劌‚7‡ÜÉð3èÄb„ÅÛÕ.dú¤7ΪéU“/͵à…ÁÎtÕØ˜l ¥8ÈW'ÆOVDgdнÍÂVÍÝõ9@B^C´!Ðyót)×ÕÖ:ìVØc-®Õ&~°dÿ˺²Iz¹P\vî¼ß14Ù(ª¹»ýöƒ—ƒD8°`=¾u2’YÇi“ª0Ñ«2·ï¦jX#á=ƒÌ„šq½¦ ¸A¦†q³%²“çyE•ë9@\­„6’餋Ù犅ÂÒÌ TÈ«{_›¬è¦d´™ÐŒõõðPm˜×û§ž çá bfÕtÙß2-Mà­÷aó!SKH7Å6 I¹Ì†ÒÿäÄœ-4,§T×K& 2Zèê_§Úîÿ΋ ðçCDL?°°?‚ù‘MÛÎèíº!7ï;oš\o0LdÇd N´yîî fˆ )M¼8È_™Ò2Š[‹È»¤ì§«ï •34°´¬À­¿L1o†!¼ Pg{GD4ÐL2ô>öèØOlêÓéŠ1ÃOÑ€³?dTiüGk2%£SL­Xèœ7P€-ö£¶hc¼h§B=F:¨ÁbÆ“°ó¤CehÒ8|à‘ÐcPwôáíQç–D7 WCé±^Þ»x¡@`¢TQt¬Í}ЄœKúÄàYÜ!®ì;j‡Á« ˆÖÕ¾îrKo…Ðd0üRÂ.À`ì4|ŽöJK5ˆOù©e¼ikm¿Ü{ý,à¶;B•UÃ, ”Yl€ ôj|i¶¼° òÀ¡Çhüò:Žÿó…Ùxln8´O3Ó_ÛßÉîQ ÷Uýý²ŽäÉÊ‹ð®‚þvéè "è^Ú>OØ Åï:îÆ7]â=]íSÆ\Ëí5ç¹À× Ðþùp`,;vÜy[TZbUí'‰½Ó,+#„1ŸŠ&¨6òåÙ;Š-¶ VÆTv^¡4Hš½aQBå1jzF¯Ë©r×D { Êb”M+‘T¢©O|?A†•ÑÝ—p­ÓZL±¦JE*É ÜÓGÂ&á6‰t¬4âU¸nšbf¼jµ–tYOïu»ãã‰ÝQ6Ù¹€p';\2ik¥m¼ªµ(C¹³?Ïí7dÑü`TäÊÞ&è – éNf÷9ºÑ÷e¨Û{>€ø±ÁºX4ö¢xÔpxÖt-V¨HH`§îÕŒ°Ilö­8 ûä QÇJúf'vâŽc¸9¸Yd‡pUEÉ@ÓôYØÖGaá/®,úâm²Ë:€W%¥ Ú(ÂÜ5O|rëkxÙb6Eõ1OdŠ¯Ð¬—‘ùa(ÛLÇ£Ì4øR¦¦–Ê›Ö<Û͞Ю…s«¥Š1c;äàZ$3½iŽûò¦[Aï¶Þ¢ ò˜ —7*οìMÆÚÏ‚?ÅÑkÑ'§0ÊÈ:Ò_Àm"†0ë@ÀÚ§M]N(Ì£J”¡¯«ÑŸ„ÂÒÛÍ[ð\7îË–T|:µðC|çn ˆÀ+Ü—uFgC"6sw•›ÁW0.ϹµñùrRÜÝ  qó w¯ÏBd½;ê¹b­*ö~‘ì+‘‚D ü›7*ÃÛèZßÏ/ÒC,„ã'ñ^ù' +[Žx¯ñçña§QÊn;¬|*Ïõ©Ž¹SÈý(3 édW¤VZ½B+Ç TÖ2»ÄMÎ=g»"uت³å€èœÝ1NXééÆ˜ÅVkÆ©¢N/ź\1Hî°„»ÅYÒ¦B0¬mƒAcTÁzšþˆM “ãD|’n KìÎò…âÆÉH¯!ЍEƒ_¥â‘à‰<_£"!‚RßTe×3Ãìxb³»t•ݸ“öÉ VÛ=éÍx¯.ê”)•A6˜OwÉïNjܨ(ÞÛâ?/<&™$ dç/È®ƒ[ãY;Õ÷ÄÃËoqy`KïØé 1²÷&=`NS {MC~ï€1´ùËKFÐ*°^!¯“¤\»P^î½AkæA á´,7ª{© ´¨vLjRN*WéݾV ŒVUßùÅ“+ }Çn¹þpj1ts>­º3§‡|ïv_å6F™¾t‹Œ‡-¸9ˆ¢V\{R#z7Rs5?@€sTì¡UI€á;7þ&¸WPäs*û€¿E$7syèvˆsÒéÀ…»°ƒ0òo}<­äâöîªäÄg¬–HmÌúI¬ê3G³%ʼBì óã£tƒ5|¹;þáÐ#)*¡!á{Åï®››•ô Sø·¶ê±n¤¶±ÁSXz Ñ< KÞ\~_úçhœÉ*2xd¬…d¦†š`†2Ù.Ù„Ä*W¥‰Šà—GÓwì ìÕ:"”Í Ê¾:§€™ÂÏJBb`?{°ÂšÈuùÌv™÷ZqSõ&\`Ó»Àùì€ÝkfÃXÀ±ú°bKƒó,XÙr×-R¢§Y~Z}-ÖÕhGëõýÜdŽŸúµ*–S4^ë‡;7ÝðapûÊË|ªCÛ“f.šd‚ô;êdškj÷Ôk‡E}`aù½:á®ãæã I3P„CÆê±meçÀûUÓ*ƒO°¦ªvÙjŠÛ_ ~ËÍŠº;îu0)cnøKrÞë9w¥ŠxW¨úOx°(ÊÃî<~}aÿ Ö€ÏRÔÞìEã“ÉÇÁ”è´†.{ñ•T b1s%„½±OÖR¾ä¦#J7~0·Àçî{5m?îÈþÄ">˜¯O#à ÚU«×|0ûR¥#¦¤8kr”‡w+‘¾”‹z›öô žqfP¼RÞ÷ÿ!i6îËÔ-‚B!nÄÞ|Ó)×»z»€¸¸yG)Öák­m3 {뼞ªqr¨a^8©—h¾â¹¿@ÀnKWopþU•úEU'»©Påj2öÔ:°„–vûB ÕÝ{ÒêÙU{µ«£XfÿYqªÃs&UšÄ©ÍfÊ{v(ä/‡‡cŸ‚M‚Ý’t ðwŽë*MQõþ–Û»bܶ¹YØÄCÖ4œíûÏ”‹­º6@L‡윰ÍÞù·î)ôDئPÍÔUYýÿc“Í…mg~ȧÑxƒþsy¢gBü÷…È”.î‹ ÒðQ„í̵<žnÉ0¿Ùæþjó{¿Y•ï0éÑÊÖa?:ðÆ•'ëÒJ9™‹ˆíÎ .½K³TxuºO “q[tØþYÕ£­'Gê2þ´aöŽHØKlÿâ¸"Ù$æ{ñyzF†²‚_þî·Û¸]~DdˆsÖWOÉJŽˆ³Ðn+øgª EŽô‚A§ËÃ7{yßUæ#š,ç©ç‡ >ìÆÃìõÏ+œ©'ü&­ÁÎÅÕ…„Åœ«Â£‰î¢pß¹áï}oðU…lÁïâMhw´U¢}ªáC*Ñsv’R8°>ˆåÑðªÿæ¢MY6ª Î¶ßþpo8gŽ6qx 6ôfÄú€‡£ôÞãšeÒ»L§€m¬™™ƒ÷zË'\_ñz1$ŒÇXÄB,<—`NÓ­?©â¸£1ö:òVO:ÌÕÍüM;ʼnæÇ¼~ü=É—úž÷[<6É™oõF%ÐSc>£å€¨Vßç „g/0¦"†l¬wx>Ö {B•wCç£k÷Ô£å>SÙ$é¹V‚hü0)¥õ[Çr 6ò¢)Iío©üÜ;'£wŽûz6ä%ž` P­•šÁ}V`mûÖ¹ZuMÕÛÈÆöÇÛÇjòšººÿ/U%ôFœÙWšF™=>ÊÕ?eÈ}PÕÏ3I•nƒ9æÛ€ ÙÁ÷ZG ®‡s.¤ˆ]1)§M„\Ñ«ìö%>þâìÁ£+TEíwû/˜gFûë%»¾ÑcêDåÍ£ÇÑTLô ¿Dj>_S£¬qÖÀWé!%Ç-óthsN£`|FÄ¿ðrëÜ{‘ »«¨ðTÇgÒ|U!ÚØÒ`5º=ÓmQùÐΚæÿk™oó¾î;^ðD3¢êV'^¨70Ÿí<ðöûû×ùWø^G‹ÏâfF‰½VG¨Ú‘žpå5ÙÑÖG±Ïs$R:£Èô1Ý*´tÏ%¤ÊVÙ÷íu‘.qúC§Žè|%‘+E|ÄqL¥U :ùó¹dÔ,ÈþƒÄO­[KofÌ£•=CPí,!ù#FXüqàxÔìÇz\<—3ÆÔB/¡Í‰ö‘3­vqßRÙ¶-Dñ¡àœ£@w0ïT¥Rí miÊB·žRúW0äx6ž/Èå™#Øý©öYX! þ×Ö%yrçRœÄ/Â-Ö´‚îÇØŠƒ‘h`¤T-D³ªÐòB¨",ØG±ò‹6V»Â~„´{äÂ­ÎÆ0ݺä¢ÅµÔ^ýˆÌ%(,Á}W§;•ì§~›ÈW*GjY €[4Q&MÒÍSƒ¦’ÿHÁBú d)mœ±îªéßʸò»âÅÕ4€_‚Á‘>…¹V§g…˜s` )Í:ºqâ|xè©®Dž“[‡»¸ÎL×~ ê}˜¬•AÄ==â|k¸eòlХߎ‡É/fؼ½©;hmø¾Ë'D?Rü.hï«P¦„ˆ/ZúçJ-+ C1.¼jœ™ad/S•Í¡V)ÅpëQ€³\V&Á¯Ã@¹Ÿí@c—íÿîÞ2÷«ì$—ÂØãáš ×Vc¯\7Èó^…غߦMjød]‘Ú±§ÉVµ(àÖÙ,‰¼Uîk³ug# à×X1f?´w}F˜¡—3¡ÓÈNÁÉÇþÐ<Àkï ŠôEЦ~Ñ—È$¡yÒÑA4œdíBÿ31»T£µœ“0c Ü)d£Q*ÀÑe˜šKt%ÃÂç±5¡ˆBâë´öLöcÈãv*¾™¸ëÆíï´”ËdB6¿7;=K7]ÚV>)Ó7Jý2ð´ü€Q0$ ¶VöV¾²7Þ͵ªÇCñ1V'Pµ@ÌKz¦EEË…8rU BÊõ ú%мw‰Æï „ _¯ÒQHw/Yµ!šß<_Ü¡‹Ú‘ö/¬/.)ïÒZxXÃ]Ÿ›‡}ئ7cÎ €9Ê´Ç?'¦hD/] lV[R¡\EQˆ÷3½ÞðÒ Ç>¯¹­ý‚õÏ…ø<¾öË—¡çݤ¼ú.’a£%Ÿ,ònf K1ä®Bu=u*ÝÍë:>ˆˆ$w8¦÷Š.Ô,¡›þgôˆØ“Ç2ò¬.íDå´ãÎ^a?ËŽx–^œÓÅ8&G½Ã[­¶ß~žž87Ü1hHv@"¸\6A«=r|UIˆƒp/^k)y8S- Èœo{$ÞCî> ]µl }i3N¢çYãJ§»«Þú×|01µ¹b²:Æõ=×ÂÃ?„{¶íæ´¯ÑÂ8áÈ_Wú§‰¾>$ê.¿ßleGq’…lEÄ-³À]§_ƒÔ(+#”Ä£ ²FC mpíža[×Y~œ†I2F;¿Ã8)§tKöÞŒù9cœ 4:_Êø ZfÙY¾9:Âêï?ògëã›ë\"¨ ^ž¶8ýâ<7ØYJfë*l…|ZùûyGa“S/d­ZîU_4»÷^ÒG3?öðµÐÌ G’Ò¦Iæ-ù±ÂÖœÙ:E‡ Û~<—,æ]ZUçnM¼˜}’ÌI*·‘ð«e2ÇñEù0fÂg¡[MíuoösS40bê (Ð,÷iÈ0-C¿Š&þÔé(¿°@÷ò q‚` ØFæ–UÀ\ýj÷t‹ïƒNMüæøŽšÄ¦r½cÇQ]2 °z0àS‚:/߆ª0¸Á÷áUˆó¬ÁõX”äÏi‹Bè<7ø(Ô×ÄðZëô¶÷=vŒÄŽÐÊY›Ñûäm¦‡P R(Þ–ì øÞV=²ó`¢ù GQ³’Dv.Kfþ×Ôq=þA 0ºí?×…¸Vþ¦±µ«…õV”¸‹O×1Τ5E9‹ž®uŒ5.‡õ2±tûu¡®\¥Õù3LÄpM1có+Ìÿ°õË©¢‘:'o4ƒ«l«Éä=áö.ìú³Þ@˜ƒdŸ¡º5`Æ]Úð„ZZéc7­–½dmŒúäùÔ·¸7nbùJøiÊøÂ,¬+Ý{ÙµÉLÄqëÊ+©ú×ò~°Ÿ¾†ûãÏ«ôkZÍYß´6KN-ÊžùW¦~ɆCŠÍ~ ¡ æj½2Ɉi)ºE!ßé ŠwÔ ŽCiVÃȺ?s´r_uw·½$ç‹n3L¸;@VÁ™ÕE `r~§…žþjIn|w: `– iK{™å%JƒÛøÂ›€Ï0½Eë}÷È1ý:Ò5^ïÜÝ{»bT£Uv:Cîúà}ÆVÀå RY†ÕJé¾l³yÍ„sJQ O›Eºj¦z{Z—·¿x"lj58PE—9ó·3vÄZh°i:ªl=˜B¥2ceÍÇ»ðO2P0%¨MÏ^ænÁ‡ì¡ÌäR˜c!&np]h\Evg Âu¯w/ÝF±#ø#C®[e®EŸ¹Å$dP³V„‰RJØ4ÔUD &K¿¹ñƒTtÍÙ3³Ïÿ‡ØË²°I°RŸÀ˜«jÕÑí­ÿ!‡uÛÍ踯 = dù?ói’Œ@¸b­DïšB'óñ8?*æêUͰ¢NP¯ðòÐËv¦üYX8€ÐjÇåç—ùÑý™Mþ„bû¥ÁÉ•µÓ÷Ÿ.PºÜ†&wJÛL£è)å, LKϙ݅¸µíêÒP¹yº5y¾°QEržù׆ŸÄ³Ø±) ÕŸ¢ŠCT)n×±äÏó®”zYüÛµ754Ÿ…fЂçú˜?l¿âD±©ÀƒÐÞÒBÌàìÃÅ7°z4§ñ¥)é¾»êBâö‚‹pˆžF<Åìµ»ê[èr ”Fr ùjÖ# ÇC¡¿75&ÏU Úóê|=z4 õÔ)Üý³NŒäKCM/æc<~QÐ8øåeZS`¸[8 BWjœ”¦`hÎfKÌ^žÄµ£zñ¡a› Ø D³ÄèLouä ÜJPŠA-ŸÑÄUJ`‰+¹«±a‰äŒñÓÉEȵÊKlnç@3Ö¸ â,òk©H¨Â`’ [Ô fáÌÐ"A’oâ®Íe‰ÛÃ¥§ytEšxxFzé_<ªF;¬3ö:W‹b¡(¡ÅzO²ÂÊN‰ö´{‡+úx¥`®«…󃤫rQ9X ÈÇ äÐú}M§ç¶e¬|Ô¾”›7Ý‹8s¨J*|a<´M,„i‹SÌ_éÖz37œ™ kS‰¹Ú$LN ·vþa'—ŠºfR»ÛÆ´ÈÄëß¹Ø2©pX†¼·éz>ž˜°GêÎÃ{ÈxQrù¨?ž/žb1âl˜loJÍwf¦ã« þâihkYÚiCOG̾˭«p’Ån‹Ì#6ÀQ! Z/~jú,Ķ…B`Ww¤“õÞzåM>×k̰@ëµEdp¹VÊå´™®XkÏ*€Z¹Þw6õûD¸»××ñ°H0¾C‚w A©ž^ z‰d$/‘¿®_ô9ïSL]9€ð!›iâfPÙ(/ƉŠ\±ˆîŸ(ƺbfç@ÅqO6‡ßTízÒVXï¯ì©X:ÉÞÿ‰÷Ê´PµÏNªPñ¤Æm Ø}×Õ(íÊ¢ŒÛ¾QÅ,aŸ­ïó÷ŸIûX^µPÚ9 Îúâ„êäÉÙ¢6²À»3n$P½wzç­“’>°#½B$£¡nþd3*Ÿ]|¯Ý‚rB64ÑŠ(‹å²A¨¤=i>õ`Dºz¥¸™ÜvW¢øc<,AÌ©õc™˜É°µÆ×²wùOi ¸÷¿gK²³p“7”›çþ0ÑP÷}6% ´ ,k_‘Ûûçcà`ÝÚ½ö¥wÂÖˆ«ÿxØc4ÀìÀmm¶iÅHó(VP…ªLú ^8gÆý¼mú“»y]ÿJ5tîròÿØýÅ ³q‹±i$Ï}2áuŒÄ‡÷zŒœZó— csÏ­Z^XÔ¦’¤;ºÖT¼at˜|ûº“Dd¼x§þæ/Œ5c‡A#zÛw5 #‡É®st”íyõÈtsvmLf5}|xáÌűݪfǹ.\$ˆ †Õ7ו:œ ³)°"ñÎuuÄg³xpËfb(ä˜È:k”N Ð/IXhL5Gf1-zó9Ôø§Yí ü‘Vs m¬p«CUOlz®˜äÄÈg{â‡Qކ9ÄSN«8;u”|YöÆ­/*·øú@ÏŒg¸ÄJ!3‘ÍvÚø-¶#cÕ ãE²õÛÐÊ–i:ÑÖeò—ï–%åX­ê9 Âdm?%#(18¼xñÑÜtÅòêWm&ª)‰‚Ú¿Sqá{èUe{¡ZF冰Lz`߉mØÜw¶Í½¢"[«Tµ>¤°{! ŠÀ/úMZ[•º.à$îr€ÂoS½5I\›µdžHíË>'îôï‹/c{æNUt?ÂÄ%Ýë8&!ݼޓrŸMcÃÚÔܼY(®h@:ÇÒëýÞ|¿ß's韉ZáT-ùºåšêxëáªCüÞŸò)ež¾¯«qoÿz’B£i´Ø.Çc©yn–u:¨¹Ôc1–º¢Wn_²ÿ¯ý¶  ä;² hö¯äûï‹mD,„TÀÖ[é:SÜþö$†;âŠöì³VKýç2J<€ÉqͱÑíûŠ8[7‰çÏ·AP•¶Ú$iþíS¿ÅT¢ïoáÿðÞ¾f‚@þf¼.§8ç·/úÙc}A”ÌK]ï2Žeµ|3Ûh‡ü("" ÔiŽŒÜ&†œIï4q´ØQà§ç%V»ÿ̫Ė`¼âžËñ.Äã£QB»²œlmX²ÆDÚ°&*þÙ⼓,cœšÜ|¿³Ý*8—Fv¤dÔÊP5üE môWKõH=rË·»ÎMF¢}8{@³ j¼rÇ'ë6›®©™ò @QJ#³üþ†9’ﻈ(fíÓ eÙ',lðÑ} »>Í«Èû0®1ˆ‚áóØA©­e„wtŒþ6|¸MAàSH®¼²¡¡—ÏHèn[À¾€eLËhµÔðÅ~Á½;¦6LpýDO60%'„õþ@ <`G/eÅIŠÖg¹^%N½°¿dmF™Á=¼.´HŽÔà‹w,¿®yQ¨8+q/³;ü4±Pþ)¯ABt¼Â„]Úª®hh€ÁA€ÃD˜h][ã`·b±-ˆüVóϳë^ÝLd Ô¹ÏHÜä¶P€÷Ö Ë)P‰°° õ›¶Œ§®ìâk^r{ÞÂ_·óÁ¶ÖFÇQ"†nœyS•tÂÄž_¤`¢™ ˆFhÁnWA†îDôü3ž¢ðˆóí1¤ÔS ½ÙÏXÇ£ÔGQw½n#]R5hqT–m‹B‡¡(‘Ú‘«‡v|§Q@à9Í‹ä³D9Ñ\:yùúÅVÀ[§-,„Kª .÷2úÓÒäaȱÓèU€ºÐÂPOU$Üó8úê|aæñ®”‰*/P:!³ðn•ˆ˜I0C‘xÌÊY3ƒº¤J!•ë¨^m(Â7‚ñÆQ¨è´×€· ËNªÞ&Ö=ãÁ Á‹“#îL†æöX"%´qUi ž”¯ø™Mct¸øiRé{'üªNuQ&ÃÂŽyV)§õ†ÚôxgÆe/nnÆwеÐMŽI``¸rú+Á"íöl 7nëKÍ…Ñi…JõSžÖÿ®#Qéþ:Ej,¡.}ѧò*5HL¾ ¤¨2¯{›jýM»€–gúsùirøÏH—»»v °aq€‡[y!ˆ·nþnkòslLtV6„¥¨49Á”4œÍû¨Z—ÄZ¡Ù‰FK¢àR+‹rúÄ¥fÚ.“eòÅÁ:šRà|‰>”ÓíK½^³ñhã^ëà>Ñ«=€9pv²Ùùòøº#Ñ5ÔŸq=Kå‹g}%HWbb)мû'þ*!ùr ò‘ÂÉèWÃ×çœ1ç+JŒaõ]•Séa"¬È¼ø!ùCçÞ ¿Žô~нÜÙ 7+äa ãp´Ö;xݴȈ#ºþÿ/ê€#]ì³ò^ÆéAxÌ݇¾Œ“We‰Õ*¡J!O´èG;B› @s¥cħÙsÿ6><| uiÔg%‘/¨­˜d¸«ÜŠÉ{1óókÝ¡ ( a#ýØÁâ½K^ÒœF%jëºx(lßG•¸Á•ß+CÂH#ˆÄÃÉ‘À%7.νÑÜw&~wã+  ƒ)w"¨Ww:'Ð5cÐþc c'ñ_G&5$E‹ü „ßà# Æ$íq;5=ψ¿Ð?gç;Ár»½{še˜Lɹvã_r vD,Ûg ÃKx­Žyq®[¨Ç+Tâÿ½`~E°F˜Ž?8³=é¤jÉqÐã.o¥fh¦@í„w–ëKx¹¯•ˆßè ¢7¡ŽUIŒ-÷þ12-} “!CŠÄÈëçÍÿiSÑŠÑÂW3ÔQžâ"_Í"Z±ü×îÌ:æîÐDÆ#~ˆzÜ”—Žª:¬ËFfOÑ(ÕHÏIÓ>¿Êǽ0Ä­md42÷š­Tª¶)`…˜ˆ ÑUv,hœSZF``]8¦M€»ôŒQ¦õõÝÒŸýÕ V,¦reoãp¹l`}Ä—Ysù,5ƒ‚¹L*‹c6¨! huW\â ?ó¥Á'N«ã'ÏÏèÎò?ŽLV±‘™X¢ßšR­W øðã…tQ4n8¬enÏ¡a˜“fÍÓ8A‚cPÿ•â îAYÊÁ†5<0ˆONШ6cÒ õ…>]šY8  ˜×⎠4Ô Äê8°ƒªBÙ Uðm,çô0˜ÞÙÉf•þP1•Úß —ôa‰½Yüi;:Ãàˆ¥A_2 Ù®F›ˆÓ•ÂÐX€¿›mZ6i“RØ… pê²?A€O­_Ýì2Ö×ÅœLƒàfl°ڀëúbI>AE˜,S•Ìå0€¢©ñ)¼ÑŽ€²Âs'ßøZÅ×Dµ°az×肹ëÉygͽ®®Ÿ!ó dÙrˆ*¹Z<¶Ý¥¹ û!Á™Õ‹<ïk•þZ$›YúPc÷Z2l@ÄÞg¡Æ;µD‰6Ù9ˆ!@ÿpnu.ã©Þ\v¡xòÇï4B’œÅJ”ä±O3‹Eô:ìú¢ñß‘å‰5Þöjd›ÜŤ9͘•?gÁä8K›Žø)Ét§vª(RÅ» L–¾H%‘IÈöwUë¢ñ —Ê× 3oÆ«`Š\ÓJŸïôßÛMß.n|{5†;;“aòl‡:hHíï4ÙºÜka%aƒ3! ‹íJ9@w¯ÌÍ‚ÏÂ3Æ—i9QbÐ99óQlâ¸ÑòvÏO™’j‡+sê¿öɳ÷•›èšCÓðÖÙ¬¤ûIÞfð§ÃI° Ýv„6÷Ž›ÁÒ"Ô?¹(ùnED¼ì{º´Ð\iŠ¡Ûè¶¢}/‡‡aÆŠ«²j!sÇ.N‰4Û£bdckp9¾×HfJüft;A“ €»?>`ÂqWì nZ€ B5Ïí\óÜôì|l5ø†$Í9)Ü2Ëß\øî †ý 6èÝd™¯9J?õ÷ê$i^ÊÖé(êè:UnPÄ‘;l-L92’Âã  =¾Êíî£&â¤=¿Èaþ™OËeÐD”¬ §°a\6R}‡Ó N¢’"›báöut¼4ž—¼ñV˜û¥îPúËIÐ\w'"ñDV—­Æ6Ô½ÃõOaW©Y*sµb³"ùÃjVP¸Ç}$dŽ„Q³©3$Œ§Î×QÅëa-ïEŸØøÃ†±f¡#Jß9‚ÿ<¸}T4†|e ?·g‰êÕÔxkN.¯ rqÊ©˜îK£ôûa±Â2K?JëЯv*1hÒóS.…·»:é³ý¾^wìAÜ‘‹Ñ"Ÿ[ØT”¦¼‘X¯™Æ˜ËÇ#„dUyȈŽnõ9^sAµ#lk,Qáµä·û\¦iŠRb7^†ùž/†h‘à36€Æ´ãX‹î}“²áýû­6CÉcÇi{«(±0"¾¬¬Çõ^žÈÉ„‹fÉŠ`µ¾í×–fÉ"4Õõ/!öŸFÏÔ°D1#fÙO;-À^yö”üF5Þþk‹)Å«ëéfçÞëÛÃæÃWÍ;s– Ô—a™œ¼§¥%ãõó+P†#·çÜ@$yáÕåÑÿðݤ=Qs:j„UÝë— `BÀ8v³Ý­Ä U;(Uõ0%1¡ÅÉ€ÍA«½Àè2D7Òæ4Rx ZA"#¯­â'¯ðHA îkBÓîy¥e“ãñYV 41- ûÀ½ë¡TI®G‘ý -¦s·<qýå‡'狼yÅgWj“µAãÐ9+ðþñx©¬ZÇ ‰ƒf‰«ªW2kßêÜÂõŠHJç ™{\¾Bb\qéŸý…HÂOδS¸ËÃÌ%¬aÝ—[!•ÏøfÆD˜”-"ò¬9€3=sø¸(ÙÜZy %“ ÿ"´ðNÎn$›DI}FOi§Ý´'o˜pGÃfÐã±;¢ú‹›«~M­UDÓùºte5ö&(p²ó_Ì+œì®í®aY˜‚°]%v$³îZ0½ÕyÞˆð%Ü>çBRÊ2²TpÑÓeâS0j'gè2 oðû\³4-èþ•sX£^¸M·Rƒ¸[D̬yÓós\ß8­gËÅF¿ÜÒ”o_†uÐ=SÿòÁ}cù F²fIºÖ6w§¬êô¸¹¡‰ZéiÅøX­L£M×z)>øY9–KÁö&{ŸN ÜOª"sï¬Ý¹Û® žáуJÅ0áì+À×`Úp«/øÖPÎ<äß"Ï@Îu·Ö7Ç›¶¯¹ùê¯b[ñ ™‹’dÛ¦-åF1×—Mh¤ó¼/°8ü¹–í5HWbÔPõÎðc#ÿc&MÂöÆuÁŠŸþM)ƒ¦£6 ®LÅ©C\iH)·Hqå+³©Ö§YcUçT1M5…è¾>À; ”vh/5i1 b¶{³KE×ÓÞ<\c{«‘Ã>šzWcQ<} ¨Íþ– ¶¡Ýdãpª½&¦à9PigØÒùŸ=ëÜ­-EŸ¸‚Nºðì=ì§JS:¬|Š!€X:p¾öàÇ¨Š¯Çñ—ë¿Àœ^s‘uôÚ^èbu}Ѹ1–Ì«6ªBªÛv˜-í!2IÑ:F…zÅ?µâ¤){@)º§‰Æ‹<ãbb|ôš…E§bÏx>DZ[Cð7UeÅs`Ì£¬b[z© Ç`s6ô½únª£fºr/y9·RÙ,&%Á3â¹=£pÅhd¢ßyÙA÷Õ%¢è—þ<¯±w¼©_œ¨ý:n¢nÌ6ñÇ‹Ðþ2²bxý¾\÷-Kð¯xîMYÐíȵ¸f¿GÅÿVøâX}Ô|ÞÄE—døÖ°ÓáXÈ/pã ©ôƒè’'»i&Ѩš-í6‘W)ÎíH9+{òá}!”6ËÚÖ®âÍ™AäU’ª±M~ÉVåC±âÃä½ÍôüZí¾ŒuuÐõ°á—f®OG<Žû×"ŠŽ[¢ú\?¦Ã5éÆã/¼UÉ¡é æë?$¶ =§–Æ]?¶ézĉQõHöh:#™+®•Unò¾®!Â+–VçcM¯ù¹O|¹ é—L)›[¸ôÙÑ*&iÖ)æ{Cä Cš°ØCÁŠÖðy$oYqåë¦ìGQ0ÁL2\jÕ$#ðʘ°"©m1£ŽäèœÑ˜9ó©A†• êbw"`p­eƒ!Ÿh=pœà²Õar™;ò©95O»î3EÞ<ÊŸµOrQÝÃSo ‰–§ «ï¶s§ÄHŒãÉ}f6ìOgŒ'±JýDøL¹>%}DkGÌ}½ÜÍfù´Mù?Sf„ÈDœ.á /¥"K§‰ø=ŽýbP,%.Vº;+.Äã8§Zoz!®Úñ‹'Ýí]ñœ=ÊÓKîDÔ£Rñé(Î' }\|^~±å¹ûZ9u€t*pè\ƒÔÅ'=<ì™Þû,»àÙî…Þç*{x{¯ I(ÞÊ#!QŸÈfZ -=•qÐóxàšs͡ѡG,‡?° gk<úBè^w/LÄ<(ÛI ¸ú.K‹zç?Cé`;µ Ë;eˆ:o¿ÑñR9˜Ý¢ë¦+£Þñg¡‹<³!Ï }(È‚ç7gFÉÏŸwšï‘ôÿ4ES¨SŸ]ˆoc–È‹< [–·„/{íêlK?¶ö8©€ç¬3ÅP½bqíDûRµÓ ØI£âe¾_æEj£—ÇÐß-çû-ôCÀPd“Äd²DV­§"œãaÏ12³bSâ¥W¼E‹8ŸÎB#EwoU=íœçÜ–]`gE.#åfb ›Ä†Å·KêôRGAXoæk¦.5ªÖ|Q­l›³ÃVó.èµý£øúþ1Ý¿Ad¼‡ú •ÇlÝΩÿ²#›;¼Ja¨ ÊE—&Ç:èÀÏ@Ø´u ˜¤G0Üä§–e©ÌÍÖkÙä¶÷]ì±²’;fŽ£ü&±t#Ëä6B š T·I÷ûñÒAi®ušš)žç`¼¯•Å–‰\œ¯]¸*ÃÍhúVYÑOB\W“³8•õ<š„àÃ<ÝÅFEš£§œDL7ÂF§¶‘Cs½$äbBu‹Q±ß¿nJ¹1·AÝ>¡Â· EÄ„ï8è&:î^b0øuüü8ÓÔÖ¸¾óÀJÆ€O8ü0ÀMŸtºâ£yuMg}&‰ 8#éôǾ+Xžù+ X¶¹IýѽõüHBÑÈ€Íküxˆ x!èY¸ðJ­u ¹ÐÞËš!ÿ‚sFmp>L8¹8À%n±W ö¬D¿»¬±×êÒ“Àã,@—˜XUÓLâQbͪ4·ö->)®OY©úŸƒ³1°™gmá?éè4ÔŽôd‡¬Èÿ­]‚\[óÙAÀ{šâã §º©+b†d0Õ(àm_Â~®ŸEgib³„¼K†%¬ºÍý´9ÒAº¯Š‰ÓgÊ@iæÉðà[RS1h¨©¼ŸTJYH©›¶§ånxž4ª¢­O]Åä’ßšîá,m´ûp†¡I_DŸ¡c=¸µˆõMËŸ¥8Qð/&#N5H’ß¿QsT6²ªUéŒWYV<ç;çSb]ÖUEâOL,gÀ(È‹‰8³¦ ¯~)Œ…ÆÆ(ƒÄÏHmÕ¶êpâ&)eøãÕ5 j²Hìû©‘Þ¹dV%â$â–sÁßëôciDËçmî@R2Vlî˾>Ü Ë™"´£ïšGaùÆžeÞZÐBmI´iPÔc7aŸ†¯Î¥¡7b?Vi AÛRbÄ$ñŽ£úcQrÓÿ6Ñšµi­äÑ䥑¼qÎ ‘Θ;æ0u€‰%½x‚Ñö¤Û½À&`[0ô¯1¹> p ¦r[Yyë‰ãK?•¤ŸßXjšñ1‹7½–É8ߑ泦ÝB²ï£õ¥ß–ÁíÕÌz˜‹ÌLwAL5ªjÈf±°ø5"æˆêmÌC:ì!Í)ô> æÿù6!­F§®îJ'ò©–¶q@ÁØËMòù¦°Ï˜oÙ$÷Y¤$) £v4ø#%Ïeqñ"Õu»08Î[HÍë\Áâ¤ã¤O¬g»eÉÊRe_œýÃ}´Ox—ãf5Mÿ¡©„«~ÚñL¶úlu“./)Œ]ÿŠE«îk‚—Êã\îÿhðè¯)Voô uOLOýÉ”ÀBTVv·÷ÐJÔí$'ëHOÕ:…Ä3Qám¾ "ìm=ó7ýî+ñÃð.±ÊÄQáûå=S¢‡0‚°çýŠ8È“°ü{w†Ë’幨Õq‘º}·.ÌØž,o;F̾4eN&TéÏëÕ–í!iƒ¼fv;€ _‰pN‰6©î@"d‚Éreòœø­íè ³…7‘->_+‚hnŠZz¹€22WJB 0Á†‹_=l­5»)6‘jµ&3]Ò+ €€À«Ãm÷É ³§soÕßEHŒbÐò-°Rœ9}¸Ø2‰lÑL±tÚð~ës²s´R~RYy"<ˆP^­nïRp[ûƒd:Á3zåÿÅôbT¾ˆm¨ {=ì’eša]÷ÅÊ%ãÊì$þEDeØ>hÎ^ýio^®Q«Õ’üžXLkÈ‚ˆv”|ùn×ué»N€v|ìs%ôˆÐt"ijU¤â®Ê=Ü`3®:<þ ¸‘Ñ™Jh¡÷Žn<1Z=8A¼dt!gbA#_Jp€áݰåôõ–¾ìÝÙ8ŽE«¿¦b[¡AÃÚæø·DW Ø€Y7MϪ¡úYŠ:.û1°¬dRn §‚àmª¦|YF IöLôK|׎ÄV_JenÛÙJØ­IÔ/Y‘Pgð œ&+&GªÜâŸÁ° ><ÜWãÃþîŒ0>¬»ØÅ›l?°2Dk¼ÂlŠÖáºÃ1­:÷ å}¢bbS\5†BH5k´³H[À«¸§»ÅVC}7Í`A@—oûà%ÂÑ—€À¤,0 »?¾P¨£e‚£¢3Ô?\¡bºßváT‹\TPt0¡¤Œà¹ø |áåK7´Œm¯¹/ÁDImõIVNÈc-o"@Ï[žž`Çå~AsתªØD´¥Äî,ªy”µŠ$#9óü×q‘I£‹ºZn,gïUÊ<ïô–Eøî•=°|„ƒ Âø·²ú²ÓÚ¸10Óñ˜ìîÚJÂA~1ˆ‰¥v-ꪄÒ5 qfJôŸ‰ýýf“êé%±¾ˆÄÓµkhþÖ»Ö*ÉP3[&œ²O-3 W "wî÷ÖiŤØÎ×­,Þwtd,»¡Í⸷Ùó¿òLÙ5nÇ@AØ/TZñÉÎîÂZÔI5¹kÖìƒÙÅÿâFc—ŒÎПœ'éq1-Ýâ·å…-Lçyw4•ЏÐ;ÿW‰w¦lÒ'{5‹º‚mæû•sðëç0n×ûűv¥íÐ( -ò&F‚×^Þ6 8ÄÇñÂùF’²¡™>›g¶nZf¼¶Â¯hð ¢|ju«!K3™D!*â«×¤+)ʯd$¶ú¥•IXðNÿ‚Ÿ³ªÓçÒÖtSÁÿ…,…™hsÉyûr¯QFÎceÚ»‡QðÔÜX ks-§×1« Š$§dvì‹û¢¦?}ZK¼âLS'„Ö1sÑÊïÁ]]{¥DN ÷0æ žŽ@ù”¨Z1úež”6š§ù • ‰A8HBdü:X@Í€úšjwS”£Îx –Éêg97Ì:•TÎ84Ïaì0’Ç«4ÆmLì§9`œ:j3'|×G®',šÔî@-æàÉå…çþ˜óªî“Pm“[IÀLa¶›© h`Ü“žÇ‡7b;“KÂD‡Ï,O¶ÇÂ@ï«Ö|¬^nQUé~´:º„”Î…: k 9’:RK¹ð3ãAª“/Ã_›!Ñ\q–ãAWxäfó­[Ÿ Ì{f5%yI׿1Û1zjýR½TžÞ´—0zÆZ<Ü[AùµCëB*‰kü5 hØáÁs|Süq_q|Ø–ùXbG|ÝŽF™Ç¿0˜Ix˜o—@¦b•3«GÔ¿…ÿ¦#Zµ1µSyj5a듽Ò'g—¦P,ï_Lô(oIêjwô•\GÈd…é3ØúÄBW—Bšv¿v¸wB %'oCõ±[¨ªº•Û’kAŒ»’¿æ‰œ—Ê4zÝ~¾Tôñý¨Æ—ø_™LKTü€J<‰«Tc@šS¿ÙÆD"#Dˆ-I’ú2û¥E'ÅSûš€-¼~×(]ÇAéKfµÎ®¡F60û?Ëë:‚ )o–8Ηªf.}‰Ý_>0¨#dÉ×\èrú{1Açôx^Wœ¾•*¸¯{{j¨ <™móóˆvÃÉg•ýÌÏåSìK¨pn'€ïíÉùSìÔààcUÙ²ø‹ÐU§ƒ®N饷¯ëdðêýÆK­Hr Ö¥³zŽ(þº)Òû]¼?kç rIáD-Ð6Y¾Ñ_Á~ƒÎ>i¢û‹ø 3U k“$0žàP¬czÉQŠm™È.ߥԭ%&°z*#R 3ð¤n"Ô+Û[ËѦ}ÀØçÕÏ`(Á(Ñõn€-C|3üÚÛÄ;=Q7§ |G¸+GÚ|´«Ù´B-ö#¸ÙQÔö_Bcˆƒ-??Ugxºî²„+…ã_ò=Gÿ5½0Ђ¬¨Ü"}>ËÕ˜“ä•Ä—Ã(l=CH›ã™*†i<a´\ËPÆYU9ÒeÖ»p4Çã4ur‡š™ÖéßÓTYk`€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n021004l.pfb0000644000076500001440000012727107056046553016420 0ustar fnevgenyusers€i%!PS-AdobeFont-1.0: NimbusRomNo9L-Medi 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Roman No9 L Medium) readonly def /FamilyName (Nimbus Roman No9 L) readonly def /Weight (Bold) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusRomNo9L-Medi def /PaintType 0 def /WMode 0 def /FontBBox {-168 -341 1000 960} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020933 def currentdict end currentfile eexec €(¦é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>m±®™$Jinò`¨ãh§‘f$:Yº<œ ×±Œ¸ïkx\M§ y’~þ±r0ÕègZb ùÌ%f%;ÛkÖÆ¹ GTN}fRñ´ÜÚázš‡½ë‚‡—›O lÓ¼¸2í_¶Éñ‘†ºÍŸœòÛ½¬ûºQ)@dSX%Pd©@®Ëe‹YÛ~ÍÕ9Ì+¿2ã˜ÆÖwA-›"ˆ¤Í¡™Îú½nL³Zø Å’Ñhí¡A«ºIíòfW”#^Ëg·0wÃ4‰”ö·ø=ôlÓ]IýÆ"Óm¦‹Á^8Ú&›ˆ“œ1yì´)"ünsãmuÃ4/ˆ©³½¶„¸2—ïÿa˜Å Ö´¸%‹rOÈlܱGÆêÂ@Íö³ÜaýÒäo§ <]»0dÄQ´¼êÊоÞ(zOhY y“·úÜóýËx]˜?Cå~æ~N—=9Äø/wcÓñðçg" IŹWƒgµÃ’Ä™Aevãsj1µ²é8-ì…’Þkvúp¸‰U¹XgtË—dW„Î;3ÿ%_ÂåQÌqC6CW1‘‘ò1Å ùï4/hVv´ø;ˆÛr €,ㄬŸI‚K÷¦Sg K€§øÒ!Û¢JÌV;q#رzlÖ¼¿ÒÝ­7Ø©'N5^¼¿ÎáüůcŽ9Äú­à˜7S»W°.³©äø:d×a䛨S³áÒs§–_)Ó}`YîY[ƒÆ쥅þί±ì>jf7ýÒŽ—yð»08)å¯!HTó$ȵÌP}ådoÏûç4¥¿ÃbŒ®¥ŠO:)éu¬BŒ3û.Àuvóbåÿf3Ç$K5Tˆ/…ªŽ#Ëÿ¹«°£Ñ‰¶áRnÂÖômóbÊwÆ’É7V´‚•?-²†ú-å ½4O°ÈôœDN¦^åeÑtŠ0.Ä׺tm”‡›݉ÔO›¹FDÃá§TØò£)ÔG;,•G`æžj¡©Œ:¸¶z¤:³eÈû©`͵ía+1ÖS–:Hí¿±›ËŽøïñ…÷l’ÃÈIN‹a æL0–ÇTçV*ž¦þÊñÌ¡”ÍCmÞ-õLOÃVŽIGLw½…?qv'Їgò ;kSÕg¢ ô$Ñiy³Î‡À : ´ØË)HÕ«VòJHê ²3$)Éfš¢(BWHØâã0b,Ò¬WÆ.ÎöŠ*:QÆAÖGëç’» ÷Ÿ­ a=Ú @VäéÏý’8`}£tøjãV‰í>‡%¨s×½ÏZã:ÈÁ²×AÜÃ÷oEzå7Üø5Z»¢!ÑWAZ˸fóŠâ*M¾Æáè§’´!g³ãã¢"§r£jGXˆ5K má¹þ‘û¨ìÐ^Ò" ~YauÊ”²[ˆ¶¨Ylñõ@ýð5š—ŽìP­ÂÇjœ‰ïØ«<ö<•q­oJ{ØÊ’b)ŸÆRǃLT CH)Ô aÉcDüÄ@…ßN÷oýGÄ}ðù¡!ù>þ&/‰Œó+¯$àòñµm ÷ÏáÆ %Å~K‚U¹ <ÒQÍËŠüãõ&Øó(¨3¼CûQ{.ÍÁo¸d¡±Ê6°V¢|Ö§öU@dì’,µxpÙŽ’¾Æ|Ÿ»¦]⼄K!sfàߦùÚbq3ìgÎícw£/m]øÔ__ }¯üú;àT§Ù˜Àö‘ÿÀîEa(-z|D¶ÜU]'ƒfkµŠÄaaoiœáÕDl\{q½ÿÐ9’dt3å…Î1vd›Ly_6•0Á™EF­ëïÒQ‘:Ž/Rõs@¤a§è¨@NEÉ2#xecK]¢á¼`©§#ñ9F»Ö @5?³„ÆueGU‹Ñ¦}îÉÆö>C´>âw(æGŒí¤Ç¹çªl£Z`¹èÐÔxB¶Ãdn&¥ˆfÙºõ-2¹qÈg¶Vxcù?Xiв¤ç1›mGõ ±Õ'k¿¶^wõÊeëÏÊh×UÊҖ's¬¬ŒTÆ'õçvÏZ¦­=Þô. Po¬¡:­fïmkÜQÊ«JÝx–,ü< Y§Œ4ÉjÈX':?”©%ûPþ¬ ]F°*}£–.„r‘8ò4œ‘ï='Ýqûáp:ÜÜV@«áh0ˆ™l­ˆ‡÷â7à@–íD”!å2Æ`LœàŒÛí1ü ×5ˆÝÆcâ­.k·²”7jž¬{ˆqš³Ž>LRD‚ßá å­†F‘Ÿ+ó¯fcØ(3‚ ݧ‚y–Ç€µ¹ò¼”(­±…ŽÍÛzìf¦cí~ü¶V-¯€È`{¬¿OÕSä· ®lŒv <_ÛçƒÛµÓÉ÷èö¬e&fÃqöH8åò‡Pû®9à{Pb§¤þ–üÍM¤§#£ÿìeÔ˜¹ŠÌ.“±Uu ëüc="÷KMÅÑÀ]{‘8^õ‚v»Zxs`RÎΈ Tàëé÷ÈFãj²ëj*¢Þo9ÍY‘0I- ¦„-g¨(2º"RlG0f#`%YÅ–¹ÿ®rùBI‚ÂS%çl%YfãÆ‚¥7[µöËV'¿qI9BB9ÆñÚÞ5OpnÔïÓsR’^Þ]?,>lKløôö?–Žê{jm3ö µ7Ôä y–Æ<7‘&fBz›}¯º8mæDkX_2îèÃ.“²°©õÃ7»Å²SƒY[(IƒÅô¼…BjL$‡ÊYÀ®«›÷~J»ìƒç„„Á®œ*íB‰Ù˜ “ÛÐ 2¹Šï?_f‘ŠCÒù0_ܤ!Ic=ô°‰ö²Ç›½¬«páÿ ‡¯¾ŒÊCòm¿¯N@aúêOkEæ:åI„Û`c]|î¿D§7fb@òß ·¬$é¨M=kcY¦»ë“’î@¾xáºØïĵœ;½Qäq‘Ûa–P~ewj½/Ž›«ïW÷~ôløÀþ¼…œ±º²BÞåªjZÐ8—ì¿êJgzC(Còë*^Ø™»ß{8oõÚ›ÛOj˜Yt•…&7/"÷/s7qu4–û ù˜(ÓÏ7R­åÏü[¹•9|ÂQ !WYz(ÛÌ:Mhbð˜Š"îѼŒ vÜÙÜ(Ú•<jzb[¾Ì¼©½úîYä&å¾ËuF°;=yη«éb@PÔßÚ%Io|˜‹’n_À€¹ýž….ÊOy§R!Ò£w*Ý­¡ÑʨºIasÄÔƒS‘UX„ïªx¡¢­ÿ¦„W„(¯^Ýçf+úSž[ÙWx˜zÑlh±UªÔr¤ãt\»ËÞ0ýÏ€sÝšž@0bÁŽß«Ç©žãýç†Ñm8sèÙ¦,YÊS9O?²ÃXKˆ9ëÉl¯bdð[”Í‚SØéÈ?„XmºE{íòèV7s˜»yûäW‘’˜½ñ1æ\‘€fQ®™¨‹ÌPÁºFÐÂëge%ŸU£@éõz[°ùO½Sì˜AÂIzùkïDi}E·ãv«ñ{·°4Rvyˆ…™nJm„UýÁ?/-ÛRþ¢m½rÁµ;ä'½ùÔ+k.ãhžHNªÚ¯ô „eÒæ`¦˜EÁüÄkù*0m}ÕŽð*|O]«yZ%¢»F-!N 죥$””Dî{Iø¯¹ÙÑ`¹ÛÛò²ç¶ôwì ¥Í›’l<šø„S“ysaº@ÿêqçÏ!·G™/¼2m‘+í«'$“ˆ 2«0'Apfž‡f‰®á…EgYÍ6Īb͆~qeêp´‰bÚŸ3Jû¼ª™”éîiÂT3ÌJBöG"_m•Ie *{ FϬïÀá…èdV¹“ÿI “¢fr¡$§ Í)R"ÊÈîq‚ì*·‹™*m÷%[F`FŽ ±b õv&Û_+Ĩ=úÒt—5ݨú,ÉqB—³$hùܳn\î÷¬»©šÚ XçI‡xÝXæG‘IðK³ º`Ä3›']ãGN ‰'š‹å^"Cê lµ¾2äÙ.ÒBò¡6B¿Gu¡«í3µ—ñÕ+ä)™ïfÕ;8¨[ «¢‰å¯?LºyJbm2™þˆütš!‹K§·Ê“ž™µb‚Tµþm°3ÛB÷>›Õ+÷—âHÆoµ;J!¹U}Aš0<¥H«<ÊL®¶ù5¬ª¬t 3qjG<ïª4̤ê¶Nß-2yš¬î¤ûûA•yQ*Õ ÉZT—0 Y4Fâ ­¿nyEÉ‹„pJ\xä!1-ï^²j¡ÌÙ§cÕuª.»‘Ÿ¥€\á×£˜OŸ¿,ÊON„)¦bï3¨!3PR´>B¨ªíÞÔüPpȉTuT—T¥œ[¬•à0fT¢–Ø›¸ª_Aú⹨[/fþ&´ˆ'[«– rxñD[÷=dc"êõÜÙ¼b~}X¥ý‰ñ ˆ=ªï¡²vª·*º.çÔCv/Èâ­^¦Æ|´EZôà d=é Z³Ï×Y®ì’«ÓõgØ¢Í[îÆüÝKN :W ß³8¬Wy®ö8£DË`4£;4æ(òg;­mo*á¯ÅÐÇȶy( àôƒ¦{Pãl¶ÍŸ /²1ºÓÁ‰™9ãàî6/6Žœhh\ÙüZÈ)€<'u¥¹6"šAòQÖ@±b&¹¡9ÍŸ•S ®Þ¬à°·í½›,°d½Ç:ѨkÎ’<ÃêP¸”“’â €ZÆ=m¡åãÜzhn$Ú)Ä0X]÷LjqšaÐ6$X'Ê[Ôó»9îô½xxʰߟ¨DZ|Y¸¦ô[4ÅÙã£î©}Ct¦10ôìLÖNgÕl/¯^Ÿïr½\ôc†Ö—«ì?Ù7 AÃjáä—ßnE~-Zuàæ¬ü5üBÚD Y9 28{¸&x1•Ao¾êÇòÆuì2b3ŒÑÇv?q¸§¬ì ~6Ϥž¦Nj0&á³éO/žqZâÀ˜ Áf·ÛH…ÿ ]56¨BÔÜl郯ðïü¶PidD‡·†¦*¥”{¦‡éT–¹ÏI3"c•¹ze¿j6ôfJ=éC) µh,|5*HÈL|¹V…?DýõY#e¤Q0\ŸBÓ'^W÷“I¡ç–“s®Ä5SJÜr–#åªe=ï 8 oßÿ¹n<ˆ “ÐDµG—'”ýC±keUQeµøEL :†ÑHà¾ü±ßVÒévÌâ×üצ‰óÍè2õÁC„O2PkAõö\\ÈìÊíÏaú_êÜ<ÙÃæ—êÄ'Î×I¸ýýÞ$5Œr½-9‹ãÃãÏg¼_èVKùŽ.Ô¤ØðÐÏ3µUVûÖÑ:!‘;µñxËŒjbC»ç|½3.µv@Ê>:èk‚p>*ÝlÒ ¸.C–õáŸ:9î"KwÁEÔˆW…ÔÑð}WÒqß#4… ÇCv(ñð‘û7p÷]h·| 4ÃBÑÙ…gù¦± EòQr.lë¦èô³‹Äu*ºè1oàzD?Ñr¼Û³é(wqÓP¾÷ ì¶z©þ äxš!3C½õ‡áÃrcÀt[¦ÚÔà-ªòkœ"(eŒi$TÞó} »GZÍÚ‡ˆPK ,&á äS”i_“ši¦Òãì8–Û˺SÑ/·<ÂlÜ£ÀÝ.E.ø,LFè74‚¬½æ$<Ì`Iëõ“A»ÏÈ;0£i¾Ú² èÀbB²@[˜¦ù˜ú¸·pjº—@2£>‚Ÿ›K[›¶pô ¿Ì´¬õç‹‚ÕL×EëK=‰…"𸉄â0V5ÊîËYd©Û—[ÙÇ­]–nóWB¹^h™ûi¥Θ„Dvz¦‰!í¤‚BÎóÛð€1‘¬gßšß®yîé ’G:×ñ,—XqÒÔG>+Ñf}æx¡A‚ý[2Q—ð‹.ÖÚ;à}oÖõÝq2 Sâ³€msQ¤§Â¿wÞ †y®ÕŒ+&4êLãjI#ÑïâíÉwºVT³+Äù2aËéK‡ #]Äï'+þ¸C»²…~cÏL©õyO«ºÔe`ŠÅÙ Š¿|ì.)b+íTdt°{ÍZQжTåêäjõõñ™š&—eÀ< <¾æ$üo4;笅^œ~Ö+È.q'#ßóO•,VZ®‘?üæpUÀWËë ë©û;5´ ‰}Ù`7ˆÎ¬›—M>d¨T²³· nò†Ô× ’!Î1½uõˤ´.Ã{bÊÁÆBY´-ºÉXfSŠ«9’åïæx§QêÚÐ_ÚŠzk°Ë¥ÖCFÈ„1Cʵ:‰Ô +÷bL%àõmŠê¨90¾MBa‘Icã¹|‹°ŒÜúg}‰€ªÕþG:?×™}ñ`ë‡Ëïåj.Ú ø÷ ˜ûÙ§fâZ8ö/ÞI° ¹R¨)ÉÌdîlv¢á¥$çcÈ4¡ô—«èP°¯c¥*‹µ úàÔðPfQn€[ ê=˱ß_‹'Û”G@ÛR.Nø¥ð"ƒ}r ´ÃÜšwVl¼Ö8µh[ÄO÷•Ÿ&ŒñüÚ’ÁJ“@·žÁä÷Zâ÷™ßÿ*Aù¤…¼Ü`]vGq‡ß޹"o,·É`*ÁêG`ã’LþÕœk¨À}õ4òxLŽéÅPœNB3i(r,z>v[7Æ òã¹q" A·RIÌŠR-oæšÜ.EÝ;ðþ­jw‘Z…‡%P8TjŠ«u¡Áåþ“?ªò;7L76E©Î…àÚ÷¥Dý  frÜ{2SýqØMîj“/oº®›ªQ{ þf] ¬ý¤(?YšKi©¼LD¼Z»Lì ^„™Ø¤ÈGì⨔ßrâ—ô7¤Âi†Igž¡Êœ€ØQ†Õ6ˆ—Ó­¨µµ’U¥ÝèÉlQØiŸ–Úåe[ÏßòÙa •l§v ˆ»E®ëΊÑ©cpÓ¸\A¦[ÙF’¢(7Éû~Ý­Õ·Æ+Ç%/ „|m X“âÑÆ­DKûÛ+°ú5*ˆéX ~Î!?GM:h 2 xÖÀ€^]‡¼*7ÏzÐKóÊ›ßþ–Tz¸ƒªx›c[¬)Yßm’¢®ìlã-"z•7®ôž²ƒj—\Q–—bPE%¸Úm›¬R˜¡t·Nd¸ƒŠèoÿ7ÆhysŸ~„9öÛ±J›ÈÔ44FCøOѧ¯€¹¯Ïˆ×.#?-î×Ö§ÞÛtâð#Ï&Tw‘Éiñ#åmäÑŒÜ5#ä!عÕ„çhåL²ÊþúÑÍç×á:Üõ¡¾R%ûá,::œ:BkÇX´Ðá¬ê O%_—E‚ŠÆ ¥™ÕÓ¥¯!üºM«dÒüÿ<ås`xVÂÒjj¡~9L­0y¨ó[ û:-0ûï´üW)IÝ;ùñOaÀÒ Xeâë‘O)`±½lû[H‘ÚÑ/P»!Ÿ´Ãa j ‹ÐgÈnâÎK( jLIm¸,;a……›!/~*ç¿>EÙLDÍ—`6Ár‹Æ[Í»£}D+ÏpË’öh¥ê¢C¯'„!>a>röÌ¥ëe†.vÛZ/y e®ËÈåiJ]û˜—”ÁÌìntY>lx*}G!£+ðyboN·ËÊ Øú?ŵ)ϬÏíÏè7ÊHö’Ê ÄÍ–(ï±:pK[T€{ÚÁhtÑN꟠‰÷2 ›¢”hLù§0êìÜ0:ì úA7¤—ãùµ~Äq³¸í΄ó2ûP]³£Ý“âÕ[wÐb4”‹c‹n`ÖÒ€]­©"w‚0âÕëdg¥Ýzfï[ÐÌgú×ð=«³ÉE¸/¼Mg‘ÿª#V?”¿‘}dù“¸‚¶iÖ$òCÙàµB^j¶Àr³¬—ÒŸ_‚‹Ý6à;³2nånºúÔñ âŽú v,M8c–Éo휰Ö|¦ÿ„â/P¤ÃÜ‚:ªÊ¹<¸Œ±ß ‹ë,úÉßm ›¥ Uø4)0§Q“hþc¦Œuª¨óS]ƒS‚|ÍÛ3¼UZ˦pB ãTî¥.r­; âs‹·½-aŽë•[¨Ãè\‰8ãØA©ØùýrîîôÝ]–û[¯Ù°jo}!æ>`¢Çö œj#}-ì¨x`µˆçCSO^@•nÂ÷Vy0ìýíè˜<ËûvTÌ~øÖªÇ¬1›„O/“‰ë[T¿Öqž¼5‡RO0Gukü- _«dºR{J2pã@nÿB¤ßÓwBý /:oýW—‡ÑШl¹yi«°7ÇP«GüˬÍ(’ðϱcˆ=%‚’ø_šóêxá¼a+SávTGD@K©ô4)Šî휄DGQWXkÞ.èÅåÆ!š¶Ë:캣2ÂC±¤QÅ Hs¶¯sñGþñÖª‘” @¶Õ¨¿¼¤6x®ÁC¯ÈQ†€Ü\Öÿ³°m#Ô¬½ŒÉô$?l¾L‘²-£ŠÅî!4±RË¥Û:Ȳ]€4Ï,›` ¯>,ïTÜh>)ÚáJÓ¤·Ñ%æ’TN'ùR@7ð'U¯¬†ÜÏÆVÍÁé—©·Eö&²  ‚(ùôñ۔˦ì²𠈻Kz¬¡à„&IoheíJÈ|ƒ„)Ç ïzdRxüÝ*·©B·@'_Ïû[ý@CJ[[½Rõªž@8އÌCšÕ ]ÒD%ñw,œ–2¥ÿ½—Ꜧ{ë´/d-ÙŠÇ“œ`ï:ïÃÀ>cq£DXÙ”ÓRk/Tç4YO èpÙÏhÇr!HDÃsgÓR&4‡NÝ6ûíû»!çÉs²ŠlÔ1„Ð+{È®¥jÓQ]ážçÈ»«¢¸–9–¬ŠÛp'n§ò4HÑ#Ý¡¢$²“J›—o,é@í"©è;|…\œµ5!ÇË\b' t¿êÄð§e¿ÇÓÒÝhÎæ4 FÒÎJVc]á/å#ÐB¾ÎV“¿A´M‰C0#yYšy;.`zK÷v/U .ËFÛ¹âqqx´ôü×* n†ºÓÂ\&){‚çýDøGMŠû n?G­÷›“7©šÐØA„·^×ywÛ o,¢MW[®B4<µ®ÿ ¶Òâs‰'P¿s&·®‘¥ÝháHCµuĪǓ)ò炇 õÀè Áy8ß0žÎÙæ/é ê[æw¡L1pxÓ¬qN#·VÓƒ y®a@кPexDˆZ–kx€¬üõÝF¥›D÷r±í˜¼ ˆRÿ¯ØÎ(¤û–´Ì˜ZqæzRÆ&÷“ à »Á†e¯ ^Ý@²²Yä2Ã$êÚ±ê-éôÜ¢=rÝ ¡h°<衹CZ¯GÇešÊX µˆÓèÜÉÄ<¥ ìdtÑiV<&ÔçÔg²‡ïbñaË`Ž=Dš¬¤É\aÁîtÿo®•\WW'fVeÈyX,†þ1™ò7³:Á  %™‰c(û‘4`heOºèäÓôLE¥yɵê£.kë#{ÿ6=lXˆ)¾]&Ò¡Îõ™Kr3üBÿ”BÓ¸‡FËQÃ&÷Ô†Ÿ[ü*ÇÛ ÙGÇqN“r¶¬ÇyDÇy§JóµÌ¯BÐ8ж£Ÿ^Ÿ«tÌbt‚!@˜ƒ0³óÙœca øŽË6uÇó‚zó´hy.Í"І÷èpa0ê¡w£ C‘ÀúZü¼“Î6-©›|tŽŒ"Æ4®l^† ®þ”ÇîR/§/ã“=¼8÷ä³ÿŤ!î\ W¹óbøN¶J{ŒsÇX|‘ˆ*Ñ‚–¢ÙgÊ’~÷ØSÔéÄGÇš2Ø©û-Ò ÌÁÁ–ñ/Š|e‡åFÆä3¥Å‘ïõT²~ôÛ`gjÒiú+Gcfûé£]®>Ñiþòºëü;d°‘eþ¨z„=b-2´•K¼dŽS24jÛ,9¤%7ˆ˜Tô§‘;S¢[Hø„P®[ÚÓ¸ˉ#‚*ì6 …trZÀÍY¿¦C}¢·$mNîÿ×±ý"3ž{ÖO7µNW;[»îsî ­¦‹”ÊÀ£¼µYœÓ+2s5¹™Ðå]¤l3ñ§®²w¾ŸI.MCIô”øsLäüÝßR¢ Âì¶&IÄL“ýéÐòà»™Ì/ê¯èµj861F7¸àJC©ŸûWÒo ˆðû‹)Ôäë]‹spÒȧ<¼Ú=“ ¾µ4>ˆ Å› äO‹(üÊÙº¯FœA:6èunFqHæš3¸:„tŽ=&‘ÿæ¦àƒ½ÛJ˜ŒƒL]—÷ŸL¿ÞGêd©|Õ`uœÊ²#²ŽH«ËÊÈ™4=a™{6Œ:•0^î_Ñ÷ì„üC²aᲩËíR×; âÜsAµzÿýû_ÝÊÅbÙ|PÑõ¨A Tü*ÅÁ„ Úpã(G³Î[o¦²Û¹¾Ÿ ½6þ™ÙøÆ½¤?ϯ±†^VõGA/" - [œ5iN«øÖ|…uÒ>ßñ‚玠ŠDGn¢Þ~zE{•Gò=µÄf•köÂûu„aØGt/rn…§†IZªÉ+ÀatsÊH¦½s”¿ÇÐm?Íßøz93km/Ÿ ·¯ç98x㨠3LõE¼ñD©ÛY/æA¸6›© h`Ü“žàŸèENº{©´šÅ™,%(™ýÅ‹×8¡åN)ö›¢oµçîéšá#› “/׊5ƒ:»=¦•÷ˆ*óœ(@¢ó0wæ1 Z#µµƒ«£ó¿ÜIˆ)"Ý¥{652ßá¹e•O†Ï¸”TÙÏ †M?N”ƒuý\LÞ¡lUôÁÊýŽˆ/Î@yQ¤HPm˜ÚüQxòtó¥¯&fÌñS1K¨–ªœ&³ó½˜œ?Øt«O -¶@$léƒÄÿý KŽÄ ‹5è®ü‹o<õu˜Éç"· Åœ]5jfa¬Õ¯.|hŠñô< G:NAJÈee°[ê>‰£kÕÒ…ÿs±÷®LjN¤©lim,õöÞ†‹GC—ýCèDpʬ)1ÂÓY…ÿÂ.ÿ W²¡<Ì‹“ÿû…ƒ¹›†ït‡Æx‡§NA¾°rbGÍz´m¢™2'‚ðc¢¸A(}ŽÝå’ö#Â-ßðÁ£þ€{9!ìzV=æ õb¥³šîÆ<ÓSáÑ‘Ž†Ú¬¸`Pºrô@çØÏxIa*jÌ¥øS(…\ýÅ[ÙF~])ÁôDÎMâlv¶g vi?¼’†7?‘œ¼! Uaêä Þ^^“ù—J 7à ²ì_Qæ§d9ª'¿3äeÊÝmÏg 8øtד{ð¤5ÌÁ¼všÚ§\UK4»¡mÐZî²]=†:nº€Í×D>üîÖj ;Ïí’@+7Ö $²–>ÜùÐFh«°òõ1\¯Â>ÔùË͵€ºÔôy8bý·W_o\ìôÞ*âyc…rÞ­¥|\$jäçØçÙ#M l‚i¡WcÚeÕm°t™B®·IëR+°Kõ£Ÿï-|ƒ§T¦i0`IÚfÁ©o¤œ1Þîz¶¾'<ïÆß+È÷ªùøÃ}1!—$µ!,Éã%ãÈNý&þd¡±Ê6°V«¦M‡)z#*6`³ª='zC…³ñ›eÝ•¦ª…ѧ›©…³ñá…d+*— nç)7j[·n_át0Ý@f~¨œK)f÷/Ú _E8½ñ$‰Rî·=}~r§ušØC=]ü$ AR)jŠõæË[A<ÐBð©øÝ|¾¾•$Ý/äŠH`—À²õÌ‚è¸Úx3 Ïˆ®£ì®gGÁ æ SSî[Z—š“ò@Á‘/´dšVÞ;§GÆÙÿ'H…c"èQßßÀ—ñëƒ^q¸%‘ðÆöªü硟šÍÈg¨¸ZÛzr’ªØ[A†èe bÝܱ»%ÆÙ#øª•3Þêç@¤Á2ñðP|Š2$+o/Xu0Ñ"£¼{„ÙCó& „ åNÌ`Gˆ_AÝh‘0¼V“£¤Cœ;ð¼jÉqÃ@FX€Ò&o!'6×€×bŸã'XÇ…Rå±·ôÁdرt° iµ ´½õ–|‹Hßß.yÔk0ˆˆ’†6g:N°KAñ¿4GK\2ëîØ&ÀºÒíàyØûý±uñnåÂ+¾á§©|ªnäÚ öŒÉß±'èlÈsíÎfI÷° ]üæÁ2ïÃ_"\Ä‚ºSÍxz:¤dáDyÞž¿¹Œ<àñYÓ)›>zŽ'1lq\ûåa Ù \ÿìŽGM4HÐÖ¡!H1ÀDZý~¢Ó4,Àdçceó=SGTƒU‹ÌÝ9“Wêž•ñE},ýÝïšÂ¶gáJd)è¶_ô´ß4#=¦T­óÁhpñØ`\Lòm×¼OMÈçh;<XC‰V)ÁjF"R’8e]/9:ÎP©Žå<&],ó`[ñÝŠ#­ÐN;¾!lJ×…ùi¶$HÔ ß+#¥d,ƒaÓ3aÕÖË'ùúWîÀàäiuDõMÒ 5Ñ\'Ù"Çù§„lî€ eâCËM>o°üÿxlb4û˜Û’ÛzõÁ–Kê6/U¤oIZÕDþ¼ÑPhÊ˃̾møX™ ˆB“½ëçÊ6ù¿“Ö.ÞêØ<³·¼z=qXŠ jì>ZÍjUí(ú{´†^žZ5ÕC©s’]o´o°Q¾*Ðlˆp]YçÁQ‰IⵦÙ×»I qÅ9ÖÖ§@’§©¨¤;sõ<͘l¸0›GUy¤ÉKç;eŸJŠŠŠërÑ‘ell=… žÌZ ¬Ì,?9Ò’KJ£ø‚Š;…KßÄIíËvâí€Z›9>‚QõšÅ‘àæMÖ%ïÊ>‰§ú… Á¦nb{û}Q0üš‹Q»E½&ðAàîMŒÁŒ1\Ò9<ÂNÔ‹ Úyx0µÜuðÆ4ÄÞƒþÿ…”[5•es¶~Þ@*UéÍ€À–OÃÊ5+¹xœ±.ý)6Áµ«Ö!í@*F}ÞÀÌÀv „õ§Y¢ÿ¾PýÄ}u^£¤Ÿ §ÍS{ò¦{Z¼ÙèssyúÃVoÝ'aGwÙ‰«nÐ<O7—º§ò!(\ðTNçä,"|׬žÖøã𻥗²ŽRÕ:äqGMÙ²ÚetV7©Í¢Ì'€Í¢)âš®DãéðµO o÷/üæXO€ò ¡’Ý`Peíà¬6$Æ}É9Ç´®½¥ÑÏŒ‰ÍÇI-Š˜ÞÞS̹nÍ£µDuþEJ¦¡?£_þA6È]ëŒlªR{×j{Kê¥#_}åbâ Ù¸–Õ;Öïb6]+õEOèqÏCðæP=g;g' ) ÇuhÉ]šþË|¼J›$1…QVã Ï6Ö,iö,þÅ»£úPÉ—=ZVlͶ;¢µ†kòßGyør~¨ŒD@bsœˆó£O=kOjòà”í=íÚâ”Ú-«—U¬ñ/¥¾š…P]ïæ‰äöU6$ ¦&gJ×ô¯4SR²öaou³l¸e|iY±Ó£—fUÔB9)Ôž~šü©öænuúc|à۴ëæ4Ð{F£LIðéÊÏŠ\ëð(ßnTc.#«Æl“ åËd³x©‹¥ôJZÂqÙNèpLí55ê&Ë.–\c½ýKÌ„øÝ5‚Û•Îýwíwü";>yEc&ÚÄ,òp’dþ¦z¯”HehÛÆ“ªÀl4ÂYç1ª¤Êš¹ðÌ™oæÃÿfk8РÓÁ_tüÀ˜è&VÖ‚¿.¯Á+¿Årc¯Út5Èlwq<â†ð_OýD™í‘žU%~¥ÓL’Òq^;’I;¶uGñè›ÒÖDì^P¯¬˜Çó•Çûe4Že˜¸5 ¹=ŒQN2!ÖøNc¥AsïÙ²0ubg’ÎX?ðèYNÈ•|ø5au3é­üÌ…þ¹™sôo+)QÛ…‡ò–‹„ÆØ\Øû%¥ôž|[þ¾†få›ÛøŸ}†ÚÓ®l zäú>*XòrÜ-¨ð¿ô«H2½:NìÓ·xíL{ª3›×t`ü¥Â8ÄíÉ·5/ 27q,WV7©Í¢Ì'€khø±:}áXq†Ì6{…[§82¦‹ØURÎSdØJt­0Uˆyé®h%ãc²ˆ‡R»èÖ¼V$¹ó§Û‡>†!Ä¿œSnºÈ‹[À©ù¡àsSœ´ªÅ±ã˜fÀÌáàIÚoµ2_ç}UN¨¶ƒNE;D- õ…?ººJ¤ü@¯–vWAQ‡–ŸÚë'Ðüxõ„)E¥¥Ø]y\õÞ³ç„1âõÒ',ÌxVÿ©‡ØC-Ä^3ÏÓÅÿµÑo£à2pX1O¯' uðSkWçšÉù$&Ù=6…/cÆ£”T4;Îì»’ÜNÚ\rÆøŒ¡F4Cð\ß§\Iâ0a™”¥®ÉúƒW©p?€&*ZŠšD•Ò-¡Øi±í…bJëБÕÇÝ7‚›ÖX Ò®öë1:da j]?Þ¨N2n«ü¼=½Ëz#lõ5ØX*½”}N&ë˜ÁEÝê§= Õë㎷h§ÕúÕ¿?c&¬È#W#95GFÿô7‚?Ñ)xÞslÂÞÅeѱˆˆ¦rþæeñ];(¹’@Gb&°x®î>]Ô¥ug‹ºµ*¾09ž´j䥫ê¦á! xVkX3‚b<µÖ¥/»†³/Ý›yV¼D84q>µÔÍë¤%&½S.,:ÙTC;é'Ó2sâ)Ò•“óà 뢬?ä¶ßÑ“@­D[i÷'ÒÕ Ecôú©—bf%ß~Sv§4½>£¨Æ^}L`tß?îÓÜüè=ԡƈێ'n (öÓ8j¤¯Òª˜ÈðM@»h/ç“$±®Á¹j^LKG“XeÞxÈýñüŠÃµŒ)Ifãxàƒ"ûŸ‰‹qŠ[`ËšŽ…Åój?eñR÷¨#¸Dª†4ûk¬Ö­v+JÑz†.Í\œY:hš¼µv™.ÔEÜb´Ý6.S$ñ¼Âú&äÌú¯ú€t÷Ë(-ª ‘f2¨ÒR‚3»á° ¯d™7Üå´]dzؙe[•FoÎÏÊÔ£=²ù¼qKOKÁ¼cW#6/ü`F-:9C¾¦+cºËšáI·Õ­ö«ÏŰªò lÇ€dŒ+`˜2³{ª2eÍd¸1ŽEà÷lëÊ·‚c÷)GN.eÏ]«±èöûôMT¢Ê¹nƒÿ´ðD,~ïðã•-Ö—¸3!‹’xÈ,0•5f幺 ÛÇ`‹°?ÙvZg ƒNÉ%M×F~u£ï8\z“Å’ì˜9ùT€–¿``8‡Íi qDRÙ¦Ûí cYSõDÙó"õ›es¹Ù0ðw ¿YUû}[h„8©ÝTÌ$'ÈÑfà0e’ú¹+lYK&O?nlÕäE µóqÏ-Gþ“2wñÊe©´Æõ»BNDTí¥îÓ4Õw&{kÛEÔ$XØ®8Ê#|‡'«DfWxò”ûòL/‘L~¿B!ôåöõ±çûMÒ£BžU\±)T2†õœ¯C±2Æc•·5ÆI,óúò°‰q|è‚j2å–ç›ï0ýbVlZ—-IBÊËÇ>H$á <¤³iy×h‘“•|/°÷ =~½å#w.‘°—:'Œ„Ö¤±YG‘·ÄDÛj>ÄH·÷3›W&³„ÆTW Wï>:6!·0ÇŸp@ Ò& =ÖaäÅþÖè­83RjHdé{9xK5o –€ 0L„¶Öõ^ó*Y¬ˆ& ¤¦"­-»á¿¯Òxr–*ž£õ¢¸¡,»ID¥ÿúZ­¡¦Ô)Èwér!±BÚŽ$ÙåICÖ%%åúw\aöÌåþ!%øŸñäÎY"Õ~ŸÞôå)/¸Rü £îí‚Q(Uê¤õHðÃ(Nâë}Ìm¨ˆÐ/5Ú' á\SFªoûéŒK,7é½39Î)´6˜3~– ZT‹¢)È«öì&[õž-cªéx¿>™O6ßÊ­m¥d$ »IÒOÂEº%IK@OÆ©ÿ EPr´—^U×ç£ÊÅ¡_Ã˱æör[Ýxƒe’CQ”† m ¡Zä9á—+«w*†*׋ê³!Ì^žqʯZÕÍLƳ9ÛY£R/Ì®Ösí5i¦þ‡m –¿÷ù_KÚ~Ø3«=EeMTÈ£˜Ò|>çš·|¯>:2L Ösœ8–tJ ëè{Þ܈ÈÈ)•2Å”VæYI`Šà'ȵڳšU›™•!N³I.6°ôÚä¯Ä]'¹G“–l"<øÙõ…ù5ír§ÜC€>¬ƒ0<ªM8óUqp§Ž¢ÊBm´¼Þ«€â\n1‹ÏßRæ°»wzÑŒ‡É‚¿­Í1h~ qSL¥b j˜­lÁ¼’ƒäœÞ€Ÿ½ì馸mLˆ|—v9³“v–ª‹&D$¢(/<]G7ïy’Ìëâ€p <ñ#(sO£",Ún#ªÂmµ'œª+˜zÃÂŇðc¢x˜VØ}zK#ú³§ô%ë…ÞŽ÷(7íï–­AÚ®t X¦rÃý1p'Ò†ø;d–äx^V’ÿNõ—0é[’Ô 8UjfÔðwùÿŒi>öÇÉß-IÜcEt'ÙÖÖìì@<¦ó®CMsëøq¯þReïë“'Œ0Ì–›gYÌ ½ü6tHëéÑ‘ŒÑ¥uþ>ÌɆI)±â¬Y-¥§Hu-Ê(s½¼<Ý[ƒ*9G¢sbäOR|í~ñˆr;ìvŒ—SœÃqç7/Þ°Ðz™Ó,stûO®«nÅÓ®øTñç¹zP‹ìNg÷5Þ¸ÔÕ`¸¾bj¨Ñ†ü×Ìs…¦ê„ãi%Ô)Æ%…wЇ}£…,‚ãÏÚûbºgšMMn}ÊÂON˳_@J9ý²s¶àQçÓ…ñêh¨ÎpJáÃמ¾:úóŒe“Po‹MM2ò÷À1fiP‹ņ‹_“#Ù“î~+ü·Osç1;oõ·£q8 ÖºŠäÈxsÜšWDþk²ò#òõ:Õþܱ–ƒÐ“=Í;²òàz´AÛÁÙ¿­¢s0q=÷Hg X‘™WËßÀÄMƒ–Ök2ÒîåEÌó*º]õzÉ=]äöëÄgýµþÁ¿r›¯ðõ΃ôö\HìTŸéBr9¡µ"㜡²-zŽÁæ¨ê¡¸O¨é}:Œ Ÿ´3¯ËûðœgÔ«~ÊJHCÈ\8Þ;ÜŠ”WO„~ã/rg.õ“bºëÜËãKÉÏíb)w°í¬M!'{ÇÁDÍ? Nçjd»‰ë¡÷È,C yßípsv–ÐóñHë’ã-cA–øžc& •^1[r}*â8­ûñ¬f|ç™g§Ÿeì¦ç-Š6Tu1‹v–JQšRwlSYÖ–^cLqøJ›éHTWà€&Ñz€mH‡–ÁÕh! Ì–ç}ÁZ©Wt }/‡ÆfcéS1nÃy § ¤ö½‹7ßÈ®nSk¢˜àHï£Ö/ ñlÖÀ³ˆí¢8hŒZÝ'}ë_~ gœ _à.œG÷K½²<±-€íÜ'÷%HAò )9ehÿ`ßhı]e¨· LT­K¥ÔjˆoÇbÿA©ýV3WÛøÎ1/Âa+nc«m¿,A£?Eßf„ÓÜ-}é˜(œžŒ¶âô¹YdÏIk•fA𝾠'½½9í_ÕÅ~À‡[êíÙHªï 2âÏ”|Æôð,gÞ¿0aç—o–nóL, ˜5ùn3;®À}¢UNÑ’û‡3k=\1TÊt­ K”¥ncª£A&^Ž‹’Á_Éáw1[vŒ´ˆ hødrNº„“!âTeç°«³‡¯–y]ÇP8Äà;œ=cœ`èÇýÅ¢?–¾™&ÿãN+Íé÷”äØÐ}ºìóy®å‘yÝLÍO9ÅÖàu“p3š®¸w³üò·3"ÏóàS¾†åY³}"å‡f»5Wˆ'µfúÍÈž±å‡ŒóyZûË(E³ŽiÖLá8V'[ñœ} ºÉÜÑQv+óœ~KývR’lMÛzŽ3¬]Èžo!ÓïLçÞ暴«9BÐW”ê®8¼Ž~¨\ Œå¡ªžTDׂx°›ÿŸït¦=ºßd‰ÁúȽ|4¶˜HOîíi9Š»"KàB°,ŸŸ?üꬼ–Vªûúó©$K¨¦‡l%+¥ý™‘9¢ÎNùÍ’2„7¸òbåª\‹ì‚VðPÛ:ƒ=•—ZÎ*”eÕ±R>CJg­[=ÂÍ å\U7°Ã[,7aëÆ:9¬,´ŒÑVl/Üò.·ljolHë•Ò08íbЦ/˜åÞ:™ÃÛ*€C@QFÈà S€O“‘ÿúŠ}öÉßF˜ø÷°[Á¢8È?.2Ð<àœ÷âˆdÁérf¨ËMÿ û-–Èù–ú¶ðÿE} T}.¡n© "öÛ\žŸ ß2 ¯¡•á4Îb>k\àL#‰Ñª2£Œy×àÊ?4‡ÄäôÏ_ QJUNB–‹™‰0×d{äÒìx°Û´Ô’ºü6å×TOúþBêE¦‘4ùlÔ#†Â4©æúTîv5Ðñ~’²ŽpÖÚQp–uX()7Kï….–dˆRýp{@íïÚ0Ú•µ¢NIt + „€àê{`žoÃ38å9æž•¶²¼“EÀ”QX$U¬üÁÛ5ÆáNñâúõ:”8ొôK”]5õMÁÑœ©è;™IÐUYÐjâÉ™ÁµÈ½ ×EÄÉðA/›ú‡Â9žaö©g!séHhÍ#ýÝÿ²,­)€9´Ç'nË"€¯è>Âû\uè‡ò‡§ÅÁ0«¦6(ΟµµQϾO2{a†º¹¬xµ ú\ºüÉýý÷üe¡1`¸K!ð§sð ƒè´Ì©`Ñ)•ƒŒû:á;†çvÑqÅ ?A„pUR¶öÀ‹±â®KÁsí ö‚l•ñFŠ8,Šik?Ô4ýá2›ÅRi9â?*b !ft~7¤ËL¿ç¿1WsœoWÎcI0??j[(¨Ãaa:…rÖú¸²²Š:/†Õ½­Œ-g5ŸöàX¾T¥†wªU–Žºè®’½ÁèÚ{-~ÿµ¢ÒYÆ' *äaAék3Ö1Å`ÑïŒoËÝó2a_*—Óö`î#0ÇžKúMw uá ³sAä}4á–_’¥¯7;°åù ¼÷°.Ö,¾W\iš"¯£ ]#q~Ì^E±u_·xÅ@ͬ3 «ä|-t©¦ iĬµ…äSxCÞ}»ѤmEð¸êb¨Jŵ±qœ|(ÓiE›eÍ"GŽ c÷4`B{-϶¬IáÄ;ß©í+…º€Ö,‡ÿ,uJw˜é|ó+Û®¯ütóS]«I «ëBÊvǿˎ{Ë#X/#Ô¤_œ¿èTGJß„W‹Ë¥šl1müqʳ÷ÍOÓÓ:5t> œ&¹zíˆ×·U™,4ÿ–ëŠðù9gµ§A²R÷Ë¢f§ôþJõ;à"°Šièd8«nZÃÊ’Àe Æê\Ƨ”÷ýQX ]@&^€.—ó¡ƒ"é œ¡ F,£á÷J¦ì.–Ð$©!9H#7密gÀÝ¥u^n_&;@ðüŠ’ä{³Œä{¯#¿^õ-œv Pg9²RËiMkDRn$`’í»ïdý°K<`±Ðž_w­] rú6ëµ1cì8L”³Çln¤öù6°Ĩl—Xß/¦üb·Gb$ãÕZâÔÊoífq‚³œl":…›b(‘]?Q’>îWötŽãwÙNT@ƒMQDŸÒ¼­ë›q¶ý` z•zŒ_—¶éŠœÚþ?©òc¬³€ /ßmá¨tÍ2OÑÈoý‘ÞC“©àV}Ò’Åó¯€HˆÕ% HMº Ú°‚¼‚Ô*uŸ·óÅvŽ¥ø4;Ì$³´-„•±“˜83o[_õq]›\‰|ëXâÐàFôQ·Rfß-–¸ôL­ö³*Ìi/~}Ñ#ÕŠäMõ¶ª\ÏèïƒKäÕì^öM'æìó¿0•[ãŸ?í¶Áx¹ÏÇõ—9ònsȯá¡ 4,©¥øA˜i@Rµµ•Ä<ˆÒì2´fÒ›/±¶ò€»h¹NØ8Vb x• ¿šü¦Ôa÷ÛzÂ"¿OuCP^E ðX<ÎPü¯E¡Ë™Þ›4 dñ*bý§T‚2¼vYñ¸ÖsÉëXÕ0(^hÇIaþvu]§¡1ß0_Åûõ\ $™‘±3~÷æü[f™€÷³á‚*ù£l'ËCÙTN¨tj S)l"o5©Hc­[$Ñ=€ªÚÃK{œ˜Öɾ½.zªc¦ÿ>“HÖê¦xþÏ :55 c}E»Èç!Á^ù^·O»Qe!¬×¼bÒ¾¾±÷±ÿ‡J§ÌÍšdq´e™F2ñ©Q#$»Ñã¹³¶x®§-Ñ øl©1SÞû¼tÕV­år"hý5[J˜™“<ÚØ¦gzåÜ£›Iališ0Vñ›¬¤ciάNÙJwfNS*ݬHƒõµÃþ‰ ©Á”¯rÙV²¢f-`•·ÕÞ)ö-\ µ0¬û>[ï{”$D8î:Î4 ~R!dL$û‡ éw»¬Á±ä,OrsO‚ŠÈzÀß9â2ù’\¡¢íC/ü ·Çn:>y€›í0/5WÐPbÄÙ{ÃÑñÉ:n-ÃðåêÛ¼³1åzṪQâÞ Vp  Ýž¸6è ^­6 ÐùÛ”sp±”µ] ¿¸í®ò!YÚDzw}å\ Èw¶õ}„«ù,áW=MÂü§®Lxµ —åõ–ÜÿñéÉ‘¹ÈÚ§+6hÊ 4Â9ÄþéÀ€þ/±ŠQ€D€I’¡ƒª‰ÄJýr²9êµ±Lj2é£Ff ¨Ž¨vN•íG‚´¯ˆAž)x=‰ÕnN•ÓÜØAì&Ÿé†ÈÔ‚4õŠ{¨ßé9Ó`³“܈’j±Æ©çIf]ÜÂ&Upsò„hÎUòXwáDwqâËrk2[ûr‚'=«Od‚øÕ]ùÃ\ßiï›åe*`Í¿àÈõœÉ>Û Ð§¤"°dí¶¿¦¸êÄýhn-Z[F}ú¹KCs<­hFևт³N ¤y4ëen‡à6·fi@$«ñluŒîI§Tƒ…è0ev$òÅ5DÇGhʼwÌð£gž÷K|³‚H„¡U°©îÔI$ñCQuÉ(ÎéG­/ãØ·&;ùÚ' `G˜É'Òĉ ®û<߯d÷‡(Ö%ðšÊÅm5³)aºMÏ:õÚæFñçD~ y6¿2þœ'¯›-nÀ¸ô·€lÊóØp¼7δ¹|È&ÕΜ¨ D oÜèžÒä[‹“<¸$ÿòTÖró ŠõϘ£$Cü»6„æÀá?wf0C¹PÆ¿`/O ‰{Ö¹ 6al“¿v:‹[Ð_:)á “>‡6LðNÓ,1JÆsk²‰±gU[ºS˜ËxzžK Eý~Xl¿-ú3çÏ$ôÝUwúD³QÏ›_nSŽSÇ=PÔƒ{'K›¬ÔÉ1‘Ç}ºÆªÏÄ‘¾ÿÀe™Þ\pÇlïãÓ.[|@5pºAÒm¿šФ…¨-ß|Ö 6s±ÁìÆ4’–+h_è²} ™]%f©+°¬'+€ææóÞ¼¬2aMÿÀñ0þúÎÕ¯µ„D—l5×"äýp·;q/Äur~±[k©$€úr¡ÑÖ£±Ö¶ZJXï3«*Îç–Ýfê5›Û† ±Ó¢]±çØŠRgïpˆ÷j!£pD&ô°8~2€&ÉËñxÒß±¼l,8GÇ$”óÏ_Þ‰ ÆŠé£tä¦Gk^»þWJ_ u,úÕÒ‰kªÝoÇ<|^=ä•N_~›Ö6øÿqÓ;rÈ>¢Å«{‰ýزÔ9•åïŒq½Yˆ뮼iäÇPMP›Á‡qúvµ9NZ¿“ÚöTo<ÃÛG*.M‚Y­Ž¯%Û;mg–S§ÑdÀ4w_`ÚÏ`àÎð²¶á*ªÅ±ÎBèÛ Ú3¤cÐ:³6SLâL/‰Œø) 2[¼½uC¿ô~•šXhÖm¾™‹÷ê„LðÜ$ ˆ“HCÿ¯a,¸¢ÊΤª2O¢}²üÄ7Ýî9§9JàHû-Ï›_‰djˆ™cר‹J¢¼è†[‹7¬0T“*'ÍT?ã/ýs’óÙ<õµž ZêqŒ‡}„F4 …²š2_žhØè@?¯€8À}úŶÀ™äØk5€å"Ïspˆ{<;e.Úß7k<¸VØ›EWÇ,n¯Œ >;èC É~òÑŠZè>H)a(iÜ~‹S9ÇG+iŸèÿÒÜ#Ëâà¯'„|B”‰±×j[ ‡¾ï^M¡ÚÍðÄ3*ºkÕ°óÕ"ä Šcm3P&‡YƾúýåŒi[²>ÏNø–Òº¾|¼¸åø“ìsY¬@Æ(\ú21tE¸±r÷ÛYð½ðج+“M¸ù$ŠÜÀ ˽oËh²””˭_,@8ãµüèü®åŸêdLM½–‰Kq÷„©‰Æè\î¥a]QøÀs¾N¸±ÃîÛK`¯f¡)ë)ÙE¢KSå:E {óiüd$†¤þA·×IâÛ2Mùv 3YרZ³=ǘá'k&­•„.µV?hV".¯L VAA&<þ7K¼´¯ø$5ƒ ³°2†% ¡VBKéËŠpˆyPŸ¨C†XÓ´( "¢å8üŒ,ÐL—Áem¤.ž†ñÀ0NïÊ?IÊP8¶8”Ó¹û1a¿zÖ¦H#•KJm¦a~ªwvÝðÁPç Ù{ZZ»‡úóWx¼•¨ì¬š›SS,¼Þ³D6M¥a„¾–wCæ¤)Á <ò&ârþšðæ}–A…¸Ty\˜q÷ºe1Úk:ð(üÚÀ¢VÞsüÇEjmå}9PúmÎäÌɧÛÚeu"¬‘$r⋲™¡¤(…)F‹vI´Ø`JN7¯ß³ò«YãmãÙíä0X˜K°±€ìÍ€¥ÝKÁè>‡šf[ .þ,c±p‹xö«ïO¿¢ØÁ-3KåeÁóB<,êà‚ºQzeØ]}ÑjGÃeÇSY)8åS5QyŸûgNã}~ ã8Þö‘Þ XîŠoY¾8WpϹª{ŸNlí±•U½øÕ>XÚràñgœ Ž™œX¢ °é8¿ÖX•Z>相0¢öš­ä±"o)» ‡Í?´‹ås&á­ÚgNÌ{Ó&ÐQ‚É>Ï“DÆäHiQfçdô6>ú¹R½—ºy/m`Ý; yf!~É Š}ÒË`]i88Ï’?8Iᕞ¿ܧ L:°·×5ï#¹åÈ”ÎUëÇ©òáò䲿¦O°¯ÄÀƪEÁûéï­þpžZ[XSª{›+QqòuÛÏVœ@&ò¾Ýdê]]dÊNù[lñŠ c•‘ȃDÑÈ/°¯ÃÙ3ÚÓƒþâËéV``âÖ©—e±-³‚\° iÛ=s–„Ü©›:Çi(ã)è+@üßék„ýxßÝxªÿ#ø¤˜N\l…ˆòàË8c¢L–ÙM#ÊÌÖs±X¤â «á𬲟Hé個$|µ‘…T'ñÑW®QËân,àí…6[7k /“ú²ÝI£§ÕVWw=H®¾Õó–t’ž'Ü&ÁGaN°JKâ…‚%Û&¾åïmÝé…rÙkeP–¹,©>'} ‘ê5‹€Ëáô.s›d…íaÄ;>^d"‰OµM‘ùü4Çõ·ö%·ü3ŸŠÞÖîÅnUÞ¯6¶uYŽÆÅ7Å\T݈!'=I¢ð2&"’© ) 5›ì8Ñ3•’©8ÙG3Yî6$Ÿy¿^ëI´ lh© nNëÜo‹ £ÕìÌSz…»?7§CÃ4ùV÷5HãySýˆùxäÉ<0}ÜLg®Ix¤Àg¡Áìk TÎ*vNŲ“ŒÈ7« Ìâ«£/˯jw?ö4€ñ$/ó!ˆ¶]:=š¦yÙÎ{L2š}õPªµMGâ©/FL䯷pä 0¶€…W>C:L¸Æó¬þGu›A<ÖŒ=ÉÈ w.ŠÏК*O,°Lt²] hà)u¾"Ôí—3`MjYÒ0øH‹ý ÕŒ<6fa Œ€¤ŠOÿÙLôM(([óƒ=gПÄP¡Ç^- ÙÀÁ{«>±”^7½WÇšÒ¥Â+˜Eò“\HØ¿ˆ±¸X÷x)Ü/RR 1;*ê!¿%)ˆ†”bnB±7Q0é䥟)Ie&G®ÐI‚~ß÷ͺ¬ä¢>ÄÚÓLÎ= _8@°é­îŠÖoa© ï³ ywzd‰b“¥h™.åŸIðÁÁ_ß›?}È"†…83Æ­Û ¹Ý/þøÆ³sátËúB¾sBœKõ½ú}ÌÛ°¶`}db¸û†„ƒì®î£A;6ÃÆ…SÉè›ÿe_9J=j%mÞ‹˜ý¯À˜Å ¿’ Ï•Ì>4¾›Ô|”ü '±,6A :Þàúav;Î!É}¯ý2  ša‡ÚIg7ðîÑW±WO_|çõäÙ+Š¿ëÐΙñ^þ\\_7æÖÈEµ›(2pn¹¹ÏÅþÖŽËã!•½òƒÈûð{ƒ3rªì#ù‚ÀÆÁd PNg™¹ºA¿`x…²i $ýæeÙç߸ôÂS'øp£æŸÉ»Ò½:}È<Èd“:ç¯,ȳVgñë֌9qT}k×uÇk†‚"ãR¯yâOsZ^]ö÷U/‚¦ÃÏ*áBÏç–oΟó›fI |È «¹@ûLrFæ­[‘æ‰ί“VÝ™ö3QR8ÁÆËعVUüDr•da?ŠkÀÒ^°ëœy¾$ËdÆòñ“0Ò²@ê®î2á÷ªk¾Æï´ÙÔ NŽÄ™ô6™œÅ¸ —lN 8ׄgÏ—­û—Æ&ìøåç%„Í‘×Sœ«KFOظöä¨ä÷\,O#:·Ý.Êögâôá •Î8c¤>з!|Ð5뼎ēæcØ€«êxãô%4§3X®åÂ\Z%cÂt%« o©ü˜Äl’«ûW‡ªœ°6»‰ÝâHˆæ}t6±'ÆÐ;uSWýŵ 7™†'r²AÖ²™º,Þd µ[Û™¿êØ7ç×»è²álÌ^ý‡‚mBj_‹»7æÞßas¾öÓ|Dæ©e¹ e¨S1.r±±Ø¤ vš5í#å¿qž &Xh1ó's=r»yÊŒ—7Ù Úæ­Ç"ðÒþËv‹¸SåYçê&㎃{÷¶=ÂêQ±jæ‘éÛEpc±l'´X¾]î¯}ÝÑšàÂ(×÷„ ö––¦hNžw ]Žm§-¨fˆ)n[T¦½Àk ÒY±×SoþV­íDì˜'q]Âí–é9©·NäV{_NØ´ä6±h…““¯š¥æ €ïjz­XœWƒáïÞU ?|‚ÐŒ V"ÍîÆáJ’lâuÉU\œ{`Šæ3;ÓÄlRí/ÓŠW« ت¯§ß^ \í峡ó#Ú¬C™»­©£Bî ÕKð³·ªe×ïŠÌú‹dsˆ1w.¢xaï=·]ã¼î†Cô2S¯¬# ìi­ŒæÐ0Š-LüŒ‹IÄôCʼ…t×ûY±Œ+³;Ÿœ2Y¸üï1^ÀWÌtÅô±{ ‹>{P‘ ‡K©ßIwóJŽÓ€ºÖ?p…ú?]&8Z"0´g6’£‰Gn»*¸fÍûÍúbÏ“‰-ü­-%¾å>Þÿe]Å뻄°`rÚì(pŒÍÏ\ŒÊQk…&÷6ÑjdÔÜwŽø¢°ÛDÓŽK d–×—S¨àbÚ7¨Ó¼ŽZ ARÕd¾Û'1—ùñ›ÛÇ>bM•O‹ðƒù¼ŒÕDPÛѩ؆ŸqÌÿ@îRÿÉf¶—6ø"Ñõk_Ä*\§bô¸^)ô˜o½æƒ ˆÙ곓 |FF¬‹@\:1#É.>RAJ›á ”Šå\Yk·¯G¿Î.u^š×-‘ýâRÑ@†*0 wÞŒAd¼cVT«%ÏWó5¤æ"ÑeI)ËN7# ¬9”;ï\œ~4z1Ô.̬ ­µyÓ'ÌÚ¢™ •&˱l•>WÆu½Ð„q%²#ÔÖ"Ö~Ñ-Q°4*—F:ÅMeÃÕö-f­úÂn<Ú,©¹ …un»–µ†’Ü÷«¡ž¢«±<âù´Þ´!¾åQ-ps$Ë 8ZA³7b˜X‹ö¬È;¢¾{@½Sa±)hFa^©” ¶´ÅˆxœÊ³TãäätB÷¥.0<)0âÆw H¼\gAq9Á! H‹)ŽÁ*âTßË+Á¿¬îCh¶i,ÖÖe]—¯ ´Xÿ½§Y"Rÿ  …Ï}½Aðïr5v”nöBTQïè¶Ñ÷GLÈ<ëì€MÀþõ»<û©ó Sëþµ•¹›HŽK~èì+­#&òƒÀté_ü`ý{LBø‹,°Ô{xpK[‡D —Œÿxö?—tczVî…áþëbímjœKÔ«4”hÑÈ:SuÙ-d]%j~±TdDÀQ¤qò¸Ç:éÒYl™Eq°•æ$Ë\ÆÆ*—’ó+oÌ]œ7Aü‘†<Ο5wÑw…Që™ÛËàï}oðU…l׎Ç Äýv¶Uê¬Ru€z"_£_;I:ÿ|@üàTCÃï)LÏ¿·CÅ·,Cu¢€œÅ탥xH¼¸÷hþÃpe)Qò£+ù{@Ö~}ê¬åðÅ:ëMÝ՛˿歸?®â6™b’‡°%˜™rIeftÒ /Žf-žêÕ7q÷€P¢À1°ÈÃH/]ÿ™¼…{´×*˜Ç-j…ß;g%ã+Ɖd× Âþ§E"gPÈQ‹ÿž°9€³†—ϱ¦€-ì…u÷ìðu®õéÂ>RfÕÔÙ³U¨±„&˜Yž¦MöVÅ$á\~]Ј¢^÷…Ô4MX¹xØV[\), üž®â~§Í£Ÿš:f¯?û‚0;Ù=-¼°nFU;ÑÐiç!Çž|´3!BíØ[N“ £çG¯/ÊPt±îìý^FÄ–óÀ Ý8íéŠ/M+qq&8p–{UûçoÊãolkÊDÃ÷§&D‡À-Òw·™Hœ¾'¤z°5cBäHt&™r5=&]¿o[RpZ±™ÍtáÀã6PâO¥ÝÀ2¨qûÈÐÓg+¶íM.V”·Hnðò-‹Ø¼ª„ƒçúr+B°Ã íŽ °‘£Ü;dtJǾ4ê8tćú „f¬%Ó†,|ÛÍqW&¾êÌÞ’Àêíuäx囿1›óØ^$%v!`6 ×Ó‰ã+Q·£NK†žrv¥ËÃÉæ\zNý'f(óâÆOͧ˜ay©58›F ‡ ìd„ëá]ïqJ(U’—(”œô£ã”ÏŠD€H̘NJÞ„Ú~cƒˆažº(x•³ƒ)‹×x8JÎ4½lt9­4g»ð6Èv¡ ?eßloU5;JI½ÌÐçR ò\l;%H£…‹Ú~üÌÝ·øo¡ˆÕ²„Ò‹)•Ðß5ª%›ê}¡’Ò!DÖ#tËD/%£ùô&ãù°'®Ý:ÓÌóMJT|,î~ºAÂ,÷¹‰Ä°’ú0L.˜ï`¶Ö7Q¸Í‰)Y¥´ >CÊ—T?E®® b1˜‡7Ȧ®<wåw ¶Z<à2a«²XCü‚ò]1̇”·wÇäøt2‡¡3¿&ûÙ·^Ç)…€ê½ä Ú"ø åÃt&£kç†Áï7Þ¢<Ë÷A-ll8×'£xžÚ-œ½øEÈP“‚><¢Ô‡;1ѶÉ@bqU*êºG¶@€Chá,ípZòFì3_‘OÊ-¿ÇMÝ]“es·rVëÙêµ›€v‹EbUèÍ<é%ßNNaýÏ+¾ ƒ)Cò¬•õ¾H‘ÍXKï=ö‘›¯¤×úYâε.&|>óé<Z¹þ#axO×3)¾ygÌGÒ4p³–Ÿ€ž‘Ù§µ|Ýç/ÉXÂ¥%á@]nô‡v‘Ò¬ó ÿi]Üá¥` Ó˜"g-°L0¶.W6S۪„èö>9þ>­†%¨)FÍý‘’Ì+"F}Ê„[®ÙIu1wþ˜ M_Yós¹ zç&ÜÍTòæ°<ñ&Aµ€X<„k*;%÷›EdؼñÁ`a7«ˆãQ´Ïl ™Êl'„ÍÉÀ÷(((é1xa8ÙìÕZåÿˆ )#»Ã„Á9ËPç›aŽK9 B®›.f¥äE?é.^gÏz=džJ}|¡;emì`Ê6Å<ð­  Õì͸µ_ìÖcP ›öÙ›Hw3‘»D“L^ÔCONšÇ±NRuéål9hN#׌«€»/ËlÝbœƒúTÖÅ2¼U?ÖI.3iy¬Š)yœÞúª(bo¼ìÉ-77€Ž©À§T¦%#Vú–è?7ç·¿Ϲx4à¡èŽ953ªKk™zÉØofSÃÇû% –ê@-œCÔhaj$¢tåð$›ˆx~I™“8_iïÎñ*Á¼6ø{°XÐì¾ÖðÎn­Âd.iB–ò"à0Xü-éu}¶„–óŒ!*„è ¨ùzœ¿ú„žË5\m~_{î‚ðytb,¡:e‚×<3#O‡ºPiŠZ§Û—Ž“~0Oz¾t Qnæƒ2,RWu‰|ÇiíÏ2t~¡Jw¥6**Š£Ê ×0vcüéR}°Žñw¾®;Ÿü ªÆÿe\ÂìQ-!ÓÁ‹C“;»Ø0«tãa½WB†¹ðoò6è9躮t¡ `Vûv-xϵ÷+) 4Ø€{o3цá$è(›d®_Atí¡–RâlGû½Ú¢€LT¥køËñE“Ú~øÞEmí<-Æ>ïìc+&ÊZ ü8yRQxA©ÿªû®ê<bìô¿”žã²Ö‰Îð»r(uýO_:b„f‡)ôŸ¨ÖaýÔl̪ÖQæöW…?' )¥^Ió Æ¥—ׯi `²<{aˆÍ®;âÐ1otϹq Õl+—{W¾ªyDHÙN>ËÿN4÷R†hÚqeÁpmÓ.•²Vû ñ¾iüØ=r!ºRÿeÒ}–Ÿµl‚A¯è>Ë@ÿý🹹åTÉqØÔ*±C¦ží¯ w¢QP­h\°|µÉ¡§ŽÓÌ•c´î%ãߌ–©x’1Cwè`>ÆkD{¦7nJ§Yù÷u9DU@RFÆxý_)KYœÇ«§o#"‚%Á}*ÚÕ_¥ñµð}óaSB£”Mà=(sRy°)Ð9”;“»^ FQÔGëñœ¤æMΉð¡SjjžéØ µëyRd,ÅÊw‚ûš¦œsKHJÝÕÃ<´wóNÕùö+ݽ&¾TÁÒ ÁÊïbh8®Iå,´÷N6ì¬Âžª)–&À‡)Cl¡E°©bÔ)U[ý¯4CÈ£úš»×±.¨ž],è¥=Þ=MñyÆ -rUT¡V­ Ǽr^½[1Áçt(‘W8¤ 0ZP`@=£—ø3yî!¤+ö£åoO23ÚŽÌØˆB#”ÝÖB×b pá.5 û ɯ’˜ÏïZL$•5e•s¼À‹Ü:ÿ ÎfK«NÒwß“©íëZœ<°U{êKGƒƒ’Ç™k¥#ˆ3 ™°oI×±‰z²ŽÉ*Áï@€n‘_"z­³ÇSœuéUiiÞM|Í „ÿÍBÓ«ª°V ’ŸYØÚEÝš¨öG¨šDb/@_ê§øyýíjÌïÝkáÆv¦ylé—¶÷¾ðÅ-)÷êÇ`Xe'Ì01¦K½S£7Aëï#_—3ò³#Eó½ßá°Ä ’Òc*ä5q•ÚÔKR¤!=èòÑ¢~¦°4çí¶i¤>b}â­¾J£­íEHïG}Ê=c´ {ó˜æ;9 æý«ÆÕŠ«’8yÙéþ³ÖÖø=ŠÆ…J¸äÜPž¬‡à'€yý=&~vÜúƒ*™Q¨–n< Œ`y§%{RŸp´šØ}ÑÆLƄƜöw+Ølú»©Q#bü0‡F´&…(†â?&©³=E ÎLM QÇ~X¨b u2pЋ­¢Žøõ’ï¶ý‚É$¨s¤¬»ä¾3’·–±˜*«îËá ÉãðÜú—P ZÜ ŒÊÈ¿¬üðy *O6¢tämöü®Ù„€(àYÆ{™Ó¶ðé·”XjœÑ„ò vv$)?36ÕvÔµDk„Ì:÷” ÄþPÞþ¯sôVHŒÞÏiÔ³ÖC̱!‡­ëDõ³¯Y¶¯g+k³k¶C‰©eu•î/« ÂxœÐ*{PI^´â•m*ºÌa$I3«X°Só^£ëÁåpŠÛæ©=ALlÆÕ0ŠŒ‘Wh¦d¾(ßq…#%ÄáË“ìóŒCrK˜Â ¤‚º"°‰Tµ’äŸÎRyNPå8œG.`E{B½§ÑCpÉÿ|Ú'õ6Égʘ¿„ÿA}éΦCøG×Lz ¬Ïè¹ãÊbâ³´Ò™–û;’4çJå¸Î~抚ŵΠr6l”ªú´ B5•íÑÌbýêCBŒoìÒâ::`= _Ýí"É}7U™P«C¯¼A²;3Vµ:ô5Á „oe"Ú MÈíLE¸rõæ,­9NŠ€öWÞ;›,(Ö—Í$€)px³Qá.žĺ4åh»MâìÅáí;0Íæ3™UéÔV²Nάö#uϨN•³¿[|.JÏ#Ô½œtÓ^¤³¼©‡$¦mœWjÎÒ2&xôì@•ÉOøÐà›7T÷u%ÞѺo["ëÛ³¼¶ÂCš?M‘(O©Èd…}B ì×iÛÔüÂê¨Ã>#(=»H^B1gŠÕ3¡ã^J’ri‡]¿.}ªiÛ¦Á#f5çR[=²ìß:ÎñnN8ÁÕn \óS‘³% ½µQa}q-<gô±ƒ×BŒO”4a2Pø=Ÿ£RXµè­ØE˜½8©¹P{z+§WS®ý`÷CIãìZârîS©_>€"6U`·¸6âÙ µ äÓÛb)89Ûµ*Š´ ïþù¨«“’ÞŽÌ(FÒBÛµQÜ~EK¹|JRN[‰¬‡9¨¶Ô(]§ )é•¿ î:" ZÃaú§¥hcîùõX®­%lÖøþÏ7Y. OžˆsÆŠdQ¹>VIœñýð߀˵Æä:Áα *!¹ük¯·‡Ô¶†h æ˜Ï&²§T ðíB/O)8H·÷^;Ù¾n|‹Ü¯#ÛFãéI§k°oXñü¶;°h!y$ÔqN^'XhÌnfã`¦×W!÷‹ui˜yZuƒÔCÙ[óN”º¦z›œ::9Ò‡ŠÎ‚ѼÓQE=¶  °·ƒ…ç²&'Y¤“@'ÁZeŒÖ×s0ÒÄXm¨I|`Ub0 Wø°š´°M)¾‹TYS£ &qŸÆ¯#ó:]ù^Zìþçå¦Zwk•9Ò*ÙàÍwq¥ïës¹Î«˜¥å"ÿb®„˜D'gZòE.fzˆFbi_=¦á;æ³A˜EQÁ&oHññ ç7V|JõÔîíàœÀŽ2~ЀÏMò#¦$Ž¥:ÙúÀËECå°ãj"thŠ8†wTA-År8ËÀ¬.ʾ/þŠ ƒóî¯Ó{§0G×qÉŠ;«Ä¤O‰^]CÂXåm,§¦˜Ók&Éöý€L+Ùu§Æ„«Ü³‘gñ¹-5©“PV>iêÎ\lAÓë?NÎ&,UÁ4w-vïÊ$Ùúªá3ê„&èhZê„2–-ž¼{£æLù…Åí·”l“½9k?ðw•@+Eâ!ÀMf. 1¦)2üxÒ.jÆöy¨öh—ñ½²gr´ EmËchpÎ~NÞû€TTЬ¦^%ÖÈûzH7x;fÆ`§CuClùt'qg‚(ØÌ/CP…q= 4#é1šS1<þ`Á…5Wœ•ÏÓnèú¿ò©îaí!‹µ¼(ØãzìãI¼g]ÇÍ?l´J¢B>ÄJ±`‘…Ö1T6^oº!{N†xË;i׳ŸGˆáÿ y·°ušuÎ'A$èZlsr¿†@$ ^“7ͲìX­D,þnµ¨6äΤ¥²š‚çúàÍ´Tw­¬RCtvèM‚»»·êm@R¬sÝÇuÈý8²®í <ñ:Ù¢, oVk{¨Æ”¶ U0ñ¼îè1U4’ÅÑŠ}»&â;í„Ç>»÷âÞ.´i%mk e¥Ñyj³ÞÚM go””q£Äpâv€Ò¾ŠM‚Òo$ =k<Ð>p »õ+ù º1Î%">JV.¿¶Ô÷š£,˜R,WAR/æ¿ö¤^6úq‘´/þ@™ –aVÞ¦â÷ªqÄqŒÆOâùÌsµ ÿ /™™z¹œøµ½-÷s:èz1>IŸ,‰Oõ:˜O”‹„W«1£úŒg?â¦xr€ê îHþæN(ОR++4]^m’ÿUj«ü3J»Ô–ÅÔ‚Ÿ +šÒ]M'™XÏX+oßRDè’6.¦³À@ÑÚíÝzÌuCó>J3o´Úÿ“Աάøf;¡5ö´XÊ­æ¤ñ)üŸý~Š)®æÇ©&9u¹˜KÇ ¼õÇ„‰º§®z§ ½˜km•¶#—/7ë9î!uA¤Áï Ê¢9±ÑÎË›Ê` ü­uÅÈj#Ïw¬î.v¬‹Æ·Èñ±L`‹ø|r *@ ƒÚŽ=y®”•§&V C]']ù˜?þA<žÉS(å4Ø;÷™! ½æ¥Ù®ˆ{ &ZbÛ&ø KZ†ª‡n_FÈW³ fÅ2¨"’ª¥1Öà’;Ÿþ«C;žéѧì‹eSBŒã;Tó|.ƺ@Ë´}…Sµ·çťЏïj&nN5añ)˜Ÿ|Ž ŒZð ¦e¦#Ô3Êâ« T—ÇÝþ'ãÁðÑó'ñKÆ^ó4–Óâ£äOF ìål;ÎM@)š[÷F%lQù©¬Ö£Œi½KÓ&Ü ‹Üµ€.žžÀï Z‡Ù&IíµÂ¢0™~æ =}c§LTNe/[žŽÐMȽóÛ}‰+[“lÌ8€›Î0b‹YNÉAÊÏÞdSèäµ<á0°j# ö*¥\^AÙÆëN‘ÕÝ8U¨™¾g>|vW~›–FØ~¡Û#Ÿ” u y‹ù„u»Ž2þ](qÅ"]OìÝ. [Ýφɻe·9q~®¤Zïÿ‚|ïÏi´¶÷Ø'vGÁ3Cœ¬;¨Ì wR¼´Ù&÷TeZ<†(°l8í!Ë ¶L·ªØ Í~%}±ƒ¢ 2„ôA$ìqøŽ ’QÝLh"¨˜50W¦Úë.ŽËLã*3KÊ•;6wˆ>µð±PV=Õ㎵Î4ÈšœC ˜g¤yœg}âAàdhlÊl7^ÌòO¡]`˜~|¶ÓãˆÇŽ-}šãø»6ᵫdóVþñ¾§ˆ¤5ZÕúE%žQYŒp®GéÚƒ¦½É€K¥í1q’åË“gú€ûå±ÐB=i7'dí¶øH¡Ë=žKŒY“´€‡Áô"MËjq¿hrÌ¿€½ï3õ.ÊIä?gU¯Ÿª8Þª$¹µÛ\ž§e3—ðIbrâH„ñ‚x‚ŒHÒ„—4åùÝÌTµÆ)ÔèJY '‘ŽÍLSþÜÁžjúSmvsƒ¥ùð~c½Ëþõ³”Ím£ÕY Ðíæwošûös´ƒmâ+˜’·´šÁ (íŽ7‘ý¿VÏ?-® ´‘SÂÈN[ãg°C>S²ò%Ð9¥·Éš£c—RP"¹Šì“ÅÜ?ˆBw5‘1Ÿÿ~'·­ÀÍÕk ¿—sOD86%”£iC¥:3û™Œs$¾îÝ`@kãÜ™ ?¦d3ËB [}¨ÍÜJ»r…ýSs ÒKc$ßõ~Å4ùšÙÛÔôjÝZõr1Ö@•'n–ý¸ÅŸ­u9Ô[—ÏÞs<»¥ÛO«+@ä]±BHQÌY„è– “¼ª†¸æjßšýý|Oô6µçA1dhv|®d Ôî½,:EÀŒÏ?XdáⳌ(„¢ÒL¼Š!d~¬üüc^ÉŠ¢ø™*HVuõsóZvèwÚ{Iev‘Ƥ¥ %ðkæs“oax˲L~Ðà3ÄâÙ©´ÕfÒ‚ya‰ÎD'íhÞ–XÎ3syŽY¦F Nˆç—ͨ‚nc¨ñ6P‹¯ÂB’@¥®qï>*ˆjØÃic»á.ø—úê…Ê¢'3‚½sÇ8Èç÷znÛs?‚¹Iíy° êõ 9…•µú9ÜÊ;Ôj~ýB»0|N¹Óå½°Ö› 4õÂbE°2Éç6 ¥ÖlvVÄ ÕADI–.Pƒ¤È®m¬Û ÑX! áÓl4ͬOÆ|}<Sw[ŒrüÕ–²4Å{,_ô—úÁýæú$…¬S…~¹‚:¤ô¾6*FÛÂßši¯žoÍ£×cýËÇùÖ& ÖþRK–`¥zG.Yö9®µÌˆ£Ï”¯:¶”dbR/`ו“ãâÍÍPˆvb! ]=¿Eq`o:±}Ê |QöMÂד &&fBóÄI$ ”çT¸ôÀn£HðåѱNáÇõ‚yJÿªøèC|º%Š¡BìÙ57“/ Fœ¼3\S9x0†ÌÆÑ\7I S¤K³/F[áõ=žî–1%ÛÐZXÇÜ?NÁœ{ãgÁ›<»¡§‹èN¥uH¼zK§ ¿~OdÑY eµ©<‡%”MÐáëíÔÛ™(‘ª×µ%— ÆH“ý@ CÚ·§–tN†<é-j@²¯S?îÉ®~-’«CÐ~…VüKÞžú}Ûâ\t\Õ@ÕôV¸ì8á·ôʼnWEêÿ–*Õ­ÜüB²hà0¼1þ&÷¾,–5#ÓëL¢Ü͹ ÂÌZˆ'¬OQ—“ÁGžj ´2œ  ©B9X«<Ù ŒSR±UÀž—%BŸÝõÏWÍ„]'“©Z¥ÄÚ!þ pª4+CÊø,D¥&Ƕx–ðÉvWŠ×fÚ¸?å>ü¦¥ "Íæ¢¹=Й»z"!ù䂚Æd`Y6;˜·Ò™7|6[ÎÖØRsz3Æ„Î3#T‚þž?þœ—Ô L+®w<ܱr(ͦà½urXÊÓzÊÖ—h¢ì"p9â}sÈŪt“Ÿ9aîÐÛ_ÐæT!£‡m_’7”Jáµ%•aßq¥¾ø×ÜbjÅ9 ¯ógK²t^¡Ç2rJfyfa.:bš‰U' ¤ª2lðîš–Lm"¸Sã–q¸‚EXãërð@胷出ËWo<ŸuK²¦‡™4zÈmu& ŠB& ŠcœŒW0b¼È±‡Éhï0Ÿ;@‹ âU9Ö„,V%æø¾ ~àêð{‚SYE-~_}±áýñ/µ4w´Q.ìã›p[ªh¼ „³î¤Ü ë@NqÌ­ð'Z½KÒ³+_I=O“–Hõ±{]Ì8[çg|B±§òçÖÜLØïá²ûêr¼2Õ&Ù9§.Zxo%7,ëΔ1§o‹Šý"ùؼ ð¤Ý,°8¸Z+C?ÕÍé“ÒðÃT!Œdd ¬5šáG×þ`$•Ó %áú2ãO+ Ä4seí¯ðs®6úÞíçqÍxmùHèÕëå^  gÐõáUa¿oa©köM¼åˆ§º­Ì,`½ô’NÏ|³4yånW‰b{àœÕmgNÑ9”‚Q‚ºO·"f\;`ºÍ¯©È Éד>™{P`¿Õ÷=6À;ÂMÓ-Îýy¶*ÖºT޼ó«Ã?B×g"öëh›£¥ZO”$ó¯d¦ðcÞœKí>möŠúŒYUî8å[#cüÜåË™ÚæO¥}@1\*ÃÍ#2UÍÂ(YvrÏUÆwÖw9dÒ¸&c1ÌGÉ‚0ïØô%±$Øå úKP(êï$î=.”=KÄ–\›§»Tý“>®¶Ptp/yJy2ѼÄ2æÛ@^' Äü¶„÷Ž-Ug¼Ÿsè¹Çl:<'ï²O¡âü—á§L0ûˆÔàrmÐäˆJepõèòçu€¬´A½õ͉Óøw/nP˜ ~ob”­ö‘ª1T™àÇ îè:Š9¦Ö†Ð4W'3±Y#.F­¨?Ç^ŸÛÀõÓw§óÕ%WvÅi¾€ÎR©J¼ÎÇ$°m'Ê éxeÛDÒò8N­ªý"ðU‰$OXù`»e H¿ÏæXaYL[›Ã‹BÔhè»8n…qÅÖtãE–‘_/ý QÝûˆö$x_º`Hš °¯í‘|IÇÔµ´²•Ûx¸FðóP„úØ'Tþ|”Žº5ù$ï“û¸±+ñöÊ tªyi ¬±Ë™vC@ΕyRƒ™èkÐû”m'Ðë,ã–›†}5¤f÷©óx±œ3ç!Ã, „u$ü\hõr†?ÿ—ÌEËÜEå"6ºø蘄û²¯3>Ú:|-óß~.륣†=Ô÷)d-½kĤ¯c÷N–¾ÅT·ëâsß0u´:vîGÒh½(Ö¢þ*AS%d …¡oý„llô[¶fð×[†‘5ƒ´ŸJ'ÜŽ-[3qÞÀ¢uÿãÏ›&Má­÷ØŽa¢]roKžn?æ˜p'”ÅÕdfTÅèè¦7ÍfSçSHúX rÚ µâ\¨_G½¼dèêoV 3OûŽÝ&Ñ¥¶2;µ"ó÷\‚’ç‘›‰íƒ®¾º¯M²Îì„zžWlá" Y‚líá%»Ú‹`J%)\¢·´ñÊ!‡áÃ}/T‚™°b-FŽ‚Ò> Zš@­þ8~eO€/ƒô[QCëmõWøŽ,¾®ªúRSÐ,$¯ZXÊ™ ¾í%ç@h•:H¯ôôA–ajåQØ5ÎG^¤c,,›ï™Á~¿ëŒˆïQRÔ+Ûâ;`5ËÙL"â)˜¢ª¦lô6ŸUͶ_CŒâ±~õ÷ã"¨°eHjÌ>cˆ®ÞŸÍ… y .isÆeKWg#Öе׆¨Õ›í0FI+é‰ïÈ]ÂÛ˜7(d<%«Š€Rvº>-ºvÞ.¥_£¡ÍWI\nл¤éøI'Ù@)Ž¦Ý¤Îº\–Ž\ºkñ§0Ö½¢MŠë÷F…äWÝï=}<¡:"Õéœñ^iæög7º~}Ë Ç£uOíäôőˀLNÓ,Ü¥ƒ¿y^O‘™KkͳÆgP³+)ÞJéÛ…äZ¹ÊsóŠv˜ÊíbÄ­<_ZM>=ìÌŒá ¡Ðïú¡Òûúd¯z6“Ïæ÷‹8<ŸŒ÷’€LŒ2¯¿Û+o˜·.m¼ôáZ.CE>¾eÓ ¯èe²0ÏCÞa#ˆ#™oD¿ oEÆ()&]ÌØÊKÆEEk|Jy"ÃŒ¢¨0—¡d0b5@y/ÅŽ+t½ÒG4K9`<”©4MÕš5;ƒ`NzKjQû†±%Þr95c?©^ ÕF[…w¸w©*­þ¹ýü–UŒïR¡æyÏzí|Á©Ø¡ç¥…ô¦ìÅë÷Í9ì©Â.á¥ó‡c/šâ^Úï ¯búc&êM§zŸ¸|ÂÚ˜º]¹›| GH«u‹1ƒWªXì@]c§ûH¿·f9ÈÇuf©2Å“ðSˆ°î{ìÿ™‚ôîièQie†¥Twš-ÀD›VÑÎ6ÎUa-5-íó(~ìñp-]w—ÀŠ ÔJÉӼϾÁZŸ¼”Ÿ‚´ßPÙumç›Ýµ ²³0Uܵý]íN ô ðŽ‘´‡ƒ&£Ê(ól/¿Åš®âµ¾\­þ67pš ²5 ±Åk´J¥¯‹P€-©þœxCø3GÎ$ˆ¢îû¼Â´-j:ÌžÏ}Bp>áðïÕe˜ôvµAaÌRú­ýAºÔÔÚ‘S³‰ŽszÙ…ògÈÿÏ’PœÈI `` ?£èºf£/x¹2“~¿¥£{Ò6!¹£1ÆÅóçÀoþd­‰£mû†4ã¹"šbïvÔB®ôcQثäךDˆ(÷Å‘#¦Ndh©IA¤f¥^|“èD‚Ä·N»€éô.Ü,ë_þ”G«ó8kf5Ÿ ³èj Ӌ㮟Ê?¼V³£5%Ô°œOÊ”`¡RA!(«î«áLÎXÑMÅÿœŒýÙ3lÈÔX/[0pV¢œÃŸuÝÿõåÐ?¥Œ¿=xõéÎ m{ádƒ tEkA–QÙïžà/@t¹&áp’Cœ‚5ÞÖî£ü"ÿùޱô/Þ7<ò;²p®.<Ÿ3Øú‚Osã|'ïâõ¦M§2yí·ø<'˜i}ç»ÀðñçÉìâ×ü'M\ä/Ûa…ZS^ JJZúìÁIÑàÇ• g@d½Vx%jÛ1Ë«ò3]-£7®·¸­‚ÍM»ðq© ª?œeÍ-; …ª¨cût­ B8³0ÉT/òÛ‡nz[³•fÝ2Z)€v²I¡_¹#Î¥g/dQT¬\R‰Þ…BmoBò¾Õ©y\«ל µÙ…yó0àX‹cø1ÉY†èßg¤ÑïE-`Ur—§ÝäËc¼e5T›ßÿt^ !<„çÞåÍä×â$DùÕJ^ÿ™©‹%Ng¤¤>ʧ‡#¨[ª ïÞþÁ {&ó Ú!«ŒŠ×,¬¯®@¿–[^ÆôoI ãÿãÕÞK*ö-üfþÞñòéÍè;†UNÓî<7éJ*VÚ<‰Ê’šmëxq‚”öI ˆ×£’¿iE*ýBÂXàúL8«Èú´ h™ÂT=Yá¿hŦ,Ó êÒŠ8b¿ìT‡i𓡤Փp’y“#K ¢ÇŠ÷k†øzag¡À’׆ü5–éŠìÞ¹Kì–~döÝ‘Šmù=Ryêê)ý[¸Ê$|±¡Ø…‹©„4›@·fEäLÛÆŸBèë|ÏÊéè*IªÅ_÷¸u ÀEøÌt7´rå%”ÛHútØ’w·@›†ž²æ{-¡YáÎìâÛþüˆ±~X·tQ$Ý´;8³Â æ`‘.¬<&b‹ e'—#®ÒùæŒ?~xC:s}e0ò(­MÆHlð©I<ÝÁï6EïÄoÉP‡ßº[5Æ™žú›»ÏQÉÍX \åQé}™Þ³­€+;Ñ7²ì ~[$/PÛ¤OÿE“š‚tà/ù=Ã42}¡hÉÃ2?pì2ŽßÃ!Ð3­yž¹ñ¾ñV"mÑ쨲Á? ŠqÀŽ.8¿ö$¯%>ð.€-bÁ7KûÒ°åå·EH‡âh¬]¡ªf™oUX]ÿ>‹«…y±ã*¼nþ ƒ‰¿žÓAª¹ü{Òý8¥ Œ;K€PAØÛçè)µ„Ç©FACR³Ò*äµC¾ä~jÏå²`ûöªÝK}ÚE\®R¢rþ¨)û1í¸¹°k¾•dØ7•¢eüÔyxÎþ¥ó&Œ¯CÈUY\È"a¸Žbñy¹M†9Õ#¿ ƒ©ìf‹  §-ž>­1I†âj¨9min×C‘6ĉ"¦AbQ3sósy²’ó(þ@MÈ£›À¸A‹Î2î~vF/ AZ§KÃAAã£ê+j}€ë Ïn§= @/<¯ÇzíÒ‰ù* ÁEU"½Æ:Ì"$8–÷}]³X2°'Á„+7þµÝý¤ð§ò}*'û¬²›”‡0r®!LW±Ä&¥ÜÏá ’0IÖIôöÐ2u½ô¼Ç0\¥f¡¼EEé²…= ¶ôîä±M£ä |âõ(/gž¿Ì[ˆÒW‘0„VáÝÃöó ’mH¶=ªK•³Äâ.@¦ËÞ˜(.!fð÷þæq„©.Q8«€?#y¢W3$ÇõhXô@Í@øúkL”çÃ2Ø- KåÝÛÝ×Ïöˆ:GO~­Ñ«¤úÜ*+¶X*{JGqÌácÊÕr‰Ýç È›wꔄLΘ©‘63N½òc²ÐWûñ˜! Œõ…¢A_Æ¿é&ëÅÓ±ö4-Ì5¾²C;]QŸR‚{ ˆXPÀÊ9òƒü3¡Äl[¼m5TÞ_I3PÞ‡:3i ™]‘âjTüœžy>8š¹>"XÈ9aO7²wÕ[ÃN¦0i*BýÄ• A \Ƹlf-i1gªoà3<ü`&Ú7Í­ J=ç(w~½×xf9C?½¢üI";ú|Ïæ½“C˜iÑÇ+·$m°†~ŒÇóÂ|ê¸êF±ö3˜Ì5qBdŒá®(›hëýÝÿI6ÓkŠ–Œ¡Áív•ÀÖ u€V4nÎÕM¶æza–CóNs“û¢Ú3ÅQl•æÙF‰+µ |ÉœºcÂà±Âž5îZQ°:v®,¿àÓä°C³W¥ªÚ†šÚK£LA"±5ôˆ†Úk`Ë ‰ñ<%òw¤Y«vä<¯ÍLÃ)\SôtÀ8Æe9áíyN€šVþ*9¼›#VSu÷Ä™ÁÎ[”!ÈjJ} ;°§aPÏêtR7]Y¶uÃ>±Fwv´[q!"š‡>îG€Žñÿø?ÛJ•Ö`´¦¦¹uctú —M¡x Q.á­—†âV5›ªAG˜„zí\߿Эò§%JO¦,°çxz%uvÅ'&$ ‚Ä¡t–c irD+ÂêOUFØ1Ô¾DZCÉléf[9$†á™÷ *nä[«š~R#ŠÎ¡¾EaŠã2u Vf¼Ÿ3þ¦1bù7?§ß_7oÓÍjF²eA‹™6ÎÑ–•ÁUsÜmÔ¯Ð(ÿÁ›)}/oG[áƒ4DTRmb´rÛCRs›°ùYeÇ.PÀoV LøB_РÙA›æ68YÉú|ð˜Dl /Þ¨Ä9n $q"hŽzc °xDÅÜN?BòX†ˆ#’”¯â>2Ò{ž² Ž@o4¸”}U~vÇ·'p¸Ë9´öZܯF¼L…âêÜi@Ú~°ïíºª(A°(jkwsýgSI#lì[ä½ãê‹_uä#–<ñ‚ÓàU> é?ˆJ½=2Óù¤bÎq^M‰ÜlZ¢~½÷ë~þ -#Æ·ІòSaèl»Ì?*¾õÐÌáy*´Êø%ėƇ0¾ì…ìešægÓÒ…îw+Åp•þ;«HƒˆŸ¹˜ˆã²´v‚ éw»«¡…2½l °,Ê’Sõô`ZfÙ*”"ëŒÃã嵋ú±‚AB…q1gŸF¤_\¼ÓÄø#Oæ#yû=*:{9ïb6?N%#Ásr7Ïñ¦íp îoØj¹¨fÏÚ3 ñ<÷=&gçJöÎF™=‡ÖP´%L¢7wc9%ºÁ¸È³¾Ó1p^‚Ý(3Çÿ<õ±êÂG½Z$izÖ¤ñºÅÍç‡6'Û(äúB<8¸2®¶4ÖƒI14îÙÕ@žÜ9´+—Š_§ ŽlêFõžÔn•,ÃTl¾L¾vÚÝQç1lµôG§y¾’ù#×JPh%ÜZs¨?T;cdS戙×T´2‘ãHïQ%r×Å_âe¹0Gߨq{ Ú–iË¿›•E¾ƒ’‰«3ÌKV@í×’=ÔcÚüþ9Ú ´ ¿íµ°HúlåF¨JÖ—…@ðOÉ·v„š¦C€¯QV’›¹4IüU…¥&’STípÙÐ ‚ ,ï!Îè<|™-J9ï½µ"ƒæZ$gèS¨žNk³0söéîœFé1ÓËŸàƒÐ?P.}¿ Œ.¾Þðt²†Œ_'oŸDW™A²'¹2œ¸R52Ä·¹ßm(‰ÙÄÊæ?Ä™cûÀV¾0±D`ÆRöx¡‘Äú‡ŽçNÀô£YÛ¦õOÑ‘ß\²!ùا<§=¼ŠÞÜÛéSInܰ »šL§êJ®öƒR¥A­C!ò3À’Ê[°Aœ¡Uƒ®Ùýôb é\#»Ø‰Ý¸ìe­ã¼.:î8G·»Ú8wï€ mlP”k‚,PsL’àü}¿Ìw–š­ux9Z™3Ád©¿®Öô[\AF¾OˆS‹‹¾–„ïà½PǘkKfÅ@ØE7~EþëQLß¼«q?ht·už Ü‹‘Õ bŒ\‰G•Hvk…ï âˆR,[§¥§ØÖX:L«>éAÑ\š0z×ᨊJvß6t<ågúOÄ™3¯ß=†+‰F=Ç¥¼=aÃçº0OóWS¢rÁGÛB;Eàã©·@\2Ò‘Ù“DPËKŸëÞF´¢ª¿êlDTCOn²0ÅxÀ´m}r]o!oáàñ i³¾Ò¹CVþ¾ËX©a΂ÙgÜÌd§h^ˆCö _ŽBŠ!û})ú;þ¹•~üá÷ Ä;±ÔuþÂÕ\KLCêFÆxBüi¶Ç—PßZHÞjnµ4 |©]1|®$¯Ðƒ:Y1náÏV,Tu¯ÝFºpøÌì±áºâ¨dá´ß‹aý퉇XíN[³ñ œI^óZ6"¹—3†Ï˜ží¤Éh5—K^+™òŽ ¼ˆ:Zu¡½¶f²"ôea øâô›>–a|I˜+¶QøÞS'úU æ‘!•B]èaÀS‡3Ô)âÜ 4ëÓt)E"ZQ ÛZ;$»`(zUfzòuPjï ãFXF\ó»±½ù•dwú.ü.¿ÃvKWØÁŒÞåEæAžÔ×X‚îz2N²{®2VíE²%ëUØïT¬\&D¦7é+‘HM…fh†5·)UÔúéY7yB)Ûµ\$ò+÷Z¼a»ÏïL†¡;3¼óPМ„Ló«ƒ b£ÅZŸ£Qï|¸ä1ô3Z—Õ?ÊI‚âZ³¼¬¤«œ*3RJ(â¹ฒ.4_Zé–§í÷ù€»9s3#âDþ˜ÆŠ‹òjz©è¥Ã<>%«G=‘ºÕõ`,—~õ3ÇI4ûS ¬½»¢ð0k86ý~õWëÞïQu K†K3^¾þSZ5Ö»…)îú_ç3+]0]rø´¢V áva:½=vÎy1\üÐrò6s‹9ú jjØQ0d+ù[áß/ìk’B6N‡¶&ÔòVwUá§ðNÕä.ä»âk½³¹iuò¾»^Þ±ÄK©«B2¨«Ê’nºqf°º )ãO%Œ.¨JØ+Ófjªž×L¼íKÏî½µ»—¤ —èB¡6c;ô]ƒì¦ žëeÚ£X™Šâˆ,«˜Ïž¼[Ä©Ƹvü¢Œ˜8¾Æ á“uø6¡,q‚b¢RCÃØI2AòïÁ}ýô €äQJ ‹R+Nn•n+ÿv[qûwÎî,£{%óÓH´ﬔIå(Âõ2ÅGïeék ).匃ÆÑÖ¥SDQ8çAõúcŒçX'ãÊðJÂ,@ðPõdÔL¢lNE†Ã%ö²¾·T¡3;?f(Žef©|Y¡ë1œ°¥4‰Ô†–œIš¤p TÖå™Ì¦I„¬º”¿µdÜïpnr¼ím”¥Ž]”N™ÒýÅ—§—RU5UØËùÇœwÙ “â nÄa`ÞísËídxíû]¿’' Ñö³Ô¡¹¿;²M@çÌ†Š»,å²ÁE0¨ø3€ŽàK°ZL“ó¨ìŸAPùŽý±.§ÚãcÀŸXB85Ðv‹T´FQø¯aµ&ÕžP|~ßšääÚSU"Í›ðÙ£x\EÜÁten½o_¡ÛªÜV”]Av­˜{0 õ75«öFà 闠ÃMõz>DeÛTE•Ñê•)l…eÎ2Uï Ê$“=ÿ^6j¯®RÝÀþËË=CŽÓ =p6kÆ^Í{û‚sÞéÙ‘Ø@ܺàݥ׎wØ8Õ‘˜ˆVäÏ¿ÊJÌ Ü>¥`µ+UÄ!\­dÒiNüBPPVâ¥çýc¹,,ªÞOznlÝÌy…ƒÊœÇz“ ÿÌB˜Öö×ÝY…?åç»5Ôó”ÔçM Àxü¥Þs³©•ÚÌ¢:Þß)MÄ\nä¬àˆ£…}µ4ÁŒ·V7¿ÿj09ÙÈ€‘Œ|P¬“Ïûa༄“Z³Å¼Gj"£˜™ d(§!Â~ýìkø³Uö>®úu-„+ÞaÂÂX¹»×Þ|VF7›Å+^Ú™.Œ_’k¸:ç RæcOŽº¦ˆAËŽv3_a©«þpf—Ôûú™=ÿmKØsý¤MVHvðz\ô!E´GÍ£Qý¥KI¤U%`?[¢¶‡]¥:öÑÐ{_Øg?Í5à±8BŠ•ÒE¥“¼?™ðùƒ€æ ô:ÆÐ´%ê¾}m¿ØÛ‹áRóQC?ã±&Ìyߎ«#6M®?Ç—‰'é'4à:½¬SñÃèšØùèáªÅ½ Þ¢çvQZ¶Û*⻚K'¥ú؅Τć5˜p‰Á€äÓLšIý–P”¶D:6™&Ö|‡Í¦?àËJâ3ˆQ³¥X.üûòb÷&YBpÊ–4Q.Ȧó‡9ìnB»îFêK5ÅT #e÷ÙâÀ'ý¹‚vþ'—ÍÀQI…SüYÇV’áUèó¿¬Èñ˜Ù‹ø1Ãçïou!·¦¦M¨BÕwœÕ,v§ý¢'­Üñ¡-¸‚ë:Ea0%#eôB\v 1£ D!†¶9?ÎflÞ|ÁäA1 “fò“âWêä‘F„³tqÊ–³ÞH¦S<ÚBN×5ý[ƒ£*ÀaÏ=lhE<æ8ÿ¬iŽš·o¶x`â·0š’H÷þÁOèêgDÌ~ò¨bé¦?!'ÂÿS)8ÏìR˜çx£RùÇß/”ö`\¾cšû)lR ¯ÓUã”㑚`::­¤È“ köëª ‘è8ßSJ‡2^•:ONÂàÝq7å 8Ï—À,ˆË÷.ÌT±­îú¿—Ð2D´¶VvË $ÆA ~t|ùÎë.³'€¿ñ&»Š}[;DÊùç[d‚Åkî,hùøg^žkÜÙ“Y§@¦hý;Ñ©Ôïëœ%ç +3õ%=èy¤‚ÿw™,ÈwðxÑðpµAG?‚RãO©Î%RQCMÎÀF³N/Ó½P@ÐŽñ‰­Ì1D•áΗ»<§ÚÙÿ„áa‰»‘ù=êS¦° Äã“Ì}Çþ¸åÓQ-e/1›9ß}í~ˆ¥:ªãá(e_á—Ö—Û-× "¨Ÿ ƒV”ü*14Ü%§>dRÈM¡a9×) ¸c팪ŽÂ”êÂã‡ñlŽ8ðBן¹¬j„½2qPæ.I÷=¡š8˜æ$Òê°ÒáÒ~Xa®¾Ä@›Kíü³ï‰ä¥(NžÍÝ÷Ûv[¹á6—å&ð÷ë’@d8®Ì¿ÚÉSýú¶h9ç—ž˜ÎSâ}Ú*m“©@'ÆÉ_ʸœ@f° Ó°ú´íVzafhð[y (†ì7,÷¡ü4Î30ÿ^¯ŒxÂßš.s|0õ™×ÅÓR€VïÞ‡W½@r¨—<ÌøEU‘š^›ãråyx‰´Êjí` „[@ft÷ƒÛ±P/j¼«*A2ù}èÚƒ&¾IPñhÁÕšYL‡i@2\ËìNN*Îæ.;ÖÑQ·ºo½˜9`hc™TLS‹1 } ¶ûn†žQ1y9Æl÷o4`R°N¡ñ¢\?p±¨©)ˆnP«ÁYS]Ö¾†*? ?½1úÉ¢ë4cÎLê!@N³”V¤ÉuI„“H¿+c‚4 ê<µœûi¬PôÄEww¦îŽäñ$(e‡ÙÔó7•eàݵYåOL%#h1szˆL ;Íp5“Ÿ-r+ÎA6&Á€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/type1/n021003l.pfb0000644000076500001440000013171207056046552016411 0ustar fnevgenyusers€m%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.05 %%CreationDate: Wed Dec 22 1999 % Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development % (URW)++,Copyright 1999 by (URW)++ Design & Development % See the file COPYING (GNU General Public License) for license conditions. % As a special exception, permission is granted to include this font % program in a Postscript or PDF file that consists of a document that % contains text to be displayed or printed using this font, regardless % of the conditions or license applying to the document itself. 12 dict begin /FontInfo 10 dict dup begin /version (1.05) readonly def /Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def /Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def /FullName (Nimbus Roman No9 L Regular) readonly def /FamilyName (Nimbus Roman No9 L) readonly def /Weight (Regular) readonly def /ItalicAngle 0.0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /NimbusRomNo9L-Regu def /PaintType 0 def /WMode 0 def /FontBBox {-168 -281 1000 924} readonly def /FontType 1 def /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def /Encoding StandardEncoding def /UniqueID 5020931 def currentdict end currentfile eexec €5«é ×`£Â,ñùÜiš"Ã[[5íj¢5“ÇmTÊ»^”+÷ÖÝ„ñfK‰iœt´rÞŸŽmù%öÄòéñÆ9´Û©ˆí*Äÿ++Þ`[Žã&NÝfA-O!ÆJÅ"½ü|UùÃóåY+; “Ó<›úíÒÔž‰ªº¨2â?.‘¢P2QhnD´àtw•=y0)n*[þ Y]É~ ‰ÎØ×øRÿœÜzYŒiî[AX¡mŠ>m³Ü˜4<œÒЛ¤1"%ö}Æ›ž¿gˆöë)n—+f]›r§iZ±O ÊuDößnH1I­“ QžDÆ23ön‹ÕaÎVÀhÀß×Rõ®Ì=D“»ÕRôÄG®‚1¿âþßaž]Lƽ$6¬¥ú§ì½—ªÂT|D¤ÿ²ŽŶãÕñ'{9¶Å?; 44Y;UFŸ‚78Ê„‘Ãð5ËtQqw,F¾Î†EÅy|"˜ÇŽx7Öù±‹¨mp(¨pš¡­äoÔÉØjÏÄ1µœ'öcíÌKKð¬ß‘¶÷húùóg³ˆB¯ŸÍ5lŶ÷Ý·@]/'E;˜žéºhìç2 ¥)L—wš´bq U§C*=I¾a¯›mè©È Àç Cå ¸7 ÉÒÞá7„Í ²÷àAŠq—^[i¥Z—UVvè#é@õ¥ææ{@A™¥ø®—AÒÕRqSùÍÀ޹Ù\MÝû HSóœm-?ýÂ_xn+*ŠH0ùåV׊.\ q8à|Õ©Âȧ¦!Ù(¦æÕÔÑë:äMJIpžÅc&$a3'ZQé;Pw~Ù5»> <>3ÔáM­ˆRAÈ”Ódù$ÿÁ¸áJ_G‡ÖkDAíƒbÀDm J‰¼|Jl8Eå0«Ú®Œ)Ó—8ÞK®ZÆb4#¥sz×VQlóa¼BÛÂ*íyõŸ%Ь·‰„a÷G•k¸eîµ]Ôô‹®uÿwˆQß¿÷›;å‘~Ûtç®l3BRèÝ^‡¾ÓûÜ ù[x‘%( ð¸Èg³W›œÛH׃|iÓa&¸¼Ž0ìi+ËbêÁ‚±ÿÅqxÝ;‰ßÕ~öE^L½LîÐb™ž?ïã”l¨7°‡¸@ÃæREêÄz‡  D°èNè…Ðý§H=¢ûÐ͹,»¤i1Zo2^mËeœßœøÙ£æò.=:;϶]±¡FЊ¢`«ÎgVÊØìëa;=^v 9H6»© S±@»³$ù>d©ýŠú˜ž¸º CRV3ç›É›uyø}T~¬Äô¶œŠü$ #³‚% ÛäaþÄÂæ}9²NÀx¹|Cç©ê€È{eãPNï„•Š(/¢F÷Ö !à]&$° Ÿbq+ŠYÌÓø™Ú^n1Œ£Ûë#<ð?Û øƒ¹ |ŽÑ§¢­x×áºóýòÕþƒñBnâìóýÜœUaÏy= ÔXë4ÑT}’C£®³1ÌØÅ©Iûµ)ñWS6ïfüò@)ã½Ò–B°a%\“ìÙJžOo šæœ–¨¾¥ôŒ`ãpuFf²øew†¹ågû7è÷ îô>Ì%» Nç «|,(X Ö9 Ëù|lÅáÉgáá€Êú] ±ÆRóý³Ñ¨Ç¸)ç·&<àtk–ïæýFÌ FI›cW”ŸU G•è´é¤F8ÉÑà“Yš°5£ÙãUÞ8n*rû•(ónyÓ²·hvƒ!ôõ—cpæR3·hÖxC.©a1èÖÕèòßi0;)Ð'^ùU9 ²ê¿'nÌày€“Suùc°òØ GHç(Fº$È—$ŸÆ•vÍ+8‘ëiîÞ% ÅŒŸí+Þ­Ä U;(Y8Íe/ÛYô~£¯¿ Øó‘Ë’Ýa J¢¡²Î£dü*EQW±ÉÐ5Üù¹A¥ÏºŸeçmh(ì„ÒuÀþg^Æãp¹O¥ÅµÕ9KÇÙ^ù&äc`ÝŰbvhL-eIPz½áÃz¤ì‘s©ËQ‡î×á:T„/zæîJûP¸OüƒmZ[‰>ª¹ŠéútQ%õZË~ꪃŽ®ièU¶êª ˜ÜSÝs³ 0~‹ú3‚)Éó»VÐ<Útk¥®¥òTb´rÒÃÆ~qؾ+r~v¸µ~L(¤¡wÜ×ÓuÍtžÊè)ùŸ‡iUÆ¢ÅjÕÛÓ1ÉôY%¿RpjÒ`S&!ñÁ±šÇËsdti¶å_.»£õëoôAf€¬«µ м–ö ³1j”SpÏ¢;9´…¡vB£Ÿ_d4ÉÇ ¤ê£f"Ò1h“ a(R„þ¼ygKO̶b’o4ÿalžHµ@€„wDÁNÚ<ðšB¤@À<îöDíǨ—â**2”ÿ0TštËym£• »nËzüÕªãO‰„nZßwFZ_›Òäû-H(ðejKåbñ^c Ëû‹TÿÚÊÀû´´‹Üë)Ñ„ªš_ Ëá! …iįœ÷ØUÍú§›eÛD$§5=š6júv̦=ÜùŒ†î]!ÛÓMà º¨¿ÊcC—r<`Mù¢È+˜•~xx”ÛAþ7‰›ÍœiDË 4!¤ù¥©Y¡O^Éã%Ù4˜¯°•߬½ñÒù}¼ÝK„U@3‚öG£ÍLÜÍutªã°3ákÎÌœ¹övPÎzq}±_|pþ†Üæ°RXÚî·It{?@‚(W­O°:’ݸö1G C‘µ UôšmhmíQ£Ç<Û[¼¨ÈH–0 ¥±)EsM¹¹rpÍèˆø‰gÏ‚ÅGÎêÿ+5¤X³BkˆÓK^ÙðÒä„­öHDø âW}!€köfðšÚÇ>þ×Ax檔ª;ü{îsÒ.¯ÔÓ'ÇWÛì€×º-›è`YÃÃqÐ)ñÕãü2B-sÖ{e„v¶“wS”Õžï€kÕ?B»ê¬´oªov8j ·7½7&ósKÓ[›M–2¹{¬q²š®Oüƒ©3ߥ«ª>žV OîGr;]8 îQøñ¶× ÿ æ»ßÉ´þ½ &Ú;œi>2ÊTCÙ†T÷ ŠÛýÑ¥›ô§áպؙõL6²5)øì¥û˜ÇW‡§Ù92åÑÝõŒš™•بìâ·7H'®–kÕ‡/íÚxE$à»^À&€Ø4±€ëU—)ºûPøç¹òa³”­mxåÙ¢ÀµËEp¸Ïc9’Ý»EêÉœeœÊÛ6lÐ(:k»›ýñlä˜Lâ\+¶j(}+©*læ½D†2~{æ¢;AñiîK‡¤p ÕÔ¤cÎõ‹ßhó-gžïpè…q¬}éúÆÔeR8`IÕšã©#æ,Û;˜L=Èx’SVðöï?io»¦æí‰½PÀž| µ}¶Í>®B”ï‹B‹Ä­Ë°0júÀKÍ,íô`xgY‰t”Ì 3(`Mæ‡o,+Ø’nƒ)»^ÕB 8œ—å»\ÏÄDS{ã"ì³ÇÕ‰±Ïvø ½ÏX>ûáÿ8V,+­Sz[V=6ñü©SR4j–ÒâæÏ7”šï?†1@»¦Ê•’òÒ?ë—Mo#¹6×èúrÀÜ÷NgÅœScć{f˜ð!Ü 'Í™¬}tŒð†•£ª?:ˆßVøß©ôvŸœhlUd?亞¡5O>¢«=š7tMîx‡Tà ðuœJéZ0⪚˜ Ñg"vÏÜì‘IB±å³‹Ó†à¨³ä¤ Âʼîâzmk’:ãK‚¼ü×s;Mh`Át!n§>ð6&Ìú6›V@Â=v¦Îè8e“,«ó&,‹pkš·å…–ÊtÉ·é£  &Ÿ³…†°Fè”__ãô–§ 1ÕVkhõ*R©æ)z´s¢ƒ¤KÇÉájMÅñ°<Ú>áM½‹r°…y! ²_ØìýkÒsç}üîRâÀ« ]ܧ–"ù&6c¸“_HîgGðiQes$« N†ô›ËA`¬êš¦6Z+z.òÅÔt}rwv9º$lª(ª<(§kù™æ¨;þJÆøHë*Xp‰®nÔtfp¬bê, ž!;¤{m(êÙŠñgi/­[?ŽD$’ç¨-ð  :zð†õ^Cµ¥jP/)2žÊärÛ–=¼‰¢81!H+w'‹òJQë,®õºAÑt¸Z<‰Ü¸ ][Ë…q—¯†7A0à空B^±Ïm¿‡0ò¤« ®ùd.í¼WÜO…Øi1%sAî€C!ŽwÛ”&´ƒÙ?ñÂȱ§­â’ñžý[¶tA6Ë­#unÁétY½Åkt™'€pºËt·«’§¨g™Çå³.pã ê8ög©Áz³ãܬ¾Bž¿!i¨ .{ ɸ$zz>á¢= bnna„}ÙgŸ”VÍ~ËqXžª*ìRã¤øÇÔr >¡6ø%k}Ì ª.$5ð3.æâ·S‚Æ@ýš¢d†|3í¶êFÎ%†)­¯“$µ&«·WŒ)Àóÿƒ³å%tò¼”–Ö5ÀZÒ­¤Ð¨K ƒ2À«‘à CÜBúÿ ç${çÎ~rÁkv´c&»ãÙz¼P™ç:º„sà:Êz+®!#fŠdxÒµOU>Ü$ñ<›’¨‹öwã`%¸AC^Áý"ãÝ/’óÖz4÷§œ+}S,Æ;Æd›2ï0sw«ÂÛ0±²AÞP0^jœ¹ÒOÝ…Ÿ¸H½zQ2)y…vûsê–þò‚Å\­¶úÉža¢ öD‡›f78é±~øp.”rZQ¿Ù™ŽvBèÆüö ʇ-_Iú Ëþ…4ù¦Òš¶18ã: ¼„ë¦é„]ÔAT]Ñ욦)x¯ÓLMÓ™ÊQv+Qú¶˜Bö‹ì¶š­Ô½< z”¿’Màø´Ç_ë}Îät y«)5 /êv[håž¿ê“xG¢ˆî%°›I³¨»&‡ Öì®Öó±8'2ú®ÐBu´žá|gMýíN‚˜³ý!ÑþG×ÐVÃ(sdU¼Ñ2IpI;Û_POi|¬Æð÷Á*8†æ%ýX‚>¹Ióm?“U{Ýû{°'õÊØås•»Š%|•Û¹”ሎýàÇ¡,À0DÅHFF2zü¦ÓÖˆ+õèróô”9‹ˆPøùž¤uèÍ &î˜ß×H–Ž€¥k(Î_}ï6 $…å—Ë©Â5•ÝáÃË•ùl¤G£IÏæªÓ™@Wó9©ÿIÌÑm‘<+e?FëjÔ:íŽHGdjˆB{Ưaê€7‰x›®#‰‹vH$žre|ˆPn—æcý†êpe „—˜u|«Cýl—3­} Þ6¹Æ¤wpEU^B™~…ߦî&Ï €$â•—IæÐ,­!i0*‹JÓöˆ UHä.µP^º° ì¢#=t0ÖR§<÷‰x~ݪjd¯Q1LåÌÔúåzoYÜŠòYYGRú.9¥Ž¦4v@£Oí ½…¼Rüv%ž%† >ŒE彩Ãùû•Æ6áB÷„XWXlãP¼L„ɰçÃfÊoQʺ¯o–tu:j—1Ô¤“úµ¿TJÆðéý=cÎÍ7Y‘JÏœY =Aú¢GÊÅ÷\d xc.)“cxúÖŸSÅG{¾z>À”϶´Ñ‹ç/F'Å“'>©¬GDúðó#"rשÁ1#j"›¨/Á§ÂU¨' 9\™B]Z>Y¦—>ˆ¿z×C:S©;PŒ™ÕÝØ«û`õt×Ú:¯†0‘†êµºÃ—Xzm©í.¦cJ¯Ê4vgQ¾ƒØa9Ë*-½¼å~ÿÅ$8žˆö·žº³ÑÔôK+¨du#/ø/D…YWb$ÒD,ÕÚhù’´t¤„EÄnT}ÿ¯¥ùŒÝµ~qñê›–1"¡«9(¿pk-…Õ¸,ÿn¼Ô6Kv‡ÂrSÐ]^tÔˆÎaŸÁ ¿½ÏNí£?Vù–~C•„¿²tÄÒ)štòA wW¤¼|gK„ÊEêNßdKø‰ËÂÏ\‚²[yzÞàŸô‡JœŒ,n ¾=åNÄž¨Ûn Çi9é“€n±ŽM¥õ­¯¼„¾HI­9yÒôªÆ×9Ê~.4'©/œàËí{ÕÁþÿ8/§J_Ý+ç¨âô ™Ð{ØæÈIø¿¹ûyž«ƒ9ö…EDpü±9ÉØc¯‚Fƒ‹h°i IÊökñC?FDžä³%ž'‰ítËñcda;I;t_—3“kKVŽaV³kOï &Q‹àõ¬†í,¶àv×W$©dŸÐ ÀŸé3e³HÀfä’Çñ "_^–“ŽhüŽ£=¯¨Ÿë³|)öÿ6ùÅ)ï2”;ñÃÌÒ.$H‚‰æ¸k®ýwªaÊâÅt‡¿ úbüàž¸Zø°0_¾²ýˆÆšÅá¿Ëç/ÍZ:ø*Èq¹K¬ŽO1¸øŸßrU±Ö“T÷M¶˜D*N¡ØVõ¾h!“æ +_+ÕÃ?Ñ„œýÇÈ®üÒÊCrŒ#€×Ýc¹3†UR¶¹ù˜uÕ§7Ö‚Çã/R§•±Žý O(—’aï5¡êµ~=”–%aõ†„©ã¹Éæ®—ZÃj¹„¼*(Œ¶'ÈÎÐAü•ŽznëL).ƒŸÏ—‘cËmµ °nØ6ZWµ0Áqðp,ÍŠ”|§gŒ 䟮üE®áçQnŠŽ–5=ø¿C¯º·2­!謤o’pŒé +§L}Ër†-‡®å9ÁõP)¹Å÷ ™\aÑcƒ¦çÇK?|Áߟ1Ê€ÑNØ0¶ôzu'i? Ì í„$âØËý—ýÇ•îk|:TKA;§J-Ú€6ZthCr7gy²íF]MK7æå"6upÌ·žM:»§ 2ñ‹)¸˜ ŸXµ‘³ÑÿÙ콜;`•ë4ÑYÕÛ a„&gí^Á.8Î?b\W¼/Èå!2W‹jÇ&oï‚9ÌÝMFª§®–§hÐóÙ°eÎɤfT8á¢íp“ Ä=+˜iËÁwN£­Ê}ɶ"JÙœkR˜ ›kÊYý®_â_—Ç…÷€Ö£˜ ùé-ï¦aÞÿrhXÑ7èí! L4ÑŽ“ÿe㣿77u|°õ-‘Eñ¡“Æå!j5bT¶\r^<û8ϲ “Á¥;ıi#=Q½!KÓ±£/æåÐtJs¤Ø<Ó嚘ÑÚNȘk Óù•RRRÔDùÐÔ}‚æRYÊXq‹ÓX™÷¦äÕrÉ–øö&ß*œ›¸û+–…W;Ú2Mk·"AOaÑ1´Ò¥æ ˜ Âÿð@PÌñf¯…é )@·ýæŒPXV3øžw?PºÎê:eg°É ½Ëeã¼ô_rE‹Q¦tÄÓr>í™ãg»ó!-ƒíµŽ¤\ì*û²Ýµœx/½¶ËØEJüªÙÔ³•ÅÛf§+SH4˜«ÖPsý‚,²6MÅR,|ªÐÛ8Y›~«xú‡ŽÝ‡I2Ü¿rµ<):ùÑ\²1z< ëм¤÷¯.ùíZà »…“'mR¨ºó˜ƒ®&a)îcî)©ý‡l˜ªx›_gBæ _°$ʤ¿îÒ¾ÆÑ˜“)–%OuZC¾³iØ ÒcÐÄ3c¦@üÖÙ³!…Ûš¿áTóWº<C¸tÏ·ÞqKèñF™“~Åæa™ö« ¸ÇJ'£sK²«Z.À“F߇‘HE`Zcô,†}-ÉÒæ£â“š°P}$ %wBwb­›Hìœ,ït;á×$²®&bJøë0Ï9•2íw‹©ê7Aí[k^7†ÐkDéÔG7…ÊuªßyÍÇG›Ö«ÆÑ 1†<;5o+ÔY¿w¢.—Ðç³(Ü-û& 9Z#–è+Õ¤£8ž<¢¢ðS=דGŠ›wÐ@G&bÕ-t„ÏBIíÊ´¹#ÒÙR…„o©Žû›¿†¶ )‡T’¬ Aí¹ìQ"YU­*1)BÁ’ø-ÙHLÚ ²oÈ–j)^i¤­÷nÐl…ŸÝ­ØÛTAZȳjP¢ÿuÕád´Qz“éws÷¤V ,ZÓKz6CK$µ˜-e7e1DM­§tÆF4w:"@üϦCKåî¡$ü/€&‹ƒ]<—ndÂN‹+±Æõñ ]…u™}kŠáb"‡-ÞâúžEˇ#ÔÖplÌ@5²ó×3Ór–Îá£kÑ,ŽëÆwÖÃüß5î¥àSö‰?m¤J÷ä?C¯½ÃÆÚr.Ï}±LÔMÜ*ú7»Tį°†+὜¾©`\¹µvô |–7Ó¤š^6¸O·ÌûycàL»uá"GNt_pìŸÔB½`,ø+OW)SŸJa–°œ·þJÑnyý›£t…°œ¦ž§ß¯OEý,1É)Ï­ë7 7 sAd‘‚Ë9Øø„Éxä,½Ï1–¹ˆ3ßÂRTQ¼ Þ¥nPåë‡Iü€¶cÑctuY¨³„?Eré×±TÒ…=.U÷t…T}W¹î³«Ë8ÀpDÈ:2§4:¥wÛ\Dh"NÄ5—È'ÑÎdƒÅ”ý~?ªh‹²XÏFwZ#÷9Àï“h{RJ9h)ñý[\¢š~s*ì´-ù™¡/S䡈›TÜÉ«*J$'j,š+Áiù*‰xu³YLìÏq¸¤LË·þGÔ¢!uñ £4_~nµ} Œ:,Ì¢d?Ð}n7'ÜG à¼bÙ¢°Ôóõ”ãc,w½Ç’XG3H¼ Žÿ¨D=–ƒ!¨Â Û{Ó|ª®ÛU+\ü©D¢-BGQáQ[gPLÙ]ÕÆM!¿Cj†@èí$ŽÏËCv² }ç•rw¯Æ7[ÁS®©ìÑ0xÐ*©¯Žëc^»’éÃLF¾o+˜w×H Ü ºr–¼„³éê`]Æ®Á:ó‡Ðò¹×±·àözUíM"6fû»«éAÄòÄmˆcú/mgx\±ÒßøÂ2ÑS•È]ÆŒú'ýT%‰9ÐÃJÌF'Cô x¼ð_ºñG¿›‡!kÏÖDVŒP!¯€WxiLÒïúLÍ}/±_£yÂÃBebϦ¬q°Û™å@Æ7§è/û®0èÀ­L°_Ź!å_®œ%%#§²§š¾š(ŽÌoð¯=Oêêz “¸<ƒÌ­½r£Œtp…D•YXÄðù)’¢“Ϭü<‡eÃD.¸Ê°ørÝïrb3(ÑVï9o6¯.tcHÙÛ"D" ?'­'l~¾›Îæ~hgãœV¶ÌˆÀ}®ª9¢\`¯ïeƨVu|_ŽJè¢ò;ÐnË8¯y©Þ;_°Îý±*¹YéÉFQâϬ+è†ÙÙ'Pã…G`Iv´*D&ô³Žó¡Ý#ª”Ôlší—y#ü£é„˜-r¸ûùœSI¨hÄÿÄXEÖFkô$#/ò˜ÊPÿSÊþ,‘$l"6´ò´¿¼aˆv$Ü#xØMÅÓysâü„L‡Å‹åYÐ`¶ðMÍ<וñi;µÍÉ_?¸kŒea’Y/ÐE»ý ·ªÖ‘9á­ 7¥u.ZÐRz•\X@çÏ HÆPùç !4¯÷Vÿ&Eu”Æo.¹ä°,gî¶Êu¶©7܆Co¡$NcÖ¦(¼ÙÕƒ>-öÝê¦ðm^&,PïÓLNð[A±HF”’÷Þ“3Á·v#ÐG/7€Üšóø9H‚@Ñ`¹ýÕ8öXƒÕq~æ'G6 ÀÆb`E‚wò²…S_ŒgåßR+É|´‰ø;<­Y–,H$$Pá ëñÄP6Û‡†pM/t“€íoØÒÿéÙw]ÝX}ÜŒò·¡ zÂf+›ø³ÿrŠ+ü7šH¢Ê±à¤Ç…MØÿŒø'þ,Ïý³›ž³W lÖ~%óN®Î툅Resºâ-•ÑÅÜ=PI1á½rþ?ù=µ÷©H×c—Š)0¦ãÍ*Î_êV)X9•-÷!YØkî„›ãÕ–C*1í~ж6D„'HäFw3týNQbÂϲ|Û²C ·”\ªÛŽb£l‡Ÿàµ-;a~ åaÌΟûã{d•r;É<8€ ¦ËQo‚Ï#©«—Ë©t=„~CÅZS|6uÎÆêášaY‰ã®+t%]ìîožŸÍe›‚þÃÃb‡Dó”K»N $T›ÎÜå°ˆC®ß—5wÿrmLý*›dåk±s ž;˜¯Ù ÙÁê([Ãîù`-Öfó??ÑXàéÛæq1ȹxLû³Ÿ+;½Žž:?„Îî×ö"tT ^ Œh‘ï*~=ëSVaëßšz˜ó]k™ò=(ª8yÊ[šN P¥—M-/ðãYêdÙ슲ÊR³)‚ÎX.|jkL·´)­W¯Ï”ã;o'Ë àcMižl§ôêth›.ÃßA‘bwdŒNˆÜð(8¬$B4䯰êVP|=C zí¿ÍjÕà¹P¢ åMøá³Pá<¯ã2:†§/X{©¡MLWeÄ­¼´Ã‹—ûó+xÅLq‹+7÷@*hw††çÊ Í€[­%BÐí”Ûî¦NùzwCio‚5 b"òÁúZàS©+•´€<@¾u+Y_T:¹Ãˆµ!£QÇúÖFìÐ΃Ù.®êÈ<øEiñ† +} 1ã…ò“—ªˆ lÅ¬Ø å_æþ‰òK"F•Þý_ã¢Ìd ò²ú®Pé¤6 }©’×øÒ¹S ‚2N7žkD¥AÕ³ßÄÓ]‡t‰aJþK¾øÜáºAåñ±ÁQÌîîh}~#ëÒB—õ„¢Á%¨íüñ73ãQÚäqglwk&¦Ø<™÷,F–Þ:WIL« c#4»T7÷Vq‘)ÜÕ`ǤçþP|šß*Zeœ‘Žª\tT÷|˜×ôŠíÛë¬EGÎÖ- "{énÍY(²ó"ß?í{¨Z 0"¨a´¬ Ç›4´‰0hàwÑcZx£õåƒÆèY²¦FY¸9xi›ˆú“õ?õY p è]g`Q`wƒ0ïω“2­Í·Ã“–Ôà·…·€múÑ0~!‹'Ýü Œ2Zª[bï\l¤ÞNû“l~Ï*çq_¾ò8a\Y{ÞÇ&hüòm»šÍVYùí"#€8s{UV ±Òa#jdÍ;`Ï´xÛ¡ª$çJTÞÏ8µö‡EHè"ÔO4êlŒi-äÑ’.H­4« HyüHë; €ŒˆO8f««¿Â[3LúôïC÷ÇÜÎÄÙ‡NF0Z¦_NÏÊñÃ![67EV5”yD&6Ý:cj¿ Ù¸…FÎ*ëx±&/öJ§¼ >ëÂÔc¤až=r‘%Þ¿ )t SÏ”þp|7rD® hpÎqý•Àì§;Ñ9ºqœØŠ^Š+ÊÎŒ–®v:'eÃ^iw3,Ìik0%–7oûËáÆË.ï“1™Z÷€ÌàW°Ù x@Ö݃<`×Ðݶ#`L–æÝ\¾wÎÖ8ƒQ4Ýß¹y¬%ózNMßîª'­‘ÄL(ñÕö˜`cdýø; ³gØ¢ ŸèZƒ]F¦M%¤]¨»–Úµ8iÔ=­FGæ1&òÈ8Çp—Y®¾£?¿îD÷¡˜-¦ÈÇÁå3^©waäâÐB£æ€2·,4í;Vj›kS‹O\¶ÚŸ£vLû]¥Bí#Üí/Ë!°4Z3ñ/è­L_"˜nR¨³¬Dew¶hûÎΆ؎ŒÎwÇ#T5!õ,œgØ=Ÿ¤öšWì ‘ò0¦¡t¾´@h½×º)é®±Þ{<É"€õ§KÖC¥aÜ~¬² *»8•qkÑF—Y“æ£áìa#nË»mš[ã~ê¼a)ˆ¼géòÓ¼%!èY¯U.²¼û[ÜãßìdÅ©çmö3¥Œ‰Í¼ùi7I>U»¤ŽZ#Ë£Å:ÜÀª •PÇ5QÊТqEž'³U¡UŠÌKàLßÀÈ/XÑxjÓšáãÛí¹zÎGÄê|ÐÿÈßœ-RÉzÜ©Á¬B·[üv~bvu|KÇ1Ó*÷Ëjó]*©n+U‚׳%ë†íH6v{¤¿_úøC¨žÄ¤b,ñÆBž{›µ²d9ó(ˆ"î£ç-ª ožŸŸ{š.McÔ8×Ka{HYwÀ•’2I%,¥MÕ¿è°k=¾e·¦ Ü¶ìNù}x€Ù>Š{^笭–´ýnBØ,FU!Éq˜%£¦(Ói{AÕHLè6"ø ¿nD&ËpªàÁdµÃ ¨ü¦îÊ €ŸŽð¬ÌÆt‚¦YVÅNb6+…i…vIÀØÆRêiØŠ4 ƒe¯NL‰]ÁTvŸÞ¹c=3öôÁ—iu­zÉç~ @·ÞÒì°•Y!öÝ癫…u'1Q ¬æÆÀCÄ|ëaÉi X=Å“9Wú5Ê_ÐèP±PƒU¼ýü@U Õj™GܔކÙÒ’!ÿ $Û$¢±˜eK ¸µêÝb“«²º&2¥&Ê8ºòÈéÒ—{s²!?G±Z´_ÿ™DTH -ìËžÇãP0ñá逜é¾öCL\µ‚9Ñää̪‘þ¤ï¾‹q.¤FÄ­ÃgEö¶ö¡1Œ¾M´¯‡q¯A\Êpàþ1¥ïÊv¸Î¹ªM š ©çþÂNžþ#ýe4Z?æ[¡62Ön°þš< /üTc EÒ¾â“ðÄzÝ7I*ºË¨svå»IqJ~@g¿0\ Dá;‚æ°“ÕŒ„máÖp[tŽ]¢jÇЫÒ÷™ž‹æò”³òož}Qî–áa·ÆÍ¤¸Õv …b.®^ÄØéT[ÁÞ®¢¾×´;Qu LÅ€6° oÝþ½Ù;ìˆÑŽ0Πõµ{bXâ½+*!ºIŠH¾Y=9Þv±iûÿj}Ú„gRþ1]:øÝ4/kÑôÚb“¥ðÅ×ûžQàïÑK‰Õq:Y’›.ÚÿöóÁ°qHáï;>¿Úe8î¢[·ÀÕõ.p>¶óòw# 47o5·uÒ—”1 atWcüﵓâÞ­ÇJ{ AJò-=ÀC#ùºâx@L^ÞOÕÌGÍ V¡Tòõ×¼b$A1Ì”h®N)ç\[úë Öá닾ì9ÜmOL£Uì úÕø‘"­æŠ˜@¦¬ !µ(üI«aŸfðî5ý|ÿJç¿»4êºOq­±Ø¢S½¬-§*^tâWä6ò\KÇ2Ï!#ÄcF'Õêw8üPäý£“3ÿ¿§Ó‡®©åÀ$ÛŽ2Ÿ@v ,îÐ7+?Õ% ‹9ø#Ž€¥hõ’æ½wb¨k:œP5¬m¬x3®]kJ(×ó¦v·@ ÑäÖ">/Ã*—/’·aR¡86Äs‹jRÿSnHýùÞžUë„Ç. iùÅŠÖ6Qâ®àËa€ÕÔâª럠ñvÍ#–„~íÑ sLRþÀXr|¢½nÚ«!ÒD‚A]”Œÿ`$æ\#µ²úfÌñÿI™_W“]å@M/ä”°«†° §Ï¥„D“£( ñ°“wÃ(ÆRç2l@ ΗÓ8Jjï2*Š”‡—S!ÝEŒÛť̗½ÚëõÛÃF šJg÷ŠXÂãVVÌŸ¼f¾W”Z]ñ?R2u´öß'Ñev¤Œ¦kQ æ57d‡ •oçÈ ÖÏC¾¦D‡¾DF­EnE[,Ä Ï@ûPë:žOs+ ó³Ænn€Ì®«•‹ÙwM”Kç¸Q_ ÆuF¬HqÄÙçïÿM ‘Ðjï~Í@­k>ÜC9%Ë © $]åü“ˆ²BÏ›[“Ìò–¢ðÕ²29jEÉl…ÏÝ Lþ’ËÒHäÏO©sCr— ©“X,&áÌ™Ä0ïñI®>f®mä„„Ú«¨6ôaƒ¦q!Q“þ#øhÅ +à‰t]”G÷l+£L¶³¹‘ÚCžŸŒÈðÜýDœšýF?n»œ}ë†7<8¦j iïõ˜NO+þàétoxÝ“Mlö\¡°9£„ì•„pcû™+—®àQ‰Ñˆ\iúï­xj.|O-wkÀk]¶ǽ<ü/}S–ÿPgs(°†õú"AКA~TÖmQ-Ì45š[Ð"Hh½V¨‰ÊÿR6Ç킎ùÞµaLmqŽL‡I2ðð½À)ìúÅáÊ7ÏÖÈ‚ %U•ž[ªæó ¶¬R‚“—ŠwڌϋÂó²@h5u£üž€OÎà]?˼Á]ß駯³˜aCr›ÚÛBÒª9Dg zpNR¨Ë11@Õ~ ‚á73Öžü@·qV9 âŽÌWª5>‘¿ü{!dZì Ó³Ïc}ž©c. +€@k%3=0bÍð?ƤÂþŒ‡Ö­ø u[¸ð9þøûΜYèWñ=‰:úÃ#9;p ³6ZY']ŒÏ›Âªýp[u +0H€iõˆóòÂÛÆ<‰“Ñ®†TθýÈ-:¦Ò æöMB³\ø®HÂ3!>¹$[8Ûš§Kdžô2Þ…ÙzeŒBCàN tÅ ôT.N4¯SÂ8À°=Âɯ¡Šõnz÷—Øa_ßKšªK…öÀ"°B…UÌ~Y÷±ÔŸÁ}²c1ëfÍè°¨9 „Õý*á¸í?„èn§á<}V·p+ÏuëcÆ/W%†s%¬ï߇0Ä¡&'$õ›”µméžšQu¡ù2/†¢ó‡ùˆl”Ëa,bž{¸¸ý^+ÙFéœ(A‹,)«h™¹<·ÃϘ4–‘Ïàl@±}@Ý–zç± m ¦~ߦC4ãí¢#´û{‚°þîÂ0ÎL‚+AñˆàÏs‚ƒÎ,bjJnYò«MUY­‡ÏM5OŸo@Œ®Ý<ø'sí$~Ÿ¾Ÿ EgΜڢ³ìœØ F[ÓOÝ0kf¹5^ÅaèŸôSIð0ž¨¥ð§®ƒË|‰Hø#Ã$cSyc þ‹Ù"ÂÙ«ßÍθå+';{Ðh @ï£ëû肬¢_¶ög$G75&; ûêYÙQA[Â9œAßLù—¹ÒüQå’Ô#·Kwçm8`ÎßÜœËÓó©'6‚ [¼¦ècþMûÅ…gسbONëÅ|FÜ|j»µù _³ú4¯0êjÃÙ‚ñÁ×aëR<;3d6_-~Ä'æÅoë!îÕÄÉ™FÑÁB; ³åé¦Á;;iÕѤÜÕ…2V0ŒlÆ4žm ›¡Ž$¹Ý‡'ŸóÉ3'2·Lè¾Þ—¡Á„áöaMç+¤5éWTÊyœÂñE—²Ó[uy¨•©Ðz»Þ·eq ָ⎋ÜÇ&ËM;¶”£Úd¤¤º³_£íW¾Ëó±°-zkAu!'ÃõŽó3Êg fJn¶b~Ó­zŒå½{oIOjÍiUv ½–“á°à‘MWÞ„2<+±‰Ë|¸×nã£<”£¹Ûm×è#SN¶¸jq*Q˜Ø­E¢¡ääb¾MB“ÍŽ <8Ï[Î D¾H%|Q€û9©žìL~AÒÀ0Þ­(ïÕ)hÁ8ÈYWt‰\Ä DèØ [Ù=øŽ`ìã§+jèÅÑulœd毬¯›éštz¼u°GW&¬ ¹.Ê¢ÎZø lSö‰©Yžë êgIíMU¯ ·â(j°÷Žf„…¯]Ô„²÷ª2)üo1:Τ?kk¢"Á–_Wô ThÕ3W\˸âBBÅŸ2(#k½Ë¤m>AýÊÊb‚á€OÛÛk}$fçü8ÙJÈLÙÈßgšåº¥i&-U7ý–YÄ=X&sÊšhozX×'»ìÊ2( µ'ÙÇé/ç’„òZ~\Ú!ç×……ÂVN¥ÕØÛ¾ê‚cœsjñ|é8ð ª5áâ"ú¤Ò(#ÇÜÙ© ¼éjœéÍ QB9]4O X¼j6놈×èNC‘û¹ £°‚9]åëïxÔ_B7¸‚)§VøÀ½Wô÷q3m˜\žÏ=é¶ô?¦¢·Þy(Þkzx4YGO…2Ók2š9M’Xþ^Ní‡ø¤?å? ã)ò ‘@Œš^n)a…Öq(¸3äÿµL1œ÷˜áˆ¹ýxA·Jʆª½áŠZøûíëJ~âªC²ÛÏÜ&"\r"Çs±G )IVk§ÈZÓ-þ<çƒÑpŒ{›Œ›Cs,|ÐÞùÏBò8䵑~KcØÃÆáÜ¡$Ÿ1uæYdš òÓ߆ý¤-€£½F—Ú[ÓF³úîÒÈÒǪGº>*íÞUœ”†HéÑ·»æ¨{NÊ垃‘yïA€ä×3ÐàTê¯ßµQO3„ŠëЗ ö÷GlCÚöÆ-ƒ›µ.$rs¢ó"3ÂÆúè—>ɇ·ã)©ëg6­æã÷Ó„U¿öŸ½òÍüAÉB¼)z½?7ºËSc‰GÒ¹ws¶ý Ó±F£Š!Û@n•‡t[š+éëÌñJP\«'ˆ Õ8/o™d;žbGµû±ùàÈÑ]Gå…L« 5Íò²¶¬%z!Lj‘ö@&í³×<“uîx_DKþÎ닊W³ ßÀé¼cÎ|û›ï&9¢ÓÂ×Öfhׯ‹¥#ãà²Q¼–ÊÝHx¢UÑA·exí7Z¥ZºæuÙoÄÞa̱˜ÎãzÄÑùÞpÕ; I1=Îïd©µ-n|tçZo(ø/¢Y®´Ÿ¸NM09Rë}½X7îÊ!‚4yçkãtŒæÎäK©”Ê9ݦÖÉ´š[=¯åEFIÙÔ9ÔU­!ýÕ£å?u;³_>Í +<êO¦ OŒtû^U±·Û~"ÌƆ;WÜÛÊ¢qjrxÚ“?yxP†˜.°'VÛG% ‰CoÒ鈈&(ì)ær<ç¾/k åàÝЄ¬­·w¸{óƒ•[§ÖÜgÖè Ñ8 vçÅ2J§s!»³ çÔ|xQƒÅálœ’Føßú P ›X¯¨‘ÙÝux9IuÉ(ø´ô²Â°±]øË²Ì ±}Œ?.õ7íàÈí^„ )RFŪ!Á»—ê°èúÞFˆS s-ÈÃ\°†qC ”¥«‚Æ_Œ§ÀäðAU-ÿ³ÏaÛû¦¼Ümÿ!»°¤2Áf{e\–÷|mjˆË²È™7!5(ªȪ°FóUÕ%íÄ8q·nwµ¾;ë§dgm¿ýÆÖú![å3Öþ‘ŠÐÆ¿/ÛÒŠ´åÅ>?ƒgc”af³ n¬¹|óëlŸL* ^#ª(à{DMx¢';ö³¤z[м7Úº‘:^W€äÂc&gU°|–ÄX‡ñ«ˆ4‚¨’¬\^~¶¯qݶ¢V#‰yÅøÑÕú—áKÃ…3J§|‘4]Iùgd»òg\!"/ƒˆ¦Û¢gRô!®ëûÖÄs›o!Y¢GíA®is_8Tø«ÞºU"70ãmœÔÊ@ž*}»x¿Ø\W$ 0 †!ºþ+P%â9IyýÌñd+’¢CcL“Bk-íýjÈ^›  w{ï«$ý•TðÈ D…¤}Mæ=U“©¨7X ŸÙ#±@õUO˽N.8¬Ç¡³×T}vþÞï±tÓ0ôý.Ÿì#Ñ®ÂÝÌÂMìÔ•IOÁø Ͻßtõ'™i‘¬²ok%hIÄ.3a<¿žJ_F{DÛ(©AøÚðÈÑ,CèÆùf]~iþÙr Õ¦vÞF!`îB£¾!Ag°±š£jšŒ´; éÞomƒpkazŠZ(Îþ®Ï(/ô#@®"¾l™û+‚€Zý7ƒxçyÈJu¿éSpWhÈ(:ÉÇbøC’î¶Õ{™X‚n£ã}qBû?g}Ä\ùÇ LN6hJÇ…˜IíYª@r èÖL™éÊN¸ÍÑÚ mð@r?çuI~àUœ>—Sú@WîX|ƺ¿øÏ; Ô»ÿ@£¸ F¡V¹öáë£éÞæûebA¸GÿP_é3¥jK³³h˜ö¤ÿCÓŠÊW®%Lï2¤që!0SY(„À–ÚK¡_ìñU¯Ÿ/¿Kks`„¸6“Ê ¼tש½Y6ó{”CÈbFo†2þ™†¾ëƒöF­t…ŠÒÈXN÷§è}í OÅ‚çБŠt𞬠1Iø,Ç¢Þà¼|ûbÇKP•]²gÓª^qŒÅ¡ð­¶Œ|i²à0ÐèÑ¡i¬ —Kt’ö,ÍVµËÙhy%ä+Ï«e¿ñ'øïWc1[ÛèÐÀ÷ØAg0¯ä,“åÖ™‰a %H%ú6¼74bÑ…†ìM‡/‚Y(í )(îõšp@Ë‘ª~ìVnœArÐáß}4.¤ºï"¡—Tt¡²—f"Ѹ̱¾¨ß.+@·[Âlè»Ëm)"’"mX/jvLÐÚÏ©©ü˜‰’¹ŽÛ¤ÚiñV\PS9ïb¨ ðÁ£}äÞ¶D¡_[ÞÃMiýÅ· OWóÉ®¨÷#ÂE¿Þ¼}á3T¸jý*ë>|BÀtè†5¶ÀÌ׼ȫ“=(÷»º÷zw×(öŒED]«€j›¹8³q*¶[>¦±qF—Ó¹mËgÂ,‰yV8¹Ó«æŸô¹²uSUfŠã)0BûÁ’·ÔŸ\å*r©b‰Jº+»¹µgêÔ[¬.$Æ– ÷î´…zŠîÁŸÜ3ˆõ¯…F[gØ4 /–áSï[íèZì}¯vi«5´¬ê|˳ùÚÛ¹¨å¦Îו]®)dš:ŒwÌÔʲé(—W@k²Eœó£57ƒ[{|78m89Ö‹;  ÄW•3}ŠEjõ„ç†aäd@Röf¶R·<ŽßÞÊiù‡ý(7Aç#po Tã¦p¹Â°Î¨Àžd3„uèál¸YÇ¢Ço='E—û6eM¸%uÕzø'_°E;iTï-KšE·0‹”_ëg¨Ž©žf¾ÙB Lsë㣚èIâß/÷á?ø’ŒJ¢Â&:zŽ‘W!ŸzÐÐZ‰m~‚“ Þ€ÿ-*~ä÷®Ø¢\Øböƒ{‹g_‹>x'fjåUœŸIF`í!JÄŒ¸“X‘äì mŠ}qÖk <È’þ*V€ã€M­E¹ÀÚ'%YŽêU²TG’q¹ñ=Шžùe¨ÿ¦ÌKwêÙüú¦[u§t«©…\ÖûŸ¯F`¢ÈçøÊQéÛâ–IS‰°Ùä\í¶^ãLžÀŸõÜ%Ž!DtÇìç3OsÑg»O¤øªÂ5¼†6ˆ´>ü*ÞŽ˜ð•üK3„$mcr9FŒQ‹Ku*Ó(¬á›–Áº¹÷Ü™aÅ*ÖšjÒäçF–@þ±³3s f ¢DäÄsŒý8dšqw¦ÅfÊíÛ5æ¹Aîz·6ñ«.*H`·`þê^úæ9ÃΧ؃÷!Å-jc(R‚ €| ê·æÖË™qíǹ…3Q³VvHHœ­ýÝì~Ìc[œ@ÀÒ#ÿþ"\ˆ¦Ùì{ú¿²·_›Q½m~l§~6k+ÖyFÊËéPˆ°È!‡“ Éÿ+CïeâD/ú0Zì•r°4è í×ñTm¯‘§Nõú©4¢= ¿dj¬N²ø©õü£›íÔ1D†ÌŒR¦>àä\êj(ÎìÕQÕiTí´{ì3Ù-×táºùî*d UáHCêfËdC4†€Ãw ÿöL¥\„n³êÖ Ôãü øß*^¦î» 6YAX™ªï~S¯ÕÎ0¾“òÜò5V¦êòŸ°Ò—O N5'%[òí±ÝáVï*oO~=ù"¹FkíÊš5y*!±!÷·õ œm*ÿZ(=œ`سša‹ôMÈ@ì¸I¿Ì¹§ƒvG¥·¶ìJØ0€X#·§ƒxbÂØ†P£Ó‹ùÁ.77o>@`òЕáò”’ï€râXÜÑibAÚ5_,‘¨RPy¹}v K²4ù^Qu Q‚Tl¥öke³ý•ß0uˆÐ¥a,a¤­^)Jo=˜ë½‹*/«ÿH§ž—ü~z« ñúŸœrJwßÅ>RQ<ñÙÜ•Ê{ÂXñP§ð”çÛ‘é‘Eñq^µ·…Ò«hcª‰—+øRO€Â=ƒšu¼Æ­›¬W&êšKÔNŸÍÐÿ‚ BD òò)i€MZˆÓŒ #ÑE8]‰cƒ´•úWµê¥€d®#ågük<ýv—>À'ßHv…së¾ÑtÍ_LY#3ÆÞ gà0»Ò67 –®£º¹$Ñ–eŠv:ŽÄ(Îà¹GÒåšÔü¢Àu99Íæ*–)0ÓÐê¼u¬bÀ]ÀY"MžU—{܈öv2?ÌÀþÍv! ,~P„ÅØªlÓÂQÄ9»×º8Õ: 2)›¾;Ÿøfg}_ísïúý&fç…án‡„ð™ÝQpíïbªC‘ëáQ<†Jb*RÆDôÜ3Õ^PP¢ÏV=f1§rÐáTÇ=ypµè'! 1´WǧdÛb= ô7¸@YvöDÖ<#ÝÚƒúMÖგYå¡EÜØý­5½oqÏ’h°CwéÚØé¾Ãß’ÂñçïѬê%¬¹!™Ù± ‘QƒchÑ¢!Zrë Ù‹lªÀ(pciXüŠ®|¬©Z;Ψ¢$=ËgÓ»Cß’ȲSÖE!è.ýx QÆ)¨…"T$¨º\´N(`åö@ËóÇ.@xSÑgÔ]ö?dB¡Ð¤ö‰Ýn§ÑÞ—ø\WÞv\Ö²ó@0/]¢ZåCÜ‚mÑ´Õ¡Ùÿ;±R9ØÒÛÈm$Vo* ¦ë¦<™ý>‚¦lùàèÄ3Æ/¿øi°„ â3ÀãC»D™aƒ;¢’=ªâXäk"Ï€yuiªô#Ãã©þRîjÂDËhö”U–o‹X¯~JÄsÖSXòà<Þ¸À6öR¦« ˜0ý.(âónèÈöì1p€à`ÄÉO[TÍâN4Mß÷/»ˆŽí\]I*„8ïÀ 7Ôz&Â3£] 0`x’í’\Uä°ßÎÊ`‘À/Üij…©0HÁ ¬×òT…Àw›>aýyM¢™E_,Ää‡BÁn]æÿÛØ× Y0 ´h+µ¤_˜¨ÿpŸA=ñ0ÍMS´‘5ÿ§£ü~ùÃWNµÉ¤ƒdôÏ´›ûÌùB¿q¥ZÙ,®e¿þW<Öfž&iÒ6ªÿõfjж÷0šüÀ2õ–-Ip±„›O5 Â7aþƒÌ…ÉR%“í|ž*´°ƒà¤ áþ5¾À—M"Ýy®ÛS{jÄÓ˜.À^ªḧËrY^5—á{ üP Jý•¸á~ƒiù1„-M^®¯¨"­D0@2vV°ÒÜjM$…˜—ÄuoQ‡œ±“z[#:·l dɯ³Ü]‘:ݱ¼4˜€9‘áyð›J®ÿÛ Af»Ã¨wQy¤§ š|Ëñ߯•$K }¾á*>¼8 öމDlý?¨ïs¥5ǹ‚Qä·¾ú_j…÷N G̉GìAKŸ(p²õÍ÷3ºÕ ÅeòTôˆ/0³W>a=]äÏH;Ïy•u €Ýϗ悸qËî Ÿ/—5lóüè9: ™€ææYÕó£CÊà_êÃQ€·§3"‹þ*úµéð=Ï a>Ü÷;›úNäø¦ô¶ž¯ŸFz‚òÅÒZ-1daPª›ø†c¹~ýJÝ—D¨ÂÑù×_e XÍÔµ75:˜oã¾Zwåzyd†2À+H.6PÙ oµLí[Ø"Ò'º_üY÷iÐg1Á¾g“°{~xŸçÃ[X…Šðœ¶Å„;‡IX7O.:~‡*èŠv<š¹Îfú¿QTEr™AmtíÖ*wÓ pꀞ³·—²\øóãzÇG™òÚèÙ%˜^·Í·§ŽÓîîªòš®u|9pÖ÷]G¾îP]M ‡ yj> õÒÓ‘pÎ~S<ú§øHnó’~  “þ™¸)|+˜Æ!]KP’S8ºYWŒ™e^’.´ïÄ´&Û(Å3<äö ø‰gv͆†¹Tð<áÿ™hï:m–›(3ÿoH¾A_³E¶?üìØl†¼³¤ßÓdOIÿUg ^ûÞbÀÓéŽYMºz´Öþ¯zÈî ß²· nò†Ô× tareCÿ Ó­ÊF"™ÙÊÎhJZÂ`4N­¨™ÏAL¨„çX´vƒšëäA-ßïŸð°¡¸ÂM))‹"Ë(Ç K¼8J…6¾>âõe{…M–¢¦†l Zöî"lœ Í]…»nᣠ2àêàµo£V(¶Ô¶„¶Çk4ú­¤‚rS=ä§3­¬ÔÅê­Ç2¢WBŒ\zánø[UŸ° épèñi‘ .^Bü®ÝqÊ6¿=IÀÜð¨ÀÊ[i®1O°´‘¢²)I;5ö:â]»fY'ù{(RMfnÃ>K¨¿¬ÚpPÒ=”TÚØZ×±j ÁL/5í®Ž”s?çë$"BO>k؃‹•hp\aÞÅÞ7HÙè‚ð3EʆªÄRÈWW%ª%ߊʦÀÉŒÚmÕõ#²oÛ¨*ä7jPM†÷ò™Ëcèíbɤ%ØÛŽÀÈ”@d!•îîÍÿsxæé‰o9j[¯¸ˆ †!ºþ+1¶ `‡` J‘•¥0é|졦Z~=¥5•.ø•%’gŠÎiýg*gËzˆ3_µWÒ)ÿÐ8Æ—¡®æöbfæ¿Óäš3¿ åè'[tûZœn³’=Ø'4ÔG¥ßsüà6—ŽŽÑCâ\büÎÃð@·ÁßšÛÈ?%]…'n^G÷„xí”9dsÂT6«²Œ}ÖORÑ»Lv3îþ}ãÛšƒ'èütÉml nåBÝl‰ë£”І¤*ŠÊì›è$Ñ"y‚Ãá'MËVq>ÞMí|™á òw0Êc¬uX‡·æ¢%9«ph€Ï8ój,R˜9õ¥ÚƵçü¨tŽ…ÍOç+’x+Ú÷·áÙQ™n¦£ICÍŸJþÇ å*I‘“LQ¦‰6M-ÿn[î7[~¨ Ū6ޤü¤4Ñî£Cž¦9Šr` 'ôÊÁϸG1¡ _¡\·\O®ç„?a«>h„wØÏ#D£°^bŸº=¼“Œnµáðkí®ì—èü”°%|jÅÍSàdÁ‘<Ýßëx°ãÀ$Ï5 n›_{qát(ïjY/ƒ> ó¯àNGJ6v¬­Þ0ÚäæG ë3Xþ #°«ødÊÇ^KÜ8Û÷dX¤Y¿8®ûÃÄÇÂȸ$I»v¯ÊÎ@‰¹¦ƒ¾Äbb1&DÃ6Dõ°]õ›°YÜ1¾oÕ!u„í›e£)À4 ù¶ [äê_%R¨ìœû˜cIN ‡§%õ ‡'¥]Å8KáhEGJ_Äà˜Õ§¨uÚ…ƒoäÖ:ö†ŽþÚ߈­,ûY™c0|q†ÈÍÉø¶&–pÂ2ÕvBe_íFÔ•*OÖŠ Ã/æ9Åf4È=çädë¤XtUßlÆôµ™“ÌcG[»ŒFÔvÝ]½ÓÙc85±áMµ-Ä£yý©÷¿¨`UÛj HQ¦ÕZ†Bõæ9Wyç2-ç‘—gÉ%œSS~—¡Cß„Wª „§ñï³rÙÎâÏÞY€ge/@EWÛ‰Pù™¶ÜƒËßÿ ú`†¡ õKëá ÍHÉAN@Bßµ “ïT:áN*´ýý@ÃÑ´ 4hìÈá”ò(NôšsQÔØ§ü°vMÇÓç€åD°ÒÁ6%¹8ö:¢¨~©"ú–ÊÂöGcäffìo‹ÛÌoÁ#Ë|‘;u@bý„*"8‰äW¡÷ ×’’¶ ‹’—ø¶ [ä¬BxtcµSòëYÛ¾åãs^;¿¥[sÆÅáe†oÜ„+ÒU5цô÷Wú5†æ¦øp³#ôߟ«[©ß~Œíë¼4Pë—-ß)=˸ßÞ3ðœ0S¦ÐútxSúmB. Âu4I.9¸ñE iŽa3ÌãÒc»Â¨{Xä/@‡Õˆºú5ÿõm´­Gï }”bpodšn›ezÊÁéšµ–íºmøG„^ÿMëfœÛz·$iŒQ©ïô½ÃÄ#HémV‰Ü]êö8À²@Mfj‚ ì.°Õ¨¥l0QNyVh2Ÿ+8?·ä.„›£ÚhŽG[æÎúC©¼ÒÿµóãªÝlGzÞþñÒÛÃ9I÷ûÉò‹¾î·d…Rô8ÇÌcä=T© 9ë[xe»rÀ¹éÏâáÂÌ–t¥Ã9øŒìîªx܃‚*‘pƒ,šÎ |€7›ù’ÞXˆ¶ åÚŠóéçš°¬Cxôý¤m}3›|e!³¼N¾Aï_“g?‡îC¼[]én=`šÓ4rz€¿QITÑñ“ñ»•#ã¦zôø†œ­‹“Xñ›þ6æçôL½cËF`q¿ya4›$§<ÒI)©u£2Œë%JÕc¨0™Cà€l\‘>^Í·jKަ(A„Ü{>RÍ{iW‡-*¦|UMcÊ€‰IŒƒO `U¡ƒ8|ü¬SMªßÐXn“°³“~Ñɦ–ÏWj¤,2‰e¸Î<£õÐvj ÓÙÞ¯öu¦žÇqeÖ ‡Uo`û‘)'7|Li­ ·ÂÒ*>1‡¿Hû}ºT&–mê„)(aÒä\p<=8Ò oˆæL»ávJ¦ŸÄ1YìÒÞŒìä˜ìøŸý2Çoçê?Ø45 VLËn£–û× azˆ/%ÁµôxI£t‰Uàè%®Ú`_;‹@6 l&”Ûºø‚øÞ°@”O4íÖïÞ˜•8§× b Ò ÷œë ¾QBLг‹žêÿ,IbÝjóûèÇôo—}zzÒ|Ð=våj#@rq!Ý_¬o­+q­4ðîDÀˆõá×ì?b/RQz‹">?—¦È o÷BDs»þ¥TŽ/&B^ßÛ^³'¡n`Hü¤?¦£µb²¡.þß¾N”ôÈØ±{ðÃzkûá2P& È«ú€°tš òîfà]zÏii}ŒŸS°ta”’IïɆÕVÅãHç£JR‡-üfÕ…®1€5©^j &.Ê”Ìa¥&O¥½©Q¨ªZ·DŽ6<7 þܘ?3’¸6P»õ Øéo~Æã›‘äã\Â:ú¥ù¸Ò+\w™M’ùJ„©+j¡Ö:¿@ûbÜkÂ%BS†u¹]Œò¶Éœ¸†8 II9;ðn€›kŠWì‹"mLî óLº£\㔃=½>{‰2ÜË(ÚHjYë›yæVBVà°ˆ{u—"§´€Ž/¸Y¾nÛ|»Ó\­]˜ÿåÐ_j%¹&aoÏlܘŽQH¤64Ó²±ƒ_F_¾.8²l(ÓØÅø(Iêmã¶ä22±c°FV0z~ݳU¤n?ÂÒ\˜1F”Jj~äÓXóã†Fþ‹:d ·7Ð$ŒVLÇ\M~ÁÇ#³0d>éË)rš©³6”•IAÉþ¯Kï—ø‚¼k}ØÅ8–湊éÏZ³,›ÚÚ¾p^ÁÔQ_ H| &DyšºQY“Ç>ÓJMër7÷ŒÍ>>W$D9NÙ®˜ô±ã‘ß6”V=]I$•øÇ$š$ÂBŸ}±Ä¤1´¢±èܾ(E|ç´$^:z ‡®­Ï–ôu}[Ë׈ÇzŸ³hkÛÉ'Fxø>ùdhŨʃ¤l{æ&c»­½Å[ ¾mÁÞW5 Ð&0”ºWÁUž;†¢`ü{? ­­¥¹ûVš(#WõÏÔÎà+1¬`W7dÝþ´4Çò¹^È϶:£[eQBçq;ïGÒFRî5™ç?Ó’8øæˆ5DÑȧ—;CÜ" R¢®×ó0x‰¢"¨0…uÅ¢¢)°i+i²ö±x\¼¢«ˆø–`ÁÄf«£ìvöâà•ÆDNé]ôEà–W™ÑÑ2[$Ž ,ô òYî6$Ÿ:2¸d–Dy¢ª'’µ[·B.„~Pcfõ±[Ážd'IgPе5;d(«ºÇþâÓ!ÉÆÞ?è£GIŽ_Wñ•ÍÑàåN} £Èøþ#_G>48(í3QOñmn_ØL®ˆáhÐÁm­d À˜­Kb‰Ë^9hõÓÚK([t›*W$¤37¹öÍü}˜þpÜÛ˱ÍíAª$Šœ7>,"¿WnÕX¿é…Õ3ô^Xí„óGôòMœIÏŠISªèùNÈ™òÆ9Rƒ„µ&ÿߢ02ý±ÌÝ¢*õ(ŽñÏ’•»wÿTðÌÊÂxºÍÔ©„ì¹o0Å3üHt½;ŠP¶)šþÏ$*tz’®Üì>³„xœ¡ ÿº™4¶ø~O[A¦®£¦E˜DzÇÝö0†SöIz±3㪅UÍ›µ­\\Ô¢ô„7[`0:Ÿ(JC7Âïªv`µò½a¥« È+µ‚Î*ü4W~¸‚»‘ÛúÖý¼åuªcV•&µ;Òÿ»þÓ8çHHöJjG‘T*iôpû˜ÃíƒBðêîWüêldl­ˆãârEʃª’­¥¹ÞMO;‡“™}[€A©™] Š*c`a‹Ÿõ~€•m?°@.òiY¬Ëý±~¥„ºWÅP÷‹œ07‡mF6VœÕ”þ2°äá"’ ¯yd¼1£âNT7sî3s´svzJì15Å;L±5¿äº2´¨T®¿„Èzë¨È!£o£ãùiù­ Cz¸OSZígJð\GtuªÍC¬·êÄŠ;${âøØ,¢—á?cA¨¹ú«ûÜhÆë]¢-r8|ëàaeÆ:¾ÙÌ’·jË·x£ìvA¸x½vëÒx,“ë«RQHØ>é;sK¹KQ7ëY^jN¥žQšIT1& B¬¼bQà[ÝúšÕß³`c®mË+W+ŽV~$oÿeмáÂ…œålB$ûS_±ulqɵïwé‚_Ì~ƒõÏ!ñ8¥  "@ùº,5I~VõS¨vr¾ò‘BÇÇÄÇ_•ï£xºÊûAÀ›AîÚËÜ@ë¹B³®+ÓÙ&Û«‘ncÑ↠S³Äc¤äYU$GE’à˜y7©@ ÝÝÓ©ˆòàŒÁA(5ÓÔb§ÞõJOÚ zYh—…6–(Lù §”¶VäÅþ•E nÕ»~p®lMí9<ñtN+ÁIÍ®½œK:Özf¯ ÐSdeðgupLs­Éû-;ˆÞ¿D䋆õ]S*ß3ÝWg´î¶‰ĪGi¢¡Ëü¹EnšP~W`˜(’äRÔ¦#®|‹ÜFèÆfí€sð¬‚yh¢]Z¶®Káâ¸ýˆ¾%@e!Ôæ <â@îñ’úêž8R)fiùwÐ’×Nn¿!“!É Ä´—¾E/šº•sóraßLžèüÙºG¢©ÎÚæst¾ù]”Ž+Ñ¿gXv÷Šk™2é$î#o bÖ"Ú ´çÛÙjm º¡åe?Æ•¬3VW?<ÇÔJþ+¶ÃȤƒKyäC‘A?Bÿ9¿ 󒙵݀ >O…“Kêoüö^{x(0=>Ù5Sd7wR j þõŽ¿åDÐa1ÓK±Ð¸^·Yeηû‹ñOÍGÙ#Šá݈›èB3ÌSÿH¸'Õ Ò­3ƒÁÍR ÙqÄ~€&tGí$Ë4nŠHFm`®¸b03SÓ Ö<éeu=]Íñj"Oe€U€ôëÿ‡¹ˆüìâ A#·ºzçJçFbp»TO†ñ7ÍEý0¢p1ÎBWZŽXÿ{é]oD× ·oIoÚ :YÏÄÅÎ Æ—^×VYm‹&ÞØ:>¤¡2§Z%XÆ/0"jzdÉ¿0­~rX}ä=\nf@ÅÇ–<«05ðóU€gºµaf|èÍ( „·ÖÿPjûþ˜Fë¦Á—,ÃÁ¹-Pö±ðÑè[®¶7b=ØÝ…æ\jEmîoHð…ï)'¨³Ä0N:è¾-2Â2ŸšPص‰éWYg_»¨„G‚ ÷; Ï…Ôàù L›³7«ì4Mî¬ÈíQÙ:…[c óÐðw‰¬ Ä9A‹Žó X6J™÷dB ~1~Œ'Ë0KM’%ÐpNÑ?ôªiIøER0ž²#÷&öê-(Áv` Öï$Ä)–ã mž³=wKg>ØÅ–™Ž—’úlSZœ²Ëø¥ü; ´ß'bþŒÎÀ¡Õ± ± =!µÉ“Y/((­ŠKžÆØ‘kûkµµ“®Â÷_Ôó×l ›†§•ò{ Ø(^ø†3üÏ:ðõý!7swÙããa>oK-jÏÝ@\AÙ½ÂkEô¤þyêÆ3’SkGLØI(‚6±þ¶ïM—s­iÉÈ-—h°ì9@ö–¬eÏø¨¥ŸÛ΂ôÔi{ç+{ÕfŸ¨¿ìŸu&Tiå{ФT¥N{7tâ‹«Y]Ã,ŽftJ[ÛômÛ ëvx\Ã_6”fÞÀÏÆŽX5з·û^äßåÖ-=J“‘馷SÃÙ çJ~þfʶÿýÊ’÷Ä"®8ÚâÉ1/âüt:©ä/×”J«©Ñ_ú£†$?;š"ÿ†ùŒœã´¨9”<’¦1ËÅô“ž2 hçòè¶+h*æðˆ)€ ;"¡ù\$%ßB¨œv¯×Y-~uG¼[mw²³ÊœÑguû3gu@Ýv{Í4;0.E-õV#dçÌÇÈ›py¢°Ú¯>fíÍ-[+he™°²ªúž[Š·£<+ ÔÒr½~Ï_ðÉøÈ‡§œÜÝÚ ±¢_SÕˆKÏô§“¦¢ø9²,WTŽª–}<)„£zßR¿ÛIk*˜½8h$ æ(H ÓEºˆ¬Æ—wwÐršV©§ù¨)—GrÃK$lbâÓa²()Ü«„ujW% Wy?³k¼#V8ànêÉ%Œ5Yôà ,0dCt¼.ñ ¶¨–)ǯm[´Õ÷;/WŠbœ[•…M{”-wœ%g(s›Š‚BK NÎ#S“ŽŽêEžèÌTž^2D£E0©ˆ %š 5mH5|5ŽÚÁ£lÐW¥–¦q,Ô[ YUý7®R¦ø¼†ª•Ù0ˆ¸£ÓM"=öè‚ô/ž+cY±MÞŠmõ¬æ€-ßM„j[Ë–c÷×ÖÁóxÑ=\P u·ä´iÊ–°4ºâ-úÄzý(­Šóþi$æ¤H„ÚÈ™à02M X.“‹·ê[†›W“ç¢gz°Aà°ðö°Ø‹÷©˜î<ãX¯?ºóOn&Œäá"§V#MKÇþ¬(~G¸R6„šXh²*†“¹Ï'`Sá(å·*{Ý75ýRʤ‚a `EØø$r‰&53ÆV [½&ÔÏ[¹d€…"/…iõªàSûG8ßÀ<&än<š‹§ŽÐã øKUÎP·^É}bª,ïmF¸ÈÅn±JËN«4¼‹¬_|–<üN·Æ€ÏQÓ¥ûð á°¿\r0'-~£¿Ÿ‘¢ïkæ"vR²÷Éé2¼ÖmYÔ1ƒcÙЇ “Ë}h[oG &¾éÎÎ/ä˜iF!7^•óHާ$«/=‰]!#Œ\æèÓ¹û\f¯ï{Ì¿8Ó=N£ï%®ŒJ â͙ڊˆºÜUû›J£ßrÁ“cÙ*ÒÀžÓìÅK½%îø„ÿµYn«ñ¹KP^*Ïã¾JJG<Ó¾Møœ0:ǃæÓê\³‚{ÀÜ೸N!¶Êc'±8Ø¿¬}-C<%\æÑ-mñ_nõï‹¡­ô=Ml§Ü˜’ wpÙ;g*ç/2‘¤ø:VÓ‹ºÆ®iä:?@£bÕ…ãÕãv’BÁqƆHMPã‰Ê»ØŒ¾MÿׇÑ'±gMÔ FÌrQºzv4K¾þè ¹ ÒŠè6Ÿ¿³§€$#öyQïMµ²ŒN¾Aæ—ÖÖ±ƒñu,’1¸EËšÕb3F¢Dï¾ÓŽK‰g ²Z)É^P{Ò{ûZæ-šDoÌ”ù&7‰¤©•¾eÃXâl"wnæÃ,|º ðŽµ¼„¯i nšZo:Q_ç$'gÑíƒUß´fðÿD‰/ÒÑ ØÚ¿ôoÕ—ž4ëÁlc&í|áÍŽ€( O“^U¹xâfÐ¥y~åó<†6!Ëf¢ÞßvHÁ¥’`è.çvÃøU”úµÃ–ˆr ?5ñ.'¹Nf½ âV’› !¬|/«+‚ô)a;ÐÌÄ€ñoþŠøÊïT¢Gç܆¦Ws®ú ãPç­®~!”ú5‹¾Ý5.dèÞÉ ÛAð„¥K@´^=å©Ä³ðfoµð.ð¥9ÂM !Weê'ó´?˔̫Ÿ™² ž Üì}úª×ÆZ¦j.N'6*`Ø<ïð_îú¼ ý÷·„*u+‡a¿óΑMTL¸&ÚÞûýª&5¼àÒG$š5þ0úÎ å_à•Mé-VT~mEÈ?)õ\‰@åÔ€]3Ëå‘YÃ~iÔ3hö‹‡¸ ë›Ï ³ÊÍ–¾SìmB`}©$ÿº0yü| îºÅm8®Œ^{Ÿ“êyUÕö“~ƒtVIŒ£³ï˜ŒZº×4w9€@Šnç©è(wdrÑs•Ôýu¦(6÷ûüG©’È ¢Ç„/Êí.7ãU?í» ¾†n¢zËc<šP!ŠØ¡&x–¤ƒi³þÌÇhXžøÒC†öýóU…4†Éœàk"Ï|èPwgâù¬]PˆeA:´œ;±#3sOkïë}PhpµÐTHîÂz<ßË;˜—Òúˆ¥5_0W!áÃó§rEot_æåW‡.‡¼³™Qæƒ\w5.õ1Ç_Yƒ¾{|ì¦Z†€»¢C© ·-‘K›D<¡Àe˜Í+úêó7'¿Øm=EáâõâxÁ¸ÍÁ©HVæ fß8Ž!ŸK]±cÙò»q^n^rÈÍæÕq´=ÜE«îšNàå¥,ÀpÒj„êY­E²§=¿?>íË«Àá qÿÿêfÆ^·¢ró+vßDEšà˜žœ6üosKÈZCƒó€Çp­¢nÝuTÐF—ÓM…‘å÷…Åà☤äLþÐÁðÖ5Ù%í.ÜNo®«‡™ü O…¸\Ðm'Ãl¹9¡DU‡“Ù}g£@gtyjò‰ÛlÙ šZ£Íhpí=ˆ’+Äc³ÉX µo3浉 uɃº®öè’<%†gýAÉØfA¸"#o“ KÕÌ;2ã`ezX„á_Ë›&Œ–tw€8#ùgf‰<,*[¸{ñ´vfXÔ\Û¢™Ô¦›¿~l°£HšÓGERå¢ý Ú-ÚýåY'ݰ‡«Ñ×'åxL˜6–*â- ²40Q–ò+~J^Ž8'wÕ¼BéwÂOÊŽ_ÍKÇGR_£‘ÞS²”7nÓÒmÇÔJ»ÝpàIù•öÂ@Èðæq´z…9_@)2‰ŽÏ‹ãŒÒ°š N#á15¿l ¢Vÿ‰ÈÂpV]æ_ç ;瘞S,( ÂuPvfR|8z[íP§iÍDD>5PUÉ£À/¯O£ôϺWØäŸø#ï:ºÔÙwuÙ´ŒïQÁL£ÙFÙlJ>ª9ÅÇ£üБM›;\u½rO£,Â]²º{1-o¢ó=pÓ1–½”uÅ‹JsÛßâFT¡ñdz^µáã£pF—œ Õbv«.Tpðeˆ9þ ì3f•néàµrl¶²9œán-WøßÛJo^Iëâ‹Óc¹zc ´–JP3¶×‚5p Äû‹!dszlêMXÔË¢‡ëeÛ8÷ŒZÚëª5´’ü¨%îÕcRÍré$`hsЮHì hFŠìÖG¦ÚáÐ| ˜,ÓO¤F‡¥®6†N+þ#ãVÊ=—VC¸EF°­Ø@ÛO’Æfõ3)ýU½š§j ½²ôÖÒp@nÛVINF2ºMp !ßY6ɇ ý|}ËÀ6S›Ž¢F6À1'd°U}ÍKV‘1¢Ý5-6d¤í4n ÄÏÀÿÛòŒ ØÂF;ìZJ!y¸œàÆœE€Ã¿·c~$Þ|«×‚KfŒv†7”ÄJ·Ì"M+'xz4QÐLÑ×a¢ç%Xóñ3aný?…CÇ1Íg1ØŒ?s /î:)ÝwM€¼K¨…Ó`÷¢ ùqÚ #÷âóŒ¢ÛŸ®¤ˆZ9t³Æ]Ùühåkƒþ‹Û»È‹ývÊ8/A‚S½·ðb5%@áØ8Š,×'EX8%ý=pñÚ0/ÐÂOð$-(Ÿ\ˆƒmÔM_"‡”}€Þ SObYró@µ¥:ôà÷çÔf øÐPÕ§Ðv™^dt¹„œ³ªÂ@еJ%h»XËÈàxCÓU@ó‡ø‹H6êø(°4tÞ¬JÛö·Ãñ§¥:„5HTåÀ šþ _ß\Íù1d[:œð“r:wÀ+ÌÒ‰{uÐÃ"©’KoŠ!þÇtµñ”ªÐ}Æóh¨«Á,Κ°`ÆVµ'ª—™³cð2R»ãÚ0R2§ï"Еn0@–¶¶xÜ$Ýhh"oä­—qhš¹xQç¬Å¢Ï=A#'Øõ+iSœàâVXÒû†¤[éë+­…àh’”¦…n"ú/”–rÝÇ.¸Ta{Ri1LãÀó¡ŽT{ ´¶%;ûªJqi<" oòì¿ü\KŒÍô•uAd24¨mVdŒ¹¿+d8#…¿CЉ«ñ®ª\ý›ÙFÃáaœWÞAeŸˆ!/³ [”òÖÖźÅ`Qö•UÉ·loô\aºF|)ÍóΦéª^Júö 9%Ðéjð–”ýYp7X‘ÓZ¿d)›i;péŒZéÍýF{Þ¦¼ Üâ!aí—k=¢¨ ðJƒÅ`Ö¢ "Àm™˜šÚ.'¾Å¦Î2âÒ& í®P.òríۈϳò‘ÅYîø@^wdUE…'EÓÔ‹×ÃMëõñý¼¬yl+ã€ri `K„ì³ D(y¡@ò™«ÉÞOýý?¦ºÌEXÎcá‰Í¸w[òLoå¶,Þ¼ìÆNYØTÚ}àûçOç&s¼’TùáØ±9n‚˜‰#ãÔuÏJ«—íyEXxœTN„›£¡tç!ó~ÌâA­2{[ÍÊÁê™[ŸÞx¢‚ÌË,¿Ê|˜&^ÝÏVZÀdnw8¹S¥ïÜ ,h:“a¼«¬‡g`ˆŽ`¿ìŽœcºvRtÔõj‹ =­h½ù[¨»"ÐHþ‹ª`é†÷|&,’) èäfø±šPKZî³{(äÒwá()¼FFIu‚bˆPE² ±þçJ¯áCð,åóOºoæ±4#'è¼À´“´á£&Tœ”‹o¸Ä>€½Œ`P›õpyœÖ šL³B€{'b☪±½cèR ¹äýåÃe–¡< µá<Ûx,Ý^2 Ýó H,x'b—îy|n¥Ž>PàŸJI¿ îêéd‹°`|K}¡)7êäœ"™ß9»’ÆÝÜÞ¤¥…%k¥s›Áw´ë#jóël0ƒ}Éï-ƒí'ö¾Ðf—Pí֤n—Fÿu’fm‘0JJR_ ”§ƒ$¨{!±)bðc©*lŒþ]z"«h ü¯:nL"ÏâqýS,PÒ$yÅðäqsìŒrÚŽª–>kY°ë´œMW,oCe¹â!zÁÂLÒ¿Ø á}ébc¦y m‹",n»“Ñ«5CÅÅÑ6w#Áà>a[Pfµ‚v[†¿Ã"á×Î9z@[PãGËBÑ8æ\Õ©9tÐ>Ãu_zÀ’ÅŸ2Ê>kÏM,©Ú!œ[oÒÒÑè›È@«]PQ.ϰé8"¤›8À‚¯Å4 pº —ÿŽ¥²]giñbí¨®€¤("ª[jÓmc¹RîÚÐúSmº±v¸·ÔÜÐθ}¤idãsµÂK²"çéÊâ»ÄÒ1ë^}Øzc,[oŽÐ17,RÒ/úòÅþÊíàe,† $ì…aDï¨Ñ”íÒ.Ð/!ãbßÚðPŸ¼–gäS Ÿh¥çKà¶ÄÀÈc–oŸ-u4tKk•X¾vriCqKøm‹LùJ¦øñ£f(mb•ñë~Å2óªálš/ŽªÃ(²Åäø©RŠ$Çw&¸Â {.MªMÀ¦ÍU‹ Wa„íê­6tƒ7;ø—ÃF KÚMˆ@Åbs‡6«ùò˵‰"ðPöZ í–ÓBœ¬æ_L“%vµQ¾ÞóúSÛÞ¿]µáð²q Fu&ÜhŽÍÚˆ!4H‹%#¦BísÖ©jwP¾ëá J¼!‹â0Ž`‰°Z'øÃ–#6ó‹¡søèHÉ@snú‚¬ i¬7ü âM9®ÔÛùǰ¹BÙkŒË9aô&vAÞ,¤èëà9ìd,Çsšñ£O*ÁX€ˆjæZô‚ÞX È0[;Û¸4ñºm6D\÷gàiãÚݦu³ –/ƒEÒ%Б™Öýð|0·n~:~ìeƒ2(>ŒÊƒÌtâ¯lѵ[³ëˆœ;ì0í ˜š)’JR"¹± ž«uÚõÆ©¼TÍb\ऱn–(—I}$À XO&:~—HíM?'•¤ê:ó·Ó§Õ|¨û½ £ð5I­¸ 5Y-AŸK£;¢/‡=ê"t.sY*ÁBÇŽÞez¥ŒŽvÎêZŠãƒ¸êù\õã!Ú*ùeòò 4Ê™Äüße u²õ¤Lòi‹UåÐÇ’8iΛhÈ¢dµ­Á8Þ¯E¢|sêLÃ-³Ÿ9äN´·ï·kÄIÌᕚ»òVÂeG XaŠíóC9=q2Þ’pSo DhÀ:„K.ØO…ö9J5¢Æ]vK5,®á&€ã/ †Þe$PÅ»JªI­Ö’Ë ¡ÔöKhaøèŠáNš{ÎÝLˆ>2Ó[mDvÛY¼Øæsþs}¦áÎþ+žogÁQA!:£ØüLCw é¡, µ*²LÓ¼5ñpõ,4ùË}.ÝwðôÏPÏû„c*sbzûÏÝÁtI/)ÊaA†oœtXž ,U~âÆïе J…?©VßѾfw'Cáí`" H‚k,ûe¿5þºÓ•O0xïóiÅa„¾ú)Ró"ÌEWÀÍ\?«~.â!pOsœ¡¤J·úƒ`oC̶Êr¡…‹‘kNi¹I eJŒ1;<à0ÿ¿«ÎІ¼7˜2Ê£j Éa6Ïa¥–7\&J‹7ðiÀŠPú‡šÒþG*¿ÉÌå~›ãp:ó Ið½vº*´F”ät©'Óý›¿[.¢4ë³f¥1é(ZÃÚÉ{ {@½;QU‰øâò³„QöZ-&ªN¢Kæ3»–Øú¢|ìw‹¦Žò³€hœ%½DÍ=¦ýÕŒz‹"7›¥„«j~× µ^ìÏ¥ÝJr]žìµzñ!äi^ŽöµÆñׇ­Úýd<šþÖt{ï¼Köë—Tré ˆÚÙœaô¢žŸ»>1þQr*¬Aµ«òÜ2"±´t"2; Z[K ¥dû—0}mÜ_‰[ó ¼îÀï¡§•™(³/üËÝr–Â|Ìr%Åçª߸; 4–ô$óûH5™Ø¨ v{ç ê7þ„«8õ†Kjâ—m{ÿ5ð‡»êf³*‚x«h³FzPÀQ£ý8ähD1ó%ðâ®@Ö÷­‘5­ìÎT8;Í)—ÿ•£GbAr\ D5Œ©ºû/3„¾ykquuV¤MtKµ:&_}QVÚaÕBŠS™dS¸Íó9*~‰£ÑÀ78—UçØš€âš×  ƒÔ¢Ký"†[•ë÷S‡8 •GD˜ËªhCAî©]wöaN(ÆL°@ kÊ«­ýš›d¡pò­Ï ûËõƒÂŽ âôèyww£ßT¾ ü”v.Ž1“¸„£í•ÎÚ¢-€2¹Š€âu–†ƒ\ï(å%M§çÐ…l¶“Bn@69*q@À¤t\X×å ²Åa%62ðWQ¥ëÞ|‹šfŽJÒ³@9¸GË%“ÅÈfÇ¡Kó—ž1~bûKÖæó5òò|KýéŸLï‹uâž@RÛÍ\ǶL˜TÉ$c@µÞoÙ¶×Í‹.îè <ßÔ\G ÷‡ZtR²_m†¨ïE=`l´o¦=”Vùš«m˜¤Ã+³¹oþ¯É—¡'T«IC Úµ‡¬sOEÓÌ¥RBžS“JvóÄ ÚœFm‰5¨ø¶xmcuã Ú)—ÖÉQŠp!Ûm‘â¼ ^W,g ñŸˆÏ$.Ò%ãe;*N‚ {ðN!—¥ì´b ô8“Æÿ’ìÚ´|ÙÛN m¶ÒòÈš > )J‰»ƒUàN¶ØÈs°IÒ왌# Û¦*Gj¤#¨7îGuqªC` Íä‰Tü¸—åe¥ß(µs0Ýë—§S¢Šúñliª²·åùTåÄ]./óLÀìÍ”í •Àò&'%aÓI­ò¡õëãì#ûmCC. Ë8Ô…–´¼þf\4à¡—ž‰'4d¼y?¤¤ §)¯™õJÛt-$¡¿¦Ö)†Ühñò)ööÑ¿´RšT[ ¨æT¿A´¶¸oŠ^é?!!^æž»˜Ëx:‡„î;ïK3„9£^Üþ˜šG'kw#@‡ÄLDMÐÔ¤bÁàÙ^­£ ¨Øš†óƒäzTJ©Æ·Æ1¼#³äÞkÐR1H’oüè§„s´vúÁö}#”ôeáß%¢ì]ÿ¸1•0%ñS¯üQ׳ÍM« ´—w›B¸+ô¬¿LÒLžö ÈE®Ø íð°²(Ή5w@oÕòj1µl6ˆRª4У`èDPÔ’™& pÉxhœì«o3Ò '‘Bÿ9=0¬•¢(öLý@*h¯W1rÌ\k¬ÅMþ%ô&Ìo÷âÝBçÊŸïä Yéþ™ -ÞPt<  Vø"¼m2ÆÉó•™¶iyoôïŒ ),ÿ‡'Dê.ÒKÅøO*9ä]/ÊÑÙóªí*:";™LUÛØ|èÇnˆ¡ñtG4³:p}÷¬ð_t×EEZÈØ3“‡ .ü!?ôãK‰¶urY¥Ó*v0RsTŸÉ—Jò^Ã3f­ê ¶¢uiëÐg8û‰çŒEªF× zär…]ƒpûilHãØÑ÷ý­N½Ð—¼<š-ul4K(ak£Iûžyر¡(Åéøˆ_»oúy¿]Ñ€›ÈVFæo 4o×Ôf¸>e¤‡Ü>K¿Òµs©ñÆÉIÓsH: ëÇ þà¡ãƒðaÙGQªÛyñ®ò÷ÞýÆô3Hp5XñlEý C’´ÏÁ²\NÑ|Gp–Îώ熈×N0›éµÊh˜Ž\ÜTu›ª‚ÇÃbìªå‘lû¬üG,ãL2]u›+òm~—¯ u$w²› ì1•ÿæøFü¢&Vf×W›~Î †ŒýÇ­’ç›'>›|'dô+IÇȺ:Ä×Þƒè\¢wó_šÊo¿8Ø_®2N.³uä> ‘ ¶Í:yFÄþ_«¦òòô/¨Óá÷¦¼l¹){£;v7a‚·‹\õˆýÃutËoæ`¦ÐÅO´†ûT†JÀ¤g&3)]`ÎÒÿšvøª¼ÄÄ}\éGN|毎\šÏ0ÊøÒlý¡j^š·ë´ ž©4ªëÌÑ^_ê óÛ࣠¦»8s–%6'VÅùÑ™ŽÍœš¸¶èŒ~2YláƒÃæÈq›Ì”¥r0çú^ù·…"`"öÓN(®Qê±À™íä«msªÕ¤ÿ»ˆÖ’°ãKUËAlq>:’§yÏ,Ð0‚îd=%8à“ì’­qÌ™ Æ²zå=— Á©™%åëL¨ÕØ>±=.ø}fÄM`ÒŸŒ.¦°À²Nxn êÖ¶E˶á–âÔlsÞ8xb5Õm¶¼+xmØáÜ<‹,.‚Žà¡øÚçŒçüÍî!W©†è^U±¨¸íkÙŠ䌘°ïñÒML‚¿ŠG²L|«ÁÓ}&ìSz«k7Qݬ ±þ':Áá›PŒeÔ¹ÆaÔnd¥sÇ­é¦öH]UÚ'‡çŸàŒ?ÙÒ§FO¤'<êÿ@é¶È Qô‚ˆ[¸ÎFäÒ:눱f/£m¿Aþp–‚r9ô'¾ïÄÄNåFïR½MhZ´æñ¥*^q¢Uõ¢3ú_fÒeM°:Æ„ÿ©{¼­Fw^ ëê¹ðˆFÅ›•á[ŒI¹SæCôQÒK»“ÖrãØ\]~Ë9ŒñwŠl%ÆLG 2ÈQwBw¤^½´8T8Lû·•¨àU„9Ùp”†NðŒ‚š”Ä—ƒ—© Ì©Ô*)ä;wŠì”„‘¼¹Ôv2­þ‚:ô‰JwêëXC#¿%0ûµ  0w/¿—‚ÁZ1(Rw «}›Áš·JMkvSzïjÈh&μçªô#û /(ŠcÄó\NLÐÿ5 ï¬é+á•‘ŽÃ2Èi©Í ;s¢!Ιª×ZÛñ•Ÿ|oݘ%ßœÀª<<-¦yï4PÄj·OU7™æŽd‘^OSpRÀ rA²amGrïÄì#{_[pn'1ŒÛW–Üßþðsû›ÊË#Ôºî•9˜ã˜aßG¥Ë!¬Â'ÕÒ«Œþ¥Þ ¡rá즚=ýó†ð¦?~j‰$‡MæÔÒàT¥HÇTìÕ•BÓ]E­üÒ–øÌR ž¹çt?ˆësf¬ÝOÒòîaBå~“L_oͦ}'?¡ØŽ·”I!oÍ=-ç1.Üÿÿœ`E 6Ÿ÷3‡?õ~0m™¬Ý¶Ü0ù¥³Š½‹mœz€+n Ã’®ØØ¼¯¦1\ýèÊ6Þ£7«V‘· …Á?Õ˜³Ò'Ø$ÍKÚ›4øñ ÉÞßMŠÛ0î¯ V×Gõ‹6%òw¬»åÔ64˜:Z^S‚q®5#ÂK_uŠÝ¥cÿûz°báÎ{³öxø#¬èâ±Ð»o_@@€gkáÚÃjÆ{¹ð¤\f8!m0ƒLo¿csù<`¡F’¿ÃïŽ÷^í<¬Ü†?aš{½ÎDË_LÈ0¯&ŸÓ—|7ÚÞ'&·ñŒví‰Rß)4 Ò q¹ÌË@ lvT"5Í@ùé5»ªÚÀBC»B40ãÌ%—”ÖPÜxÒ4’€)xji‚(­,yql²°¢ t³ijxé–Voøè¼Ô|× ¬›€¶õ­Êþ<òšA§·ad¬AÛf òæ&}3!«Sœ´4\ÅE¼6Ü4äv©„SÛÎʘ÷ukXŸûWS~Ø7ï§µ7éE¯A`åi2¢ Zž÷Q±cX¶Hg`*ß$í0öa±Š/pQÀÑ¢àNZ¼yÀ™X°‹1Lj—ŠËˆW}ÙOwS·¡ò!Çã󲥪–ÕñŽ¿òwUí:)-…al5ð¸ /{IˆòßD²Úrç™]1þ8¬"@îÚÔ”7.e›ÊuÄÌÿ}Šù/‰Bñoù³<Üö÷TÞûÅ‹t5×"l{ù½äÆG½Ó±ñBa7›C(ýú¯/z€4¿¿E\_uE Á£™$Nÿ±Tq …o{4z]Gê—Ðk€¸áGœÂ¹ocØÃôeNY(2¸DÆ®»Ä‡%«ÂÏvÓ_|w·î{ 5ˆÈ¡q! ¢´lÂed.?t#½üâ—Ѓª?2}—ñO¦Iøv“4LèÈ@Ôãíó¸4ˆ‡ý`|Csчë†,Ô½ d‰£qŒ ËÛ<]Ìé)£ÈÐs·L‚Üý׬1<]àø?޼ë¤4ãyUŽèŒùΑÊYLÚ¢”?çmš®9†v—2°*ìÏZr‰bI­Õ-<”ÓêÁ!Ñ#]Ö`öBv|‹@¼-‹WÓ£»eM#Çd`ɧ‚>gÌXÙ¥OÔþ1ð7Óu­L_"˜n\¶=61¸=ø’F¥ˆ>âµbÿâê,'”m/GŸ¾Üê—á©€g:+üŽ(uU+>·qêvßOÊ!âÙ‚»>…ÇzãlsoN Ýù ·ÐБ–Õ÷&‹ƒ´öWm%Æ)£tæé5ˆptwÚ-¸­‚¤Hz\ÏZÁ†*»É…5t¥°h½¼‡‚37ŠÔíÀ!Ážã¡;» $Ž´1^íЋ•îÕ°ÿÅ‹ÿœ§|ÒcÄÐ?@€ž†€¼Ù õ‚3!Ö­w=Áðcó{‚ü'¾P]Kuå’Aí ÿ^¡ØEéà4\.m™¶3±3¬z7‹mÓqÕ·"Ì2Ì-£à‹²±GaÊèk»õeð&•^ë=4$9Çô,èkqÅ$Ï€"íæH–ÿ “L»Yûó,‰Ì²ßó+RZ²±ÓÈ„¼Ã~2Nþ^õ€ßéûMb‘wÇ‚ãúð@Ö£ µ -ˆ y ¶-U_5dôÇ]þjöNÅ‹ÉBSðËÁ{æl=-[PYu1½h²‚ŽvaL » û)’‹‘ 1‘tr1Ĩ‡ìÓ¹’ E=î&P4nQ~éÂhþpßn¸ô¡àtxwö#[Qmz¶‹ŸCiìèjw‰é‹¾ò´<ö™EÀö.4 /Åû+mŒºƒ¸r»Ú•„-¬Ç UŽ•QΠÚø¿2’xZ›ÿ`ls\ô:½dÏu’žþE«fR¦1Ew ÷9L¹k‘úd~’Åc®Z‚¡rüN¹6ë¦$ÐX ÉŒ@©§º©Þä”g«ý×™“V¸Ì9êÜô*­À±nŒ.f=¢ôdÁ€–D«–ë‚÷„¦kæ‰ ¦”g¦?tÜh~ Ðù§¡„…Ѧ… |2„"Ç¢ÂÚr„RÁ¾cý òÜŠµÈ€pM3—]Ìü PðÔZ­˜·úbœÂ}þìáõRêåFÊ‹.ä}ž4£. Sæ<ïç"4™?‚ãn_®ÙW&3){Ï©ÏvÑCæSÆOè˜'†GDZ”@.ËH§2ç@$÷J¬3Ïö윗߫ª÷5­VEµ"0(hŒ[øºßœöQ›ocüĪ«Jb•áç÷:¦Û?Ò†ìc9(¢½Ó1x9Ú¹Š…ß-Œ^s\ÿb:œ²g›\øF.íû©ÃröJù¤È;f¨ñO×Ìÿ­œÝѯ€Å Ýà¨í ¤JªÛ‚ìR´Û1Ã×±%-.€F©GžòÝ7ñʰ#”T¼ÑÕËK`²v!çt!›^TØcU·Ý& »¶CӇ؀MTø÷¯<ÚÜâþm«<í¦tÓ¯5Ò—–Ф_ œËæAKœÕãl®>¼7έ\ªœhÊk&åÍ*’Ãô/A¬Ki þ°Èi›®‘ŸŽSZÐ~¶ ȧ¬Æ@ç,rsÏ+ÿjYs];®nƒÛê' kꃠF¦°Ùrvç­w(ýN™ë9;vI`‹Šü€m½l˜’ôn}©aVòY JMD±é)_G !߯c-pŒ1‡Xøöû—3¨ZÃPi>4úêÌK¼] 8ú´FéŸb|8R-«‘dS?¯Îƒø_&Ž0ìCÿFåkC•RñDV´IÇ€Ûyl&•¾ýþ¾’†Ìá¶¥0°B{N3‰ Èa¥ž¿q´ ;ì¾Ì3ï<ƒîyf8|d‚™¬Þ²ñ Ÿ7žùî53¯ˆ3â,ˆÔW]Tãþ9,£¡ˆÏo!EMíÆò/µ€Ÿ‹}ó8HZKÈsq?L1k"¾Œ´¢9ŽòÝ)è zùø4¨ÉK(_%ì¶Vúį?¿ºöò$ç$bèBÙÏ`ÒwºyEA0œ&¤Gé_éÄ©åJløÝ HF3ݘˠ(»ljãVë­Æûxs.¨á+jÏFâ*®/ˆÉÉÃ\ödºÿp”MX{:„¨ŸÈÖ¯k`Ü–'ѯ$åmSq¼ãSÓÛÒnTsÖ ¥%K2u`¯,– ›·ïŽƒ]èñ¢Öy¤ì]Øc¥£µÐ ÝÛ d¥ˆUp13©”°q‘|ºÞ’n‘ß4°\î<Å…SÏÏÍ ãƒƒJ|â{ã7Añÿk©Åç`öEï3–=”ÜÉß®2p\û÷¡³•5Lë°uçv|óOˆRçÁ™@zŽ–îõ"Ó=ÌqUM¨ªG.ÓiØh\õxuß@ôTDJyëNu‡„©­S»OéUšz‰w:œ¡‚WþhΑÏ˸+NÕvl´e+³ÆE|ö«vMR™aKÀ@D ÕŽ¥Î>œJ¥jNÇëæ§†z feSXÍÍ6fú–TúžE5µÏ`nUè±J¹²¨:W¬ÝéŽò²Ï Âu¬¿ÏDu ¼Ì£Cþ2w¢@Ó=¤S²2Ç—<¢A‘ Ó†ºr4ŸJdDá!ì½Ò¾cqÏTy°!Xe‘k®«\ä˜ðp1nڽѭgÝ‚ Ï2+'ÑHõ®1nÖÎ!ªPʨðŸàÓé«Ù­L{#¢ ¼—Ç ­Ëì…Q÷épR ÜL=ç‘KÕ¾¼§Â„ %¹}6Y y3¤C%±h™ž1ëßá˜9L†RsŸšnTÄâ c¹g#v7U_)3æ²£A,Á– åKGˆiÈ_î5×]X»(ÛòÓÙ“á6ªŽ9ýái"’ºaX#âÛ·´‰—G«Ë±ðÄmbÆÎ‚ ÆBr Eé³nØÆ/Â5~ãô|•=½­µ£Hý±ÈDE”‰a“X–NwnXàyu¥Êm‚+hÔ4 ¡õrúyây­Ï¸ì›Ïª¥`*›ûÞݽ­Ýí]%Û»(˜±Nê¡Êì» ü GCwË5Ù b2º?CqûcáÔHèaÅ5«µ†‚Cúéw;_ÀÃæknw|âL ;¶F±*Ü¿Æ)SIž8ý”ß,Ál@²Ùçö1˜Õg^°Ê¶~é+ûŸj‡3—ŒöŒkÃéÔùh‘‹ä,­¡Úç®Xí¬R¡÷B¼¾f¬!¢{Ì×ÒKEGË¢'Í ™ˆ8Ñbí¹±%Ì*ª³ñsG2®Mg¬ üg"kÐì#°Â{«2uØê'ú¤æÙY¦‹>ˆµÇ¨ÑUˆnmFŽòºË ¦šÒÖÑN•ZäµÔÃ/ßnJ9µ< W&é†Ôa±Èû’¼PV‰tNÓ^ºgèÙèlê}ÀÝöfü»ðlßÉ1’Iù¥ìÃ…L¼£@2L\CFM™L;-vE¾LAH¼MPñ…K1‹u¦¦ê.øL/ñxIÏ€ÆÁO.¸¿®Ï’™MaôÉ ¶D8Ãz$(¾³úæðw2÷5‚yþ ÷ä€Ïä „%É#g&EY¥„‡`¼¸ÌöÊq/jÊMw$ºä=kâË”À#æjB`wˆ¥¯Ž±Ylà(ÄþVUxk¶ïÛpZÿ/Š5V1ë„gõ`ö(ßÖW¶ŒZ9‚4{öåˆPÏ–Z!çäF¸ZhÊsi•Yòبž <™ö™xØYüížaB˜ÉönAVnÅÖ[Ÿ 8ö0[½ŒD£š{™_l u˜&ÝïשÇ*oEg_€ ÖlQ…ýw´ÏŸ’eŒp4kd$šb5ŽìêDðüNüQƒbÉÒÒ“}ê~à±^„øü!÷$;Z¯Öûm–›™~T#\$6VböD|&ëmé { RþOE±#ðQ±Ê§J╚䗨?ûµÈÇ^D+o§Àù‰ó?ǡꛤƒAl Ò;‚à‹ÿ¾=Óþ0™_£ ÜŠi«¼ƒ[Åúky¹mË€W7þ;îM2îù »)š4?¬Aý$ Rrd‰=Á—Ö¶É{F¹sOî[Ž*!@nņ‰’N*eÆ×Uœ‡/ª·B"3b§qý+‰?`t 5ÑYhÓ,§êtjz¢—Ö–Aúé*Zóo&£§;ÄHüz³ ÓSˆÖuìaø¸Ÿ-“_OfU´'…üì#J)î/À%‘—ÂBx›)-Höì–õ+F3´(§nrƒ–NÔ“¸vûÙÈ;7«ÅøÄ4Ê*“`]î=a7í +Ö©­Ñe ÁâÅn¥Èø"Å3’Ú¦_ …ÝpkFpnÅg‹C–(´®\µ £ò•¹èöâŽÌgiÙˆ‰EW¯4…ïg„Û_ ²~î°k˜¡¹•ºµÄÁCžþÆã§qwì4V„3õOWšØ1Iš„"Ë‘v†½XÇCÖUÖñ`(úz—_ºŸfå½è!›A ¢s4Šå¯ ãè K„7s˵,½”×tw¶¼<4JòÛ²o ƒ˜ÿ{0º¦*ï™ü÷ý“Ú²ü¢#Væ/(ঞ=à„(Ëù° `s¨ö’ÿû[zˆ˜÷¶ àŒµ‚ lãf‹gÀ•åÒÞ³q}Ì»¸:N§åIéáŠö¤òo9rõõ·x¥f÷ÐwO´¶<æþŸÙlX˜ç±êÓ*RKpÕ£A5,wâ`Y}ÅŸÛ±¿ü\yÕèøG­¥á†—€ç>‘<ÄÏ» ›t4†à£ëy„Ú‘I˜>Î༣êÐiæC >®Í©œ Ú%âÚLÊ^kJ² ÕAÎH´ˆÙâÜ!X¼˜»c§"ãf­7Ÿr[–íÛ+àðöÓ´BÜVzŸ:£GDÓk“߉&{¨|ìávàÊÍ÷]0]´ Éåehü¨E¥GËPekPˆ,óûW1~’î pŽiõ¯¯6[›±cw¡T¶£¹•ŽRð¶Ùàÿ,~†X?xÞLfÈ`¥]Ó“òLÈi]¸Î;¿JºÊao›Ç×ÿÞ·{¤cbÒúkG€¯nS®Z¶Wý3aq­ž³¯Ä—¬?ÂÔdöÁ÷ÿãÈTYy­^EUL,^FŠ3'ÛU7>W«9-*Mõ¦fãQyÁ6l£Àâ×UÖT(m\,-ŽÎÃ-ØŽ2²E’ÓL½¸}5—Y‘–³Ô8ù£O½Ó)»["åßtE7#â}+‡€%‘/ÔüZz.?œÊùóyªB<ìn•#×Mì]½•†Yµª’¸2Êòø¸™Oùý±]:¥Á´ZÉ€z¼Íü0Œ$*’ÚEÞhüà;›£ö1VlóRk`Nõó#ÌGJ^6g3¡Y$±%õ¬F7Y3;'ßö™$RÈ»1VL’Î:*üüÅ,3¾ôŸ’ÂÐoH®â3¥;¶PG›yõöï[^ÏoŽÅ˜l(0(­mC}mí{¶†÷¡ÅÀÞX·°¨oŠkŠì¨‡]¦ásüK*J-!#îL÷2€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark €grace-5.1.23/fonts/enc/0000755000076500001440000000000012032153126014321 5ustar fnevgenyusersgrace-5.1.23/fonts/enc/KOI8-R.enc0000644000076500001440000000361607574376420015752 0ustar fnevgenyusersEncoding=KOI8-R .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef SF100000 SF110000 SF010000 SF030000 SF020000 SF040000 SF080000 SF090000 SF060000 SF070000 SF050000 upblock dnblock block lfblock rtblock ltshade shade dkshade integraltp filledbox uni2219 radical approxequal lessequal greaterequal uni00A0 integralbt degree twosuperior periodcentered divide SF430000 SF240000 SF510000 afii10071 SF520000 SF390000 SF220000 SF210000 SF250000 SF500000 SF490000 SF380000 SF280000 SF270000 SF260000 SF360000 SF370000 SF420000 SF190000 afii10023 SF200000 SF230000 SF470000 SF480000 SF410000 SF450000 SF460000 SF400000 SF540000 SF530000 SF440000 copyright afii10096 afii10065 afii10066 afii10088 afii10069 afii10070 afii10086 afii10068 afii10087 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10097 afii10082 afii10083 afii10084 afii10085 afii10072 afii10067 afii10094 afii10093 afii10073 afii10090 afii10095 afii10091 afii10089 afii10092 afii10048 afii10017 afii10018 afii10040 afii10021 afii10022 afii10038 afii10020 afii10039 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10049 afii10034 afii10035 afii10036 afii10037 afii10024 afii10019 afii10046 afii10045 afii10025 afii10042 afii10047 afii10043 afii10041 afii10044 grace-5.1.23/fonts/enc/IsoLatin1.enc0000644000076500001440000003051107624515157016634 0ustar fnevgenyusersThis describes the ISOLatin1Encoding. It differs slightly from what the PostScript interpreter defines. Please note that there is no unique definition for the charactername appearing at 45 (dec) in ISO 8859-1. -------------------------------------------------------------------------- Encoding=ISOLatin1Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quoteright /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ .notdef /* '220 144 "90 */ .notdef /* '221 145 "91 */ .notdef /* '222 146 "92 */ .notdef /* '223 147 "93 */ .notdef /* '224 148 "94 */ .notdef /* '225 149 "95 */ .notdef /* '226 150 "96 */ .notdef /* '227 151 "97 */ .notdef /* '230 152 "98 */ .notdef /* '231 153 "99 */ .notdef /* '232 154 "9A */ .notdef /* '233 155 "9B */ .notdef /* '234 156 "9C */ .notdef /* '235 157 "9D */ .notdef /* '236 158 "9E */ .notdef /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/PSLatin1.enc0000644000076500001440000003022407027252273016417 0ustar fnevgenyusersThis file contains ISOLatin1Encoding as defined in the PostScript language (Level 2 and above). It differs slightly from what is specified in ISO 8859-1. -------------------------------------------------------------------------- Encoding=PSLatin1Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quoteright /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ minus /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ quoteleft /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ dotlessi /* '220 144 "90 */ grave /* '221 145 "91 */ acute /* '222 146 "92 */ circumflex /* '223 147 "93 */ tilde /* '224 148 "94 */ macron /* '225 149 "95 */ breve /* '226 150 "96 */ dotaccent /* '227 151 "97 */ dieresis /* '230 152 "98 */ .notdef /* '231 153 "99 */ ring /* '232 154 "9A */ cedilla /* '233 155 "9B */ .notdef /* '234 156 "9C */ hungarumlaut /* '235 157 "9D */ ogonek /* '236 158 "9E */ caron /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/IsoLatin2.enc0000644000076500001440000003426707624515157016651 0ustar fnevgenyusers-------------------------------------------------------------- I hope this is correct representation of ISO-8859-2 encoding, which is used in most Center European languages. Drop me a mail at , if you find a bug here. Modified by ES: cleared 0x9? slots and replaced 0xB7 circumflex->caron ---------------------------------------------------------- Encoding=ISOLatin2Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quoteright /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ minus /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ quoteleft /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ .notdef /* '220 144 "90 */ .notdef /* '221 145 "91 */ .notdef /* '222 146 "92 */ .notdef /* '223 147 "93 */ .notdef /* '224 148 "94 */ .notdef /* '225 149 "95 */ .notdef /* '226 150 "96 */ .notdef /* '227 151 "97 */ .notdef /* '230 152 "98 */ .notdef /* '231 153 "99 */ .notdef /* '232 154 "9A */ .notdef /* '233 155 "9B */ .notdef /* '234 156 "9C */ .notdef /* '235 157 "9D */ .notdef /* '236 158 "9E */ .notdef /* '237 159 "9F */ space /* '240 160 "A0 */ Aogonek /* '241 161 "A1 */ breve /* '242 162 "A2 */ Lslash /* '243 163 "A3 */ currency /* '244 164 "A4 */ Lcaron /* '245 165 "A5 */ Sacute /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ Scaron /* '251 169 "A9 */ Scedilla /* '252 170 "AA */ Tcaron /* '253 171 "AB */ Zacute /* '254 172 "AC */ hyphen /* '255 173 "AD */ Zcaron /* '256 174 "AE */ Zdotaccent /* '257 175 "AF */ degree /* '260 176 "B0 */ aogonek /* '261 177 "B1 */ ogonek /* '262 178 "B2 */ lslash /* '263 179 "B3 */ acute /* '264 180 "B4 */ lcaron /* '265 181 "B5 */ sacute /* '266 182 "B6 */ caron /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ scaron /* '271 185 "B9 */ scedilla /* '272 186 "BA */ tcaron /* '273 187 "BB */ zacute /* '274 188 "BC */ hungarumlaut /* '275 189 "BD */ zcaron /* '276 190 "BE */ zdotaccent /* '277 191 "BF */ Racute /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Abreve /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Lacute /* '305 197 "C5 */ Cacute /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Ccaron /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Eogonek /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Ecaron /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Dcaron /* '317 207 "CF */ Eth /* '320 208 "D0 */ Nacute /* '321 209 "D1 */ Ncaron /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Ohungarumlaut /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Rcaron /* '330 216 "D8 */ Uring /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Uhungarumlaut /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Tcedilla /* '336 222 "DE */ germandbls /* '337 223 "DF */ racute /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ abreve /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ lacute /* '345 229 "E5 */ cacute /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ ccaron /* '350 232 "E8 */ eacute /* '351 233 "E9 */ eogonek /* '352 234 "EA */ edieresis /* '353 235 "EB */ ecaron /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ dcaron /* '357 239 "EF */ eth /* '360 240 "F0 */ nacute /* '361 241 "F1 */ ncaron /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ ohungarumlaut /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ rcaron /* '370 248 "F8 */ uring /* '371 249 "F9 */ uacute /* '372 250 "FA */ uhungarumlaut /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ tcedilla /* '376 254 "FE */ dotaccent /* '377 255 "FF */ grace-5.1.23/fonts/enc/IsoLatin7.enc0000644000076500001440000002767707530521363016655 0ustar fnevgenyusersThis describes the ISOLatin7Encoding. ISO 8859-13 (Latin-7) ------------------------------------------------------------------------ Encoding=ISOLatin7Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ .notdef /* '220 144 "90 */ .notdef /* '221 145 "91 */ .notdef /* '222 146 "92 */ .notdef /* '223 147 "93 */ .notdef /* '224 148 "94 */ .notdef /* '225 149 "95 */ .notdef /* '226 150 "96 */ .notdef /* '227 151 "97 */ .notdef /* '230 152 "98 */ .notdef /* '231 153 "99 */ .notdef /* '232 154 "9A */ .notdef /* '233 155 "9B */ .notdef /* '234 156 "9C */ .notdef /* '235 157 "9D */ .notdef /* '236 158 "9E */ .notdef /* '237 159 "9F */ space /* '240 160 "A0 */ quotedblright /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ quotedblbase /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ Oslash /* '250 168 "A8 */ copyright /* '251 169 "A9 */ Rcommaaccent /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ AE /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ quotedblleft /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ oslash /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ rcommaaccent /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ ae /* '277 191 "BF */ Aogonek /* '300 192 "C0 */ Iogonek /* '301 193 "C1 */ Amacron /* '302 194 "C2 */ Cacute /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ Eogonek /* '306 198 "C6 */ Emacron /* '307 199 "C7 */ Ccaron /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Zacute /* '312 202 "CA */ Edotaccent /* '313 203 "CB */ Gcommaaccent /* '314 204 "CC */ Kcommaaccent /* '315 205 "CD */ Imacron /* '316 206 "CE */ Lcommaaccent /* '317 207 "CF */ Scaron /* '320 208 "D0 */ Nacute /* '321 209 "D1 */ Ncommaaccent /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Omacron /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Uogonek /* '330 216 "D8 */ Lslash /* '331 217 "D9 */ Sacute /* '332 218 "DA */ Umacron /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Zdotaccent /* '335 221 "DD */ Zcaron /* '336 222 "DE */ germandbls /* '337 223 "DF */ aogonek /* '340 224 "E0 */ iogonek /* '341 225 "E1 */ amacron /* '342 226 "E2 */ cacute /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ eogonek /* '346 230 "E6 */ emacron /* '347 231 "E7 */ ccaron /* '350 232 "E8 */ eacute /* '351 233 "E9 */ zacute /* '352 234 "EA */ edotaccent /* '353 235 "EB */ gcommaaccent /* '354 236 "EC */ kcommaaccent /* '355 237 "ED */ imacron /* '356 238 "EE */ lcommaaccent /* '357 239 "EF */ scaron /* '360 240 "F0 */ nacute /* '361 241 "F1 */ ncommaaccent /* '362 242 "F2 */ oacute /* '363 243 "F3 */ omacron /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ uogonek /* '370 248 "F8 */ lslash /* '371 249 "F9 */ sacute /* '372 250 "FA */ umacron /* '373 251 "FB */ udieresis /* '374 252 "FC */ zdotaccent /* '375 253 "FD */ zcaron /* '376 254 "FE */ quoteright /* '377 255 "FF */ grace-5.1.23/fonts/enc/WinAnsi.enc0000644000076500001440000003010507007421044016362 0ustar fnevgenyusers WinAnsi encoding vector Encoding=WinAnsiEncoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ bullet /* '177 127 "7F */ Euro /* '200 128 "80 */ bullet /* '201 129 "81 */ quotesinglbase /* '202 130 "82 */ florin /* '203 131 "83 */ quotedblbase /* '204 132 "84 */ ellipsis /* '205 133 "85 */ dagger /* '206 134 "86 */ daggerdbl /* '207 135 "87 */ circumflex /* '210 136 "88 */ perthousand /* '211 137 "89 */ Scaron /* '212 138 "8A */ guilsinglleft /* '213 139 "8B */ OE /* '214 140 "8C */ bullet /* '215 141 "8D */ Zcaron /* '216 142 "8E */ bullet /* '217 143 "8F */ bullet /* '220 144 "90 */ quoteleft /* '221 145 "91 */ quoteright /* '222 146 "92 */ quotedblleft /* '223 147 "93 */ quotedblright /* '224 148 "94 */ bullet /* '225 149 "95 */ endash /* '226 150 "96 */ emdash /* '227 151 "97 */ tilde /* '230 152 "98 */ trademark /* '231 153 "99 */ scaron /* '232 154 "9A */ guilsinglright /* '233 155 "9B */ oe /* '234 156 "9C */ bullet /* '235 157 "9D */ zcaron /* '236 158 "9E */ Ydieresis /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/IsoLatin9.enc0000644000076500001440000003023407070265677016652 0ustar fnevgenyusersISO 8859-15 (Latin-9) Latin-9 is a variation of Latin-1 which adds the Euro character as well as some missing French and Finnish characters. Latin-9 is sometimes also dubbed Latin-0. -------------------------------------------------------------------------- Encoding=ISOLatin9Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ .notdef /* '220 144 "90 */ .notdef /* '221 145 "91 */ .notdef /* '222 146 "92 */ .notdef /* '223 147 "93 */ .notdef /* '224 148 "94 */ .notdef /* '225 149 "95 */ .notdef /* '226 150 "96 */ .notdef /* '227 151 "97 */ .notdef /* '230 152 "98 */ .notdef /* '231 153 "99 */ .notdef /* '232 154 "9A */ .notdef /* '233 155 "9B */ .notdef /* '234 156 "9C */ .notdef /* '235 157 "9D */ .notdef /* '236 158 "9E */ .notdef /* '237 159 "9F */ space /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ Euro /* '244 164 "A4 */ yen /* '245 165 "A5 */ Scaron /* '246 166 "A6 */ section /* '247 167 "A7 */ scaron /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ hyphen /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ Zcaron /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ bullet /* '267 183 "B7 */ zcaron /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ OE /* '274 188 "BC */ oe /* '275 189 "BD */ Ydieresis /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/IsoLatin5.enc0000644000076500001440000003325110505254503016627 0ustar fnevgenyusersISO 8859-9 (Latin-5) -------------------------------------------------------------------------- Encoding=ISOLatin5Encoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ .notdef /* '200 128 "80 */ .notdef /* '201 129 "81 */ .notdef /* '202 130 "82 */ .notdef /* '203 131 "83 */ .notdef /* '204 132 "84 */ .notdef /* '205 133 "85 */ .notdef /* '206 134 "86 */ .notdef /* '207 135 "87 */ .notdef /* '210 136 "88 */ .notdef /* '211 137 "89 */ .notdef /* '212 138 "8A */ .notdef /* '213 139 "8B */ .notdef /* '214 140 "8C */ .notdef /* '215 141 "8D */ .notdef /* '216 142 "8E */ .notdef /* '217 143 "8F */ .notdef /* '220 144 "90 */ .notdef /* '221 145 "91 */ .notdef /* '222 146 "92 */ .notdef /* '223 147 "93 */ .notdef /* '224 148 "94 */ .notdef /* '225 149 "95 */ .notdef /* '226 150 "96 */ .notdef /* '227 151 "97 */ .notdef /* '230 152 "98 */ .notdef /* '231 153 "99 */ .notdef /* '232 154 "9A */ .notdef /* '233 155 "9B */ .notdef /* '234 156 "9C */ .notdef /* '235 157 "9D */ .notdef /* '236 158 "9E */ .notdef /* '237 159 "9F */ uni00A0 /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ uni00AD /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Gbreve /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Idotaccent /* '335 221 "DD */ Scedilla /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ gbreve /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ dotlessi /* '375 253 "FD */ scedilla /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/PDFDoc.enc0000644000076500001440000003004707007421044016056 0ustar fnevgenyusers PDFDoc encoding vector Encoding=PDFDocEncoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ breve /* '030 024 "18 */ caron /* '031 025 "19 */ circumflex /* '032 026 "1A */ dotaccent /* '033 027 "1B */ hungarumlaut /* '034 028 "1C */ ogonek /* '035 029 "1D */ ring /* '036 030 "1E */ tilde /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ bullet /* '200 128 "80 */ dagger /* '201 129 "81 */ daggerdbl /* '202 130 "82 */ ellipsis /* '203 131 "83 */ emdash /* '204 132 "84 */ endash /* '205 133 "85 */ florin /* '206 134 "86 */ fraction /* '207 135 "87 */ guilsinglleft /* '210 136 "88 */ guilsinglright /* '211 137 "89 */ minus /* '212 138 "8A */ perthousand /* '213 139 "8B */ quotedblbase /* '214 140 "8C */ quotedblleft /* '215 141 "8D */ quotedblright /* '216 142 "8E */ quoteleft /* '217 143 "8F */ quoteright /* '220 144 "90 */ quotesinglbase /* '221 145 "91 */ trademark /* '222 146 "92 */ fi /* '223 147 "93 */ fl /* '224 148 "94 */ Lslash /* '225 149 "95 */ OE /* '226 150 "96 */ Scaron /* '227 151 "97 */ Ydieresis /* '230 152 "98 */ Zcaron /* '231 153 "99 */ dotlessi /* '232 154 "9A */ lslash /* '233 155 "9B */ oe /* '234 156 "9C */ scaron /* '235 157 "9D */ zcaron /* '236 158 "9E */ .notdef /* '237 159 "9F */ Euro /* '240 160 "A0 */ exclamdown /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ currency /* '244 164 "A4 */ yen /* '245 165 "A5 */ brokenbar /* '246 166 "A6 */ section /* '247 167 "A7 */ dieresis /* '250 168 "A8 */ copyright /* '251 169 "A9 */ ordfeminine /* '252 170 "AA */ guillemotleft /* '253 171 "AB */ logicalnot /* '254 172 "AC */ .notdef /* '255 173 "AD */ registered /* '256 174 "AE */ macron /* '257 175 "AF */ degree /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ twosuperior /* '262 178 "B2 */ threesuperior /* '263 179 "B3 */ acute /* '264 180 "B4 */ mu /* '265 181 "B5 */ paragraph /* '266 182 "B6 */ periodcentered /* '267 183 "B7 */ cedilla /* '270 184 "B8 */ onesuperior /* '271 185 "B9 */ ordmasculine /* '272 186 "BA */ guillemotright /* '273 187 "BB */ onequarter /* '274 188 "BC */ onehalf /* '275 189 "BD */ threequarters /* '276 190 "BE */ questiondown /* '277 191 "BF */ Agrave /* '300 192 "C0 */ Aacute /* '301 193 "C1 */ Acircumflex /* '302 194 "C2 */ Atilde /* '303 195 "C3 */ Adieresis /* '304 196 "C4 */ Aring /* '305 197 "C5 */ AE /* '306 198 "C6 */ Ccedilla /* '307 199 "C7 */ Egrave /* '310 200 "C8 */ Eacute /* '311 201 "C9 */ Ecircumflex /* '312 202 "CA */ Edieresis /* '313 203 "CB */ Igrave /* '314 204 "CC */ Iacute /* '315 205 "CD */ Icircumflex /* '316 206 "CE */ Idieresis /* '317 207 "CF */ Eth /* '320 208 "D0 */ Ntilde /* '321 209 "D1 */ Ograve /* '322 210 "D2 */ Oacute /* '323 211 "D3 */ Ocircumflex /* '324 212 "D4 */ Otilde /* '325 213 "D5 */ Odieresis /* '326 214 "D6 */ multiply /* '327 215 "D7 */ Oslash /* '330 216 "D8 */ Ugrave /* '331 217 "D9 */ Uacute /* '332 218 "DA */ Ucircumflex /* '333 219 "DB */ Udieresis /* '334 220 "DC */ Yacute /* '335 221 "DD */ Thorn /* '336 222 "DE */ germandbls /* '337 223 "DF */ agrave /* '340 224 "E0 */ aacute /* '341 225 "E1 */ acircumflex /* '342 226 "E2 */ atilde /* '343 227 "E3 */ adieresis /* '344 228 "E4 */ aring /* '345 229 "E5 */ ae /* '346 230 "E6 */ ccedilla /* '347 231 "E7 */ egrave /* '350 232 "E8 */ eacute /* '351 233 "E9 */ ecircumflex /* '352 234 "EA */ edieresis /* '353 235 "EB */ igrave /* '354 236 "EC */ iacute /* '355 237 "ED */ icircumflex /* '356 238 "EE */ idieresis /* '357 239 "EF */ eth /* '360 240 "F0 */ ntilde /* '361 241 "F1 */ ograve /* '362 242 "F2 */ oacute /* '363 243 "F3 */ ocircumflex /* '364 244 "F4 */ otilde /* '365 245 "F5 */ odieresis /* '366 246 "F6 */ divide /* '367 247 "F7 */ oslash /* '370 248 "F8 */ ugrave /* '371 249 "F9 */ uacute /* '372 250 "FA */ ucircumflex /* '373 251 "FB */ udieresis /* '374 252 "FC */ yacute /* '375 253 "FD */ thorn /* '376 254 "FE */ ydieresis /* '377 255 "FF */ grace-5.1.23/fonts/enc/MacRoman.enc0000644000076500001440000002773107007421044016522 0ustar fnevgenyusers MacRoman encoding vector Encoding=MacRomanEncoding /* The name of the encoding scheme */ .notdef /* '000 000 "00 */ .notdef /* '001 001 "01 */ .notdef /* '002 002 "02 */ .notdef /* '003 003 "03 */ .notdef /* '004 004 "04 */ .notdef /* '005 005 "05 */ .notdef /* '006 006 "06 */ .notdef /* '007 007 "07 */ .notdef /* '010 008 "08 */ .notdef /* '011 009 "09 */ .notdef /* '012 010 "0A */ .notdef /* '013 011 "0B */ .notdef /* '014 012 "0C */ .notdef /* '015 013 "0D */ .notdef /* '016 014 "0E */ .notdef /* '017 015 "0F */ .notdef /* '020 016 "10 */ .notdef /* '021 017 "11 */ .notdef /* '022 018 "12 */ .notdef /* '023 019 "13 */ .notdef /* '024 020 "14 */ .notdef /* '025 021 "15 */ .notdef /* '026 022 "16 */ .notdef /* '027 023 "17 */ .notdef /* '030 024 "18 */ .notdef /* '031 025 "19 */ .notdef /* '032 026 "1A */ .notdef /* '033 027 "1B */ .notdef /* '034 028 "1C */ .notdef /* '035 029 "1D */ .notdef /* '036 030 "1E */ .notdef /* '037 031 "1F */ space /* '040 032 "20 */ exclam /* '041 033 "21 */ quotedbl /* '042 034 "22 */ numbersign /* '043 035 "23 */ dollar /* '044 036 "24 */ percent /* '045 037 "25 */ ampersand /* '046 038 "26 */ quotesingle /* '047 039 "27 */ parenleft /* '050 040 "28 */ parenright /* '051 041 "29 */ asterisk /* '052 042 "2A */ plus /* '053 043 "2B */ comma /* '054 044 "2C */ hyphen /* '055 045 "2D */ period /* '056 046 "2E */ slash /* '057 047 "2F */ zero /* '060 048 "30 */ one /* '061 049 "31 */ two /* '062 050 "32 */ three /* '063 051 "33 */ four /* '064 052 "34 */ five /* '065 053 "35 */ six /* '066 054 "36 */ seven /* '067 055 "37 */ eight /* '070 056 "38 */ nine /* '071 057 "39 */ colon /* '072 058 "3A */ semicolon /* '073 059 "3B */ less /* '074 060 "3C */ equal /* '075 061 "3D */ greater /* '076 062 "3E */ question /* '077 063 "3F */ at /* '100 064 "40 */ A /* '101 065 "41 */ B /* '102 066 "42 */ C /* '103 067 "43 */ D /* '104 068 "44 */ E /* '105 069 "45 */ F /* '106 070 "46 */ G /* '107 071 "47 */ H /* '110 072 "48 */ I /* '111 073 "49 */ J /* '112 074 "4A */ K /* '113 075 "4B */ L /* '114 076 "4C */ M /* '115 077 "4D */ N /* '116 078 "4E */ O /* '117 079 "4F */ P /* '120 080 "50 */ Q /* '121 081 "51 */ R /* '122 082 "52 */ S /* '123 083 "53 */ T /* '124 084 "54 */ U /* '125 085 "55 */ V /* '126 086 "56 */ W /* '127 087 "57 */ X /* '130 088 "58 */ Y /* '131 089 "59 */ Z /* '132 090 "5A */ bracketleft /* '133 091 "5B */ backslash /* '134 092 "5C */ bracketright /* '135 093 "5D */ asciicircum /* '136 094 "5E */ underscore /* '137 095 "5F */ grave /* '140 096 "60 */ a /* '141 097 "61 */ b /* '142 098 "62 */ c /* '143 099 "63 */ d /* '144 100 "64 */ e /* '145 101 "65 */ f /* '146 102 "66 */ g /* '147 103 "67 */ h /* '150 104 "68 */ i /* '151 105 "69 */ j /* '152 106 "6A */ k /* '153 107 "6B */ l /* '154 108 "6C */ m /* '155 109 "6D */ n /* '156 110 "6E */ o /* '157 111 "6F */ p /* '160 112 "70 */ q /* '161 113 "71 */ r /* '162 114 "72 */ s /* '163 115 "73 */ t /* '164 116 "74 */ u /* '165 117 "75 */ v /* '166 118 "76 */ w /* '167 119 "77 */ x /* '170 120 "78 */ y /* '171 121 "79 */ z /* '172 122 "7A */ braceleft /* '173 123 "7B */ bar /* '174 124 "7C */ braceright /* '175 125 "7D */ asciitilde /* '176 126 "7E */ .notdef /* '177 127 "7F */ Adieresis /* '200 128 "80 */ Aring /* '201 129 "81 */ Ccedilla /* '202 130 "82 */ Eacute /* '203 131 "83 */ Ntilde /* '204 132 "84 */ Odieresis /* '205 133 "85 */ Udieresis /* '206 134 "86 */ aacute /* '207 135 "87 */ agrave /* '210 136 "88 */ acircumflex /* '211 137 "89 */ adieresis /* '212 138 "8A */ atilde /* '213 139 "8B */ aring /* '214 140 "8C */ ccedilla /* '215 141 "8D */ eacute /* '216 142 "8E */ egrave /* '217 143 "8F */ ecircumflex /* '220 144 "90 */ edieresis /* '221 145 "91 */ iacute /* '222 146 "92 */ igrave /* '223 147 "93 */ icircumflex /* '224 148 "94 */ idieresis /* '225 149 "95 */ ntilde /* '226 150 "96 */ oacute /* '227 151 "97 */ ograve /* '230 152 "98 */ ocircumflex /* '231 153 "99 */ odieresis /* '232 154 "9A */ otilde /* '233 155 "9B */ uacute /* '234 156 "9C */ ugrave /* '235 157 "9D */ ucircumflex /* '236 158 "9E */ udieresis /* '237 159 "9F */ dagger /* '240 160 "A0 */ degree /* '241 161 "A1 */ cent /* '242 162 "A2 */ sterling /* '243 163 "A3 */ section /* '244 164 "A4 */ bullet /* '245 165 "A5 */ paragraph /* '246 166 "A6 */ germandbls /* '247 167 "A7 */ registered /* '250 168 "A8 */ copyright /* '251 169 "A9 */ trademark /* '252 170 "AA */ acute /* '253 171 "AB */ dieresis /* '254 172 "AC */ .notdef /* '255 173 "AD */ AE /* '256 174 "AE */ Oslash /* '257 175 "AF */ .notdef /* '260 176 "B0 */ plusminus /* '261 177 "B1 */ .notdef /* '262 178 "B2 */ .notdef /* '263 179 "B3 */ yen /* '264 180 "B4 */ mu /* '265 181 "B5 */ .notdef /* '266 182 "B6 */ .notdef /* '267 183 "B7 */ .notdef /* '270 184 "B8 */ .notdef /* '271 185 "B9 */ .notdef /* '272 186 "BA */ ordfeminine /* '273 187 "BB */ ordmasculine /* '274 188 "BC */ .notdef /* '275 189 "BD */ ae /* '276 190 "BE */ oslash /* '277 191 "BF */ questiondown /* '300 192 "C0 */ exclamdown /* '301 193 "C1 */ logicalnot /* '302 194 "C2 */ .notdef /* '303 195 "C3 */ florin /* '304 196 "C4 */ .notdef /* '305 197 "C5 */ .notdef /* '306 198 "C6 */ guillemotleft /* '307 199 "C7 */ guillemotright /* '310 200 "C8 */ ellipsis /* '311 201 "C9 */ space /* '312 202 "CA */ Agrave /* '313 203 "CB */ Atilde /* '314 204 "CC */ Otilde /* '315 205 "CD */ OE /* '316 206 "CE */ oe /* '317 207 "CF */ endash /* '320 208 "D0 */ emdash /* '321 209 "D1 */ quotedblleft /* '322 210 "D2 */ quotedblright /* '323 211 "D3 */ quoteleft /* '324 212 "D4 */ quoteright /* '325 213 "D5 */ divide /* '326 214 "D6 */ .notdef /* '327 215 "D7 */ ydieresis /* '330 216 "D8 */ Ydieresis /* '331 217 "D9 */ fraction /* '332 218 "DA */ currency /* '333 219 "DB */ guilsingleft /* '334 220 "DC */ guilsingright /* '335 221 "DD */ fi /* '336 222 "DE */ fl /* '337 223 "DF */ daggerdbl /* '340 224 "E0 */ periodcentered /* '341 225 "E1 */ quotesinglbase /* '342 226 "E2 */ quotedblbase /* '343 227 "E3 */ perthousand /* '344 228 "E4 */ Acircumflex /* '345 229 "E5 */ Ecircumflex /* '346 230 "E6 */ Aacute /* '347 231 "E7 */ Edieresis /* '350 232 "E8 */ Egrave /* '351 233 "E9 */ Iacute /* '352 234 "EA */ Icircumflex /* '353 235 "EB */ Idieresis /* '354 236 "EC */ Igrave /* '355 237 "ED */ Oacute /* '356 238 "EE */ Ocircumflex /* '357 239 "EF */ .notdef /* '360 240 "F0 */ Ograve /* '361 241 "F1 */ Uacute /* '362 242 "F2 */ Ucircumflex /* '363 243 "F3 */ Ugrave /* '364 244 "F4 */ dotlessi /* '365 245 "F5 */ circumflex /* '366 246 "F6 */ tilde /* '367 247 "F7 */ macron /* '370 248 "F8 */ breve /* '371 249 "F9 */ dotaccent /* '372 250 "FA */ ring /* '373 251 "FB */ cedilla /* '374 252 "FC */ hungarumlaut /* '375 253 "FD */ ogonek /* '376 254 "FE */ caron /* '377 255 "FF */ grace-5.1.23/fonts/enc/CP1251.enc0000644000076500001440000000371607574376420015655 0ustar fnevgenyusersEncoding=CP1251 .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quoteright parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef afii10051 afii10052 quotesinglbase afii10100 quotedblbase ellipsis dagger daggerdbl Euro perthousand afii10058 guilsinglleft afii10059 afii10061 afii10060 afii10145 afii10099 quoteleft quoteright quotedblleft quotedblright bullet endash emdash tilde trademark afii10106 guilsinglright afii10107 afii10109 afii10108 afii10193 .notdef afii10062 afii10110 afii10057 currency afii10050 brokenbar section afii10023 copyright afii10053 guillemotleft logicalnot hyphen registered afii10056 degree plusminus afii10055 afii10103 afii10098 mu paragraph periodcentered afii10071 afii61352 afii10101 guillemotright afii10105 afii10054 afii10102 afii10104 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 grace-5.1.23/fonts/enc/KOI8-U.enc0000644000076500001440000000362607574376420015756 0ustar fnevgenyusersEncoding=KOI8-U .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef SF100000 SF110000 SF010000 SF030000 SF020000 SF040000 SF080000 SF090000 SF060000 SF070000 SF050000 upblock dnblock block lfblock rtblock ltshade shade dkshade integraltp filledbox uni2219 radical approxequal lessequal greaterequal uni00A0 integralbt degree twosuperior periodcentered divide SF430000 SF240000 SF510000 afii10071 afii10101 SF390000 afii10103 afii10104 SF250000 SF500000 SF490000 SF380000 SF280000 afii10098 SF260000 SF360000 SF370000 SF420000 SF190000 afii10023 afii10053 SF230000 afii10055 afii10056 SF410000 SF450000 SF460000 SF400000 SF540000 afii10050 SF440000 copyright afii10096 afii10065 afii10066 afii10088 afii10069 afii10070 afii10086 afii10068 afii10087 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10097 afii10082 afii10083 afii10084 afii10085 afii10072 afii10067 afii10094 afii10093 afii10073 afii10090 afii10095 afii10091 afii10089 afii10092 afii10048 afii10017 afii10018 afii10040 afii10021 afii10022 afii10038 afii10020 afii10039 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10049 afii10034 afii10035 afii10036 afii10037 afii10024 afii10019 afii10046 afii10045 afii10025 afii10042 afii10047 afii10043 afii10041 afii10044 grace-5.1.23/Makefile0000644000076500001440000000352311116553346014100 0ustar fnevgenyusers##################################################### # Top-level Makefile for Grace # ##################################################### # You should not change anything here. # ##################################################### include Make.conf subdirs : configure Make.conf @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE)) || exit 1; done all : subdirs install : subdirs @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) install) || exit 1; done $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME) @if test -f $(DESTDIR)$(GRACE_HOME)/gracerc; then \ echo " $(DESTDIR)$(GRACE_HOME)/gracerc exists"; \ echo " Installing only $(DESTDIR)$(GRACE_HOME)/gracerc.sample"; \ $(INSTALL_DATA) gracerc $(DESTDIR)$(GRACE_HOME)/gracerc.sample; \ else \ $(INSTALL_DATA) gracerc $(DESTDIR)$(GRACE_HOME); \ fi $(INSTALL_DATA) gracerc.user $(DESTDIR)$(GRACE_HOME) tests : subdirs @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) tests) || exit 1; done check : tests links : subdirs @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) links) || exit 1; done clean : @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done distclean : @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) distclean) || exit 1; done $(RM) config.log config.status config.cache config.h Make.conf devclean : @set -e; for i in $(SUBDIRS); do (cd $$i; $(MAKE) devclean) || exit 1; done $(RM) config.log config.status config.cache config.h Make.conf \ configure CHANGES ChangeLog texts : CHANGES ChangeLog CHANGES : doc/CHANGES.html @lynx -dump $? > CHANGES ChangeLog : ./scripts/cvs2cl.pl -F grace-5_1-series Make.conf : ac-tools/Make.conf.in configure @echo @echo 'Please re-run ./configure' @echo @exit 1 configure : ac-tools/configure.in ac-tools/aclocal.m4 autoconf ac-tools/configure.in > $@ && chmod +x $@ dummy : grace-5.1.23/patches/0000755000076500001440000000000012032153126014052 5ustar fnevgenyusersgrace-5.1.23/patches/autoconf.patch0000644000076500001440000000131007126222601016707 0ustar fnevgenyusersThis is a patch fixing AC_TRY_RUN() behaviour. It should be applied if you're going to re-generate the configure script. --- autoconf-2.13/acgeneral.m4.orig Tue Jan 5 15:27:37 1999 +++ autoconf-2.13/acgeneral.m4 Wed Jun 28 01:02:43 2000 @@ -1825,14 +1825,15 @@ EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then + ifelse([$2], , :, [ $2 + rm -fr conftest* +]) dnl Don't remove the temporary files here, so they can be examined. - ifelse([$2], , :, [$2]) else +ifelse([$3], , , [ $3 ] echo "configure: failed program was:" >&AC_FD_CC cat conftest.$ac_ext >&AC_FD_CC -ifelse([$3], , , [ rm -fr conftest* - $3 -])dnl +)dnl fi rm -fr conftest*]) grace-5.1.23/patches/XmHTML.patch0000644000076500001440000000434407121271757016167 0ustar fnevgenyusersThe patch fixes: 1)
placement 2) formatting inside
 (not really nice HTML, but any browser
   supports it)
3) "Can't convert XmHTML_DEFAULT_GAMMA" runtime warning

--- XmHTML-1.1.7/lib/common/layout.c.orig	Thu Jan 28 02:10:17 1999
+++ XmHTML-1.1.7/lib/common/layout.c	Mon Jun 12 21:55:01 2000
@@ -2377,14 +2377,16 @@
 	* Linefeeds in rules are divided accross the rule: half above and
 	* half below.
 	*****/
-	if(data->linefeed)
+	if(data->linefeed) {
+		box->y += data->linefeed;
 		y_offset = data->linefeed/2;
-	else
+	} else {
 		y_offset = data->font->height/2; 
+	}
 
 	data->y = box->y + y_offset;
-
-	/* take height of rule into account as well */
+	
+        /* take height of rule into account as well */
 	y_offset += data->height/2;
 
 	/* full height of the box */
--- XmHTML-1.1.7/lib/common/parse.c.orig	Wed Jan 20 07:13:08 1999
+++ XmHTML-1.1.7/lib/common/parse.c	Mon Jun 12 01:40:19 2000
@@ -1258,6 +1258,24 @@
 				current == HT_U || current == HT_VAR ||
 				current == HT_FONT || current == HT_ZTEXT)
 				return(True);
+			
+            /* allow most container elements as well if we can relax */
+			if(!parser->strict_checking &&
+				(current == HT_TABLE || current == HT_TR || current == HT_TH ||
+					current == HT_TD || current == HT_OL || current == HT_UL ||
+					current == HT_DL || current == HT_P || current == HT_DIV ||
+					current == HT_BLOCKQUOTE || current == HT_CENTER ||
+					current == HT_FORM || current == HT_CAPTION ||
+					current == HT_H1 || current == HT_H2 || current == HT_H3 ||
+					current == HT_H4 || current == HT_H5 || current == HT_H6))
+			{
+#ifdef MINIPARSE
+				tag_is_wrong_but_allowed = True;
+#endif
+				/* but always issue a warning */
+				parserCallback(parser, current, state, HTML_VIOLATION);
+				return(True);
+			}
 			break;
 
 		case HT_ZTEXT:
--- XmHTML-1.1.7/include/XmHTML/resources.h.orig	Sun Dec 13 14:48:46 1998
+++ XmHTML-1.1.7/include/XmHTML/resources.h	Tue Jun 13 02:29:30 2000
@@ -102,7 +102,9 @@
 #define _resources_h_
 
 #define Offset(field) XtOffsetOf(XmHTMLRec, html.field)
-#define Stringify(VAL)	#VAL
+/* Must use cpp prescan for two levels of macros */
+#define Stringify(VAL)  _Stringify(VAL)
+#define _Stringify(VAL) #VAL
 
 static XtResource resources [] =
 {
grace-5.1.23/grace_np/0000755000076500001440000000000012032153126014201 5ustar  fnevgenyusersgrace-5.1.23/grace_np/grace_np.c0000644000076500001440000002351511573735405016150 0ustar  fnevgenyusers/*
 * grace_np - a library for interfacing with Grace using pipes
 * 
 * Copyright (c) 1997-1998 Henrik Seidel
 * Copyright (c) 1999-2003 Grace Development Team
 *
 *
 *                           All Rights Reserved
 * 
 *    This library 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 library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Library General Public License for more details.
 * 
 *    You should have received a copy of the GNU Library General Public
 *    License along with this library; if not, write to the Free
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#ifdef HAVE_SYS_PARAM_H
#  include 
#endif
#include 
#include 
#ifdef HAVE_FCNTL_H
#  include 
#endif
#ifdef HAVE_SYS_WAIT_H
#  include 
#endif
#include 
#ifndef OPEN_MAX
#  define OPEN_MAX 256
#endif

#include "grace_np.h"

/* static global variables */
static char* buf = NULL;               /* global write buffer */
static int bufsize;                    /* size of the global write buffer */
static int bufsizeforce;               /* threshold for forcing a flush */
static int fd_pipe = -1;               /* file descriptor of the pipe */
static pid_t pid = (pid_t) -1;         /* pid of grace */

/*
 * notify grace when finished
 */
static void
#ifdef HAVE_ON_EXIT
notify_grace_on_exit(int status, void* arg)
#else
notify_grace_on_exit(void)
#endif
{
    if (fd_pipe != -1) {
        GraceClosePipe();
    }
}

/*
 * default function for reporting errors
 */
static void
GraceDefaultError(const char *msg)
{
    fprintf(stderr, "%s\n", msg);
}

/*
 * variable holding user function for reporting errors
 */
static GraceErrorFunctionType error_function = GraceDefaultError;

/*
 * function for reporting system errors
 */
static void
GracePerror(const char *prefix)
{
    char msg[1024];

#ifdef HAVE_STRERROR
    sprintf(msg, "%s: %s", prefix, strerror(errno));
#else
# ifdef HAVE_SYS_ERRLIST_IN_STDIO_H
    sprintf(msg, "%s: %s", prefix, sys_errlist[errno]);
# else
    if (errno == EPIPE) {
        /* this one deserve special attention here */
        sprintf(msg, "%s: Broken pipe", prefix);
    } else {
        sprintf(msg, "%s: System error (errno = %d)", prefix, errno);
    }
# endif
#endif

    error_function(msg);
}

/* Close the pipe and free the buffer */
static void
GraceCleanup(void)
{
    if (fd_pipe != -1) {
        if (close(fd_pipe) != 0) {
            GracePerror("GraceCleanup");
        }
        fd_pipe = -1;
    }
    
    free(buf);
    buf = NULL;
}

/*
 * try to send data to grace (one pass only)
 */
static int
GraceOneWrite(int left)
{
    int written;

    written = write(fd_pipe, buf, left);

    if (written > 0) {

        left -= written;

        if (left > 0) {
            /* move the remaining characters (and the final '\0') */
#ifdef HAVE_MEMMOVE
            memmove(buf, buf + written, left + 1);
#else
            bcopy(buf + written, buf, left + 1);
#endif
        } else {
            /* clear the buffer */
            *buf = '\0';
        }

    } else if (written < 0) {
        if (errno == EPIPE) {
            /* Grace has closed the pipe : we cannot write anymore */
            GraceCleanup();
        } else {
            GracePerror("GraceOneWrite");
        }
        return (-1);
    }

    return (left);

}

/*
 * register a user function to report errors
 */
GraceErrorFunctionType
GraceRegisterErrorFunction(GraceErrorFunctionType f)
{
    GraceErrorFunctionType old = error_function;
    if (f != (GraceErrorFunctionType) NULL) {
        error_function = f;
    }
    return old;
}

static void
handle_sigchld(int signum)
{
    int status;
    pid_t retval;
    
    if (fd_pipe != -1) {
        if (pid > 0) {
            retval = waitpid(pid, &status, WNOHANG);
            if (retval == pid) {
                /* Grace just died */
                pid = (pid_t) -1;
		close(fd_pipe);
		fd_pipe = -1;
            }
        }
    }
}

static int
_GraceFlush(void)
{
    int loop, left;

    if (fd_pipe == -1) {
        return (-1);
    }

    left = strlen(buf);

    for (loop = 0; loop < 30; loop++) {
        left = GraceOneWrite(left);
        if (left < 0) {
            return (-1);
        } else if (left == 0) {
            return (0);
        }
    }

    error_function("GraceFlush: ran into eternal loop");

    return (-1);
}


int
GraceOpenVA(char* exe, int bs, ...)
{
    int i, fd[2];
    char fd_number[4];
    va_list ap;
    char **arglist;
    char *s;
    int numarg;

    if (fd_pipe != -1) {
        error_function("Grace subprocess already running");
        return (-1);
    }

    /* Make sure the buffer is not too small */
    if (bs < 64) {
        error_function("The buffer size in GraceOpenVA should be >= 64");
        return (-1);
    }
    bufsize = bs;
    bufsizeforce = bs / 2;

    /* make sure the grace subprocess is notified at the end */
#ifdef HAVE_ON_EXIT
    on_exit(notify_grace_on_exit, NULL);
#else
    atexit(notify_grace_on_exit);
#endif

    /* Don't exit on SIGPIPE */
    signal(SIGPIPE, SIG_IGN);
    
    /* Clean up zombie prcesses */
    signal(SIGCHLD, handle_sigchld);

    /* Make the pipe */
    if (pipe(fd)) {
        GracePerror("GraceOpenVA");
        return (-1);
    }

    /* Fork a subprocess for starting grace */
    pid = fork();
    if (pid == (pid_t) (-1)) {
        GracePerror("GraceOpenVA");
        close(fd[0]);
        close(fd[1]);
        return (-1);
    }

    /* If we are the child, replace ourselves with grace */
    if (pid == (pid_t) 0) {
        for (i = 0; i < OPEN_MAX; i++) {
            /* we close everything except stdin, stdout, stderr
               and the read part of the pipe */
            if (i != fd[0]         &&
                i != STDIN_FILENO  &&
                i != STDOUT_FILENO &&
                i != STDERR_FILENO) {
                close(i);
            }
        }

        /* build the argument list */
        va_start(ap, bs);
        numarg = 3;
        arglist = malloc((numarg + 1)*SIZEOF_VOID_P);
        arglist[0] = exe;
        arglist[1] = "-dpipe";
        sprintf(fd_number, "%d", fd[0]);
        arglist[2] = fd_number;
        while ((s = va_arg(ap, char *)) != NULL) {
            numarg++;
            arglist = realloc(arglist, (numarg + 1)*SIZEOF_VOID_P);
            arglist[numarg - 1] = s;
        }
        arglist[numarg] = NULL;
        va_end(ap);

        execvp(exe, arglist);
        
        /* if we get here execvp failed */
        fprintf(stderr, "GraceOpenVA: Could not start %s\n", exe);
        
        _exit(EXIT_FAILURE);
    }

    /* We are the parent -> keep the write part of the pipe
       and allocate the write buffer */
    buf = malloc(bufsize);
    if (buf == NULL) {
        error_function("GraceOpenVA: Not enough memory");
        close(fd[0]);
        close(fd[1]);
        return (-1);
    }
    *buf = '\0';

    close(fd[0]);
    fd_pipe = fd[1];

    return (0);
}

int
GraceOpen(int bs)
{
    return GraceOpenVA("xmgrace", bs, "-nosafe", "-noask", NULL);
}

int
GraceIsOpen(void)
{
    return (fd_pipe >= 0) ? 1 : 0;
}

int
GraceClose(void)
{
    if (fd_pipe == -1) {
        error_function("No grace subprocess1");
        return (-1);
    }

    /* Tell grace to exit */
    if (pid > 0) {
        /* what the mess with globals... */
        if ((GraceCommand ("exit") == -1 || _GraceFlush() == -1) && pid > 0) {
            kill(pid, SIGTERM);
        }
    }

    GraceCleanup();

    return (0);
}

int
GraceClosePipe(void)
{
    if (fd_pipe == -1) {
        error_function("No grace subprocess2");
        return (-1);
    }

    /* Tell grace to close the pipe */
    if (GraceCommand ("close") == -1 || _GraceFlush() == -1){
        GraceCleanup();
        return (-1);
    }

    GraceCleanup();
    
    return (0);
}

int
GraceFlush(void)
{
    if (fd_pipe == -1) {
        error_function("No grace subprocess3");
        return (-1);
    }

    return _GraceFlush();
}

int
GracePrintf(const char* fmt, ...)
{
    va_list ap;
    char* str;
    int nchar;
    
    if (fd_pipe == -1) {
        error_function("No grace subprocess4");
        return (0);
    }

    /* Allocate a new string buffer for the function arguments */
    str = (char *) malloc ((size_t) bufsize);
    if (str == (char *) NULL) {
        error_function("GracePrintf: Not enough memory");
        return (0);
    }
    /* Print to the string buffer according to the function arguments */
    va_start (ap, fmt);
#if defined(HAVE_VSNPRINTF)
    nchar = vsnprintf (str, bufsize - 2, fmt, ap);
#else
    nchar = vsprintf (str, fmt, ap);
#endif
    va_end (ap);
    nchar++;               /* This is for the appended "\n" */
    if (GraceCommand (str) == -1) {
        nchar = 0;
    }
    free (str);
    return (nchar);
}

int
GraceCommand(const char* cmd)
{
    int left;
    
    if (fd_pipe == -1) {
        error_function("No grace subprocess5");
        return (-1);
    }

    /* Append the new string to the global write buffer */
    if (strlen(buf) + strlen(cmd) + 2 > bufsize) {
        error_function("GraceCommand: Buffer full");
        return (-1);
    }
    strcat(buf, cmd);
    strcat(buf, "\n");
    left = strlen(buf);
    
    /* Try to send the global write buffer to grace */
    left = GraceOneWrite(left);
    if (left >= bufsizeforce) {
        if (_GraceFlush() != 0) {
            return (-1);
        }
    } else if (left < 0) {
        return (-1);
    }

    return (0);
}
grace-5.1.23/grace_np/grace_np.h0000644000076500001440000000407307212017670016143 0ustar  fnevgenyusers/*
 * grace_np - a library for interfacing with Grace using pipes
 * 
 * Copyright (c) 1997-1998 Henrik Seidel
 * Copyright (c) 1999-2000 Grace Development Team
 *
 *
 *                           All Rights Reserved
 * 
 *    This library 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 library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Library General Public License for more details.
 * 
 *    You should have received a copy of the GNU Library General Public
 *    License along with this library; if not, write to the Free
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef GRACE_NPIPE_H_
#define GRACE_NPIPE_H_

#ifdef __cplusplus
extern "C" {
#endif

/* register a user function to print errors */
/* (the default function appends a newline and prints to standard error) */
typedef void (*GraceErrorFunctionType) (const char *);
GraceErrorFunctionType GraceRegisterErrorFunction(GraceErrorFunctionType f);

/* launch a grace subprocess and a communication channel with it */
int GraceOpenVA(char* exe, int bs, ...);

/* a simplified (obsolete) version of the above */
int GraceOpen(int bs);

/* test if a grace subprocess is currently connected */
int GraceIsOpen(void);

/* close the communication channel and exit the grace subprocess */
int GraceClose(void);

/* close the communication channel and leave the grace subprocess alone */
int GraceClosePipe(void);

/* flush all the data remaining in the buffer */
int GraceFlush(void);

/* format a command and send it to the grace subprocess */
int GracePrintf(const char*, ...);

/* send an already formated command to the grace subprocess */
int GraceCommand(const char*);

#ifdef __cplusplus
}
#endif

#endif /* GRACE_NPIPE_H */
grace-5.1.23/grace_np/testf_np.f0000644000076500001440000000467206672604230016215 0ustar  fnevgenyusers       PROGRAM TESTF_NP
C
       IMPLICIT NONE
       INTEGER i
       CHARACTER*64 buf
C
       INTEGER GraceOpenf, GraceIsOpenf
       EXTERNAL GraceOpenf, GraceIsOpenf
       EXTERNAL GraceRegistErerrorFunctionf
       EXTERNAL GraceCommandf, GraceClosef
       EXTERNAL MyError
C
       CALL GraceRegistErerrorFunctionf (MyError)
C
C      Start Grace with a buffer size of 2048 and open the pipe
C
       IF (GraceOpenf(2048) .EQ. -1) THEN
           WRITE (*,*) 'Can not run grace.'
           CALL EXIT (1)
       ENDIF
C
C      Send some initialization commands to Grace
C
       CALL GraceCommandf ('world xmax 100')
       CALL GraceCommandf ('world ymax 10000')
       CALL GraceCommandf ('xaxis tick major 20')
       CALL GraceCommandf ('xaxis tick minor 10')
       CALL GraceCommandf ('yaxis tick major 2000')
       CALL GraceCommandf ('yaxis tick minor 1000')
       CALL GraceCommandf ('s0 on')
       CALL GraceCommandf ('s0 symbol 1')
       CALL GraceCommandf ('s0 symbol size 0.3')
       CALL GraceCommandf ('s0 symbol fill pattern 1')
       CALL GraceCommandf ('s1 on')
       CALL GraceCommandf ('s1 symbol 1')
       CALL GraceCommandf ('s1 symbol size 0.3')
       CALL GraceCommandf ('s1 symbol fill pattern 1')
C
C      Display sample data
C
       DO i = 1, 100, 1
           IF (GraceIsOpenf () .NE. 0) THEN
               WRITE (buf, 1) i, i
               CALL GraceCommandf (buf)
               WRITE (buf, 2) i, i**2
               CALL GraceCommandf (buf)
C
C              Update the Grace display after every ten steps
C
               IF (10*(i / 10) .EQ. i) THEN
                   CALL GraceCommandf ('redraw')
C                  Wait a second, just to simulate some time needed
C                  for calculations. Your real application shouldn't wait
                   CALL SLEEP (1)
               ENDIF
           ENDIF
       ENDDO
C
       IF (GraceIsOpenf () .NE. 0) THEN
C
C          Tell Grace to save the data
C
           CALL GraceCommandf ('saveall "sample.agr"')
C
C          Flush the output buffer and close Grace
C
           CALL GraceClosef ()
C
C          We are done
C
           CALL EXIT (0)
       ELSE
           CALL EXIT (1)
       ENDIF
C      
 1     FORMAT ('g0.s0 point ', I6, ' , ', I6)
 2     FORMAT ('g0.s1 point ', I6, ' , ', I6)
C
       END
C
       SUBROUTINE MyError (str)
C
       IMPLICIT NONE
       CHARACTER*(*) str
C
       WRITE (0, '(''library message : "'', a, ''"'')') str
C
       RETURN
       END
grace-5.1.23/grace_np/test_np.c0000644000076500001440000000364406672604230016042 0ustar  fnevgenyusers#include 
#include 
#include 
#include "grace_np.h"

#ifndef EXIT_SUCCESS
#  define EXIT_SUCCESS 0
#endif

#ifndef EXIT_FAILURE
#  define EXIT_FAILURE -1
#endif

void my_error_function(const char *msg)
{
    fprintf(stderr, "library message : \"%s\"\n", msg);
}

int
main (int argc, char* argv[])
{
    int i;

    GraceRegisterErrorFunction (my_error_function);

    /* Start Grace with a buffer size of 2048 and open the pipe */
    if (GraceOpen(2048) == -1) {
        fprintf (stderr, "Can't run Grace. \n");
        exit (EXIT_FAILURE);
    }
    
    /* Send some initialization commands to Grace */
    GracePrintf ("world xmax 100");
    GracePrintf ("world ymax 10000");
    GracePrintf ("xaxis tick major 20");
    GracePrintf ("xaxis tick minor 10");
    GracePrintf ("yaxis tick major 2000");
    GracePrintf ("yaxis tick minor 1000");
    GracePrintf ("s0 on");
    GracePrintf ("s0 symbol 1");
    GracePrintf ("s0 symbol size 0.3");
    GracePrintf ("s0 symbol fill pattern 1");
    GracePrintf ("s1 on");
    GracePrintf ("s1 symbol 1");
    GracePrintf ("s1 symbol size 0.3");
    GracePrintf ("s1 symbol fill pattern 1");

    /* Display sample data */
    for (i = 1; i <= 100 && GraceIsOpen(); i++) {
        GracePrintf ("g0.s0 point %d, %d", i, i);
        GracePrintf ("g0.s1 point %d, %d", i, i * i);
        /* Update the Grace display after every ten steps */
        if (i % 10 == 0) {
            GracePrintf ("redraw");
            /* Wait a second, just to simulate some time needed for
               calculations. Your real application shouldn't wait. */
            sleep (1);
        }
    }

    if (GraceIsOpen()) {
        /* Tell Grace to save the data */
        GracePrintf ("saveall \"sample.agr\"");

        /* Flush the output buffer and close Grace */
        GraceClose();

        /* We are done */
        exit (EXIT_SUCCESS);
    } else {
        exit (EXIT_FAILURE);
    }

}

grace-5.1.23/grace_np/Makefile0000644000076500001440000000341007505061045015646 0ustar  fnevgenyusers#####################################################
# Makefile for libgrace_np                          #
#####################################################
# You should not change anything here.              #
#####################################################

TOP=..

include $(TOP)/Make.conf

.SUFFIXES : .c .f $(O)

LIB = libgrace_np.a

CFLAGS=$(CFLAGS0) -I$(TOP) -I. $(CPPFLAGS)

LIBS = $(NOGUI_LIBS)

LIBOBJS = grace_np$(O) gracef_np$(O) gracef_np_$(O)
TESTS=test_np$(EXE) testf_np$(EXE)

all : $(LIB)

tests : $(TESTS)
	-@PATH=../src:$$PATH; export PATH; GRACE_HOME=..; export GRACE_HOME; \
	for i in $(TESTS); do echo Running $$i; ./$$i; done

$(LIB) : $(LIBOBJS) 
	$(RM) $@
	$(AR) cr $@ $(LIBOBJS)
	$(RANLIB) $@

$(LIBOBJS) : $(TOP)/config.h grace_np.h

gracef_np_$(O) : gracef_np.c
	$(CC) $(CFLAGS) -DNEED_F77_UNDERSCORE -c -o $@ gracef_np.c

test_np$(EXE) : test_np$(O)
	$(CC) $(CFLAGS) -o $@ $? $(LIB)

testf_np$(EXE) : testf_np$(O)
	-$(FC) $(FFLAGS) -o $@ $? $(LIB)

test_np$(O) : $(LIB)
testf_np$(O) : $(LIB)

install : $(LIB)
	$(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/lib
	$(INSTALL_DATA) $(LIB) $(DESTDIR)$(GRACE_HOME)/lib/$(LIB)
	$(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/include
	$(INSTALL_DATA) grace_np.h $(DESTDIR)$(GRACE_HOME)/include/grace_np.h

$(DESTDIR)$(GRACE_HOME)/lib/$(LIB) : $(LIB)
	$(MAKE) install

links : $(DESTDIR)$(GRACE_HOME)/lib/$(LIB)
	$(MKINSTALLDIRS) $(DESTDIR)$(PREFIX)/lib
	cd $(DESTDIR)$(PREFIX)/lib; $(RM) $(LIB); $(LN_S) $(GRACE_HOME)/lib/$(LIB) $(LIB)
	$(MKINSTALLDIRS) $(DESTDIR)$(PREFIX)/include
	cd $(DESTDIR)$(PREFIX)/include; $(RM) grace_np.h; $(LN_S) $(GRACE_HOME)/include/grace_np.h grace_np.h
	
clean :
	$(RM) *.o sample.agr $(TESTS)

distclean :
	$(RM) *.o sample.agr $(LIB) $(TESTS)
	
devclean :
	$(RM) *.o sample.agr $(LIB) $(TESTS)

grace-5.1.23/grace_np/LICENSE0000644000076500001440000006127306673045777015251 0ustar  fnevgenyusers		  GNU LIBRARY GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1991 Free Software Foundation, Inc.
    		    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it.  You can use it for
your libraries, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.

  Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library.  If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software.  To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

  Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs.  This
license, the GNU Library General Public License, applies to certain
designated libraries.  This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.

  The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it.  Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program.  However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.

  Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries.  We
concluded that weaker conditions might promote sharing better.

  However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves.  This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them.  (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.)  The hope is that this
will lead to faster development of free libraries.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, while the latter only
works together with the library.

  Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.

		  GNU LIBRARY GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License").  Each licensee is
addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.
  
  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    c) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    d) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

			    NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

		     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    
    Copyright (C)   

    This library 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 library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  , 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!
grace-5.1.23/grace_np/gracef_np.c0000644000076500001440000000317507070242236016306 0ustar  fnevgenyusers#include 

#if defined(WITH_F77_WRAPPER)

#include 
#include 
#include 

#include "grace_np.h"

#ifdef NEED_F77_UNDERSCORE
#  define F77_FNAME(fname) fname ## _
#else
#  define F77_FNAME(fname) fname
#endif

typedef void (*GraceFortranFunctionType) (const char *str, int len);
static GraceFortranFunctionType fortran_error = (GraceFortranFunctionType) 0;

static void GraceFortranWrapper(const char *str)
{
    if (fortran_error == (GraceFortranFunctionType) 0) {
        fprintf(stderr, "%s\n", str);
    } else {
        fortran_error(str, strlen(str));
    }
}

void F77_FNAME(graceregistererrorfunctionf) (GraceFortranFunctionType f)
{
    fortran_error = f;
    GraceRegisterErrorFunction(GraceFortranWrapper);
}

int F77_FNAME(graceopenf) (const int *arg)
{
    return (GraceOpen (*arg));
}

int F77_FNAME(graceisopenf) (void)
{
    return (GraceIsOpen ());
}

int F77_FNAME(graceclosef) (void)
{
    return (GraceClose ());
}

int F77_FNAME(graceclosepipef) (void)
{
    return (GraceClosePipe());
}

int F77_FNAME(graceflushf) (void)
{
    return (GraceFlush ());
}


int F77_FNAME(gracecommandf) (const char* arg, int length)
{
    char* str;
    int res;

    str = (char*) malloc ((size_t) (length + 1));
    if (str == NULL) {
        fprintf (stderr, "GraceCommandf: Not enough memory\n");
        return (-1);
    }
    strncpy (str, arg, length);
    str[length] = 0;
    res = GraceCommand (str);
    free (str);
    return (res);
}

#else /* don't include Fortran wrapper */

/* To make ANSI C happy about non-empty file */
void F77_FNAME(_gracef_np_c_dummy_func) (void) {}

#endif /* WITH_F77_WRAPPER */
grace-5.1.23/gracerc.user0000644000076500001440000000025406661401170014740 0ustar  fnevgenyusers#
# THIS FILE IS INTENTIONALLY LEFT BLANK!
# 
# (the dummy file is sourced ONLY if neither of
# ./gracerc.user, ./.grace/gracerc.user, or ~/.grace/gracerc.user
# exists)
#
grace-5.1.23/LICENSE0000644000076500001440000004307606626627162013464 0ustar  fnevgenyusers		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                          675 Mass Ave, Cambridge, MA 02139, USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	Appendix: How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    
    Copyright (C) 19yy  

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) 19yy name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  , 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.
grace-5.1.23/configure0000755000076500001440000111031412032153130014326 0ustar  fnevgenyusers#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68.
#
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
# Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

if test "x$CONFIG_SHELL" = x; then
  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else
  case \`(set -o) 2>/dev/null\` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi
"
  as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }

exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :

else
  exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1"
  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
  if (eval "$as_required") 2>/dev/null; then :
  as_have_required=yes
else
  as_have_required=no
fi
  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :

else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  as_found=:
  case $as_dir in #(
	 /*)
	   for as_base in sh bash ksh sh5; do
	     # Try only shells that exist, to save several forks.
	     as_shell=$as_dir/$as_base
	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
  CONFIG_SHELL=$as_shell as_have_required=yes
		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
  break 2
fi
fi
	   done;;
       esac
  as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
  CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS


      if test "x$CONFIG_SHELL" != x; then :
  # We cannot yet assume a decent shell, so we have to provide a
	# neutralization value for shells without unset; and this also
	# works around shells that cannot unset nonexistent variables.
	# Preserve -v and -x to the replacement shell.
	BASH_ENV=/dev/null
	ENV=/dev/null
	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
	export CONFIG_SHELL
	case $- in # ((((
	  *v*x* | *x*v* ) as_opts=-vx ;;
	  *v* ) as_opts=-v ;;
	  *x* ) as_opts=-x ;;
	  * ) as_opts= ;;
	esac
	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
fi

    if test x$as_have_required = xno; then :
  $as_echo "$0: This script requires a shell more modern than all"
  $as_echo "$0: the shells that I found on your system."
  if test x${ZSH_VERSION+set} = xset ; then
    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
  else
    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
  fi
  exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset

# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error

if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


  as_lineno_1=$LINENO as_lineno_1a=$LINENO
  as_lineno_2=$LINENO as_lineno_2a=$LINENO
  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
  sed -n '
    p
    /[$]LINENO/=
  ' <$as_myself |
    sed '
      s/[$]LINENO.*/&-/
      t lineno
      b
      :lineno
      N
      :loop
      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
      t loop
      s/-\n.*//
    ' >$as_me.lineno &&
  chmod +x "$as_me.lineno" ||
    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }

  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensitive to this).
  . "./$as_me.lineno"
  # Exit status is that of the last command.
  exit
}

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -p'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -p'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -p'
  fi
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null

if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

if test -x / >/dev/null 2>&1; then
  as_test_x='test -x'
else
  if ls -dL / >/dev/null 2>&1; then
    as_ls_L_option=L
  else
    as_ls_L_option=
  fi
  as_test_x='
    eval sh -c '\''
      if test -d "$1"; then
	test -d "$1/.";
      else
	case $1 in #(
	-*)set "./$1";;
	esac;
	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
	???[sx]*):;;*)false;;esac;fi
    '\'' sh
  '
fi
as_executable_p=$as_test_x

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


test -n "$DJDIR" || exec 7<&0 &1

# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`

#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=

# Identity of this package.
PACKAGE_NAME=
PACKAGE_TARNAME=
PACKAGE_VERSION=
PACKAGE_STRING=
PACKAGE_BUGREPORT=
PACKAGE_URL=

ac_unique_file="src/main.c"
ac_default_prefix="/usr/local"
# Factoring default headers for most tests.
ac_includes_default="\
#include 
#ifdef HAVE_SYS_TYPES_H
# include 
#endif
#ifdef HAVE_SYS_STAT_H
# include 
#endif
#ifdef STDC_HEADERS
# include 
# include 
#else
# ifdef HAVE_STDLIB_H
#  include 
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
#  include 
# endif
# include 
#endif
#ifdef HAVE_STRINGS_H
# include 
#endif
#ifdef HAVE_INTTYPES_H
# include 
#endif
#ifdef HAVE_STDINT_H
# include 
#endif
#ifdef HAVE_UNISTD_H
# include 
#endif"

ac_subst_vars='LTLIBOBJS
LIBOBJS
X_EXTRA_LIBS
X_LIBS
X_PRE_LIBS
X_CFLAGS
XMKMF
ALLOCA
LPR_CMD
LP_CMD
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
YFLAGS
YACC
LN_S
RANLIB
AR
SET_MAKE
fc
EGREP
GREP
CPP
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
T1_AA_TYPE64
T1_AA_TYPE32
T1_AA_TYPE16
PRINT_CMD
GRACE_HELPVIEWER
GRACE_EDITOR
SUBDIRS
XBAE_INC
PDF_LIB
PNG_LIB
JPEG_LIB
Z_LIB
FFTW_LIB
T1_INC
T1_LIB
DL_LIB
XDR_LIB
NETCDF_LIBS
NOGUI_LIBS
GUI_LIBS
FC
GUI_FLAGS
GRACE_HOME
GRACE
MKINSTALLDIRS
BATEXT
OBJEXT
EXEEXT
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_grace_home
enable_config
with_cc
with_f77
with_extra_incpath
with_extra_ldpath
with_bundled_t1lib
with_bundled_xbae
enable_netcdf
with_fftw
enable_jpegdrv
enable_pngdrv
enable_pdfdrv
enable_f77_wrapper
enable_editres
enable_libhelp
enable_xmhtml
with_editor
with_helpviewer
with_printcmd
enable_debug
enable_maintainer
with_netcdf_libraries
with_fftw_library
with_zlib_library
with_jpeg_library
with_png_library
with_pdf_library
with_x
with_motif_library
with_xmhtml_library
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CPP
YACC
YFLAGS
XMKMF'


# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE

# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'

ac_prev=
ac_dashdash=
for ac_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval $ac_prev=\$ac_option
    ac_prev=
    continue
  fi

  case $ac_option in
  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
  *=)   ac_optarg= ;;
  *)    ac_optarg=yes ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case $ac_dashdash$ac_option in
  --)
    ac_dashdash=yes ;;

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir=$ac_optarg ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build_alias ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build_alias=$ac_optarg ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

  --config-cache | -C)
    cache_file=config.cache ;;

  -datadir | --datadir | --datadi | --datad)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=*)
    datadir=$ac_optarg ;;

  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
  | --dataroo | --dataro | --datar)
    ac_prev=datarootdir ;;
  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
    datarootdir=$ac_optarg ;;

  -disable-* | --disable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=no ;;

  -docdir | --docdir | --docdi | --doc | --do)
    ac_prev=docdir ;;
  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
    docdir=$ac_optarg ;;

  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
    ac_prev=dvidir ;;
  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
    dvidir=$ac_optarg ;;

  -enable-* | --enable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=\$ac_optarg ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix=$ac_optarg ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he | -h)
    ac_init_help=long ;;
  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
    ac_init_help=recursive ;;
  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
    ac_init_help=short ;;

  -host | --host | --hos | --ho)
    ac_prev=host_alias ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host_alias=$ac_optarg ;;

  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
    ac_prev=htmldir ;;
  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
  | --ht=*)
    htmldir=$ac_optarg ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir=$ac_optarg ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir=$ac_optarg ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir=$ac_optarg ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir=$ac_optarg ;;

  -localedir | --localedir | --localedi | --localed | --locale)
    ac_prev=localedir ;;
  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
    localedir=$ac_optarg ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst | --locals)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
    localstatedir=$ac_optarg ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir=$ac_optarg ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c | -n)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir=$ac_optarg ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix=$ac_optarg ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix=$ac_optarg ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix=$ac_optarg ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name=$ac_optarg ;;

  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
    ac_prev=pdfdir ;;
  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
    pdfdir=$ac_optarg ;;

  -psdir | --psdir | --psdi | --psd | --ps)
    ac_prev=psdir ;;
  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
    psdir=$ac_optarg ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir=$ac_optarg ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir=$ac_optarg ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site=$ac_optarg ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir=$ac_optarg ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir=$ac_optarg ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target_alias ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target_alias=$ac_optarg ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers | -V)
    ac_init_version=: ;;

  -with-* | --with-*)
    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=\$ac_optarg ;;

  -without-* | --without-*)
    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=no ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes=$ac_optarg ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries=$ac_optarg ;;

  -*) as_fn_error $? "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information"
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    case $ac_envvar in #(
      '' | [0-9]* | *[!_$as_cr_alnum]* )
      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
    esac
    eval $ac_envvar=\$ac_optarg
    export $ac_envvar ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
    ;;

  esac
done

if test -n "$ac_prev"; then
  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
  as_fn_error $? "missing argument to $ac_option"
fi

if test -n "$ac_unrecognized_opts"; then
  case $enable_option_checking in
    no) ;;
    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
  esac
fi

# Check all directory arguments for consistency.
for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
		datadir sysconfdir sharedstatedir localstatedir includedir \
		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
		libdir localedir mandir
do
  eval ac_val=\$$ac_var
  # Remove trailing slashes.
  case $ac_val in
    */ )
      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
      eval $ac_var=\$ac_val;;
  esac
  # Be sure to have absolute directory names.
  case $ac_val in
    [\\/$]* | ?:[\\/]* )  continue;;
    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
  esac
  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done

# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias

# FIXME: To remove some day.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used" >&2
  elif test "x$build_alias" != "x$host_alias"; then
    cross_compiling=yes
  fi
fi

ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-

test "$silent" = yes && exec 6>/dev/null


ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
  as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
  as_fn_error $? "pwd does not report name of working directory"


# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then the parent directory.
  ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_myself" : 'X\(//\)[^/]' \| \
	 X"$as_myself" : 'X\(//\)$' \| \
	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  srcdir=$ac_confdir
  if test ! -r "$srcdir/$ac_unique_file"; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
	pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
  srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
  eval ac_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_env_${ac_var}_value=\$${ac_var}
  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_cv_env_${ac_var}_value=\$${ac_var}
done

#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures this package to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print \`checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for \`--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or \`..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

X features:
  --x-includes=DIR    X include files are in DIR
  --x-libraries=DIR   X library files are in DIR

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
_ACEOF
fi

if test -n "$ac_init_help"; then

  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-grace-home=DIR      define Grace home dir [PREFIX/grace]
  --enable-config=FILE         define configuration FILE to override
                               autodetection (not recommended!)
  --enable-netcdf              enable support for netCDF [yes]
  --enable-jpegdrv             build JPEG driver [yes]
  --enable-pngdrv              build PNG driver [yes]
  --enable-pdfdrv              build PDF driver [yes]
  --enable-f77-wrapper         include Fortran wrapper for libgrace_np [yes]
  --enable-editres             enable editres support [yes]
  --enable-libhelp             use libhelp [no]
  --enable-xmhtml              use XmHTML widget for on-line help [yes]
  --enable-debug               turn on debugging [no]
  --enable-maintainer          enable maintainer's mode [no]

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-cc=PROG               use PROG as C compiler [${CC-gcc}]
  --with-f77=PROG              use PROG as Fortran compiler [${FC-f77}]
  --with-extra-incpath=PATH    define extra include path (dir1:dir2:...) [none]
  --with-extra-ldpath=PATH     define extra ld path (dir1:dir2:...) [none]
  --with-bundled-t1lib         use bundled T1lib [no]
  --with-bundled-xbae          use bundled Xbae [yes]
  --with-fftw                  use FFTW library for Fourier transforms [yes]
  --with-editor=COMMAND        define editor ["xterm -e vi"]
  --with-helpviewer=COMMAND    define help viewer command ["mozilla %s"]
  --with-printcmd=PROG         use PROG for printing
  --with-netcdf-libraries=OBJ  use OBJ as netCDF libraries [-lnetcdf]
  --with-fftw-library=OBJ      use OBJ as FFTW library [-lfftw]
  --with-zlib-library=OBJ      use OBJ as ZLIB library [-lz]
  --with-jpeg-library=OBJ      use OBJ as JPEG library [-ljpeg]
  --with-png-library=OBJ       use OBJ as PNG library [-lpng]
  --with-pdf-library=OBJ       use OBJ as PDFlib library [-lpdf]
  --with-x                use the X Window System
  --with-motif-library=OBJ     use OBJ as Motif library [-lXm]
  --with-xmhtml-library=OBJ    use OBJ as XmHTML library [-lXmHTML]

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L if you have libraries in a
              nonstandard directory 
  LIBS        libraries to pass to the linker, e.g. -l
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I if
              you have headers in a nonstandard directory 
  CPP         C preprocessor
  YACC        The `Yet Another Compiler Compiler' implementation to use.
              Defaults to the first program found out of: `bison -y', `byacc',
              `yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of `-d' given by some make applications.
  XMKMF       Path to xmkmf, Makefile generator for X Window System

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to the package provider.
_ACEOF
ac_status=$?
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
    test -d "$ac_dir" ||
      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
      continue
    ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix

    cd "$ac_dir" || { ac_status=$?; continue; }
    # Check for guested configure.
    if test -f "$ac_srcdir/configure.gnu"; then
      echo &&
      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_srcdir/configure"; then
      echo &&
      $SHELL "$ac_srcdir/configure" --help=recursive
    else
      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
    fi || ac_status=$?
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
configure
generated by GNU Autoconf 2.68

Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi

## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##

# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_compile

# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 $as_test_x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_link

# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } > conftest.i && {
	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_cpp

# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if eval \${$3+:} false; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_mongrel

# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  ac_retval=0
else
  $as_echo "$as_me: program exited with status $ac_status" >&5
       $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_run

# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_compile

# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
ac_fn_c_compute_int ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if test "$cross_compiling" = yes; then
    # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=0 ac_mid=0
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid; break
else
  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
			if test $ac_lo -le $ac_mid; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=-1 ac_mid=-1
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=$ac_mid; break
else
  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
			if test $ac_mid -le $ac_hi; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  ac_lo= ac_hi=
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid
else
  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
'') ac_retval=1 ;;
esac
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
static long int longval () { return $2; }
static unsigned long int ulongval () { return $2; }
#include 
#include 
int
main ()
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    return 1;
  if (($2) < 0)
    {
      long int i = longval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%ld", i);
    }
  else
    {
      unsigned long int i = ulongval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%lu", i);
    }
  /* Do not output a trailing newline, as this causes \r\n confusion
     on some platforms.  */
  return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  echo >>conftest.val; read $3 &5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_type

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case  declares $2.
   For example, HP-UX 11i  declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $2 (); below.
    Prefer  to  if __STDC__ is defined, since
     exists even on freestanding compilers.  */

#ifdef __STDC__
# include 
#else
# include 
#endif

#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main ()
{
return $2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_func
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by $as_me, which was
generated by GNU Autoconf 2.68.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    $as_echo "PATH: $as_dir"
  done
IFS=$as_save_IFS

} >&5

cat >&5 <<_ACEOF


## ----------- ##
## Core tests. ##
## ----------- ##

_ACEOF


# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
  for ac_arg
  do
    case $ac_arg in
    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
    | -silent | --silent | --silen | --sile | --sil)
      continue ;;
    *\'*)
      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    case $ac_pass in
    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
    2)
      as_fn_append ac_configure_args1 " '$ac_arg'"
      if test $ac_must_keep_next = true; then
	ac_must_keep_next=false # Got value, back to normal.
      else
	case $ac_arg in
	  *=* | --config-cache | -C | -disable-* | --disable-* \
	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
	  | -with-* | --with-* | -without-* | --without-* | --x)
	    case "$ac_configure_args0 " in
	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
	    esac
	    ;;
	  -* ) ac_must_keep_next=true ;;
	esac
      fi
      as_fn_append ac_configure_args " '$ac_arg'"
      ;;
    esac
  done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}

# When interrupted or exit'd, cleanup temporary files, and complete
# config.log.  We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
  # Save into config.log some information that might help in debugging.
  {
    echo

    $as_echo "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
    echo
    # The following way of writing the cache mishandles newlines in values,
(
  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done
  (set) 2>&1 |
    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      sed -n \
	"s/'\''/'\''\\\\'\'''\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
      ;; #(
    *)
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
)
    echo

    $as_echo "## ----------------- ##
## Output variables. ##
## ----------------- ##"
    echo
    for ac_var in $ac_subst_vars
    do
      eval ac_val=\$$ac_var
      case $ac_val in
      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
      esac
      $as_echo "$ac_var='\''$ac_val'\''"
    done | sort
    echo

    if test -n "$ac_subst_files"; then
      $as_echo "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
      echo
      for ac_var in $ac_subst_files
      do
	eval ac_val=\$$ac_var
	case $ac_val in
	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
	esac
	$as_echo "$ac_var='\''$ac_val'\''"
      done | sort
      echo
    fi

    if test -s confdefs.h; then
      $as_echo "## ----------- ##
## confdefs.h. ##
## ----------- ##"
      echo
      cat confdefs.h
      echo
    fi
    test "$ac_signal" != 0 &&
      $as_echo "$as_me: caught signal $ac_signal"
    $as_echo "$as_me: exit $exit_status"
  } >&5
  rm -f core *.core core.conftest.* &&
    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
    exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h

$as_echo "/* confdefs.h */" > confdefs.h

# Predefined preprocessor variables.

cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF


# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
  # We do not want a PATH search for config.site.
  case $CONFIG_SITE in #((
    -*)  ac_site_file1=./$CONFIG_SITE;;
    */*) ac_site_file1=$CONFIG_SITE;;
    *)   ac_site_file1=./$CONFIG_SITE;;
  esac
elif test "x$prefix" != xNONE; then
  ac_site_file1=$prefix/share/config.site
  ac_site_file2=$prefix/etc/config.site
else
  ac_site_file1=$ac_default_prefix/share/config.site
  ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
  test "x$ac_site_file" = xNONE && continue
  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
    sed 's/^/| /' "$ac_site_file" >&5
    . "$ac_site_file" \
      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
  fi
done

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special files
  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";;
    esac
  fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
  eval ac_old_set=\$ac_cv_env_${ac_var}_set
  eval ac_new_set=\$ac_env_${ac_var}_set
  eval ac_old_val=\$ac_cv_env_${ac_var}_value
  eval ac_new_val=\$ac_env_${ac_var}_value
  case $ac_old_set,$ac_new_set in
    set,)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,);;
    *)
      if test "x$ac_old_val" != "x$ac_new_val"; then
	# differences in whitespace do not lead to failure.
	ac_old_val_w=`echo x $ac_old_val`
	ac_new_val_w=`echo x $ac_new_val`
	if test "$ac_old_val_w" != "$ac_new_val_w"; then
	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
	  ac_cache_corrupted=:
	else
	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
	  eval $ac_var=\$ac_old_val
	fi
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
      fi;;
  esac
  # Pass precious variables to config.status.
  if test "$ac_new_set" = set; then
    case $ac_new_val in
    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
    *) ac_arg=$ac_var=$ac_new_val ;;
    esac
    case " $ac_configure_args " in
      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
    esac
  fi
done
if $ac_cache_corrupted; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


ac_aux_dir=
for ac_dir in ac-tools "$srcdir"/ac-tools; do
  if test -f "$ac_dir/install-sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install-sh -c"
    break
  elif test -f "$ac_dir/install.sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install.sh -c"
    break
  elif test -f "$ac_dir/shtool"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/shtool install -c"
    break
  fi
done
if test -z "$ac_aux_dir"; then
  as_fn_error $? "cannot find install-sh, install.sh, or shtool in ac-tools \"$srcdir\"/ac-tools" "$LINENO" 5
fi

# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.



ac_config_headers="$ac_config_headers config.h:ac-tools/config.h.in"












































































if test "x${prefix}" = "xNONE"
then
  GRACE_HOME=${ac_default_prefix}/grace
else
  GRACE_HOME=${prefix}/grace
fi
# Check whether --enable-grace-home was given.
if test "${enable_grace_home+set}" = set; then :
  enableval=$enable_grace_home; GRACE_HOME="${enableval}"
fi



# Check whether --enable-config was given.
if test "${enable_config+set}" = set; then :
  enableval=$enable_config; CONF_FILE="${enableval}"
fi


CC=${CC-gcc}

# Check whether --with-cc was given.
if test "${with_cc+set}" = set; then :
  withval=$with_cc; CC="${withval}"
fi


FC=${FC-f77}

# Check whether --with-f77 was given.
if test "${with_f77+set}" = set; then :
  withval=$with_f77; FC="${withval}"
fi



# Check whether --with-extra-incpath was given.
if test "${with_extra_incpath+set}" = set; then :
  withval=$with_extra_incpath; CPPFLAGS="${CPPFLAGS} -I`echo ${withval}|sed 's/:/\ -I/g'`"
fi



# Check whether --with-extra-ldpath was given.
if test "${with_extra_ldpath+set}" = set; then :
  withval=$with_extra_ldpath; LDFLAGS="-L`echo ${withval}|sed 's/:/\ -L/g'` ${LDFLAGS}";
  case "${host}" in
    sparc-sun-solaris*) LDFLAGS="-R:${withval} ${LDFLAGS}";;
  esac

fi



# Check whether --with-bundled_t1lib was given.
if test "${with_bundled_t1lib+set}" = set; then :
  withval=$with_bundled_t1lib; case "${withval}" in
  yes) bundled_t1lib=true ;;
  no)  bundled_t1lib=false;;
  *) as_fn_error $? "bad value ${withval} for --with-bundled-t1lib" "$LINENO" 5 ;;
esac
else
  bundled_t1lib=false
fi



# Check whether --with-bundled_xbae was given.
if test "${with_bundled_xbae+set}" = set; then :
  withval=$with_bundled_xbae; case "${withval}" in
  yes) bundled_xbae=true ;;
  no)  bundled_xbae=false;;
  *) as_fn_error $? "bad value ${withval} for --with-bundled-xbae" "$LINENO" 5 ;;
esac
else
  bundled_xbae=true
fi


# Check whether --enable-netcdf was given.
if test "${enable_netcdf+set}" = set; then :
  enableval=$enable_netcdf; case "${enableval}" in
  yes) netcdf=true ;;
  no)  netcdf=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-netcdf" "$LINENO" 5 ;;
esac
else
  netcdf=true
fi



# Check whether --with-fftw was given.
if test "${with_fftw+set}" = set; then :
  withval=$with_fftw; case "${withval}" in
  yes) fftw=true ;;
  no)  fftw=false;;
  *) as_fn_error $? "bad value ${withval} for --with-fftw" "$LINENO" 5 ;;
esac
else
  fftw=true
fi


# Check whether --enable-jpegdrv was given.
if test "${enable_jpegdrv+set}" = set; then :
  enableval=$enable_jpegdrv; case "${enableval}" in
  yes) jpegdrv=true ;;
  no)  jpegdrv=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-jpegdrv" "$LINENO" 5 ;;
esac
else
  jpegdrv=true
fi


# Check whether --enable-pngdrv was given.
if test "${enable_pngdrv+set}" = set; then :
  enableval=$enable_pngdrv; case "${enableval}" in
  yes) pngdrv=true ;;
  no)  pngdrv=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-pngdrv" "$LINENO" 5 ;;
esac
else
  pngdrv=true
fi


# Check whether --enable-pdfdrv was given.
if test "${enable_pdfdrv+set}" = set; then :
  enableval=$enable_pdfdrv; case "${enableval}" in
  yes) pdfdrv=true ;;
  no)  pdfdrv=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-pdfdrv" "$LINENO" 5 ;;
esac
else
  pdfdrv=true
fi


# Check whether --enable-f77_wrapper was given.
if test "${enable_f77_wrapper+set}" = set; then :
  enableval=$enable_f77_wrapper; case "${enableval}" in
  yes) f77_wrapper=true ;;
  no)  f77_wrapper=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-f77-wrapper" "$LINENO" 5 ;;
esac
else
  f77_wrapper=true
fi


# Check whether --enable-editres was given.
if test "${enable_editres+set}" = set; then :
  enableval=$enable_editres; case "${enableval}" in
  yes) editres=true ;;
  no)  editres=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-editres" "$LINENO" 5 ;;
esac
else
  editres=true
fi


# Check whether --enable-libhelp was given.
if test "${enable_libhelp+set}" = set; then :
  enableval=$enable_libhelp; case "${enableval}" in
  yes) libhelp=true ;;
  no)  libhelp=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-libhelp" "$LINENO" 5 ;;
esac
else
  libhelp=false
fi


# Check whether --enable-xmhtml was given.
if test "${enable_xmhtml+set}" = set; then :
  enableval=$enable_xmhtml; case "${enableval}" in
  yes) xmhtml=true ;;
  no)  xmhtml=false;;
  *) as_fn_error $? "bad value ${enableval} for --enable-xmhtml" "$LINENO" 5 ;;
esac
else
  xmhtml=true
fi


if test $xmhtml = true && test $libhelp = true
then
  as_fn_error $? "can't use both libhelp and XmHTML" "$LINENO" 5
fi

GRACE_EDITOR="'xterm -e vi'"

# Check whether --with-editor was given.
if test "${with_editor+set}" = set; then :
  withval=$with_editor; GRACE_EDITOR="'${withval}'"
fi


GRACE_HELPVIEWER="'mozilla %s'"

# Check whether --with-helpviewer was given.
if test "${with_helpviewer+set}" = set; then :
  withval=$with_helpviewer; GRACE_HELPVIEWER="'${withval}'"
fi



# Check whether --with-printcmd was given.
if test "${with_printcmd+set}" = set; then :
  withval=$with_printcmd; if test "x${withval}" != "x"; then
    PRINT_CMD="'${withval}'"
 else
    PRINT_CMD=NONE
 fi
else
  PRINT_CMD=NONE

fi


# Check whether --enable-debug was given.
if test "${enable_debug+set}" = set; then :
  enableval=$enable_debug; case "${enableval}" in
  yes) debug=true ;;
  no)  debug=false ;;
  *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;;
esac
else
  debug=false
fi


# Check whether --enable-maintainer was given.
if test "${enable_maintainer+set}" = set; then :
  enableval=$enable_maintainer; case "${enableval}" in
  yes) maintainer=true; debug=true ;;
  no)  maintainer=false ;;
  *) as_fn_error $? "bad value ${enableval} for --enable-maintainer" "$LINENO" 5 ;;
esac
else
  maintainer=false
fi


if test $maintainer = true
then
  $as_echo "#define WITH_DEBUG 1" >>confdefs.h

fi

if test $f77_wrapper = true; then
  $as_echo "#define WITH_F77_WRAPPER 1" >>confdefs.h

fi


if test "x$CONF_FILE" != "x"
then
  if test -r $CONF_FILE
  then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> using \`$CONF_FILE' as config file" >&5
$as_echo "--> using \`$CONF_FILE' as config file" >&6; }
    . $CONF_FILE
  else
    as_fn_error $? "--> Can't open file \`$CONF_FILE' for reading!" "$LINENO" 5
    exit 1
  fi
else
    CFLAGS=${CFLAGS-""}
  FFLAGS=${FFLAGS-""}
  LDFLAGS=${LDFLAGS-""}
  OPTIMIZE=${OPTIMIZE-""}
  DEBUG=${DEBUG-""}
fi

# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if ${ac_cv_build+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$host_alias" = x; then
  ac_cv_host=$ac_cv_build
else
  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac



ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_CC="gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
  fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi


test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`

# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"

ac_rmfiles=
for ac_file in $ac_files
do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
  esac
done
rm -f $ac_rmfiles

if { { ac_try="$ac_link_default"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link_default") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile.  We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
	;;
    [ab].out )
	# We found the default executable, but exeext='' is most
	# certainly right.
	break;;
    *.* )
	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
	then :; else
	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	fi
	# We set ac_cv_exeext here because the later test for it is not
	# safe: cross compilers may not add the suffix if given an `-o'
	# argument, so we may need to know it at that point already.
	# Even if this section looks crufty: it has the advantage of
	# actually working.
	break;;
    * )
	break;;
  esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=

else
  ac_file=''
fi
if test -z "$ac_file"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext

rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	  break;;
    * ) break;;
  esac
done
else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }

rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
int
main ()
{
FILE *f = fopen ("conftest.out", "w");
 return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
  { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
  if { ac_try='./conftest$ac_cv_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
    fi
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }

rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if ${ac_cv_objext+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  for ac_file in conftest.o conftest.obj conftest.*; do
  test -f "$ac_file" || continue;
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
else
  CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#include 
#include 
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c89"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
$as_echo_n "checking for library containing strerror... " >&6; }
if ${ac_cv_search_strerror+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char strerror ();
int
main ()
{
return strerror ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' cposix; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_strerror=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_strerror+:} false; then :
  break
fi
done
if ${ac_cv_search_strerror+:} false; then :

else
  ac_cv_search_strerror=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
$as_echo "$ac_cv_search_strerror" >&6; }
ac_res=$ac_cv_search_strerror
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if ${ac_cv_prog_CPP+:} false; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CPP needs to be expanded
    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer  to  if __STDC__ is defined, since
  #  exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include 
#else
# include 
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CPP=$CPP

fi
  CPP=$ac_cv_prog_CPP
else
  ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer  to  if __STDC__ is defined, since
  #  exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include 
#else
# include 
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$GREP"; then
  ac_path_GREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in grep ggrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
# Check for GNU ac_path_GREP and select it if it is found.
  # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'GREP' >> "conftest.nl"
    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_GREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_GREP="$ac_path_GREP"
      ac_path_GREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_GREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_GREP"; then
    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_GREP=$GREP
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
 GREP="$ac_cv_path_GREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     if test -z "$EGREP"; then
  ac_path_EGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in egrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
# Check for GNU ac_path_EGREP and select it if it is found.
  # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'EGREP' >> "conftest.nl"
    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_EGREP="$ac_path_EGREP"
      ac_path_EGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_EGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_EGREP"; then
    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_EGREP=$EGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
 EGREP="$ac_cv_path_EGREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#include 
#include 

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdc=yes
else
  ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "memchr" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "free" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
		   (('a' <= (c) && (c) <= 'i') \
		     || ('j' <= (c) && (c) <= 'r') \
		     || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif

#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
	|| toupper (i) != TOUPPER (i))
      return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then

$as_echo "#define STDC_HEADERS 1" >>confdefs.h

fi

# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
		  inttypes.h stdint.h unistd.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done



  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
if test "x$ac_cv_header_minix_config_h" = xyes; then :
  MINIX=yes
else
  MINIX=
fi


  if test "$MINIX" = yes; then

$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h


$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h


$as_echo "#define _MINIX 1" >>confdefs.h

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
if ${ac_cv_safe_to_define___extensions__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#	  define __EXTENSIONS__ 1
	  $ac_includes_default
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_safe_to_define___extensions__=yes
else
  ac_cv_safe_to_define___extensions__=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
  test $ac_cv_safe_to_define___extensions__ = yes &&
    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h

  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h

  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h

  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h

  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h





if test "x${CFLAGS}" = "x"
then
  if test "x${GCC}" = "xyes"
  then
        DEBUG="-g -O2"
    OPTIMIZE="-O2"
    CFLAGS="-fno-common -Wall -Wpointer-arith -Wnested-externs"



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc strength-reduce bug" >&5
$as_echo_n "checking for gcc strength-reduce bug... " >&6; }
if ${ac_cv_c_gcc_strength_bug+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_gcc_strength_bug="yes"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    int main(void) {
      static int Array[3];
      unsigned int B = 3;
      int i;
      for(i=0; i&5
$as_echo "$ac_cv_c_gcc_strength_bug" >&6; }

  if test "$ac_cv_c_gcc_strength_bug" = "yes"
  then
    :
    CFLAGS="$CFLAGS -fno-strength-reduce"
  else
    :

  fi


    CFLAGS="$CPU_FLAGS $CFLAGS"
  else
    case "${host}" in
      alpha*-dec-osf4.*)
        CFLAGS="-std1 -w0"
        OPTIMIZE="-O2"
        DEBUG="-g3 -O2"
        ;;
      hppa*-hp-hpux*)
        CFLAGS="-Aa -D_HPUX_SOURCE"
        OPTIMIZE="-O"
        DEBUG="-g -O"
        ;;
      mips-sgi-irix6.[4-9]*)
        CFLAGS="-w"
        OPTIMIZE="-O2 -OPT:Olimit=0"
        DEBUG="-g3 -O2 -OPT:Olimit=0"
        ;;
      mips-sgi-irix*)
        CFLAGS="-fullwarn -woff 835"
        OPTIMIZE="-O2 -Olimit 3500"
        ;;
      rs6000-ibm-aix*)
        CFLAGS="-D_ALL_SOURCE"
        OPTIMIZE="-O2"
        DEBUG="-g -O2"
        ;;
      *)
        CFLAGS=""
        OPTIMIZE="-O"
        DEBUG="-g"
        ;;
    esac
  fi
fi

case $debug in
  true) CFLAGS="$DEBUG $CFLAGS";;
  *) CFLAGS="$OPTIMIZE $CFLAGS";;
esac

case $FC in
  /*|../*|./*)
     if test ! -x $FC; then
       FC=no
     fi
     ;;
  *) # Extract the first word of "$FC", so it can be a program name with args.
set dummy $FC; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_fc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$fc"; then
  ac_cv_prog_fc="$fc" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_fc="$FC"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_fc" && ac_cv_prog_fc="no"
fi
fi
fc=$ac_cv_prog_fc
if test -n "$fc"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $fc" >&5
$as_echo "$fc" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


     FC=$ac_cv_prog_fc
     ;;
esac

if test "${FC}" = "no"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Fortran tests won't be compiled" >&5
$as_echo "--> Fortran tests won't be compiled" >&6; }
  FC=:
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5
$as_echo_n "checking whether char is unsigned... " >&6; }
if ${ac_cv_c_char_unsigned+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{
static int test_array [1 - 2 * !(((char) -1) < 0)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_char_unsigned=no
else
  ac_cv_c_char_unsigned=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5
$as_echo "$ac_cv_c_char_unsigned" >&6; }
if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
  $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h

fi

# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
$as_echo_n "checking size of char... " >&6; }
if ${ac_cv_sizeof_char+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_char" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (char)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_char=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
$as_echo "$ac_cv_sizeof_char" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_CHAR $ac_cv_sizeof_char
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
$as_echo_n "checking size of short... " >&6; }
if ${ac_cv_sizeof_short+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_short" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (short)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_short=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
$as_echo "$ac_cv_sizeof_short" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_SHORT $ac_cv_sizeof_short
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
$as_echo_n "checking size of int... " >&6; }
if ${ac_cv_sizeof_int+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_int" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_int=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
$as_echo "$ac_cv_sizeof_int" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_INT $ac_cv_sizeof_int
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
$as_echo_n "checking size of long... " >&6; }
if ${ac_cv_sizeof_long+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_long" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
$as_echo "$ac_cv_sizeof_long" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_LONG $ac_cv_sizeof_long
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
$as_echo_n "checking size of long long... " >&6; }
if ${ac_cv_sizeof_long_long+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_long_long" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long long)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long_long=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
$as_echo "$ac_cv_sizeof_long_long" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
$as_echo_n "checking size of float... " >&6; }
if ${ac_cv_sizeof_float+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_float" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (float)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_float=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
$as_echo "$ac_cv_sizeof_float" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_FLOAT $ac_cv_sizeof_float
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
$as_echo_n "checking size of double... " >&6; }
if ${ac_cv_sizeof_double+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_double" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (double)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_double=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
$as_echo "$ac_cv_sizeof_double" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_DOUBLE $ac_cv_sizeof_double
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
$as_echo_n "checking size of long double... " >&6; }
if ${ac_cv_sizeof_long_double+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_long_double" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long double)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long_double=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
$as_echo "$ac_cv_sizeof_long_double" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
_ACEOF


# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
$as_echo_n "checking size of void *... " >&6; }
if ${ac_cv_sizeof_void_p+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_void_p" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_void_p=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
$as_echo "$ac_cv_sizeof_void_p" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
_ACEOF



 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
if ${ac_cv_c_bigendian+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
	     #include 

int
main ()
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
		#include 

int
main ()
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if  defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

int
main ()
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

int
main ()
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes; then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		extern int foo;

int
main ()
{
return use_ascii (foo) == use_ebcdic (foo);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_bigendian=no
else
  ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
$as_echo "$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in #(
   yes)
     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
   no)
      ;; #(
   universal)

$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     as_fn_error $? "unknown endianness
 presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
 esac



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FPU arithmetics type" >&5
$as_echo_n "checking for FPU arithmetics type... " >&6; }
if ${ac_cv_c_fpu_arithmetics_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_fpu_arithmetics_type="Unknown"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 

#define LOG2EA 0.44269504088896340735992
#define ACCURACY "%1.4f"

typedef union {unsigned short s[4]; double d;} XTYPE;

XTYPE X[] = {
              {{0,0,0,0}},			    /* Unknown             */
              {{0x3fdc,0x551d,0x94ae,0x0bf8}}, 	    /* Big endian     IEEE */
              {{0x0bf8,0x94ae,0x551d,0x3fdc}}, 	    /* Littile endian IEEE */
              {{0037742,0124354,0122560,0057703}}   /* DEC                 */
            };

int main (void)
{
    int i; char TMPSTR[1024]; char LOG2EA_STR[80];
    i = 0;

    sprintf(LOG2EA_STR, ACCURACY, LOG2EA);

    for (i=3; i >= 0; i--)
    {
      	sprintf(TMPSTR, ACCURACY, X[i].d);
      	if (strcmp(TMPSTR, LOG2EA_STR) == 0) {
    	    break;
      	}
    }

    exit(i);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_fpu_arithmetics_type="Unknown"
else
  case "$?" in
      "1") ac_cv_c_fpu_arithmetics_type="Big endian IEEE" ;;
      "2") ac_cv_c_fpu_arithmetics_type="Little endian IEEE" ;;
      "3") ac_cv_c_fpu_arithmetics_type="DEC" ;;
    esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fpu_arithmetics_type" >&5
$as_echo "$ac_cv_c_fpu_arithmetics_type" >&6; }

case "$ac_cv_c_fpu_arithmetics_type" in
  "DEC")                $as_echo "#define HAVE_DEC_FPU 1" >>confdefs.h
 ;;
  "Little endian IEEE") $as_echo "#define HAVE_LIEEE_FPU 1" >>confdefs.h
 ;;
  "Big endian IEEE")    $as_echo "#define HAVE_BIEEE_FPU 1" >>confdefs.h
 ;;
esac






OBJEXT=".$OBJEXT"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
	@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
  *@@@%%%=?*=@@@%%%*)
    eval ac_cv_prog_make_${ac_make}_set=yes;;
  *)
    eval ac_cv_prog_make_${ac_make}_set=no;;
esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
  SET_MAKE=
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  SET_MAKE="MAKE=${MAKE-make}"
fi


# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AR+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_AR="ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="NONE"
fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


if test "$AR" = "NONE"; then
  as_fn_error $? "--> Can't find \`ar'!" "$LINENO" 5
  cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    if test "x$cache_file" != "x/dev/null"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
      if test ! -f "$cache_file" || test -h "$cache_file"; then
	cat confcache >"$cache_file"
      else
        case $cache_file in #(
        */* | ?:*)
	  mv -f confcache "$cache_file"$$ &&
	  mv -f "$cache_file"$$ "$cache_file" ;; #(
        *)
	  mv -f confcache "$cache_file" ;;
	esac
      fi
    fi
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache
  exit 1
fi

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi

for ac_prog in 'bison -y' byacc
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_YACC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$YACC"; then
  ac_cv_prog_YACC="$YACC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_YACC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
YACC=$ac_cv_prog_YACC
if test -n "$YACC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
$as_echo "$YACC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$YACC" && break
done
test -n "$YACC" || YACC="yacc"


# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if ${ac_cv_path_install+:} false; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    # Account for people who put trailing slashes in PATH elements.
case $as_dir/ in #((
  ./ | .// | /[cC]/* | \
  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
  /usr/ucb/* ) ;;
  *)
    # OSF1 and SCO ODT 3.0 have their own names for install.
    # Don't use installbsd from OSF since it installs stuff as root
    # by default.
    for ac_prog in ginstall scoinst install; do
      for ac_exec_ext in '' $ac_executable_extensions; do
	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
	  if test $ac_prog = install &&
	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    rm -rf conftest.one conftest.two conftest.dir
	    echo one > conftest.one
	    echo two > conftest.two
	    mkdir conftest.dir
	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
	      test -s conftest.one && test -s conftest.two &&
	      test -s conftest.dir/conftest.one &&
	      test -s conftest.dir/conftest.two
	    then
	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
	      break 3
	    fi
	  fi
	fi
      done
    done
    ;;
esac

  done
IFS=$as_save_IFS

rm -rf conftest.one conftest.two conftest.dir

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL=$ac_cv_path_install
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    INSTALL=$ac_install_sh
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
$as_echo "$INSTALL" >&6; }

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'

case "x$INSTALL" in
   x/*) ;;
   *) INSTALL=`pwd`/ac-tools/"shtool install -c" ;
esac

MKINSTALLDIRS=`pwd`/ac-tools/"shtool mkdir -p -f"

if test "x$PRINT_CMD" = "xNONE"; then
  # Extract the first word of "lp", so it can be a program name with args.
set dummy lp; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_LP_CMD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LP_CMD"; then
  ac_cv_prog_LP_CMD="$LP_CMD" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_LP_CMD="'lp -c'"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_LP_CMD" && ac_cv_prog_LP_CMD=""NONE""
fi
fi
LP_CMD=$ac_cv_prog_LP_CMD
if test -n "$LP_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LP_CMD" >&5
$as_echo "$LP_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  if test "${ac_cv_prog_LP_CMD}" = "NONE"; then
    # Extract the first word of "lpr", so it can be a program name with args.
set dummy lpr; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_LPR_CMD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LPR_CMD"; then
  ac_cv_prog_LPR_CMD="$LPR_CMD" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_LPR_CMD="'lpr'"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_LPR_CMD" && ac_cv_prog_LPR_CMD=""NONE""
fi
fi
LPR_CMD=$ac_cv_prog_LPR_CMD
if test -n "$LPR_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LPR_CMD" >&5
$as_echo "$LPR_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    if test "${ac_cv_prog_LPR_CMD}" = "NONE"; then
      PRINT_CMD=
    else
      PRINT_CMD="${ac_cv_prog_LPR_CMD}"
    fi
  else
    PRINT_CMD="${ac_cv_prog_LP_CMD}"
  fi
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Using \"$PRINT_CMD\" to print" >&5
$as_echo "--> Using \"$PRINT_CMD\" to print" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#include 
#include 

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdc=yes
else
  ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "memchr" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "free" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
		   (('a' <= (c) && (c) <= 'i') \
		     || ('j' <= (c) && (c) <= 'r') \
		     || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif

#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
	|| toupper (i) != TOUPPER (i))
      return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then

$as_echo "#define STDC_HEADERS 1" >>confdefs.h

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
if ${ac_cv_header_sys_wait_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
#endif
#ifndef WIFEXITED
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
#endif

int
main ()
{
  int s;
  wait (&s);
  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_sys_wait_h=yes
else
  ac_cv_header_sys_wait_h=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
$as_echo "$ac_cv_header_sys_wait_h" >&6; }
if test $ac_cv_header_sys_wait_h = yes; then

$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h

fi

for ac_header in unistd.h fcntl.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done

for ac_header in sys/param.h sys/time.h sys/select.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
if ${ac_cv_header_time+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 
#include 

int
main ()
{
if ((struct tm *) 0)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_time=yes
else
  ac_cv_header_time=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
$as_echo "$ac_cv_header_time" >&6; }
if test $ac_cv_header_time = yes; then

$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h

fi

for ac_header in math.h float.h ieeefp.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
if ${ac_cv_c_const+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
/* FIXME: Include the comments suggested by Paul. */
#ifndef __cplusplus
  /* Ultrix mips cc rejects this.  */
  typedef int charset[2];
  const charset cs;
  /* SunOS 4.1.1 cc rejects this.  */
  char const *const *pcpcc;
  char **ppc;
  /* NEC SVR4.0.2 mips cc rejects this.  */
  struct point {int x, y;};
  static struct point const zero = {0,0};
  /* AIX XL C 1.02.0.0 rejects this.
     It does not let you subtract one const X* pointer from another in
     an arm of an if-expression whose if-part is not a constant
     expression */
  const char *g = "string";
  pcpcc = &g + (g ? g-g : 0);
  /* HPUX 7.0 cc rejects these. */
  ++pcpcc;
  ppc = (char**) pcpcc;
  pcpcc = (char const *const *) ppc;
  { /* SCO 3.2v4 cc rejects this.  */
    char *t;
    char const *s = 0 ? (char *) 0 : (char const *) 0;

    *t++ = 0;
    if (s) return 0;
  }
  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
    int x[] = {25, 17};
    const int *foo = &x[0];
    ++foo;
  }
  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
    typedef const int *iptr;
    iptr p = 0;
    ++p;
  }
  { /* AIX XL C 1.02.0.0 rejects this saying
       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
    struct s { int j; const int *ap[3]; };
    struct s *b; b->j = 5;
  }
  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
    const int foo = 10;
    if (!foo) return 0;
  }
  return !cs[0] && !zero.x;
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_const=yes
else
  ac_cv_c_const=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
$as_echo "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then

$as_echo "#define const /**/" >>confdefs.h

fi

ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
if test "x$ac_cv_type_pid_t" = xyes; then :

else

cat >>confdefs.h <<_ACEOF
#define pid_t int
_ACEOF

fi

ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes; then :

else

cat >>confdefs.h <<_ACEOF
#define size_t unsigned int
_ACEOF

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; }
if ${ac_cv_struct_tm+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 

int
main ()
{
struct tm tm;
				     int *p = &tm.tm_sec;
				     return !p;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_struct_tm=time.h
else
  ac_cv_struct_tm=sys/time.h
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5
$as_echo "$ac_cv_struct_tm" >&6; }
if test $ac_cv_struct_tm = sys/time.h; then

$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
$as_echo_n "checking return type of signal handlers... " >&6; }
if ${ac_cv_type_signal+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#include 

int
main ()
{
return *(signal (0, 0)) (0) == 1;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_type_signal=int
else
  ac_cv_type_signal=void
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
$as_echo "$ac_cv_type_signal" >&6; }

cat >>confdefs.h <<_ACEOF
#define RETSIGTYPE $ac_cv_type_signal
_ACEOF


# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments.  Useless!
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
$as_echo_n "checking for working alloca.h... " >&6; }
if ${ac_cv_working_alloca_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
int
main ()
{
char *p = (char *) alloca (2 * sizeof (int));
			  if (p) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_working_alloca_h=yes
else
  ac_cv_working_alloca_h=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
$as_echo "$ac_cv_working_alloca_h" >&6; }
if test $ac_cv_working_alloca_h = yes; then

$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
$as_echo_n "checking for alloca... " >&6; }
if ${ac_cv_func_alloca_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __GNUC__
# define alloca __builtin_alloca
#else
# ifdef _MSC_VER
#  include 
#  define alloca _alloca
# else
#  ifdef HAVE_ALLOCA_H
#   include 
#  else
#   ifdef _AIX
 #pragma alloca
#   else
#    ifndef alloca /* predefined by HP cc +Olibcalls */
void *alloca (size_t);
#    endif
#   endif
#  endif
# endif
#endif

int
main ()
{
char *p = (char *) alloca (1);
				    if (p) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_func_alloca_works=yes
else
  ac_cv_func_alloca_works=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
$as_echo "$ac_cv_func_alloca_works" >&6; }

if test $ac_cv_func_alloca_works = yes; then

$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h

else
  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
# that cause trouble.  Some versions do not even contain alloca or
# contain a buggy version.  If you still want to use their alloca,
# use ar to extract alloca.o from them instead of compiling alloca.c.

ALLOCA=\${LIBOBJDIR}alloca.$ac_objext

$as_echo "#define C_ALLOCA 1" >>confdefs.h


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
if ${ac_cv_os_cray+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#if defined CRAY && ! defined CRAY2
webecray
#else
wenotbecray
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "webecray" >/dev/null 2>&1; then :
  ac_cv_os_cray=yes
else
  ac_cv_os_cray=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
$as_echo "$ac_cv_os_cray" >&6; }
if test $ac_cv_os_cray = yes; then
  for ac_func in _getb67 GETB67 getb67; do
    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :

cat >>confdefs.h <<_ACEOF
#define CRAY_STACKSEG_END $ac_func
_ACEOF

    break
fi

  done
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
$as_echo_n "checking stack direction for C alloca... " >&6; }
if ${ac_cv_c_stack_direction+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_stack_direction=0
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
find_stack_direction ()
{
  static char *addr = 0;
  auto char dummy;
  if (addr == 0)
    {
      addr = &dummy;
      return find_stack_direction ();
    }
  else
    return (&dummy > addr) ? 1 : -1;
}

int
main ()
{
  return find_stack_direction () < 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_stack_direction=1
else
  ac_cv_c_stack_direction=-1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
$as_echo "$ac_cv_c_stack_direction" >&6; }
cat >>confdefs.h <<_ACEOF
#define STACK_DIRECTION $ac_cv_c_stack_direction
_ACEOF


fi

for ac_func in getcwd gethostname
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

for ac_func in strstr
do :
  ac_fn_c_check_func "$LINENO" "strstr" "ac_cv_func_strstr"
if test "x$ac_cv_func_strstr" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRSTR 1
_ACEOF

fi
done

for ac_func in memcpy memmove
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

for ac_func in unlink fcntl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

for ac_func in popen
do :
  ac_fn_c_check_func "$LINENO" "popen" "ac_cv_func_popen"
if test "x$ac_cv_func_popen" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POPEN 1
_ACEOF

fi
done

for ac_func in gettimeofday
do :
  ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
if test "x$ac_cv_func_gettimeofday" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GETTIMEOFDAY 1
_ACEOF

fi
done

for ac_func in fnmatch
do :
  ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch"
if test "x$ac_cv_func_fnmatch" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FNMATCH 1
_ACEOF

fi
done

for ac_func in vsnprintf
do :
  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
if test "x$ac_cv_func_vsnprintf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_VSNPRINTF 1
_ACEOF

fi
done

for ac_func in on_exit
do :
  ac_fn_c_check_func "$LINENO" "on_exit" "ac_cv_func_on_exit"
if test "x$ac_cv_func_on_exit" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ON_EXIT 1
_ACEOF

fi
done

for ac_func in strerror
do :
  ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
if test "x$ac_cv_func_strerror" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRERROR 1
_ACEOF

fi
done

if test "$ac_cv_func_strerror" = no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_errlist declaration in stdio.h" >&5
$as_echo_n "checking for sys_errlist declaration in stdio.h... " >&6; }
if ${ac_cv_sys_errlist_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "sys_errlist" >/dev/null 2>&1; then :
  ac_cv_sys_errlist_decl="yes"
else
  ac_cv_sys_errlist_decl="no"
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_errlist_decl" >&5
$as_echo "$ac_cv_sys_errlist_decl" >&6; }
  if test "$ac_cv_sys_errlist_decl" = yes; then
    $as_echo "#define HAVE_SYS_ERRLIST_DECL 1" >>confdefs.h

  fi
fi


ice_tr=`echo drand48 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_drand48=no
for ac_func in drand48
do :
  ac_fn_c_check_func "$LINENO" "drand48" "ac_cv_func_drand48"
if test "x$ac_cv_func_drand48" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DRAND48 1
_ACEOF
 ice_have_drand48=yes
fi
done

if test "${ice_have_drand48}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for drand48 declaration in stdlib.h" >&5
$as_echo_n "checking for drand48 declaration in stdlib.h... " >&6; }
if ${ice_cv_have_drand48_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_drand48_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in stdlib.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}drand48 *\(" >/dev/null 2>&1; then :
  ice_cv_have_drand48_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_drand48_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}drand48 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_drand48_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_drand48_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_drand48_decl" >&5
$as_echo "$ice_cv_have_drand48_decl" >&6; }
if test "$ice_cv_have_drand48_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


for ac_func in setlocale
do :
  ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
if test "x$ac_cv_func_setlocale" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SETLOCALE 1
_ACEOF

fi
done



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether realloc is buggy" >&5
$as_echo_n "checking whether realloc is buggy... " >&6; }
if ${ac_cv_c_realloc_bug+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_realloc_bug="yes"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
int main(void) {
  void *ptr;
  ptr = NULL;
  ptr = realloc(ptr, 1);
  exit(ptr == NULL);
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_realloc_bug="no"
else
  ac_cv_c_realloc_bug="yes"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_realloc_bug" >&5
$as_echo "$ac_cv_c_realloc_bug" >&6; }
if test "$ac_cv_c_realloc_bug" = "yes"
  then
    :
    $as_echo "#define REALLOC_IS_BUGGY 1" >>confdefs.h

  else
    :

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if ${ac_cv_lib_m_sin+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBM 1
_ACEOF

  LIBS="-lm $LIBS"

fi



ice_tr=`echo hypot | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_hypot=no
for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF
 ice_have_hypot=yes
fi
done

if test "${ice_have_hypot}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration in math.h" >&5
$as_echo_n "checking for hypot declaration in math.h... " >&6; }
if ${ice_cv_have_hypot_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_hypot_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}hypot *\(" >/dev/null 2>&1; then :
  ice_cv_have_hypot_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_hypot_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}hypot *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_hypot_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_hypot_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_hypot_decl" >&5
$as_echo "$ice_cv_have_hypot_decl" >&6; }
if test "$ice_cv_have_hypot_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo rint | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_rint=no
for ac_func in rint
do :
  ac_fn_c_check_func "$LINENO" "rint" "ac_cv_func_rint"
if test "x$ac_cv_func_rint" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_RINT 1
_ACEOF
 ice_have_rint=yes
fi
done

if test "${ice_have_rint}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rint declaration in math.h" >&5
$as_echo_n "checking for rint declaration in math.h... " >&6; }
if ${ice_cv_have_rint_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_rint_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}rint *\(" >/dev/null 2>&1; then :
  ice_cv_have_rint_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_rint_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}rint *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_rint_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_rint_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_rint_decl" >&5
$as_echo "$ice_cv_have_rint_decl" >&6; }
if test "$ice_cv_have_rint_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo cbrt | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_cbrt=no
for ac_func in cbrt
do :
  ac_fn_c_check_func "$LINENO" "cbrt" "ac_cv_func_cbrt"
if test "x$ac_cv_func_cbrt" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_CBRT 1
_ACEOF
 ice_have_cbrt=yes
fi
done

if test "${ice_have_cbrt}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cbrt declaration in math.h" >&5
$as_echo_n "checking for cbrt declaration in math.h... " >&6; }
if ${ice_cv_have_cbrt_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_cbrt_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}cbrt *\(" >/dev/null 2>&1; then :
  ice_cv_have_cbrt_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_cbrt_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}cbrt *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_cbrt_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_cbrt_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_cbrt_decl" >&5
$as_echo "$ice_cv_have_cbrt_decl" >&6; }
if test "$ice_cv_have_cbrt_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo log2 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_log2=no
for ac_func in log2
do :
  ac_fn_c_check_func "$LINENO" "log2" "ac_cv_func_log2"
if test "x$ac_cv_func_log2" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG2 1
_ACEOF
 ice_have_log2=yes
fi
done

if test "${ice_have_log2}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for log2 declaration in math.h" >&5
$as_echo_n "checking for log2 declaration in math.h... " >&6; }
if ${ice_cv_have_log2_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_log2_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}log2 *\(" >/dev/null 2>&1; then :
  ice_cv_have_log2_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_log2_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}log2 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_log2_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_log2_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_log2_decl" >&5
$as_echo "$ice_cv_have_log2_decl" >&6; }
if test "$ice_cv_have_log2_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo asinh | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_asinh=no
for ac_func in asinh
do :
  ac_fn_c_check_func "$LINENO" "asinh" "ac_cv_func_asinh"
if test "x$ac_cv_func_asinh" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ASINH 1
_ACEOF
 ice_have_asinh=yes
fi
done

if test "${ice_have_asinh}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for asinh declaration in math.h" >&5
$as_echo_n "checking for asinh declaration in math.h... " >&6; }
if ${ice_cv_have_asinh_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_asinh_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}asinh *\(" >/dev/null 2>&1; then :
  ice_cv_have_asinh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_asinh_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}asinh *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_asinh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_asinh_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_asinh_decl" >&5
$as_echo "$ice_cv_have_asinh_decl" >&6; }
if test "$ice_cv_have_asinh_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo acosh | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_acosh=no
for ac_func in acosh
do :
  ac_fn_c_check_func "$LINENO" "acosh" "ac_cv_func_acosh"
if test "x$ac_cv_func_acosh" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ACOSH 1
_ACEOF
 ice_have_acosh=yes
fi
done

if test "${ice_have_acosh}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for acosh declaration in math.h" >&5
$as_echo_n "checking for acosh declaration in math.h... " >&6; }
if ${ice_cv_have_acosh_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_acosh_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}acosh *\(" >/dev/null 2>&1; then :
  ice_cv_have_acosh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_acosh_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}acosh *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_acosh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_acosh_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_acosh_decl" >&5
$as_echo "$ice_cv_have_acosh_decl" >&6; }
if test "$ice_cv_have_acosh_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo atanh | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_atanh=no
for ac_func in atanh
do :
  ac_fn_c_check_func "$LINENO" "atanh" "ac_cv_func_atanh"
if test "x$ac_cv_func_atanh" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATANH 1
_ACEOF
 ice_have_atanh=yes
fi
done

if test "${ice_have_atanh}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for atanh declaration in math.h" >&5
$as_echo_n "checking for atanh declaration in math.h... " >&6; }
if ${ice_cv_have_atanh_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_atanh_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}atanh *\(" >/dev/null 2>&1; then :
  ice_cv_have_atanh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_atanh_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}atanh *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_atanh_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_atanh_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_atanh_decl" >&5
$as_echo "$ice_cv_have_atanh_decl" >&6; }
if test "$ice_cv_have_atanh_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo lgamma | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_lgamma=no
for ac_func in lgamma
do :
  ac_fn_c_check_func "$LINENO" "lgamma" "ac_cv_func_lgamma"
if test "x$ac_cv_func_lgamma" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LGAMMA 1
_ACEOF
 ice_have_lgamma=yes
fi
done

if test "${ice_have_lgamma}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for lgamma declaration in math.h" >&5
$as_echo_n "checking for lgamma declaration in math.h... " >&6; }
if ${ice_cv_have_lgamma_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_lgamma_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}lgamma *\(" >/dev/null 2>&1; then :
  ice_cv_have_lgamma_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_lgamma_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}lgamma *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_lgamma_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_lgamma_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_lgamma_decl" >&5
$as_echo "$ice_cv_have_lgamma_decl" >&6; }
if test "$ice_cv_have_lgamma_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


if test "$ac_cv_func_lgamma" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signgam declaration in math.h" >&5
$as_echo_n "checking for signgam declaration in math.h... " >&6; }
if ${ac_cv_signgam_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "signgam" >/dev/null 2>&1; then :
  ac_cv_signgam_decl="yes"
else
  ac_cv_signgam_decl="no"
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_signgam_decl" >&5
$as_echo "$ac_cv_signgam_decl" >&6; }
  if test "$ac_cv_signgam_decl" = yes; then
    $as_echo "#define HAVE_SIGNGAM_DECL 1" >>confdefs.h

  fi
fi


ice_tr=`echo erf | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_erf=no
for ac_func in erf
do :
  ac_fn_c_check_func "$LINENO" "erf" "ac_cv_func_erf"
if test "x$ac_cv_func_erf" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ERF 1
_ACEOF
 ice_have_erf=yes
fi
done

if test "${ice_have_erf}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for erf declaration in math.h" >&5
$as_echo_n "checking for erf declaration in math.h... " >&6; }
if ${ice_cv_have_erf_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_erf_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}erf *\(" >/dev/null 2>&1; then :
  ice_cv_have_erf_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_erf_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}erf *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_erf_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_erf_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_erf_decl" >&5
$as_echo "$ice_cv_have_erf_decl" >&6; }
if test "$ice_cv_have_erf_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo erfc | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_erfc=no
for ac_func in erfc
do :
  ac_fn_c_check_func "$LINENO" "erfc" "ac_cv_func_erfc"
if test "x$ac_cv_func_erfc" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ERFC 1
_ACEOF
 ice_have_erfc=yes
fi
done

if test "${ice_have_erfc}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for erfc declaration in math.h" >&5
$as_echo_n "checking for erfc declaration in math.h... " >&6; }
if ${ice_cv_have_erfc_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_erfc_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}erfc *\(" >/dev/null 2>&1; then :
  ice_cv_have_erfc_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_erfc_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}erfc *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_erfc_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_erfc_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_erfc_decl" >&5
$as_echo "$ice_cv_have_erfc_decl" >&6; }
if test "$ice_cv_have_erfc_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo j0 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_j0=no
for ac_func in j0
do :
  ac_fn_c_check_func "$LINENO" "j0" "ac_cv_func_j0"
if test "x$ac_cv_func_j0" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_J0 1
_ACEOF
 ice_have_j0=yes
fi
done

if test "${ice_have_j0}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for j0 declaration in math.h" >&5
$as_echo_n "checking for j0 declaration in math.h... " >&6; }
if ${ice_cv_have_j0_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_j0_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}j0 *\(" >/dev/null 2>&1; then :
  ice_cv_have_j0_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_j0_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}j0 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_j0_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_j0_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_j0_decl" >&5
$as_echo "$ice_cv_have_j0_decl" >&6; }
if test "$ice_cv_have_j0_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo j1 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_j1=no
for ac_func in j1
do :
  ac_fn_c_check_func "$LINENO" "j1" "ac_cv_func_j1"
if test "x$ac_cv_func_j1" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_J1 1
_ACEOF
 ice_have_j1=yes
fi
done

if test "${ice_have_j1}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for j1 declaration in math.h" >&5
$as_echo_n "checking for j1 declaration in math.h... " >&6; }
if ${ice_cv_have_j1_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_j1_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}j1 *\(" >/dev/null 2>&1; then :
  ice_cv_have_j1_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_j1_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}j1 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_j1_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_j1_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_j1_decl" >&5
$as_echo "$ice_cv_have_j1_decl" >&6; }
if test "$ice_cv_have_j1_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo jn | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_jn=no
for ac_func in jn
do :
  ac_fn_c_check_func "$LINENO" "jn" "ac_cv_func_jn"
if test "x$ac_cv_func_jn" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_JN 1
_ACEOF
 ice_have_jn=yes
fi
done

if test "${ice_have_jn}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for jn declaration in math.h" >&5
$as_echo_n "checking for jn declaration in math.h... " >&6; }
if ${ice_cv_have_jn_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_jn_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}jn *\(" >/dev/null 2>&1; then :
  ice_cv_have_jn_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_jn_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}jn *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_jn_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_jn_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_jn_decl" >&5
$as_echo "$ice_cv_have_jn_decl" >&6; }
if test "$ice_cv_have_jn_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo y0 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_y0=no
for ac_func in y0
do :
  ac_fn_c_check_func "$LINENO" "y0" "ac_cv_func_y0"
if test "x$ac_cv_func_y0" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_Y0 1
_ACEOF
 ice_have_y0=yes
fi
done

if test "${ice_have_y0}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for y0 declaration in math.h" >&5
$as_echo_n "checking for y0 declaration in math.h... " >&6; }
if ${ice_cv_have_y0_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_y0_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}y0 *\(" >/dev/null 2>&1; then :
  ice_cv_have_y0_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_y0_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}y0 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_y0_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_y0_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_y0_decl" >&5
$as_echo "$ice_cv_have_y0_decl" >&6; }
if test "$ice_cv_have_y0_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo y1 | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_y1=no
for ac_func in y1
do :
  ac_fn_c_check_func "$LINENO" "y1" "ac_cv_func_y1"
if test "x$ac_cv_func_y1" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_Y1 1
_ACEOF
 ice_have_y1=yes
fi
done

if test "${ice_have_y1}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for y1 declaration in math.h" >&5
$as_echo_n "checking for y1 declaration in math.h... " >&6; }
if ${ice_cv_have_y1_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_y1_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}y1 *\(" >/dev/null 2>&1; then :
  ice_cv_have_y1_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_y1_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}y1 *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_y1_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_y1_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_y1_decl" >&5
$as_echo "$ice_cv_have_y1_decl" >&6; }
if test "$ice_cv_have_y1_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo yn | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_yn=no
for ac_func in yn
do :
  ac_fn_c_check_func "$LINENO" "yn" "ac_cv_func_yn"
if test "x$ac_cv_func_yn" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_YN 1
_ACEOF
 ice_have_yn=yes
fi
done

if test "${ice_have_yn}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yn declaration in math.h" >&5
$as_echo_n "checking for yn declaration in math.h... " >&6; }
if ${ice_cv_have_yn_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_yn_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}yn *\(" >/dev/null 2>&1; then :
  ice_cv_have_yn_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_yn_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}yn *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_yn_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_yn_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_yn_decl" >&5
$as_echo "$ice_cv_have_yn_decl" >&6; }
if test "$ice_cv_have_yn_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


ice_tr=`echo finite | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_finite=no
for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF
 ice_have_finite=yes
fi
done

if test "${ice_have_finite}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration in math.h" >&5
$as_echo_n "checking for finite declaration in math.h... " >&6; }
if ${ice_cv_have_finite_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_finite_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}finite *\(" >/dev/null 2>&1; then :
  ice_cv_have_finite_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_finite_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}finite *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_finite_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_finite_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_finite_decl" >&5
$as_echo "$ice_cv_have_finite_decl" >&6; }
if test "$ice_cv_have_finite_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi

if test "$ac_cv_lib_m_finite" != yes; then

ice_tr=`echo isfinite | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_isfinite=no
for ac_func in isfinite
do :
  ac_fn_c_check_func "$LINENO" "isfinite" "ac_cv_func_isfinite"
if test "x$ac_cv_func_isfinite" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISFINITE 1
_ACEOF
 ice_have_isfinite=yes
fi
done

if test "${ice_have_isfinite}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite declaration in math.h" >&5
$as_echo_n "checking for isfinite declaration in math.h... " >&6; }
if ${ice_cv_have_isfinite_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_isfinite_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}isfinite *\(" >/dev/null 2>&1; then :
  ice_cv_have_isfinite_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_isfinite_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}isfinite *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_isfinite_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_isfinite_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_isfinite_decl" >&5
$as_echo "$ice_cv_have_isfinite_decl" >&6; }
if test "$ice_cv_have_isfinite_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi

fi

ice_tr=`echo isnan | tr '[a-z]' '[A-Z]'`
ice_have_tr=HAVE_$ice_tr
ice_have_decl_tr=${ice_have_tr}_DECL
ice_have_isnan=no
for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF
 ice_have_isnan=yes
fi
done

if test "${ice_have_isnan}" = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration in math.h" >&5
$as_echo_n "checking for isnan declaration in math.h... " >&6; }
if ${ice_cv_have_isnan_decl+:} false; then :
  $as_echo_n "(cached) " >&6
else

ice_cv_have_isnan_decl=no
ice_re_params='[a-zA-Z_][a-zA-Z0-9_]*'
ice_re_word='(^|[^a-zA-Z_0-9_])'
for header in math.h; do
# Check for ordinary declaration
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}isnan *\(" >/dev/null 2>&1; then :
  ice_cv_have_isnan_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_isnan_decl" = yes; then
	break
fi
# Check for "fixed" declaration like "getpid _PARAMS((int))"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$header>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "${ice_re_word}isnan *$ice_re_params\(\(" >/dev/null 2>&1; then :
  ice_cv_have_isnan_decl=yes
fi
rm -f conftest*

if test "$ice_cv_have_isnan_decl" = yes; then
	break
fi
done

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_isnan_decl" >&5
$as_echo "$ice_cv_have_isnan_decl" >&6; }
if test "$ice_cv_have_isnan_decl" = yes; then
cat >>confdefs.h <<_ACEOF
#define ${ice_have_decl_tr} 1
_ACEOF

fi
fi


if test $bundled_t1lib = false
then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for T1lib >= 1.3.1" >&5
$as_echo_n "checking for T1lib >= 1.3.1... " >&6; }
if ${acx_cv_t1lib+:} false; then :
  $as_echo_n "(cached) " >&6
else

    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="-lt1 -lm $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_t1lib="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        char *vlib;
        vlib = T1_GetLibIdent();
        if (strcmp(vlib, "1.3.1") < 0) {
          exit(1);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_t1lib="yes"
else
  acx_cv_t1lib="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_t1lib" >&5
$as_echo "$acx_cv_t1lib" >&6; }
  if test "$acx_cv_t1lib" = "yes"
  then
    T1_LIB="-lt1"
    $as_echo "#define HAVE_LIBT1 1" >>confdefs.h

  else
    T1_LIB=
    bundled_t1lib=true
  fi

fi

if test $bundled_t1lib = true
then

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Bundled version of T1lib will be used" >&5
$as_echo "--> Bundled version of T1lib will be used" >&6; }

  T1_LIB='$(TOP)/T1lib/libt1.a'
  T1_INC='-I$(TOP)/T1lib/t1lib'
  t1lib_dir="T1lib"


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"which ANSI integer type is 16 bit\"" >&5
$as_echo_n "checking \"which ANSI integer type is 16 bit\"... " >&6; }
if ${ac_16bit_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_16bit_type=
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  int main(void) {
    if (sizeof(short)==2)
      return(0);
    else if (sizeof(int)==2)
      return(1);
    else
      return(2);
  }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_16bit_type="short"
else
  ac_16bit_type="int"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_16bit_type" >&5
$as_echo "$ac_16bit_type" >&6; }
  if test "$ac_16bit_type" = "short"
  then
    T1_AA_TYPE16="short"
  else
    T1_AA_TYPE16="int"
  fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"which ANSI integer type is 32 bit\"" >&5
$as_echo_n "checking \"which ANSI integer type is 32 bit\"... " >&6; }
if ${ac_32bit_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_32bit_type=
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  int main(void) {
    if (sizeof(int)==4)
      return(0);
    else if (sizeof(long)==4)
      return(1);
    else
      return(2);
  }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_32bit_type="int"
else
  ac_32bit_type="long"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_32bit_type" >&5
$as_echo "$ac_32bit_type" >&6; }
  if test "$ac_32bit_type" = "int"
  then
    T1_AA_TYPE32="int"
  else
    T1_AA_TYPE32="long"
  fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"which ANSI integer type is 64 bit\"" >&5
$as_echo_n "checking \"which ANSI integer type is 64 bit\"... " >&6; }
if ${ac_64bit_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_64bit_type=
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  int main(void) {
    if (sizeof(long)==8)
      return(0);
    else
      return(1);
  }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_64bit_type="long"
else
  ac_64bit_type=""
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_64bit_type" >&5
$as_echo "$ac_64bit_type" >&6; }
  if test "$ac_64bit_type" = "long"
  then
    T1_AA_TYPE64="long"
  else
    T1_AA_TYPE64=
  fi

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Good. Seems you have compatible version of T1lib installed" >&5
$as_echo "--> Good. Seems you have compatible version of T1lib installed" >&6; }
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing xdrstdio_create" >&5
$as_echo_n "checking for library containing xdrstdio_create... " >&6; }
if ${mdw_cv_lib_xdrstdio_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  mdw_save_LIBS="$LIBS"
mdw_cv_lib_xdrstdio_create="no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
xdrstdio_create()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_xdrstdio_create="none required"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
test "$mdw_cv_lib_xdrstdio_create" = "no" && for i in nsl rpc xdr rpclib; do
LIBS="-l$i $mdw_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
xdrstdio_create()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_xdrstdio_create="-l$i"
break
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
done
LIBS="$mdw_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mdw_cv_lib_xdrstdio_create" >&5
$as_echo "$mdw_cv_lib_xdrstdio_create" >&6; }
if test "$mdw_cv_lib_xdrstdio_create" != "no"; then
  if test "xXDR_LIB=$mdw_cv_lib_xdrstdio_create" != "x"; then
    test "$mdw_cv_lib_xdrstdio_create" = "none required" && mdw_cv_lib_xdrstdio_create=""
    XDR_LIB=$mdw_cv_lib_xdrstdio_create
  else
    test "$mdw_cv_lib_xdrstdio_create" = "none required" || LIBS="$mdw_cv_lib_xdrstdio_create $LIBS"
  fi
else :
  XDR_LIB="NONE"
fi

if test "${XDR_LIB}" = "NONE"; then
  XDR_LIB=
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> No XDR library found; grconvert will not be built" >&5
$as_echo "--> No XDR library found; grconvert will not be built" >&6; }
else
  grconvert_dir="grconvert"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
$as_echo_n "checking for library containing dlopen... " >&6; }
if ${mdw_cv_lib_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  mdw_save_LIBS="$LIBS"
mdw_cv_lib_dlopen="no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
dlopen()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_dlopen="none required"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
test "$mdw_cv_lib_dlopen" = "no" && for i in dl; do
LIBS="-l$i $mdw_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
dlopen()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_dlopen="-l$i"
break
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
done
LIBS="$mdw_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mdw_cv_lib_dlopen" >&5
$as_echo "$mdw_cv_lib_dlopen" >&6; }
if test "$mdw_cv_lib_dlopen" != "no"; then
  if test "xDL_LIB=$mdw_cv_lib_dlopen; $as_echo "#define HAVE_DLOPEN 1" >>confdefs.h
" != "x"; then
    test "$mdw_cv_lib_dlopen" = "none required" && mdw_cv_lib_dlopen=""
    DL_LIB=$mdw_cv_lib_dlopen; $as_echo "#define HAVE_DLOPEN 1" >>confdefs.h

  else
    test "$mdw_cv_lib_dlopen" = "none required" || LIBS="$mdw_cv_lib_dlopen $LIBS"
  fi
else :
  DL_LIB="NONE"
fi

if test "${DL_LIB}" != "NONE"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether RTLD_NOW is defined in dlfcn.h" >&5
$as_echo_n "checking whether RTLD_NOW is defined in dlfcn.h... " >&6; }
if ${ac_rtld_now_in_dlfcn_h+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
         #ifdef RTLD_NOW
            yes
         #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_rtld_now_in_dlfcn_h="yes"; $as_echo "#define HAVE_RTLD_NOW 1" >>confdefs.h

else
  ac_rtld_now_in_dlfcn_h="no"
fi
rm -f conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_rtld_now_in_dlfcn_h" >&5
$as_echo "$ac_rtld_now_in_dlfcn_h" >&6; }
else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing shl_load" >&5
$as_echo_n "checking for library containing shl_load... " >&6; }
if ${mdw_cv_lib_shl_load+:} false; then :
  $as_echo_n "(cached) " >&6
else
  mdw_save_LIBS="$LIBS"
mdw_cv_lib_shl_load="no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
shl_load()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_shl_load="none required"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
test "$mdw_cv_lib_shl_load" = "no" && for i in dld; do
LIBS="-l$i $mdw_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
shl_load()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  mdw_cv_lib_shl_load="-l$i"
break
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
done
LIBS="$mdw_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mdw_cv_lib_shl_load" >&5
$as_echo "$mdw_cv_lib_shl_load" >&6; }
if test "$mdw_cv_lib_shl_load" != "no"; then
  if test "xDL_LIB=$mdw_cv_lib_shl_load; $as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h
" != "x"; then
    test "$mdw_cv_lib_shl_load" = "none required" && mdw_cv_lib_shl_load=""
    DL_LIB=$mdw_cv_lib_shl_load; $as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h

  else
    test "$mdw_cv_lib_shl_load" = "none required" || LIBS="$mdw_cv_lib_shl_load $LIBS"
  fi
else :
  DL_LIB="NONE"
fi
fi

if test "${DL_LIB}" = "NONE"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Support for dll modules will not be compiled" >&5
$as_echo "--> Support for dll modules will not be compiled" >&6; }
  DL_LIB=""
fi

if test $netcdf = true
then


# Check whether --with-netcdf_libraries was given.
if test "${with_netcdf_libraries+set}" = set; then :
  withval=$with_netcdf_libraries; netcdf_libraries="$withval"
fi

  if test "x$netcdf_libraries" = "x"
  then
    netcdf_libraries=-lnetcdf
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for netCDF API version >= 3.0" >&5
$as_echo_n "checking for netCDF API version >= 3.0... " >&6; }
if ${acx_cv_netcdf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_netcdf_libraries+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_netcdf_libraries=$netcdf_libraries
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_netcdf_libraries $LIBS"


    if test "$cross_compiling" = yes; then :
  acx_cv_netcdf="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        char *vlib;
        vlib = nc_inq_libvers();
        if (strcmp(vlib, "3.0") < 0) {
          exit(1);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_netcdf="yes"
else
  acx_cv_netcdf="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_netcdf" >&5
$as_echo "$acx_cv_netcdf" >&6; }
  if test "$acx_cv_netcdf" = "yes"
  then
    NETCDF_LIBS="$acx_cv_netcdf_libraries"
    $as_echo "#define HAVE_NETCDF 1" >>confdefs.h

  else
    NETCDF_LIBS=
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> support for netCDF is disabled" >&5
$as_echo "--> support for netCDF is disabled" >&6; }
  fi

fi

if test $fftw = true
then


# Check whether --with-fftw_library was given.
if test "${with_fftw_library+set}" = set; then :
  withval=$with_fftw_library; fftw_library="$withval"
fi

  if test "x$fftw_library" = "x"
  then
    fftw_library=-lfftw
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW library >= 2.1.3" >&5
$as_echo_n "checking for FFTW library >= 2.1.3... " >&6; }
if ${acx_cv_fftw+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_fftw_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_fftw_library=$fftw_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_fftw_library $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_fftw="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        char *vlib = (char *) fftw_version;
        if (strcmp(vlib, "2.1.3") < 0) {
          exit(1);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_fftw="yes"
else
  acx_cv_fftw="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi



    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fftw" >&5
$as_echo "$acx_cv_fftw" >&6; }
  if test "$acx_cv_fftw" = "yes"
  then
    FFTW_LIB="$acx_cv_fftw_library"
    $as_echo "#define HAVE_FFTW 1" >>confdefs.h

  else
    FFTW_LIB=
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> using legacy unoptimized FFT code" >&5
$as_echo "--> using legacy unoptimized FFT code" >&6; }
  fi

fi

if test $pngdrv = true || test $pdfdrv = true || test $xmhtml = true
then


# Check whether --with-zlib_library was given.
if test "${with_zlib_library+set}" = set; then :
  withval=$with_zlib_library; zlib_library="$withval"
fi

  if test "x$zlib_library" = "x"
  then
    zlib_library=-lz
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zlib >= 1.0.3" >&5
$as_echo_n "checking for zlib >= 1.0.3... " >&6; }
if ${acx_cv_zlib+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_zlib_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_zlib_library=$zlib_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_zlib_library $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_zlib="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        char *vlib, *vinc;
        vlib = zlibVersion();
        vinc = ZLIB_VERSION;
        if (strcmp(vinc, "1.0.3") < 0) {
          exit(1);
        }
        if (strcmp(vinc, vlib) != 0) {
          exit(2);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_zlib="yes"
else
  acx_cv_zlib="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_zlib" >&5
$as_echo "$acx_cv_zlib" >&6; }
  if test "$acx_cv_zlib" = "yes"
  then
    Z_LIB="$acx_cv_zlib_library"

  else
    Z_LIB=

  fi

fi

if test $jpegdrv = true || test $pdfdrv = true || test $xmhtml = true
then


# Check whether --with-jpeg_library was given.
if test "${with_jpeg_library+set}" = set; then :
  withval=$with_jpeg_library; jpeg_library="$withval"
fi

  if test "x$jpeg_library" = "x"
  then
    jpeg_library=-ljpeg
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IJG JPEG software >= 61" >&5
$as_echo_n "checking for IJG JPEG software >= 61... " >&6; }
if ${acx_cv_jpeg+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_jpeg_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_jpeg_library=$jpeg_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_jpeg_library $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_jpeg="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        int vinc;
        struct jpeg_compress_struct cinfo;
        jpeg_create_compress(&cinfo);
        vinc = JPEG_LIB_VERSION;
        if (vinc < 61) {
          exit(1);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_jpeg="yes"
else
  acx_cv_jpeg="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_jpeg" >&5
$as_echo "$acx_cv_jpeg" >&6; }
  if test "$acx_cv_jpeg" = "yes"
  then
    JPEG_LIB=$acx_cv_jpeg_library
    $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h

  else
    JPEG_LIB=
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> JPEG backend is disabled" >&5
$as_echo "--> JPEG backend is disabled" >&6; }
  fi

fi

if test $pngdrv = true || test $pdfdrv = true || test $xmhtml = true
then


# Check whether --with-png_library was given.
if test "${with_png_library+set}" = set; then :
  withval=$with_png_library; png_library="$withval"
fi

  if test "x$png_library" = "x"
  then
    png_library=-lpng
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpng >= 0.9.6" >&5
$as_echo_n "checking for libpng >= 0.9.6... " >&6; }
if ${acx_cv_png+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_png_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_png_library=$png_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_png_library $Z_LIB $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_png="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
#include 
      int main(void) {
        char *vlib, *vinc;
        vlib = png_libpng_ver;
        vinc = PNG_LIBPNG_VER_STRING;
        if (strcmp(vinc, "0.9.6") < 0) {
          exit(1);
        }
        if (strcmp(vinc, vlib) != 0) {
          exit(2);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_png="yes"
else
  acx_cv_png="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_png" >&5
$as_echo "$acx_cv_png" >&6; }
  if test "$acx_cv_png" = "yes"
  then
    PNG_LIB="$acx_cv_png_library"
    $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h

  else
    PNG_LIB=
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> PNG backend is disabled" >&5
$as_echo "--> PNG backend is disabled" >&6; }
  fi

fi

if test $pdfdrv = true
then


# Check whether --with-pdf_library was given.
if test "${with_pdf_library+set}" = set; then :
  withval=$with_pdf_library; pdf_library="$withval"
fi

  if test "x$pdf_library" = "x"
  then
    pdf_library=-lpdf
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDFlib >= 5.0.0" >&5
$as_echo_n "checking for PDFlib >= 5.0.0... " >&6; }
if ${acx_cv_pdflib+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_pdf_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_pdf_library=$pdf_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_pdf_library $JPEG_LIB $PNG_LIB $Z_LIB $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_pdflib="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
      int main(void) {
        char *vinc;
        int vlibn, vincn;
        vlibn = 100*PDF_get_majorversion() + PDF_get_minorversion();
        vincn = 100*PDFLIB_MAJORVERSION + PDFLIB_MINORVERSION;
        vinc = PDFLIB_VERSIONSTRING;
        if (strcmp(vinc, "5.0.0") < 0) {
          exit(1);
        }
        if (vincn != vlibn) {
          exit(2);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_pdflib="yes"
else
  acx_cv_pdflib="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_pdflib" >&5
$as_echo "$acx_cv_pdflib" >&6; }
  if test "$acx_cv_pdflib" = "yes"
  then
    PDF_LIB="$acx_cv_pdf_library"
    $as_echo "#define HAVE_LIBPDF 1" >>confdefs.h

  else
    PDF_LIB=
    pdfdrv=false
  fi

fi
if test $pdfdrv != true; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> PDF driver is disabled" >&5
$as_echo "--> PDF driver is disabled" >&6; }
fi


NOGUI_LIBS="$LIBS"


GRACE=grace

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
$as_echo_n "checking for X... " >&6; }


# Check whether --with-x was given.
if test "${with_x+set}" = set; then :
  withval=$with_x;
fi

# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
if test "x$with_x" = xno; then
  # The user explicitly disabled X.
  have_x=disabled
else
  case $x_includes,$x_libraries in #(
    *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
    *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # One or both of the vars are not set, and there is no cached value.
ac_x_includes=no ac_x_libraries=no
rm -f -r conftest.dir
if mkdir conftest.dir; then
  cd conftest.dir
  cat >Imakefile <<'_ACEOF'
incroot:
	@echo incroot='${INCROOT}'
usrlibdir:
	@echo usrlibdir='${USRLIBDIR}'
libdir:
	@echo libdir='${LIBDIR}'
_ACEOF
  if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
    # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
    for ac_var in incroot usrlibdir libdir; do
      eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
    done
    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
    for ac_extension in a so sl dylib la dll; do
      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
	 test -f "$ac_im_libdir/libX11.$ac_extension"; then
	ac_im_usrlibdir=$ac_im_libdir; break
      fi
    done
    # Screen out bogus values from the imake configuration.  They are
    # bogus both because they are the default anyway, and because
    # using them would break gcc on systems where it needs fixed includes.
    case $ac_im_incroot in
	/usr/include) ac_x_includes= ;;
	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
    esac
    case $ac_im_usrlibdir in
	/usr/lib | /usr/lib64 | /lib | /lib64) ;;
	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
    esac
  fi
  cd ..
  rm -f -r conftest.dir
fi

# Standard set of common directories for X headers.
# Check X11 before X11Rn because it is often a symlink to the current release.
ac_x_header_dirs='
/usr/X11/include
/usr/X11R7/include
/usr/X11R6/include
/usr/X11R5/include
/usr/X11R4/include

/usr/include/X11
/usr/include/X11R7
/usr/include/X11R6
/usr/include/X11R5
/usr/include/X11R4

/usr/local/X11/include
/usr/local/X11R7/include
/usr/local/X11R6/include
/usr/local/X11R5/include
/usr/local/X11R4/include

/usr/local/include/X11
/usr/local/include/X11R7
/usr/local/include/X11R6
/usr/local/include/X11R5
/usr/local/include/X11R4

/usr/X386/include
/usr/x386/include
/usr/XFree86/include/X11

/usr/include
/usr/local/include
/usr/unsupported/include
/usr/athena/include
/usr/local/x11r5/include
/usr/lpp/Xamples/include

/usr/openwin/include
/usr/openwin/share/include'

if test "$ac_x_includes" = no; then
  # Guess where to find include files, by looking for Xlib.h.
  # First, try using that file with no special directory specified.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # We can compile using X headers with no special include directory.
ac_x_includes=
else
  for ac_dir in $ac_x_header_dirs; do
  if test -r "$ac_dir/X11/Xlib.h"; then
    ac_x_includes=$ac_dir
    break
  fi
done
fi
rm -f conftest.err conftest.i conftest.$ac_ext
fi # $ac_x_includes = no

if test "$ac_x_libraries" = no; then
  # Check for the libraries.
  # See if we find them without any special options.
  # Don't add to $LIBS permanently.
  ac_save_LIBS=$LIBS
  LIBS="-lX11 $LIBS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
int
main ()
{
XrmInitialize ()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIBS=$ac_save_LIBS
# We can link X programs with no special library path.
ac_x_libraries=
else
  LIBS=$ac_save_LIBS
for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
do
  # Don't even attempt the hair of trying to link an X program!
  for ac_extension in a so sl dylib la dll; do
    if test -r "$ac_dir/libX11.$ac_extension"; then
      ac_x_libraries=$ac_dir
      break 2
    fi
  done
done
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi # $ac_x_libraries = no

case $ac_x_includes,$ac_x_libraries in #(
  no,* | *,no | *\'*)
    # Didn't find X, or a directory has "'" in its name.
    ac_cv_have_x="have_x=no";; #(
  *)
    # Record where we found X for the cache.
    ac_cv_have_x="have_x=yes\
	ac_x_includes='$ac_x_includes'\
	ac_x_libraries='$ac_x_libraries'"
esac
fi
;; #(
    *) have_x=yes;;
  esac
  eval "$ac_cv_have_x"
fi # $with_x != no

if test "$have_x" != yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
$as_echo "$have_x" >&6; }
  no_x=yes
else
  # If each of the values was on the command line, it overrides each guess.
  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
  # Update the cache value to reflect the command line values.
  ac_cv_have_x="have_x=yes\
	ac_x_includes='$x_includes'\
	ac_x_libraries='$x_libraries'"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
fi

if test "$no_x" = yes; then
  # Not all programs may use this symbol, but it does not hurt to define it.

$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h

  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
else
  if test -n "$x_includes"; then
    X_CFLAGS="$X_CFLAGS -I$x_includes"
  fi

  # It would also be nice to do this for all -L options, not just this one.
  if test -n "$x_libraries"; then
    X_LIBS="$X_LIBS -L$x_libraries"
    # For Solaris; some versions of Sun CC require a space after -R and
    # others require no space.  Words are not sufficient . . . .
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
$as_echo_n "checking whether -R must be followed by a space... " >&6; }
    ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
    ac_xsave_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
       X_LIBS="$X_LIBS -R$x_libraries"
else
  LIBS="$ac_xsave_LIBS -R $x_libraries"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	  X_LIBS="$X_LIBS -R $x_libraries"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
$as_echo "neither works" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    ac_c_werror_flag=$ac_xsave_c_werror_flag
    LIBS=$ac_xsave_LIBS
  fi

  # Check for system-dependent libraries X programs must link with.
  # Do this before checking for the system-independent R6 libraries
  # (-lICE), since we may need -lsocket or whatever for X linking.

  if test "$ISC" = yes; then
    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
  else
    # Martyn Johnson says this is needed for Ultrix, if the X
    # libraries were built with DECnet support.  And Karl Berry says
    # the Alpha needs dnet_stub (dnet does not exist).
    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char XOpenDisplay ();
int
main ()
{
return XOpenDisplay ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dnet_ntoa ();
int
main ()
{
return dnet_ntoa ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dnet_dnet_ntoa=yes
else
  ac_cv_lib_dnet_dnet_ntoa=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
fi

    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet_stub  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dnet_ntoa ();
int
main ()
{
return dnet_ntoa ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dnet_stub_dnet_ntoa=yes
else
  ac_cv_lib_dnet_stub_dnet_ntoa=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
fi

    fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LIBS="$ac_xsave_LIBS"

    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
    # to get the SysV transport functions.
    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
    # needs -lnsl.
    # The nsl library prevents programs from opening the X display
    # on Irix 5.2, according to T.E. Dickey.
    # The functions gethostbyname, getservbyname, and inet_addr are
    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
    ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
if test "x$ac_cv_func_gethostbyname" = xyes; then :

fi

    if test $ac_cv_func_gethostbyname = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gethostbyname ();
int
main ()
{
return gethostbyname ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_nsl_gethostbyname=yes
else
  ac_cv_lib_nsl_gethostbyname=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
fi

      if test $ac_cv_lib_nsl_gethostbyname = no; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gethostbyname ();
int
main ()
{
return gethostbyname ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_bsd_gethostbyname=yes
else
  ac_cv_lib_bsd_gethostbyname=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
fi

      fi
    fi

    # lieder@skyler.mavd.honeywell.com says without -lsocket,
    # socket/setsockopt and other routines are undefined under SCO ODT
    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
    # on later versions), says Simon Leinen: it contains gethostby*
    # variants that don't use the name server (or something).  -lsocket
    # must be given before -lnsl if both are needed.  We assume that
    # if connect needs -lnsl, so does gethostbyname.
    ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
if test "x$ac_cv_func_connect" = xyes; then :

fi

    if test $ac_cv_func_connect = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
$as_echo_n "checking for connect in -lsocket... " >&6; }
if ${ac_cv_lib_socket_connect+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char connect ();
int
main ()
{
return connect ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_socket_connect=yes
else
  ac_cv_lib_socket_connect=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
$as_echo "$ac_cv_lib_socket_connect" >&6; }
if test "x$ac_cv_lib_socket_connect" = xyes; then :
  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
fi

    fi

    # Guillermo Gomez says -lposix is necessary on A/UX.
    ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
if test "x$ac_cv_func_remove" = xyes; then :

fi

    if test $ac_cv_func_remove = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
$as_echo_n "checking for remove in -lposix... " >&6; }
if ${ac_cv_lib_posix_remove+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char remove ();
int
main ()
{
return remove ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_posix_remove=yes
else
  ac_cv_lib_posix_remove=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
$as_echo "$ac_cv_lib_posix_remove" >&6; }
if test "x$ac_cv_lib_posix_remove" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
fi

    fi

    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
    ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
if test "x$ac_cv_func_shmat" = xyes; then :

fi

    if test $ac_cv_func_shmat = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
$as_echo_n "checking for shmat in -lipc... " >&6; }
if ${ac_cv_lib_ipc_shmat+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lipc  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char shmat ();
int
main ()
{
return shmat ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ipc_shmat=yes
else
  ac_cv_lib_ipc_shmat=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
fi

    fi
  fi

  # Check for libraries that X11R6 Xt/Xaw programs need.
  ac_save_LDFLAGS=$LDFLAGS
  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
  # check for ICE first), but we must link in the order -lSM -lICE or
  # we get undefined symbols.  So assume we have SM if we have ICE.
  # These have to be linked with before -lX11, unlike the other
  # libraries we check for below, so use a different variable.
  # John Interrante, Karl Berry
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char IceConnectionNumber ();
int
main ()
{
return IceConnectionNumber ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ICE_IceConnectionNumber=yes
else
  ac_cv_lib_ICE_IceConnectionNumber=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
fi

  LDFLAGS=$ac_save_LDFLAGS

fi

if test "$no_x" = yes; then
  GUI="NONE_GUI"
else
  GUI_LIBS="-lXt -lXext -lX11 $X_PRE_LIBS $X_EXTRA_LIBS"


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS


  LIBS="$GUI_LIBS"
  CFLAGS="$X_CFLAGS $CFLAGS"
  CPPFLAGS="$X_CFLAGS $CPPFLAGS"
  LDFLAGS="$X_LIBS $LDFLAGS"

    case $editres in
    true) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _XEditResCheckMessages in -lXmu" >&5
$as_echo_n "checking for _XEditResCheckMessages in -lXmu... " >&6; }
if ${ac_cv_lib_Xmu__XEditResCheckMessages+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXmu  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char _XEditResCheckMessages ();
int
main ()
{
return _XEditResCheckMessages ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xmu__XEditResCheckMessages=yes
else
  ac_cv_lib_Xmu__XEditResCheckMessages=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xmu__XEditResCheckMessages" >&5
$as_echo "$ac_cv_lib_Xmu__XEditResCheckMessages" >&6; }
if test "x$ac_cv_lib_Xmu__XEditResCheckMessages" = xyes; then :
  GUI_LIBS="-lXmu $GUI_LIBS"; $as_echo "#define WITH_EDITRES 1" >>confdefs.h

fi
;;
    *) ;;
  esac

  if test "$ac_cv_lib_Xmu__XEditResCheckMessages" != yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> support for EditRes protocol is disabled" >&5
$as_echo "--> support for EditRes protocol is disabled" >&6; }
  fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lXp" >&5
$as_echo_n "checking for main in -lXp... " >&6; }
if ${ac_cv_lib_Xp_main+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXp  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


int
main ()
{
return main ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xp_main=yes
else
  ac_cv_lib_Xp_main=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xp_main" >&5
$as_echo "$ac_cv_lib_Xp_main" >&6; }
if test "x$ac_cv_lib_Xp_main" = xyes; then :
  GUI_LIBS="-lXp $GUI_LIBS"
fi


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XpmCreatePixmapFromData in -lXpm" >&5
$as_echo_n "checking for XpmCreatePixmapFromData in -lXpm... " >&6; }
if ${ac_cv_lib_Xpm_XpmCreatePixmapFromData+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXpm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char XpmCreatePixmapFromData ();
int
main ()
{
return XpmCreatePixmapFromData ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xpm_XpmCreatePixmapFromData=yes
else
  ac_cv_lib_Xpm_XpmCreatePixmapFromData=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5
$as_echo "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6; }
if test "x$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = xyes; then :
  GUI_LIBS="-lXpm $GUI_LIBS"; $as_echo "#define HAVE_XPM 1" >>confdefs.h

fi


  if test "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = yes; then
    for ac_header in xpm.h X11/xpm.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done

  fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS





# Check whether --with-motif_library was given.
if test "${with_motif_library+set}" = set; then :
  withval=$with_motif_library; motif_library="$withval"
fi

  if test "x$motif_library" = "x"
  then
    motif_library=-lXm
  fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Motif >= 1002 compatible API" >&5
$as_echo_n "checking for a Motif >= 1002 compatible API... " >&6; }
if ${acx_cv_motif+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_motif_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_motif_library=$motif_library
fi

    LIBS="$acx_cv_motif_library $GUI_LIBS"
    CFLAGS="$X_CFLAGS $CFLAGS"
    CPPFLAGS="$X_CFLAGS $CPPFLAGS"
    LDFLAGS="$X_LIBS $LDFLAGS"
    if test "$cross_compiling" = yes; then :
  acx_cv_motif="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
      int main(void) {
        int vlibn, vincn;
        vincn = XmVersion;
        XmRegisterConverters();
        vlibn = xmUseVersion;
        if (vincn < 1002) {
          exit(1);
        }
        if (vincn != vlibn) {
          exit(2);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_motif="yes"
else
  acx_cv_motif="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_motif" >&5
$as_echo "$acx_cv_motif" >&6; }
  if test "$acx_cv_motif" = "yes"
  then
    $as_echo "#define HAVE_MOTIF 1" >>confdefs.h

    MOTIF_LIB="$acx_cv_motif_library"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Motif library is actually a LessTif library" >&5
$as_echo_n "checking whether the Motif library is actually a LessTif library... " >&6; }
if ${ice_cv_have_lesstif+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
#ifdef LesstifVersion
yes
#endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ice_cv_have_lesstif=yes
else
  ice_cv_have_lesstif=no
fi
rm -f conftest*

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ice_cv_have_lesstif" >&5
$as_echo "$ice_cv_have_lesstif" >&6; }
if test "$ice_cv_have_lesstif" = yes; then
$as_echo "#define HAVE_LESSTIF 1" >>confdefs.h

fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XmVersionString can be referred to" >&5
$as_echo_n "checking whether _XmVersionString can be referred to... " >&6; }
if ${acx_cv__xmversionstring+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include 
int
main ()
{
extern char _XmVersionString[]; printf("%s\n", _XmVersionString);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  acx_cv__xmversionstring="yes"
else
  acx_cv__xmversionstring="no"

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv__xmversionstring" >&5
$as_echo "$acx_cv__xmversionstring" >&6; }
  if test "$acx_cv__xmversionstring" = "yes"
  then
    $as_echo "#define HAVE__XMVERSIONSTRING 1" >>confdefs.h


  else
    :

  fi

  else
    MOTIF_LIB=

  fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


  if test "$acx_cv_motif" = "no"; then
        GUI="NONE_GUI"
    GUI_FLAGS=""
    GUI_LIBS=""
    as_fn_error $? "M*tif has not been found" "$LINENO" 5
  else
    GUI_LIBS="$MOTIF_LIB $GUI_LIBS"
    GUI="MOTIF_GUI"
    GUI_FLAGS="$X_CFLAGS"
    GRACE=xmgrace

        xsave_CPPFLAGS="$CPPFLAGS"
    xsave_LIBS="$LIBS"
    CPPFLAGS="$CPPFLAGS $GUI_FLAGS"
    LIBS="$X_LIBS $GUI_LIBS $LIBS"

        if test $bundled_xbae = false
    then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XbaeCreateMatrix in -lXbae" >&5
$as_echo_n "checking for XbaeCreateMatrix in -lXbae... " >&6; }
if ${ac_cv_lib_Xbae_XbaeCreateMatrix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXbae  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char XbaeCreateMatrix ();
int
main ()
{
return XbaeCreateMatrix ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xbae_XbaeCreateMatrix=yes
else
  ac_cv_lib_Xbae_XbaeCreateMatrix=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xbae_XbaeCreateMatrix" >&5
$as_echo "$ac_cv_lib_Xbae_XbaeCreateMatrix" >&6; }
if test "x$ac_cv_lib_Xbae_XbaeCreateMatrix" = xyes; then :
  XBAE_LIB="-lXbae";$as_echo "#define HAVE_LIBXBAE 1" >>confdefs.h

fi

    fi
    if test -z "$XBAE_LIB"
    then
            { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Bundled version of Xbae library will be used" >&5
$as_echo "--> Bundled version of Xbae library will be used" >&6; }
      XBAE_LIB='$(TOP)/Xbae/Xbae/libXbae.a'
      XBAE_INC='-I$(TOP)/Xbae'
      xbae_dir="Xbae/Xbae"
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: --> Good. Seems you have compatible version of Xbae installed" >&5
$as_echo "--> Good. Seems you have compatible version of Xbae installed" >&6; }
    fi

        case $libhelp in
      true) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for get_help in -lhlpclient" >&5
$as_echo_n "checking for get_help in -lhlpclient... " >&6; }
if ${ac_cv_lib_hlpclient_get_help+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lhlpclient  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char get_help ();
int
main ()
{
return get_help ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_hlpclient_get_help=yes
else
  ac_cv_lib_hlpclient_get_help=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_hlpclient_get_help" >&5
$as_echo "$ac_cv_lib_hlpclient_get_help" >&6; }
if test "x$ac_cv_lib_hlpclient_get_help" = xyes; then :
  LIBHELP_LIB="-lhlpclient"; $as_echo "#define WITH_LIBHELP 1" >>confdefs.h

fi
;;
      *)  ;;
    esac

        if test $xmhtml = true
    then


# Check whether --with-xmhtml_library was given.
if test "${with_xmhtml_library+set}" = set; then :
  withval=$with_xmhtml_library; xmhtml_library="$withval"
fi

  if test "x$xmhtml_library" = "x"
  then
    xmhtml_library=-lXmHTML
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XmHTML widget >= 1105" >&5
$as_echo_n "checking for XmHTML widget >= 1105... " >&6; }
if ${acx_cv_xmhtml+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ${acx_cv_xmhtml_library+:} false; then :
  $as_echo_n "(cached) " >&6
else
  acx_cv_xmhtml_library=$xmhtml_library
fi


    save_CFLAGS=$CFLAGS
    save_CPPFLAGS=$CPPFLAGS
    save_LDFLAGS=$LDFLAGS
    save_LIBS=$LIBS

    LIBS="$acx_cv_xmhtml_library $JPEG_LIB $PNG_LIB $Z_LIB $LIBS"
    if test "$cross_compiling" = yes; then :
  acx_cv_xmhtml="no"

else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include 
      int main(void) {
        int vlib, vinc;
        vlib = XmHTMLGetVersion();
        vinc = XmHTMLVersion;
        if (vinc < 1105) {
          exit(1);
        }
        if (vinc != vlib) {
          exit(2);
        }
        exit(0);
      }

_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  acx_cv_xmhtml="yes"
else
  acx_cv_xmhtml="no"
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi


    CFLAGS=$save_CFLAGS
    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_xmhtml" >&5
$as_echo "$acx_cv_xmhtml" >&6; }
  if test "$acx_cv_xmhtml" = "yes"
  then
    XMHTML_LIB="$acx_cv_xmhtml_library"
    $as_echo "#define WITH_XMHTML 1" >>confdefs.h

  else
    XMHTML_LIB=
    xmhtml=false
  fi

    fi

    GUI_LIBS="$LIBHELP_LIB $XMHTML_LIB $XBAE_LIB $GUI_LIBS"

    CPPFLAGS="$xsave_CPPFLAGS"
    LIBS="$xsave_LIBS"

  fi
fi

SUBDIRS="cephes ${t1lib_dir} ${xbae_dir} src ${grconvert_dir} grace_np fonts templates doc examples auxiliary"

ac_config_files="$ac_config_files Make.conf:ac-tools/Make.conf.in"

cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    if test "x$cache_file" != "x/dev/null"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
      if test ! -f "$cache_file" || test -h "$cache_file"; then
	cat confcache >"$cache_file"
      else
        case $cache_file in #(
        */* | ?:*)
	  mv -f confcache "$cache_file"$$ &&
	  mv -f "$cache_file"$$ "$cache_file" ;; #(
        *)
	  mv -f confcache "$cache_file" ;;
	esac
      fi
    fi
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

DEFS=-DHAVE_CONFIG_H

ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
  # 1. Remove the extension, and $U if already installed.
  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
  #    will be set to the directory where LIBOBJS objects are built.
  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs

LTLIBOBJS=$ac_ltlibobjs




: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.

debug=false
ac_cs_recheck=false
ac_cs_silent=false

SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -p'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -p'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -p'
  fi
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null


# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

if test -x / >/dev/null 2>&1; then
  as_test_x='test -x'
else
  if ls -dL / >/dev/null 2>&1; then
    as_ls_L_option=L
  else
    as_ls_L_option=
  fi
  as_test_x='
    eval sh -c '\''
      if test -d "$1"; then
	test -d "$1/.";
      else
	case $1 in #(
	-*)set "./$1";;
	esac;
	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
	???[sx]*):;;*)false;;esac;fi
    '\'' sh
  '
fi
as_executable_p=$as_test_x

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by $as_me, which was
generated by GNU Autoconf 2.68.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@

on `(hostname || uname -n) 2>/dev/null | sed 1q`
"

_ACEOF

case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac

case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac


cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"

_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration.  Unless the files
and actions are specified as TAGs, all are instantiated by default.

Usage: $0 [OPTION]... [TAG]...

  -h, --help       print this help, then exit
  -V, --version    print version number and configuration settings, then exit
      --config     print configuration, then exit
  -q, --quiet, --silent
                   do not print progress messages
  -d, --debug      don't remove temporary files
      --recheck    update $as_me by reconfiguring in the same conditions
      --file=FILE[:TEMPLATE]
                   instantiate the configuration file FILE
      --header=FILE[:TEMPLATE]
                   instantiate the configuration header FILE

Configuration files:
$config_files

Configuration headers:
$config_headers

Report bugs to the package provider."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
config.status
configured by $0, generated by GNU Autoconf 2.68,
  with options \\"\$ac_cs_config\\"

Copyright (C) 2010 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
test -n "\$AWK" || AWK=awk
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=?*)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
    ac_shift=:
    ;;
  --*=)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=
    ac_shift=:
    ;;
  *)
    ac_option=$1
    ac_optarg=$2
    ac_shift=shift
    ;;
  esac

  case $ac_option in
  # Handling of the options.
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    ac_cs_recheck=: ;;
  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
    $as_echo "$ac_cs_version"; exit ;;
  --config | --confi | --conf | --con | --co | --c )
    $as_echo "$ac_cs_config"; exit ;;
  --debug | --debu | --deb | --de | --d | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    '') as_fn_error $? "missing file argument" ;;
    esac
    as_fn_append CONFIG_FILES " '$ac_optarg'"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
    ac_need_defaults=false;;
  --he | --h)
    # Conflict between --help and --header
    as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
  --help | --hel | -h )
    $as_echo "$ac_cs_usage"; exit ;;
  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil | --si | --s)
    ac_cs_silent=: ;;

  # This is an error.
  -*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;

  *) as_fn_append ac_config_targets " $1"
     ac_need_defaults=false ;;

  esac
  shift
done

ac_configure_extra_args=

if $ac_cs_silent; then
  exec 6>/dev/null
  ac_configure_extra_args="$ac_configure_extra_args --silent"
fi

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
  shift
  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
  CONFIG_SHELL='$SHELL'
  export CONFIG_SHELL
  exec "\$@"
fi

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  $as_echo "$ac_log"
} >&5

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1

# Handling of arguments.
for ac_config_target in $ac_config_targets
do
  case $ac_config_target in
    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:ac-tools/config.h.in" ;;
    "Make.conf") CONFIG_FILES="$CONFIG_FILES Make.conf:ac-tools/Make.conf.in" ;;

  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
  esac
done


# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used.  Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
fi

# Have a temporary directory for convenience.  Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
  tmp= ac_tmp=
  trap 'exit_status=$?
  : "${ac_tmp:=$tmp}"
  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
  trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.

{
  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
  test -d "$tmp"
}  ||
{
  tmp=./conf$$-$RANDOM
  (umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp

# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then


ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
  eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
  ac_cs_awk_cr='\\r'
else
  ac_cs_awk_cr=$ac_cr
fi

echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF


{
  echo "cat >conf$$subs.awk <<_ACEOF" &&
  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
  echo "_ACEOF"
} >conf$$subs.sh ||
  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
  . ./conf$$subs.sh ||
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5

  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
  if test $ac_delim_n = $ac_delim_num; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done
rm -f conf$$subs.sh

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' >$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
  for (key in S) S_is_set[key] = 1
  FS = ""

}
{
  line = $ 0
  nfields = split(line, field, "@")
  substed = 0
  len = length(field[1])
  for (i = 2; i < nfields; i++) {
    key = field[i]
    keylen = length(key)
    if (S_is_set[key]) {
      value = S[key]
      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
      len += length(value) + length(field[++i])
      substed = 1
    } else
      len += 1 + keylen
  }

  print line
}

_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
  cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF

# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
h
s///
s/^/:/
s/[	 ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[	 ]*\).*/\1/
G
s/\n//
s/^[^=]*=[	 ]*$//
}'
fi

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"

# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF

# Transform confdefs.h into an awk script `defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.

# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
  if test -z "$ac_tt"; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done

# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any.  Preserve backslash
# newline sequences.

ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' >$CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  for (key in D) D_is_set[key] = 1
  FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
  line = \$ 0
  split(line, arg, " ")
  if (arg[1] == "#") {
    defundef = arg[2]
    mac1 = arg[3]
  } else {
    defundef = substr(arg[1], 2)
    mac1 = arg[2]
  }
  split(mac1, mac2, "(") #)
  macro = mac2[1]
  prefix = substr(line, 1, index(line, defundef) - 1)
  if (D_is_set[macro]) {
    # Preserve the white space surrounding the "#".
    print prefix "define", macro P[macro] D[macro]
    next
  } else {
    # Replace #undef with comments.  This is necessary, for example,
    # in the case of _POSIX_SOURCE, which is predefined and required
    # on some systems where configure will not decide to define it.
    if (defundef == "undef") {
      print "/*", prefix defundef, macro, "*/"
      next
    }
  }
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"


eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    "
shift
for ac_tag
do
  case $ac_tag in
  :[FHLC]) ac_mode=$ac_tag; continue;;
  esac
  case $ac_mode$ac_tag in
  :[FHL]*:*);;
  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
  :[FH]-) ac_tag=-:-;;
  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
  esac
  ac_save_IFS=$IFS
  IFS=:
  set x $ac_tag
  IFS=$ac_save_IFS
  shift
  ac_file=$1
  shift

  case $ac_mode in
  :L) ac_source=$1;;
  :[FH])
    ac_file_inputs=
    for ac_f
    do
      case $ac_f in
      -) ac_f="$ac_tmp/stdin";;
      *) # Look for the file first in the build tree, then in the source tree
	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
	 # because $ac_f cannot contain `:'.
	 test -f "$ac_f" ||
	   case $ac_f in
	   [\\/$]*) false;;
	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
	   esac ||
	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
      esac
      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
      as_fn_append ac_file_inputs " '$ac_f'"
    done

    # Let's still pretend it is `configure' which instantiates (i.e., don't
    # use $as_me), people would be surprised to read:
    #    /* config.h.  Generated by config.status.  */
    configure_input='Generated from '`
	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
	`' by configure.'
    if test x"$ac_file" != x-; then
      configure_input="$ac_file.  $configure_input"
      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
    fi
    # Neutralize special characters interpreted by sed in replacement strings.
    case $configure_input in #(
    *\&* | *\|* | *\\* )
       ac_sed_conf_input=`$as_echo "$configure_input" |
       sed 's/[\\\\&|]/\\\\&/g'`;; #(
    *) ac_sed_conf_input=$configure_input;;
    esac

    case $ac_tag in
    *:-:* | *:-) cat >"$ac_tmp/stdin" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
    esac
    ;;
  esac

  ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_file" : 'X\(//\)[^/]' \| \
	 X"$ac_file" : 'X\(//\)$' \| \
	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  as_dir="$ac_dir"; as_fn_mkdir_p
  ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix


  case $ac_mode in
  :F)
  #
  # CONFIG_FILE
  #

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
  esac
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
  p
  q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_datarootdir_hack='
  s&@datadir@&$datadir&g
  s&@docdir@&$docdir&g
  s&@infodir@&$infodir&g
  s&@localedir@&$localedir&g
  s&@mandir@&$mandir&g
  s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF

# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5

test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
      "$ac_tmp/out"`; test -z "$ac_out"; } &&
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&2;}

  rm -f "$ac_tmp/stdin"
  case $ac_file in
  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
  esac \
  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 ;;
  :H)
  #
  # CONFIG_HEADER
  #
  if test x"$ac_file" != x-; then
    {
      $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
    } >"$ac_tmp/config.h" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
    else
      rm -f "$ac_file"
      mv "$ac_tmp/config.h" "$ac_file" \
	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
    fi
  else
    $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
      || as_fn_error $? "could not create -" "$LINENO" 5
  fi
 ;;


  esac

done # for ac_tag


as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save

test $ac_write_fail = 0 ||
  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5


# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded.  So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status.  When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
  ac_cs_success=:
  ac_config_status_args=
  test "$silent" = yes &&
    ac_config_status_args="$ac_config_status_args --quiet"
  exec 5>/dev/null
  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
  exec 5>>config.log
  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
  # would make configure fail if this is the last instruction.
  $ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi

grace-5.1.23/ChangeLog0000644000076500001440000014172112032153131014177 0ustar  fnevgenyusers2012-10-01 01:29  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.23 released

2012-09-30 23:53  fnevgeny

	* COPYRIGHT, doc/UsersGuide.sgml, src/helpwin.c, src/main.c:
	  Copyright updated.

2012-02-14 22:28  fnevgeny

	* fonts/Makefile: Oops. IsoLatin5.enc wasn't added to the Makefile.

2011-06-08 21:10  fnevgeny

	* grace_np/grace_np.c: Wrongly placed brackets (patch by Stan
	  Maree).

2011-01-29 23:37  fnevgeny

	* src/rstdrv.c: Fix building against png-1.5 (patch by Thomas
	  Klausner).

2010-06-12 17:37  fnevgeny

	* src/.cvsignore: Ignore .diff.

2010-06-12 17:31  fnevgeny

	* COPYRIGHT, src/helpwin.c: Copyright notice.

2010-06-12 17:30  fnevgeny

	* doc/UsersGuide.sgml: Graph types and INTEGRATE.

2010-06-12 17:29  fnevgeny

	* doc/FAQ.sgml: Julian dates.

2010-06-12 17:28  fnevgeny

	* doc/grace.1: List graph types.

2010-02-01 00:03  fnevgeny

	* src/motifutils.c: A workaround for a bug in recent Xorg not
	  releasing grab of popup menus.

2009-06-23 23:00  fnevgeny

	* src/nonlfit.c: Renamed RMS per cent error -> relative error.

2009-05-03 23:51  fnevgeny

	* src/x11drv.c: Simplified xlib_setpen (backported from grace6).

2009-04-05 23:47  fnevgeny

	* src/main.c: Accept -graphtype chart instead of bar. List possible
	  values in the help output.

2009-01-23 00:16  fnevgeny

	* doc/grace.1: Oops. undo stupid thing ;-(

2009-01-23 00:02  fnevgeny

	* doc/grace.1: Bad formatting (preventing part of the man page from
	  rendering) fixed.

2008-12-06 21:52  fnevgeny

	* src/buildinfo.c: 5.1.23 started.

2008-12-06 21:48  fnevgeny

	* ac-tools/configure.in: Removed *86 specific optimizations.

2008-12-06 21:47  fnevgeny

	* Makefile: Cosmetics.

2008-05-21 23:50  fnevgeny

	* COPYRIGHT, doc/CHANGES.html, src/buildinfo.c, src/helpwin.c,
	  src/main.c: 5.1.22 released.

2008-05-20 23:54  fnevgeny

	* doc/FAQ.sgml: Added FAQ on max drawing path length.

2008-05-20 01:49  fnevgeny

	* ac-tools/: config.guess, config.sub: config.guess and config.sub
	  updated.

2008-05-20 01:35  fnevgeny

	* doc/UsersGuide.sgml, src/Make.common, src/humlik.c,
	  src/mathstuff.c, src/mathstuff.h, src/noxprotos.h, src/pars.yacc:
	  Added Voigt function.

2008-05-20 00:55  fnevgeny

	* doc/UsersGuide.sgml, src/computils.c, src/compwin.c,
	  src/noxprotos.h, src/pars.yacc: Added LINCONV() to the parser.

2008-04-26 22:12  fnevgeny

	* src/events.c: Mention object type when asking for user's
	  confirmation on delete.

2008-04-26 22:00  fnevgeny

	* src/: noxprotos.h, objutils.c: Added object_types().

2008-04-26 21:25  fnevgeny

	* src/files.c: nb_rt counting in unregister_real_time_input was
	  wrong.

2008-04-26 00:12  fnevgeny

	* grace_np/grace_np.c: Supposedly fixed kill(-1)...

2008-04-03 00:31  fnevgeny

	* src/motifutils.c: Safe check for an out-of-bounds value in
	  SetChoice().

2007-06-06 23:15  fnevgeny

	* src/buildinfo.c: 5.1.22 started.

2007-06-06 23:10  fnevgeny

	* grace_np/grace_np.c: Fixed a stupid bug causing the GraceClose()
	  to kill all user processes if by that time the Grace subprocess
	  has exited.

2007-02-17 00:43  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, doc/grace.1,
	  src/buildinfo.c, templates/Default.agr: 5.1.21 final.

2007-02-17 00:31  fnevgeny

	* examples/Makefile, examples/dotest, examples/log2log.agr,
	  src/xmgrace.c: Added log2log.agr example (showing also the
	  computing and engineering tick labeling). Contributed by Harvey
	  Richardson.

2007-02-16 00:36  fnevgeny

	* src/: defines.h, graphutils.c, motifutils.c, pars.yacc, utils.c:
	  Added Computing tick label format (a patch by Harvey Richardson).

2007-02-14 00:01  fnevgeny

	* src/graphappwin.c: Allow for longer legend lines.

2007-02-13 23:37  fnevgeny

	* src/: pars.yacc, ssdata.c: Implemented  KILL BLOCK.

2007-02-13 23:26  fnevgeny

	* src/utils.c: Extended range of prefixes in Engineering format up
	  to 10^{+/-24}.

2007-02-13 23:22  fnevgeny

	* src/drawticks.c: Fixed rounding-off probem with zero label (rep.
	  #2098).

2007-01-28 00:54  fnevgeny

	* COPYRIGHT, src/helpwin.c, src/main.c: Copyright dates updated.

2007-01-27 23:44  fnevgeny

	* src/main.c: Added -maxpath command line option.

2006-09-26 23:33  fnevgeny

	* src/pars.yacc: Honour locale in number stringifications.

2006-09-26 22:58  fnevgeny

	* doc/grace.1: Man page cleaned (Debian patch).

2006-09-23 19:18  fnevgeny

	* cephes/: cephes.h, ellpk.c, gamma.c, hyperg.c, ndtri.c:
	  Eliminated some gcc-4.1 warnings (patch by Ionut Georgescu).

2006-09-23 18:56  fnevgeny

	* fonts/enc/IsoLatin5.enc: Added IsoLatin5 encoding file.

2006-08-06 01:45  fnevgeny

	* src/pars.yacc: Output sensible error message when an attempt is
	  made to redefine a variable.

2006-08-06 01:42  fnevgeny

	* src/buildinfo.c: 5.1.21 started.

2006-06-04 00:21  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml, doc/grace.1,
	  src/buildinfo.c: 5.1.20 released.

2006-06-04 00:19  fnevgeny

	* src/: editpwin.c, xmgrace.c: Changes to work better with newer
	  Xbae.

2006-05-17 23:53  fnevgeny

	* src/nonlwin.c: Close file selection dialog when fit parameters
	  file is read in successfully.

2006-05-17 23:29  fnevgeny

	* src/utils.c: Fixed buffer overflow.

2006-05-04 00:40  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2006-05-04 00:27  fnevgeny

	* src/defaults.c, templates/Default.agr: Changed default major axis
	  tick spacings to 0.2.

2006-05-04 00:21  fnevgeny

	* ac-tools/configure.in: Got rid of "-pedantic" to silence newer
	  gcc.

2006-05-04 00:17  fnevgeny

	* examples/tmc.c: Added stdlib.h for exit().

2006-05-04 00:04  fnevgeny

	* COPYRIGHT, src/helpwin.c, src/main.c: Updated copyright years.

2006-05-03 23:43  fnevgeny

	* src/: mathstuff.c, mathstuff.h, pars.yacc: Added sgn() function
	  to the interpreter.

2006-04-25 22:26  fnevgeny

	* src/compwin.c: A "break" was forgotten...

2006-04-25 22:26  fnevgeny

	* src/helpwin.c: The latest versions of Mozilla/Firefox seem to
	  treat the anchor symbol (#) differently if the URL is given
	  without the "file://" specification.

2006-02-12 23:54  fnevgeny

	* src/pars.yacc: Oops. Undone last change.

2006-02-12 23:39  fnevgeny

	* src/pars.yacc: Got rid of unused ZEROXAXIS and ZEROYAXIS tokens.

2005-11-28 23:59  fnevgeny

	* src/buildinfo.c: 5.1.20 started.

2005-11-28 23:59  fnevgeny

	* src/main.c: Recognize pie in -graphtype.

2005-11-27 00:11  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: Final 5.1.19 release.

2005-11-20 23:28  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c,
	  templates/Default.agr: 5.1.19rc1 snapshot.

2005-11-20 23:25  fnevgeny

	* .cvsignore, scripts/makerelease: Ignore autom4te.cache dir.

2005-11-20 23:14  fnevgeny

	* ac-tools/: aclocal.m4, configure.in: Switched to autoconf 2.5.

2005-11-20 22:58  fnevgeny

	* doc/grace.1, src/Makefile, ac-tools/Make.conf.in,
	  ac-tools/configure.in: Fixed --with-helpviewer configure option.
	  Default set to "mozilla %s".

2005-11-19 23:53  fnevgeny

	* src/draw.c: Backported purge_dense_points() fixes from the main
	  trunk.

2005-11-13 00:46  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.19rc0.

2005-11-13 00:45  fnevgeny

	* src/dlmodule.c: Added const qualifier for error.

2005-11-12 22:09  fnevgeny

	* src/: monwin.c, utils.c, utils.h, xprotos.h: Added "const"
	  qualifier for args of errmsg() and errwin().

2005-11-08 23:18  fnevgeny

	* src/dlmodule.c: Make sure dlerror() message is not from a
	  previous dl* call.

2005-11-08 23:11  fnevgeny

	* src/psdrv.c: Volatile settings were put inside
	  BeginSetup/EndSetup which broke cups accounting feature.

2005-10-28 23:42  fnevgeny

	* src/drawticks.c: Shut up gcc-4 about uninitialized variables.

2005-10-22 23:56  fnevgeny

	* src/fontwin.c: XtVaCreateWidget was used instead of
	  XtCreateWidget.

2005-05-19 23:41  fnevgeny

	* COPYRIGHT, doc/UsersGuide.sgml, src/helpwin.c, src/main.c:
	  Copyright notices updated.

2005-05-19 23:30  fnevgeny

	* src/plotone.c, doc/UsersGuide.sgml: Allow BARDY and BARDYDY sets
	  in XY graphs.

2005-05-19 23:18  fnevgeny

	* src/buildinfo.c: 5.1.19 started.

2005-01-02 01:46  fnevgeny

	* src/buildinfo.c: 5.1.18 release.

2004-12-28 01:43  fnevgeny

	* doc/CHANGES.html: 5.1.18 release candidate.

2004-12-28 01:40  fnevgeny

	* src/pars.yacc: Implemented string concatenation.

2004-12-28 01:39  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.18
	  release candidate.

2004-12-28 01:35  fnevgeny

	* ac-tools/config.guess: Updated config.guess.

2004-09-23 00:56  fnevgeny

	* src/pars.yacc: Set drawing objects' default properties in sync
	  with grdefaults.

2004-09-23 00:47  fnevgeny

	* src/defaults.c: Set tick label size to grdefault's.

2004-09-23 00:26  fnevgeny

	* src/Tab.c: Backported font fixes for the Tab widget.

2004-09-23 00:26  fnevgeny

	* src/buildinfo.c: Started 5.1.18 development.

2004-08-13 23:27  fnevgeny

	* doc/UsersGuide.sgml, src/buildinfo.c: 5.1.17 final.

2004-08-13 00:46  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c, templates/Default.agr: 5.1.17rc1.

2004-08-04 23:37  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.17rc0.

2004-08-04 22:37  fnevgeny

	* src/pdfdrv.c: Fixed crash in PDF when using patterns with
	  PDF-1.4.

2004-08-03 12:35  fnevgeny

	* scripts/cvs2cl.pl: Updated cvs2cl.

2004-08-02 22:54  fnevgeny

	* Xbae/Xbae/Create.c: Backported font width fixes.

2004-07-31 01:52  fnevgeny

	* src/x11drv.c: Backported page frame fix.

2004-07-31 00:36  fnevgeny

	* src/: Tab.c, XMgrace.ad, xmgrace.c, Tab.h: Backported tabFontList
	  changes.

2004-07-31 00:31  fnevgeny

	* src/pdfdrv.c: Changed default PDF dpi to 300.

2004-07-31 00:30  fnevgeny

	* src/buildinfo.c: Started 5.1.17 development.

2004-07-04 00:13  fnevgeny

	* src/buildinfo.c: 5.1.16 final.

2004-07-04 00:12  fnevgeny

	* doc/CHANGES.html: Mangled emails.

2004-07-03 23:47  fnevgeny

	* COPYRIGHT, Makefile, cmath.h, ac-tools/config.h.in,
	  arch/os2/config.h.os2, doc/CHANGES.html, src/alloca.c,
	  src/as274c.c, src/as274c.h, src/bitmaps.h, src/computils.c,
	  src/compwin.c, src/comwin.c, src/dates.c, src/defaults.c,
	  src/defines.h, src/device.c, src/device.h, src/devlist.h,
	  src/dlmodule.c, src/dlmodule.h, src/draw.c, src/draw.h,
	  src/drawticks.c, src/dummydrv.c, src/dummydrv.h, src/eblockwin.c,
	  src/editpwin.c, src/events.c, src/events.h, src/f2c.h,
	  src/featext.c, src/files.c, src/files.h, src/fileswin.c,
	  src/fit.c, src/fontwin.c, src/fourier.c, src/globals.h,
	  src/graphappwin.c, src/graphs.c, src/graphs.h, src/graphutils.c,
	  src/graphutils.h, src/helpwin.c, src/hotwin.c, src/iofilters.c,
	  src/jbitmaps.h, src/lmdif.c, src/locatewin.c, src/main.c,
	  src/mathstuff.c, src/mathstuff.h, src/mbitmaps.h, src/mfdrv.c,
	  src/mfdrv.h, src/mifdrv.c, src/mifdrv.h, src/miscwin.c,
	  src/missing.c, src/missing.h, src/monwin.c, src/motifinc.h,
	  src/motifutils.c, src/nonlfit.c, src/nonlwin.c, src/noxprotos.h,
	  src/objutils.c, src/params.c, src/pars.yacc, src/parser.h,
	  src/patterns.h, src/pdfdrv.c, src/pdfdrv.h, src/plotone.c,
	  src/plotone.h, src/plotwin.c, src/printwin.c, src/protos.h,
	  src/psdrv.c, src/psdrv.h, src/ptswin.c, src/regionutils.c,
	  src/regionwin.c, src/rstdrv.c, src/rstdrv.h, src/setappwin.c,
	  src/setutils.c, src/setwin.c, src/ssdata.c, src/ssdata.h,
	  src/strwin.c, src/svgdrv.c, src/svgdrv.h, src/t1fonts.c,
	  src/t1fonts.h, src/tickwin.c, src/utils.c, src/utils.h,
	  src/worldwin.c, src/x11drv.c, src/x11drv.h, src/xmgrace.c,
	  src/xprotos.h, src/xutil.c: Got rid of my email @plasma-gate...

2004-07-03 00:53  fnevgeny

	* Xbae/Xbae/Matrix.c: Backported osfCancel fix.

2004-07-01 10:17  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c, templates/Default.agr: 5.1.16
	  release candidate 1.

2004-07-01 01:03  fnevgeny

	* src/editpwin.c: Make sure the last entered cell's data it
	  commited.

2004-06-26 01:11  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: 5.1.16 release candidate 0.

2004-06-26 01:04  fnevgeny

	* ac-tools/Make.conf.in, ac-tools/aclocal.m4,
	  ac-tools/configure.in, src/Makefile: No longer check for libtiff.

2004-06-26 00:46  fnevgeny

	* src/pdfdrv.c: Backported PDFlib6 compatibility issues.

2004-06-24 00:52  fnevgeny

	* doc/FAQ.sgml: Maillists/forum updates.

2004-06-07 20:31  fnevgeny

	* src/ssdata.c: Replaced a meaningless error message when trying to
	  load data with few string columns as a single set.

2004-06-07 20:26  fnevgeny

	* src/tickwin.c: Made custom ticks/labels table scroll by 1 row.

2004-06-07 20:22  fnevgeny

	* src/buildinfo.c: Started 5.1.16 development.

2004-05-30 23:24  fnevgeny

	* src/buildinfo.c: Final 5.1.15 release.

2004-05-27 00:10  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c: 5.1.15rc1
	  snapshot.

2004-05-26 23:34  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2004-05-26 22:02  fnevgeny

	* src/buildinfo.c: Replaced netscape->mozilla.

2004-05-26 21:50  fnevgeny

	* src/fit.c: In xcor, only the _absolute_ value at 0 is normalized
	  to 1.

2004-05-25 23:02  fnevgeny

	* src/events.c: Fixed locator in polar coords.

2004-05-10 00:06  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.15rc0
	  snapshot.

2004-05-10 00:06  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2004-04-21 22:28  fnevgeny

	* src/pars.yacc: F_PPPPD and F_OF_PPPPPD were added incorrectly...

2004-04-16 23:19  fnevgeny

	* src/featext.c: Fixed get_half_max_width(). Old version could give
	  anything for multipeaks.

2004-04-13 23:27  fnevgeny

	* T1lib/t1lib/: sysconf.h, t1base.c, t1misc.h: Renamed MAXPATHLEN
	  to T1_MAXPATHLEN.

2004-01-24 14:44  fnevgeny

	* src/params.c, src/pars.yacc, templates/Default.agr: Use one-line
	  format when saving graph's world and viewport settings.

2004-01-24 13:50  fnevgeny

	* src/defines.h: Increased MAX_TICKS to 256 per popular demand.

2004-01-24 13:43  fnevgeny

	* src/pars.yacc: Added safety check for custom tick label number
	  not exceeding MAX_TICKS.

2004-01-24 13:35  fnevgeny

	* src/buildinfo.c: Started 5.1.15.

2004-01-07 23:08  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: Final 5.1.14 release.

2004-01-07 22:18  fnevgeny

	* COPYRIGHT, doc/UsersGuide.sgml, src/helpwin.c, src/main.c:
	  Updated the copyright notice.

2003-12-24 23:08  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.14
	  release candidate 1.

2003-12-24 21:51  fnevgeny

	* grace_np/grace_np.c: Fixed race condition (patch by Tobias Oed).

2003-12-24 21:32  fnevgeny

	* src/xmgrace.c: Fixed page size sync in the free mode.

2003-12-12 23:33  fnevgeny

	* cmath.h, cephes/isnan.c: Chech for isnan() macro.

2003-12-05 00:17  fnevgeny

	* T1lib/t1lib/sysconf.h: Updated T1LIB_IDENT to "1.3.1p2-grace".

2003-12-04 23:22  fnevgeny

	* T1lib/t1lib/t1base.c: Fixed crash in T1_GetAfmFilePath() when the
	  afm file doesn't exist.

2003-12-04 23:06  fnevgeny

	* src/t1fonts.c: Avoided calling grace_path() recursively.

2003-12-03 23:10  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c,
	  templates/Default.agr: Grace-5.1.14 release candidate #0.

2003-12-03 23:08  fnevgeny

	* src/pars.yacc: Allow for DL modules to define functions of 4 and
	  5 parameters.

2003-12-02 23:45  fnevgeny

	* src/x11drv.c: xlibfillrule wasn't properly initialized due to a
	  typo.

2003-11-16 23:41  fnevgeny

	* src/computils.c: Use mutiplication sign in output of regression
	  report.

2003-10-22 23:46  fnevgeny

	* src/motifutils.c: Use XStringToKeysym() to convert char to
	  XKeySym for mnemonics.

2003-10-22 23:42  fnevgeny

	* src/: compwin.c, featext.c, fileswin.c, graphappwin.c, hotwin.c,
	  locatewin.c, miscwin.c, motifutils.c, regionwin.c, rstdrv.c,
	  setappwin.c, setwin.c, strwin.c, tickwin.c, worldwin.c: In all
	  calls to CreatePanelChoice(), end the vararg list with NULL, not
	  0.  This is an issue on 64-bit platforms. Also, removed the last
	  redundant arg.

2003-10-22 23:27  fnevgeny

	* src/buildinfo.c: Started 5.1.14 development.

2003-10-13 23:53  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: Final 5.1.13 release.

2003-10-13 23:45  fnevgeny

	* src/pars.yacc: Generalize VEC_D '.' LENGTH to array '.' LENGTH.

2003-08-26 01:08  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: Grace-5.1.13 release candidate #1.

2003-08-26 01:04  fnevgeny

	* src/pars.yacc: Implemented IMIN() and IMAX() aggregate functions.

2003-08-18 01:25  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2003-08-18 00:43  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: Grace-5.1.13 release
	  candidate.

2003-08-18 00:37  fnevgeny

	* src/xmgrace.c: Fixed special parsing of the "-display" arg.

2003-07-27 23:19  fnevgeny

	* src/mifdrv.c: Added font kerning to the MIF driver.

2003-04-23 12:08  fnevgeny

	* src/tickwin.c: Minor cosmetic changes of the Axes dialog.

2003-03-19 23:36  fnevgeny

	* src/: graphs.c, plotone.c: Enabled avalues for HILO sets.

2003-03-11 00:50  fnevgeny

	* src/: fontwin.c, t1fonts.c, t1fonts.h: Compatibility changes for
	  T1lib-5.0.0.

2003-03-09 00:24  fnevgeny

	* src/compwin.c: A typo fixed.

2003-03-09 00:23  fnevgeny

	* src/buildinfo.c: Started 5.1.13 development.

2003-02-24 00:05  fnevgeny

	* src/buildinfo.c: Final 5.1.12 release.

2003-02-22 00:20  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c:
	  Grace-5.1.12 release candidate #2.

2003-02-22 00:06  fnevgeny

	* src/pars.yacc: Added RSUM(vexpr) - running sum.

2003-02-21 23:36  fnevgeny

	* src/setappwin.c: Use SpinChoice for symbol skip control; disallow
	  negative values.

2003-02-21 00:38  fnevgeny

	* fonts/Makefile: enc/IsoLatin7.enc was missing in the list.

2003-02-21 00:05  fnevgeny

	* src/graphutils.c: Implemented zooming and scrolling of log plots.

2003-02-19 22:45  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: Grace-5.1.12 release candidate #1.

2003-02-18 22:41  fnevgeny

	* fonts/enc/: IsoLatin1.enc, IsoLatin2.enc: Removed extraneous
	  accent glyphs in the 0x9? range.

2003-02-16 02:10  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c:
	  Grace-5.1.12 release candidate.

2003-02-16 01:41  fnevgeny

	* src/pars.yacc: Verify validity of g[whichgraph] and
	  g[whichgraph].t[naxis] accesses.

2003-02-16 01:34  fnevgeny

	* src/graphs.h: Added is_valid_axis() proto to graphs.h.

2003-02-16 01:06  fnevgeny

	* T1lib/t1lib/: parseAFM.c, sysconf.h: Fixed parsing of some fonts
	  (patch by Rainer Menzner).

2003-02-16 00:26  fnevgeny

	* arch/os2/config.h.os2, ac-tools/config.h.in,
	  ac-tools/configure.in, arch/vms/configure.com: Get rid of vfork
	  stuff.

2003-02-16 00:17  fnevgeny

	* grace_np/grace_np.c: Proper handling of signals (SIGSTOP),
	  getting rid of vfork and misc cleanings.  (The patch by Tobias
	  Oed).

2003-01-26 23:43  fnevgeny

	* src/pars.yacc: Added INT(x,y).

2003-01-26 23:16  fnevgeny

	* src/motifutils.c: Fixed crash in GetTransformDialogSettings()
	  with multiple sets selected.

2003-01-22 23:47  fnevgeny

	* src/ssdata.c: A memory leak fixed.

2003-01-22 23:44  fnevgeny

	* src/: files.c, ssdata.c: Fixed memory corruption when reading in
	  block data.

2003-01-22 23:17  fnevgeny

	* src/buildinfo.c, templates/Default.agr: Started 5.1.12
	  development.

2003-01-19 02:27  fnevgeny

	* doc/FAQ.sgml, src/buildinfo.c: Final 5.1.11 release.

2003-01-08 23:47  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c:
	  grace-5.1.11rc2 snapshot.

2003-01-07 22:51  fnevgeny

	* src/plotone.c: In XY charts, check that abscissas of all sets are
	  the same.

2003-01-03 00:45  fnevgeny

	* doc/CHANGES.html: [no log message]

2003-01-03 00:37  fnevgeny

	* src/buildinfo.c: grace-5.1.11rc1 snapshot.

2003-01-03 00:36  fnevgeny

	* COPYRIGHT, doc/CHANGES.html, doc/UsersGuide.sgml, doc/grace.1,
	  src/helpwin.c, src/main.c, templates/Default.agr: Updated
	  copyright statements.

2003-01-03 00:08  fnevgeny

	* src/motifutils.c: Use "+"/"-" instead of "shown"/"hidden" in the
	  graph selectors.

2003-01-02 22:44  fnevgeny

	* ac-tools/: aclocal.m4, configure.in: Modifications of the auto*
	  stuff to work with autoconf-2.53. Allow the Fortran compiler to
	  be defined with the full path.

2002-12-28 01:02  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2002-12-25 02:31  fnevgeny

	* src/files.c: Fixed a minor memory leak (during data file
	  parsing).

2002-12-24 22:50  fnevgeny

	* scripts/makerelease: Exclude .cvsignore files from tar.gz.

2002-12-24 22:47  fnevgeny

	* examples/stackedb.agr: A bit more meaningful legends for the
	  stackedb example ;-)

2002-12-12 00:20  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml, doc/grace.1,
	  src/buildinfo.c: Grace-5.1.11 release candidate #0.

2002-12-11 23:52  fnevgeny

	* src/: files.c, files.h, setutils.c: Replaced
	  read_xyset_fromfile() with universal update_set_from_file(), thus
	  enabling hotlinks for all set types.

2002-12-11 23:29  fnevgeny

	* src/hotwin.c: Run hotupdate on all graphs, not only the current
	  one.

2002-12-11 23:24  fnevgeny

	* src/rstdrv.c: Set resolution in the png output.

2002-12-11 23:23  fnevgeny

	* src/pars.yacc: Got rid of the unused "UNLINK" token.

2002-12-11 23:15  fnevgeny

	* grace_np/grace_np.c: Detect pipe closing and/or exit of the Grace
	  process. Some cleanup of the code.

2002-12-11 00:54  fnevgeny

	* src/pars.yacc: Verify the set selection is valid.

2002-12-11 00:54  fnevgeny

	* src/setutils.c: Make sure the negative (-1) arg isn't allowed in
	  allocate_set().

2002-12-07 15:50  fnevgeny

	* fonts/: Makefile, enc/CP1251.enc, enc/KOI8-R.enc, enc/KOI8-U.enc:
	  Added encoding files for Russian codepages koi8-r and cp1251 and
	  for Ukrainian codepage koi8-u, contributed by Yura Zotov.

2002-12-07 15:06  fnevgeny

	* src/tickwin.c: Use higher precision for tick locations.

2002-12-07 13:41  fnevgeny

	* src/pars.yacc: Added UPDATEALL command.

2002-12-07 13:35  fnevgeny

	* src/buildinfo.c: Started 5.1.11 development.

2002-09-11 22:48  fnevgeny

	* doc/FAQ.sgml, src/buildinfo.c: Final 5.1.10 release.

2002-09-02 00:08  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.10
	  release candidate #1.

2002-08-29 00:56  fnevgeny

	* src/pdfdrv.c: The pdflib patterned->solid colorspace switch
	  workaround added.

2002-08-27 22:58  fnevgeny

	* src/regionwin.c: Refresh canvas after a region was killed.

2002-08-22 00:00  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c,
	  templates/Default.agr: 5.1.10 release candidate #0.

2002-08-21 23:19  fnevgeny

	* src/fontwin.c: Auto-update font size so that font bbox fits into
	  matrix cell.

2002-08-21 22:37  fnevgeny

	* src/editpwin.c: Set insertion position in the set editor
	  corresponding to the mouse click.

2002-08-20 23:13  fnevgeny

	* fonts/enc/IsoLatin7.enc: Added IsoLatin7 encoding file.

2002-08-20 23:04  fnevgeny

	* src/fontwin.c: Calculate FontBBox if the font's entry is
	  invalid/empty.

2002-08-16 12:50  fnevgeny

	* src/draw.c: Fixed power in the rgb->srgb conversion.

2002-08-13 23:31  fnevgeny

	* src/: draw.c, t1fonts.c: Invalidate AA gray levels' cache when
	  colormap changes.

2002-08-12 23:13  fnevgeny

	* templates/Default.agr, src/globals.h: Changed default data format
	  to %.8g.

2002-08-07 23:51  fnevgeny

	* src/: fontwin.c, t1fonts.c, t1fonts.h: Removed restriction on max
	  font name length.

2002-08-07 23:46  fnevgeny

	* src/buildinfo.c: Replaced old-style "newwindow" openURL option
	  with "new-window" compatible with mozilla.

2002-08-06 00:33  fnevgeny

	* src/motifutils.c: Disable showing hidden files by default and
	  added a checkbox to alter this behaviour (Motif-2.* only).

2002-08-06 00:32  fnevgeny

	* src/buildinfo.c: Started 5.1.10 development.

2002-08-03 23:25  fnevgeny

	* doc/CHANGES.html: A typo fixed.

2002-08-03 23:22  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: Final
	  5.1.9 release.

2002-07-31 22:39  fnevgeny

	* src/fit.c: A typo fixed in crosscorr().

2002-07-30 00:46  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: 5.1.9 release candidate 1.

2002-07-30 00:45  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2002-07-30 00:17  fnevgeny

	* src/svgdrv.c: Transformation matrix fixed.

2002-07-29 23:55  fnevgeny

	* src/svgdrv.h: Added svg_updatecmap() proto.

2002-07-29 23:55  fnevgeny

	* src/svgdrv.c: Undo sRGB stuff.

2002-07-29 23:53  fnevgeny

	* src/svgdrv.c: SVG driver updates: added devupdatecmap(),
	  clarified font names, use smarter coordinate transform, updated
	  DTD reference - all by [MD].

2002-07-29 23:37  fnevgeny

	* T1lib/: t1lib/sysconf.h, t1lib/t1afmtool.c, t1lib/t1base.c,
	  t1lib/t1enc.c, t1lib/t1env.c, t1lib/t1load.c, t1lib/t1subset.c,
	  type1/scanfont.c, type1/t1io.c: Open all files in the binary
	  mode.

2002-07-22 23:23  fnevgeny

	* src/pars.yacc: Allow trailing semicolon in the batch language.

2002-07-13 01:25  fnevgeny

	* src/device.c: Fixed rounding errors in set_page_dimensions() and
	  get_device_page_dimensions().

2002-07-12 00:46  fnevgeny

	* ac-tools/configure.in: Check for PDFLIB >= 4.0.3 (due to the PNG
	  conflict in previous ones).

2002-07-03 01:00  fnevgeny

	* src/nonlfit.c: Fixed 1/n error in correlation().

2002-06-25 23:46  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c, templates/Default.agr: 5.1.9
	  release candidate 0.

2002-06-25 23:39  fnevgeny

	* grace_np/grace_np.c: Run xmgrace in the nosafe mode when invoked
	  from GraceOpen().

2002-06-25 23:27  fnevgeny

	* src/mifdrv.c: Derive fontfamily from fontalias.

2002-06-22 14:40  fnevgeny

	* Makefile, auxiliary/Makefile, doc/CHANGES.html, doc/Makefile,
	  doc/UsersGuide.sgml, examples/Makefile, fonts/Makefile,
	  grace_np/Makefile, grconvert/Makefile, src/Makefile,
	  templates/Makefile: Make install fixes by Peter Breitenlohner:
	  convcal now gets stripped, "make -n install links" works, and
	  DESTDIR introduced for building binary packages.

2002-06-20 22:26  fnevgeny

	* src/plotone.h: Get rid of unused #define's.

2002-06-19 23:00  fnevgeny

	* src/svgdrv.c: Implemented patterned fills in SVG [MD].

2002-06-17 23:49  fnevgeny

	* src/draw.c: Extraneous semicolons removed.

2002-06-17 23:20  fnevgeny

	* src/: draw.c, draw.h: Added sRGB color transformations [MD].

2002-06-17 23:04  fnevgeny

	* src/pdfdrv.c: Patterned fills were transparent in PDF.

2002-06-13 00:07  fnevgeny

	* src/xmgrace.c: App name was missing in the XtDisplayInitialize()
	  call.

2002-06-07 00:43  fnevgeny

	* src/main.c: Oops. -(no)safe flags were missed in the usage().

2002-06-07 00:41  fnevgeny

	* src/buildinfo.c: Started 5.1.9.

2002-06-02 23:06  fnevgeny

	* ac-tools/configure.in: PDFlib version string was misspelled.

2002-06-02 23:05  fnevgeny

	* src/hotwin.c: An unused variable removed.

2002-06-01 23:03  fnevgeny

	* src/buildinfo.c: Final 5.1.8 release.

2002-05-28 23:25  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.8 release candidate #2.

2002-05-28 00:17  fnevgeny

	* doc/UsersGuide.sgml, src/hotwin.c: Removed broken "Command"
	  function of the hotlink popup.

2002-05-27 23:59  fnevgeny

	* src/mifdrv.c: Better fontdefinitions in the MIF driver [MD].

2002-05-27 23:59  fnevgeny

	* src/: t1fonts.c, t1fonts.h: Added get_fontfullname(),
	  get_fontfamilyname(), get_fontweight(), and get_italic_angle()
	  wrappers around T1lib functions [MD].

2002-05-27 23:10  fnevgeny

	* src/featext.c: Update canvas after feature extraction.

2002-05-27 23:07  fnevgeny

	* src/helpwin.c: Updated PDFlib copyright.

2002-05-24 00:17  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.8
	  release candidate #1.

2002-05-24 00:00  fnevgeny

	* src/pdfdrv.c: Move fillrule setting out of path construction.

2002-05-23 22:40  fnevgeny

	* ac-tools/configure.in: Check for PDFlib-4.0.1.

2002-05-23 22:30  fnevgeny

	* src/pdfdrv.c: Backported PDF patterns from 5.2 by MD.

2002-05-22 23:48  fnevgeny

	* doc/grace.1, src/globals.h, src/main.c, src/miscwin.c,
	  src/pars.yacc: Implemented safe mode.

2002-05-16 23:38  fnevgeny

	* src/helpwin.c: An off-by-one allocation error fixed.

2002-05-05 00:29  fnevgeny

	* src/x11drv.c: Set solid fill style before flushing the X canvas
	  background.

2002-05-01 00:09  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c,
	  templates/Default.agr: 5.1.8 release candidate #0.

2002-04-30 22:09  fnevgeny

	* ac-tools/configure.in: Stop with error if Motif can't be found by
	  configure.

2002-04-07 23:07  fnevgeny

	* src/utils.c: Use leading zeros in year formats.

2002-03-29 23:22  fnevgeny

	* src/ssdata.c: Use strchr() instead of BSD-ish index().

2002-03-28 13:22  fnevgeny

	* src/xmgrace.c: Don't open the display twice.

2002-03-28 13:11  fnevgeny

	* src/buildinfo.c: 5.1.8 development started.

2002-03-18 23:43  fnevgeny

	* src/buildinfo.c: Final 5.1.7 release.

2002-03-17 01:10  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: 5.1.7 release candidate #2.

2002-03-17 01:07  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2002-03-17 00:57  fnevgeny

	* src/: psdrv.c, psdrv.h: Restrict PS output line length to 70
	  chars.

2002-03-16 18:57  fnevgeny

	* src/xmgrace.c: Added a XtSetLanguageProc() call to the GUI
	  initialization.

2002-03-14 00:44  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.7
	  release candidate #1.

2002-03-14 00:25  fnevgeny

	* src/: graphutils.c, graphutils.h, pars.yacc, worldwin.c:
	  Implemented snake matrix fill in arrange_graphs().

2002-03-13 23:33  fnevgeny

	* ac-tools/aclocal.m4: Removed cyclic dependence in
	  CHECK_MOTIF->CHECK_LESSTIF->CHECK_MOTIF.

2002-03-13 23:25  fnevgeny

	* src/pars.yacc: When accessing drawing objects by id (e.g. "WITH
	  STRING nexpr") allocate the referenced object if necessary.

2002-03-12 23:46  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: 5.1.7 release candidate #0.

2002-03-12 23:41  fnevgeny

	* src/x11drv.c: Don't set BackingStore attribute of the root
	  window.

2002-03-12 23:26  fnevgeny

	* src/x11drv.c: Detect max request size of the X server and set
	  max_path_limit accordingly.

2002-03-12 23:15  fnevgeny

	* src/: computils.c, compwin.c, fit.c, noxprotos.h, pars.yacc,
	  xmgrace.c: Extended x-correlation stuff to calculate
	  x-covariance, too.

2002-02-28 00:23  fnevgeny

	* ac-tools/aclocal.m4: Include  instead of  in
	  the Motif check to make sure _all_ Motif headers are present.

2002-02-28 00:10  fnevgeny

	* src/graphs.c: When setting axis scaling to log from other type,
	  set reasonable major/minor settings and world bounds.

2002-02-27 22:29  fnevgeny

	* src/: graphs.c, plotone.c: Honour symskip for error bars and all
	  set types.

2002-02-19 22:51  fnevgeny

	* src/: main.c, pars.yacc, ssdata.c, ssdata.h: Allow defining
	  string columns when creating sets from block data via the CLI or
	  parser.

2002-02-19 22:51  fnevgeny

	* src/files.c: Simply ignore comments in data files instead of
	  breaking current set.

2002-02-19 22:39  fnevgeny

	* src/x11drv.c: Set DPI of the X11 device from the X server props.

2002-02-05 22:20  fnevgeny

	* examples/axes.agr: Removed zero-length line objects in axes.agr.

2002-02-04 22:55  fnevgeny

	* src/plotone.c: Allow SET_XYZ in polar graphs.

2002-02-04 22:45  fnevgeny

	* src/graphs.c: Don't reset graph settings in set_graph_type() when
	  the graph is already of the requested type.

2002-02-01 22:24  fnevgeny

	* src/Makefile: $(LDFLAGS) were missing in the -version output.

2002-02-01 22:16  fnevgeny

	* ac-tools/: aclocal.m4, configure.in: Fixed Motif checks.

2002-01-31 23:58  fnevgeny

	* src/buildinfo.c, templates/Default.agr: Started 5.1.7
	  development.

2002-01-27 21:54  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c: Final 5.1.6
	  release.

2002-01-27 21:53  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2002-01-27 21:38  fnevgeny

	* ac-tools/configure.in: Var names were interfering w/
	  ACX_SAVE_STATE/ACX_RESTORE_STATE.

2002-01-27 21:30  fnevgeny

	* src/files.c: Lines starting with spaces weren't parsed.

2002-01-21 18:41  fnevgeny

	* src/utils.c: Fixed compilation on systems without setlocale().

2002-01-12 23:54  fnevgeny

	* src/: computils.c, fit.c: More xcorr fixes and checks.

2002-01-12 22:53  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.6 release candidate #1.

2002-01-12 21:57  fnevgeny

	* src/: computils.c, fit.c, noxprotos.h: Fixed xcorrelation.

2002-01-12 19:51  fnevgeny

	* ac-tools/: aclocal.m4, configure.in: Check for FFTW library
	  version >= 2.1.3.

2002-01-12 19:05  fnevgeny

	* ac-tools/: aclocal.m4, configure.in: Re-wrote Motif checks.

2002-01-09 00:20  fnevgeny

	* src/motifutils.c: Added a "My Computer" FSB entry for the Cygwin
	  port.

2002-01-09 00:15  fnevgeny

	* ac-tools/aclocal.m4: Fixed order of X libs while detecting Motif.

2002-01-03 23:26  fnevgeny

	* arch/win32/README: Updated win32 README.

2002-01-03 23:21  fnevgeny

	* COPYRIGHT, doc/UsersGuide.sgml, src/helpwin.c, src/main.c:
	  Upgraded copyright notices.

2002-01-03 23:15  fnevgeny

	* T1lib/t1lib/.dependencies, T1lib/t1lib/parseAFM.c,
	  T1lib/t1lib/parseAFM.h, T1lib/t1lib/sysconf.h,
	  T1lib/t1lib/t1aaset.c, T1lib/t1lib/t1aaset.h,
	  T1lib/t1lib/t1afmtool.c, T1lib/t1lib/t1afmtool.h,
	  T1lib/t1lib/t1base.c, T1lib/t1lib/t1base.h,
	  T1lib/t1lib/t1delete.c, T1lib/t1lib/t1delete.h,
	  T1lib/t1lib/t1enc.c, T1lib/t1lib/t1enc.h, T1lib/t1lib/t1env.c,
	  T1lib/t1lib/t1env.h, T1lib/t1lib/t1extern.h,
	  T1lib/t1lib/t1finfo.c, T1lib/t1lib/t1finfo.h,
	  T1lib/t1lib/t1global.h, T1lib/t1lib/t1lib.h,
	  T1lib/t1lib/t1load.c, T1lib/t1lib/t1load.h, T1lib/t1lib/t1misc.h,
	  T1lib/t1lib/t1outline.c, T1lib/t1lib/t1outline.h,
	  T1lib/t1lib/t1set.c, T1lib/t1lib/t1set.h, T1lib/t1lib/t1subset.c,
	  T1lib/t1lib/t1subset.h, T1lib/t1lib/t1trans.c,
	  T1lib/t1lib/t1trans.h, T1lib/t1lib/t1types.h,
	  T1lib/type1/.dependencies, T1lib/type1/fontfcn.c,
	  T1lib/type1/objects.c, T1lib/type1/pictures.h,
	  T1lib/type1/regions.c, T1lib/type1/scanfont.c,
	  T1lib/type1/t1io.c, ac-tools/configure.in: Upgraded T1lib to
	  1.3.1.

2001-12-30 00:20  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c, templates/Default.agr: 5.1.6 release candidate
	  #0.

2001-12-30 00:10  fnevgeny

	* src/: Make.dep, files.c: If saving project under the same name,
	  don't warn about overwriting.

2001-12-26 23:42  fnevgeny

	* Xbae/: LICENSE, README, Xbae/Create.c, Xbae/Input.c,
	  Xbae/Input.h, Xbae/InputP.h, Xbae/LICENSE, Xbae/Make.common,
	  Xbae/Matrix.c, Xbae/Matrix.h, Xbae/Methods.c: Backported from 5.2
	  Xbae changes.

2001-12-26 22:34  fnevgeny

	* src/draw.c: Make sure angle2 > angle1 in arc drawing.

2001-12-26 22:33  fnevgeny

	* src/gd.c: Fixed arc drawing for negative angles.

2001-12-18 23:37  fnevgeny

	* src/motifutils.c: Fixed a typo in GetTransformDialogSettings()
	  that broke the test for src/dest selection exclusiveness.

2001-12-18 22:55  fnevgeny

	* ac-tools/configure.in: Use the bundled Xbae by default.

2001-12-18 00:25  fnevgeny

	* src/drawticks.c: BBox for calculation of the axis label
	  (auto)placement was left empty if tick marks weren't drawn.

2001-12-18 00:19  fnevgeny

	* src/motifutils.c: Optimized updating of pulldown selectors.

2001-12-01 21:18  fnevgeny

	* src/pars.yacc: Allow accessing array segments (e.g. x[4:10]).

2001-12-01 16:23  fnevgeny

	* src/pars.yacc: Added SUM(vexpr).

2001-12-01 16:14  fnevgeny

	* src/pars.yacc: Implemented KILL REGNUM.

2001-12-01 15:58  fnevgeny

	* src/pars.yacc: Implemented: region on set evaluation
	  (REGNUM(selectset)), and applying region and logical restriction
	  to a set (RESTRICT(selectset, vexpr) and RESTRICT(selectset,
	  REGNUM, onoff)).

2001-12-01 01:35  fnevgeny

	* src/buildinfo.c: Hmm, why did I call it "rc"?

2001-12-01 01:12  fnevgeny

	* src/graphutils.c: Regions weren't cleaned up in wipeout().

2001-11-30 23:43  fnevgeny

	* src/: noxprotos.h, regionutils.c: Added kill_all_regions().

2001-11-30 23:42  fnevgeny

	* src/pars.yacc: Simplify polygon region reallocation.

2001-11-30 23:37  fnevgeny

	* src/buildinfo.c: 5.1.6 development started.

2001-11-23 00:12  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: Final
	  5.1.5 release.

2001-11-23 00:10  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2001-11-23 00:00  fnevgeny

	* src/buildinfo.c: Include uname.version in the "-v" output.

2001-11-22 23:53  fnevgeny

	* doc/Makefile: Implicitly set paper size in dvips params (in sync
	  with linuxdoc).

2001-11-15 11:09  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.5 release candidate #1.

2001-11-15 10:49  fnevgeny

	* src/draw.h: Extend max line width to 20.

2001-11-15 10:45  fnevgeny

	* doc/: CHANGES.html, Makefile: Explicitly set output to file in
	  dvi->ps convertion.

2001-11-15 10:29  fnevgeny

	* src/: miscwin.c, motifinc.h, motifutils.c: Added one more
	  argument to CreateScale() - delta, the value change when pressing
	  Ctrl+Left/Right arrows.  Enlarged max symbol/font size to 1000.
	  Set delta for font size controls to 25 and for angle controls -
	  to 10.

2001-11-15 10:10  fnevgeny

	* src/: graphs.c, plotone.c: Honour X axis min & invert flag in pie
	  charts.

2001-11-13 22:48  fnevgeny

	* src/motifutils.c: Removed a redundant call of
	  UpdateOptionChoice() in CreateColorChoice().

2001-11-13 22:36  fnevgeny

	* src/graphappwin.c: Allow for negative gaps in bar charts.

2001-11-13 22:22  fnevgeny

	* src/x11drv.c: Added proper casts for color indices > 128.

2001-10-27 00:23  fnevgeny

	* src/: buildinfo.c, helpwin.c, main.c, utils.c, utils.h: Keep jpeg
	  and pdflib version info.

2001-10-26 23:37  fnevgeny

	* src/xmgrace.c: Urge people to use at least LessTif-0.92.

2001-10-14 23:24  fnevgeny

	* src/motifutils.c: Optimize UpdateOptionChoice() for large N.

2001-10-14 22:43  fnevgeny

	* src/: draw.c, draw.h, plotone.c: Check for proper world &
	  viewport settings in select_graph().

2001-10-02 14:31  fnevgeny

	* doc/: CHANGES.html, FAQ.sgml: Removed Q&A on low-resolution
	  displays.

2001-10-02 14:13  fnevgeny

	* src/xmgrace.c: Automatically adjust Xresources for low-resolution
	  displays (backported from 5.2.).

2001-10-01 23:53  fnevgeny

	* src/fit.c: Std. dev. was wrongly calculated using n instead of
	  n-1 in the denominator.

2001-10-01 23:42  fnevgeny

	* src/: buildinfo.c, helpwin.c, main.c, utils.c, utils.h: Include
	  libpng version in the buildinfo.

2001-10-01 23:34  fnevgeny

	* src/: as274c.h, computils.c, fit.c: Minor cosmetic fixes by AM.

2001-10-01 23:30  fnevgeny

	* src/pars.yacc: Implicitly cast to boolean double arguments used
	  as bool in the parser.

2001-09-15 23:24  fnevgeny

	* doc/CHANGES.html, examples/Makefile, examples/dotest,
	  examples/reciprocal.agr, examples/xycolor.agr, src/xmgrace.c:
	  Added examples of XYCOLOR set presentation and reciprocal axis
	  scale, contributed by Nels Dumin.

2001-09-09 23:39  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.5 release candidate #1.

2001-09-09 23:15  fnevgeny

	* src/: events.c, graphappwin.c, xprotos.h: Update legend and
	  viewport dialog props when moving legend or resizing graph from
	  canvas.

2001-09-05 01:01  fnevgeny

	* src/pars.yacc: Date format hint was ignored in the parser.

2001-08-19 00:01  fnevgeny

	* doc/: Makefile, convcal.1: Added man page for convcal.

2001-08-03 23:35  fnevgeny

	* src/main.c: Make result file output line-buffered instead of
	  block-buffered.

2001-08-03 23:20  fnevgeny

	* ac-tools/configure.in: The argument of --with-printcmd configure
	  switch wasn't quoted.

2001-08-03 21:45  fnevgeny

	* T1lib/: README, README.t1lib: Use a generic README for T1lib.

2001-07-27 01:17  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c, templates/Default.agr: 5.1.5
	  release candidate #0.

2001-07-27 01:11  fnevgeny

	* src/plotone.c: Fixed drawing lef/right stairs line type.

2001-07-27 00:51  fnevgeny

	* T1lib/t1lib/t1finfo.c: A bug in T1_QueryLigs() fixed.

2001-07-13 23:20  fnevgeny

	* src/plotone.c: Don't use anything but main palette colors in
	  XYCOLOR.

2001-07-02 09:50  fnevgeny

	* src/buildinfo.c: Final 5.1.4 release.

2001-06-21 01:05  fnevgeny

	* arch/os2/: Make.conf.os2, README, config.h.os2: Minor/cosmetics
	  OS/2 changes (from AM).

2001-06-21 01:03  fnevgeny

	* doc/Tutorial.sgml: Minor enchancements from AM.

2001-06-18 00:20  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: 5.1.4 release candidate #2.

2001-06-17 23:44  fnevgeny

	* examples/tmc.c: Explicitly activate graphs in tmc.c.

2001-06-17 23:43  fnevgeny

	* src/: graphs.c, graphs.h, pars.yacc: Added graph_allocate() - to
	  allocate an initially hidden graph.  set_graph_active() uses it.

2001-06-17 01:24  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c: 5.1.4 release
	  candidate #1.

2001-06-16 00:39  fnevgeny

	* src/: graphs.c, graphs.h, graphutils.c, main.c, motifutils.c,
	  pars.yacc: Drop the second argument in set_graph_active().

2001-06-07 23:45  fnevgeny

	* src/graphs.c: Make set_graph_active() work as set_graph_hidden()
	  when the flag is FALSE instead of kill_graph().

2001-06-07 23:44  fnevgeny

	* src/: Make.dep, mathstuff.c: Added "protos.h" (for missing.h,
	  actually) to	mathstuff.c and updated the deps.

2001-05-31 23:56  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c,
	  templates/Default.agr: 5.1.4 release candidate #0.

2001-05-31 23:34  fnevgeny

	* doc/UsersGuide.sgml: Updated DLL docs for OS/2 (by AM).

2001-05-31 23:23  fnevgeny

	* src/: Make.common, Make.dep, mathstuff.c, mathstuff.h, pars.yacc:
	  Moved all math wrappers/utility funcs from pars.yacc to the newly
	  added mathstuff.*. Added wrappers around Cephes ellpe() and
	  ellpk() which in fact calculated for (1-x) argument. The patch by
	  AM.

2001-05-31 23:05  fnevgeny

	* src/compwin.c: In the "Sample points" dialog, even when the "log.
	  expression" is selected, one had to input some values into
	  start/step input fields anyway.

2001-05-31 22:48  fnevgeny

	* src/rstdrv.c: Check that freed ihandle pointer is not referenced.

2001-04-08 16:02  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: Final
	  5.1.3 release.

2001-04-08 15:40  fnevgeny

	* src/: draw.c, draw.h: Backported from 5.2 the linewidth/bbox
	  stuff.

2001-04-07 23:57  fnevgeny

	* src/graphs.h: Use unsigned char as the symchar type in the
	  'plotarr' struct.

2001-04-07 22:49  fnevgeny

	* src/: drawticks.c, graphs.c: Backported the axis label
	  autoplacement stuff.

2001-04-07 00:20  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/pars.yacc: Added
	  AUTOSCALE ONREAD (by Luc).

2001-03-31 16:29  fnevgeny

	* ac-tools/shtool: Updated shtool to version 1.5.2.

2001-03-31 16:23  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2001-03-31 15:50  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c: 5.1.3 release candidate #2.

2001-03-31 15:41  fnevgeny

	* doc/grace.1: Added RESOURCES and FILES sections.

2001-03-31 01:38  fnevgeny

	* src/pdfdrv.c: Setting PDF compression level was done outside the
	  relevant scope.

2001-03-27 02:24  fnevgeny

	* src/device.c: Oops... how it happened that the last change not
	  actually committed??

2001-03-21 00:15  fnevgeny

	* src/printwin.c: The "Rescale plot on page size change" option in
	  the "File/Print setup" dialog had no effect if the selected
	  device was X11.

2001-03-15 22:00  fnevgeny

	* src/: device.c, device.h: When switching output device, check
	  whether it supports direct printing and if not, set output to
	  file.

2001-03-08 00:51  fnevgeny

	* src/defines.h: Get rid of obsolete LOCWORLD/LOCVIEW defines.

2001-03-06 00:25  fnevgeny

	* src/pdfdrv.c: Include stdlib.h (for atoi()).

2001-03-01 00:04  fnevgeny

	* src/: files.c, utils.c, utils.h: Removed fexists() as a separate
	  function.  Added check for return value of filter_write() in
	  grace_openw().

2001-02-26 23:44  fnevgeny

	* doc/CHANGES.html, doc/UsersGuide.sgml, src/buildinfo.c: 5.1.3
	  release candidate #1.

2001-02-26 23:33  fnevgeny

	* src/tickwin.c: When switching to log scale, set major/minor tick
	  settings to 10/9 by default.

2001-02-26 23:23  fnevgeny

	* T1lib/type1/scanfont.c: A wrong pointer cast fixed.

2001-02-25 13:49  fnevgeny

	* src/xutil.c: A stupid typo fixed.

2001-02-22 23:19  fnevgeny

	* src/: utils.c, xutil.c: Set icon's title = project name.

2001-02-19 23:44  fnevgeny

	* T1lib/t1lib/: t1subset.c, t1subset.h: Oops. t1subset* forgotten.

2001-02-19 23:43  fnevgeny

	* src/pdfdrv.c, src/t1fonts.c, src/t1fonts.h, T1lib/Makefile,
	  T1lib/t1lib/.dependencies, T1lib/t1lib/Makefile,
	  T1lib/t1lib/sysconf.h, T1lib/t1lib/t1afmtool.c,
	  T1lib/t1lib/t1base.c, T1lib/t1lib/t1base.h,
	  T1lib/t1lib/t1finfo.c, T1lib/t1lib/t1lib.h, T1lib/t1lib/t1misc.h,
	  T1lib/t1lib/t1outline.c, T1lib/type1/hdigit.h,
	  T1lib/type1/paths.c, T1lib/type1/scanfont.c, T1lib/type1/t1io.c,
	  T1lib/type1/type1.c, ac-tools/configure.in: Backported from the
	  main trunk T1lib-1.1 & related changes.

2001-02-14 00:46  fnevgeny

	* src/utils.c: A text polish.

2001-02-12 23:44  fnevgeny

	* src/psdrv.c: List used fonts in %%DocumentNeededResources.

2001-02-12 23:10  fnevgeny

	* doc/Tutorial.sgml: Updated tutorials.

2001-02-05 23:48  fnevgeny

	* ac-tools/: config.guess, config.sub: Updated config.guess and
	  config.sub.

2001-02-05 23:20  fnevgeny

	* scripts/cvs2cl.pl: Updated cvs2cl.pl.

2001-02-03 15:46  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, doc/UsersGuide.sgml,
	  src/buildinfo.c, templates/Default.agr: 5.1.3 release candidate
	  #0.

2001-02-03 15:29  fnevgeny

	* ac-tools/configure.in: Allow to specify print command at
	  `configure' time.

2001-02-03 15:03  fnevgeny

	* src/dates.c: Enable grace to read floats when they are explicitly
	  signed and positive.

2001-01-20 01:14  fnevgeny

	* src/pars.yacc: Added "HELP url" and "HELP" to the parser.

2001-01-20 00:54  fnevgeny

	* COPYRIGHT, src/helpwin.c, src/main.c: Updated copyright dates.

2001-01-20 00:52  fnevgeny

	* src/plotone.c: Legend entries for BARDY and BARDYDY sets weren't
	  drawn.

2001-01-20 00:13  fnevgeny

	* src/: buildinfo.c, mifdrv.c: Produce a mif-file with a textflow
	  in which the graph is included, so it can be included in another
	  FrameMaker document.	A conversion table added to generate the
	  hex-codes needed in mif-files for special characters.  The patch
	  by Matthias Dillier.

2001-01-19 23:54  fnevgeny

	* Xbae/Xbae/Input.c: Include stdio.h for *printf().

2000-12-02 00:01  fnevgeny

	* grace_np/grace_np.h: Removed unused EXIT_* #defines from
	  grace_np.h.

2000-12-01 23:22  fnevgeny

	* src/defaults.c: Init legend's bbox.

2000-11-30 23:18  fnevgeny

	* src/tickwin.c: Precision of offsets in the Axes dialog were
	  restricted to two digits.

2000-11-30 23:11  fnevgeny

	* src/motifutils.c: Fixed rounding error in calculation pulldown
	  menu length.

2000-09-10 02:59  fnevgeny

	* src/buildinfo.c: Final 5.1.2 release.

2000-09-10 02:50  fnevgeny

	* examples/tstack.agr: Updated world stack manipulation example.

2000-09-09 02:19  fnevgeny

	* ac-tools/: config.guess, config.sub: Newest config.guess and
	  config.sub from the GNU ftp site.

2000-09-09 01:59  fnevgeny

	* arch/os2/: Make.conf.os2, README, config.h.os2: Minor updates
	  from AM.

2000-09-07 02:59  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: grace-5.1.2rc2 snapshot.

2000-09-07 02:50  fnevgeny

	* templates/Default.agr: Updated default template.

2000-09-07 02:40  fnevgeny

	* src/: defines.h, setappwin.c, setutils.c: Implemented baseline
	  setting to the set (y) average - based on the patch by Dominique
	  Bissieres.

2000-09-07 01:20  fnevgeny

	* Xbae/Xbae/Create.c: Removed compile-time restriction on the
	  number of X server screens.

2000-09-07 00:33  fnevgeny

	* src/draw.c: Fixed a floating point rounding bug in the polygon
	  clipping.

2000-09-01 00:59  fnevgeny

	* doc/CHANGES.html, src/buildinfo.c: grace-5.1.2rc1 snapshot.

2000-09-01 00:49  fnevgeny

	* src/ssdata.c: create_set_fromblock() didn't copy but merely
	  assigned strings. The patch by LM.

2000-08-28 00:18  fnevgeny

	* src/setutils.c: Remove XYZ hack from set_dataset_type().

2000-08-24 01:05  fnevgeny

	* doc/UsersGuide.sgml, src/pars.yacc: Added PAGE RESIZE xdim, ydim.

2000-08-24 00:19  fnevgeny

	* patches/sgmltools.patch: Removed sgmltools.patch since it's
	  incorporated in the current linuxdoc suite.

2000-08-24 00:13  fnevgeny

	* ac-tools/configure.in, doc/UsersGuide.sgml: Require PDFlib-3.02.

2000-08-22 00:56  fnevgeny

	* src/buildinfo.c: 5.1.2 release candidate.

2000-08-22 00:53  fnevgeny

	* doc/CHANGES.html, doc/Makefile, doc/UsersGuide.sgml,
	  src/computils.c, src/motifinc.h, src/motifutils.c,
	  src/printwin.c, src/psdrv.c, src/psdrv.h: Backported some stuff
	  from the main 5.2 trunk: - backslashes in PS; - DocumentData in
	  PS; - monotonicity/splines; - tall pulldown menus; - linuxdoc for
	  sgml processing; - file path in "Print setup".

2000-08-14 01:53  fnevgeny

	* src/: globals.h, main.c: Removed unused global var "readcdf".

2000-08-03 01:10  fnevgeny

	* Makefile: Build ChangeLog only for the 5.1 branch.

2000-08-01 02:58  fnevgeny

	* doc/CHANGES.html, doc/FAQ.sgml, src/buildinfo.c: grace-5.1.2dev1
	  snapshot.

grace-5.1.23/doc/0000755000076500001440000000000012032153136013171 5ustar  fnevgenyusersgrace-5.1.23/doc/mygraph.png0000644000076500001440000002502106764602123015360 0ustar  fnevgenyusers‰PNG


IHDRT^í×áPLTE


!"&;$$$+++#'-(,2-29333;;;06<ZU5;C,,gA{g3{3YZwm@Tŧ5™Ž¬˜¤š%ÈÄÀ°uµCQ€„± µ”ò@r$Ð,Ž€DH|mw€øC„{ïN”¨ûZ<â}ï}qwïî}|ï=á–,q5`”ˆÈQQÒ¶ˆ¥°,E`+&h…Ùe•jf²ù5Wp¼D‘E¨±õÜZ&•Ng"¥µ‘ÔF.c?FËkÑù¹L&_´´&’Y[Ëä?FÉLùíe%Ó±X:É~Hæs¶¡R„ö´öåaËèp6+–Ob:S"A%cq*š,Ï×cÉÑá4#é5Ez©Yn6¥b‘¸ËlÊt…X”Y$äQ>XQaM$¢	'b‰°†HP$Q5·|	Ó(Öçüi’-ÞêR…”jHø2þ¦ï®øÊò;ÒŠ¬F|›¾¦7È2>`2ÿ2ugÃ×ä3
ÑkW2˜uõÎ\œÜ¥c–\ÉÛ DÜ'Àm¯LÔDÌú¡Ö¨ÁÆTí¦,[>»{ ¿i©ëFKW»y¥¯îÊ*Œõ¦ªmø
`Xb­Þ )ýA©2¿L˜nUÕv1Ѥ—G›T£ñÝ;liÅ€›”
k<áoÆÚ‰
¨:C®[§Óé[ÛÕ¹ü­vwÃȘ ܼyÇØÚùjÅ–SkÝÙæPsÙjÎîÞaK«¤¿)jµ*»ý-·A›ªüô'W“0—#Hr)wg.S¸­d²Qbæ–C±H4¼ˆû©B~&×7ˆÐ*9—M¡D>7º	{:âé4¡èµôj.ZZóoq{P8˜€q™
`6^q£º¬¥ÏüPŒ"#Û
 2`8­?­½œ‰QÝV`[G…|[˜ è’,æê5z½Æh¶¬Ó	¦³6J¯”i{O8Í(I	BeØmCúoÍÎÎVµ×#tÖì-?U}=dó«rgSK«?/\Q,ͺ‡…¥}E%èR&JU(ÊäeTµòùÑš¹;²÷º%F$É$“ÔØ$#¤,#À-L-KLa˜X^»266v¥(ú›+~Èç–•à'ôš¬ÆÀÌ®nläVWX­®åVWstŠY°òÙ¹í<…^óQUŽ˜3©èúí92“]M†—ÂDt.‘݉-Qþ¥åå%ú¶Æ*öÝI§cô§Hv-ÛÈ.¯®¯déÿ‰8›ËæSD|5·–Í­géßÙ8]ŠŠ§—ý¾plׯ»!Ò7fÖêeëÚ0Èf21³v`+áÌpëÊJëp&Ì„žéΕâÚ¬.Lä†YÐb–œVg´hÁæL>ÉŒj
š9L7JœÆ,	-6œ›Õ%¯íáNjMQs4ThV’ðMSÛPۚɔN›:LíD8šR¾òŠ2¥²ëkv«¡’dΤlêiµ€¡'¯…B£‚bri¦t> û\c«Fyµ¹G=úSê¶„ º>†P»Ôp`¨GAÌlÊ$`7ð3‘“œ¥µÕ’#ÃF£al™	X%@(™5·§”æ6CÛ˜Va†[Êa¸B‰p˜ÎO·PËËJ„ZeꊾÝÒfh…)j÷c	낳-4Ô%¸]³´›ÚÖדDt]©\’¡žîŽá8C&B)ˆµ¶¶á¦ÌX”Ù“›Ž­«•Cà
„ÃÊ­åÖ¶ÕlȧԴƒ8ù¸BÝò5cCM¦vöôÏRŠa¨2HöôÐŽ¥|>ß(CÆa,˜iêP‡Zhˆm…9—¼M;UX&üô7iB´}ÕÀꇛzzB€Ñ®,¡®d|ØiK–¾QmÒPZrãrG+A†ÓÃÃi&*˜HRì5•ÐDBêP:jðëuÓ„’Z2J†5ËÃ
º¿›‰êZ¿†\³h
>=f¡ôºáUBC<ž×Ô*ázj}3“Ìf“™ÕL2—Œ¦)*–ÍÆ
\j¯®¬Æãk™h|mucs=·2ñÕEeV³’.MÅײëÙµLrnåV7a.»±µFÛÊ«
-$w«g¾J0'-åß¡@ *#äŸñUçq—®X雡k?N
ÜšW¯ŽÖ×+/Ó=Í«W¯2NþºB×Dªø¨êʕ˳`tö»7¹õÝ™Ùaý€Aé/ƒ[0“J¥k+•^ywÖ2
7e5&Ñ}¢,˜¡ï9SÙ¹kæËÜ«eUi%Bߪ6i¨›v;Ž;¦§¦whÊýüWfe¨<”
abƒ†ºå°Ž¿f÷XkÈ}þOe¨|”Z*B
Ý׿dÞãõx½Vnû+Ïó2T^Ú†úîBçÑ·Îìw=ûÑÁÁ#¬.xd¨H*‡Ú¹è sðÔ…'Ÿ:Ö×w´3ø*Š* ¾5Ù<Ùä¹{äTóÄþÎNÅ„[v*’JPçŸ:lÛwÌl6Ð	ðÎãÇ,LËP‘TºQy|Îíìò^8~ö«—FF—T«•§¶¡B§gaÞ{ÃåuáÞ… {÷Ǭì2Tž*B]…6Nár;•ŸŠPæ;q¢—C'ýç[2T*B]ù«;K\"Bq¹ïÏGE¨éÈ‹Jf’d¬5¾€Ø#Úl¸xùXª)«uj{,•5?4çXªLÒBïB³BŽÖšYˆHD‰ÚsÑÇšz•PÖðÞP4¬P(øØ¤l,•ÍŠÛóÁ¾|”ªúãw÷÷+60^ÔÕ|êz¨]c¬ýÔ±QÓ>Äñ@2w%”5ü740¤Ó_kA
§íÁKV7îÌ÷ý§¬ßùΔãÛ.'ïÆG€Óœÿ_‡Ò\õÒCœ_É]	e
†Ð4¡œþt7uLÜpØÜlßÚ\XÄó1+PG—‡ë^ÖK\UÃÎoå®d󯃰!ä•ë{9ùxªÝÚwüd88eçu5ÉÞñ†²\Ö8«Ö9VîJÜPEÞ÷ÕPÙPÊɃ ïäñ>Õ1‘G<‚£ô¨¸•[uŽõQÛPÙ5ÕMŸí‹ÁìéoÇmŽ`p©ïr¬KFþuêœä"oê”Õõmûs¿Ïߨœ¸Ëz)ˆOEZçÜ·R%D¨»“–ÃÛÙ(•NãçwMEÙ…GBHPKOüÙQªRJ†Šµâ‰?ÁQ*jXü(•5,þX*jXü±T2Ôp1J5mw8¦KQªiÜeG|âO†Z¥š°:ŠQ*›Õ39|m,•µØ£²:m /øb”ʃ²ñÿP*n}VGêôaºë	m0…uªÛz§ŠNuÜèVÙ©y¡öýíÖ	ÐwÃ^„:µØ\AjÞ»ðH*ÎTOoGþú€·ËPY!BµNÁAÜU¼¦~'ØlNj^ÈQ*|aÄêu£TN—sÒ㔣Ty¡G©˜?§Ú¬×‹OüÙó©%*,CE‚úî\ïɲêïï'~ZžŠ$¨Ï)”d¨,ÔˆoÖ·-¿¿<õ?çæcÃ2ÔÆU€zs†™Š¿¨—ËtêÊ5?¨ÆÏ}~èeŒð(\€zk‹c>zFÙ5ø&¿Ó_¯5\ã¹×³®é†Ú<Ê—îþu§¤ÿü Ü"÷’WÓUM”GùòПÝaÏÏAoe'¦wàÌõHSÒPÅ ˜hºtžqª
LÊPB„jëýxÿıýž.ŸôØzm´)ée¨ÅkªÇåty=óóA·ÇsÃtÓ)—mJzjÕ51¦¤—¡î &xJzêŽj;Ä{JzjõµJ.¯È‘¡Ôvheî
*ÂÔùw%Y­ùg(§N&ÇÊ?J%C­¥¢åq¼æðÈQ*V"E©pïÈ£F¼rŠ‘XQªà¾³÷Îîs9ä-Jup
8ƒNºû/C…âE©&š''Í)C…âE©îÝÿÚþ£Áiùš
Å‹RyñóÇÏã8Ï(Õ5?ß]x$$Z”ê†wÞ{ÃÉ/J•jµÐË¿FÙñ‡Y»¥ÊúuLAã÷ùïö»ÿ΃ʱ¢Tæ˜ÖDÿÒ}àsO?ýô¿{‘~÷·ÕÜ*¯â×N³³« ŒP'Jµn4µvÑ¿~ÿK´þãyèË¿úËoó:XdýËoð*žá0Ú•ò(U囘Œ/óxq¢‘)ø[üù¼ý+ÿþ¼+¡èGF©…6B¥<³ò9J¸ò—ÙÆ¡®3c²îþÿú·_üðy×BÐÇÿ¥b”ÊáÀq§Ã1=³sÒç“öéiúæÿ'?“<žú>òå¿ñ/øÖBšQQ›T¯ýµñëVŽO¼Þûýæ“6«Ëeµ?ñ]É¡~ü¿}ùEø‘ñ­Æ_hFE…:Ùÿì±';ŸZo?ɼ:N¶œ=àñìyá+’C¥ýóÅá7>γ!ùé”ùà¡ço¼÷üáçÜìJtòüÝ}##Š…Aé¡Òþ¡¡ÂKnUD£"‡þŽ*Ï@õvž=Ûy/¦’j™Ê J`UF4–êÔW=wpqê­ ¯¸Ø0•dPËüSU«
4ª±Tg÷)˜kêÛgг÷Ø0•TPËýSUt«
5ª±T®ãÇñà१žœŸÜù–÷ÐÙ»ŒS<§Ád¿{pÐ}B¨;ü³ªHVŨèP§Àལ
{úÿø:xöàiàyæ©y	 îôÏN¨¢XU£¢C=âœ\¼¬AOê×'Ý8X<Þ)ÔþÙ	U«ŠcTT¨óGžZÄqÅIÛk,Túšjó¸là¹ýR@­áŸPE°ªHFE½Q1æìì*õz¯Í>å¹pòÌ%	®©5üSªVɨÈñT·wºæ™Uù&3+îzí¢ßýkù§TÁV˨Ÿø«ŠRY¯÷ŠÝN­åŸZP[U,£
KU¥êí‰Û£ªéŸšPZU4£Š1–ª:J%r@¥¦jBhUÑŒ*A”*.îµÚþ©
UUÅ3êÃ¥ªíŸÚPYU<£
ŠR1Q)«»0–ÊátJ¥âðTVѨB¢Tîülél;ÕƒO°iûuq£Tþá€*Àª"UP”ê‚×ãÅó=*׈BÙôü‚Óéuðn§Öûƒ.—¸ "[UL£
‹RÝ»p|r!ßøßwf~|°ßåê<Ù¸S³ìó×/ÕÙ.ÿ|ñ?p¼£žUë¼FƒÛ¨õ*qIH”jäÒÁ3‚l}îï
}æÜ9Ž
Õ“ (Õ3}÷€£Õ¶èõö¸àmüôÏÀ¿z	ž;÷þOžûG	ÿЇJk³æºpLɰÉÖAÚÐÏ8*q
m„
¥rxžßvªç¨âì‘gï8äÓ÷t¼ôMê¯ê“Kÿ¯Öÿ¹.t졞ûã?¬5Èüê—kMò‡œ¯Tûëoè›
#Ó}ä£TV»—¾¦Î篩øsGNÜ{æø]ŸU@ù›4Ô¿ÿkïét­A*\ºü±þ|í9kþÙïÖÌþùzPëoˆËÞ5$`bš|”ÊáÀ=Aw>Je½\˜Ž4{yüŠˆf_úÖ¹s¿ö©sŸ®¹žóŽüiöXÿ{ÍuïrLYñ=¶Ò†¾Å±–SH#T8¢T¯OŒãvQª›æ›	øÌ5µönsÞ‘¿Åêop}íGjή²õëtOýW17Ä)Q£TìGˆR}ïüfí;A¦ãú7?ÃmŸÚ
€þÞúG¼*â†8%8JE„"UQªŸò¨¼ô“ÚùÈ}œZmUàÅÏÓ‹«"nˆKhQ*òL&–Èd-’ Hª$R¤÷¦¢÷qjX•a
^ü,¨EUÔÎ+$¨kéÛs·säœZ‰„‰X6!Ê$TþÙaU–iꪢ
*47éÀ¨N©W^^Ïd‰!KZ|¨BüSmÕ<Ó"Ô*ªâªºeãò‡”9“ùVK÷VXt¨‚üSiÕÓm¨•TÅ7*ÔÖ¢…X7Œ˜Ù±(:Taþ©°j‘i	j9U	ŒŠ5GÂ
…AÓý€€›°»[|¨ýSfÕm¦eP˨J`TÄÓSX”c˜*¤TC“	vtˆU¨JV-1-‡ºMU
£¢AÝôcj3Åt¦Ä
uxXô•`ÿ­ZÆ´j‘ªFEý%s›Ùhj#—’™L4#z“J¸
V-gZ	5OU£"6þôvQC"@Á?¬U+˜VAe©JbTT¨D2Ét¥HöA„Å…*†«V2­†JS•ƨˆP“¹;s™X(bþ%‰Äz–ª(þùØ~Ô‡
þâüfœnTHP×êe{7éö¿ºn†0ó)Tqüó_>îõoIcTÔnªr)}y¨u³•þg5·µ™Wă*Î…î~ñ=÷ƒúOß÷bli‡Ð v©a,7Æ› nj‚XW©©*ª8FUŸ«¶j5Ô÷üRÍH p!6þ» Œe:TF£J•«@T¨¢•¹GýÒ{êCýÐû€4T‘ nùšÕC­Ôe
Qh÷ôŨì}ÿ}ª•1ª4TÑ"ÿ¦6­Eu¥£VLÃ11oTbµÐ–ª²jTÖ¨’PEkR™Í,•LÇbé$Ý§Š¯‰×¤èÅöi•U+¡Œ*U4¨Ká:Jð„Z9‡ŠF-µù+­Z	µhT	¨"P©ˆŸT)å;+eÅ*"µ¬UiÕ
¨%£ŠLuqßð[1‡Šp£VôM+¬ZµÌ¨âREC¥ø¼ÿô3eþ
¿!¼á·|áF­ìïWXµj…Qž PaGR¿öuæý¾““—µ\ÂÞð+بU1”
«–C­4ªÈT‘GR+žíwzðÅ“§¾z)8]fUA3¨	6j5Ó
«–A­6ª¸T‘ǧö½½8øBðÔÙþí¯âbAjÔL+¬Zu‡QE¥*`$õ©3‡Î~¦÷øa·C$¨BZƒi¹UKPkULªè#©ñ‰{ÀÛÛßtQ¬Ó_ Qk1-·j	j-£ŠHõyÿ§;&Ÿ;xöð‘¾þƒ_wŠU Qk3-³ê6ÔÚF*êóþƒG?xêì¥`ÿùKöþñ2¨BÞE-̨Lˬº
•è¢QE}ËgywŠ›þñxÝNǶx½á·r„•“iɪE¨œF‹ªàçý¼á·j•›iɪE¨ÜF‰ªïNA~Ãoå.2j=¦ÛV-@­gTq¨¢ÅSÿ7÷~	ÔY)…µ.Óm« Ö5ª(Tã©T¡=ï/Ĩ÷aZ´jê}Œ*UÔÁu„¤`Ôû1-Z5õ~FêÃU€QïÏ´`Uêý*œêÃݨ
0-X•…Ú€QS}H ¢µ!¦y«2P2ªPª	Td£6Æ4oUjcFHõညlÔF™²V¥¡6jTaT¨lÔ†™²V¥¡6lTAT¨?ù1¢Qy0e¬úâgyUÕ‡êÀß|ͨ|˜2V}ñ³|Œ*€ê®B½|:D/ÿè}eÏy2¥­úâçyênBñ«è_ô1¤ñÌ<™ÒVý?àgTZ/£ìÙ®B]…q5ýë£ÿeÇy3?÷+¿È»häU9;„ôwÑ®©½ø'wÈ`¨9‡Jñg
À/ÿ^íYWêè_ø
>»%`± †nÃ5úôŸ]4Ÿ}Gb
þÎçÿígÖçžþÀÓŸÿâŸÿÇTm0ÛX×Te»*Óø›ÓʄĔ§šÿ±ímÿœÔ¼ÐFý‰5—ÈÐLù]ÖYIÏ´Y÷Ýü¦¸&¬«‡ ÊªÔL·‰ÂǪ´LˉÂǪ”L«ˆÂǪtLw…	T©˜Ö$
¨Ò0å"
¨R0­C>PÅgZŸ(| ŠÍô¾DáÞ‡*.ÓFˆÂ=UL¦
…{ªxL'
÷8T±˜ò"
÷6Tq˜ò%
÷4T1˜"…{ªp¦hDá†*”)2Q¸w¡
c*„(ܳP…0HîU¨èL……{**SQˆÂGj½?Q£1‹(D„º›¢.îBùÄ4•Ba*"Qˆubq¡VLLS!þLÅ%
Q ¢NL#.T£X>(D<ýww€+®Ë:?¦R…îŠcø0•ˆ(ÜkPg*Q¸Ç 6ÊTR¢poAmŒ©ÔDáž‚ÚÓ@î%¨÷gú`ˆÂ=õ~LQ¸w Ögú ‰Â=µÓLî¨ÜL[(ßO}éi©7$6Ô\ŽYe‹L«‰rŸ¯u rWâ>Vî:u rWªû”*‰
uˆF3`0žj¯íQîóµTîJÜP¹ëÔ=ŒIDATÊU‰>"Ãg­ªE7Ð6››šõ³µvsìJ”ûšÊ]ÉÈ9Æ»Nk*W%ôM`“³Zµ$€JïÂPêŠe®'¢êÅV«ÚÙdíW^%gµ«µ×Ô©„²æíßÿÀO(^•¢aEÓÅ'AÃLŇªc ªÌj“ÑPCFýÀ@­|ƒa`@_³FÝJ(k~k@ÇsCCº#ØE¨&Œ9ýŸ]xÄÑîþ£¦4õFþÎ4ÿÉl $W*ñ×€ÑdâqDÒ´SÕ|÷B¢â]iv¨ÍÇSݯð¯3:j¼°4PÛ2|wú`¦o,4ð‡êëå]ç26Ê£¡*
ÔvþP!œ1ñ¯ci½Ã·Ê4ò:V£m*S—I•k(e=}
¡Ä´<+¬«‡Z»6Ô£o¼¬$P7[y\€Š;b0'yÖÙœƒ£¼]É©ù_¼ésb·oTac­ÎT}Íj5Æ-žur¦«ü7á«s|kdµ¯wýFµçÍæx”–¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J ª’¡J tƒP‡‡ë—U®pãPe5(+
u…¤ê(uÍ2œÚí]}ÄDC¥üõ^¥¢²Em‚«WGëjÌòF.#‹‡R	0:ûÝ›õ4sõÚÕ—e5®¯]yÜ‚™”,µš3©%þ—â%„:‹HßÓ¤Jf“•í¨|F$“‰lgŨÒ2’ÚȭП’édU)¦n’^e?F	*‘`¾‰þEQÉüF¨ó/¿š-+üì’…¯‹ÒbT,¯T½‘‡YÔ5À,ŠE²LÑѵ2lYÏ—#—³sd† Ø%A¤G1½>”L„°E¬Z,«4’©JdöŽZY½C³H®ÜÉøg}þ$•!|³á¸?¥¢‘Tìö:5—¥˜ÕñlÀ‡ùŸXœÞnX³´:<¼BÅ¢qÿ–y8C&4á³gë–áô®’â¡ÕB­ŽÓë“3 ×ÓÝðI¬'Њ…!‚ÝšÖö¶+À„éUŠWŸ UX{Τ|¤ ®e k6‚@óJÎГ¥Q„Ù„Þ ^áL4š‰C'Ì.£Qˆ)Œc	0G‚ðJVyÑÔP­1ô¬3¿¦¼“€HEÓ1@lø[noñÕQååVU³.cª¨¢CéõôêµWZÍ£
C‹¹E¥X‹GS `^ß“D3Äô-l
}Ë\Ó¦†»Ý¨oTqÿ£B¾'fZ,ͳ Ö£ÅzbÀGúšf˜„–I,ݾ}‡ð²§k]¦oßNÓ®Mú@à6ðE|@£3O…ªI30®Ð™tµ%z™Vwd!¿aSµ,uw¥âfµ(0’^O¯¾sÙt³Åb¾ùdGO¸Xc­‹ÙlÓ,óÚò‰Ùæk·ýôÎ0Û}4šzF°úÇ Õé´µ^§/KhéÕ­VŸ_Ò)f©WëõSÔhÔ–Jë1l€ùB¦½ÔcLyM—^«ÓhèÏ£QC/™¯¥¿.ŒÑ?Zf`»ûEÛÛg>lo÷Q‘`]]]ÝÌÝìóq;#ŸèÊgÐÙ,&•/Óµý«TºP Pi;™ÿö|nñkÙœîâO©›ê.}(ný‘ÌMŒÌ¦´×™G/‹¡a@äÖh­ç,0·ºV_{¿Ùt±¶Xê…O…4GIZFðÆÕ¯Ñzu¬{ãÚË_«¯Ý)tån]ust«C$½ùæ´Þ3·Þ¸v§ÐÍ;!.ݹ)êæ|
NLª‹Xû¡‡-Ó¢m¯ÃôÿàG7{5Eé´IEND®B`‚grace-5.1.23/doc/Tutorial.html0000644000076500001440000013326312032153132015666 0ustar  fnevgenyusers


 
 Grace Tutorials


Grace Tutorials

Edward Vigmond evigmon@tulane.edu

for Grace-5.1.4

1. Introduction

2. Making a Simple Graph

3. Block Data

4. Creating sets within Grace

5. Batch plotting

6. Fitting curves

7. Transformations

8. Using Pipes

9. Multiple Graphs

10. Hot Links


1. Introduction

These tutorials assumes that you are a new user to Grace but are somewhat familiar with a windowing system. They are designed to show you some of the basic operation of Grace as well as a few of its less intuitive features. Please feel free to go beyond the bounds of the actions described herein and explore the possibilities of using Grace. After all, you will be the one who benefits.

1.1 Purpose

The purpose of these tutorials are to give brief examples to show you the basics of how to do something. Essentials and some of the more esoteric features of Grace will be demonstrated to give the user an idea of the capabilities of this program. It is not possible to show everything that Grace is capable of doing. That knowledge only comes with use and experimentation. I recommend that you do the tutorial and then by playing around with things, you will begin to understand them. Finally, when you get stuck, read the user guide to help you.

1.2 Nomenclature

In referring to what item to select, the tutorial will use something of the form snaf:/foo/bar/bell which means that on the snaf popup, select from the foo menu the submenu bar and from the bar menu, the entry bell. The popup main is the large one with the graph that pops up when you run xmgrace. If there is a space in the menu item, it will be replaced by an underscore. So , if the menu item was actually "Bell jar" instead of bell in the last example, it would be snaf:/foo/bar/Bell_jar.

Things that are to be typed in will be presented in a typewriter font, eg, type y = 3*sin(x).

Some of examples require you to input a data file or graph. In such instances, there should be a file in the tutorial directory named data.N or N.agr where N is the tutorial number. For example, when doing tutorial 7.1.3, you should look for a file 7.1.3.agr. It is assumed that each major tutorial section starts with a clean graph.

1.3 Computer System

Some of the following examples require that system commands be run. The commands may be different on your machine or require a slightly different syntax. In this tutorial, an attempt will be made to use the most commonly available UNIX commands. This tutorial was prepared on a Linux machine with kernel 2.0.32.

1.4 Generalities

A couple of points should be made about the GUI before we begin to make life easier.

  1. It is often possible to select more than one item from a list at a time (some lists may prevent it when it makes no sense.). Clicking on a list entry without any keyboard modifier pressed will deselect all other entries and select only that one. Depressing shift while clicking an entry selects all entries from a previously selected entry to the currently selected one. Finally, depressing control allows one to individually toggle the selection of an entry.
  2. There are often two buttons on a pop up: Apply and Accept. Changes are not registered until either of these buttons is pressed. The difference between them is that Accept also closes the window.

1.5 Disclaimer

Even though I do my best to keep this up to date with the latest release, I cannot guarantee it. Think of this a perpetual work in progress. Therefore, if something is wrong, you can notify me and I'll fix it but keep in mind that I am doing it in my spare time for no money.

2. Making a Simple Graph

The object of this tutorial is to do the most basic function of Grace: read in some data into a graph and then label the graph. Along the way, a few of the basic Grace commands and widgets will be introduced.

2.1 Reading the data from a file

Start by bringing up the set reading widget Main:Data/Import/ASCII. Select the file 2.1.dat (both double clicking and hitting return work). You should see a black curve drawn on a graph.

Now we would like to add some more sets to the graph, but this time the data file will be in a slightly different format. Looking at the file "2.1.dat" (with the program of your choice), you can see that its several columns of numbers. One way to interpret this file is the first column gives the x-values and the rest of the columns are y-values. From Grace, again open the "Read Sets" widget. This time, check the "NXY" button. Now select the file "2.1.dat". At this point you will have several differently coloured curves.

You should now have 2 copies of the first set since you've read the file twice. It would be nice to eliminate one copy. This is most easily accomplished by bringing up a popup which lists all the sets. Selecting Main:Edit/Data_sets...bring up the Data set props popup. It lists all the sets and for the selected set, its type and a few statistics. To eliminate a set, select it and then press the right mouse button. A menu should appear from which you can select kill. You'll note that there is a kill and kill data. The former totally eliminates everything associated with a set while the latter eliminates the data but keeps the settings for it so that if new data is read into the set, it will have the same properties like colouring and line width, etc. Kill set 0 for now.

2.2 Set appearance

We would now like style the sets. Practically all aspects of the curves are configurable including colour, line thickness, symbols, drop lines, fills, etc. These operations are available under the "Set appearance" widget which is invoked by selecting Main:Plot/Set appearance... or by double clicking near the target set within the graph frame.

When the widget comes up, there will be a list of the sets with their number (eg. G0.S1 refers to set 1 in graph 0). Later operations will require you to know the number. Like the data sets pop up, clicking on mouse button 3 in the set list will bring up the menu of set operations.

Colouring all sets differently

The simplest way to colour all sets differently is from Set_Appearance:Data/All colors. First select the sets which you wish to recolour and then select Set_Appearance:Data/All colors. Do this now to your graph.

Customizing each set

When a set in the list is highlighted, the widgets change to reflect the settings. Practically all aspects are configurable. Experiment by changing the line colours and widths, placing a symbol at each data point, not connecting data points and fill the space between the x-axis and the curve. Don't forget to try out what is available under the other tabs besides Main. To see the effect of a change, you have to hit the "Apply" button. N.B.: Things are drawn in numerical order so if there is overlap, the highest numbered item will be on top. This applies to graphs and sets within each graph.

2.3 Labelling the axes using the font tool

Aspects of the axes are controlled by the axes popup which is called from Main:Plot/Axis properties or by double clicking the graph frame. All aspects of the axes can be changed like the title, the font, colour, whether or not to draw grid lines, or user defined tick marks and labels. There are many settings and the best thing to do is to experiment to see what each setting does.

For now, let's start by labelling the axes. Suppose these curves represent the number of tasks a processor runs as the function of the number of users. To make it more interesting, assume we are doing this in Quebec. That means we want to plot "Nombre de tâches vs. nombre d'usagers". Note the importance of having the accent over the a in tâches or we would end up plotting the number of stains which is entirely another case. Bring up the Axes pop up, select the Y axis, and click in the space to enter the label string of the axis label. Start typing Nombre de t. At this point we need to enter a accented letter, so we bring up the font tool by pressing Control-E. You will now see what we have typed in the Cstring widget. Move the cursor to where you want to place the accented letter and click on the letter. It should now appear in the string. You can either finish the string here or hit accept and keep editing. Label the x axis as well. This font tool is available wherever text needs to be entered.

All the attributes regarding the axis labels like size, colour, font, position are changeable.

2.4 Graph titles

Our next exercise will be to title the graph so other. Operation pertaining to this are found in the "Graph appearance" widget which we open by selecting Main:Plot/Graph appearance or by double clicking just above the graph frame.

We can now fill in the title of the graph and by clicking on the "Titles" tab, the font and size and colour can be chosen. The Viewport box under the "Main" tab defines the 4 corners of the graph frame. You can type them in or use the mouse to move them by first double clicking on them.

Other things which can be controlled in this widget are the frame drawn around the graph, whether or not the graph background is coloured and the legends. Legends will be dealt with a little later.

2.5 Legends

Since we have several lines in our graph, it makes sense that we label them with a legend so that other people can figure out what they mean. The first thing to do is to give each set a label. This is done by entering a legend string for each set in the Set appearance popup. Now, from the Main form in the Graph appearance popup, click on "Display legend" to see the legend box. The location and appearance of the box is controlled by clicking on the "Leg. box" tab. The appearance and spacing of the legend entries is controlled by the "Legends" tab. For simplicity, label the sets alphabetically and then play with the appearance, etc. to get something you like.

Specifying the placement of the graph by entering the coordinates can be painful, especially the fine tuning. To alleviate this problem, a graphical method is also available, although not readily apparent. After a legend appears, it may be dragged to a new location. To do this, press Ctrl-L with your mouse on the main canvas. You should see the arrow cursor turn into a hand. If this doesn't work, double click on the main canvas (to get its attention) and then press Ctrl-L. Click on the legend and drag it. To cancel the legend drag mode (as with all other modes), click on mouse button 3.

2.6 A challenge

I got bored so I took the data files and produced my own, albeit ugly, graph. See if you can copy mygraph.png

3. Block Data

A block of data is a table of number which are interpreted as columns of numbers. How sets are created from the columns depends on the information you want to extract from the file.

We first need to read in a block of data. We do this from Main:Data/Import/ASCII. Select the file "3.dat" and Load as "Block data". If the read was successful, a window should pop up asking you to create a set from the block data. At the top it will list how many columns of data were read.

First we choose the type of set we would like. For now we'll stick with xy.

Next we choose which column of data contains the x-ordinate. If there is no column, we can select "index" which will use the index into the column as the x ordinate starting from one.

The values Y1 through Y4 are used for selecting error bars as may be needed by other set types.

The last thing to specify is the graph into which to load the set if we have more than 1 set.

Finally, hitting accept will create the set.

If you close this window, it can reopened by bringing up a set list (eg. Main:Edit/Data_sets) and then selecting Create_new/From_block_data from the menu brought up by right clicking on the set list.

Try creating a new set of type XYdY. This is an XY curve with error bars. Try X, Y, and Y1(the error) from different columns.

4. Creating sets within Grace

Besides reading in data files, Grace has an extensive scripting language with a large number of math functions built in, These function include the basic add, multiply, square root, etc, and also the cephes library of higher order math functions like Bessel functions and the gamma function. Hence, functions in Grace are basically unlimited. See the user guide for more details. In addition, users can dynamically add libraries to Grace with any desired function. As well, points may be added manually to a set by the use of editors. To begin, choose Main:Edit/Data sets. To create a set, press mouse button 3 (the rightmost one for right handed people) anywhere within the data set list (which may be empty) and select Create new. A menu with 4 different ways of creating new sets will be presented. We'll go through them one by one.

4.1 By formula

The load and evaluate window will pop up when this is selected.

  1. The first step is to set up the parameter mesh which will determine the range and sampling of the variable $t. Most often, $t will simply be the abscissa.
  2. Next, choose the type of set you would like to produce.
  3. Using the syntax of the command language, an expression for x is entered which uses $t as the independent variable. This can be an extremely complicated function.
  4. Likewise, an expression for y is entered and for any other expressions that may be needed. Fields after y are labelled y1, y2, y3 and y4. For example, if the set type xydxdy is chosen, y1 will hold dx and y2 will hold dy and it will be necessary to enter expressions for them.
  5. Pressing apply or accept will perform the calculations and create the new set. You may have to autoscale to see the new set.

Below are a few samples:

  1. To plot one cycle of a sine wave: Load: Set X, Start load at: 0, Stop load at: 2*pi, Length: 100, X=$t, Y=sin($t)
  2. A unit circle by parameterization: Start at:0, Stop at: 2*pi, Length: 100, X=cos($t), Y=sin($t)

4.2 In spreadsheet

If your system has the Xbae widget set, this choice brings up a spreadsheet like editor to allow one to enter the points of the set by hand. Initially, it just has the point ( 0, 0 ). Clicking on add will insert a copy of the currently selected row immediately below the selected row. Clicking delete will delete the row which contains the cursor. This method is best suited to examining or modifying existing sets or creating very small sets. The sets gets updated after one hits enter or leaves the cell.

4.3 In text editor

If your system doesn't have the Xbae widget set or you want the power of your favourite external editor, a text editor of your choice may be used to enter data. The editor is selected by the GRACE_EDITOR environment variable. If the set is new, it will contain only the point (0,0). During editing, no other operations are possible. After the editor is closed, the set will be updated.

4.4 From block data

This creates a new set from a block of data which has been read in. See section 3.

5. Batch plotting

Grace supports a large number of command line options which allow the user to control the appearance and placement of graphs. This can be very useful if you want to use it to quickly print something without going through the GUI, use it within a script to automatically generate graphs, or have a plot come up already configured which can be much quicker than going through the GUI menus.

5.1 Simple nonGUI printing

Invoking Grace with the command "grbatch"from the command line will cause Grace to start, produce a plot, send it to the printer (unless a file is specified) and then exit. In its simplest form, to produce a plot of the file a.agr, type

gracebat a.agr

If gracebat is unavailable on your system, the hardcopy option to xmgrace will do the same thing. Assuming the hardcopy device is a postscript printer, one could also type

xmgrace -hdevice PostScript -hardcopy a.agr

5.2 Multiple graphs

Often, one wishes to plot several graphs with each graph having different characteristics. This is easily accomplished from the command line. Options specified on the command line are parsed in order and stay in effect until overridden by specifying them again.

  1. The first step in plotting multiple graphs is usually telling Grace how many graphs we have and how to arrange them. The interpreter command "arrange" will do this. For example, if we want 4 graphs arranged in a simple 2x2 table, we specify -pexec "arrange ( 2, 2, .1, .1,.1,ON,ON,ON)" The exact meaning of all the options is explained in the reference manual.
  2. Specify any global options.
  3. Specify for each graph, the data to plot and any options. Options should be specified in the following order:
    1. "-graph g" where g is the graph number starting at 0. This says to apply all following options to this graph.
    2. Set any autoscaling options. Autoscaling is performed when the file is read; ergo, the autoscaling must be specified BEFORE the file is read. Remember, this setting is persistent.
    3. Set the set type. This is also a persistent setting.
    4. Specify the graph type and the input file.
    5. If reading in block data, create the sets with the "-bxy" option.
    6. Specify any world scaling. It is important to do this AFTER sets are read (unless autoscaling is off) as the graph gets rescaled when data is read in.
    7. Specify anything else

An example

Let's try an example. We will assume 5 plots, the first 4 of which are to be stacked vertically, and the fifth inset into the fourth. We wish to plot the files a.dat, b.dat, c.dat and d.dat with the inset graph being a magnified portion of d.dat. Assume a.dat contains multiple columns of data, b.dat is a block of data from which we wish to make a curve from columns 2 and 4 with the error given by column 3, c.dat is to be represented as a bar graph, and for the inset graph, we wish to graph to region (0,0) to (1,1). This can be accomplished by

gracebat -pexec "arrange (4,1,.1,.1,.1,ON,ON,ON)" -nxy a.dat -graph 1 -block b.dat -settype xydy -bxy 2:4:3 -graph 2 -settype bar c.dat -graph 3 -settype xy d.dat -graph 4 d.dat -world 0 0 1 1 -viewport .15 .3 .8 .88

Note that the graph numbers start at 0 and that 0 is the default so it does not have to be specified for the first graph.

5.3 Things for which no command line option exists

Undoubtedly, you will reach a point where you want to do something for which no command line option exists. (We have been doing this with the arrange command.) This is where Grace's parameter file language is vital. The option "-pexec" will execute the next argument as if it had read it from a parameter file or excuted on the command line. If you want to do something more complicated than one command, you can use several pexec's or put the commands in a file and run the file with the "-batch" option.

Pexec example

To read in the files foo.dat and bar.dat and scale foo.dat in Y by 1000, the simplest way is

xmgrace foo.dat bar.dat -pexec "s0.y = s0.y * 1000"

Batch example

To do the same as the previous example but also label the axes and recolour the curves, make a file called "bfile" with the Grace commands


#Obligatory descriptive comment
s0.y = s0.y * 1000
s0 line color 3
s1 line color 4
title "A Gnasty Graph"
xaxis label "Time ( s )"
yaxis label "Gnats ( 1000's  )"
autoscale 

and then run xmgrace with

xmgrace foo.dat bar.dat -batch bfile

6. Fitting curves

This tutorial will explain some of Grace's curve fitting abilities. Grace can perform two types of fittings. The first type is regression or linear fitting where optimization is done on a linear equation or an equation which can be expressed in a linear form. This includes fitting polynomials and certain forms of equations. The other type of fitting is nonlinear and allows for arbitrary user supplied functions.

Let's take a curve and see how each type of fitting works. To begin, create a curve of the function y = sqrt(x) + exp(x)/3 -1 over the range 0 to 3 with 100 points.

6.1 Linear Regression

Choosing Main:Data/Transformations/Regression will pop up the Regression window.

  1. Select the set you just created
  2. Select the type of fit. For now, pick Linear.
  3. We will load the fitted value for now.
  4. Press the accept button to see the results of the fit. A window will pop up which will give you the results of the fit including the final expression. You might have to scroll back a bit to see it.
  5. See how high of a polynomial is needed to get an acceptable fit and try fitting other types of functions. Note that for the non-polynomial fits, A and B are the fitting parameters of the equation.
  6. Now, we are not limited to computing our fitted curve at the points of the original function. Suppose these data are quarterly sales and we wish to predict our next quarter. Choose the type of fit which you found to work best. Instead of loading fitted values, Load: Function. Now the bottom of the widget will become active. We wish to extrapolate over the next quarter, so we would like to start at 0 and end at 4 and choose 100 points. Press accept to see the extrapolation.

6.2 Non-linear

We pop up the widget by selecting Main:Data/Transformations/Non-linear curve fitting. You may want to kill all the sets except the original function and the extrapolated function at this point.

  1. Begin by selecting the set to optimize, the original function.
  2. Next, we write a function of the form we wish to fit. The unknown parameters are labelled a0..a9. You must start with a0 and work your way up. In this case, since you know the form of the equation already, so try: y = a0*sqrt(x) + a1*exp(x) + a2.
  3. Next we must specify that we have three parameters to fit which are a0, a1 and a2 and the tolerance of the solution.
  4. You must specify initial values for the parameters and put any bounds on them if necessary. Depending on the function you are optimizing, different initial conditions may lead to drastically different optima.
  5. The solution process is iterative and you must click on a button to run a certain number of iterations. You should see the parameters change and a curve created with these parameters. In this example, the exact solution is reached within 5 steps. More parameters and more difficult functions may require more steps in which case you may choose to run 20 or 100 or more steps. The newly created optimized curve should converge with an increasing number of steps.
  6. As in linear curve fitting, you can choose to load the fit function at the points of the original curve, over an arbitrary range or load the error at each point. For comparison, load the fitted curve over the range (3,4) by selecting Nonlinear:Options/Load/Function and filling in the bottom of the widget. How does the true answer compare to your previous extrapolation?
  7. Fitting arbitrary curves can be a tricky business. Initial conditions are very important. If you don't get a good fit, you may have to experiment a lot with the initial parameters values.
  8. Finally, note that the fitted curve does not get added until the accept button is pressed. This allows you to "fool around" until you get a good fit without creating a lot of garbage sets.

7. Transformations

7.1 Graphical

Simple Geometrical

You can rotate sets around an arbitrary axis perpendicular to the canvas (e.g. the Z-axis). Also it is possible to scale sets and translate them.

Mathematical operations between sets

It is possible to perform operations between sets. With many operations, however, it is required that the 2 sets have the identical abscissa, i.e., the x values of both sets are the exact same. This is necessary since most operations are performed on a point by point basis. Eg. multiplying 2 sets is done by multiplying the Y values of the 2 sets together to produce a new Y value. About the only operations that don't do this are filtering and convolution. Fortunately, Grace has a function to help out when the abscissas differ. It is called interpolation which interpolates a set over the domain of another set to produce a new curve.

Let us now add the cosine of a set to the sine of another set to create a new curve. However, we will complicate this example by having different domains with different sampling:

  1. Read in 7.1.2.agr
  2. Note how the abscissa are different. We begin by using interpolate to produce a third set which is the second set sampled at the x values of the first. Call up the Interpolate popup from Main:Data/Transformations/Interpolation/splines ...
  3. Select S1 as the source set but don't specify a destination set. A set will automatically be made. Use the Strict, linear method, Sampling:Abscissas of another set and use S0 as the Sampling set. Pressing Apply should produce a curve which is S1 interpolated at the points of S0. Note that the new curve only exists over the portion of the x axis common to both curves.
  4. We still have a problem since set 2 is sampled the same as set 0 but has a smaller domain. We can perform the computation only over the common region so we now interpolate on set 0 at points from set 2 to produce set 3. Now set 2 and set 3 have the exact same abscissas.
  5. Call up the command interpreter from Main:Window/Commands ...
  6. We need to create a set to hold the result, S4. We can either make a copy (using Main:Edit/Set_operations...) of S2 which will be guaranteed to have the proper size to hold out result or we can use type a command: s4 length s2.length
  7. We have to break up the computation into an x part and a y part. In this instance, we simply wish to keep the same x values. The final result will be put into set 4, so we issue the command: s4.x = s2.x
  8. Now we can perform the math between our interpolated copies of sets 0 and 1: s4.y = cos(s3.y) + sin(s2.y).
  9. So where is the new set? It's there but it's hidden. Since we already have the command window open, we can unhide the set by typing: S4 on. For the GUI minded (no offense intended), bring up a set list with the set operations menu (eg. Main:Edit/Data_sets or Main:Plot/Set_appearance), select set 4 and unhide it by selecting show from the operation menu (mouse button 3).

N.B. If the abscissas of the original curves had been the same, we could have started at step 5. If the sampling had been the same we could have skipped step 4.

Feature extraction

Feature extraction is a way of creating one curve from a family of curves. It generates one data point from each curve by measuring a characteristic of the curve. For example, one might have a series of curves which plot the gnat population as a function of time. Each curve is produced by varying some condition, like the number of gnus in the environment. Using feature extraction, one could use this family of curves to produce a new curve of the peak number of gnats as a function of gnus or the time of the peak number of gnats as a function of the number of gnus. This is most often useful with more than one graph.

  1. Read in graph 7.1.3.agr
  2. Bring up the feature extraction form by clicking on Main:Data/Transformations/Feature_extraction.
  3. Select Results to graph 1.
  4. Select the feature you are interested in. Choose Y maximum.
  5. Select what will determine the x value of the data point. The value of the characteristic determines the Y value. The X value can be determined by the set number. The x or y values of a specified set can also be used to produce the abscissa. Finally, the legend entry of the curve itself can be used to produce the x value. In this case, the legend entry must be specified as a single number. Choose index for now.
  6. Press accept, click on graph 1 and then click on the autoscale button to see your results.
  7. Choose another feature, like frequency, this time and get X values from the legend. Make sure that graph 0 has the focus when you hit accept.

7.2 Restrictions

Often we only wish to examine part of a data set or perform transformations only on a portion of one. Restrictions allow us to define a region of the graph on which to perform operations.

Defining a region

There are several ways a region may be defined. It may be defined by a straight line (left of, right of, above, below), by a polygon (inside or outside), or by a range ( in x, out of x, in y, out of y). Call the define region popup from Main:Edit/Regions/Define. Choose which one of the regions you would like to define, and press the define button.

Line type

Define the ends of the line by clicking with mouse button 1.

Polygon type

From the define region popup, choose a polygon type and then the define button. Use mouse button 1 to pick the vertices of the polygon and then mouse button 3 when you are done.

Range type

From the define region popup, choose a range type and then pick 2 points which define the range.

Using regions

Regions may be only be used to restrict an expression evaluation. Bring up the evaluateExpressions popup (Main:Data/Transformations/Evaluate_expression). Choose the source and destination sets and specify the formula to apply to the region of interest. Not specifying an expression is equivalent to the identity transformation. Choose the region you wish to use. By checking negate, the complement of the specified region is used.

Click on Apply to perform the operation. The resultant set will be the expression evaluated only on points contained in the specified region. Thus, if no expression was specified, the effect is to produce a new set of only those points contained in the region. Conversely, to delete points in a region, leave the expression empty, and negate the region selection.

8. Using Pipes

Pipes are a way of capturing the output of a running process without the intermediary step of pacing the output in a file. Instead, the executing program puts the data in one end of the pipe, and Grace reads it from the other end of the pipe.

8.1 Instead of data files

On certain popups, e.g. Main:Data/Import/ASCII, the option to read from a file or pipe can be specified. If a pipe is chosen, the command in the selection widget will be run and the stdout will be captured and treated as though it was data which was read from a file.

8.2 Named pipes

A named pipe is a special case of the pipe previously described. In the previous case, after the program has finished execution and the output had been read, the pipe was destroyed. A named pipe is a static structure with the property that multiple processes can write to and/or read from it. The purpose of using a named pipe with Grace is to start up a Grace window and then control Grace by sending commands and data through a named pipe. This is very powerful and lets you do practically anything you can do directly from the GUI. To use this feature, try the following:

  1. Start a named pipe (you will have to find the command specific to your operating system. For example, it could be mkfifo or mknod): mkfifo pvc. If you do a directory listing, you should see the file pvc.
  2. Start up Grace in the background using the named pipe option: xmgrace -npipepvc&. Grace is now monitoring the pipe for any data which might be sent to it. It will interpret things as though they were entered using the command interpreter.
  3. For a simple test, we will create a simple graph over the pipe. From your command line, type: echo "read \"8.2.dat\"" > pvc. (The back slashes are needed to escape the quotation marks so that Grace really received the command :read "8.2.dat".) This just told Grace to read the file data. Now we would like to autoscale. We could simply click on the button but the point is to use a named pipe. This time we type echo autoscale > pvc followed by echo redraw > pvc. Your graph should now have autoscaled and redrawn. Exit Grace with echo exit > pvc. You should also clean up by removing pvc.
  4. The true power in named pipes lies in driving Grace using another program. The controlling program can open a named pipe for writing, which is treated as an ordinary file. It can be opened with the fopen() function or whatever other I/O function you prefer. Commands and data are then written to the file where they are interpreted by Grace.

9. Multiple Graphs

9.1 Selecting graphs

When multiple graphs are present, a graph is selected by clicking inside the graph frame. In cases where graph frames overlap, clicking will cycle among the overlapping graphs.

It might be annoying if one is trying to work in a region of overlapping graphs. If will not be possible to double click on something because the each click will be interpreted as a single click and you will only end up changing the graph focus. In such an instance, turning off the graph selection by clicking might be desirable. Choose Main:Edit/Preferences and then set Misc:Graph_focus to "As set". This means one must explicitly set the focus. Simply bring up a graph list (eg. Main:Edit/Overlay_graphs is but one), select the graph you want to work on and then, using the menu under mouse button 3, choose "Focus to".

Arranging a tableau of graphs

Placing a large number of regularly spaced graphs is easily done with Main:Edit/Arrange_graphs. This will automatically calculate the layout:

  1. Choose 3 rows and 3 columns and Apply. You should now see 9 graphs. The Order button refers to the way the graphs are numbered. The beginning of the line on the diagram of the button shows which graph is numbered 0 and how the numbers increase, by row or column.
  2. You realize you need horizontal packing, i.e. no horizontal gap between graphs. Click on the Pack button beside the Hgap/width input and then Apply.
  3. Suddenly, you realize you only need 6 graphs and not 9. Choose 2 rows and press Apply. There is a slight problem as graphs 6, 7 an 8 are still visible. This is a feature since you don't want to accidentally kill a graph. You can kill the extra graphs by clicking on the "Kill extra graphs" check box. Now, any graphs other than the explicitly arranged ones will be automatically killed.
  4. The margins are controlled by the Page Offsets, and the intergraph spacing by the Hgap and Vgap inputs.
  5. Press close to remove the window.

Note that only graphs which are selected are taken into consideration. So, if you wish to reorganize your existing graphs, make sure they are selected or new ones may be created.

Arranging individual graphs

Arranging individual graphs may either be done (1) exactly, by specifying the viewport coordinates from Main:Plot/Graph_appearance or using the previously explained Arrange graphs popup, or (2) roughly, by double clicking a graph focus marker and then moving it.

9.2 Overlaying Graphs

Overlaying one graph onto another is useful for creating a graph with two different x axes and/or y axes. For example, you may wish to have a graph which on the x axis has the month of the year. There could be 2 curves on it, one using the left y axis which is number of gnus sold and one using the right y-axis which is the number of gnats exported on a logarithmic scale. Likewise, if one is plotting spectral data, one could have one x axis in Hz and another one in wavelength. Let's proceed with an example:data

  1. Begin by selecting Main:Edit/Overlay graphs to bring up the Overlay widget.
  2. Select the graph numbers with which we would like to deal. In this example, we will overlay graph 1 onto graph 0. At this point, only graph 0 is visible. We cannot see Graph 1 to select since it does not exist at this point. We need to create simply by pressing mouse button 3 in a graph list window and selecting create new.
  3. The overlay type is determined by what is common among the overlayed graphs. In our example, the x axis is common so we will select X-axes same, Y-axes different. This is important because we don't want to alter any axes of the Overlay graph which we set the same as the underlay graph. In this example, we don't want to alter the x-axis of graph 1.
  4. We are now ready to label the graph axes and read the data. One thing we must be careful to do is to always make sure that we are working on the intended graph. Seeing as the graphs are overlain, clicking within the frame is ambiguous as to what graph is selected. The rule is that in a region of overlay, clicking will cycle between the graphs. Hence, if graph 1 is selecting, clicking within the frame will toggle to graph 0.
  5. Making sure that graph 0 is active, bring up the Axis properties widget. Now set the y axis title to Gnus.
  6. Select graph 1 as active as set the title as Gnats. Notice how it overlaps the Gnus. We want to put this on the right side. From the axis label and bar tab, select label Properties/Side=Opposite.
  7. Label the x axis to label it. If graph 1 is the current graph, noticed how it is greyed out because only 1 x axis need be active. Select graph 0 and you should now be able to alter the axis label.
  8. You are ready to read in data. Just make sure the graph that is active when you read in the data (or create your set) is the one in which you intend it to go.

10. Hot Links

Hot links are a way of of updating a set without having to delete it first and then reread it. The Hot Links window is opened available under Main:Data/Hot links.

10.1 File containing a Single Set

The simplest hot link is to a file containing just one set. To make a hot link to a single set, we must first select the set we want to get updated and then specify the file. We may also link to a pipe in which case we must specify it is a pipe to which we are linking. A command may also be entered which will be run every time the hot link is updated. A common command might be autoscale which will make sure that the entire set can be seen if it changes size. It's possible you may want to execute more commands than one. One could, for example, have a set that is a function of 2 sets that needs to be recomputed if either set is updated. If this is the case, put your commands in a file and then use the "READ BATCH" command.

Pressing the Link button will now create the link and if the update button is pressed, the set will be updated with the current contents of the file you linked and the contents of the Command widget will be executed.

For a simple example, read in the set 10.1.dat and set up the hot link. Now, run the command shiftdata.sh and update the hotlink. You should have seen the peak in the graph shift. Try repeating this a couple of more times.

10.2 Multiple sets within a file

Sometimes a data file may contain multiple columns of data and we would like to be able to link to all or some of those columns. To specify this, select as many sets as there are xy columns of data in the file. The "x y1 y2" format is assumed. Choose the file the data and link. Now in the link list, the links will show the file name with an appended colon and number. The number tells what column of data the link refers to. Any unwanted columns may be selected and unlinked at this point. When the update button is selected, all sets in the graph will be updated.

10.3 Updating by hot keys

Instead of having to keep the Hot links window open all the time, the update action is bound to alt-u. If you find that alt-u has no effect, try double clicking inside the graph you want to update and close the window that pops up. This will "alert" the canvas to process future hot key strokes.

grace-5.1.23/doc/convcal.10000644000076500001440000001157407337553615014732 0ustar fnevgenyusers.TH CONVCAL 1 "August 11, 2001" grace "User's Manual" .SH NAME convcal \- convert dates to different formats .SH SYNOPSIS .B convcal [\fIOPTIONS\fR] [\fIDATE\fR] .SH DESCRIPTION \fBconvcal\fR is part of the \fIgrace\fR software package, an application for two-dimensional data visualization. \fBconvcal\fR converts dates from and to various formats. The following date formats are supported (hour, minutes and seconds are always optional): .TP .I iso 1999-12-31T23:59:59.999 .TP .I european 31/12/1999 23:59:59.999 or 31/12/99 23:59:59.999 .TP .I us 12/31/1999 23:59:59.999 or 12/31/99 23:59:59.999 .TP .I days 123456.789 .TP .I seconds 123456.789 .SH "" The formats are tried in the following order : users's choice, iso, european and us (there is no ambiguity between calendar formats and numerical formats and therefore no order is specified for them). .SH USAGE \fBconvcal\fR reads the dates either on the command line or in the standard input if the command line contains no date. The user's choice for the input format put one format before the other ones in the trial list, this is mainly useful for US citizen which would certainly prefer to have US format checked before european format. The default user's choice (nohint) does nothing so the following formats of the list are checked. The separators between various fields can be any characters in the set: " :/.-T". One or more spaces act as one separator, other characters can not be repeated, the T separator is allowed only between date and time, mainly for iso8601. So the string "1999-12 31:23-59" is allowed (but not recommended). The '-' character is used both as a separator (it is traditionally used in iso8601 format) and as the unary minus (for dates in the far past or for numerical dates). When the year is between 0 and 99 and is written with two or less digits, it is mapped to the era beginning at wrap year and ending at wrap year + 99 as follows : [wy ; 99] -> [ wrap_year ; 100*(1 + wrap_year/100) - 1 ] [00 ; wy-1] -> [ 100*(1 + wrap_year/100) ; wrap_year + 99] so for example if the wrap year is set to 1950 (which is the default value), then the mapping is : range [00 ; 49] is mapped to [2000 ; 2049] range [50 ; 99] is mapped to [1950 ; 1999] this is reasonably Y2K compliant and is consistent with current use. Specifying year 1 is still possible using more than two digits as follows : "0001-03-04" is unambiguously March the 4th, year 1, even if the user's choice is us format. However using two digits only is not recommended (we introduce a 2050 bug here so this feature should be removed at some point in the future ;-) Numerical dates (days and seconds formats) can be specified using integer, real or exponential formats (the 'd' and 'D' exponant markers from fortran are supported in addition to 'e' and 'E'). They are computed according to a customizable reference date. The default value is given by the REFDATE constant in the source file. You can change this value as you want before compiling, and you can change it at will using the -r command line option. The default value in the distributed file is "-4713-01-01T12:00:00", it is a classical reference for astronomical events (note that the '-' is used here both as a unary minus and as a separator). The program can be used either for Denys's and gregorian calendars. It does not take into account leap seconds : you can think it works only in International Atomic Time (TAI) and not in Coordinated Unified Time (UTC) ... Inexistant dates are detected, they include year 0, dates between 1582-10-05 and 1582-10-14, February 29th of non leap years, months below 1 or above 12, ... .SH OPTIONS A summary of the options supported by \fBconvcal\fR is included below. .TP .B \-h prints the help message on stderr and exits successfully .TP \fB\-i\fR \fIformat\fR set user's choice for input format, supported formats are iso, european, us, days, seconds and nohint. At the beginning the input format is nohint, which means the program try to guess the format by itself, if the user's choice does not allow to parse the date, other formats are tried .TP \fB\-o\fR \fIformat\fR force output format, supported formats are iso, european, us, days, seconds and nohint. At the beginning, the output format is nohint, which means the program uses days format for dates read in any calendar format and uses iso8601 for dates read in numerical format .TP \fB\-r\fR \fIdate\fR set reference date (the date is read using the current input format) at the beginning the reference is set according to the REFDATE constant in the code, which is -4713-01-01T12:00:00 in the distributed file. .TP \fB\-w\fR \fIyear\fR set the wrap year to year .SH "SEE ALSO" .BR grace(1) .I http://plasma-gate.weizmann.ac.il/Grace/ .SH AUTHOR Luc Maisonobe This man-page was written by Jan Schaumann as part of "The Missing Man Pages Project". Please see \fIhttp://www.netmeister.org/misc/m2p2/index.html\fR for details. grace-5.1.23/doc/grace.10000644000076500001440000001464311404714565014357 0ustar fnevgenyusers.TH GRACE 1 "Jan 28, 2007" .LO 1 .SH NAME grace \- command line interface .br xmgrace \- full-featured GUI mode .br gracebat \- batch mode \- print and exit .SH DESCRIPTION Grace is a WYSIWYG tool to make two-dimensional plots of scientific data. .SH SYNOPSIS .B grace .RI "[ " option " | " filename " ]..." .br .B xmgrace .RI "[ " option " | " filename " ]..." .br .B gracebat .RI "[ " option " | " filename " ]..." .SH OPTIONS .TP .BI "\-autoscale " "x|y|xy|none" Set autoscale type .TP .B "\-barebones " Turn off all toolbars .TP .BI "\-batch " "file" Execute batch .I file on start up (i.e., after all other options have been processed and the UI initialized) .TP .BI "\-block " "file" Assume the data .I file is block data .TP .BI "\-bxy " "x:y:etc." Form a set from the current block data set using the current set type from columns given in the argument .TP .BI "\-datehint " "iso|european|us|days|seconds|nohint" Set the hint for dates analysis .TP .BI "\-dpipe " "descriptor" Read data from descriptor on startup .TP .BI "\-fixed " "width height" Set canvas size fixed to width*height .TP .B "\-free" Use free page layout .TP .BI "\-graph " "number" Set the current graph number .TP .BI "\-graphtype " "xy|chart|fixed|polar|pie" Set the type of the current graph .TP .B "\-hardcopy" No interactive session, just print and quit .TP .BI "\-hdevice " "device_name" Set default hardcopy device. See .B "xmgrace \-version" for a list of supported devices. .TP .B "\-install" Install private colormap .TP .B "\-legend" "load" Turn the graph legend on .TP .BI "\-log " "x|y|xy" Set the axis scaling of the current graph to logarithmic .TP .BI "\-maxpath " "length" Set the maximal drawing path length .TP .B "\-mono" Run grace in monochrome mode (affects the display only) .TP .BI "\-netcdf " "file" Assume data file is in netCDF format. This option is present only if the netCDF support was compiled in .TP .BI "\-netcdfxy " "X_var Y_var" If \-netcdf was used previously, read from the netCDF file X_var and Y_var variables and create a set. If X_var is "null" then load the index of Y to X. This option is present only if the netCDF support was compiled in .TP .B "\-noask" Assume the answer is yes to all requests, if the operation would overwrite a file, grace will do so without prompting .TP .B "\-noinstall" Don't use private colormap .TP .B "\-noprint" In batch mode, do not print .TP .B "\-nosafe" Disable safe mode .TP .B "\-nosigcatch" Don't catch signals .TP .BI "\-npipe " "file" Read data from named pipe on startup .TP .BI "\-nxy " "file" Assume data file is in X Y1 Y2 Y3 ... format .TP .BI "\-param " "file" Load parameters from .I file to the current graph .TP .BI "\-pexec " "string" Interpret string as a parameter setting .TP .B "\-pipe" Read data from stdin on startup .TP .BI "\-printfile " "file" Save print output to .I file .TP .B "\-remove" Remove data file(s) after read .TP .BI "\-results " "file" Write results of some data manipulations to .I file .TP .B "\-rvideo" Exchange the color indices for black and white .TP .B "\-safe" Run in the safe mode (default) .TP .BI "\-saveall " "file" Save all to .I file .TP .BI "\-seed " "value" Integer seed for random number generator .TP .BI "\-settype " "xy|xydx|..." Set the type of the next data file .TP .BI "\-source " "disk|pipe" Source type of next data file .TP .BI "\-timer " "delay" Set allowed time slice for real time inputs to .I delay ms .TP .B "\-timestamp" Add timestamp to plot .TP .B "\-version" Show the program version, registered devices and build time configuration information. .TP .BI "\-viewport " "xmin ymin xmax ymax" Set the viewport for the current graph .TP .BI "\-wd " "path" Set the working directory .TP .BI "\-world " "xmin ymin xmax ymax" Set the world coordinates for the current graph .TP .B "\-usage|\-help" This message .SH RESOURCES .TP When run in the GUI mode, the interface is a subject to X resource settings. Please refer to the User's Guide for a list of important ones. .SH ENVIRONMENT .TP .B GRACE_HOME Specifies the directory where the Grace docs and libs are stored. Default is .BR /usr/local/grace .TP .B GRACE_HELPVIEWER The shell command to run an HTML viewer for on-line browsing of the help documents. Must include at least one instance of "%s" which will be replaced with the actual URL by Grace. Default is .B mozilla %s .TP .B GRACE_EDITOR Specifies the editor which is used to edit sets. Default is .B xterm \-e vi .TP .B GRACE_PRINT_CMD The print command. .TP .B GRACE_FFTW_RAM_WISDOM and .B GRACE_FFTW_WISDOM_FILE A flag (0 or 1) and a file name which determine whether a FFT should use `wisdom' when using the FFTW libraries. .SH FILES In many cases, when Grace needs to access a file given with a relative .ft I pathname\c .ft R , it searches for the file along the following path: .ft I ./pathname:./.grace/pathname:~/.grace/pathname:$GRACE_HOME/pathname .ft R The following files are of a special importance: .B gracerc - init file loaded upon start up. .B templates/Default.agr - the default template, loaded whenever a new project is started. .B fonts/FontDataBase - the file responsible for font configuration. .SH "SEE ALSO" grconvert(1), X(1) [or Xorg(1)], Grace User's Guide .SH HOME PAGE http://plasma-gate.weizmann.ac.il/Grace/ .SH BUGS The best way to submit a bug report is using the "Help/Comments" menu entry. Alternatively, see the home page. .SH AUTHORS .B Grace is derived from .B ACE/gr (a.k.a .B Xmgr ) written by Paul J Turner. From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik. .SH COPYRIGHT Copyright (c) 1991-1995 Paul J Turner, Portland, OR .br Copyright (c) 1996-2007 Grace Development Team .SH LICENSE The program is distributed under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. grace-5.1.23/doc/UsersGuide.dvi0000644000076500001440000132056012032153136015763 0ustar fnevgenyusers÷ƒ’À;è TeX output 2012.10.01:0131‹ÿÿÿÿï¬! systemdict /pdfmark known{userdict /?pdfmark systemdict /exec get put}{userdict /?pdfmark systemdict /pop get put userdict /pdfmark systemdict /cleartomark get put}ifelseï’ps:SDict begin [/Producer (dvips + Distiller)/Title ()/Subject ()/Creator (LaTeX with hyperref package)/Author ()/Keywords () /DOCINFO pdfmark endòo! /DvipsToPDF{72.27 mul Resolution div} def/PDFToDvips{72.27 div Resolution mul} def/BPToDvips{72 div Resolution mul}def/BorderArrayPatch{[exch{dup dup type/integertype eq exch type/realtype eq or{BPToDvips}if}forall]}def/HyperBorder {1 PDFToDvips} def/H.V {pdf@hoff pdf@voff null} def/H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def/H.S {currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF 72 add /pdf@hoff exch def HyperBorder sub /pdf@llx exch def} def/H.L {2 sub dup/HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint HyperBaseDvips sub /pdf@ury exch def/pdf@urx exch def} def/H.A {H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt sub sub /pdf@voff exch def} def/H.R {currentpoint HyperBorder sub /pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def} defŽ¥©K… ýV´{ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.1) cvn /DEST pdfmark endï color popŽŽ¡ ý>‘ìïcolor push Black’ÕÁGï color popŽŽ £n ý~.\ïTps:SDict begin [/Count -2/Dest (section.1) cvn/Title (Introduction) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsection.1.1) cvn/Title (What is Grace? ) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsection.1.2) cvn/Title (Copyright statement ) /OUT pdfmark endï[ps:SDict begin [/Count -3/Dest (section.2) cvn/Title (Installation guide ) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsection.2.1) cvn/Title (Installing from sources ) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsection.2.2) cvn/Title (Binary installation ) /OUT pdfmark endïxps:SDict begin [/Count -0/Dest (subsection.2.3) cvn/Title (Alternative packaging schemes \(RPM, ...\) ) /OUT pdfmark endïXps:SDict begin [/Count -3/Dest (section.3) cvn/Title (Getting started ) /OUT pdfmark endï_ps:SDict begin [/Count -13/Dest (subsection.3.1) cvn/Title (General concepts ) /OUT pdfmark endïdps:SDict begin [/Count -0/Dest (subsubsection.3.1.1) cvn/Title (Project files \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.3.1.2) cvn/Title (Parameter files \040) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsubsection.3.1.3) cvn/Title (Input file formats \040) /OUT pdfmark endï]ps:SDict begin [/Count -0/Dest (subsubsection.3.1.4) cvn/Title (Graphs \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.3.1.5) cvn/Title (Datasets \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.3.1.6) cvn/Title (Sets \040) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.3.1.7) cvn/Title (Regions \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.3.1.8) cvn/Title (Real Time Input \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.3.1.9) cvn/Title (Hotlinks \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.3.1.10) cvn/Title (Devices ) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.3.1.11) cvn/Title (Magic path ) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.3.1.12) cvn/Title (Dynamic modules ) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsubsection.3.1.13) cvn/Title (Coordinate frames \040) /OUT pdfmark endïXps:SDict begin [/Count -2/Dest (subsection.3.2) cvn/Title (Invocation ) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.3.2.1) cvn/Title (Operational mode ) /OUT pdfmark endïgps:SDict begin [/Count -0/Dest (subsubsection.3.2.2) cvn/Title (Command line options ) /OUT pdfmark endï[ps:SDict begin [/Count -4/Dest (subsection.3.3) cvn/Title (Customization ) /OUT pdfmark endïlps:SDict begin [/Count -0/Dest (subsubsection.3.3.1) cvn/Title (Environment variables \040) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsubsection.3.3.2) cvn/Title (Init file ) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.3.3.3) cvn/Title (Default template ) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.3.3.4) cvn/Title (X resources ) /OUT pdfmark endïnps:SDict begin [/Count -9/Dest (section.4) cvn/Title (Guide to the graphical user interface ) /OUT pdfmark endïZps:SDict begin [/Count -2/Dest (subsection.4.1) cvn/Title (GUI controls ) /OUT pdfmark endïmps:SDict begin [/Count -0/Dest (subsubsection.4.1.1) cvn/Title (File selection dialogs \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.1.2) cvn/Title (List selectors \040) /OUT pdfmark endï]ps:SDict begin [/Count -2/Dest (subsection.4.2) cvn/Title (The main window ) /OUT pdfmark endï]ps:SDict begin [/Count -0/Dest (subsubsection.4.2.1) cvn/Title (The canvas ) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsubsection.4.2.2) cvn/Title (Toolbar buttons ) /OUT pdfmark endï[ps:SDict begin [/Count -8/Dest (subsection.4.3) cvn/Title (File menu \040) /OUT pdfmark endïZps:SDict begin [/Count -0/Dest (subsubsection.4.3.1) cvn/Title (New \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.4.3.2) cvn/Title (Open \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.4.3.3) cvn/Title (Save \040) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.4.3.4) cvn/Title (Save as \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.4.3.5) cvn/Title (Revert to saved \040) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsubsection.4.3.6) cvn/Title (Print setup \040) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsubsection.4.3.7) cvn/Title (Print \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.4.3.8) cvn/Title (Exit \040) /OUT pdfmark endï\ps:SDict begin [/Count -11/Dest (subsection.4.4) cvn/Title (Edit menu \040) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsubsection.4.4.1) cvn/Title (Data sets \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.4.2) cvn/Title (Set operations \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.4.3) cvn/Title (Arrange graphs \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.4.4) cvn/Title (Overlay graphs \040) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsubsection.4.4.5) cvn/Title (Autoscale \040) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.4.4.6) cvn/Title (Regions menu \040) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsubsection.4.4.7) cvn/Title (Hot links \040) /OUT pdfmark endïnps:SDict begin [/Count -0/Dest (subsubsection.4.4.8) cvn/Title (Set locator fixed point \040) /OUT pdfmark endïpps:SDict begin [/Count -0/Dest (subsubsection.4.4.9) cvn/Title (Clear locator fixed point \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.4.10) cvn/Title (Locator props \040) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.4.4.11) cvn/Title (Preferences \040) /OUT pdfmark endï[ps:SDict begin [/Count -5/Dest (subsection.4.5) cvn/Title (Data menu \040) /OUT pdfmark endïjps:SDict begin [/Count -0/Dest (subsubsection.4.5.1) cvn/Title (Data set operations \040) /OUT pdfmark endïkps:SDict begin [/Count -0/Dest (subsubsection.4.5.2) cvn/Title (Transformations menu \040) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsubsection.4.5.3) cvn/Title (Feature extraction \040) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsubsection.4.5.4) cvn/Title (Import menu \040) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsubsection.4.5.5) cvn/Title (Export menu \040) /OUT pdfmark endï[ps:SDict begin [/Count -4/Dest (subsection.4.6) cvn/Title (Plot menu \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.4.6.1) cvn/Title (Plot appearance \040) /OUT pdfmark endïgps:SDict begin [/Count -0/Dest (subsubsection.4.6.2) cvn/Title (Graph appearance \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.6.3) cvn/Title (Set appearance \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.4.6.4) cvn/Title (Axis properties \040) /OUT pdfmark endï[ps:SDict begin [/Count -6/Dest (subsection.4.7) cvn/Title (View menu \040) /OUT pdfmark endïgps:SDict begin [/Count -0/Dest (subsubsection.4.7.1) cvn/Title (Show locator bar \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.4.7.2) cvn/Title (Show status bar \040) /OUT pdfmark endïdps:SDict begin [/Count -0/Dest (subsubsection.4.7.3) cvn/Title (Show tool bar \040) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsubsection.4.7.4) cvn/Title (Page setup \040) /OUT pdfmark endï]ps:SDict begin [/Count -0/Dest (subsubsection.4.7.5) cvn/Title (Redraw \040) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsubsection.4.7.6) cvn/Title (Update all \040) /OUT pdfmark endï]ps:SDict begin [/Count -5/Dest (subsection.4.8) cvn/Title (Window menu \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.4.8.1) cvn/Title (Commands \040) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.4.8.2) cvn/Title (Point tracking \040) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.4.8.3) cvn/Title (Drawing objects \040) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsubsection.4.8.4) cvn/Title (Font tool \040) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.4.8.5) cvn/Title (Console \040) /OUT pdfmark endï[ps:SDict begin [/Count -9/Dest (subsection.4.9) cvn/Title (Help menu \040) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsubsection.4.9.1) cvn/Title (On context \040) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.4.9.2) cvn/Title (User's guide \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.4.9.3) cvn/Title (Tutorial \040) /OUT pdfmark endïZps:SDict begin [/Count -0/Dest (subsubsection.4.9.4) cvn/Title (FAQ \040) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.4.9.5) cvn/Title (Changes \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.4.9.6) cvn/Title (Examples \040) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.4.9.7) cvn/Title (Comments \040) /OUT pdfmark endïdps:SDict begin [/Count -0/Dest (subsubsection.4.9.8) cvn/Title (License terms \040) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsubsection.4.9.9) cvn/Title (About \040) /OUT pdfmark endïaps:SDict begin [/Count -10/Dest (section.5) cvn/Title (Command interpreter \040) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsection.5.1) cvn/Title (General notes ) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.5.2) cvn/Title (Definitions ) /OUT pdfmark endïWps:SDict begin [/Count -0/Dest (subsection.5.3) cvn/Title (Variables ) /OUT pdfmark endïops:SDict begin [/Count -0/Dest (subsection.5.4) cvn/Title (Numerical operators and functions ) /OUT pdfmark endïXps:SDict begin [/Count -0/Dest (subsection.5.5) cvn/Title (Procedures ) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsection.5.6) cvn/Title (Device parameters ) /OUT pdfmark endïZps:SDict begin [/Count -0/Dest (subsection.5.7) cvn/Title (Flow control ) /OUT pdfmark endïZps:SDict begin [/Count -0/Dest (subsection.5.8) cvn/Title (Declarations ) /OUT pdfmark endï^ps:SDict begin [/Count -2/Dest (subsection.5.9) cvn/Title (Graph properties ) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.5.9.1) cvn/Title (Command operations ) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.5.9.2) cvn/Title (Parameter settings ) /OUT pdfmark endï]ps:SDict begin [/Count -2/Dest (subsection.5.10) cvn/Title (Set properties ) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsubsection.5.10.1) cvn/Title (Commands ) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.5.10.2) cvn/Title (Parameter settings ) /OUT pdfmark endïXps:SDict begin [/Count -4/Dest (section.6) cvn/Title (Advanced topics ) /OUT pdfmark endïSps:SDict begin [/Count -3/Dest (subsection.6.1) cvn/Title (Fonts ) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.6.1.1) cvn/Title (Font configuration ) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsubsection.6.1.2) cvn/Title (Font data files ) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.6.1.3) cvn/Title (Custom fonts ) /OUT pdfmark endïqps:SDict begin [/Count -2/Dest (subsection.6.2) cvn/Title (Interaction with other applications ) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsubsection.6.2.1) cvn/Title (Using pipes ) /OUT pdfmark endïlps:SDict begin [/Count -0/Dest (subsubsection.6.2.2) cvn/Title (Using grace\137np library ) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.6.3) cvn/Title (FFTW tuning ) /OUT pdfmark endï\ps:SDict begin [/Count -3/Dest (subsection.6.4) cvn/Title (DL modules \040) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsubsection.6.4.1) cvn/Title (Function types ) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsubsection.6.4.2) cvn/Title (Examples ) /OUT pdfmark endïjps:SDict begin [/Count -0/Dest (subsubsection.6.4.3) cvn/Title (Operating system issues ) /OUT pdfmark endïSps:SDict begin [/Count -5/Dest (section.7) cvn/Title (References ) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.7.1) cvn/Title (Typesetting ) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsection.7.2) cvn/Title (Device-specific limitations ) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsection.7.3) cvn/Title (Device-specific settings ) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsection.7.4) cvn/Title (Dates in Grace \040) /OUT pdfmark endïkps:SDict begin [/Count -0/Dest (subsection.7.5) cvn/Title (Xmgr to Grace migration guide ) /OUT pdfmark endïNps:SDict begin [/PageMode /UseOutlines/Page 1/View [/Fit] /DOCVIEW pdfmark endï/ps:SDict begin [ {Catalog}<<>> /PUT pdfmark endïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (Doc-Start) cvn /DEST pdfmark endïpapersize=8.5in,11inŸ†áóþÖëI½q½qecss2074»Grace–fÑUser's“Guide“(fo‘ÿwmr“Grace-5.1.23)ޤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹b¸èy–U the“Grace“T‘ÿ*¸eam’S÷30.09.2012Ž¡Ÿ&°–¬óŒ6 ecss1000¼This›«doGcument“explains“the˜usage“of“ó»y&³ ecsx1000½Grace¼,‘pŽa“WYSIWYG‘<2D‘=plotting“toGol˜fo¸èr“numerical“data.‘ €#(A‘>/Subtype /Link H.B /ANN pdfmark endï color pop‘U ¼.)ŽŸ(Àœó&Lt$ffffecbx1440ÁCon•cten“tsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.1) cvn /DEST pdfmark endŸñžïcolor push rgb 0 0 1ïps:SDict begin H.S endó]fŒ ecbx1000Â1Ž‘ÿIn®>troQÂductionïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’Ÿm5ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹1.1Ž‘þ‘What–U is“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÀM‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.2Ž‘þ‘Cop•¸èyrigh“t›U statemen“t˜ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Òó‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ2Ž‘ÿInstallation–Õguide“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’e=J6ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹2.1Ž‘þ‘Installing–U from“sources“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Z7‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.2Ž‘þ‘Binary–U installation“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘=O‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.3Ž‘þ‘Alternativ•¸èe›U pac“k‘ÿqÐaging˜sc“hemes˜(RPM,˜...)‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘È‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ3Ž‘ÿGetting–Õstarted“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’oNp8ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹3.1Ž‘þ‘General–U concepts“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘À‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.1Ž‘ýþPro‘Ž0ject–U les“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘½A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.2Ž‘ýþP¸èarameter–U les“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘(‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.3Ž‘ýþInput–U le“formats“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘~-‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.4Ž‘ýþGraphs‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘À'‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.5Ž‘ýþDatasets‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘™5‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.6Ž‘ýþSets‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘-é‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.7Ž‘ýþRegions‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘|½‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.8Ž‘ýþReal–U Time“Input“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘EE‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.9Ž‘ýþHotlinks‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.10Ž‘ýþDevices‘U ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘™‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.11Ž‘ýþMagic–U path“ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.11) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘gù‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.12Ž‘ýþDynamic–U moGdules“ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.12) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘þE‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.1.13Ž‘ýþCoGordinate–U frames“ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.1.13) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘“Á‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.2Ž‘þ‘In•¸èv“oGcation‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘-§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.2.1Ž‘ýþOp•Gerational›U mo“de˜ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘S¥‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŽŒ‹*ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.2) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹2Ž’ÕÁGï color popŽŽ £n ýˆ.\‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.2.2Ž‘ýþCommand–U line“options“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¢‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popޤؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3Ž‘þ‘Customization‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘.W‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3.1Ž‘ýþEn•¸èvironmen“t–U v‘ÿqÐariables“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.3.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3.2Ž‘ýþInit–U le“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.3.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ )‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3.3Ž‘ýþDefault–U template“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.3.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popoý‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3.4Ž‘ýþX–U resources“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.3.3.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¯!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽŸØïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ4Ž‘ÿGuide–Õto“the“graphical“user“in®>terface“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’ý717ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹4.1Ž‘þ‘GUI–U con¸ètrols“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘?å‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.1.1Ž‘ýþFile–U selection“dialogs“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘E½‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.1.2Ž‘ýþList–U selectors“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘è9‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2Ž‘þ‘The–U main“windo¸èw“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘„7‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2.1Ž‘ýþThe–U can¸èv‘ÿqÐas“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘/ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2.2Ž‘ýþT‘ÿ*¸oGolbar–U buttons“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÓU‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3Ž‘þ‘File–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘à ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.1Ž‘ýþNew‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ø©‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.2Ž‘ýþOpGen‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘.‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.3Ž‘ýþSa•¸èv“e‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popJy‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.4Ž‘ýþSa•¸èv“e–U as“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ñ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.5Ž‘ýþRevš¸èert–U to“sa˜v˜ed“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘/¡‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.6Ž‘ýþPrin¸èt–U setup“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘½I‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.7Ž‘ýþPrin¸èt‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘É‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3.8Ž‘ýþExit‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.3.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘CM‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4Ž‘þ‘Edit–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.1Ž‘ýþData–U sets“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘D‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.2Ž‘ýþSet–U opGerations“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘%‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.3Ž‘ýþArrange–U graphs“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ó%‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.4Ž‘ýþOv•¸èerla“y–U graphs“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popvÑ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.5Ž‘ýþAutoscale‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ËI‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.6Ž‘ýþRegions–U men¸èu“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¨E‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.7Ž‘ýþHot–U links“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘K!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black24Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.8Ž‘ýþSet–U lošGcator“xed“p˜oin¸èt“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Åý‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black24Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.9Ž‘ýþClear–U lošGcator“xed“p˜oin¸èt“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘™‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black24Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.10Ž‘ýþLoGcator–U props“ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘š ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black24Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹{-ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.3) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹3Ž’ÕÁGï color popŽŽ £n ýˆ.\‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4.11Ž‘ýþPreferences‘U ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.4.11) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¶-‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black25Ž‘wŸï color popޤؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5Ž‘þ‘Data–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ŠC‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black25Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5.1Ž‘ýþData–U set“opGerations“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.5.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘0Q‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black25Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5.2Ž‘ýþT‘ÿ*¸ransformations–U men¸èu“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.5.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘[Y‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black25Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5.3Ž‘ýþF‘ÿ*¸eature–U extraction“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.5.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Å…‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black28Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5.4Ž‘ýþImpGort–U men¸èu“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.5.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘a%‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black29Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5.5Ž‘ýþExpGort–U men¸èu“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.5.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘=™‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black29Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6Ž‘þ‘Plot–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘˜K‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black29Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6.1Ž‘ýþPlot–U appGearance“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.6.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘vé‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black29Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6.2Ž‘ýþGraph–U appGearance“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.6.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘×K‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black29Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6.3Ž‘ýþSet–U appGearance“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.6.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popE ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black30Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6.4Ž‘ýþAxis–U propGerties“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.6.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black30Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7Ž‘þ‘View–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.1Ž‘ýþSho¸èw–U loGcator“bar“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¾ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.2Ž‘ýþSho¸èw–U status“bar“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ 5‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.3Ž‘ýþSho¸èw–U toGol“bar“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‹Õ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.4Ž‘ýþP¸èage–U setup“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘nõ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.5Ž‘ýþRedra¸èw‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Y!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7.6Ž‘ýþUpGdate–U all“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.7.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘1‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black31Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8Ž‘þ‘Windo•¸èw›U men“u˜ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ƒ§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8.1Ž‘ýþCommands‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.8.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘/ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8.2Ž‘ýþP•¸èoin“t›U trac“king˜ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.8.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ké‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8.3Ž‘ýþDra¸èwing–U ob‘Ž0jects“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.8.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘h±‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8.4Ž‘ýþF‘ÿ*¸on¸èt–U toGol“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.8.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘5Í‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8.5Ž‘ýþConsole‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.8.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ I‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9Ž‘þ‘Help–U men¸èu“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ê/‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.1Ž‘ýþOn–U con¸ètext“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘=A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.2Ž‘ýþUser's–U guide“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¶5‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.3Ž‘ýþT‘ÿ*¸utorial‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popCí‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.4Ž‘ýþF‘þã A¸èQ‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘_¥‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black32Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.5Ž‘ýþChanges‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.6Ž‘ýþExamples‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘5í‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.7Ž‘ýþCommen¸èts‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘®á‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.8Ž‘ýþLicense–U terms“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘öi‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ئïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.4) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹4Ž’ÕÁGï color popŽŽ £n ýˆ.\‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9.9Ž‘ýþAbGout‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.4.9.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop©‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽŸØïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ5Ž‘ÿCommand–Õin®>terpreter“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’Ij 33ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹5.1Ž‘þ‘General–U notes“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘j•‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.2Ž‘þ‘Denitions‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘߃‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black33Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.3Ž‘þ‘V‘ÿ*¸ariables‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘&c‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black35Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.4Ž‘þ‘Numerical–U opGerators“and“functions“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ž ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black35Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.5Ž‘þ‘ProGcedures‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘´ë‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black35Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.6Ž‘þ‘Device–U parameters“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘R“‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.7Ž‘þ‘Flo•¸èw›U con“trol˜ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘æç‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.8Ž‘þ‘Declarations‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘fß‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.9Ž‘þ‘Graph–U propGerties“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popkM‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.9.1Ž‘ýþCommand–U opGerations“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.9.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘E‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.9.2Ž‘ýþP¸èarameter–U settings“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.9.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Åm‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black36Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.10Ž‘þ‘Set–U propGerties“ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.5.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ÿ÷‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black38Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.10.1Ž‘ýþCommands‘U ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.10.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘/ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black38Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.10.2Ž‘ýþP¸èarameter–U settings“ïps:SDict begin 13.68 H.L endï…ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.10.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Åm‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black40Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ6Ž‘ÿA®>dv‘ÿ\|anced–Õtopics“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’e7õ40ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹6.1Ž‘þ‘F‘ÿ*¸on¸èts‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Þ«‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black40Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.1.1Ž‘ýþF‘ÿ*¸on¸èt–U conguration“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ì¡‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black40Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.1.2Ž‘ýþF‘ÿ*¸on¸èt–U data“les“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ýµ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black47Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.1.3Ž‘ýþCustom–U fon¸èts“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.1.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popv‰‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black47Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2Ž‘þ‘In¸èteraction–U with“other“applications“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Αü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black48Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2.1Ž‘ýþUsing–U pipGes“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popvA‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black48Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2.2Ž‘ýþUsing–U grace_np“library“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘8 ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black48Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.3Ž‘þ‘FFTW–U tuning“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Xï‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black51Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.4Ž‘þ‘DL–U moGdules“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘­ç‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black51Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.4.1Ž‘ýþF‘ÿ*¸unction–U t¸èypGes“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.4.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Äõ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black52Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.4.2Ž‘ýþExamples‘U ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.4.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘5í‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black52Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end6.4.3Ž‘ýþOpGerating–U system“issues“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.6.4.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popFu‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black54Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ7Ž‘ÿReferences‘Õïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’r£55ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹7.1Ž‘þ‘T¸èypGesetting‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop_‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black55Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2Ž‘þ‘Device-spGecic–U limitations“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popb ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black57Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹:Ãïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.5) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ1.‘ñ8In®>troQÂduction’|¹5Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.3Ž‘þ‘Device-spGecic–U settings“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ák‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black57Ž‘wŸï color popޤؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.4Ž‘þ‘Dates–U in“Grace“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black59Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.5Ž‘þ‘Xmgr–U to“Grace“migration“guide“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘&M‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black61Ž‘wŸï color popŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.1) cvn /DEST pdfmark endŸ¾Á1Ž‘ÁInctropœductionŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.1) cvn /DEST pdfmark endŸ jó¥!¢N ecbx1200Ä1.1Ž‘¾What–¸is“Grace?ŽŸMª¹Grace–u is“a–u WYSIWYG‘utoGol“to–u makš¸èe“t˜w˜o-dimensional“plots“of“n˜umerical›u data.‘ÑDIt“runs“under˜v‘ÿqÐarious“(if“notޤ ®all)›Ä-a•¸èv“ors˜of–Ä,Unix˜with˜X11˜and˜M*tif“(LessTif˜or˜Motif‘Ç).‘¾¦It˜also˜runs˜under“VMS,˜OS/2,‘ßðand˜Windo¸èwsŽ¡(95/98/NT/2000/XP).–©ËIts›©Ìcapabilities“are˜roughly“similar“to˜GUI-based“programs˜lik¸èe“Sigmaplot˜or“MicroGcalŽ¡Origin–5¿plus›5Àscript-based“toGols“lik•¸èe˜Gn“uplot–5¿or“Genplot.‘^Its“strength˜lies“in“the˜fact“that“it˜com¸èbines“theŽ¡con•¸èv“enience–¡Nof“a‘¡Mgraphical“user“inš¸èterface“with“the“pGo˜w˜er‘¡Mof“a“scripting“language“whic˜h“enables‘¡Mit“to“doŽ¡sophisticated–U calculations“or“pGerform“automated“tasks.ޤؼGrace–U is“derivš¸èed“from“Xmgr“(a.k.a.‘q€A˜CE/gr),“originally“written“b˜y“P˜aul“T‘ÿ*¸urner.Ž¡F‘ÿ*¸rom–Ojvš¸èersion“n˜um˜bGer“4.00,‘Pthe“dev˜elopmen˜t“w˜as‘Oktak˜en“o˜v˜er“b˜y“a“team“of‘Okv˜olun˜teers“under“the“coGordinationޤ ®of‘¤Evgen•¸èy›¤Stam“bulc“hik.‘^bY‘ÿ*¸ou˜can–¤get“the˜new¸èest“information“abGout˜Grace“and“do¸èwnload“the˜latest“v¸èersionŽ¡at–U the“ó½HЃ ecti1000ÅGr–ÿ}/ac“e–“°home“p‘ÿ}/age–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/ï color popŸù¨ïps:SDict begin H.R endŽï°ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž©ؼWhen›/Ëits‘/Êcop•¸èyrigh“t˜w“as˜c“hanged–/Êto˜GPL,˜the“name˜wš¸èas“c˜hanged–/Ëto“Grace,‘fuwhic˜h“stands‘/Êfor“GRaphing,Ž¡A¸èdv‘ÿqÐanced–¦"Computation›¦!and“Exploration“of˜data‘{jor“Grace“Rev‘ÿqÐamps˜Aš¸èCE/gr.‘d…The“rst“v˜ersion‘¦!of“GraceŽ¡aš¸èv‘ÿqÐailable–U is“named“5.0.0,“while“the“last“public“v˜ersion“of“Xmgr“has“the“v˜ersion“n˜um˜bGer“4.1.2.ަPš¸èaul–U still“main˜tains“and“dev˜elops“a“non-public“v˜ersion“of“Xmgr“for“in˜ternal“use.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.2) cvn /DEST pdfmark endŸ.ÂÄ1.2Ž‘¾Cop• yrigh“t‘¸statemen“tŽŸÿ+ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘óqLË ectt0900ÇCopyright–¹N((C))“1991-1995“Paul“J“Turner,“Portland,“ORޤ Š=‘Copyright–¹N((C))“1996-2012“Grace“Development“TeamŽ¡¡‘Maintained–¹Nby“Evgeny“StambulchikŽ¡¡¡’ All–¹NRights“ReservedŽ¡¡‘This–¹Nprogram“is“free“software;“you“can“redistribute“it“and/or“modifyŽ¡‘it–¹Nunder“the“terms“of“the“GNU“General“Public“License“as“published“byŽ¡‘the–¹NFree“Software“Foundation;“either“version“2“of“the“License,“orŽ¡‘(at–¹Nyour“option)“any“later“version.Ž¡¡‘This–¹Nprogram“is“distributed“in“the“hope“that“it“will“be“useful,Ž¡‘but–¹NWITHOUT“ANY“WARRANTY;“without“even“the“implied“warranty“ofŽ¡‘MERCHANTABILITY–¹Nor“FITNESS“FOR“A“PARTICULAR“PURPOSE.“See“theŽ¡‘GNU–¹NGeneral“Public“License“for“more“details.Ž¡¡‘You–¹Nshould“have“received“a“copy“of“the“GNU“General“Public“LicenseŽ¡‘along–¹Nwith“this“program;“if“not,“write“to“the“Free“SoftwareŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹‘³ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.6) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ2.‘ñ8Installation‘Õguide’fîö¹6Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÇFoundation,–¹NInc.,“675“Mass“Ave,“Cambridge,“MA“02139,“USA.ŽŸؼ¹F‘ÿ*¸or–ycertain›zlibraries“required“to˜build“Grace“(whic¸èh˜are“therefore“ev¸èen“included˜in“a“suitable˜v¸èersion)“thereޤ ®ma•¸èy›É®bGe‘É­dieren“t˜Cop“yrigh“t/License˜statemen“ts.‘Ï)Though˜their‘É­License˜ma“y˜b“y‘É­c“hance˜matc“h˜the‘É­one˜usedŽ¡for–U Grace,“the“Grace“Cop•¸èyrigh“t–U holders“can“not“inuence“or“c¸èhange“them.ŽŸonYŸžƒOïcolor push BlackŸa|±ŸÃÐ’¨£ïcolor push Blackï color popŽŽ’­£ŸÛ‰ff{ˆ¤ “q‘P•¸èac“k‘ÿqÐageŽ‘NíúLicenseŽŽ©‰ff{ˆ¡‘cephes‘U libraryŽ‘NíúF‘ÿ*¸reeŽŽ¤ ®‘T1libŽ‘NíúLGPLŽŽ¡‘XbaeŽ‘NíúBSD-lik¸èeŽŽ¡‘T‘ÿ*¸ab‘U WidgetŽ‘NíúBSD-lik¸èeŽŽ¦‰ff{ˆŽŽŽŸusually“compiles“out“of“the‘þ?bGo˜x“in“a“regular“Unix-lik˜e“en˜vironmen˜t.‘lÚY‘ÿ*¸ouŽ¡‘/need‘ óan› òANSI– ÃC“compiler˜(gcc– óis˜just“ne),‘<'the“X11R5˜or“abGo•¸èv“e˜libraries– óand˜headers,‘<'and“anŽ¡‘/implemenš¸ètaion–i:of“the“M*tif“API,“v˜ersion“1.2“or“abGo˜v˜e.‘­ÏIf“y˜ou“w˜an˜t“to“compile“y˜our“o˜wn“c˜hangesŽ¡‘/to–U certain“parts“of“Grace,“y¸èou“will“need“a“parser“generator“(¿yacc“¹or,“bGetter,“¿bison¹).Ž©®‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¹Extra–ø™libraries.‘[êSome“features“will›ø˜bGe“a¸èv‘ÿqÐailable“only“if˜additional“libraries“are“installed.‘[êThoseŽ¡‘/are:ަ‘/ïcolor push Black‘óÂŽ‘ ³1ï color popŽŽ‘A³3¹The›‘ïJPEG‘‘àbac•¸èk“end˜needs–‘ðthe˜IJG's˜(“ÅJPEG‘Ë“libr‘ÿ}/ary“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿ftp://ftp.uu.net/graphics/jpeg/ï color popŸù¨ïps:SDict begin H.R endŽï§ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (ftp://ftp.uu.net/graphics/jpeg/) >>/Subtype /Link H.B /ANN pdfmark endï color pop˜¹),Ž¡‘A³3v¸èersion‘U 6.x.Ž©®‘/ïcolor push Black‘óÂŽ‘ ³1ï color popŽŽ‘A³3¹The›ÌrPNG‘ÌSbac•¸èk“end–Ìqneeds˜the“(˜Ålibpng˜ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.libpng.org/pub/png/libpng.htmlï color popŸù¨ïps:SDict begin H.R endŽï±ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.libpng.org/pub/png/libpng.html) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹)˜li-Ž¡‘A³3brary–U (vš¸èersion“0.96“or“abGo˜v˜e).ަ‘/ïcolor push Black‘óÂŽ‘ ³1ï color popŽŽ‘A³3¹The–zYPDF‘z#driv¸èer“requires“the›zZPDFlib“library˜of“Thomas˜Merz“to˜bGe“installed,‘¦whic¸èh˜is“a¸èv‘ÿqÐailableŽ¡‘A³3Åher‘ÿ}/e–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.pdflib.com/ï color popŸù¨ïps:SDict begin H.R endŽïžps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.pdflib.com/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹,“vš¸èersion“4.0.3“or“abGo˜v˜e.ަ‘/ïcolor push Black‘óÂŽ‘ ³1ï color popŽŽ‘A³3¹If–nÒy¸èour›nÓcomputer“has“the˜FFTW‘n˜library“installed“when˜Grace“is“compiled,‘œâGrace“will˜link“itselfŽ¡‘A³3to–¥Üthis,‘º and“drop›¥Ûall“con•¸èv“en“tional˜FFT's–¥Üand˜DFT's.‘c³All“transforms˜will“bGe˜routed“throughŽ¡‘A³3this–¥Épac¸èk‘ÿqÐage.‘c|Note“that›¥Êthere“is“then“no˜dierence“bGet•¸èw“een–¥Épushing“the˜"FFT"“button“andŽ¡‘A³3the–9ò"DFT"“button,›?aexcept“that“FFT‘9ëwill“complain“if‘9ñthe“length“isn't“a“pGo•¸èw“er–9òof“2,˜and“DFTŽ¡‘A³3will‘U not.Ž¡‘A³3F‘ÿ*¸or–U more“information“on“this“pac¸èk‘ÿqÐage,“see“theŽ¡‘A³3ÅFFTW‘¦_Home‘¦§p‘ÿ}/age–ÿïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.fftw.orgï color popŸù¨ïps:SDict begin H.R endŽï›ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.fftw.org) >>/Subtype /Link H.B /ANN pdfmark endï color pop›€¹.‘ò In“short,‘ʸthis˜pac•¸èk‘ÿqÐage˜allo“ws˜one‘ÿto˜do˜non-Ž¡‘A³3pGo•¸èw“er-of-2–æIlength›æHFFT's“along“with“the˜normal“ones.‘LŽIt“seems˜to“wš¸èork“v˜ery“ecien˜tly‘æHfor“an˜yŽ¡‘A³3set–ÐOlength“whicš¸èh“factors‘ÐNin˜to“2a“3b“5c“7d“for‘ÐNin˜teger“a,–ïb,‘ïc,“d.‘ã The–ÐOgreat“feature“hereŽ¡‘A³3is–ÇÜthat›ÇÝset“lengths˜whic¸èh“are˜pGo•¸èw“ers–ÇÜof˜10“(e.g.‘ɶ1000,‘äŒ10000)“and˜inš¸èteger“m˜ultiples‘ÇÝof“theseŽ¡‘A³3(500,–Jz2000,‘Jy2500,“5000,“etc.)‘mcan–GÐbšGe“computed“with“no“signican•¸èt‘GÑp˜enalt“y‘GÐ(ma“yb˜e–GÐ20%)“o•¸èv“erŽ¡‘A³3pšGo•¸èw“er-of-2–U transforms.‘q€V‘ÿ*¸ery“often,“real“datasets“come“in“these“sizes,“and“not“in“p˜o•¸èw“ers–U of“2.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ª!ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.7) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ2.‘ñ8Installation‘Õguide’fîö¹7Ž’ÕÁGï color popŽŽ £n ýˆ.\‘/ïcolor push Black‘óÂŽ‘ ³1ï color popŽŽ‘A³3¹In–Áforder“to“read/write“sets›Áein“the“NetCDF‘Ádata“format,‘xy¸èou˜will“also“need“the“ÅNetCDFޤ ®‘A³3libr‘ÿ}/aries–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://unidata.ucar.edu/packages/netcdf/index.htmlï color popŸù¨ïps:SDict begin H.R endŽïºps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://unidata.ucar.edu/packages/netcdf/index.html) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹.ŽŸ®‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¹Decide–fKwhether“y•¸èou›fLw“an“t–fKto“compile“in˜a“separate“place“(th•¸èus˜lea“ving–fKthe“source“tree˜pristine).‘!äY‘ÿ*¸ouŽ¡‘/most–kprobably“w•¸èould›lw“an“t–kit“if“compiling˜Grace“for“more“than˜one“OS‘Wand“k¸èeeping˜the“sources“inŽ¡‘/a–0bcen¸ètral“shared–0c(e.g.›e@via“NFS)‘0YloGcation.˜If“y¸èou–0bdon't“need“it,‘7¼skip“the“rest“of‘0cthis“paragraph“andŽ¡‘/go–*Frigh¸èt“to“the›*Gnext“step.‘c7Otherwise,‘2Øassuming“the˜sources“are“in“¿/usr/local/src/grace-x.y.zŽ¡‘/¹and–U the“compilation“will“bšGe“p˜erformed“in“¿/tmp/grace-obj¹,“do“the“follo¸èwing:Ž©®‘*ïcolor push Blackï color popŽŽ‘9Z¿%–?¬mkdir“/tmp/grace-objŽ¡‘9Z%–?¬cd“/tmp/grace-objŽ¡‘9Z%–?¬/usr/local/src/grace-x.y.z/ac-tools/shtool“mkshadow“\Ž¡‘Cþ²/usr/local/src/grace-x.y.z‘?¬.Ž¡¦‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¹The–Ü$¿configure“¹shell“script“attempts“to“guess‘Ü%correct“v›ÿqÐalues“for“v˜arious“system-depGenden¸èt“v˜ari-Ž¡‘/ables–sused“during“compilation.‘öyIt“uses‘tthose“v‘ÿqÐalues“to“create“¿Make.conf“¹in“the“top“directoryŽ¡‘/of–kJthe“pacš¸èk‘ÿqÐage.‘³þIt“also“create‘kI¿config.h“¹le“con˜taining“system-depGenden˜t“denitions.‘³þFinally‘ÿ*¸,Ž¡‘/it–8”creates“a“shell“script“¿config.status“¹that“yš¸èou‘8•can“run“in“the“future“to“recreate“the“curren˜tŽ¡‘/conguration,‘8¯a– ,le“¿config.cache› -¹that“sa•¸èv“es– ,the“results“of“its“tests˜to“spGeed“up“reconguring,Ž¡‘/and–Ý*a›Ý+le“¿config.log“¹con¸ètaining˜compiler“output“(useful˜mainly“for˜debugging“¿configure¹).‘ ŸIfŽ¡‘/at–;ásome‘;âpGoinš¸èt“¿config.cache“¹con˜tains“results‘;ây˜ou“don't“w˜an˜t‘;âto“k˜eep,‘@îy˜ou“ma˜y“remo˜v˜e“or‘;âedit“it.ޤ®‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¹Run–U ¿./configure‘?¬help“¹to“get“list“of“additional“switc¸èhes“spGecic“to“GraceŽ¡‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¹Run–U ¿./configure‘?¬ó  b> cmmi10µ<¿optionsµ>¹.‘q€Just“an“example:ަ‘*ïcolor push Blackï color popŽŽ‘9Z¿%–?¬./configure“--enable-grace-home=/opt/graceޤ ®‘Cþ²--with-extra-incpath=/usr/local/include:/opt/include‘?¬\Ž¡‘Cþ²--with-extra-ldpath=/usr/local/lib:/opt/lib‘?¬--prefix=/usrŽ¡¦‘/¹w¸èould–º_use“¿/usr/local/include“¹and“¿/opt/include“¹in‘º`addition“to“the“default“include“path“andŽ¡‘/¿/usr/local/lib–ǹand›Æ¿/opt/lib“¹in“addition˜to“the˜default“ld“path.‘[·As“wš¸èell,‘ Øall“stu“w˜ould‘ÆbGe“putŽ¡‘/under–­Üthe“/opt/grace“directory‘­Ûand“soft“links“made“to“¿/usr/bin¹,‘Ä ¿/usr/lib“¹and“¿/usr/include¹.Ž¡‘/ÂNote¹:‘>Q–U ¹(in“the“¿doc“¹directory).ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.3) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘T‘ÿ*¸estingŽŸ®‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¿make‘?¬tests–U ¹This“will“givš¸èe“y˜ou“a“slide“sho˜w“demonstrating“some“nice“features“of“Grace.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.4) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Installationަ‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¿make‘?¬installŽŸ®‘ïcolor push Black‘ ÿÿ¸Ž‘ï color popŽŽ‘/¿make‘?¬links–a£¹The›a¢later“(optional)˜step“will“mak¸èe˜soft“links˜from“some“les˜under“the˜Grace“homeŽ¡‘/directory–to›‘the“system-wide“default˜lošGcations“(can“b˜e‘‘cš¸èhanged“b˜y›‘the“¿prefix“¹option˜during“theŽ¡‘/conguration,–U see“abGo•¸èv“e).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹Âïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.8) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’q¹8Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.2) cvn /DEST pdfmark endŸ Ä2.2Ž‘¾Binary‘¸installationŽŸÊïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.5) cvn /DEST pdfmark endŸXäïcolor push Black‘ 9b¹1.Ž‘ï color popŽŽ‘Getting–U pre-built“pac¸èk‘ÿqÐagesŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.6) cvn /DEST pdfmark end¤¼lïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘InstallationŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.7) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘Running‘U testsŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.3) cvn /DEST pdfmark endŸ.ÂÄ2.3Ž‘¾Alternativ• e›¸pac“k‘ÿ@ aging˜sc“hemes˜(RPM,˜...)ŽŸMª¹Not–U written“y¸èet...ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.3) cvn /DEST pdfmark endŸ¾Á3Ž‘ÁGetting‘G\startedŽŸ¿:¹F‘ÿ*¸or–ëza“jump-in“start,‘yš¸èou“can“bro˜wse“the“demos“("Help/Examples"“men˜u“tree).‘4ŽThese“are“ordinary“GraceŽŸ ®pro‘Ž0jects,–U so“yš¸èou“can“pla˜y“with“them“and“moGdify“them.‘q€Also,“read“the“ÅT‘ÿ;Èutorial“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 1¿Tutorial.htmlï color popŸùãðïps:SDict begin H.R endŽï•ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (Tutorial.html) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹.ŽŸؼO.k.‘q€Here's–U a“VER‘ÿ*¸Y“quicš¸èk“in˜troGduction:ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.8) cvn /DEST pdfmark end¡ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Start–U the“GUI“v¸èersion:‘q€xmgrace“(return).ޤØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.9) cvn /DEST pdfmark end©.<ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Select/c•¸èhec“k–U the“output“medium“and“can¸èv‘ÿqÐas“size“in“File/Device“Setup.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.10) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘If–U needed,“set“the“graph“size“('ViewpšGort'“in“Plot/Graph“App˜earance).Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.11) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Load–¨þy¸èour›¨ýdata“with“Data/Imp•Gort/ASCI“I.˜'Load–¨þas':‘;'Single“set'“for˜t•¸èw“o-column‘¨þASCI•GI‘¨èdata,‘½õ'Blo“c¸èkޤ ®‘data'–U for“m¸èulti-column“ASCIGI“data.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.12) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Aš¸èdjust–×úthe“scales,‘ø°axis“labGels“and“tic˜k“marks“in“Plot/Axis“propGerties.‘ú A˜c˜kno˜wledge“all“c˜hanges“withŽ¡‘'Apply'.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.13) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘Aš¸èdjust–U lines,“sym˜bšGols,“legends“in“Plot/Set“app˜earance.ޤØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.14) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b7.Ž‘ï color popŽŽ‘Aš¸èdjust–U titles,“plot“frame“and“legend“displa˜y“in“Plot/Graph“AppGearance.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.15) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b8.Ž‘ï color popŽŽ‘Data–…–can›…•bGe“manipulated˜in“Data/T–ÿ*¸ransformations.‘áT“o˜shift–…–a˜data“set“b¸èy˜20“to˜the“left,–ѳe.g.,“inޤ ®‘'Ev‘ÿqÐaluate–×3Expression'›×2select“the˜same“set˜on“the˜left“and˜the“righ•¸èt,‘ðband˜sa“y›×3F‘ÿ*¸orm“ula:‘2‰y=y-20.‘G†As˜y“ou'llŽ¡‘probably–U notice,“Grace“can“do“MUCH“more“than“that.‘q€Explore“at“y¸èour“leisure.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.16) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b9.Ž‘ï color popŽŽ‘When–U yš¸èou“lik˜e“y˜our“plot,“select“File/Prin˜t.‘q€That's“it!ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.1) cvn /DEST pdfmark endŸ ’Ä3.1Ž‘¾General‘¸conceptsŽŸÊïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.1) cvn /DEST pdfmark endŸƒŒÂ3.1.1Ž‘#!\Pro‘£„ject‘ÕlesŽŸMª¹A‘¬Ppro‘Ž0ject–¬¨le“con¸ètains“all“information›¬©necessary“to“restore“a“plot˜created“bš¸èy“Grace,‘Šas“w˜ell‘¬©as“some“ofŽ¡preferences.‘>QEacš¸èh–î»plot“is‘îºrepresen˜ted“on“a“single“page,‘"but“ma˜y‘îºha˜v˜e“an“unlimited“n˜um˜bGer“of“graphs.Y‘ÿ*¸ouŽ¡create–U a“pro‘Ž0ject“le“of“yš¸èour“curren˜t“graph“with“File/Sa˜v˜e,Sa˜v˜e“as.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ×(ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.9) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’q¹9Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.2) cvn /DEST pdfmark endŸ Â3.1.2Ž‘#!\P®>arameter‘ÕlesŽ©Mª¹A‘E›parameter–EÚle“con¸ètains›EÙthe“detailed˜settings“of˜y¸èour“pro‘Ž0ject.‘C¬It“can˜bGe“used˜to“transfer˜these“settingsޤ ®to–—¯a›—°dieren¸èt“plot/pro‘Ž0ject.‘9/Y‘ÿ*¸ou“generate˜a“parameter˜le“with˜File/Sa•¸èv“e‘—¯men“u˜en“try–—¯selected˜from“theŽ¡"Plot/Graph–U appšGearance“p˜opup".‘q€Y‘ÿ*¸ou“can“load“the“settings“con¸ètained“in“a“parameter“le“with“File/Op˜en.ŽŸs·ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.3) cvn /DEST pdfmark endŸXäÂ3.1.3Ž‘#!\Input–Õle“formatsަ¹Grace–|'understands›|(sev¸èeral“input“les“formats.‘æ–The˜most“basic“one“is˜ASCIGI‘|text“les“con¸ètaining˜space“andŽ¡comma–4separated“columns“of›4data.‘/The“data“elds“can˜bšGe“either“n¸èumeric“(F‘ÿ*¸ortran“'d'“and“'D'‘3Ìexp˜onen¸ètŽ¡mark¸èers–׿are›×åalso“suppGorted)“or˜alphan¸èumeric“(with“or“without˜quotes).‘ùÑSev¸èeral“calendar“date˜formats“areŽ¡recognized–‰@automatically“and“yš¸èou“can“spGecify“y˜our“o˜wn“reference‘‰?for“n˜umeric“date“formats.‘ àLines“bGeginnigŽ¡with–ö¼"#"›ö»are“ignored.‘ VSBlank“lines˜indicate“new“dataset.‘ VRGrace“also“has˜a“command“language˜(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 15ï color popŸù•¼ïps:SDict begin H.R endŽïzps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section.5) cvn H.B /ANN pdfmark endï color popŽ¡(command›°Cin•¸èterpreter)),‘Ç y“ou˜can–°Binclude˜commands˜in“data˜les“using˜lines˜ha¸èving“"@"˜as˜their“rst˜non-Ž¡blank–Îåc¸èharacter,›é¾though“this“is“not“recommended.‘DÂDepGending“on“conguration,˜Grace“can“also“read“NetCDFŽ¡les–U (see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11ï color popŸù•¼ïps:SDict begin H.R endŽïwps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (Item.1) cvn H.B /ANN pdfmark endï color pop“(conguration)).ŽŸs¸ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.4) cvn /DEST pdfmark endŸXäÂ3.1.4Ž‘#!\Graphsަ¹A‘4Ýgraph‘4äconsists–4åof“(evš¸èery“elemen˜t›4äis“optional):‘aba“graph“frame,–;Waxes,“a–4åtitle˜and“a“subtitle,‘;Wa“n•¸èum“bGer˜of‘4åsetsŽ¡and–U additional“annotativš¸èe“ob‘Ž0jects“(time“stamp“string,“text“strings,“lines,“bGo˜xes“and“ellipses).ŽŸؼThe–U graph“t¸èypšGe“can“b˜e“an¸èy“of:ŽŸ¬µïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XY‘U GraphŽ©˜ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XY‘U Chartޤ˜ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹P¸èolar‘U GraphŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Fixed‘U Graphަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Pie‘U c¸èhartŽŸ¬µThe–ö idea›ö of“"XY‘õàChart"“is“to˜plot“bars“(or˜sym¸èbGols“in“general)˜of“sev¸èeral“sets“side˜b¸èy“side,‘Dassuming“theޤ ®abscissas–U of“all“the“sets“are“the“same“(or“subsets“of“the“longest“set).ŽŸs¸ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.5) cvn /DEST pdfmark end©XäÂ3.1.5Ž‘#!\DatasetsŽŸMª¹A‘‹Ÿdataset›‹Óis–‹Òa“collection˜of“pGoin¸èts“with˜x“and“y˜coGordinates,‘´up“to˜four“optional“data˜v‘ÿqÐalues“(whic¸èh,‘´depGendingŽ¡on–U the“set“t¸èypšGe,“can“b˜e“displa•¸èy“ed–U as“error“bars“or“likš¸èe)“and“one“optional“c˜haracter“string.ŽŸs·ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.6) cvn /DEST pdfmark end¦Â3.1.6Ž‘#!\SetsŽŸMª¹A‘tÝset–tåis›tæa“w•¸èa“y–tåof“represen¸èting“datasets.‘ÐÐIt“consists˜of“a“pGoin¸èter“to˜a“dataset“plus“a˜collection“of“parametersŽ¡describing–U the“visual“appGearance“of“the“data“(lik¸èe“color,“line“dash“pattern“etc).ޤؼThe–U set“t¸èypšGe“can“b˜e“anš¸èy“of“the“follo˜wing:Ž¡Not–U all“set“tš¸èypGes,“ho˜w˜ev˜er,“can“bGe“plotted“on“an˜y“graph“t˜ypGe.‘q€The“follo˜wing“table“summarizes“it:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ îïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.10) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹10Ž’ÕÁGï color popŽŽ £nŸ”÷D þT?Õïcolor push Black «À+ ÿµ‡‘ ÔTïcolor push Blackï color popŽŽ‘ÔT ÿ6ð´‰ff°Ÿ¤ “q‘Set‘U t¸èypGeŽ‘\m!#–U of“n¸èum.‘q€colsŽ’ªyDescriptionŽŽŽŽŸ‰ff°Ÿ¡‘XYŽ‘z¹u2Ž’ªyAn–úXX-Y‘ú.scatter“and/or›úYline“plot,‘#¦plus“(optionally)˜an“an-ŽŸ ®’ªynotated‘U v‘ÿqÐalueŽŽŽŽ¤\'‘XYD¸èXŽ‘z¹u3Ž’ªySame–das“XY,›cbut“with“error“bars“(either˜one-“or“t•¸èw“o-sided)ŽŸ ®’ªyalong–U X“axisŽŽŽŽ¡‘XYD¸èYŽ‘z¹u3Ž’ªySame–U as“XYD¸èX,“but“error“bars“are“along“Y“axisŽŽŽŽ© ®‘XYD•¸èXD“XŽ‘z¹u4Ž’ªySame–Nas“XYDš¸èX,‘Mbut“left“and“righ˜t“error‘Mbars“are“denedŽŸ ®’ªyseparatelyŽŽŽŽ¡‘XYD•¸èYD“YŽ‘z¹u4Ž’ªySame–U as“XYD•¸èXD“X,–U but“error“bars“are“along“Y“axisŽŽŽŽ¦‘XYD•¸èXD“YŽ‘z¹u4Ž’ªySame–ºkas“XY,“but‘ºjwith“X›ºQand“Y˜error‘ºjbars“(either“one-“orŽŸ ®’ªyt•¸èw“o-sided)ŽŽŽŽ¡‘XYD•¸èXD“XD“YD“YŽ‘z¹u6Ž’ªySame›jUas‘jVXYD•¸èXD“Y,˜but‘jVleft/righ“t˜and‘jVuppGer/lo“w“er˜errorŽŸ ®’ªybars–U are“dened“separatelyŽŽŽŽ¡‘BARŽ‘z¹u2Ž’ªySame–U as“XY,“but“vš¸èertical“bars“are“used“instead“of“sym˜bGolsŽŽŽŽ¦‘BARD¸èYŽ‘z¹u3Ž’ªySame–b¨as“BAR,›b§but“with“error“bars“(either˜one-“or“t•¸èw“o-sided)ŽŸ ®’ªyalong–U Y“axisŽŽŽŽ¡‘BARD•¸èYD“YŽ‘z¹u4Ž’ªySame–߸as“BARDš¸èY,‘ß·but“lo˜w˜er“and“uppGer“error‘ß·bars“are“de-ŽŸ ®’ªyned‘U separatelyŽŽŽŽ¡‘XYHILOŽ‘z¹u5Ž’ªyHi/Lo¸èw/OpGen/Close‘U plotŽŽŽŽ¦‘XYZŽ‘z¹u3Ž’ªySame–Rôas“XY;›Rómak¸èes“no“sense“unless“the˜annotated“v‘ÿqÐalue“isŽŸ ®’ªyZŽŽŽŽ¡‘XYRŽ‘z¹u3Ž’ªyX,–U Y,“Radius.‘q€Only“allo•¸èw“ed–U in“Fixed“graphsŽŽŽŽ¦‘XYSIZEŽ‘z¹u3Ž’ªySame–U as“XY,“but“sym¸èbGol“size“is“v‘ÿqÐariableŽŽŽŽ¦‘XYCOLORŽ‘z¹u3Ž’ªyX,–U Y,“color“index“(of“the“sym¸èbGol“ll)ŽŽŽŽ¦‘XYCOLP–ÿ*¸A“TŽ‘z¹u4Ž’ªyX,–Å;Y,›Å‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹11Ž’ÕÁGï color popŽŽ £n þ¢LW þÛâïcolor push Black $û ÿ`ñS‘P´(ïcolor push Blackï color popŽŽ‘U´( ÿ{W‰ff*X÷¤ “q‘Set‘U t¸èypGeŽ‘\m!XY‘U GraphŽ’–Ÿ“XY‘U ChartŽ’Î‡FixedŽ’óKP¸èolarŽ’R»PieŽŽ©‰ff*X÷¡‘XYŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’úÓ³+Ž’r‰+ŽŽ¤ ®‘XYD¸èXŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYD¸èYŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYD•¸èXD“XŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYD•¸èYD“YŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYD•¸èXD“YŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYD•¸èXD“XD“YD“YŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘BARŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘BARD¸èYŽ‘o£ +Ž’¨°9+Ž’Ù&Õ-Ž’ý s-Ž’«I-ŽŽ¡‘BARD•¸èYD“YŽ‘o£ +Ž’¨°9+Ž’Ù&Õ-Ž’ý s-Ž’«I-ŽŽ¡‘XYHILOŽ‘o£ +Ž’ªèù-Ž’Ù&Õ-Ž’ý s-Ž’«I-ŽŽ¡‘XYZŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’úÓ³+Ž’«I-ŽŽ¡‘XYRŽ‘qÛÊ-Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYSIZEŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’úÓ³+Ž’«I-ŽŽ¡‘XYCOLORŽ‘o£ +Ž’¨°9+Ž’Öî+Ž’úÓ³+Ž’r‰+ŽŽ¡‘XYCOLP–ÿ*¸A“TŽ‘qÛÊ-Ž’ªèù-Ž’Ù&Õ-Ž’ý s-Ž’r‰+ŽŽ¡‘XYVMAPŽ‘o£ +Ž’ªèù-Ž’Öî+Ž’ý s-Ž’«I-ŽŽ¡‘XYBO¸èXPLOTŽ‘o£ +Ž’ªèù-Ž’Ù&Õ-Ž’ý s-Ž’«I-ŽŽ¦‰ff*X÷ŽŽŽ œŽÕ’—„ïcolor push BlackT‘ÿ*¸able›U 3:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.3) cvn /DEST pdfmark endï color pop“Graph/Set˜t¸èypGe˜connection˜ï color popŽŽŽï color popŽŸfïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.7) cvn /DEST pdfmark endŸ Â3.1.7Ž‘#!\RegionsޤMª¹Regions–Iare“sections›Iof“the“graph“dened“b¸èy“the˜in¸èterior“or“exterior“of“a˜pGolygon,‘Kror“a“half˜plane“dened“b¸èyŽ© ®a–U line.‘q€Regions“are“used“to“restrict“data“transformations“to“a“geometric“area“oGccupied“b¸èy“region.ŽŸ–öïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.8) cvn /DEST pdfmark endŸçÂ3.1.8Ž‘#!\Real–ÕTime“InputŽ¡¹Real–JTime“Input›Irefers“to“the“abilit¸èy˜Grace“has“to“bGe“fed˜in“real“time“b¸èy˜an“external“program.‘IýThe“GraceަproGcess–àspaš¸èwned“b˜y‘áthe“driv˜er“program“is“a“full‘áfeatured“Grace“proGcess:‘Qàthe“user“can“in˜teract‘áusing“the“GUIަat–fthe›gsame“time˜the“program˜sends“data˜and“commands.‘UíThe˜proGcess“will˜adapt“itself˜to“the˜incoming“dataަrate.ŽŸ ¥Oïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.9) cvn /DEST pdfmark endŸؼÂ3.1.9Ž‘#!\HotlinksŽ¡¹Hotlinks–yIare“sources›yHcon¸ètaining“v‘ÿqÐarying“data.‘ÝúGrace“can“bGe“instructed“a“le˜or“a“pipGe“is“a˜hotlink“in“whic¸èhަcase–Ìit“will“proš¸èvide“spGecic“commands“to“refresh“the“data‘Ëon“a“mouse“clic˜k“(a“later“v˜ersion“will“probablyަallo¸èw–U automatic“refresh).ŽŸ%'ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.10) cvn /DEST pdfmark endŸXäÂ3.1.10Ž‘(áDevicesŽ¡¹Grace–v»alloš¸èws“the‘vºuser“to“c˜hošGose“b˜et•¸èw“een›v»sev“eral–vºoutput˜devices˜to˜proGduce“its˜graphics.‘ÖQThe“curren¸èt˜list˜ofަsuppGorted–U devices“is:ŽŸÙfïcolor push Black‘¸Ž‘ï color popŽŽ‘¹X11ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹  ýïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.12) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹12Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹P•¸èostScript›U (lev“el˜1˜and˜lev“el˜2)ޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹EPS–U (encapsulated“P¸èostScript)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Metale–U (whicš¸èh“is“Grace“format,“used“at“the“momen˜t“mostly“for“debugging“purpGoses)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹MIF–U (Makš¸èer“In˜terc˜hange“F‘ÿ*¸ormat“used“b˜y“F‘ÿ*¸rameMak˜er)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹SVš¸èG‘ÓG(Scalable–ÓªV‘ÿ*¸ector“Graphics,‘3La“language‘Ó©for“describing“t˜w˜o-dimensional“v˜ector‘Ó©and“mixed“v˜ec-Ž© ®‘tor/raster–U graphics“in“XML)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹PDF–U (depGends“on“extra“libraries,“see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11ï color popŸù•¼ïps:SDict begin H.R endŽïwps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (Item.1) cvn H.B /ANN pdfmark endï color pop“(conguration))Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹PNM–U (pGortable“an¸èymap“le“format)Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹JPEG–U (depGends“on“extra“libraries,“see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11ï color popŸù•¼ïps:SDict begin H.R endŽïwps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (Item.1) cvn H.B /ANN pdfmark endï color pop“(conguration))Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹PNG–U (depGends“on“extra“libraries,“see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11ï color popŸù•¼ïps:SDict begin H.R endŽïwps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (Item.1) cvn H.B /ANN pdfmark endï color pop“(conguration))ŽŸؼNote–øthat“Grace›ùno“longer“suppGorts“GIF‘ãdue“to“the˜cop•¸èyrigh“t–øpGolicy“of“Unisys.‘UsGrace“can˜also“bGe“instructedަto›túlaunc•¸èh‘tùcon“v“ersion˜programs–tùautomatically˜based˜on“le˜name.‘Ñ As˜an˜example“y¸èou˜can“proGduce˜MIFަ(F‘ÿ*¸rameMak•¸èer›2KIn“terc“hange˜F‘ÿ*¸ormat)˜or‘2LJa“v‘ÿqÐa˜applets˜using˜pstoGedit,‘i–or˜almost˜an“y‘2Limage˜format˜using˜theަnetpbm–U suite“(see“the“ÅF‘þú_A¾˜Q“ïcolor push rgb 0 0 1Ÿcxïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿FAQ.htmlï color popŸùãðïps:SDict begin H.R endŽïps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (FAQ.html) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.11) cvn /DEST pdfmark endŸXäÂ3.1.11Ž‘(áMagic‘ÕpathޤMª¹In›ìôman¸èy–ìõcases,‘Éwhen“Grace˜needs˜to“access˜a˜le˜giv¸èen“with˜a˜relativ¸èe“¿pathname¹,‘Êit˜searc¸èhes˜for˜the“le˜alongަthe–U follo¸èwing“path:‘q€¿./pathname:./.grace/pathname:/.grace/pathname:$GRACE_HOME/pathnameŽŸ6ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.12) cvn /DEST pdfmark endŸŸüÂ3.1.12Ž‘(áDynamic‘ÕmoQÂdulesŽ¡¹Grace–Óëcan“access›Óìexternal“functions“presen¸èt“in˜either“system“or“third-part¸èy“shared˜libraries“or“moGdulesަspšGecially–Jbcompiled“for“use“with“it.‘mëThe“term“dynamic“refers“to“the“p˜ossibilit¸èy“Grace“has“to“op˜en“the“libraryަat–Û²run“time›Û±to“nd“the“coGde“of˜the“external“function,‘óûthere“is˜no“need“to“recompile“Grace˜itself“(the“functionsަalready–U compiled“in“Grace“are“"statically“link¸èed").ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.1.13) cvn /DEST pdfmark endŸXäÂ3.1.13Ž‘(áCoQÂordinate‘ÕframesŽ¡¹There–I…are“t•¸èw“o›I…t“yp•Ges˜of˜co“ordinates‘I†in˜Grace:‘ZJthe˜Âw®>orld‘î&co•QÂordinates˜¹and˜the˜Âviewp“ort‘î&co“ordinates¹.ަP•¸èoin“ts–Luof›Lvdata“sets˜are“dened˜in“the˜w¸èorld“co•Gordinates.‘nThe˜viewp“ort‘Luco“ordinates˜corresp“ond–Luto˜the“imageަof–×Äthe“plot“draš¸èwn“on“the“can˜v‘ÿqÐas“(or‘×Ãprin˜ted“on,–ømsa˜y‘ÿ*¸,“PS‘×¢output–×Äpage).‘ùlThe“transformation“con˜v˜erting“theަwš¸èorld–U coGordinates“in˜to“the“viewpGort“ones“is“determined“b˜y“bGoth“the“graph“t˜ypGe“and“the“axis“scaling.ŽŸؼAš¸èctually‘ÿ*¸,‘nthere–5Úis“y˜et‘5Ùanother“lev˜el“in‘5Ùthe“hierarc˜h˜y“of“coGordinates‘5Ù-“the“Âdevice‘ׇcoQÂordinates¹.‘­Ho˜w˜ev˜er,ަyš¸èou–(¥(as“a“user“of“Grace)“should“not“w˜orry“abšGout“the“latter.‘b­The“mapping“b˜et•¸èw“een–(¥the“viewp˜ort“co˜ordinatesަand–å¬the›å­device“coGordinates“is˜alw•¸èa“ys–å¬set˜in“suc¸èh“a˜w•¸èa“y–å¬that“the˜origin“of˜the“viewpšGort“corresp˜onds‘å­to“theަleft–‡€bGottom›‡corner“of˜the“device˜page,‘”the“smallest˜of“the˜device“dimensions˜correspGonds“to˜one“unit˜in“theަviewp•Gort›©co“ordinates.‘€Oh,‘0‹and˜the‘¨most˜imp“ortan¸èt˜thing˜ab“out‘¨the˜viewp“ort˜¸!˜¹device‘¨transformation˜isަthat–1óit“is–1òhomotetic,›8üi.e.‘eÇa“square–1óis“guaran¸èteed“to“remain“a‘1òsquare,˜not“a“rectangle,˜a“circle‘1òremains“a“circleަ(not–U an“ellipse)“etc.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ©ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.13) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹13Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.2) cvn /DEST pdfmark endŸ Ä3.2Ž‘¾In• v“o_úcationŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.2.1) cvn /DEST pdfmark endŸؼÂ3.2.1Ž‘#!\Op•QÂerational‘Õmo“deŽŸMª¹With–ÈrespšGect“to‘È‘the“user“in¸èterface,‘åmthere“are“three“mo˜des‘È‘of“op˜eration“that“Grace‘È‘can“b˜e“in•¸èv“ok“ed‘Èin.‘ËÑTheޤ ®full-featured–¬ÙGUI-based›¬Úv¸èersion“is˜called“¿xmgrace¹.‘9iA‘¬¯batc•¸èh-prin“ting˜v“ersion–¬Ùis˜called“¿gracebat¹.‘9iA‘¬¯command-Ž¡line–‚3in¸èterface›‚2moGde“is“called“¿grace¹.‘ø¸Usually‘ÿ*¸,‘wa“single“executable“is˜called“in“all“cases,‘wwith“t•¸èw“o–‚3of˜the“threeŽ¡les–U bšGeing“(sym¸èb˜olic)“links“to“a“"real"“one.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.2.2) cvn /DEST pdfmark endŸXäÂ3.2.2Ž‘#!\Command–Õline“optionsŽŸ#‘ûïcolor push Black‘Õ-autoscale‘Õóë ecbi1000Èx¸jÈy¸jÈxy‘áÔï color popŽŽŽ¤®‘¹Ov•¸èerride›U an“y˜parameter˜le˜settingsŽ©®‘ûïcolor push Black‘ÕÂ-barebQÂones‘Õï color popŽŽŽ¡‘¹T‘ÿ*¸urn–U o“all“toGolbarsަ‘ûïcolor push Black‘ÕÂ-batc®>h‘ÕÈb‘ÿiHatch_le‘®£ï color popŽŽŽ¡‘¹Execute– Gbatc¸èh_le› Fon“start˜up“(i.e.,‘Øafter“all“other˜options“ha•¸èv“e˜b•Geen› Gpro“cessed˜and‘ Fthe˜UI‘ 4initialized)ަ‘ûïcolor push Black‘ÕÂ-bloQÂc®>k‘ÕÈblo‘ÿiHck_data‘ÆVï color popŽŽŽ¡‘¹Assume–U data“le“is“bloGc¸èk“dataަ‘ûïcolor push Black‘ÕÂ-b®>xy‘ÕÈx:y:etc.‘ ï color popŽŽŽ¡‘¹F‘ÿ*¸orm–¦a›¦set“from“the“curren•¸èt˜bloGc“k–¦data“set“using˜the“curren¸èt“set˜tš¸èypGe“from“columns“giv˜en‘¦in“theŽŸ ®‘argumen¸ètަ‘ûïcolor push Black‘ÕÂ-datehin®>t‘ÕÈiso¸jÈeur–ÿiHop“e“an¸jÈus¸jÈdays¸jÈse“c“onds¸jÈnohint‘ËÉï color popŽŽŽ¡‘¹Set–U the“hin¸èt“for“dates“analysisަ‘ûïcolor push Black‘ÕÂ-dpipQÂe‘ÕÈdescriptor‘ñxï color popŽŽŽ¡‘¹Read–U data“from“descriptor“(anon¸èymous“pipGe)“on“startupަ‘ûïcolor push Black‘ÕÂ-xed‘ÕÈwidth‘ÆVheight‘ËÉï color popŽŽŽ¡‘¹Set–U canš¸èv‘ÿqÐas“size“xed“to“width*heigh˜tަ‘ûïcolor push Black‘ÕÂ-free‘Õï color popŽŽŽ¡‘¹Use–U free“page“la•¸èy“outަ‘ûïcolor push Black‘ÕÂ-graph‘ÕÈgr–ÿiHaph_numb“er‘ñxï color popŽŽŽ¡‘¹Set–U the“currenš¸èt“graph“n˜um˜bGerަ‘ûïcolor push Black‘ÕÂ-graph•®>t“ypQÂe‘ÕÈxy¸jÈchart¸jÈxe–ÿiHd¸jÈp“olar¸jÈpie‘®£ï color popŽŽŽ¡‘¹Set–U the“tš¸èypGe“of“the“curren˜t“graphަ‘ûïcolor push Black‘ÕÂ-hardcop®>y‘Õï color popŽŽŽ¡‘¹No›U in•¸èteractiv“e˜session,˜just˜prin“t˜and˜quitŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹3Pïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.14) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹14Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ûïcolor push Black‘ÕÂ-hdevice‘ÕÈhar–ÿiHdc“opy_devic“e_name‘®£ï color popŽŽŽ¤®‘¹Set–U default“hardcop¸èy“deviceŽ©®‘ûïcolor push Black‘ÕÂ-install‘Õï color popŽŽŽ¡‘¹Install–U priv‘ÿqÐate“colormapަ‘ûïcolor push Black‘ÕÂ-legend‘ÕÈlo‘ÿiHad‘ëï color popŽŽŽ¡‘¹T‘ÿ*¸urn–U the“graph“legend“onަ‘ûïcolor push Black‘ÕÂ-log‘ÕÈx¸jÈy¸jÈxy‘áÔï color popŽŽŽ¡‘¹Set–U the“axis“scaling“of“the“curren¸èt“graph“to“logarithmicަ‘ûïcolor push Black‘ÕÂ-maxpath‘ÕÈlength‘ÆVï color popŽŽŽ¡‘¹Set–U the“maximal“dra¸èwing“path“lengthަ‘ûïcolor push Black‘ÕÂ-mono‘Õï color popŽŽŽ¡‘¹Run–U Grace“in“monošGc¸èhrome“mo˜de“(aects“the“displa¸èy“only)ަ‘ûïcolor push Black‘ÕÂ-netcdf‘ÕÈle‘®£ï color popŽŽŽ¡‘¹Assume–À¼data“Åle‘ ¹is“in“netCDF‘À–format.‘@ This“option›À»is“presen¸èt“only“if˜the“netCDF‘À–suppGort“w¸èas“compiledŽŸ ®‘inަ‘ûïcolor push Black‘ÕÂ-netcdfxy‘ÕÈX_var–ñxY_var“ï color popŽŽŽ¡‘¹If–QÜ-netcdf“w¸èas›QÝused“previously‘ÿ*¸,‘Rƒread“from˜the“netCDF‘QÛle“ÅX_var‘eZY_var‘eY¹v‘ÿqÐariables“and“create“a˜set.‘piIfޤ ®‘ÅX_var‘Ú5¹name–Æ·is›Ƹ"n¸èull"“then˜load“the˜index“of˜Y‘Æ“to˜X.“This˜option“is˜presen¸èt“only˜if“the˜netCDF‘Æ“suppGortŽ¡‘w¸èas–U compiled“inަ‘ûïcolor push Black‘ÕÂ-noask‘Õï color popŽŽŽŸ®‘¹Assume–:Rthe“answš¸èer‘:Qis“y˜es“to“all“requests“-‘:Qif“the“opGeration“w˜ould“o˜v˜erwrite›:Qa“le,‘sŸGrace˜will“do“soŽ¡‘without‘U promptingަ‘ûïcolor push Black‘ÕÂ-noinstall‘Õï color popŽŽŽ¤®‘¹Don't–U use“priv‘ÿqÐate“colormapަ‘ûïcolor push Black‘ÕÂ-noprin®>t‘Õï color popŽŽŽ¡‘¹In–U batcš¸èh“moGde,“do“not“prin˜tަ‘ûïcolor push Black‘ÕÂ-nosafe‘Õï color popŽŽŽ¡‘¹Disable–U safe“moGdeަ‘ûïcolor push Black‘ÕÂ-nosigcatc®>h‘Õï color popŽŽŽ¡‘¹Don't–U catc¸èh“signalsަ‘ûïcolor push Black‘ÕÂ-npipQÂe‘ÕÈle‘®£ï color popŽŽŽ¡‘¹Read–U data“from“named“pipGe“on“startupަ‘ûïcolor push Black‘ÕÂ-nxy‘ÕÈnxy_le‘®£ï color popŽŽŽ¡‘¹Assume–U data“le“is“in“X“Y1“Y2“Y3“...‘q€formatŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹@¾ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.15) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹15Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ûïcolor push Black‘ÕÂ-param‘ÕÈp–ÿiHar“ameter_le‘®£ï color popŽŽŽ¤®‘¹Load–U parameters“from“parameter_le“to“the“curren¸èt“graphŽ©®‘ûïcolor push Black‘ÕÂ-pQÂexec‘ÕÈp–ÿiHar“ameter_string‘áÔï color popŽŽŽ¡‘¹In¸èterpret–U string“as“a“parameter“settingަ‘ûïcolor push Black‘ÕÂ-pipQÂe‘Õï color popŽŽŽ¡‘¹Read–U data“from“stdin“on“startupަ‘ûïcolor push Black‘ÕÂ-prin®>tle‘Õï color popŽŽŽ¡‘Åle‘o¹Sa•¸èv“e›U prin“t˜output˜to˜leަ‘ûïcolor push Black‘ÕÂ-remo•®>v“e‘Õï color popŽŽŽ¡‘¹Remo•¸èv“e–U data“le“after“readަ‘ûïcolor push Black‘ÕÂ-results‘ÕÈr‘ÿiHesults_le‘®£ï color popŽŽŽ¡‘¹W‘ÿ*¸rite–U results“of“some“data“manipulations“to“results_leަ‘ûïcolor push Black‘ÕÂ-rvideo‘Õï color popŽŽŽ¡‘¹Excš¸èhange–U the“color“indices“for“blac˜k“and“whiteަ‘ûïcolor push Black‘ÕÂ-safe‘Õï color popŽŽŽ¡‘¹Run–U in“the“safe“mošGde“(default)“-“no“le“system“mo˜dications“are“alloš¸èwd“through“the“batc˜h“languageަ‘ûïcolor push Black‘ÕÂ-sa•®>v“eall‘ÕÈsave_le‘®£ï color popŽŽŽ¡‘¹Sa•¸èv“e–U all“graphs“to“sa•¸èv“e_leަ‘ûïcolor push Black‘ÕÂ-seed‘ÕÈse–ÿiHe“d_value‘®£ï color popŽŽŽ¡‘¹Inš¸èteger–U seed“for“random“n˜um˜bGer“generatorަ‘ûïcolor push Black‘ÕÂ-sett®>ypQÂe‘ÕÈxy¸jÈxydx¸jÈ...‘ ï color popŽŽŽ¡‘¹Set–U the“t¸èypGe“of“the“next“data“leަ‘ûïcolor push Black‘ÕÂ-source‘ÕÈdisk¸jÈpip‘ÿiHe‘®£ï color popŽŽŽ¡‘¹Source–U t¸èypGe“of“next“data“leަ‘ûïcolor push Black‘ÕÂ-timer‘ÕÈdelay‘áÔï color popŽŽŽ¡‘¹Set›U allo•¸èw“ed˜time˜slice˜for˜real˜time˜inputs˜to˜dela“y˜msަ‘ûïcolor push Black‘ÕÂ-timestamp‘Õï color popŽŽŽ¡‘¹A¸èdd–U timestamp“to“plotަ‘ûïcolor push Black‘ÕÂ-v®>ersion‘Õï color popŽŽŽ¡‘¹Shoš¸èw–U the“program“v˜ersionަ‘ûïcolor push Black‘ÕÂ-viewpQÂort‘ÕÈxmin–$·ymin“xmax“ymax‘&ï color popŽŽŽ¡‘¹Set–U the“viewpGort“for“the“curren¸èt“graphŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹KÆïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.16) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Getting‘Õstarted’ll¹16Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ûïcolor push Black‘ÕÂ-wd‘ÕÈdir–ÿiHe“ctory‘áÔï color popŽŽŽ¤®‘¹Set–U the“w¸èorking“directoryŽ©®‘ûïcolor push Black‘ÕÂ-w®>orld‘ÕÈxmin–$·ymin“xmax“ymax‘&ï color popŽŽŽ¡‘¹Set–U the“wš¸èorld“coGordinates“for“the“curren˜t“graphަ‘ûïcolor push Black‘ÕÂ-usage¸jÂ-help‘Õï color popŽŽŽ¡‘¹This‘U messageŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.3) cvn /DEST pdfmark endŸ.ÂÄ3.3Ž‘¾CustomizationŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.3.1) cvn /DEST pdfmark endŸؼÂ3.3.1Ž‘#!\En•®>vironmen“t‘Õv‘ÿ\|ariablesŽŸ#ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹GRA¸èCE_HOME‘L@Set–Lthe›L€loGcation“of˜Grace.‘WŸThis“will˜bGe“where˜help˜les,–ŠWauxiliary˜programs,“andޤ ®‘examples–OAare“lošGcated.‘_ãIf“y¸èou“are‘O@unable“to“nd“the“lo˜cation“of“this“directory‘ÿ*¸,‘Éconš¸ètact“y˜our“systemŽ¡‘administrator.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹GRA•¸èCE_PRINT_CMD‘šPrin“t–šcommand.‘@YIf“the“v‘ÿqÐariable“is“dened“but“is“an“emptš¸èy“string,‘«P"Prin˜t“toŽ¡‘le"–U will“bGe“selected“as“default.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹GRAš¸èCE_EDITOR–U The“editor“used“for“man˜ual“editing“of“dataset“v‘ÿqÐalues.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹GRA¸èCE_HELPVIEWER‘˱The–ËÓshell›ËÔcommand“to˜run“an“HTML‘˱view¸èer˜for“on-line˜bro¸èwsing“of˜the“helpŽ¡‘doGcumen¸èts.‘WûMust›include–at“least˜one“instance˜of“"%s"“whic¸èh˜will“bGe˜replaced“with“the˜actual“URL‘|b¸èyŽ¡‘Grace.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹GRA•¸èCE_FFTW_WISDOM_FILE›õand‘õ?GRA“CE_FFTW_RAM_WISDOM˜These›õ?ags‘õ>con“trol˜bGe-Ž¡‘ha¸èvior–U of“the“FFTW“planner“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 16.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.6.3) cvn H.B /ANN pdfmark endï color pop“(FFTW“tuning)“for“detailed“info)Ž©}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.3.2) cvn /DEST pdfmark endŸXäÂ3.3.2Ž‘#!\Init‘ÕleŽŸMª¹UpGon–Ãôstart-up,‘àþGrace“loads“its›Ãõinit“le,‘àý¿gracerc¹.‘AThe“le“is˜searc¸èhed“for˜in“the“magic˜path“(see˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.1.11ï color popŸù•¼ïps:SDict begin H.R endŽï…ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.1.11) cvn H.B /ANN pdfmark endï color pop“(magicŽ¡path));‘œâonce–„÷found,‘íthe›„örest“of“the“path“is˜ignored.‘It's“recommended˜that“in“the“¿gracerc“¹le,‘ìone“doGesn'tŽ¡use›¿Ìstatemen•¸èts‘¿Ëwhic“h˜are–¿Ëpart˜of“a˜pro‘Ž0ject˜le“-˜suc¸èh“defaults,›ݪif“needed,˜should“bGe›¿Ìset“in˜the“default˜templateŽ¡(see–U ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.3.3ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.3.3) cvn H.B /ANN pdfmark endï color pop“(default“template)).ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.3.3) cvn /DEST pdfmark endŸXäÂ3.3.3Ž‘#!\Default‘ÕtemplateŽŸMª¹Whenev¸èer–x`a“new›x_pro‘Ž0ject“is“started,‘0Grace“loads“the˜default“template,‘0¿templates/Default.agr¹.‘Û?The“le“isŽ¡searc¸èhed–Û’for›Û‘in“the˜magic“path“(see˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.1.11ï color popŸù•¼ïps:SDict begin H.R endŽï…ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.1.11) cvn H.B /ANN pdfmark endï color pop“(magic˜path));‘Ëonce“found,‘ý.the˜rest“of˜the“path“is˜ignored.‘ÕIt'sŽ¡recommended–0qthat“in“the“default“template,‘7Èone“doGesn't“use“statemenš¸èts“whic˜h“are“NOT‘0hpart“of“a“pro‘Ž0ject“leŽ¡-–U suc¸èh“defaults,“if“needed,“should“bGe“set“in“the“¿gracerc“¹(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.3.2ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.3.2) cvn H.B /ANN pdfmark endï color pop“(init“le)).ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.3.3.4) cvn /DEST pdfmark endŸXäÂ3.3.4Ž‘#!\X‘ÕresourcesŽŸMª¹The–U follo¸èwing“Grace-spšGecic“X“resource“settings“are“supp˜orted:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹V:ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.17) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹17Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XMgrace.in•¸èv“ertDra“wޤ ®‘Use›úuGXin•¸èv“ert˜rather˜than˜GXxor˜for˜rubb•Ger-band˜lines.‘a€If˜the˜rubb“er-banding˜for˜zo“oms˜and˜lines,Ž¡‘etc.‘q€do•Gesn't›U app“ear˜on˜the˜can•¸èv‘ÿqÐas,˜set˜this˜resource˜to˜y“es.Ž¡©B¦ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XMgrace.allo•¸èwDoubleClic“kŽ¡‘When–R3Y‘ÿ*¸es,‘RÉalloš¸èw“double‘R4clic˜ks“on“the“can˜v›ÿqÐas‘R4to“bring“up“v˜arious‘R4pšGopups“dep˜ending“on“the‘R4lo˜cation“ofŽ¡‘the–U pGoinš¸èter“when“the“double“clic˜k“oGccurs.Ž¡ŸB§ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XMgrace.toGolBarŽ¡‘Enables–U button“toGolbarŽ¡¦ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XMgrace.statusBarŽ¡‘Enables–U status“barŽ¡¦ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹XMgrace.loGcatorBarŽ¡‘Enables–U loGcator“barŽ¡ŸL*It–U is“also“pGossible“to“customize“menš¸èus“b˜y“assigning“k˜ey“accelerators“to“an˜y“item.ŽŸؼY‘ÿ*¸ou'll–Äneed›Äto“deriv¸èe˜the“item's˜X‘õresource“name“from˜the“respGectiv•¸èe˜men“u›ÄlabGel,‘Ðwhic“h˜is‘Äeasily˜doneŽ¡follo¸èwing–U these“rules:ŽŸáïcolor push Black‘¸Ž‘ï color popŽŽ‘¹All–U non-alphanš¸èumeric“c˜haracters“are“skippGedަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Start–U with“lo•¸èw“er–U case;“eacš¸èh“new“w˜ord“(if“an˜y)“con˜tin˜ues“from“the“capital“letterŽŸB§ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Aš¸èdd–U the“item's“t˜ypGe“to“the“end“-“"Men˜u"“for“pulldo˜wn“men˜us,“"Button"“for“men˜u“buttons.ŽŸàF‘ÿ*¸or–YÛexample,‘[ in“order›YÚto“mak¸èe“Grace˜pGopup“the˜Non-linear“curv¸èe“tting˜bš¸èy“pressing“Con˜trol+F,‘YÚy˜ou“w˜ouldŽ¡add–U the“folloš¸èwing“t˜w˜o“linesŽ©ؼ¿XMgrace*transformationsMenu.nonLinearCurveFittingButton.acceleratorText:‘ XCtrl+FŽ¡XMgrace*transformationsMenu.nonLinearCurveFittingButton.accelerator:‘ XCtrlµ<¿Keyµ>¿fަ¹to–²syš¸èour“¿.Xresources‘²t¹le“(the“le“whic˜h“is›²tread“when“an“X‘²Jsession“starts;‘è­it“could˜bGe“¿.Xdefaults¹,‘Òü¿.XsessionŽ¡¹or–U some“other“le“-“ask“y¸èour“system“administrator“when“in“doubt).ަSimilarly‘ÿ*¸,‘¶­it–£*ma¸èy›£+bGe“desirable“to˜alter“default“lename˜patterns“of“le˜selection“dialogs.‘[ŸThe“recipGe˜for“theŽ¡dialog's–•lname›•kis“lik¸èe˜for“men¸èu“buttons˜outlined“abGo•¸èv“e,‘¥with˜"Button"–•lbGeing˜replaced“with“"FSB".‘2bE.g.,‘¥toŽ¡list–U all“les“in“the“"OpšGen“pro‘Ž0ject"“dialog“("File/Op˜en..."),“set“the“follo¸èwing“resource:ަ¿XMgrace*openProjectFSB.pattern:‘ X*ŽŸ­'ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.4) cvn /DEST pdfmark endŸwÁ4Ž‘ÁGuide–G\to“the“graphical“user“incterfaceŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.1) cvn /DEST pdfmark endŸSËÄ4.1Ž‘¾GUI‘¸con trolsŽŸMª¹This–U section“describGes“inš¸èterface“con˜trols“-“basic“building“bloGc˜ks,“used“in“man˜y“pGopups.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹k.ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.18) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹18Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.1.1) cvn /DEST pdfmark endŸ Â4.1.1Ž‘#!\File–Õselection“dialogsŽ©Mª¹Whenev¸èer–~Ñthe›~Ðuser“is“expGected“to˜pro¸èvide“a“lename,‘©­either“for“reading˜in“or“writing˜some“data,‘©®a˜le“selectionޤ ®dialog–æŸis“p•Gopp“ed–æŸup.‘%þIn“addition“to“the›æ standard“en¸ètries“(the“directory“and“le“lists˜and“the“lter“en¸ètry),Ž¡there–h´is“a‘hµpulldoš¸èwn“men˜u“for“quic˜k“directory‘hµc˜hange“to“predened“loGcations“(the‘hµcurren˜t“w˜orking“directory‘ÿ*¸,Ž¡user's–†home›…directory“and˜the“le“system˜roGot).‘UMAlso,‘qa“"Set“as˜cwd"“button˜is“there“whic•¸èh˜allo“ws–†to˜set“an¸èyŽ¡directory–v¶as“y•¸èou›vµna“vigate–v¶through“the“directory“tree“as˜the“currenš¸èt“w˜orking“directory“(cwd).‘ÖAOnce“dened,Ž¡it–U can“bGe“used“in“anš¸èy“other“le“selection“dialog“to“switc˜h“to“that“directory“quic˜kly‘ÿ*¸.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.1.2) cvn /DEST pdfmark endŸçÂ4.1.2Ž‘#!\List‘Õselectorsަ¹V‘ÿ*¸arious–W6selectors“are“aš¸èv‘ÿqÐailable“in“sev˜eral‘W7pGopups.‘wÂThey“all“displa˜y“lists“of“ob‘Ž0jects“(graphs,–W¼sets,“...)‘wÂand‘W6canŽ¡bšGe–}used“to‘}p˜erform“simple“op˜erations“on“these“ob‘Ž0jects›}(cop¸èying,–‡ deleting,“...).‘éPThe˜opGerations–}are“a¸èv‘ÿqÐailableŽ¡from–³•a“pšGopup“men¸èu‘³”that“app˜ears“when“pressing“mouse“button‘³”3“on“them.‘ŒßDep˜ending‘³”on“the“requiredŽ¡functionalit•¸èy‘ÿ*¸,‘Ëšthey‘³éma“y›³èallo“w˜m“ultiple˜c“hoices‘³éor˜not.‘ÙThe˜follo“wing˜shortcuts–³éare˜enabled˜(if˜the“result˜ofŽ¡an–U action“wš¸èould“con˜tradict“the“list's“selection“pGolicy‘ÿ*¸,“this“w˜ould“bGe“ignored):Ž©ؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl+a–U select“allޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl+u–U unselect“allŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl+i›U in•¸èv“ert˜selectionŽŸÒ¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.2) cvn /DEST pdfmark endŸtÂGraph‘·ïselector‘·O¹The–aopšGerations“that‘`can“b˜e‘`p˜erformed“on“graphs›`through“the“graph˜selector's“pGopupŽŸ ®men¸èu‘U are:ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹foGcus‘U toŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹hideŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹sho¸èwŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹duplicateŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹killŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹sw¸èapŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹create‘U newަAll–Athis›A‘opGerations“are˜not“a¸èv‘ÿqÐailable˜in“ev¸èery˜instance“of˜the“selector.‘jûF‘ÿ*¸or˜example“in˜the“"read˜sets"“pGopupŽŸ ®only–U one“graph“can“bšGe“selected“at“a“time,“and“the“sw¸èap“op˜eration“is“disabled.ŽŸؼDouble-clicš¸èking–U on“a“list“en˜try“will“switc˜h“the“foGcus“to“that“graph.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.3) cvn /DEST pdfmark endŸçÂSet‘Õselector‘ Ôx¹The–U opšGerations“that“can“b˜e“p˜erformed“on“sets“through“the“set“selector's“p˜opup“men¸èu“are:ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¹hideŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹sho¸èwŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹yµïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.19) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹19Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹bring–U to“fron¸ètޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹send–U to“bac¸èkŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹duplicateŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹killŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹kill‘U dataŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹sw¸èapŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹editŽ¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹in–U spreadsheet“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.6) cvn H.B /ANN pdfmark endï color pop“(Spreadsheet“data“set“editor))Ž©®‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹in–U text“editorŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹create‘U newŽ¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹b•¸èy‘U form“ulaަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹in–U spreadsheet“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.6) cvn H.B /ANN pdfmark endï color pop“(Spreadsheet“data“set“editor))ަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹in–U text“editorަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹from–U bloGc¸èk“dataŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹pac¸èk–U all“setsŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹selector‘U opGerationsŽ¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹view–U set“commen¸ètsަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹sho¸èw‘U data-lessަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹sho¸èw‘U hiddenަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹select‘U allަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹unselect‘U allަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹in•¸èv“ert‘U selectionަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹upGdateŽŸؼDouble-clicš¸èking–u³on“a“list“en˜try“will“opGen“the“spreadsheet‘u²editor“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.6) cvn H.B /ANN pdfmark endï color pop“(Spreadsheet“data“set“editor))“onŽŸ ®the–U set“data.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.2) cvn /DEST pdfmark endŸ jÄ4.2Ž‘¾The–¸main“windo wޤtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.2.1) cvn /DEST pdfmark end©ؼÂ4.2.1Ž‘#!\The‘Õcan®>v‘ÿ\|asŽ¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.4) cvn /DEST pdfmark end¦Can•®>v‘ÿ\|as‘w1hotk“eys‘v’¹When‘âthe–âpšGoin¸èter“fo˜cus›âis“on“the˜can¸èv‘ÿqÐas“(where“the˜graph“is“dra¸èwn),‘Rthere˜are“someŽŸ ®shortcuts–U to“activ‘ÿqÐate“sev¸èeral“actions.‘q€They“are:ŽŸؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹A:“Autoscale“the“curren¸èt“graphŽŸ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹D:“Delete“an“ob‘Ž0jectŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹‰Õïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.20) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹20Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹L:“Mo•¸èv“e›U curren“t˜graph˜legendޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹M:“Mo•¸èv“e–U an“ob‘Ž0jectŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹T:“Place“timestampŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹U:“Refresh“hotlinksŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹V:“Set“the“viewpGort“with“mouseŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U µ<¹Keyµ>¹Z:“ZoGomŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U Alt“µ<¹Keyµ>¹L:“Dra¸èw“a“lineŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U Alt“µ<¹Keyµ>¹B:“Draš¸èw“a“bGo˜xŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U Alt“µ<¹Keyµ>¹E:“Dra¸èw“an“ellipseŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ctrl–U Alt“µ<¹Keyµ>¹T:“W‘ÿ*¸rite“a“text“stringŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.5) cvn /DEST pdfmark endŸçÂClicš®>ks–±Üand“double“clic˜ks‘ ±<¹A‘6tsingle–6}clic¸èk›6|inside“a˜graph˜switc¸èhes“foGcus˜to“that˜graph.‘gJThis˜is“the˜defaultŽŸ ®pšGolicy‘ÿ*¸,–U but“it“can“b˜e“c¸èhanged“from“the“"Edit/Preferences"“p˜opup.ŽŸؼDouble–U clicš¸èking“on“parts“of“the“can˜v‘ÿqÐas“will“in˜v˜ok˜e“certain“actions“or“raise“some“pGopups:Ž©ؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U a“fošGcus“mark•¸èer:‘q€mo“v“e–U selected“viewp˜ort“cornerŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U an“axis:‘q€"Plot/Axis“propšGerties"“p˜opupŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U a“set:‘q€"Plot/Set“appšGearance"“p˜opupŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U a“legend:‘q€"Plot/Graph“appšGearance"“p˜opupŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U a“(sub)title:‘q€"Plot/Graph“appšGearance"“p˜opupŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹on–U an“ob‘Ž0ject“(bšGo¸èx,“line,“...):‘q€a“p˜opup“for“editing“prop˜erties“of“that“ob‘Ž0jectަThe–U double“clic¸èking“actions“can“bšGe“enabled/disabled“from“the“"Edit/Preferences"“p˜opup.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.2.2) cvn /DEST pdfmark endŸXäÂ4.2.2Ž‘#!\T‘ÿ ºoQÂolbar‘ÕbuttonsŽŸMª¹Along–8the“left-hand“side‘9of“the“canš¸èv‘ÿqÐas“(if“sho˜wn)“is›9the“T‘ÿ*¸oGolBar.‘ZˆIt“is“armed“with˜sevš¸èeral“buttons“to“pro˜videޤ ®quic¸èk–U and“easy“access“to“the“more“commonly“used“Grace“functions.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Draw¹:‘údThis–™’will“redraš¸èw“the“can˜v‘ÿqÐas“and“sets.‘>ÕUseful“if“"Auto“Redra˜w"“has“bGeen“deselected“in“theŽ¡‘Edit¸j¹Preferences–£kdialog“or“after“executing“commands‘£ldirectly“from“the“Windoš¸èw¸j¹Commands“in˜terpreter.Ž©®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Lens¹:‘û™A‘šzoGom›š-lens.‘@¥Clic¸èk–š,on“the˜lens,‘«othen“select˜the“area˜of“in¸èterest“on˜the“graph“with˜the“"rubbGerŽ¡‘band".‘q€The–U region“enclosed“bš¸èy“the“rubbGer“band“will“ll“the“en˜tire“graph.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿AS¹:–U AutoScale.‘q€Autoscales“the“graph“to“conš¸ètain“all“data“pGoin˜ts“of“all“visible“(not“hidden)“sets.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Z/z¹:›q€ZoGom–U in/out“b¸èy“5%.˜The“zošGom“p˜ercen¸ètage“can“b˜e“set“in“the“Edit/Preferences“dialog.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹š;ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.21) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹21Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Arrows¹:‘“ Scroll–æ0activš¸èe“graph“b˜y“5%“in“the“arro˜w's‘æ1direction.‘$°The“scroll“pGercen˜tage“can“bGe“set“in“theޤ ®‘Edit/Preferences‘U dialog.Ž©®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¿AutoT¹:–Ã[AutoTicš¸èk“Axes.‘¼1This“will“nd“the‘ÃZoptim˜um“n˜um˜bGer“of“ma‘Ž0jor“and“minor“tic˜k“marks“for“bGothŽ¡‘axes.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿AutoO¹:–îAutoscale›íOn“set.‘WÄClic¸èk“the˜¿AutoO‘Ú¹button,‘^then“clic¸èk˜on“the˜graph“near˜the“set˜y¸èou“wish˜to“useŽ¡‘for–U determining“the“autoscale“bGoundaries“of“the“graph.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿ZX,ZY¹:–ÅZoGom›Æalong“an“axis.‘V·These˜buttons“wš¸èork“lik˜e‘Æthe“zošGom“lens“ab˜o•¸èv“e›Æbut–Åare“restricted“to˜a“singleŽ¡‘axis.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿AX,AY¹:–ˆËAutoscale›ˆÌone“axis˜only‘ÿ*¸.‘ ‚The“follo¸èwing˜buttons“deal˜with“the“graph˜stac¸èk“and˜there“is˜a“go•Go“dŽ¡‘example–U under“Help/Examples/General“Inš¸ètro/W‘ÿ*¸orld“Stac˜k.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Pu/Po¹:‘ÖÚPush‘‡Îand–‡ÍpGop“the“currenš¸èt“w˜orld‘‡Îsettings“to/from“the“graph“stac˜k.‘ ˆWhen“pGopping,‘”ymak˜es“theŽ¡‘new–U stacš¸èk“top“curren˜t.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿PZ¹:–´6Push“bšGefore“Zo˜oming.‘ŽÂF‘ÿ*¸unctions“as“the“zo˜om“lens,‘Ëûbut“rst“pushes“the“currenš¸èt“w˜orld“settings“toŽ¡‘the‘U stac¸èk.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Cy¹:‘ÄCycles–©Âthrough“the“stacš¸èk“settings“of“the“activ˜e‘©Ãgraph.‘ofEac˜h“graph“ma˜y“ha˜v˜e“up“to“t˜w˜en˜t˜y“la˜y˜ersŽ¡‘on–U the“stac¸èk.ަïcolor push Black‘¸Ž‘ï color popŽŽ‘¿Exit¹:‘q€Prett•¸èy›U ob“vious,˜eh?Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.3) cvn /DEST pdfmark endŸ.ÂÄ4.3Ž‘¾File‘¸men uޤMª¹The–U le“menš¸èu“con˜tains“all“en˜tries“related“to“the“input/output“features“of“Grace.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.1) cvn /DEST pdfmark endŸXäÂ4.3.1Ž‘#!\NewŽ¡¹Reset–Kfthe›Kestate“of“Grace˜as“if“it˜had“just“started˜(one“empt¸èy“graph˜ranging“from“0˜to“1“along˜bGoth“axes).‘nBIfŽŸ ®some–2wš¸èork“has“bGeen“done‘2and“not“y˜et“sa˜v˜ed,‘9a“w˜arning“pGopup“is“displa˜y˜ed‘2to“allo˜w“canceling“the“opGeration.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.2) cvn /DEST pdfmark endŸçÂ4.3.2Ž‘#!\OpQÂenŽ¡¹OpšGen–U an“existing“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.1.1ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.1.1) cvn H.B /ANN pdfmark endï color pop“(pro‘Ž0ject“le).‘q€A“p˜opup“is“displa•¸èy“ed–U that“alloš¸èw“to“bro˜wse“the“le“system.Ž©}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.3) cvn /DEST pdfmark endŸXäÂ4.3.3Ž‘#!\Sa•®>v“eŽ¡¹Sa•¸èv“e–u,the“currenš¸èt“w˜ork›u+in“a“pro‘Ž0ject“le,‘}/using˜the“name“that“w¸èas“used“for˜the“last“opGen“or“sa•¸èv“e.‘Ñ£If–u,no“nameŽŸ ®has–U bšGeen“set“(i.e.,“if“the“pro‘Ž0ject“has“b˜een“created“from“scratcš¸èh)“act“as“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.3.4ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.3.4) cvn H.B /ANN pdfmark endï color pop“(sa˜v˜e“as).ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.4) cvn /DEST pdfmark endŸXäÂ4.3.4Ž‘#!\Sa•®>v“e‘ÕasŽ¡¹Sa•¸èv“e–t"the“currenš¸èt“w˜ork‘t!in“a“pro‘Ž0ject“le“with“a“new“name.‘Î…A‘tpGopup“allo˜ws“to“bro˜wse“the‘t!le“system“and“setޤ ®the–ù'name,‘ ‹the“format“to“use›ù&for“sa¸èving“data˜pGoin¸èts“(the“default“v‘ÿqÐalue˜is“"%16.8g"),‘ Œand“a˜textual“descriptionŽ¡of–U the“pro‘Ž0ject.‘q€A“wš¸èarning“is“displa˜y˜ed“if“a“le“with“the“same“name“already“exists.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ª ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.22) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹22Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.5) cvn /DEST pdfmark endŸ Â4.3.5Ž‘#!\Revš®>ert–Õto“sa˜v˜edޤMª¹Abandon–ëXall‘ëWmošGdications“p˜erformed“on›ëWthe“pro‘Ž0ject“since˜the“last“sa•¸èv“e.‘4&A‘ë1conrmation–ëXpGopup“is˜red“toŽ© ®allo¸èw–U the“user“canceling“the“opGeration.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.6) cvn /DEST pdfmark endŸçÂ4.3.6Ž‘#!\Prin®>t‘ÕsetupŽ¡¹Set–Ûšthe“propGerties“of‘Û›the“prinš¸èting“device.‘îEac˜h‘Û›device“has“its“o˜wn“set“of“spGecic‘Û›options“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.3) cvn H.B /ANN pdfmark endï color pop“(Device-ަspšGecic–Ä settings)).‘¾;A¸èccording‘Äto“the“device,‘ßÃthe“output“can“b˜e“senš¸èt“either“directly‘Äto“a“prin˜ter“or“directedަto–¸a“le.‘¶IThe“global“settings“a¸èv‘ÿqÐailable“for“all“devices›¹are“the“sizing“parameters.‘¶HThe“size˜of“the“graph“isަxed.‘XîChanging– kthe“'Pš¸èage'“settings“c˜hanges“the“size“of“the“can˜v‘ÿqÐas“underneath“the“graph.‘XîSwitc˜hing“bGet˜w˜eenަpšGortrait–äíand“landscap˜e‘äìrotates“the“can•¸èv›ÿqÐas.‘ æMak“e–äísure“the“can¸èv˜as›äìsize“is“large“enough“to˜hold“y¸èour“graph.ަOtherwise–(,yš¸èou“get‘(+a“'Prin˜tout“truncated'“w˜arning.‘b„If“y˜our“can˜v‘ÿqÐas‘(+size“cannot“easily“bGe“c˜hanged“bGecause,‘1)forަexample,‘™y•¸èou›ów“an“t˜to˜prin“t‘óon˜letter˜size˜papGer,‘™y“ou˜need˜to‘óadjust˜the˜size˜of˜y“our‘ógraph˜('ViewpGort'˜inަPlot/Graph‘U AppGearance).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.7) cvn /DEST pdfmark endŸXäÂ4.3.7Ž‘#!\Prin®>tŽ¡¹Prinš¸èt–U the“pro‘Ž0ject“using“the“curren˜t“prin˜ter“settingsŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.3.8) cvn /DEST pdfmark endŸçÂ4.3.8Ž‘#!\ExitŽ¡¹Exit–Šfrom“Grace.‘VøIf“some“w¸èork“has›‰bGeen“done“and“not˜sa•¸èv“ed,‘ua‘Šw“arning˜pšGopup–Šwill“b˜e“displa•¸èy“ed‘‰to›Šallo“w˜theަuser–U to“cancel“the“opGeration.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.4) cvn /DEST pdfmark endŸ.ÂÄ4.4Ž‘¾Edit‘¸men uŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.1) cvn /DEST pdfmark endŸؼÂ4.4.1Ž‘#!\Data‘ÕsetsŽ¡¹Using–N}the›N|data“set˜pGopup,‘OÑy¸èou“can˜view“the˜propGerties“of“datasets.‘oIThis“include˜its“t¸èyp•Ge,‘OÑlength,‘OÐasso“ciatedަcommenš¸èt–º´and“some“statistics‘ºµ(min,–Ômax,“mean,“standard–º´deviation).‘¢=A‘º™horizon˜tal‘ºµscrollbar“at“the“bGottomަalloš¸èws–.±to“get“the“t˜w˜o“last“propGerties,‘ethey“are“not“displa˜y˜ed“b˜y“default.‘þ4Also“note“that“if“y˜ou“nd“someަcolumns–U are“toGo“narroš¸èw“to“sho˜w“all“signican˜t“digits,“y˜ou“can“drag“the“v˜ertical“rules“using“Shift+Button“2.ޤؼUsing–ìsthe“menš¸èu“on“the“top“of“this“dialog,‘Gy˜ou“can“manipulate“existing“sets“or“add“new“ones.‘7yAmong“theަmost–úimpGortanš¸èt“en˜tries“in“the“men˜u,‘#@are“options“to“create“or“moGdify“a“set“using“the“spreadsheet“data“setަeditor–U (see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.6) cvn H.B /ANN pdfmark endï color pop“(Spreadsheet“data“set“editor)).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.6) cvn /DEST pdfmark endŸXäÂSpreadsheet–ÑÎdata‘ÑÏset“editor‘ Ñ.¹The–RDdialog‘REpresenš¸èts“an“editable“matrix“of“n˜um˜b•Gers,‘R×corresp“onding–RDto“theަdata–)ýset“bšGeing“edited.‘ðThe“set“t¸èyp˜e“(and“hence,‘_4the“n•¸èum“b˜er–)ýof“data“columns)“can“b˜e“c¸èhanged“using“theަ"T•¸èypGe:"›ýæselector.‘kÑClic“king˜on‘ýåa˜column˜lab•Gel˜p“ops–ýåup˜a˜dialog“allo¸èwing˜to˜adjust˜the“column˜formatting.ަClicš¸èking–…Yon“the“ro˜w“labšGels‘…Xtoggles“the“resp˜ectivš¸èe“ro˜w“state“(selected/unselected).‘*The“selected“ro˜ws“can“bGeަdeleted–{uvia›{tthe“dialog's˜"Edit"“men•¸èu.‘ä~Another˜en“try–{uin˜this“men¸èu“lets˜y¸èou“add˜a“ro¸èw;‘ŽŸthe˜place“of˜the“newަroš¸èw–yis“determined‘xb˜y“the“ro˜w“con˜taining“a“cell‘xwith“the“k˜eybšGoard“fo˜cus“on.‘[žAs‘xwš¸èell,‘ ›just“t˜yping‘xin“an“empt˜yަcell–U will“add“one“or“sevš¸èeral“ro˜ws“(lling“the“in˜termediate“ro˜ws“with“zeros).Ž¡T‘ÿ*¸o–U resize“columns,“drag“the“v¸èertical“rules“using“Shift+Button“2.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹½óïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.23) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹23Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.2) cvn /DEST pdfmark endŸ Â4.4.2Ž‘#!\Set‘ÕopQÂerationsŽ©Mª¹The–¿Þset‘¿ÝopšGerations“p˜opup‘¿Ýalloš¸èws“y˜ou“to‘¿Ýin˜teract“with›¿Ýsets“as“a˜whole.‘±¹If˜yš¸èou“w˜an˜t“to›¿ÝopGerate“on˜the“dataޤ ®ordering–V£of›V¤the“sets,‘Wy¸èou“should˜use“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5.1ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.5.1) cvn H.B /ANN pdfmark endï color pop˜(data“set“op•Gerations)˜p“opup–V£from“the“Data˜men¸èu.‘v The“pGopupŽ¡allo•¸èws›Û$y“ou˜to˜select˜a˜source˜(one˜set˜within˜one‘Û#graph)˜and˜a˜destination˜and˜p•Gerform˜some˜action˜up“onŽ¡them›zì(cop•¸èy‘ÿ*¸,‘„`mo“v“e,‘„_sw“ap).‘âæThis˜pGopup‘zíalso˜giv“e˜y“ou‘zía˜quic“k‘zíaccess˜to˜sev“eral–zígraph˜and“set˜selectors“if˜y¸èouŽ¡w•¸èan“t–U to“pšGerform“some“other“op˜eration“lik¸èe“hiding“a“graph“or“creating“a“new“set“from“blo˜c¸èk“data.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.3) cvn /DEST pdfmark endŸçÂ4.4.3Ž‘#!\Arrange‘Õgraphsަ¹This–U enš¸ètry“res“up“a“pGopup“to“la˜y“out“sev˜eral“graphs“in“a“regular“grid“giv˜en“b˜y“ÂM“¹ro˜ws“and“ÂN“¹columns.Ž©ؼThe–©Ýgraph›©Þselector“at˜the“top˜allo¸èws“one˜to“select˜a“n•¸èum“bGer˜of–©Ýgraphs˜the“arrangemen¸èt˜will“opGerate˜on.‘o¸IfŽ¡the›cÖn•¸èum“bGer–cÕof˜selected“graphs˜isn't˜equal“to˜ÂM‘cÒ¹times“ÂN¹,˜new˜graphs“ma¸èy˜bGe˜created“or˜extra“graphs˜killedŽ¡if–U needed.‘q€These“options“are“conš¸ètrolled“b˜y“the“respGectiv˜e“c˜hec˜kbGo˜xes“bGelo˜w“the“graph“selector.ަThe–|¾order›|¿in“whic¸èh˜the“matrix“is˜lled“in˜with“the“graphs˜can“bGe“selected˜(rst“horizon¸ètally˜then“v¸èerticallyŽ¡or–EMvise“vš¸èersa,‘Hwwith“either“of“them“in˜v˜erted).‘l:A˜dditionaly‘ÿ*¸,‘Hwone“ma˜y“c˜hoGose“to“ll“the“matrix“in“the“snak˜e-lik˜eŽ¡manner–U (adjacenš¸èt“"strok˜es"“are“an˜ti-parallel).ަThe–kÎrest“of“the‘kÍconš¸ètrols“of“the“dialog“windo˜w“deal“with“the‘kÍmatrix“spacing:‘ü×left/righ˜t/top/bGottom“page“osetsŽ¡(in–¬the‘¬viewpšGort“co˜ordinates)‘¬and“År‘ÿ}/elative‘lk¹inš¸èter-cell“distances,‘ÁÜv˜ertical‘¬and“horizon˜tal.‘vvNext‘¬to“eac˜h‘¬of“theŽ¡v•¸èertical/horizon“tal›ü>spacing‘ü?spin“bGo“xes,‘a˜"P“ac“k"‘ü?c“hec“kbGo“x˜is˜found.‘SàEnabling˜it‘ü?eectiv“ely˜sets‘ü?the˜respGectiv“eŽ¡in¸èter-cell– Ždistance“to› zero“and“alter“axis˜ticš¸èkmark“settings“suc˜h“that“only‘ bGottom/left-most“tic˜kmarks“areŽ¡visible.ަIf–@•yš¸èou‘@–don't“w˜an˜t“the“regular‘@–la˜y˜out“this“arrangemen˜t“giv˜es–@–y˜ou,‘{ry˜ou“can–@•c˜hange“it“afterw˜ards‘@–using“theŽ¡mouse–U (select“a“graph“and“double“clicš¸èk“on“the“foGcus“mark˜er,“see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.2.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.5) cvn H.B /ANN pdfmark endï color pop“(clic˜ks“and“double“clic˜ks)).Ž©}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.4) cvn /DEST pdfmark endŸXäÂ4.4.4Ž‘#!\Ov•®>erla“y‘ÕgraphsŽŸMª¹Y‘ÿ*¸ou–f×can“o•¸èv“erla“y–f×a“graph“on›fÖtop“of“another“one.‘¦¥The“main“use“of“this“feature˜is“to“plot“sevš¸èeral“curv˜es“usingŽ¡dierenš¸èt–cscales“on“the‘csame“(apparen˜tly)“graph.‘›kThe“main‘cdicult˜y“is“to“bGe“sure“y˜ou‘copGerate“on“the“graphŽ¡y•¸èou›U w“an“t˜at˜all˜times˜(y“ou˜can˜hide˜one˜for˜a˜momen“t˜if˜this˜b•Gecomes˜to“o˜dicult).ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.5) cvn /DEST pdfmark endŸXäÂ4.4.5Ž‘#!\AutoscaleŽŸMª¹Using›ÓÞthis‘ÓÝen•¸ètry‘ÿ*¸,‘í¸y“ou˜can˜autoscale–ÓÝone˜graph˜or“all˜graphs˜according˜to“the˜spGecied˜sets“only‘ÿ*¸.‘FkThis“is˜usefulŽ¡if–`‹yš¸èou“need“either“to“ha˜v˜e‘`Štruly“comparable“graphs“despite“ev˜ery“one“con˜tains“data“of“dieren˜t‘`Šranges,‘cfor“ifŽ¡y•¸èou›U w“an“t˜to˜foGcus˜y“our˜atten“tion˜on˜one˜set˜only˜while˜it˜is˜displa“y“ed˜with˜other˜data˜in˜a˜complex˜graph.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.6) cvn /DEST pdfmark end¤çÂ4.4.6Ž‘#!\Regions‘Õmen®>uŽŸf–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.7) cvn /DEST pdfmark end¡Status‘ÒÞ¹This–2Xsmall›2WpGopup“only˜displa¸èys“the˜curren¸èt“state˜(t¸èypGe“and˜whether“it˜is“activ¸èe˜or“not)˜of“theŽŸ ®existing‘U regions.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.8) cvn /DEST pdfmark end¡ÂDene‘ Ôx¹Y‘ÿ*¸ou–U can“dene“a“new“region“(or“redene“an“existing“one),“the“allo•¸èw“ed–U region“t¸èypGes“are:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹Ó¾ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.24) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹24Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Inside‘U pGolygonޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Outside‘U pGolygonŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹AbGo•¸èv“e‘U lineŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Belo¸èw‘U lineŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Left–U of“lineŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Righ¸èt–U of“lineŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹In–U horizon¸ètal“rangeŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹In–U v¸èertical“rangeŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Out–U of“horizon¸ètal“rangeŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Out–U of“v¸èertical“rangeŽŸؼA–U region“can“bGe“either“linkš¸èed“to“the“curren˜t“graph“only“or“to“all“graphs.ޤïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.9) cvn /DEST pdfmark end©çÂClear‘ Ôx¹This–U kills“a“region.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.10) cvn /DEST pdfmark end¦ÂRepQÂort‘Õon‘ Ôx¹This–U pšGopup“rep˜orts“yš¸èou“whic˜h“sets“or“pGoin˜ts“are“inside“or“outside“of“a“region.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.7) cvn /DEST pdfmark end¦Â4.4.7Ž‘#!\Hot‘ÕlinksŽŸMª¹Y‘ÿ*¸ou–BFcan“link“a“set“to“a“le‘BEor“a“pipšGe“using“this“feature.‘k7Once“a“link“has“b˜een“established,‘F y¸èou“can“up˜date“itŽŸ ®(i.e.,–U read“data“again)“bš¸èy“clic˜king“on“the“upGdate“button.ŽŸؼCurren¸ètly‘ÿ*¸,–U only“simple“XY“sets“can“bGe“used“for“hotlinks.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.8) cvn /DEST pdfmark end¦Â4.4.8Ž‘#!\Set–ÕlošQÂcator“xed“p˜oin®>tŽ©Mª¹After–¬Œha¸èving›¬selected“this˜menš¸èu“en˜try‘ÿ*¸,‘Âgy˜ou›¬can“select“a˜pGoin¸èt“on˜a“graph“that˜will“bGe“used˜as“the˜origin“ofޤ ®the–oålošGcator“displa¸èy“(just‘oæb˜eloš¸èw“the“men˜u“bar).‘ÁÐThe“xed“pGoin˜t“is“tak˜en“in˜to“accoun˜t‘oæonly“when“the“displa˜yŽ¡t¸èypšGe–U of“the“lo˜cator“is“set“to“[D•¸èX,D“Y].ޤ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.9) cvn /DEST pdfmark endŸXäÂ4.4.9Ž‘#!\Clear–ÕlošQÂcator“xed“p˜oin®>tަ¹This–U enš¸ètry“is“pro˜vided“to“remo˜v˜e“a“xed“pGoin˜t“set“bšGefore“and“use“the“default“again:‘q€p˜oin¸èt“[0,“0].Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.10) cvn /DEST pdfmark endŸXäÂ4.4.10Ž‘(áLoQÂcator‘Õpropsަ¹The–E¬lošGcator“props“p˜opup“alloš¸èws“y˜ou“to“customize“the“displa˜y“of“the“loGcator,‘HÃmainly“its“t˜ypGe“and“the“formatŽŸ ®and–U precision“of“the“displaš¸èy–ÿ*¸.‘q€Y“ou–U can“use“all“the“formats“that“are“allo˜w˜ed“in“the“graphs“scales.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹êïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.25) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹25Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.4.11) cvn /DEST pdfmark endŸ Â4.4.11Ž‘(áPreferencesޤMª¹The–^@preferences‘^ApGopup“alloš¸èws“y˜ou›^Ato“set“miscellaneous˜propGerties“of“y¸èour˜Grace“session,‘ suc¸èh˜as“GUI‘^bGeha¸èvior,Ž© ®cursor–U tš¸èypGe,“date“reading“hin˜t“and“reference“date“used“for“calendar“con˜v˜ersions.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.5) cvn /DEST pdfmark endŸ.ÂÄ4.5Ž‘¾Data‘¸men uŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.5.1) cvn /DEST pdfmark endŸؼÂ4.5.1Ž‘#!\Data–Õset“opQÂerationsŽ¡¹This–áþpGopup›áÿgathers“all˜opGerations“that˜are“related˜to“the˜ordering“of˜data“pGoin¸èts˜inside“a˜set“or˜bGet•¸èw“een‘áþsets.ަIf›{y•¸èou‘zw“an“t˜to–zopGerate˜on“the˜sets˜as“a˜whole,‘›y¸èou˜should“use˜the˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.2ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.4.2) cvn H.B /ANN pdfmark endï color pop“(set˜opšGerations)“p˜opup›{from“the˜Editަmen¸èu.‘fµY‘ÿ*¸ou›¦Ýcan–¦Üsort“according˜to“an¸èy“coGordinate˜(X,“Y,˜D¸èX,“...)‘fµin“ascending˜or“descending˜order,‘»Krev¸èerseަthe–'îorder›'íof“the˜pGoin•¸èts,‘0øjoin˜sev“eral–'îsets“in¸èto˜one,‘0øsplit˜one“set˜inš¸èto“sev˜eral“others›'íof“equal˜lengths,‘0øor˜drop“aަrange–…"of›…!pGoin¸èts“from“a˜set.‘†The˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.3) cvn H.B /ANN pdfmark endï color pop“(set“selector)˜of“the“pGopup˜shoš¸èws“the“n˜um˜bšGer“of‘…!p˜oinš¸èts“in“eac˜h‘…!set“inަsquare›U brac•¸èk“ets˜lik“e˜this:‘q€G0.S0[63],˜the˜pGoin“ts˜are˜n“um“bGered˜from˜0˜to˜n-1.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.5.2) cvn /DEST pdfmark endŸXäÂ4.5.2Ž‘#!\T‘ÿ ºransformations‘Õmen®>uŽ¡¹The–U transformations“sub-menš¸èu“giv˜es“y˜ou“access“to“all“data-mining“features“of“Grace.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.11) cvn /DEST pdfmark endŸçÂEv‘ÿ\|aluate‘ âexpression‘ B¹Using–¦)ev‘ÿqÐaluate“expression“alloš¸èws“y˜ou“to“create“a“set‘¦(b˜y“applying“an“explicit“form˜ulaަto–U another“set,“or“to“parts“of“another“set“if“y¸èou“use“regions“restrictions.ޤؼAll–Ýthe“classical“mathematical“functions“are“a¸èv‘ÿqÐailable“(cos,›ÿsin,‘ÿbut“also“lgamma,˜j1,‘ÿerf,˜...).‘ nAs“usual“allަtrigonometric–=functions›>use“radians˜b¸èy“default˜but“y¸èou“can˜spGecify“a˜unit“if“y¸èou˜prefer“to˜sa¸èy“cos˜(x“rad)ަor–Îsin“(3“*“y“deg).‘Ü$F‘ÿ*¸or“the“full“list“of“aš¸èv‘ÿqÐailable“n˜umerical“functions“and“opšGerators,‘ì:see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 15.4ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.5.4) cvn H.B /ANN pdfmark endï color pop“(Op˜erators“andަfunctions).Ž¡In–Uthe“form•¸èula,›0#y“ou–Ucan“use“X,‘VY,“Y1,‘0"...,˜Y4“to“denote“anš¸èy“coGordinate‘Vy˜ou“lik˜e“from“the“source“set.‘ Anަimplicit–U lošGop“will“b˜e“used“around“yš¸èour“form˜ula“so“if“y˜ou“sa˜y:Ž©´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘CƒÀÇx–¹N=“x“-“4966.5ŽŸ Š=Ÿؼ¹yš¸èou–U will“shift“all“pGoin˜ts“of“y˜our“set“4966.5“units“to“the“left.Ž¡Y‘ÿ*¸ou–U can“use“more“than“one“set“in“the“same“formš¸èula,“lik˜e“this:ަïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘CƒÀÇy–¹N=“y“-“0.653“*“sin“(x“deg)“+“s2.yŽŸ Š=Ÿؼ¹whic•¸èh›1émeans‘1èy“ou˜use‘1èbGoth˜X–1ßand˜Y“from˜the–1èsource˜set“but˜also“the˜Y‘1àcoGordinate“of˜set“2.‘eÃBew¸èare“that˜theޤ ®lošGop–>is“a‘?simple“lo˜op“o•¸èv“er–>the“indices,‘all›?the“sets“y¸èou“use˜in“sucš¸èh“an“h˜ybrid“expression‘?should“therefore“ha˜v˜eŽ¡the›B same‘Bn•¸èum“b•Ger˜of˜p“oin¸èts‘Band˜p“oin¸èt˜i–Bof˜one˜set“should˜really˜bGe“related˜to“pGoin¸èt˜i˜of“the˜other˜set.‘k*If˜y¸èourŽ¡sets–U do“not“folloš¸èw“these“requiremen˜ts,“y˜ou“should“rst“homogenize“them“using“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5.2ï color popŸù•¼ïps:SDict begin H.R endŽï|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.18) cvn H.B /ANN pdfmark endï color pop“(in˜terpGolation).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ødïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.26) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹26Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.12) cvn /DEST pdfmark endŸ ÂHistograms‘ ¼¹The–©.histograms“pGopup“alloš¸èws“y˜ou›©/to“compute“either“standard“or˜cum•¸èulativ“e–©.histograms“fromޤ ®the–òY‘äcoGordinates“of›ñy¸èour“data.‘_ÆOptionally‘ÿ*¸,‘*•the˜histograms“can“bGe“normalized˜to“1“(hence“proGducing˜a“PDFŽ¡(Probabilit¸èy–U Distribution“F‘ÿ*¸unction).Ž©ؼThe–u`bins“can“bGe“either“a“linear“mesh“dened“bš¸èy“its‘u_min,–½pmax,“and–u`length“v‘ÿqÐalues,‘½por“a“mesh“formed“b˜yŽ¡abscissas–U of“another“set“(in“whicš¸èh“case“abscissas“of“the“set“m˜ust“form“a“strictly“monotonic“arra˜y).ŽŸ@ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.13) cvn /DEST pdfmark endŸXäÂF‘ÿ ºourier‘qütransforms‘q\¹This–ÝpGopup“is“devš¸èoted“to‘ÝŽdirect“and“in˜v˜erse“F›ÿ*¸ourier“transforms“(actually˜,‘ÿ©what“isŽ¡computed–DWis“a“pšGo•¸èw“er–DWsp˜ectrum).‘?&The“default“is“to“p˜erform“a“direct“transform‘DXon“unltered“data“and“toŽ¡proGduce–ƒra“set“with›ƒsthe“index“as“abscissa“and“magnitude˜as“ordinate.‘üvY‘ÿ*¸ou“can“lter˜the“input“data“windo¸èwŽ¡through‘wAtriangular,‘£¢Hanning,–£¡W‘ÿ*¸elcš¸èh,“Hamming,“Blac˜kman–wAand‘wBP˜arzen“lters.‘'ŒY‘ÿ*¸ou“can“load‘wBmagnitude,‘£¡phaseŽ¡or–úcošGecien¸èts“and“use“either“index,‘#@frequency“or“p˜erio˜d“as“abscissas.‘`5Y‘ÿ*¸ou“can“c¸èho˜ose“b˜et•¸èw“een–údirect“andŽ¡in•¸èv“erse–-çF‘ÿ*¸ourier“transforms.‘dmIf“y¸èou›-èspGecify“real“input“data,‘5¿X‘-Ýis“assumed“to˜bGe“equally“spaced“and“ignored;‘:úifŽ¡yš¸èou–U spGecify“complex“input“data“X“is“tak˜en“as“the“real“part“and“Y“as“the“imaginary“part.ަIf–tGrace“w¸èas“congured‘swith“the“FFTW›Blibrary“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11ï color popŸù•¼ïps:SDict begin H.R endŽïwps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (Item.1) cvn H.B /ANN pdfmark endï color pop“(conguration)),‘FÈthen“the“DFT˜and“FFT˜buttonsŽ¡really–·>pšGerform“the“same“transform“(so“there“is“no“sp˜eed-up“in“using“FFT‘·%in“this“case).‘—ÚIf“yš¸èou“w˜an˜t“GraceŽ¡can–U to“use“FFTW“Åwisdom‘u¹les,“yš¸èou“should“set“sev˜eral“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.3.1ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.3.1) cvn H.B /ANN pdfmark endï color pop“(en˜vironmen˜t“v‘ÿqÐariables)“to“name“them.ŽŸ@ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.14) cvn /DEST pdfmark end©XäÂRunning‘ÄDa•®>v“erages‘ ä¹The–F~running“a•¸èv“erage›F~pGopup‘Fallo“ws˜y“ou˜to˜compute˜some˜v‘ÿqÐalues˜on˜a˜sliding˜windo“wŽ¡o•¸èv“er›¢y“our˜data.‘YÍY‘ÿ*¸ou˜c“ho•Gose˜b“oth˜the˜v‘ÿqÐalue˜y•¸èou˜need˜(a“v“erage,–õëmedian,“minim•¸èum,‘õêmaxim“um,‘õëstandardŽ¡deviation)–žôand“the“length›žõof“the“windo¸èw“and“pGerform“the˜opGeration.‘NüY‘ÿ*¸ou“can“restrict˜the“opGeration“to“theŽ¡p•Goin¸èts›U b“elonging˜to˜(or˜outside˜of‘Ç)˜a˜region.ŽŸ@ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.15) cvn /DEST pdfmark end¦ÂDierences‘ Y‘¹The–êAdierences“pGopup“is“used“to‘êBcompute“approš¸èximations“of“the“rst“deriv‘ÿqÐativ˜e“of“a“functionŽ¡with–Ànite“dierences.‘W The“only“c¸èhoice“(apart“from›¿the“source“set“of˜course)“is“the“t¸èypGe“of˜dierences“to“use:Ž¡forw•¸èard,›U bac“kw“ard˜or˜cen“tered.Ž©±íïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.16) cvn /DEST pdfmark endŸçÂSeasonal‘ldierences‘͹The›“&seasonal–“'dierences“pGopup˜is“used˜to“subtract˜data“from“a˜p•Gerio“d–“'to˜data“ofŽ¡the–üžpreceding“p•Gerio“d–üž(namely‘üy[i]“-“y[i“+“p•Gerio“d]).‘SÿBewš¸èare–üžthat“the“p•Gerio“d–üžis“en˜tered“in“terms‘üof“index“in“theŽ¡set–U and“not“in“terms“of“abscissa!ŽŸ ÀDïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.17) cvn /DEST pdfmark endŸؼÂIn®>tegration‘ H˹The–Ûªin¸ètegration›Û«pGopup“is˜used“to˜compute“the˜in¸ètegral“of˜a“set˜and˜optionally“to˜load“it.‘ITheŽ¡nš¸èumerical–v‘ÿqÐalue“of“the“in˜tegral“is“sho˜wn“in“the‘text“eld“after“computation.‘ïwSelecting“"cum˜ulativ˜e“sum"“inŽ¡the–jJc¸èhoice›jKitem“will“create˜and“load“a˜new“set“with˜the“in¸ètegral“and˜compute“the“end˜v‘ÿqÐalue,‘o•selecting“"sumŽ¡only"–U will“only“compute“the“end“v‘ÿqÐalue.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.18) cvn /DEST pdfmark endŸçÂIn®>terpQÂolation/Splines‘ —ç¹This– upšGopup“is“used“to‘ vin¸èterp˜olate“a“set“on“an‘ varraš¸èy“of“alternativ˜e“X‘ hcoGordinates.Ž¡This–ÀÜis“mainly‘ÀÝused“bšGefore“p˜erforming“some“complex‘ÀÝop˜erations“b˜et•¸èw“een›ÀÜt“w“o˜sets˜with‘ÀÝthe˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5.2ï color popŸù•¼ïps:SDict begin H.R endŽï|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.11) cvn H.B /ANN pdfmark endï color pop˜(ev‘ÿqÐaluateŽ¡expression)‘U pGopup.Ž©ؼThe–Ðòsampling“arraš¸èy“can“bGe“either“a“linear“mesh“dened“b˜y“its“min,›ëbmax,‘ëaand“length“v‘ÿqÐalues,˜or“a“mesh“formedŽ¡b¸èy–U abscissas“of“another“set.ަSev•¸èeral›U in“terp•Golation˜metho“ds˜can˜b“e˜used:‘q€linear,˜spline˜or˜Akima˜spline.ަNote–Yßthat“if›Yàthe“sampling“mesh“is˜not“en¸ètirely“within“the˜source“set“X‘YœbGounds,‘›ev‘ÿqÐaluation˜at“the“pGoin¸ètsŽ¡bšGey¸èond–(/the“b˜ounds“will‘(.b˜e“p˜erformed“using“in¸èterp˜olation“parameters“from“the“rst‘(.(or“the“last)“segmen¸ètŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ Ñïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.27) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹27Ž’ÕÁGï color popŽŽ £n ýˆ.\of–+€the“source“set,‘awhicš¸èh“can“bGe“considered“a‘+primitiv˜e“extrapšGolation.‘ô This“b˜eha¸èviour‘+can“b˜e“disabled“b¸èyޤ ®c•¸èhec“king–U the“"Strict"“option“on“the“pGopup.Ž©ؼThe–U abscissas“of“the“set“bšGeing“in¸èterp˜olated“mš¸èust“form“a“strictly“monotonic“arra˜y‘ÿ*¸.ŽŸ¯Sïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.19) cvn /DEST pdfmark endŸçÂRegression‘ »C¹The–?5regression“pšGopup“can“b˜e“used“to“t“a“set‘?4against“p˜olynomials“or“some“sp˜ecic“functionsŽ¡(y=A*xB,–¤y=A*exp(B*x),‘@Åy=A+B*ln(x)›£and“y=1/(A+Bx))“for“whic¸èh“a“simple˜transformation“of“inputŽ¡data–U can“bGe“used“to“apply“linear“regression“form¸èulas.ަY‘ÿ*¸ou–¥¢can›¥¡load“either˜the“tted˜v‘ÿqÐalues,‘¹Âthe“residuals˜or“the˜function“itself.‘cChoGosing“to˜load“tted˜v‘ÿqÐalues“orŽ¡residuals–{[leads›{\to“a˜set“of“the˜same“length˜and“abscissas˜as“the“initial˜set.‘ä2ChoGosing“to˜load“the˜function“isŽ¡almost–Á‘similar›Á’to“load“the˜tted“v‘ÿqÐalues“except˜that“y•¸èou˜c“hoGose›Á‘y“ourself˜the–Á’bGoundaries˜and˜the“n•¸èum“bGer˜ofŽ¡p•Goin¸èts.‘å*This‘{¯can›{®b“e˜used˜for˜example˜to˜dra•¸èw‘{¯the˜curv“e˜outside˜of˜the˜data˜sample˜range‘{¯or˜to˜proGduce˜anŽ¡ev¸èenly–U spaced“set“from“an“irregular“one.ŽŸ¯Tïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.20) cvn /DEST pdfmark endŸçÂNon-linear‘ãüt‘ ã\¹The›ƒvnon–ƒwlinear“t“pGopup˜can“bGe“used“for˜functions“outside“of“the˜simple“regression“methoGdsŽ¡scop•Ge.‘afWith›$Óthis‘$Òp“opup˜y•¸èou›$Òpro“vide˜the‘$Óexpression˜y“ourself‘$Óusing˜a0,–.|a1,‘.{...,“a9˜to–$Ódenote˜the“t˜parametersŽ¡(as–Ëman“example‘Ënyš¸èou“can“sa˜y“y›Ën=“a0“*“cos“(a1˜*“x“+“a2)).‘CšY‘ÿ*¸ou˜spGecify“a“tolerance,‘æ÷starting˜v‘ÿqÐalues“and“optionalŽ¡bšGounds–U and“run“sev¸èeral“steps“b˜efore“loading“the“results.ަThe–Û t“c•¸èharacteristics‘Û (n“um“bšGer–Û of“parameters,–ü…form¸èula,“...)‘>can‘Û b˜e›Û sa•¸èv“ed–Û in“a“le“and˜retriev¸èed“as“neededŽ¡using–U the“le“men¸èu“of“the“pGopup.ަIn–N/the“"Aš¸èdv‘ÿqÐanced"“tab,‘Œsy˜ou“can“additionally“apply“a“restriction“to“the“set(s)“to“bGe“tted“(th˜us“ignoringŽ¡pGoin¸èts– Ènot“satisfying› Éthe“criteria),‘+@use“one“of“preset˜w•¸èeigh“ting› Èsc“hemes˜or˜dene˜y“our˜o“wn‘ É(notice˜that˜"dY"Ž¡in––õthe“preset“"1/dY2"›–öone“actually“refers“to“the“third“column“of˜the“data“set;‘·àuse“the“"Custom"“functionŽ¡if–Œ¨this›Œ§doGesn't“mak¸èe˜sense“for˜y¸èour“data˜set),‘šŠand˜c¸èhoGose“whether˜to“load˜the“tted“v‘ÿqÐalues,‘š‰the˜residuals“orŽ¡the–Mfunction“itself.‘WChoGosing“to“load“tted›Lv‘ÿqÐalues“or“residuals“leads“to“a“set“of˜the“same“length“and“abscissasŽ¡as–¦{the“initial›¦zset.‘e‘ChoGosing“to˜load“the“function“is“almost“similar˜to“load“the“tted“v‘ÿqÐalues˜except“that“y¸èouŽ¡c•¸èhoGose›”'y“ourself˜the˜bGoundaries‘”(and˜the˜n“um“b•Ger˜of˜p“oin¸èts.‘.–This˜can˜b“e˜used˜for˜example‘”(to˜dra•¸èw˜the˜curv“eŽ¡outside–U of“the“data“sample“range“or“to“proGduce“an“ev¸èenly“spaced“set“from“an“irregular“one.Ž©¯Sïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.21) cvn /DEST pdfmark endŸçÂCorrelation/co®>v‘ÿ\|ariance‘&¹This–ˆ'pšGopup“can‘ˆ&b˜e“used“to“compute‘ˆ&auto˜correlation“of“one“set‘ˆ&or“cross“corre-Ž¡lation›@SbGet•¸èw“een˜t“w“o–@Tsets.‘j‘Y‘ÿ*¸ou˜only˜select˜the˜set“(or˜sets)˜and˜spGecify˜the˜maximš¸èum“lag.‘j‘A‘@Nc˜hec˜k–@SbGo˜x“allo˜wsŽ¡one–U to“ev›ÿqÐaluate“co¸èv˜ariance“instead“of“correlation.‘q€The“result“is“normalized“so“that“abs(C(0))“=“1.ŽŸ=„ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.22) cvn /DEST pdfmark endŸXäÂDigital‘ðlter‘ ï~¹Y‘ÿ*¸ou–lŸcan“use“a›l set“as“a“w•¸èeigh“t–lŸto˜lter“another“set.‘·þOnly“the“Y‘l™part“and“the˜length“of“theŽ¡w•¸èeigh“ting–U set“are“impGortan¸èt,“the“X“part“is“ignored.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.23) cvn /DEST pdfmark end©çÂLinear‘h²con•®>v“olution‘ h¹The›öÞcon•¸èv“olution˜pGopup‘öÝis˜used˜to˜...‘Rcon“v“olv“e˜t“w“o˜sets.‘RY‘ÿ*¸ou‘öÝonly˜select˜the˜sets˜andŽ¡apply‘ÿ*¸.ŽŸ¯Tïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.24) cvn /DEST pdfmark end¦ÂGeometric‘Ÿ^transforms‘ž¾¹Y‘ÿ*¸ou›ã can–ãŸrotate,‘G@scale“or˜translate˜sets“using˜the“geometric˜transformationsŽ¡p•Gopup.‘q€Y‘ÿ*¸ou›U sp“ecify˜the˜c•¸èharacteristics˜of˜eac“h˜transform˜and˜the˜application˜order.ŽŸ¯Sïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.25) cvn /DEST pdfmark end¦ÂSample‘ìpQÂoin®>ts‘K¹This–”tpGopup“proš¸èvides“t˜w˜o“sampling“methoGds.‘/{The“rst“one“is“to‘”sc˜hošGose“a“starting“p˜oin¸ètŽ¡and–U a“step,“the“second“one“is“to“select“only“the“pšGoin¸èts“that“satisfy“a“b˜o˜olean“expression“y¸èou“sp˜ecify‘ÿ*¸.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹'\ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.28) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹28Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.26) cvn /DEST pdfmark endŸ ÂPrune‘0)data‘/‰¹This–¤PpGopup›¤Qis“dev¸èoted“to˜reducing“h¸èuge“sets“(and˜then“sa¸èving“bGoth“computation˜time“andޤ ®disk‘U space).Ž©ؼThe–›ùin¸èterpšGolation“metho˜d“can‘›úb˜e“applied“only“to“ordered“sets:‘ÿ3it“is“based“on“the“assumption‘›úthat“if“a“realŽ¡pGoinš¸èt–>Äand“an“in˜terpGolation‘>Åbased“on“neigh˜bšGoring“p˜oin¸èts“are“closer“than‘>Åa“sp˜ecied“threshold,‘C=then“the“p˜oin¸ètŽ¡is–U redundan¸èt“and“can“bGe“eliminated.ަThe–ü—geometric‘ü–methošGds“(circle,‘Lellipse,‘Krectangle)“can“b˜e›ü–applied“to“an¸èy˜set,‘Lthey“test˜eacš¸èh“pGoin˜t“in‘ü–turn“andŽ¡kš¸èeep–U only“those“that“are“not“in“the“neigh˜b•Gorho“o“d–U of“previous“pGoin˜ts.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.5.3) cvn /DEST pdfmark endŸçÂ4.5.3Ž‘#!\F‘ÿ ºeature‘ÕextractionŽŸMª¹Givš¸èen–EFa‘EGset“of“curv˜es“in›EGa“graph,‘Pextract“a“feature“from˜eacš¸èh“curv˜e“and“use›EGthe“v‘ÿqÐalues“of“the˜feature“toŽ¡proš¸èvide–U the“Y“v‘ÿqÐalues“for“a“new“curv˜e.Ž ÓM þ:Õ[ïcolor push Black Å*¥ ÿù‘ߨïcolor push Blackï color popŽŽ‘$ߨ ÿ)B£‰ffŒ—¤ “q‘F‘ÿ*¸eatureŽ‘iz‰DescriptionŽŽŽŽŸ‰ffŒ—¡‘Y‘U minim¸èumŽ‘iz‰Minim¸èum–U Y“v‘ÿqÐalue“of“setŽŽŽŽ¤ ®‘Y‘U maxim¸èumŽ‘iz‰Maxim¸èum–U Y“v‘ÿqÐalue“of“setŽŽŽŽ¡‘Y‘U a•¸èv“erageŽ‘iz‰A‘þã v¸èerage–U Y“v‘ÿqÐalue“of“setŽŽŽŽ¡‘Y‘U std.‘q€dev.Ž‘iz‰Standard–U deviation“of“Y“v‘ÿqÐaluesŽŽŽŽ¡‘Y‘U medianŽ‘iz‰Median–U Y“v‘ÿqÐalueŽŽŽŽ¡‘X‘U minim¸èumŽ‘iz‰Minim¸èum–U X“v‘ÿqÐalue“of“setŽŽŽŽ¡‘X‘U maxim¸èumŽ‘iz‰Maxim¸èum–U X“v‘ÿqÐalue“of“setŽŽŽŽ¡‘X‘U a•¸èv“erageŽ‘iz‰A‘þã v¸èerage–U X“v‘ÿqÐalue“of“setŽŽŽŽ¡‘X‘U std.‘q€dev.Ž‘iz‰Standard–U deviation“of“X“v‘ÿqÐaluesŽŽŽŽ¡‘X‘U medianŽ‘iz‰Median–U X“v‘ÿqÐalueŽŽŽŽ¡‘F‘ÿ*¸requencyŽ‘iz‰Pš¸èerform–®HDFT‘­î(FFT‘­ïif“set‘®Glength“a“pGo˜w˜er›®Gof“2)“to˜nd“largestŽŸ ®‘iz‰frequency‘U compGonen¸ètŽŽŽŽ©\'‘P¸èerioGdŽ‘iz‰In•¸èv“erse–U of“abGo•¸èv“eŽŽŽŽ¡‘Zero‘U crossingŽ‘iz‰Time–U of“the“rst“zero“crossing,“+“or“-“goingŽŽŽŽ¡‘Rise‘U timeŽ‘iz‰Assume–ycurvš¸èe“starts‘yat“the“minim˜um“and“rises‘yto“the“maxim˜um,ޤ ®‘iz‰get–Þtime“to“go‘ßfrom“10%“to“90%“of“rise.‘¹»F‘ÿ*¸or“single“expGonen¸ètialŽ¡‘iz‰curvš¸èes,–U this“is“2.2*time“constan˜tŽŽŽŽŸ) ;‘F‘ÿ*¸all‘U timeŽ‘iz‰Assume–úzcurvš¸èe“starts‘úyat“the“maxim˜um“and“drops‘úyto“the“minim˜um,ŽŸ ®‘iz‰get–U time“to“go“from“90%“to“10%“of“fallŽŽŽŽ¦‘SlopGeŽ‘iz‰P¸èerform–U linear“regression“to“obtain“slopGeŽŽŽŽ¡‘Y‘U in¸èterceptŽ‘iz‰Pš¸èerform–U linear“regression“to“obtain“Y-in˜terceptŽŽŽŽ¡‘Set‘U lengthŽ‘iz‰Num¸èbšGer–U of“data“p˜oin¸èts“in“setŽŽŽŽ¡‘Half–U maximal“widthŽ‘iz‰Assume–Zcurv¸èe›Z starts“from˜the“minim¸èum,‘›Irises“to˜the“maxim¸èumޤ ®‘iz‰and–¥fdrops“to“the›¥eminim¸èum“again.‘bRDetermine“the˜time“for“whic¸èhŽ¡‘iz‰the–U curvš¸èe“is“elev‘ÿqÐated“more“than“50%“of“the“maxim˜um“rise.ŽŽŽŽŸ) ;‘Barycen¸èter‘U XŽ‘iz‰Barycen¸èter–U along“X“axisŽŽŽŽ¡‘Barycen¸èter‘U YŽ‘iz‰Barycen¸èter–U along“Y“axisŽŽŽŽ¡‘X–U (Y“max)Ž‘iz‰X–U of“Maxim¸èum“YŽŽŽŽ¡‘Y–U (X“max)Ž‘iz‰Y–U of“Maxim¸èum“XŽŽŽŽ¡‘in¸ètegralŽ‘iz‰cum•¸èulativ“e‘U sumŽŽŽŽŸ‰ffŒ—ŽŽŽ îâ’¦Ú:ïcolor push BlackT‘ÿ*¸able›U 4:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.4) cvn /DEST pdfmark endï color pop“Extractable˜features˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹=äïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.29) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹29Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.5.4) cvn /DEST pdfmark endŸ Â4.5.4Ž‘#!\ImpQÂort‘Õmen®>uŽŸf–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.27) cvn /DEST pdfmark endŸçASCIQÂI‘ ±ó¹Read–7#new“sets“of“data›7$in“a“graph.‘gA‘7ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.2) cvn H.B /ANN pdfmark endï color pop“(graph“selector)“is“used“to“spGecify˜the“graph“where“theޤ ®data–U should“go“(except“when“reading“bloGcš¸èk“data,“whic˜h“are“copied“to“graphs“later“on).Ž©ؼReading–iìas“"Single›iëset"“means“that“if“the˜source“con¸ètains“only“one“column˜of“n¸èumeric“data,‘oone˜set“will“bGeŽ¡created–Þ²using“the“indices“(from“1“to“the“total“n•¸èum“b•Ger‘Þ±of›Þ²p“oin¸èts)˜as˜abscissas˜and˜read˜v‘ÿqÐalues˜as˜ordinatesŽ¡and–›Çthat››Èif“the˜source“con¸ètains˜more“than“one˜column“of˜data,‘­qthe“rst˜t•¸èw“o‘›Çn“umeric˜columns–›Çwill˜bGe“used.Ž¡Reading–¹¿as›¹¾"NXY"“means“that˜the“rst“n¸èumeric˜column“will“pro¸èvide“the˜abscissas“and“all˜remaining“columnsŽ¡will–®pro¸èvide›¯the“ordinates˜of“sev¸èeral˜sets.‘WReading“as˜"BloGc¸èk“data"˜means“all˜column“will˜bGe“read˜and“storedŽ¡and–Ü¥that“another“pGopup“will›ܤallo¸èw“to“select“the“abscissas“and“ordinates“at˜will.‘IXIt˜should“bšGe“noted“that“blo˜c¸èkŽ¡data–D;are›DuŽŸf–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.29) cvn /DEST pdfmark endŸçASCIQÂI‘ عSa•¸èv“e– Ydata“sets› Xin“a“le.‘Y“A‘ Gïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.3) cvn H.B /ANN pdfmark endï color pop“(set“selector)“is“used“to“spGecify˜the“set“to“bGe“sa•¸èv“ed.‘Y“The– Yformat“toŽ¡use–›ýfor“saš¸èving“data“pGoin˜ts“can“bšGe“sp˜ecied“(the“default“v‘ÿqÐalue“is“"%16.8g").‘FA‘›ëwš¸èarning“is“displa˜y˜ed“if“a“leŽ¡with–U the“same“name“already“exists.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.6) cvn /DEST pdfmark endŸ.ÂÄ4.6Ž‘¾Plot‘¸men uŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.6.1) cvn /DEST pdfmark end¦Â4.6.1Ž‘#!\Plot‘ÕappQÂearanceŽ©Mª¹The–Ó¤plot‘Ó¥appšGearance“p˜opup›Ó¥let“y¸èou˜set“the˜time“stamp˜propGerties“and˜the“bac¸èkground“color˜of“the˜page.‘FWTheŽ¡color–EYis›EXused“outside˜of“graphs˜and“also˜on“graphs˜w¸èere“no˜spGecic“bac¸èkground˜color“is˜set.‘l>The˜time“stampŽ¡is–U upšGdated“ev¸èery“time“the“pro‘Ž0ject“is“mo˜died.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.6.2) cvn /DEST pdfmark endŸçÂ4.6.2Ž‘#!\Graph‘ÕappQÂearanceަ¹The–Xgraph‘WappšGearance“p˜opup“can“b˜e‘Wdispla•¸èy“ed–Xfrom“b˜oth›Wthe“plot“men¸èu˜and“bš¸èy“double-clic˜king“on‘Wa“legend,Ž¡title,‘üor›Ú·subtitle–Ú¸of“a˜graph“(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.2.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.5) cvn H.B /ANN pdfmark endï color pop˜(Clic¸èks“and“double˜clic¸èks)).‘GThe“graph“selector˜at“the“top˜allo¸èws“toŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹O}ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.30) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹30Ž’ÕÁGï color popŽŽ £n ýˆ.\cš¸èhoGose–ú…the“graph“y˜ou“w˜an˜t“to“opGerate“on,‘#ßit“also“allo˜ws“certain“common“actions“through“its“pGopup“men˜uޤ ®(see–öÎïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.2) cvn H.B /ANN pdfmark endï color pop›öÏ(graph“selector)).‘RMost˜of“the“actions˜can“also˜bšGe“p˜erformed›öÏusing“the˜"Edit"“men•¸èu˜a“v‘ÿqÐailable‘öÎfromŽ¡the–#pGopup›#men¸èubar.‘`ÍThe“main˜tab“includes˜the“propGerties˜y¸èou“will“need˜more“often˜(title“for˜example),‘- andŽ¡other–U tabs“are“used“to“ne“tune“some“less“frequenš¸ètly“used“options“(fon˜ts,“sizes,“colors,“placemen˜ts).Ž©ؼIf–Á`yš¸èou‘Áaneed“spGecial“c˜haracters“or›ÁaspGecial“formatting“in˜yš¸èour“title“or“subtitle,‘qy˜ou“can“use‘ÁaGrace“escapGeŽ¡sequences–Ö”(the“sequence“will“appšGear‘Ö“v¸èerbatim“in“the“text“eld“but“will“b˜e“rendered‘Ö“on“the“graph),‘öñsee“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.1) cvn H.B /ANN pdfmark endï color popŽ¡(t•¸èypGesetting).‘ýÑIf›Ù;y“ou˜don't˜remem“b•Ger˜the˜mapping‘Ù:b“et•¸èw“een˜alphabGetic˜c“haracters˜and˜the˜glyph˜y“ou˜needŽ¡in–6åsome“spGecic“fonš¸èts‘6ä(mainly“sym˜bGol“and“zapfdingbats),‘<ñy˜ou‘6äcan“in˜v˜ok˜e“the“fon˜t“toGol“from‘6äthe“text“eld“b˜yŽ¡hitting–ÊCTRL-e.‘Z¸Y‘ÿ*¸ou“can“c•¸èhange›Éfon“ts–Êand˜select“c¸èharacters“from˜there,‘uthey˜will“bGe“copied˜bac¸èk“in˜the“textŽ¡eld–`½when›`¾y¸èou“press˜the“"A•¸èccept"˜button.‘”XBew“are˜of–`½the˜pGosition“of˜the“cursor˜as“y•¸èou˜en“ter–`½text˜or“c¸èhangeŽ¡fonš¸èt–ø¾in‘ø½the“fon˜t“toGol,‘ 7the“c˜haracter“or›ø½command“will“bGe˜inserted“at“this˜pGosition,‘ 8not“at˜the“end“of˜the“string!ަY‘ÿ*¸ou›Bšcan‘B™sa•¸èv“e˜graph˜appGearance‘B™parameters˜or˜retriev“e‘B™settings˜previously˜sa“v“ed˜via‘B™the˜"File"˜men“u‘B™of˜thisŽ¡pGopup.‘nuIn‘©qthe›©r"Sa•¸èv“e˜parameters"‘©qdialog,‘¾†y“ou˜can˜c“hoGose‘©qto˜sa“v“e–©qsettings˜either˜for“the˜curren¸èt“graph˜onlyŽ¡or–U for“all“graphs.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.6.3) cvn /DEST pdfmark endŸçÂ4.6.3Ž‘#!\Set‘ÕappQÂearanceŽŸMª¹The–Tkset“appšGearance“p˜opup“can“b˜e“displa•¸èy“ed–Tkfrom“b˜oth“the“plot“menš¸èu“and“b˜y“double-clic˜king“an˜ywhere“in“aŽ¡graph–¶d(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.2.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.5) cvn H.B /ANN pdfmark endï color pop“(Clicš¸èks‘¶eand“double“clic˜ks)).‘•LThe“set‘¶eselector“at“the“top“allo˜ws“to“c˜hoGose‘¶ethe“set“y˜ou“w˜an˜tŽ¡to›SðopGerate–Sñon,‘T-it“also˜allo¸èws“certain˜common˜actions“through˜its“pGopup˜men¸èu“(see˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.3) cvn H.B /ANN pdfmark endï color pop“(set˜selector)).‘qTheŽ¡main–Ý–tab›Ý—gathers“the“propGerties“y¸èou˜will“need“more˜often“(line“and˜sym¸èbšGol“prop˜erties“or“legend‘Ý—string“forŽ¡example),‘eand–aØother›aÙtabs“are“used“to“ne“tune˜some“less“frequen¸ètly“used“options“(drop˜lines,‘ell“propGerties,Ž¡annotated–U v‘ÿqÐalues“and“error“bars“propGerties“for“example).ަY‘ÿ*¸ou–ßwshould“note›ßxthat“despite“the“legend“string“related˜to“Åone‘ŸÆ¹set“is“en¸ètered“in˜the“set“appšGearance“p˜opup,Ž¡this–æ%is“not“sucienš¸èt“to“displa˜y“it.‘L‚Displa˜ying“Åal‘‚Ðl‘legends“is“a“graph“lev˜el“decision,‘üWso“the“toggle“is“in“the“mainŽ¡tab–U of“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.6.2ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.6.2) cvn H.B /ANN pdfmark endï color pop“(graph“appšGearance)“p˜opup.ަIf–Myš¸èou“need“spGecial“c˜haracters“or“spGecial“formatting“in“y˜our“legend,‘*y˜ou“can“use“Grace“escapGe“sequences“(theŽ¡sequence–o7will›o6appGear“v¸èerbatim“in˜the“text“eld˜but“will“bGe˜rendered“on“the˜graph),‘u½see˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.1) cvn H.B /ANN pdfmark endï color pop“(t¸èypGesetting).‘¿ÄIfŽ¡y•¸èou›don't‘remem“b•Ger˜the‘mapping˜b“et•¸èw“een‘alphabGetic˜c“haracters–and˜the“glyph˜y¸èou“need˜in“some˜spGecicŽ¡fon•¸èts›(mainly‘sym“bGol˜and›zapfdingbats),‘;y“ou˜can‘in“v“ok“e˜the‘fon“t˜toGol–from˜the“text˜eld“b¸èy˜hitting“CTRL-e.Ž¡Y‘ÿ*¸ou–’-can“c•¸èhange›’.fon“ts–’-and“select“c¸èharacters˜from“there,‘¡qthey“will“bGe“copied˜bac¸èk“in“the“text˜eld“when“y¸èouŽ¡press–5the‘5ž"Aš¸èccept"“button.‘fÿBew˜are“of“the›5žpGosition“of“the“cursor˜as“yš¸èou“en˜ter“text‘5žor“c˜hange“fon˜t“in‘5žthe“fon˜tŽ¡tošGol,–U the“c¸èharacter“or“command“will“b˜e“inserted“at“this“p˜osition,“not“at“the“end“of“the“string!ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.6.4) cvn /DEST pdfmark endŸçÂ4.6.4Ž‘#!\Axis‘ÕpropQÂertiesŽŸMª¹The–®“axis“propšGerties“p˜opup“can“b˜e“displa•¸èy“ed–®“from“b˜oth‘®’the“"Plot"“menš¸èu“and“b˜y“double-clic˜king“exactly“onŽ¡an–·¿axis“(see‘·¾ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.2.1ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.5) cvn H.B /ANN pdfmark endï color pop“(Clicš¸èks“and“double“clic˜ks)).‘™\The“pulldo˜wn“men˜u“at‘·¾the“top“allo˜ws“to“select‘·¾the“axis“y˜ouŽ¡w•¸èan“t–Uto›VopGerate“on.‘Ä The“"A•¸èctiv“e"˜toggle–Uglobally“activ‘ÿqÐates˜or“deactiv‘ÿqÐates“the˜axis“(all“GUI‘#elemen¸èts“areŽ¡insensitivš¸èe–=†for“deactiv‘ÿqÐated“axes).‘i¢The“start“and“stop‘=…elds“depict“the“displa˜y˜ed“range.‘i¢Three“t˜ypGes“of“scalesŽ¡are–™Äa¸èv‘ÿqÐailable:‘úÉlinear,›ªílogarithmic‘™Åor“reciproGcal,˜and‘™Åyš¸èou“can“in˜v˜ert“the‘™Åaxis“(whic˜h“normally‘™Åincreases“fromŽ¡left–gƒto“righ¸èt›g‚and“from“bGottom“to“top).‘¨¨The“main“tab“includes˜the“propGerties“y¸èou“will“need˜more“often“(axisŽ¡labGel,›–štic¸èk–‰‚spacing“and“format“for“example),˜and“other“tabs“are“used“to“ne‘‰tune“some“less“frequen¸ètly“usedŽ¡options–U (fonš¸èts,“sizes,“colors,“placemen˜ts,“stagger,“grid“lines,“spGecial“tic˜ks,“...).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹jóïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.31) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹31Ž’ÕÁGï color popŽŽ £n ýˆ.\If–‡½yš¸èou‘‡¾need“spGecial“c˜haracters“or‘‡¾spGecial“formatting“in“y˜our–‡¾labGel,‘”dy˜ou“can–‡½use“Grace“escapGe‘‡¾sequences“(theޤ ®sequence–o7will›o6appGear“v¸èerbatim“in˜the“text“eld˜but“will“bGe˜rendered“on“the˜graph),‘u½see˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.1) cvn H.B /ANN pdfmark endï color pop“(t¸èypGesetting).‘¿ÄIfŽ¡y•¸èou›don't‘remem“b•Ger˜the‘mapping˜b“et•¸èw“een‘alphabGetic˜c“haracters–and˜the“glyph˜y¸èou“need˜in“some˜spGecicŽ¡fon•¸èts›(mainly‘sym“bGol˜and›zapfdingbats),‘;y“ou˜can‘in“v“ok“e˜the‘fon“t˜toGol–from˜the“text˜eld“b¸èy˜hitting“CTRL-e.Ž¡Y‘ÿ*¸ou–’-can“c•¸èhange›’.fon“ts–’-and“select“c¸èharacters˜from“there,‘¡qthey“will“bGe“copied˜bac¸èk“in“the“text˜eld“when“y¸èouŽ¡press–5the‘5ž"Aš¸èccept"“button.‘fÿBew˜are“of“the›5žpGosition“of“the“cursor˜as“yš¸èou“en˜ter“text‘5žor“c˜hange“fon˜t“in‘5žthe“fon˜tŽ¡tošGol,–U the“c¸èharacter“or“command“will“b˜e“inserted“at“this“p˜osition,“not“at“the“end“of“the“string!Ž©ؼMost–2Ìof›2Íthe“con¸ètrols˜in“the˜dialog“should˜bGe“self-explanatory‘ÿ*¸.‘fOne˜that“is˜not“(and˜frequen¸ètly“missed)˜is“theŽ¡"Axis–÷ transform"›÷input“eld˜in“the˜"Tic¸èk“labGels"˜tab.‘WHEn¸ètering˜there“e.g.‘WI"-$t"“will˜mak¸èe“the˜tic¸èk“labGelsŽ¡sho¸èw–ø%negates›ø&of“the˜real“coGordinates˜their“tic¸èks˜are“placed˜at.‘R‚Y‘ÿ*¸ou“can˜use“an¸èy˜expression“understo•Go“d˜b¸èy‘ø%theŽ¡inš¸èterpreter–U (see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 15ï color popŸù•¼ïps:SDict begin H.R endŽïzps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section.5) cvn H.B /ANN pdfmark endï color pop“(command“in˜terpreter)).ަOnce›øy•¸èou‘÷ha“v“e˜set–÷the˜options“as˜yš¸èou“w˜an˜t,‘M­y˜ou›øcan“apply˜them.‘ÆOne˜useful“feature˜is“that˜y¸èou“can˜setŽ¡sevš¸èeral–¥Haxes“at‘¥Ionce“with“the“bGottom“pulldo˜wn“men˜u‘¥I(curren˜t“axis,‘¹Rall“axes“curren˜t“graph,‘¹Scurren˜t“axis“allŽ¡graphs,‘Ÿcall–‰axes“all“graphs).‘#»Bewš¸èare“that“y˜ou“alw˜a˜ys‘ˆapply“the“propGerties“of“all“tabs,‘Ÿcnot“only“the“selectedŽ¡one.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.7) cvn /DEST pdfmark endŸ jÄ4.7Ž‘¾View‘¸men uŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.1) cvn /DEST pdfmark end¦Â4.7.1Ž‘#!\Sho®>w–ÕloQÂcator“barޤMª¹This–U toggle“item“sho¸èws“or“hides“the“lošGcator“b˜eloš¸èw“the“men˜u“bar.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.2) cvn /DEST pdfmark endŸçÂ4.7.2Ž‘#!\Sho®>w–Õstatus“barŽ¡¹This–U toggle“item“shoš¸èws“or“hides“the“status“string“bGelo˜w“the“can˜v‘ÿqÐas.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.3) cvn /DEST pdfmark endŸçÂ4.7.3Ž‘#!\Sho®>w–ÕtoQÂol“barŽ¡¹This–U toggle“item“shoš¸èws“or“hides“the“toGol“bar“at“the“left“of“the“can˜v‘ÿqÐas.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.4) cvn /DEST pdfmark endŸçÂ4.7.4Ž‘#!\P®>age‘ÕsetupŽ¡¹Set–U the“propGerties“of“the“displaš¸èy“device.‘q€It“is“the“same“dialog“as“in“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.3.6ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.3.6) cvn H.B /ANN pdfmark endï color pop“(Prin˜t“setup).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.5) cvn /DEST pdfmark endŸXäÂ4.7.5Ž‘#!\Redra®>wŽ¡¹This–U menš¸èu“item“triggers“a“redra˜wing“of“the“can˜v‘ÿqÐas.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.7.6) cvn /DEST pdfmark endŸçÂ4.7.6Ž‘#!\UpQÂdate‘ÕallŽ¡¹This–w•men¸èu›w”item“causes“an˜upGdate“of“all˜GUI‘wŒcon•¸ètrols.‘ØÞUsually‘ÿ*¸,‘€2ev“erything–w•is˜upGdated“automatically‘ÿ*¸,‘€2unlessŽŸ ®one–U makš¸èes“moGdications“b˜y“en˜tering“commands“in“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.8.1ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.8.1) cvn H.B /ANN pdfmark endï color pop“(Command)“toGol.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ˆ®ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.32) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Guide–Õto“the“graphical“user“in®>terface’×¹32Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.8) cvn /DEST pdfmark endŸ Ä4.8Ž‘¾Windo• w‘¸men“uŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.8.1) cvn /DEST pdfmark endŸؼÂ4.8.1Ž‘#!\CommandsŽ©Mª¹Command›Àdriv•¸èen‘Àv“ersion˜of˜the˜in“terface–Àto˜Grace.‘?ÕHere,‘Ýêcommands˜are“t¸èypGed˜at˜the˜"Command:"“text˜itemޤ ®and–ýÂexecuted›ýÃwhen“µ<¹Returnµ>˜¹is“pressed.‘khThe“command˜will“bGe˜parsed“and˜executed,‘'ëand˜the“commandŽ¡line–Ì%is“placed›Ì&in“the“history“list.‘ÖItems“in˜the“history“list“can“bGe˜recalled“bš¸èy“simply“clic˜king‘Ì&on“them“withŽ¡the–U left“mouse“button.‘q€F‘ÿ*¸or“a“reference“on“the“Grace“command“inš¸èterpreter,“see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 15ï color popŸù•¼ïps:SDict begin H.R endŽïzps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section.5) cvn H.B /ANN pdfmark endï color pop“(Command“in˜terpreter).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.8.2) cvn /DEST pdfmark endŸXäÂ4.8.2Ž‘#!\P•®>oin“t‘Õtrac“kingަ¹Not–U written“y¸èet...ޤïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.8.3) cvn /DEST pdfmark endŸçÂ4.8.3Ž‘#!\Dra®>wing‘Õob‘£„jectsަ¹Not–U written“y¸èet...Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.8.4) cvn /DEST pdfmark endŸçÂ4.8.4Ž‘#!\F‘ÿ ºon®>t‘ÕtoQÂolަ¹Not–U written“y¸èet...Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.8.5) cvn /DEST pdfmark endŸçÂ4.8.5Ž‘#!\Consoleަ¹The–í¾console‘í¿windoš¸èw“displa˜ys“errors›í¿and“results“of˜some“n¸èumerical“opGerations,‘æe.g.‘;[nonlinear“t˜(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5.2ï color popŸù•¼ïps:SDict begin H.R endŽï|ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.20) cvn H.B /ANN pdfmark endï color popޤ ®(Non-linear–Hát)).‘mkThe“windoš¸èw“is‘Hàp•Gopp“ed–Háup“automatically“whenev˜er“an“error“oGccurs‘Hàor“new“result“messagesŽ¡appšGear.‘q€This–U can“b˜e“altered“bš¸èy“c˜hec˜king“the“"Options/P˜opup“only“on“errors"“option.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.9) cvn /DEST pdfmark endŸ ’Ä4.9Ž‘¾Help‘¸men uŽŸÊïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.1) cvn /DEST pdfmark endŸƒŒÂ4.9.1Ž‘#!\On‘Õcon®>textަ¹Clic•¸èk›cÕon‘cÖan“y˜elemen“t–cÖof˜the“in¸èterface˜to˜get“con•¸ètext-sensitiv“e˜help–cÖon˜it.‘ Only“partially˜implemen¸èted“at˜theŽ¡momen¸èt.ޤ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.2) cvn /DEST pdfmark endŸؼÂ4.9.2Ž‘#!\User's‘Õguideަ¹Bro¸èwse–U the“Grace“user's“guide.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.3) cvn /DEST pdfmark endŸçÂ4.9.3Ž‘#!\T‘ÿ ºutorialަ¹Bro¸èwse–U the“Grace“tutorial.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.4) cvn /DEST pdfmark endŸؼÂ4.9.4Ž‘#!\F‘þ¸øA®>Qަ¹F‘ÿ*¸requen•¸ètly›U Ask“ed˜Questions˜with˜answ“ers.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹!Üïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.33) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹33Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.5) cvn /DEST pdfmark endŸ Â4.9.5Ž‘#!\ChangesޤMª¹The–U list“of“cš¸èhanges“during“the“Grace“dev˜elopmen˜t.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.6) cvn /DEST pdfmark endŸçÂ4.9.6Ž‘#!\ExamplesŽ¡¹The–U whole“tree“of“submenš¸èus“eac˜h“loading“a“sample“plot.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.7) cvn /DEST pdfmark endŸçÂ4.9.7Ž‘#!\Commen®>tsŽ¡¹Use–U this“to“send“y¸èour“suggestions“or“bug“repGorts.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.8) cvn /DEST pdfmark endŸçÂ4.9.8Ž‘#!\License‘ÕtermsŽ¡¹Grace–U licensing“terms“will“bGe“displa•¸èy“ed–U (GPL“v¸èersion“2).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.4.9.9) cvn /DEST pdfmark endŸXäÂ4.9.9Ž‘#!\AbQÂoutŽ¡¹A‘άpšGopup–ÎËwith“basic“info“on“the“soft•¸èw“are,‘í6including–ÎËsome“conguration“details.‘Þ‚More“details“can“b˜e“foundŽ© ®when–U running“Grace“with“the“"-v¸èersion"“command“line“ag.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.5) cvn /DEST pdfmark endŸ¾Á5Ž‘ÁCommand‘G\incterpreterŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.1) cvn /DEST pdfmark endŸSËÄ5.1Ž‘¾General‘¸notesŽ¡¹The–•™in¸èterpreter›•šparses“its“input˜in“a“line-b¸èy-line˜manner.‘1©There“ma¸èy“bGe˜sevš¸èeral“statemen˜ts“pGer‘•šline,‘»çseparatedަb¸èy›ysemicolon–z(¿;¹).‘/óThe“maximal˜line“length˜is˜4“kb¸èytes˜(hardcoGded).‘/ôThe˜parser“is˜case-insensitiv¸èe“and˜ignoresަlines–U bGeginning“with“the“"¿#¹"“sign.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.2) cvn /DEST pdfmark endŸ.ÂÄ5.2Ž‘¾DenitionsŽ ’?m¤€5ïcolor push BlackŸÊ¡’åà¤ïcolor push Blackï color popŽŽŽŸ3úÜŸÍkЉffùw¤ “q‘¹NameŽ‘+EŠDescriptionŽ’õr‹ExamplesŽŽ©‰ffùw¡‘exprŽ‘+EŠAn•¸èy›U n“umeric˜expressionŽ’õr‹1.5–U +“sin(2)ŽŽ¤ ®‘iexprŽ‘+EŠAnš¸èy–U expression“that“ev‘ÿqÐaluates“to“an“in˜tegerŽ’õr‹25,–U 0.1“+“1.9,“PI/asin(1)ŽŽ¡‘nexprŽ‘+EŠNon-negativ¸èe‘U iexprŽ’õr‹2–U -“1ŽŽ¡‘indxŽ‘+EŠNon-negativ¸èe‘U iexprŽŽ¡‘sexprŽ‘+EŠString‘U expressionŽ’õr‹"a–U string",“"a“"“.›q€"string",“"square“roGot“of“4“=“"“.˜sqrt(4)ŽŽ¡‘v¸èexprŽ‘+EŠV‘ÿ*¸ector‘U expressionŽ’õr‹"2*x"ŽŽ¦‰ffùwŽŽŽŸIÝû’ºJÊïcolor push BlackT‘ÿ*¸able›U 5:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.5) cvn /DEST pdfmark endï color pop“Basic˜t¸èypGes˜ï color popŽŽŽï color popŽŸ®Not–U nished“y¸èet...ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹"®©ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.34) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹34Ž’ÕÁGï color popŽŽ £n ýуLŸ·íÍïcolor push BlackŸH3ŸÏŒƒ‘px2ïcolor push Blackï color popŽŽ‘ux2Ÿèǰ‰ffêÐä¤ “q‘ExpressionŽ‘EÄ—DescriptionŽ’ƒ³@T¸èypGesŽ’µBExampleŽŽ©‰ffêÐä¡‘GRAPH[Åid‘w¹]Ž‘EÄ—graph‘U ÅidŽ’ƒ³@¹indx‘U ÅidŽ’µB¹GRAPH[0]ŽŽŸ ®‘GÅnnŽ‘EÄ—¹graph‘U ÅnnŽ’ƒ³@nn‘ÄU¹:‘q€0-99Ž’µBG0ŽŽ¦‰ffêÐäŽŽŽŸ.Õ’®íGïcolor push BlackT‘ÿ*¸able›U 6:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.6) cvn /DEST pdfmark endï color pop“Graph˜selections˜ï color popŽŽŽï color popŽ œ^P¤‚')ïcolor push BlackŸ}Ø×¡’åà¤ïcolor push Blackï color popŽŽŽŸ3úÜŸÍkЉffÐi€¤ “q‘ExpressionŽ‘U¬DescriptionŽ’üÎET¸èypGesŽ’td6ExampleŽŽ©‰ffÐi€¡‘Ågr‘ÿ}/aph‘ÄU¹.SETS[Åid‘w¹]Ž‘U¬set–U Åid‘]—¹in“graph“Ågr‘ÿ}/aphŽ’üÎE¹indx–U Åid‘w¹,“graphsel“Ågr‘ÿ}/aphŽ’td6¹GRAPH[0].SETS[1]ŽŽ¤ ®‘Ågr‘ÿ}/aph‘ÄU¹.SÅnnŽ‘U¬¹set–U Ånn‘u¹in“graph“Ågr‘ÿ}/aphŽ’üÎEnn‘ÄU¹:‘q€0-99,–U graphsel“Ågr‘ÿ}/aphŽ’td6¹G0.S1ŽŽ¡‘SET[Åid‘w¹]Ž‘U¬set–U Åid‘]—¹in“the“curren¸èt“graphŽ’üÎEindx‘U ÅidŽ’td6¹SET[1]ŽŽ¡‘SÅnnŽ‘U¬¹set–U Ånn‘u¹in“the“curren¸èt“graphŽ’üÎEÅnn‘ÄU¹:‘q€0-99Ž’td6S1ŽŽ¡‘S_Ž‘U¬the–U last“implicitly“(i.e.‘q€as“a“result“of“a“data“transformation)“alloGcated“set“in“the“curren¸èt“graphŽ’üÎE-Ž’td6S_ŽŽ¡‘S$Ž‘U¬the–U activš¸èe“set“in“the“curren˜t“graphŽ’üÎE-Ž’td6S$ŽŽ¦‰ffÐi€ŽŽŽŸIÝû’µëïcolor push BlackT‘ÿ*¸able›U 7:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.7) cvn /DEST pdfmark endï color pop“Set˜selections˜ï color popŽŽŽï color popŽŸX隟śàïcolor push BlackŸ:d ŸÖcŒ‘|¾‰ïcolor push Blackï color popŽŽ’¾‰Ÿïžº‰ffÒD5¤ “q‘ExpressionŽ‘A5òDescriptionŽ‘$›T¸èypGesŽ’¦ÑExampleŽŽ©‰ffÒD5¡‘RÅnŽ‘A5ò¹region‘U ÅnŽ‘$›n‘ÄU¹:‘q€0-4Ž’¦ÑR0ŽŽ¦‰ffÒD5ŽŽŽŸ'ªÌ’­Ë’ïcolor push BlackT‘ÿ*¸able›U 8:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.8) cvn /DEST pdfmark endï color pop“Region˜selections˜ï color popŽŽŽï color popŽŸd¦Ÿ¹ßuïcolor push BlackŸF ‹ŸÑ~+‘1Pïcolor push Blackï color popŽŽ‘6PŸèǰ‰ffi°§¤ “q‘ExpressionŽ‘q`oDescriptionŽ’òÈT¸èypGesŽ’$ExampleŽŽ©‰ffi°§¡‘COLOR‘U Å"c‘ÿ}/olorname"Ž‘q`o¹a–U mappGed“color“Åc‘ÿ}/olornameŽ’òȹ-Ž’$COLOR‘U "red"ŽŽŸ ®‘COLOR‘U ÅidŽ‘q`o¹a–U mappGed“color“with“ID“ÅidŽ’òȹnexpr‘U ÅidŽ’$¹COLOR‘U 2ŽŽ¦‰ffi°§ŽŽŽŸ.Õ’°çÒïcolor push BlackT‘ÿ*¸able›U 9:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (table.9) cvn /DEST pdfmark endï color pop“Color˜selections˜ï color popŽŽŽï color popŽŸV÷òŸÇˆïcolor push BlackŸ8rxŸØU4‘Vþïcolor push Blackï color popŽŽ‘[þŸïžº‰ffÅ ¤ “q‘ExpressionŽ‘OGDescriptionŽ’­j=T¸èypGesŽ’Þ³IExampleŽŽ©‰ffÅ ¡‘P–ÿ*¸A“TTERN‘U ÅidŽ‘OG¹pattern–U with“ID“ÅidŽ’­j=¹nexpr‘U ÅidŽ’Þ³I¹P–ÿ*¸A“TTERN‘U 1ŽŽ¦‰ffÅ ŽŽŽŸ'ªÌ’©Á(ïcolor push BlackT‘ÿ*¸able›U 10:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.10) cvn /DEST pdfmark endï color pop“P¸èattern˜selections˜ï color popŽŽŽï color popŽŸrTŸ¬1bïcolor push BlackŸSΞŸÊ§!‘f;ïcolor push Blackï color popŽŽ‘k;Ÿáð§‰ffÿ–Ò¤ “q‘ExpressionŽ‘A5òDescriptionŽ’ž”ˆT¸èypGesŽ’ÓgnExampleŽŽ©‰ffÿ–Ò¡‘XŽ‘A5òthe–U rst“columnŽ’ž”ˆ-Ž’ÓgnXŽŽ¤ ®‘YŽ‘A5òthe–U second“columnŽ’ž”ˆ-Ž’ÓgnYŽŽ¡‘YÅnŽ‘A5ò¹(Ån‘u¹+–U 2)-th“columnŽ’ž”ˆÅn‘u¹=–U 0“-“4Ž’ÓgnY3ŽŽ¦‰ffÿ–ÒŽŽŽŸ5Xß’žÆïcolor push BlackT‘ÿ*¸able›U 11:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.11) cvn /DEST pdfmark endï color pop“Data˜column˜selections˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹#½1ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.35) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹35Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.3) cvn /DEST pdfmark endŸ Ä5.3Ž‘¾V‘þàariablesŽŸt¾kŸ¶ƒïcolor push BlackŸbI}ŸÃi²‘Ú®ïcolor push Blackï color popŽŽ‘Ú®ŸÚ³7‰ffš ì¤ “q‘¹V‘ÿ*¸ariableŽ‘T&ŠDescriptionŽŽ©‰ffš ì¡‘datacolumnŽ‘T&Šdata–U column“of“currenš¸èt“("activ˜e")“setŽŽŸ ®‘set.datacolumnŽ‘T&Šdata–U column“of“setŽŽ¦‰ffš ì¡‘vv‘ÿqÐarŽ‘T&Šuser-dened‘U arra¸èyŽŽ¦‰ffš ì¡‘vv‘ÿqÐariable‘U [i:j]Ž‘T&Šsegmenš¸èt–U of“a“v˜ector“v‘ÿqÐariable“(elemen˜ts“from“i-th“to“j-th“inclusiv˜e,“i“µ<¹=“j)ŽŽ¦‰ffš ìŽŽŽŸ<–N’­¹Ìïcolor push BlackT›ÿ*¸able‘U 12:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.12) cvn /DEST pdfmark endï color pop“V˜ector–U v‘ÿqÐariables“ï color popŽŽŽï color popŽŸY\IŸ¹yïcolor push BlackŸF†ñŸÑJø‘|Õïcolor push Blackï color popŽŽ’ÕŸè”}‰ffÓ‰ž¤ “q‘V‘ÿ*¸ariableŽ‘AË>DescriptionŽŽ©‰ffÓ‰ž¡‘vv‘ÿqÐariable[i]Ž‘AË>i-th–U elemenš¸èt“of“a“v˜ector“v‘ÿqÐariableŽŽ¦‰ffÓ‰ž¡‘v‘ÿqÐarŽ‘AË>user-dened‘U v‘ÿqÐariableŽŽ¦‰ffÓ‰žŽŽŽŸ.µ’®ïcolor push BlackT‘ÿ*¸able›U 13:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.13) cvn /DEST pdfmark endï color pop“Scalar˜v‘ÿqÐariables˜ï color popŽŽŽï color popŽŸÒ±ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.4) cvn /DEST pdfmark endŸ jÄ5.4Ž‘¾Numerical–¸op_úerators“and“functionsŽ©Mª¹In–+înš¸èumerical“expressions,‘4+the“inx“format“is“used.‘cÅArgumen˜ts‘+íof“bšGoth“op˜erators“and“functions“can“b˜e“eitherޤ ®scalars–U or“vš¸èector“arra˜ys.‘q€Arithmetic,“logical,“and“comparison“opGerators“are“giv˜en“in“tables“bGelo˜w.Ž Œ¼'Ÿ5ïcolor push BlackŸ~ÊŸ´0]’¢Î¿ïcolor push Blackï color popŽŽ’§Î¿ŸÍkЉff†#ɤ “q‘OpGeratorŽ‘9Ä¡DescriptionŽŽ©‰ff†#É¡‘ÿ+Ž‘9Ä¡additionŽŽ¤ ®‘7À-Ž‘9Ä¡substractionŽŽ¡‘9Ä¡m¸èultiplicationŽŽ¡‘bx/Ž‘9Ä¡divisionŽŽ¡‘·è%Ž‘9Ä¡moGdulusŽŽ¡‘bxŽ‘9Ä¡raising–U to“pGo•¸èw“erŽŽ¦‰ff†#ÉŽŽŽŸIÝû’¢¾ ïcolor push BlackT‘ÿ*¸able›U 14:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.14) cvn /DEST pdfmark endï color pop“Arithmetic˜opGerators˜ï color popŽŽŽï color popŽŸ¼lAnother–‹xconditional›‹wopGerator“is˜the“"?:"˜(or“ternary)“opšGerator,‘Ù whic¸èh“op˜erates›‹was“in˜C‘‹(and˜man¸èy“otherŽ¡languages.ޤؼ(expr1)–U ?›q€(expr2)“:˜(expr3);Ž¡This–U expression“ev›ÿqÐaluates“to“expr2“if“expr1“ev˜aluates“to“TR¸èUE,“and“expr3“if“expr1“ev˜aluates“to“F‘þã ALSE.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.5) cvn /DEST pdfmark endŸ.ÂÄ5.5Ž‘¾Pro_úceduresަ¹MethošGds–ðof“directly“manipulating‘ðthe“data“corresp˜onding“to“the“Data¸j¹T‘ÿ*¸ransformation‘ðmen¸èu“are“describ˜ed“inޤ ®table–‹pïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 121ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.21) cvn H.B /ANN pdfmark endï color pop“().‘.FT‘ÿ*¸o“ev‘ÿqÐaluate›‹oexpressions,‘³Çy¸èou“can“directly“submit“them˜to“the“command“inš¸èterpreter“lik˜e“y˜ou“w˜ouldŽ¡in–º'the›º&ev‘ÿqÐaluate“expression“windo¸èw.‘ ”As“an“example,‘ÓhS1.X‘º =“S1.X‘º *“0.000256“scales“the˜x-axis“coGordinates.Ž¡The–U functionalitš¸èy“of“the“'Sample“pGoin˜ts'“men˜u“en˜try“can“bGe“obtained“through“RESTRICT.ŽŸؼNot–U nished“y¸èet...ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹$Ðïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.36) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹36Ž’ÕÁGï color popŽŽ £n ýÓª?ºïcolor push BlackŸUÀFŸÈµy’¤ qïcolor push Blackï color popŽŽ’© qŸáð§‰ffƒ€e¤ “q‘ ÿOpGeratorŽ‘GÃÁDescriptionŽŽ©‰ffƒ€e¡‘AND–U or“&&Ž‘GÃÁlogical‘U ANDŽŽ¤ ®‘¿GOR–U or“¸jjŽ‘GÃÁ¹logical‘U ORŽŽ¡‘ tîNOT–U or“!Ž‘GÃÁlogical‘U NOTŽŽ¦‰ffƒ€eŽŽŽŸ5Xß’ªáïcolor push BlackT‘ÿ*¸able›U 15:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.15) cvn /DEST pdfmark endï color pop“Logical˜opGerators˜ï color popŽŽŽï color popŽ ŠÊŸ5ïcolor push BlackŸ~ÊŸ´0]’”´·ïcolor push Blackï color popŽŽ’™´·ŸÍkЉff¢WÙ¤ “q‘ ÖOpGeratorŽ‘?ÈMDescriptionŽŽ©‰ff¢WÙ¡‘ "EQ–U or“==Ž‘?ÈMequalŽŽ¤ ®‘¬†NE–U or“!=Ž‘?ÈMnot‘U equalŽŽ¡‘ åL‘ÿ*¸T–U or“µ<Ž‘?ÈM¹less‘U thanŽŽ¡‘ÌeLE–U or“µ<¹=Ž‘?ÈMless–U than“or“equalŽŽ¡‘ ­þGT–U or“µ>Ž‘?ÈM¹greater‘U thanŽŽ¡‘GE–U or“µ>¹=Ž‘?ÈMgreater–U than“or“equalŽŽ¦‰ff¢WÙŽŽŽŸIÝû’ Z¢ïcolor push BlackT‘ÿ*¸able›U 16:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.16) cvn /DEST pdfmark endï color pop“Comparison˜opGerators˜ï color popŽŽŽï color popŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.6) cvn /DEST pdfmark endŸ Ä5.6Ž‘¾Device‘¸parametersޤMª¹F‘ÿ*¸or–P6proGducing›P7"hard“cop•¸èy",‘„esev“eral–P6parameters˜can“bGe“set“via˜the“command“in¸èterpreter.‘ˆThey˜are“summarizedŽ© ®in–U table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 122ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.22) cvn H.B /ANN pdfmark endï color pop“(Device“parameters).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.7) cvn /DEST pdfmark endŸ ’Ä5.7Ž‘¾Flo• w‘¸con“trolŽŸtîïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.8) cvn /DEST pdfmark endŸ j5.8Ž‘¾DeclarationsŽ¡¹User-dened–U v›ÿqÐariables“are“set“and“used“according“to“the“syn¸ètax“describGed“in“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 124ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.24) cvn H.B /ANN pdfmark endï color pop“(User“v˜ariables).ŽŸؼNot–U nished“y¸èet...ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.9) cvn /DEST pdfmark endŸ.ÂÄ5.9Ž‘¾Graph‘¸prop_úertiesŽ¡¹W‘ÿ*¸e–Útdivide“the‘Úucommands“pšGertaining“to“the“prop˜erties‘Úuand“app˜earance“of“graphs“inš¸èto‘Úuthose“whic˜h“directlyަmanipulate–!lthe“graphs›!mand“those“that“aect˜the“appGearance“of“graph“elemen¸ètsthe˜parameters“that“canަappGear–U in“a“Grace“pro‘Ž0ject“le.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.9.1) cvn /DEST pdfmark endŸçÂ5.9.1Ž‘#!\Command‘ÕopQÂerationsŽ¡¹General–U graph“creation/annihilation“and“con¸ètrol“commands“appšGear“in“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 125ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.25) cvn H.B /ANN pdfmark endï color pop“(Graph“op˜erations).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.9.2) cvn /DEST pdfmark endŸXäÂ5.9.2Ž‘#!\P®>arameter‘ÕsettingsŽ¡¹Setting–ùvthe›ùuactiv¸èe“graph“and“its˜t¸èypGe“is“accomplished˜with“the“commands˜found“in“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 126ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.26) cvn H.B /ANN pdfmark endï color pop˜(Graph“selectionަparameters).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹%áïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.37) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹37Ž’ÕÁGï color popŽŽ £nŸÃß­ ýöoïcolor push Black  þ þïÅñ‘&Sïcolor push Blackï color popŽŽ‘+S ÿw‰ff°¢¤ “q‘F‘ÿ*¸unctionŽ‘V_JDescriptionŽŽ©‰ff°¢¡‘abs(x)Ž‘V_Jabsolute‘U v‘ÿqÐalueŽŽ¤ ®‘acos(x)Ž‘V_JarccosineŽŽ¡‘acosh(x)Ž‘V_Jh¸èyp•Gerb“olic‘U arccosineŽŽ¡‘asin(x)Ž‘V_JarcsineŽŽ¡‘asinh(x)Ž‘V_Jh¸èyp•Gerb“olic‘U arcsineŽŽ¡‘atan(x)Ž‘V_Jarctangen¸ètŽŽ¡‘atan2(y‘ÿ*¸,x)Ž‘V_Jarc–U tangenš¸èt“of“t˜w˜o“v‘ÿqÐariablesŽŽ¡‘atanh(x)Ž‘V_Jhš¸èyp•Gerb“olic‘U arctangen˜tŽŽ¡‘ceil(x)Ž‘V_Jgreatest–U in¸èteger“functionŽŽ¡‘cos(x)Ž‘V_JcosineŽŽ¡‘cosh(x)Ž‘V_Jh¸èyp•Gerb“olic‘U cosineŽŽ¡‘exp(x)Ž‘V_JexŽŽ¡‘fac(n)Ž‘V_Jfactorial–U function,“n!ŽŽ¡‘oGor(x)Ž‘V_Jleast–U in¸èteger“functionŽŽ¡‘irand(n)Ž‘V_Jrandom–U in¸èteger“less“than“nŽŽ¡‘ln(x)Ž‘V_Jnatural‘U logŽŽ¡‘log10(x)Ž‘V_Jlog–U base“10ŽŽ¡‘log2(x)Ž‘V_Jbase–U 2“logarithm“of“xŽŽ¡‘maxof(x,y)Ž‘V_Jreturns–U greater“of“x“and“yŽŽ¡‘mesh(n)Ž‘V_Jmesh–U arra¸èy“(0“...‘q€n“-“1)ŽŽ¡‘mesh(x1,–U x2,“n)Ž‘V_Jmesh–U arraš¸èy“of“n“equally“spaced“pGoin˜ts“bGet˜w˜een“x1“and“x2“inclusiv˜eŽŽ¡‘minof(x,y)Ž‘V_Jreturns–U lesser“of“x“and“yŽŽ¡‘moGd(x,y)Ž‘V_JmoGd–U function“(also“x“%“y)ŽŽ¡‘piŽ‘V_Jthe–U PI“constan¸ètŽŽ¡‘randŽ‘V_Jpseudo–U random“n•¸èum“bGer–U distributed“uniformly“on“(0.0,1.0)ŽŽ¡‘rand(n)Ž‘V_Jarraš¸èy–U of“n“random“n˜um˜bGersŽŽ¡‘rin¸èt(x)Ž‘V_Jround–U to“closest“in¸ètegerŽŽ¡‘rsum(x)Ž‘V_Jrunning–U sum“of“xŽŽ¡‘sgn(x)Ž‘V_Jsign¸èum‘U functionŽŽ¡‘sin(x)Ž‘V_Jsine‘U functionŽŽ¡‘sinh(x)Ž‘V_Jh¸èyp•Gerb“olic‘U sineŽŽ¡‘sqr(x)Ž‘V_Jx2ŽŽ¡‘sqrt(x)Ž‘V_Jx0.5ŽŽ¡‘tan(x)Ž‘V_Jtangen¸èt‘U functionŽŽ¡‘tanh(x)Ž‘V_Jhš¸èyp•Gerb“olic‘U tangen˜tŽŽ¦‰ff°¢ŽŽŽ :’»nFïcolor push BlackT›ÿ*¸able‘U 17:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.17) cvn /DEST pdfmark endï color pop“F˜unctions‘U ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹&ôZïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.38) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹38Ž’ÕÁGï color popŽŽ £n þ¬Þ* þÑP2ïcolor push Black .¯Î ÿ]6‰‘M~¿ïcolor push Blackï color popŽŽ‘R~¿ ÿt€‰ff0Ãʤ “q‘F‘ÿ*¸unctionŽ‘Væ^DescriptionŽŽ©‰ff0ÃÊ¡‘c¸èhdtr(df,‘U x)Ž‘Væ^c¸èhi-square‘U distributionŽŽ¤ ®‘c¸èhdtrc(v,‘U x)Ž‘Væ^complemen¸èted–U Chi-square“distributionŽŽ¡‘c¸èhdtri(df,‘U y)Ž‘Væ^in•¸èv“erse–U of“complemen¸èted“Chi-square“distributionŽŽ¡‘erf(x)Ž‘Væ^error‘U functionŽŽ¡‘erfc(x)Ž‘Væ^complemen¸èt–U of“error“functionŽŽ¡‘fdtr(df1,–U df2,“x)Ž‘Væ^F–U distribution“functionŽŽ¡‘fdtrc(x)Ž‘Væ^complemen¸èted–U F“distributionŽŽ¡‘fdtri(x)Ž‘Væ^in•¸èv“erse–U of“complemen¸èted“F“distributionŽŽ¡‘gdtr(a,–U b,“x)Ž‘Væ^gamma–U distribution“functionŽŽ¡‘gdtrc(a,–U b,“x)Ž‘Væ^complemen¸èted–U gamma“distribution“functionŽŽ¡‘ndtr(x)Ž‘Væ^Normal–U distribution“functionŽŽ¡‘ndtri(x)Ž‘Væ^in•¸èv“erse–U of“Normal“distribution“functionŽŽ¡‘norm(x)Ž‘Væ^gaussian–U densit¸èy“functionŽŽ¡‘pGdtr(k,‘U m)Ž‘Væ^P¸èoisson‘U distributionŽŽ¡‘pGdtrc(k,‘U m)Ž‘Væ^complemen•¸èted›U P“oisson˜distributionŽŽ¡‘pGdtri(k,‘U y)Ž‘Væ^in•¸èv“erse›U P“oisson˜distributionŽŽ¡‘rnorm(xbar,s)Ž‘Væ^pseudo–U random“n•¸èum“bGer–U distributed“N(xbar,s)ŽŽ¡‘stdtr(k,‘U t)Ž‘Væ^Studen¸èt's–U t“distributionŽŽ¡‘stdtri(k,‘U p)Ž‘Væ^functional›U in•¸èv“erse˜of˜Studen“t's˜t˜distributionŽŽ¦‰ff0ÃÊŽŽŽ ¢Éw’¥äïcolor push BlackT‘ÿ*¸able›U 18:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.18) cvn /DEST pdfmark endï color pop“Statistical˜functions˜ï color popŽŽŽï color popŽŸThe–¯Ÿaxis“range›¯žand“scale“of“the“curren¸èt˜graph“as“w¸èell“as“its“loGcation˜on“the“plot“viewpGort“are˜set“with“theޤ ®commands–U listed“in“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 127ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.27) cvn H.B /ANN pdfmark endï color pop“(Axis“parameters).Ž©ؼThe–Zbcommands›Zato“set“the“appGearance˜and“textual“con•¸èten“t–Zbof˜titles“and“legends˜are“giv¸èen“in“table˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 128ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.28) cvn H.B /ANN pdfmark endï color pop“(TitlesŽ¡and‘U legends).ަNot–U nished“y¸èet...Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.10) cvn /DEST pdfmark endŸ.ÂÄ5.10Ž‘%}¨Set‘¸prop_úertiesŽŸMª¹Again,›‘Ías–…ªwith“the“graphs,˜w¸èe“separate“those“parser“commands“that“manipulate“the“data‘…«in“a“set“from“theŽ¡commands–U that“determine“parameterselemenš¸èts“that“are“sa˜v˜ed“in“a“pro‘Ž0ject“le.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.10.1) cvn /DEST pdfmark endŸçÂ5.10.1Ž‘(áCommandsŽŸMª¹OpGerations–>•for›>–set“I/O‘>Yare“summarized˜in“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 129ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.29) cvn H.B /ANN pdfmark endï color pop“(Set˜input,‘xòoutput,‘xóand“creation).‘-à(Note“that˜this“isŽ¡incomplete–U and“only“lists“Åinput‘Gé¹commands“at“the“momen¸èt.)Ž©ؼThe–+lparser“commands“analogous“to‘+kthe“Data¸j¹Data“set“opšGerations“dialogue“can“b˜e“found‘+kin“table“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 130ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.30) cvn H.B /ANN pdfmark endï color pop“(SetŽ¡opGerations).ަNot–U Finished“y¸èet...ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹'ÿ&ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.39) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Command‘Õin®>terpreter’KÛ­¹39Ž’ÕÁGï color popŽŽ £nŸà´§¥ý¼Åïcolor push Black C:ò¡’åà¤ïcolor push Blackï color popŽŽŽ ³ þë³Q‰ffꂤ “q‘F‘ÿ*¸unctionŽ‘y¤2DescriptionŽŽ©‰ffê‚¡‘ai(x),‘U bi(x)Ž‘y¤2Airy–U functions“(t•¸èw“o›U indepGenden“t˜solutions˜of˜the˜dieren“tial˜equation˜¿y(x)–?¬=“xy¹)ŽŽ¤ ®‘bGeta(x)Ž‘y¤2bGeta‘U functionŽŽ¡‘c¸èhi(x)Ž‘y¤2hš¸èyp•Gerb“olic–U cosine“in˜tegralŽŽ¡‘ci(x)Ž‘y¤2cosine‘U in¸ètegralŽŽ¡‘da¸èwsn(x)Ž‘y¤2Da•¸èwson's‘U in“tegralŽŽ¡‘ellie(phi,‘U m)Ž‘y¤2incomplete–U elliptic“in¸ètegral“of“the“second“kindŽŽ¡‘ellik(phi,‘U m)Ž‘y¤2incomplete–U elliptic“in¸ètegral“of“the“rst“kindŽŽ¡‘ellpGe(m)Ž‘y¤2complete–U elliptic“in¸ètegral“of“the“second“kindŽŽ¡‘ellpk(m)Ž‘y¤2complete–U elliptic“in¸ètegral“of“the“rst“kindŽŽ¡‘expn(n,‘U x)Ž‘y¤2expGonen•¸ètial‘U in“tegralŽŽ¡‘fresnlc(x)Ž‘y¤2cosine–U F‘ÿ*¸resnel“in¸ètegralŽŽ¡‘fresnls(x)Ž‘y¤2sine–U F‘ÿ*¸resnel“in¸ètegralŽŽ¡‘gamma(x)Ž‘y¤2gamma‘U functionŽŽ¡‘h¸èyp2f1(a,–U b,“c,“x)Ž‘y¤2Gauss–U h¸èypGer-geometric“functionŽŽ¡‘h¸èypGerg(a,–U b,“x)Ž‘y¤2conuen•¸èt›U h“ypGer-geometric˜functionŽŽ¡‘i0e(x)Ž‘y¤2mošGdied–U Bessel“function“of“order“zero,“exp˜onen¸ètially“scaledŽŽ¡‘i1e(x)Ž‘y¤2mošGdied–U Bessel“function“of“order“one,“exp˜onen¸ètially“scaledŽŽ¡‘igam(a,‘U x)Ž‘y¤2incomplete–U gamma“in¸ètegralŽŽ¡‘igamc(a,‘U x)Ž‘y¤2complemenš¸èted–U incomplete“gamma“in˜tegralŽŽ¡‘igami(a,‘U p)Ž‘y¤2in•¸èv“erse–U of“complemenš¸èted“incomplete“gamma“in˜tegralŽŽ¡‘incbGet(a,–U b,“x)Ž‘y¤2incomplete–U bGeta“in¸ètegralŽŽ¡‘incbi(a,–U b,“y)Ž‘y¤2In•¸èv“erse–U of“incomplete“bGeta“in¸ètegralŽŽ¡‘iv(v,‘U x)Ž‘y¤2moGdied–U Bessel“function“of“order“vŽŽ¡‘jv(v,‘U x)Ž‘y¤2Bessel–U function“of“order“vŽŽ¡‘k0e(x)Ž‘y¤2mošGdied–U Bessel“function,“third“kind,“order“zero,“exp˜onen¸ètially“scaledŽŽ¡‘k1e(x)Ž‘y¤2mošGdied–U Bessel“function,“third“kind,“order“one,“exp˜onen¸ètially“scaledŽŽ¡‘kn(n,‘U x)Ž‘y¤2moGdied–U Bessel“function,“third“kind,“in¸èteger“orderŽŽ¡‘lbGeta(x)Ž‘y¤2natural–U log“of“¸j¹bGeta(x)¸jŽŽ¡‘¹lgamma(x)Ž‘y¤2log–U of“gamma“functionŽŽ¡‘psi(x)Ž‘y¤2psi–U (digamma)“functionŽŽ¡‘rgamma(x)Ž‘y¤2reciproGcal–U gamma“functionŽŽ¡‘shi(x)Ž‘y¤2hš¸èyp•Gerb“olic–U sine“in˜tegralŽŽ¡‘si(x)Ž‘y¤2sine‘U in¸ètegralŽŽ¡‘spGence(x)Ž‘y¤2dilogarithmŽŽ¡‘struv¸èe(v,‘U x)Ž‘y¤2Struv¸èe‘U functionŽŽ¡‘v¸èoigt(gamma,–U sigma,“x)Ž‘y¤2V‘ÿ*¸oigt–U function“(con•¸èv“olution–U of“Loren¸ètzian“and“Gaussian)ŽŽ¡‘yv(v,‘U x)Ž‘y¤2Bessel–U function“of“order“vŽŽ¡‘zeta(x,‘U q)Ž‘y¤2Riemann–U zeta“function“of“t•¸èw“o‘U argumen“tsŽŽ¡‘zetac(x)Ž‘y¤2Riemann–U zeta“functionŽŽ¦‰ffê‚ŽŽŽ +–5’žžLïcolor push BlackT‘ÿ*¸able›U 19:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.19) cvn /DEST pdfmark endï color pop“SpGecial˜math˜functions˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹("ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.40) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹40Ž’ÕÁGï color popŽŽ £n þU ÿeÙ[ïcolor push Black š&¥Ÿ¦‚J’„eûïcolor push Blackï color popŽŽ’‰eûŸ¿½w‰ffÂõQ¤ “q‘.&F‘ÿ*¸unctionŽ‘:ÒÉDescriptionŽŽ©‰ffÂõQ¡‘ ¿ÄMIN(x)Ž‘:ÒÉmin–U v‘ÿqÐalue“of“arra¸èy“xŽŽ¤ ®‘ÎMAX(x)Ž‘:ÒÉmax–U v‘ÿqÐalue“of“arra¸èy“xŽŽ¡‘ (±A‘þã V¸èG(x)Ž‘:ÒÉa•¸èv“erage–U of“arra¸èy“xŽŽ¡‘ J6SD(x)Ž‘:ÒÉstandard–U deviation“of“arra¸èy“xŽŽ¡‘ÆðSUM(x)Ž‘:ÒÉsum–U of“all“elemenš¸èts“of“arra˜y“xŽŽ¡‘±¼INT(x,y)Ž‘:ÒÉin¸ètegral–U of“y“dxŽŽ¡‘ñ¨IMIN(x)Ž‘:ÒÉindex–U of“min“v‘ÿqÐalue“of“arra¸èy“xŽŽ¡‘IMAX(x)Ž‘:ÒÉindex–U of“max“v‘ÿqÐalue“of“arra¸èy“xŽŽ¦‰ffÂõQŽŽŽŸWŒ’¤ýæïcolor push BlackT‘ÿ*¸able›U 20:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.20) cvn /DEST pdfmark endï color pop“Aggregate˜functions˜ï color popŽŽŽï color popŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïRps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.10.2) cvn /DEST pdfmark endŸ Â5.10.2Ž‘(áP®>arameter‘ÕsettingsޤMª¹Not–U written“y¸èet...ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.6) cvn /DEST pdfmark endŸ¾Á6Ž‘ÁAcdv‘ÿÆanced‘G\topicsŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.1) cvn /DEST pdfmark endŸSËÄ6.1Ž‘¾F‘þàon tsŽ¡¹F‘ÿ*¸or–U all“devices,“Grace“uses“Tš¸èypGe1“fon˜ts.‘q€Both“PF‘þã A“(ASCIšGI)“and“PFB“(binary)“formats“can“b˜e“used.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.1.1) cvn /DEST pdfmark endŸXäÂ6.1.1Ž‘#!\F‘ÿ ºon®>t‘ÕcongurationŽ¡¹The–Ç¢le›Ç¡respGonsible“for“the“fon¸èt˜congurations“of“Grace˜is“¿fonts/FontDataBase¹.‘ÉThe“rst“line˜con¸ètains“aޤ ®pšGositiv•¸èe‘(£in“teger‘(¤sp˜ecifying–(£the“n•¸èum“b˜er›(¤of‘(£fon“ts˜declared–(£in“that˜le.‘b¬All“remaining“lines˜con¸ètain“declarationsŽ¡of–U one“fonš¸èt“eac˜h,“compGosed“out“of“three“elds:ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.17) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘F‘ÿ*¸on¸èt–û=name.‘S‰The“name›û‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹41Ž’ÕÁGï color popŽŽ £nŸÃß¹ ýönëïcolor push Black  ‘ þïÅæ˜Tïcolor push Blackï color popŽŽ‘˜T ÿk‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘g[·DescriptionŽŽŽ’Ÿ>T¸èypGesŽŽŽ’q4éExampleŽŽŽŽŸ‰ffÌ ¡‘R•¸èUNA‘þã V“G‘ã-(set,ŽŸ ®‘npGoin¸èts)ŽŽŽ‘g[·running›ÿÚa•¸èv“erage‘ÿÛof˜Åset‘ò£¹usingŽŸ ®‘g[·Ånp‘ÿ}/oints‘'5¹n•¸èum“bšGer–U of“p˜oin¸ètsŽŽŽ’Ÿ>nexpr‘U Ånp‘ÿ}/ointsŽŽŽ’q4é¹R•¸èUNA‘þã V“G‘Ï](S0,‘ê8100)ŽŽŽŽ¤\'‘R¸èUNMED‘¼3(set,ŽŸ ®‘npGoin¸èts)ŽŽŽ‘g[·running–6ómedian‘6ôof“Åset‘ )¼¹usingŽŸ ®‘g[·Ånp‘ÿ}/oints‘'5¹n•¸èum“bšGer–U of“p˜oin¸ètsŽŽŽ’Ÿ>nexpr‘U Ånp‘ÿ}/ointsŽŽŽ’q4é¹R¸èUNMED‘tû(S0,ŽŸ ®’q4é100)ŽŽŽŽ¡‘R¸èUNMIN‘S(set,ŽŸ ®‘npGoin¸èts)ŽŽŽ‘g[·running–Èáminim¸èum‘Èâof“Åset‘»ª¹usingŽŸ ®‘g[·Ånp‘ÿ}/oints‘'5¹n•¸èum“bšGer–U of“p˜oin¸ètsŽŽŽ’Ÿ>nexpr‘U Ånp‘ÿ}/ointsŽŽŽ’q4é¹R¸èUNMIN–U (S0,“100)ŽŽŽŽ¡‘R¸èUNMAX‘.(set,ŽŸ ®‘npGoin¸èts)ŽŽŽ‘g[·running–Lwmaxim¸èum‘Lxof“Åset‘?@¹usingŽŸ ®‘g[·Ånp‘ÿ}/oints‘'5¹n•¸èum“bšGer–U of“p˜oin¸ètsŽŽŽ’Ÿ>nexpr‘U Ånp‘ÿ}/ointsŽŽŽ’q4é¹R¸èUNMAX‘æË(S0,ŽŸ ®’q4é100)ŽŽŽŽ¡‘R¸èUNSTD‘íÇ(set,ŽŸ ®‘npGoin¸èts)ŽŽŽ‘g[·running–g”standard›g•deviation“of˜ÅsetŽŸ ®‘g[·¹using›U Ånp‘ÿ}/oints‘'5¹n•¸èum“b•Ger˜of˜p“oin¸ètsŽŽŽ’Ÿ>nexpr‘U Åp‘ÿ}/ointsŽŽŽ’q4é¹R¸èUNSTD–U (S0,“100)ŽŽŽŽ¡‘INTERPOLA‘ÿ*¸TEޤ ®‘(set,‘ůmesh,‘ŰmethoGd,Ž¡‘strict)ŽŽŽ‘g[·in¸èterpGolate–åAÅset‘Ø ¹on“a“samplingޤ ®‘g[·Åmesh‘€´¹using‘¼^Åmetho‘ÿ}/d‘w¹.‘§<Åstrict‘¯'¹agŽ¡‘g[·con¸ètrols–t»whether‘tºresult“should“bGeŽ¡‘g[·bGound–U within“the“source“setŽŽŽ’Ÿ>v¸èexpr‘Åmesh‘ÄU¹,‘ “Åmetho‘ÿ}/d‘w¹:ޤ ®’Ÿ>one‘^¤of‘^£LINEAR,Ž¡’Ÿ>SPLINE,‘ åøand‘ å÷AS-Ž¡’Ÿ>PLINE,–U ono“ÅstrictŽŽŽ’q4é¹INTERPOLA‘ÿ*¸TEޤ ®’q4é(S0,‘DÄS1.X,‘ á£AS-Ž¡’q4éPLINE,‘U OFF)ŽŽŽŽ¤6¸O‘HISTOGRAM‘äm(set,ޤ ®‘bins,‘|—cum•¸èulativ“e,Ž¡‘normalize)ŽŽŽ‘g[·calculate–>histogram‘> of“Åset‘0è¹onޤ ®‘g[·dened‘m Åbins‘Ò¹.‘ ¹?Åcumulative‘-Y¹andŽ¡‘g[·Ånormalize‘x©¹ags–¸Zcon¸ètrol“whetherŽ¡‘g[·to–jcalculate“cum•¸èulativ“e‘jand‘jnor-Ž¡‘g[·malized‘ (ak‘ÿqÐa‘ PDF)‘–histograms,Ž¡‘g[·resp•Gectivš¸èely‘ÿ*¸.‘M«Data‘ž„p“oin˜ts‘ž„areŽ¡‘g[·placed–U at“uppGer“limit“of“the“binŽŽŽ’Ÿ>v¸èexpr–A¢Åbins‘Ò¹,‘üÂono“Åcu-ޤ ®’Ÿ>mulative‘ÀO¹,‘ biono‘ù[Ånor-Ž¡’Ÿ>malizeŽŽŽ’q4é¹HISTOGRAM‘5(S0,ޤ ®’q4éMESH(0,‘ 1,‘ 11),Ž¡’q4éOFF,‘U ON)ŽŽŽŽŸ_‹‘INTEGRA‘ÿ*¸TE‘U (set)ŽŽŽ‘g[·cum•¸èulativ“e›U in“tegral˜of˜ÅsetŽŽŽ’q4é¹INTEGRA‘ÿ*¸TE‘U (S0)ŽŽŽŽŸ ®‘X¸èCOR‘œ<(set1,‘.¿set2,ŽŸ ®‘maxlag,‘U co¸èv‘ÿqÐar)ŽŽŽ‘g[·calculate–mcross-correlation“(or“-ޤ ®‘g[·co¸èv‘ÿqÐariance–{“if›{”the“Åc‘ÿ}/ovar‘¹ag“is˜set)Ž¡‘g[·of–'Åset1›^¹with“Åset2˜¹with“maxim¸èumŽ¡‘g[·lag‘U Åmaxlag‘ân¹.ŽŽŽ’Ÿ>nexpr‘ ÊÅmaxlag‘ân¹,‘ …ôonoŽŸ ®’Ÿ>Åc‘ÿ}/ovarŽŽŽ’q4é¹X¸èCOR‘ (S0,‘6ES0,‘6F50,ŽŸ ®’q4éOFF)ŽŽŽŽ¡‘LINCONV‘ó(set1,ŽŸ ®‘set2)ŽŽŽ‘g[·calculate› .linear‘ /con•¸èv“olution˜ofޤ ®‘g[·the–sKarra¸èy“of‘sJordinates“of“Åset1Ž¡‘g[·¹with–U that“of“Åset2‘Zð¹.ŽŽŽ’q4éLINCONV‘(E(S0,‘1FS1)ŽŽŽŽ¤) ;‘RESTRICT‘ó(set,ŽŸ ®‘restriction)ŽŽŽ‘g[·lter–³‰Åset‘¦S¹according“to‘³Šlogical“År‘ÿ}/e-ޤ ®‘g[·striction‘ÄU¹.‘+The–´original“set‘³will“bGeŽ¡‘g[·o•¸èv“erwrittenŽŽŽ’Ÿ>v¸èexpr‘U År‘ÿ}/estrictionŽŽŽ’q4é¹RESTRICT‘Ê»(S0,ŽŸ ®’q4éS0.X–U µ<“¹0)ŽŽŽŽ¡‘RESTRICT‘ó(set,ŽŸ ®‘region,‘U negate)ŽŽŽ‘g[·lter›LÅset‘÷¹b•¸èy‘Mk“eeping˜only˜pGoin“tsޤ ®‘g[·lying‘§Èinside/outside‘§ÉÅr–ÿ}/e“gion‘ÄU¹.‘iyTheŽ¡‘g[·original–U set“will“bGe“o•¸èv“erwrittenŽŽŽ’Ÿ>ono‘U Åne‘ÿ}/gateŽŽŽ’q4é¹RESTRICT‘Ê»(S0,ŽŸ ®’q4éR1,‘U OFF)ŽŽŽŽŸÝ0‰ffÌ ŽŽŽ :’­ôïcolor push BlackT›ÿ*¸able‘U 21:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.21) cvn /DEST pdfmark endï color pop“T˜ransformations‘U ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹*0kïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.42) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹42Ž’ÕÁGï color popŽŽ £n þŒ%´ ÿÑïcolor push Black ùé/ ÿv¡‘¼cïcolor push Blackï color popŽŽ‘ ¼cŸÜ2‰ffÂH‚¤ “q‘CommandŽ’õ,DescriptionŽŽŽŽŸ‰ffÂH‚¡‘P‘ÿ*¸A¸èGE–U SIZE“xdim,“ydimŽ’õ,set–U page“dimensions“(in“pp)“of“all“devicesŽŽŽŽ¤ ®‘P‘ÿ*¸A¸èGE–U RESIZE“xdim,“ydimŽ’õ,same›âas‘âabGo•¸èv“e˜plus˜rescale˜the‘âcurren“t˜plotŽŸ ®’õ,accordinglyŽŽŽŽ©\'‘DEVICE–U Å"devname"‘1„¹P‘ÿ*¸A¸èGE“SIZE“xdim,“ydimŽ’õ,set–›wpage“dimensions“(in‘›xpp)“of“device“ÅdevnameŽŽŽŽ¡‘¹DEVICE–U Å"devname"‘1„¹DPI“dpiŽ’õ,set–U device's“dpi“(dots“pGer“pixel)ŽŽŽŽ¡‘DEVICE–U Å"devname"‘1„¹F¸èONT“onoŽ’õ,enable/disable–GØusage›GÙof“built-in“fon¸èts˜for“de-ŽŸ ®’õ,vice‘U ÅdevnameŽŽŽŽ¦‘¹DEVICE–U Å"devname"‘1„¹F¸èONT“ANTIALIASING“onoŽ’õ,enable/disable–ç‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹43Ž’ÕÁGï color popŽŽ £n þ ³%Ÿ‚Z\ïcolor push BlackŸ}¥¤Ÿµ»ž‘*õïcolor push Blackï color popŽŽ‘ *õŸÍ$‰ffÁk^¤ “q‘Statemen¸ètŽ‘]ÄCDescriptionŽŽŽ’0ïšT¸èypGesŽ’_ftExampleŽŽ©‰ffÁk^¡‘DEFINE‘U ÅvarŽ‘]ÄC¹dene–U new“scalar“v‘ÿqÐariable“ÅvarŽŽŽ’_ft¹DEFINE‘U m¸èyv‘ÿqÐarŽŽ¤ ®‘DEFINE‘U Åvvar‘}¹[]Ž‘]ÄCdene–Cõnew“v¸èector“v‘ÿqÐariable“Åvvar‘Wr¹of“zero“lengthŽŽŽ’_ftDEFINE‘U m¸èyvv‘ÿqÐar[]ŽŽ¡‘DEFINE‘U Åvvar‘}¹[Ån‘ÄU¹]Ž‘]ÄCdene–U new“v¸èector“v‘ÿqÐariable“Åvvar‘h¹of“length“ÅnŽŽŽ’0ïš¹nexpr‘U ÅnŽ’_ft¹DEFINE‘U m¸èyvv‘ÿqÐar[10]ŽŽ¦‰ffÁk^¤ “q‘CLEAR‘U ÅvarŽ‘]ÄC¹undene–Pnew›Qv‘ÿqÐariable“Åvar‘͹and˜dealloGcate“as-ŽŸ ®‘]ÄCsoGciated‘U storageŽŽŽ’_ftCLEAR‘U m¸èyv‘ÿqÐarŽŽŸ/‰ffÁk^¡‘Åvvar‘h¹LENGTH‘U ÅnŽ‘]ÄC¹realloGcate–U v¸èector“v‘ÿqÐariable“ÅvvarŽŽŽ’0ïš¹nexpr‘U ÅnŽ’_ft¹m¸èyvv‘ÿqÐar–U LENGTH“25ŽŽ¦‰ffÁk^ŽŽŽŸJDb’²¤ïcolor push BlackT‘ÿ*¸able›U 24:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.24) cvn /DEST pdfmark endï color pop“User˜v‘ÿqÐariables˜ï color popŽŽŽï color popŽ FKS þÝröïcolor push Black "  ÿbO˜Tïcolor push Blackï color popŽŽ‘˜T ÿ{ŠE‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘u•«DescriptionŽŽŽ’Ÿ>T¸èypGesŽŽŽ’búõExampleŽŽŽŽŸ‰ffÌ ¡‘F¸èOCUS‘U Ågr‘ÿ}/aphŽŽŽ‘u•«¹Mak•¸èes›†£Ågr‘ÿ}/aph‘Jø¹curren“t˜and˜un-ŽŸ ®‘u•«hides–U it“if“necessaryŽŽŽ’Ÿ>graphsel‘U Ågr‘ÿ}/aphŽŽŽ’búõ¹F¸èOCUS‘U G0ŽŽŽŽŸ\'‘KILL‘U Ågr‘ÿ}/aphŽŽŽ‘u•«¹Kills‘U Ågr‘ÿ}/aphŽŽŽ’Ÿ>¹graphsel‘U Ågr‘ÿ}/aphŽŽŽ’búõ¹KILL‘U G0ŽŽŽŽŸ ®‘ARRANGE(Ånr‘ÿ}/ows‘Ò¹,ޤ ®‘Ånc‘ÿ}/ols‘Ò¹,– WÅoset‘òɹ,“Åhgap‘¡Ž¹,Ž¡‘Åvgap‘¡Ž¹)ŽŽŽ‘u•«Arrange–Ã!existing“graphs“(orޤ ®‘u•«add–extra“if‘needed)“to“formŽ¡‘u•«an‘¬²Ånr–ÿ}/ows›~ǹb¸èy‘¬±Ånc“ols˜¹matrix,Ž¡‘u•«leaš¸èving–OÓÅoset‘B¹at“eac˜h“pageŽ¡‘u•«edge–˜Fwith“Åhgap›9Ô¹and“Åvgap˜¹rel-Ž¡‘u•«ativ•¸èe›ühorizon“tal˜and˜v“erticalŽ¡‘u•«spacingsŽŽŽ’Ÿ>nexpr‘cÅnr–ÿ}/ows›Ò¹,‘gÅnc“ols˜¹,ޤ ®’Ÿ>expr‘jëÅoset‘òɹ,‘p]Åhgap‘¡Ž¹,Ž¡’Ÿ>ÅvgapŽŽŽ’búõ¹ARRANGE(2,‘]2,‘]Œ0.1,ŽŸ ®’búõ0.15,‘U 0.2)ŽŽŽŽŸ_‹‘ARRANGE(Ånr‘ÿ}/ows‘Ò¹,ޤ ®‘Ånc‘ÿ}/ols‘Ò¹,– WÅoset‘òɹ,“Åhgap‘¡Ž¹,Ž¡‘Åvgap‘¡Ž¹,– ÔÔÅhvinv›}¹,“Åhinv˜¹,Ž¡‘Åvinv‘}¹)ŽŽŽ‘u•«Same–ÅÎas“abGo•¸èv“e,‘¡ùplus‘ÅÎaddi-ޤ ®‘u•«tional‘Î Åhvinv–}¹,›,EÅhinv“¹,˜and‘Î ÅvinvŽ¡‘u•«¹ags–ˆüallo¸èwing“to‘ˆûalter“the“or-Ž¡‘u•«der–U of“the“matrix“llingŽŽŽ’Ÿ>nexpr‘cÅnr–ÿ}/ows›Ò¹,‘gÅnc“ols˜¹,ޤ ®’Ÿ>expr‘jëÅoset‘òɹ,‘p]Åhgap‘¡Ž¹,Ž¡’Ÿ>Åvgap‘¡Ž¹,‘“/ono‘¹ùÅhvinv‘}¹,Ž¡’Ÿ>Åhinv‘}¹,‘U ÅvinvŽŽŽ’búõ¹ARRANGE(2,‘]2,‘]Œ0.1,ޤ ®’búõ0.15,‘Ž’0.2,‘Ž‘ON,‘¶HOFF,Ž¡’búõON)ŽŽŽŽŸ6¸O‘ARRANGE(Ånr‘ÿ}/ows‘Ò¹,ޤ ®‘Ånc‘ÿ}/ols‘Ò¹,– WÅoset‘òɹ,“Åhgap‘¡Ž¹,Ž¡‘Åvgap‘¡Ž¹,– ÔÔÅhvinv›}¹,“Åhinv˜¹,Ž¡‘Åvinv‘}¹,‘U Åsnake‘ÀO¹)ŽŽŽ‘u•«Same–ÅÎas“abGo•¸èv“e,‘¡ùplus‘ÅÎaddi-ޤ ®‘u•«tional–€ÔÅsnake‘A#¹ag‘€Óallo¸èwing“toŽ¡‘u•«ll–¦Øthe“matrix‘¦×in“a“snak•¸èe-lik“eŽ¡‘u•«fashionŽŽŽ’Ÿ>nexpr‘cÅnr–ÿ}/ows›Ò¹,‘gÅnc“ols˜¹,ޤ ®’Ÿ>expr‘jëÅoset‘òɹ,‘p]Åhgap‘¡Ž¹,Ž¡’Ÿ>Åvgap‘¡Ž¹,‘“/ono‘¹ùÅhvinv‘}¹,Ž¡’Ÿ>Åhinv–}¹,›U Åvinv“¹,˜ÅsnakeŽŽŽ’búõ¹ARRANGE(2,‘]2,‘]Œ0.1,ޤ ®’búõ0.15,‘Ž’0.2,‘Ž‘ON,‘¶HOFF,Ž¡’búõON,‘U ON)ŽŽŽŽŽŽŽ ›¿A’ª[Éïcolor push BlackT‘ÿ*¸able›U 25:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.25) cvn /DEST pdfmark endï color pop“Graph˜opGerations˜ï color popŽŽŽï color popŽ ¢"cŸ›æïcolor push BlackŸ~dŸ´c˜Tïcolor push Blackï color popŽŽ‘˜TŸÍž½‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘nx±DescriptionŽŽŽ’ú‚DT¸èypGesŽŽŽ’jïExampleŽŽŽŽŸ‰ffÌ ¡‘WITH‘U Ågr‘ÿ}/aphŽŽŽ‘nx±¹Mak•¸èes‘U Ågr‘ÿ}/aph‘u¹curren“tŽŽŽ’ú‚Dgraphsel‘U Ågr‘ÿ}/aphŽŽŽ’jï¹WITH‘U G0ŽŽŽŽ¤ ®‘TYPE‘U Åtyp‘ÿ}/eŽŽŽ‘nx±¹Sets–U Åtyp‘ÿ}/e‘o¹of“curren¸èt“graphŽŽŽ’ú‚Dgraph•¸èt“ypGe‘U Åtyp‘ÿ}/eŽŽŽ’jï¹TYPE‘U XYŽŽŽŽ¡‘Ågr‘ÿ}/aph‘u¹onoŽŽŽ‘nx±(De)A¸èctiv‘ÿqÐates–U selected“Ågr‘ÿ}/aphŽŽŽ’ú‚D¹graphsel–U Ågr‘ÿ}/aph‘ÄU¹,“onoŽŽŽ’jïG0‘U ONŽŽŽŽ¡‘Ågr‘ÿ}/aph‘Ä˹HIDDEN‘`onoŽŽŽ‘nx±Hides–U selected“Ågr‘ÿ}/aphŽŽŽ’ú‚D¹graphsel–U Ågr‘ÿ}/aph‘ÄU¹,“onoŽŽŽ’jïG1–U HIDDEN“TR¸èUEŽŽŽŽ¡‘Ågr–ÿ}/aph‘u¹TYPE‘U Åtyp“eŽŽŽ‘nx±¹Sets–U Åtyp›ÿ}/e‘o¹of“Ågr˜aphŽŽŽ’ú‚D¹graphsel‘$8ÐÅgr‘ÿ}/aph‘ÄU¹,ŽŸ ®’ú‚Dgraph•¸èt“ypGe‘U Åtyp‘ÿ}/eŽŽŽ’jï¹G0–U TYPE“XYD¸èYŽŽŽŽŽŽŽŸIªÉ’”„Cïcolor push BlackT‘ÿ*¸able›U 26:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.26) cvn /DEST pdfmark endï color pop“Graph˜selection˜parameters˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹,U%ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.44) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹44Ž’ÕÁGï color popŽŽ £nŸÄ¥Y ýôã«ïcolor push Black  U þîr˜Tïcolor push Blackï color popŽŽ‘˜T ÿBŸ‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘nx±DescriptionŽŽŽ’ú‚DT¸èypGesŽŽŽ’jïExampleŽŽŽŽŸ‰ffÌ ¡‘W¸èORLD‘®¥XMINŽŸ ®‘ÅxminŽŽŽ‘nx±¹Sets–BJminim¸èum“v‘ÿqÐalue‘BIof“cur-ŽŸ ®‘nx±ren¸èt–U graph's“x“axis“to“ÅxminŽŽŽ’ú‚D¹expr‘U ÅxminŽŽŽ’jï¹W¸èORLD–U XMIN“-10ŽŽŽŽ¤\'‘W¸èORLD‘ËUXMAXŽŸ ®‘ÅxmaxŽŽŽ‘nx±¹Sets–Åàmaxim¸èum“v‘ÿqÐalue‘Åßof“cur-ŽŸ ®‘nx±ren¸èt–U graph's“x“axis“to“ÅxminŽŽŽ’ú‚D¹expr‘U ÅxmaxŽŽŽ’jï¹W¸èORLD‘ËUXMAXŽŸ ®’jï22.5ŽŽŽŽ¡‘W¸èORLD‘®¥YMINŽŸ ®‘ÅyminŽŽŽ‘nx±¹Sets–BJminim¸èum“v‘ÿqÐalue‘BIof“cur-ŽŸ ®‘nx±ren¸èt–U graph's“y“axis“to“ÅyminŽŽŽ’ú‚D¹expr‘U ÅyminŽŽŽ’jï¹W¸èORLD–U YMIN“0ŽŽŽŽ¡‘W¸èORLD‘ËUYMAXŽŸ ®‘ÅymaxŽŽŽ‘nx±¹Sets–Åàmaxim¸èum“v‘ÿqÐalue‘Åßof“cur-ŽŸ ®‘nx±ren¸èt–U graph's“y“axis“to“ÅymaxŽŽŽ’ú‚D¹expr‘U ÅymaxŽŽŽ’jï¹W¸èORLD–U YMAX“1e4ŽŽŽŽ¡‘VIEW–U XMIN“ÅxminŽŽŽ‘nx±¹Sets–k0left“edge‘k/of“curren¸èt“graphŽŸ ®‘nx±at–U x=Åxmin‘u¹in“the“viewpGortŽŽŽ’ú‚Dexpr‘U ÅxminŽŽŽ’jï¹VIEW–U XMIN“.2ŽŽŽŽ¡‘VIEW–U XMAX“ÅxmaxŽŽŽ‘nx±¹Sets–›righš¸èt“edge‘›of“curren˜tޤ ®‘nx±graph–h³at“x=Åxmax‘œã¹in“the“view-Ž¡‘nx±pGortŽŽŽ’ú‚Dexpr‘U ÅxmaxŽŽŽ’jï¹VIEW–U XMAX“1.0ŽŽŽŽ¤) ;‘VIEW–U YMIN“ÅyminŽŽŽ‘nx±¹Sets–ÕßbGottom“edge‘ÕÞof“curren¸ètޤ ®‘nx±graph›ªLat–ªKy=Åymin‘n¡¹in“the˜view-Ž¡‘nx±pGortŽŽŽ’ú‚Dexpr‘U ÅyminŽŽŽ’jï¹VIEW–U YMIN“.25ŽŽŽŽ¡‘VIEW–U YMAX“ÅymaxŽŽŽ‘nx±¹Sets–\øtop“edge‘\÷of“curren¸èt“graphŽŸ ®‘nx±at–U y=Åymax‘‰P¹in“the“viewpGortŽŽŽ’ú‚Dexpr‘U ÅymaxŽŽŽ’jï¹VIEW–U YMAX“.75ŽŽŽŽ¤\'‘VIEW‘”ÈÅxmin–ÄU¹,‘e¿Åymin“¹,ŽŸ ®‘Åxmax‘40¹,‘U ÅymaxŽŽŽ‘nx±¹Sets–U graph's“viewpGortŽŽŽ’ú‚Dexpr‘ ¾RÅxmin–ÄU¹,‘XŸÅymin“¹,ŽŸ ®’ú‚DÅxmax‘40¹,‘U ÅymaxŽŽŽ’jï¹VIEW‘ «n0.15,‘ ƒ_0.15,ŽŸ ®’jï1.15,‘U 0.85ŽŽŽŽ¡‘XAXES‘ SCALE‘¡Åtyp‘ÿ}/eŽŽŽ‘nx±¹Set–û‚scaling“of“the‘ûx“axes“toŽŸ ®‘nx±Åtyp‘ÿ}/eŽŽŽ’ú‚Dtyp‘ÿ}/e‘ÀO¹:‘ ¹one‘øàof‘øáNOR-ޤ ®’ú‚DMAL,‘‚ LOGARITH-Ž¡’ú‚DMIC,‘ô€or‘ôRECIPR¸èO-Ž¡’ú‚DCALŽŽŽ’jïXAXES‘K-SCALEŽŸ ®’jïNORMALŽŽŽŽ¤6¸O‘Y‘ÿ*¸AXES–U SCALE“Åtyp‘ÿ}/eŽŽŽ‘nx±¹Set–û‚scaling“of“the‘ûy“axes“toŽŸ ®‘nx±Åtyp‘ÿ}/eŽŽŽ’ú‚Dtyp‘ÿ}/e‘ÀO¹:‘ ¹one‘øàof‘øáNOR-ޤ ®’ú‚DMAL,‘‚ LOGARITH-Ž¡’ú‚DMIC,‘ô€or‘ôRECIPR¸èO-Ž¡’ú‚DCALŽŽŽ’jïY‘ÿ*¸AXES‘ uSCALEŽŸ ®’jïLOGARITHMICŽŽŽŽ¡‘XAXES‘v5INVER‘ÿ*¸TŽŸ ®‘onoŽŽŽ‘nx±If–¦ÈON,“dra¸èws‘¦Çxmin“to“xmaxŽŸ ®‘nx±from–U righ¸èt“to“leftŽŽŽ’ú‚DonoŽŽŽ’jïXAXES‘v5INVER‘ÿ*¸TŽŸ ®’jïOFFŽŽŽŽ¤\'‘Y–ÿ*¸AXES‘K}INVER“TŽŸ ®‘onoŽŽŽ‘nx±If–¦ÈON,“dra¸èws‘¦Çymin“to“ymaxŽŸ ®‘nx±from–U top“to“bGottomŽŽŽ’ú‚DonoŽŽŽ’jïY–ÿ*¸AXES‘K}INVER“TŽŸ ®’jïOFFŽŽŽŽ¡‘A¸èUTOSCALE‘ Ó!ON-ŽŸ ®‘READ‘U Åtyp‘ÿ}/eŽŽŽ‘nx±¹Set–Ô8automatic‘Ô7scaling“on“readŽŸ ®‘nx±according–U to“Åtyp‘ÿ}/eŽŽŽ’ú‚Dtyp‘ÿ}/e‘ÀO¹:‘ ‡none‘`of‘`NONE,ޤ ®’ú‚DXAXES,‘(‹Y‘ÿ*¸AXES,Ž¡’ú‚DXY‘ÿ*¸AXESŽŽŽ’jïA¸èUTOSCALE‘ Ó!ON-ŽŸ ®’jïREAD‘U NONEŽŽŽŽŽŽŽ æ’­ôïcolor push BlackT‘ÿ*¸able›U 27:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.27) cvn /DEST pdfmark endï color pop“Axis˜parameters˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹-k@ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.45) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹45Ž’ÕÁGï color popŽŽ £n ý~.\ïcolor push Black ¡—% þ¢Ê ˜Tïcolor push Blackï color popŽŽ‘˜T þ¼7‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘u•«DescriptionŽŽŽ’Ÿ>T¸èypGesŽŽŽ’jïExampleŽŽŽŽŸ‰ffÌ ¡‘TITLE‘U ÅtitleŽŽŽ‘u•«¹Sets–θthe“title‘ηof“curren¸èt“graphŽŽŽ’Ÿ>sexpr‘U ÅtitleŽŽŽ’jï¹TITLE‘U "F‘ÿ*¸oGo"ŽŽŽŽ¤ ®‘TITLE–U F¸èONT“ÅfontŽŽŽ‘u•«¹Selects–U fon¸èt“of“title“stringŽŽŽ’Ÿ>fon¸ètsel‘U ÅfontŽŽŽ’jï¹TITLE–U F¸èONT“1ŽŽŽŽ¡‘TITLE–U SIZE“ÅsizeŽŽŽ‘u•«¹Sets–U size“of“title“stringŽŽŽ’Ÿ>expr‘U ÅsizeŽŽŽ’jï¹TITLE–U SIZE“1.5ŽŽŽŽ¡‘TITLE–U COLOR“Åc‘ÿ}/olorŽŽŽ‘u•«¹Sets–U color“of“title“stringŽŽŽ’Ÿ>colorsel‘U Åc‘ÿ}/olorŽŽŽ’jï¹TITLE–U COLOR“1ŽŽŽŽ¡‘SUBTITLE‘U ÅsubtitleŽŽŽ‘u•«¹Sets–wthe“subtitle‘vof“curren¸ètŽŸ ®‘u•«graphŽŽŽ’Ÿ>sexpr‘U ÅsubtitleŽŽŽ’jï¹SUBTITLE‘U "Bar"ŽŽŽŽ¤\'‘SUBTITLE‘š«F¸èONTŽŸ ®‘ÅfontŽŽŽ‘u•«¹Selects–U fon¸èt“of“subtitle“stringŽŽŽ’Ÿ>fon¸ètsel‘U ÅfontŽŽŽ’jï¹SUBTITLE‘ }±F¸èONTŽŸ ®’jï"Times-Italic"ŽŽŽŽ¡‘SUBTITLE–U SIZE“ÅsizeŽŽŽ‘u•«¹Sets–U size“of“subtitle“stringŽŽŽ’Ÿ>expr‘U ÅsizeŽŽŽ’jï¹SUBTITLE‘0ÐSIZE‘0Ñ.60ŽŽŽŽ© ®‘SUBTITLE‘ ÷—COLORŽŸ ®‘Åc‘ÿ}/olorŽŽŽ‘u•«¹Sets–U color“of“subtitle“stringŽŽŽ’Ÿ>colorsel‘U Åc‘ÿ}/olorŽŽŽ’jï¹SUBTITLE‘ÚCOLORŽŸ ®’jï"blue"ŽŽŽŽ¡‘LEGEND‘U onoŽŽŽ‘u•«T‘ÿ*¸oggle–U legend“displa¸èyŽŽŽ’Ÿ>onoŽŽŽ’jïLEGEND‘U ONŽŽŽŽ¦‘LEGEND‘-9LOCTYPEŽŸ ®‘Åtyp‘ÿ}/eŽŽŽ‘u•«¹P¸èosistion–ðlegend‘ïin“Åtyp‘ÿ}/e‘Ü?¹coGor-ŽŸ ®‘u•«dinatesŽŽŽ’Ÿ>Åtyp‘ÿ}/e‘ÀO¹:‘\either‘+W¸èORLDŽŸ ®’Ÿ>or‘U VIEWŽŽŽ’jïLEGEND‘¯LOC-ŽŸ ®’jïTYPE‘U W¸èORLDŽŽŽŽ¡‘LEGEND‘U Åxlo–ÿ}/c,‘“°ylo“cŽŽŽ‘u•«¹Set–ò/lošGcation“of‘ò.legend“b˜o¸èxŽŸ ®‘u•«(uppGer–U left“corner)ŽŽŽ’Ÿ>expr‘U Åxlo–ÿ}/c,‘“°ylo“cŽŽŽ’jï¹LEGEND‘U .5,.75ŽŽŽŽ¡‘LEGEND–U F¸èONT“ÅfontŽŽŽ‘u•«¹Set–U legend“fonš¸èt“t˜ypGeŽŽŽ’Ÿ>fon¸ètsel‘U ÅfontŽŽŽ’jï¹LEGEND‘äGF¸èONTŽŸ ®’jï"Helv¸èetica"ŽŽŽŽ¡‘LEGEND‘ŒCHAR‘ŒSIZEŽŸ ®‘ÅsizeŽŽŽ‘u•«¹Sets–2@size“of‘2?legend“labGel“c¸èhar-ŽŸ ®‘u•«acters–U (1“is“normal)ŽŽŽ’Ÿ>expr‘U ÅsizeŽŽŽ’jï¹LEGEND‘ÿCHARŽŸ ®’jïSIZE‘U .30ŽŽŽŽ¡‘LEGEND‘U Åc‘ÿ}/olorŽŽŽ‘u•«¹Set–U color“of“legend“textŽŽŽ’Ÿ>colorsel‘U Åc‘ÿ}/olorŽŽŽ’jï¹LEGEND–U COLOR“1ŽŽŽŽ¦‘LEGEND–U V¸èGAP“ÅgapŽŽŽ‘u•«¹Sets–åþvš¸èertical‘åýgap“bGet˜w˜een“leg-ŽŸ ®‘u•«end‘U en¸ètriesŽŽŽ’Ÿ>nexpr‘U ÅgapŽŽŽ’jï¹LEGEND–U V¸èGAP“1ŽŽŽŽ¡‘LEGEND–U HGAP“ÅgapŽŽŽ‘u•«¹Sets–@Êhorizonš¸ètal‘@Ëgap“bGet˜w˜eenŽŸ ®‘u•«sym¸èbGol–U and“descriptionŽŽŽ’Ÿ>nexpr‘U ÅgapŽŽŽ’jï¹LEGEND–U HGAP“4ŽŽŽŽ¡‘LEGEND‘ ¢'LENGTHŽŸ ®‘ÅlengthŽŽŽ‘u•«¹Sets–U Ålength‘u¹of“legendŽŽŽ’Ÿ>nexpr‘U ÅlengthŽŽŽ’jï¹LEGEND‘…-LENGTHŽŸ ®’jï5ŽŽŽŽ¡‘LEGEND‘—=INVER‘ÿ*¸TŽŸ ®‘onoŽŽŽ‘u•«Determines‘ïxrelationship‘ïwbGe-ޤ ®‘u•«t•¸èw“een–fÜorder“of‘fÛsets“and“orderŽ¡‘u•«of–U legend“labGelsŽŽŽ’Ÿ>onoŽŽŽ’jïLEGEND‘ zCINVER‘ÿ*¸TŽŸ ®’jïtrueŽŽŽŽŸ) ;‘LEGEND–U BO¸èX“onoŽŽŽ‘u•«Determines– dif‘ dthe“legendŽŸ ®‘u•«b•Gounding›U b“o•¸èx˜is˜dra“wnŽŽŽ’Ÿ>onoŽŽŽ’jïLEGEND–U BO¸èX“oŽŽŽŽ¡‘LEGEND‘"«BO¸èXŽŸ ®‘COLOR‘U Åc‘ÿ}/olorŽŽŽ‘u•«¹Sets–Pcolor‘Oof“legend“bGoundingŽŸ ®‘u•«bGo¸èxŽŽŽ’Ÿ>colorsel‘U Åc‘ÿ}/olorŽŽŽ’jï¹LEGEND‘އBO¸èXŽŸ ®’jïCOLOR‘U 1ŽŽŽŽ¡‘LEGEND‘½—BO¸èX‘½–P–ÿ*¸A“T-ŽŸ ®‘TERN‘U Åp‘ÿ}/atternŽŽŽ‘u•«¹Sets–Ô8pattern‘Ô7of“legend“bGound-ŽŸ ®‘u•«ing‘U bGo¸èxŽŽŽ’Ÿ>patternsel‘U Åp‘ÿ}/atternŽŽŽ’jï¹LEGEND‘އBO¸èXŽŸ ®’jïP–ÿ*¸A“TTERN‘U 2ŽŽŽŽ¡‘LEGEND‘"«BO¸èXŽŸ ®‘LINESTYLE‘U ÅstyleŽŽŽ‘u•«¹Sets–n©line“st¸èyle‘n¨of“bGoundingŽŸ ®‘u•«bGo¸èxŽŽŽ’Ÿ>nexpr‘U ÅstyleŽŽŽ’jï¹LEGEND‘އBO¸èXŽŸ ®’jïLINESTYLE‘U 1ŽŽŽŽ¡‘LEGEND‘"«BO¸èXŽŸ ®‘LINEWIDTH‘U ÅwidthŽŽŽ‘u•«¹Sets–2Kline“width‘2Jof“bGoundingŽŸ ®‘u•«bGo¸èxŽŽŽ’Ÿ>nexpr‘U ÅwidthŽŽŽ’jï¹LEGEND‘އBO¸èXŽŸ ®’jïLINEWIDTH‘U 2ŽŽŽŽ¡‘LEGEND‘¯BO¸èX‘®FILLŽŸ ®‘onoŽŽŽ‘u•«Determines– dif‘ dthe“legendŽŸ ®‘u•«b•Gounding›U b“o¸èx˜is˜lledŽŽŽ’Ÿ>onoŽŽŽ’jïLEGEND‘v1BO¸èX‘v2FILLŽŸ ®’jïfalseŽŽŽŽ¡‘LEGEND‘¯BO¸èX‘®FILLŽŸ ®‘COLOR‘U Åc‘ÿ}/olorŽŽŽ‘u•«¹Sets–U color“of“legend“bGo¸èx“llŽŽŽ’Ÿ>colorsel‘U Åc‘ÿ}/olorŽŽŽ’jï¹LEGEND‘އBO¸èXŽŸ ®’jïCOLOR‘U 3ŽŽŽŽ¡‘LEGEND‘¯BO¸èX‘®FILLŽŸ ®‘Åp‘ÿ}/atternŽŽŽ‘u•«¹Sets– ppattern“of‘ olegend“bGo¸èx“llŽŽŽ’Ÿ>patternsel‘U Åp‘ÿ}/atternŽŽŽ’jï¹LEGEND‘v1BO¸èX‘v2FILLŽŸ ®’jïP–ÿ*¸A“TTERN‘U 1ŽŽŽŽŽŽŽ [DN’¨Ý¨ïcolor push BlackT‘ÿ*¸able›U 28:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.28) cvn /DEST pdfmark endï color pop“Titles˜and˜legends˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹.{Rïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.46) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹46Ž’ÕÁGï color popŽŽ £n þõ»/ þ´h¿ïcolor push Black K—A ÿMÉü˜Tïcolor push Blackï color popŽŽ‘˜T ÿg)‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘u•«DescriptionŽŽŽ’Ÿ>T¸èypGesŽŽŽ’búõExampleŽŽŽŽŸ‰ffÌ ¡‘READ‘U Å"le"ŽŽŽ‘u•«¹Reads–U Åle‘o¹as“a“single“setŽŽŽ’Ÿ>sexpr‘U ÅleŽŽŽ’búõ¹READ‘U "foGo.dat"ŽŽŽŽ¤ ®‘READ‘U Åsettyp‘ÿ}/e‘o"le"ŽŽŽ‘u•«¹Reads–“=Åle‘S¹in¸èto“a–“>single“set‘“=ofŽŸ ®‘u•«t¸èypGe‘U Åsettyp‘ÿ}/eŽŽŽ’Ÿ>¹xyt¸èypGe‘»¾Åsettyp‘ÿ}/e‘ÀO¹,ŽŸ ®’Ÿ>sexpr‘U ÅleŽŽŽ’búõ¹READ–U xydy“"bar.dat"ŽŽŽŽ©\'‘READ–U NXY“Å"le"ŽŽŽ‘u•«¹Reads–U Åle‘o¹as“NXY“dataŽŽŽ’Ÿ>sexpr‘U ÅleŽŽŽ’búõ¹READ‘ƒNXY‘ƒ "gad.dat"ŽŽŽŽ¡‘READ–U BLOCK“Å"le"ŽŽŽ‘u•«¹Reads–U Åle‘o¹as“bloGc¸èk“dataŽŽŽ’Ÿ>sexpr‘U ÅleŽŽŽ’búõ¹READ‘"/BLOCKŽŸ ®’búõ"zoGoks.dat"ŽŽŽŽ¦‘KILL‘U BLOCKŽŽŽ‘u•«Kills– 1the“curren•¸èt‘ 0bloGc“k‘ 1dataޤ ®‘u•«and–bxfrees‘bwthe“assoGciated“mem-Ž¡‘u•«oryŽŽŽ’búõKILL‘U BLOCKŽŽŽŽ¤) ;‘BLOCK‘"ÉÅsettyp‘ÿ}/eŽŸ ®‘c‘ÿ}/olumnsŽŽŽ‘u•«¹F‘ÿ*¸orms–›\a››[data“set“of˜t¸èypGe“Åset-ޤ ®‘u•«typ–ÿ}/e‘.¹using›mÉÅc“olumns‘?ß¹from˜cur-Ž¡‘u•«ren•¸èt›U bloGc“k˜data˜le.ŽŽŽ’Ÿ>xyt¸èypGe‘»¾Åsettyp‘ÿ}/e‘ÀO¹,ŽŸ ®’Ÿ>sexpr‘U Åc‘ÿ}/olumnsŽŽŽ’búõ¹BLOCK‘D›xydxdyŽŸ ®’búõ"0:2:1:3"ŽŽŽŽ¡‘WRITE‘U ÅsetŽŽŽ‘u•«¹writes–U Åset‘Gé¹to“stdoutŽŽŽ’Ÿ>setsel‘U ÅsetŽŽŽ’búõ¹WRITE‘U G0.S1ŽŽŽŽŸ ®‘WRITE‘vnÅset‘i@¹F¸èORMA‘ÿ*¸TŽŸ ®‘Å"formatstring"ŽŽŽ‘u•«¹writes–V„Åset‘IN¹to“stdout“usingޤ ®‘u•«format–O‚spGecication“Åformat-Ž¡‘u•«stringŽŽŽ’Ÿ>¹setsel–IƒÅset‘matstringŽŽŽ’búõ¹WRITE‘µûG0.S1‘¶ÚF¸èOR-ŽŸ ®’búõMA‘ÿ*¸T‘U "%18.8g"ŽŽŽŽ¡‘WRITE‘eÅset‘ õ¹FILEŽŸ ®‘Å"le"ŽŽŽ‘u•«¹writes–U Åset‘Gé¹to“ÅleŽŽŽ’Ÿ>¹setsel–U Åset‘Gé¹sexpr“ÅleŽŽŽ’búõ¹WRITE‘ydG0.S1‘zuFILEŽŸ ®’búõ"data.dat"ŽŽŽŽ¦‘WRITE‘eÅset‘ õ¹FILEޤ ®‘Å"le"‘ (¹F¸èORMA‘ÿ*¸TŽ¡‘Å"formatstring"ŽŽŽ‘u•«¹writes–äžÅset‘×g¹to‘äŸÅle‘¤í¹using“formatŽŸ ®‘u•«spGecication‘U ÅformatstringŽŽŽ’Ÿ>¹setsel–Z Åset‘LÓ¹sexpr“ÅleŽŸ ®’Ÿ>¹sexpr‘U ÅformatstringŽŽŽ’búõ¹WRITE‘ydG0.S1‘zuFILEޤ ®’búõ"data.dat"‘~ëF¸èORMA‘ÿ*¸TŽ¡’búõ"%18.8g"ŽŽŽŽŽŽŽ °D\’ŒMªïcolor push BlackT‘ÿ*¸able›U 29:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.29) cvn /DEST pdfmark endï color pop“Set˜input,˜output,˜and˜creation˜ï color popŽŽŽï color popŽ ÞO?Ÿ›åïcolor push BlackŸ~dŸ´c˜Tïcolor push Blackï color popŽŽ‘˜TŸÍž¼‰ffÌ ¤ “q‘Statemen¸ètŽŽŽ‘u•«DescriptionŽŽŽ’Ÿ>T¸èypGesŽŽŽ’búõExampleŽŽŽŽŸ‰ffÌ ¡‘COPY–U Åsr‘ÿ}/c‘å̹TO“ÅdestŽŽŽ‘u•«¹Copies–U Åsr‘ÿ}/c‘å̹to“ÅdestŽŽŽ’Ÿ>¹setsel‘U Åsr‘ÿ}/c,destŽŽŽ’búõ¹COPY–U S0“TO“S1ŽŽŽŽŸ ®‘MO¸èVE–U Åsr‘ÿ}/c‘å̹TO“ÅdestŽŽŽ‘u•«¹Mo•¸èv“es–U Åsr‘ÿ}/c‘å̹to“ÅdestŽŽŽ’Ÿ>¹setsel‘U Åsr‘ÿ}/c,destŽŽŽ’búõ¹MO¸èVE‘ ¸1G0.S0‘ ºàTOŽŸ ®’búõG1.S0ŽŽŽŽ¤\'‘SW‘þã AP–U Åsr‘ÿ}/c‘å̹AND“ÅdestŽŽŽ‘u•«¹In•¸èterc“hanges–U Åsr‘ÿ}/c‘å̹and“ÅdestŽŽŽ’Ÿ>¹setsel‘U Åsr‘ÿ}/c,destŽŽŽ’búõ¹SW‘þã AP‘ ßÙG0.S0‘ áÌANDŽŸ ®’búõG0.S1ŽŽŽŽ¡‘KILL‘U ÅsetŽŽŽ‘u•«¹Kills‘U ÅsetŽŽŽ’Ÿ>¹setsel‘U ÅsetŽŽŽ’búõ¹KILL‘U G0.S0ŽŽŽŽŽŽŽŸIªÉ’±Y’ïcolor push BlackT‘ÿ*¸able›U 30:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.30) cvn /DEST pdfmark endï color pop“Set˜opGerations˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹/‘¸ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.47) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹47Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÇCourier-Oblique–*ƒ¾Courier-Oblique“n022023l.pfbޤ Š=‘Courier-Bold–8¯¨Courier-Bold“n022004l.pfbŽ¡‘Courier-BoldOblique–ž†Courier-BoldOblique“n022024l.pfbŽ¡‘Symbol–U|Symbol“s050000l.pfbŽ¡‘ZapfDingbats–8¯¨ZapfDingbats“d050000l.pfbŽ¡žff‰ffÕÁGŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.1.2) cvn /DEST pdfmark endŸ VÂ6.1.2Ž‘#!\F‘ÿ ºon®>t–Õdata“lesŽŸMª¹F‘ÿ*¸or–U text“rastering,“three“t¸èypGes“of“les“are“used.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.20) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘¿.pfa¹-/¿.pfb¹-les:‘ŽÙThese–cÍconš¸ètain‘cÌthe“c˜haracter›cÌoutline“descriptions.‘…The“les˜are“assumed˜to“bGe˜in“theޤ ®‘¿fonts/type1–U ¹directory;“these“are“the“lenames“spGecied“in“the“¿FontDataBase“¹conguration“le.Ž©8Àïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.21) cvn /DEST pdfmark endŸuTïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘¿.afm¹-les:‘P©These–D´conš¸ètain‘Dµhigh-precision“fon˜t“metric‘Dµdescriptions“as“w˜ell›Dµas“some˜extra“information,Ž¡‘suc•¸èh›as‘žk“erning˜and˜ligature–žinformation˜for˜a“particular˜fon¸èt.‘¬øIt˜is˜assumed“that˜the˜lename“of˜aŽ¡‘fon¸èt–ámetric›àle“has“same“basename˜as“the“respGectiv•¸èe˜fon“t–áoutline“le,‘&‡but“with˜the“¿.afm“¹extension;‘.KtheŽ¡‘metric–U les“are“expšGected“to“b˜e“found“in“the“¿fonts/type1“¹directory‘ÿ*¸,“to˜o.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.22) cvn /DEST pdfmark endŸuTïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘¿.enc¹-les:‘œThese–uWconš¸ètain‘uXencoGding“arra˜ys›uXin“a˜spGecial“but˜simple“form.‘&éThey“are˜only“needed˜if“someoneŽ¡‘w•¸èan“ts–U to“load“a“spšGecial“enco˜ding“to“re-enco˜de“a“fon¸èt.‘q€Their“place“is“¿fonts/encŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.1.3) cvn /DEST pdfmark endŸçÂ6.1.3Ž‘#!\Custom‘Õfon®>tsŽŸMª¹It–­[is›­\pGossible“to˜use“custom˜fon¸èts“with˜Grace.‘z2One˜mostly“needs˜to“use˜extra“fon¸èts˜for“the˜purpGose“ofŽ¡lo•Gcalization.‘AðF‘ÿ*¸or›š›man¸èy‘ššEurop“ean˜languages,‘«ùthe˜standard–ššfon¸èts˜supplied˜with“Grace˜should˜con¸ètain“all˜theŽ¡cš¸èharacters–“needed,‘âŸbut‘“ encoGding“ma˜y“ha˜v˜e›“ to“bGe“adjusted.‘+~This“is˜done“b¸èy“putting“a˜¿Default.enc“¹leŽ¡with–ã¢propšGer“enco˜ding“sc•¸èheme‘ã¡in“to–ã¢the“¿fonts/enc“¹directory‘ÿ*¸.‘Grace“comes“with“a“few“enco˜ding‘ã¡les“in“theŽ¡directory;‘2‹more–è½can“bšGe“easily“found“on“the“In¸èternet.‘,W(If“the“¿Default.enc“¹le“do˜esn't“exist,‘ ¤the“IsoLatin1Ž¡encošGding–LŽwill“b˜e“used).‘n¤Notice“that“for“fonš¸èts“ha˜ving“an“encoGding“sc˜heme“in‘Lthemselv˜es“(suc˜h“as“the“Sym˜bGolŽ¡fonš¸èt,–U and“man˜y“nationalized“fon˜ts)“the“default“encoGding“is“ignored.Ž©ؼIf–F²yš¸èou“do‘F³need“to“use“extra“fon˜ts,‘I•y˜ou›F³should“moGdify“the“¿FontDataBase“¹le˜accordingly‘ÿ*¸,‘I•obGeying“its“format.Ž¡Ho•¸èw“ev“er,‘1¬if›(Ïy“ou˜are˜going˜to˜exc“hange˜Grace˜pro‘Ž0ject˜les‘(Îwith˜other˜pGeople˜who˜do˜not˜ha“v“e˜the˜extra˜fon“tsŽ¡congured,–U an“impGortanš¸èt“thing“is“to“dene“reasonable“fall-bac˜k“fon˜t“names.ަF‘ÿ*¸or–U example,“let“us“assume“I“use“Hebrew“fonš¸èts,“and“the“conguration“le“has“lines“lik˜e“these:Ž© ‚¶‰ffÕÁGŸ%Cïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘+å:Ç...ޤ Š=‘Courier-Hebrew‘B"DCourier‘PN.courh___.pfaŽ¡‘Courier-Hebrew-Oblique‘WÔCourier-Oblique‘*ƒ¾courho__.pfaŽ¡‘+å:...Ž¡žff‰ffÕÁGŸ ȹMy–U colleague,“who“livš¸èes“in“Russia,“uses“Cyrillic“fon˜ts“with“Grace“congured“lik˜e“this:ަ‰ffÕÁGŸ%Cïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘+å:Ç...Ž¡‘Cronix-Courier‘B"DCourier‘PN.croxc.pfbŽ¡‘Cronix-Courier-Oblique‘WÔCourier-Oblique‘*ƒ¾croxco.pfbŽ¡‘+å:...Ž¡žff‰ffÕÁGŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹0¢¯ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.48) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹48Ž’ÕÁGï color popŽŽ £n ýˆ.\The– fon¸èt›mapping“information˜(F‘ÿ*¸on¸èt“name“µ<¹-µ>˜¹F‘ÿ*¸onš¸èt“fall-bac˜k)“is›stored“in˜the“Grace“pro‘Ž0ject˜les.‘U+Pro¸èvidedޤ ®that–ºŠall›º‹the“loGcalized˜fonš¸èts“ha˜v˜e‘º‹English“c˜haracters›º‹in“the˜lo•¸èw“er–ºŠpart˜of“the˜ASCI•GI‘ºptable˜unmo“died,‘ÓåI‘ºpcanŽ¡send–†\m¸èy›†[friend“les˜(with“no“Hebrew˜c¸èharacters,‘¯¶of“course)˜and“bGe˜sure“they“render˜correctly“on˜his“computer.ŽŸؼThš¸èus,‘v˜with–<³propGerly“congured“national“fon˜ts,‘v—y˜ou“can“mak˜e“loGcalized“annotations“for“plots“in˜tended“forŽ¡inš¸èternal–X]use‘X\of“y˜our“institution,‘Y+while“bGeing“able‘X\to“exc˜hange“les›X\with“colleagues“from˜abroad.‘{6P¸èeople“whoŽ¡evš¸èer–U tried“to“do“this“with“MS“Oce“applications“should“appreciate“the“exibilit˜y“:-).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.2) cvn /DEST pdfmark endŸ ’Ä6.2Ž‘¾In teraction–¸with“other“applicationsŽŸÊïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.2.1) cvn /DEST pdfmark endŸƒŒÂ6.2.1Ž‘#!\Using‘ÕpipQÂesŽŸf–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.2.2) cvn /DEST pdfmark endŸç6.2.2Ž‘#!\Using–Õgrace_np“libraryŽŸMª¹The–:–grace_np›:—library“is“a“set˜of“compiled“functions“that˜alloš¸èws“y˜ou“to‘:—launc˜h“and“driv˜e“a‘:—Grace“subproGcessŽ¡from–3y¸èour“C‘"or“F›ÿ*¸ortran“application.‘Z2F˜unctions“are“pro¸èvided“to“start›4the“subproGcess,‘/to“send˜it“commands“orŽ¡data,–U to“stop“it“or“detac¸èh“from“it.Ž Ÿ„Ë þnlÝïcolor push Black ‘“# ÿ*šå‘céïcolor push Blackï color popŽŽ‘ cé ÿD8^‰ff¾ùv¤ “q‘F‘ÿ*¸unctionŽŽŽ’’ ”Argumen¸ètsŽ’{üDescriptionŽŽŽŽŸ‰ff¾ùv¡‘in¸èt‘U GraceOpGen‘ÿ*¸V‘þã AŽŽŽ’’ ”(cš¸èhar–U *Åexe‘ÀO¹,“in˜t“Åbuf_size‘ÀO¹,“...)Ž’{ülaunc¸èh–%a“Grace“executable“Åexe‘åj¹andޤ ®’{üopGen–óha‘óicommš¸èunication“c˜hannel‘óiwithŽ¡’{üit–Dusing“Åbuf_size‘Ø“¹b¸èytes“for“dataŽ¡’{übuering.‘ ýëThe‘ÙCremaining‘ÙDNULL-Ž¡’{üterminated–‹list›‹of“options˜is“com-Ž¡’{ümand–üðline›üïargumen¸èts“passed˜to“theŽ¡’{üGrace‘U proGcessŽŽŽŽŸ_‹‘in¸èt‘U GraceOpGenŽŽŽ’’ ”(in¸èt‘U Åbuf_size‘ÀO¹)Ž’{üequiv‘ÿqÐalen¸èt‘gr’toޤ ®’{üGraceOpGen‘ÿ*¸V‘þã A("xmgrace",Ž¡’{übuf_size,–õ"-nosafe",“"-noask",Ž¡’{üNULL)ŽŽŽŽŸ6¸O‘in¸èt‘U GraceIsOpGenŽŽŽ’’ ”(v¸èoid)Ž’{ütest–Oif›Na“Grace“subproGcess˜is“cur-ŽŸ ®’{üren¸ètly‘U connectedŽŽŽŽ¤\'‘in¸èt‘U GraceCloseŽŽŽ’’ ”(v¸èoid)Ž’{üclose–†±the‘†°commš¸èunication“c˜hannelŽŸ ®’{üand–U exit“the“Grace“subproGcessŽŽŽŽ¡‘in¸èt‘U GraceClosePipGeŽŽŽ’’ ”(v¸èoid)Ž’{üclose–†±the‘†°commš¸èunication“c˜hannelޤ ®’{üand›9Mlea•¸èv“e˜the˜Grace˜subproGcessŽ¡’{üaloneŽŽŽŽŸÝ0‰ff¾ùv© “q‘in¸èt‘U GraceFlushŽŽŽ’’ ”(v¸èoid)Ž’{üush–h all›h the“data“remaining˜in“theŽŸ ®’{übuerŽŽŽŽ¡‘in•¸èt‘U GracePrin“tfŽŽŽ’’ ”(const–U c¸èhar*“Åformat‘òɹ,“...)Ž’{üformat–Ò°a›Ò¯command“and“send˜it“toŽŸ ®’{üthe–U Grace“subproGcessŽŽŽŽ¡‘in¸èt‘U GraceCommandŽŽŽ’’ ”(const–U c¸èhar*“Åcmd‘w¹)Ž’{üsend–E*an›E+already“formated˜commandŽŸ ®’{üto–U the“Grace“subproGcessŽŽŽŽ¤/‰ff¾ùv¦‘GraceErrorF‘ÿ*¸unctionT¸èypGeŽŸ ®‘GraceRegisterErrorF‘ÿ*¸unctionŽŽŽ’’ ”(GraceErrorF‘ÿ*¸unctionT¸èypGe‘U Åf‘r¹)Ž’{üregister–wÞa“user“function“Åf‘–P¹to“displa¸èyŽŸ ®’{ülibrary‘U errorsŽŽŽŽ¡‰ff¾ùvŽŽŽ Ó(’Ž¿Jïcolor push BlackT‘ÿ*¸able›U 31:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.31) cvn /DEST pdfmark endï color pop“grace_np˜library˜C˜functions.“ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹1µOïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.49) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹49Ž’ÕÁGï color popŽŽ £n þ†ô¹ þ÷9£ïcolor push Black Æ] ÿoH‘®Þïcolor push Blackï color popŽŽ‘®ÞŸˆžÁ‰ffÈc‹¤ “q‘F‘ÿ*¸unctionŽŽŽ’ CˆArgumen¸ètsŽ’4 DescriptionŽŽŽŽŸ‰ffÈc‹¡‘in¸èteger‘U GraceOpGenFŽŽŽ’ Cˆ(in¸èteger‘U Åbuf_size‘ÀO¹)Ž’4 launc¸èh–ta‘uGrace“subproGcess“andޤ ®’4 opGen–¬a“commš¸èunication“c˜hannelŽ¡’4 with‘U itŽŽŽŽŸ) ;‘in¸èteger‘U GraceIsOpGenFŽŽŽ’ Cˆ(v¸èoid)Ž’4 test–.Qif“a‘.PGrace“subproGcess“is“cur-ŽŸ ®’4 ren¸ètly‘U connectedŽŽŽŽ¤\'‘in¸èteger‘U GraceCloseFŽŽŽ’ Cˆ(v¸èoid)Ž’4 close–ȵthe“commš¸èunication“c˜hannelŽŸ ®’4 and–U exit“the“Grace“subproGcessŽŽŽŽ¡‘in¸èteger‘U GraceClosePipGeFŽŽŽ’ Cˆ(v¸èoid)Ž’4 close–ȵthe“commš¸èunication“c˜hannelޤ ®’4 and›ªÐlea•¸èv“e‘ªÑthe˜Grace˜subproGcessŽ¡’4 aloneŽŽŽŽŸÝ0‰ffÈc‹© “q‘in¸èteger‘U GraceFlushFŽŽŽ’ Cˆ(v¸èoid)Ž’4 ush–84all“the‘83data“remaining“inŽŸ ®’4 the‘U buerŽŽŽŽ¡‘in¸èteger‘U GraceCommandFŽŽŽ’ Cˆ(c¸èharacter*(*)‘U Åcmd‘w¹)Ž’4 send–¢an“already‘¡formatted“com-ŽŸ ®’4 mand–U to“the“Grace“subproGcessŽŽŽŽ¤/‰ffÈc‹¦‘GraceF–ÿ*¸ortranF“unctionT¸èypGeŽŸ ®‘GraceRegisterErrorF‘ÿ*¸unctionFŽŽŽ’ Cˆ(GraceF–ÿ*¸ortranF“unctionT¸èypGe‘U Åf‘r¹)Ž’4 register–˜¸a“user‘˜¹function“Åf‘·*¹to“dis-ŽŸ ®’4 pla¸èy–U library“errorsŽŽŽŽ¡‰ffÈc‹ŽŽŽ ŽªÅ’Šxïcolor push BlackT‘ÿ*¸able›U 32:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.32) cvn /DEST pdfmark endï color pop“grace_np˜library˜F77˜functions.“ï color popŽŽŽï color popŽŸThere–jëis›jêno“F‘ÿ*¸ortran“equiv‘ÿqÐalen¸èt˜for“the“GracePrin•¸ètf˜function,‘p]y“ou–jëshould“format˜all“the“data˜and“commandsޤ ®y¸èourself–U bGefore“sending“them“with“GraceCommandF.Ž©ؼThe–5ÉGrace“subproGcess“listens“for“the“commands“yš¸èou“send“and‘5Èin˜terprets“them“as“if“they“w˜ere“giv˜en“in“aŽ¡batcš¸èh–â³le.‘K\Y‘ÿ*¸ou‘â²can“send“an˜y“command“y˜ou‘â²lik˜e“(redra˜w,‘ù–autoscale,‘ù•...).‘K\If“y˜ou‘â²w˜an˜t“to“send“data,‘ù•y˜ou“shouldŽ¡include–U them“in“a“command“likš¸èe“"g0.s0“pGoin˜t“3.5,“4.2".ަApart–(”from“the›(•fact“it“monitors“the˜data“senš¸èt“via“an“anon˜ymous‘(•pipšGe,‘]qthe“Grace“subpro˜cess‘(•is“a“normalŽ¡proGcess.‘7AY‘ÿ*¸ou–¦ccan›¦bin¸èteract“with˜it“through˜the“GUI.˜Note“that˜no“error˜can“bGe˜senš¸èt“bac˜k›¦bto“the˜paren¸èt“proGcess.Ž¡If–U y¸èour“application“send“erroneous“commands,“an“error“pšGopup“will“b˜e“displa•¸èy“ed›U b“y˜the˜subproGcess.ަIf–ßyš¸èou“exit‘àthe“subproGcess“while“the“paren˜t›àproGcess“is“still“using“it,‘0Ïthe˜brok¸èen“pipšGe“will“b˜e“detected.‘€¾AnŽ¡error–“ÜcošGde“will“b˜e›“Ýreturned“to“ev¸èery“further“call“to“the˜library“(but“y¸èou“can“still“start“a˜new“proGcess“if“y¸èouŽ¡w•¸èan“t–U to“manage“this“situation).ަHere–U is“an“example“use“of“the“library‘ÿ*¸,“y¸èou“will“nd“this“program“in“the“distribution.ŽŸ ‚¶‰ffÕÁGŸ ¨ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘Ç#include‘¹Nޤ Š=‘#include‘¹NŽ¡‘#include‘¹NŽ¡‘#include‘¹NŽ¡¡‘#ifndef‘¹NEXIT_SUCCESSŽ¡‘#‘ rœdefine–¹NEXIT_SUCCESS“0Ž¡‘#endifŽ¡¡‘#ifndef‘¹NEXIT_FAILUREŽ¡‘#‘ rœdefine–¹NEXIT_FAILURE“-1Ž¡‘#endifŽ¡ŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹2ÇIïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.50) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹50Ž’ÕÁGï color popŽŽ £n ýˆ.\‘Çvoid–¹Nmy_error_function(const“char“*msg)ޤ Š=‘{Ž¡‘+å:fprintf(stderr,–¹N"library“message:“\"%s\"\n",“msg);Ž¡‘}Ž¡¡‘intŽ¡‘main(int–¹Nargc,“char*“argv[])Ž¡‘{Ž¡‘+å:int‘¹Ni;Ž¡¡‘+å:GraceRegisterErrorFunction(my_error_function);Ž¡¡‘+å:/*–¹NStart“Grace“with“a“buffer“size“of“2048“and“open“the“pipe“*/Ž¡‘+å:if–¹N(GraceOpen(2048)“==“-1)“{Ž¡‘>Êrfprintf(stderr,–¹N"Can't“run“Grace.“\n");Ž¡‘>Êrexit(EXIT_FAILURE);Ž¡‘+å:}Ž¡¡‘+å:/*–¹NSend“some“initialization“commands“to“Grace“*/Ž¡‘+å:GracePrintf("world–¹Nxmax“100");Ž¡‘+å:GracePrintf("world–¹Nymax“10000");Ž¡‘+å:GracePrintf("xaxis–¹Ntick“major“20");Ž¡‘+å:GracePrintf("xaxis–¹Ntick“minor“10");Ž¡‘+å:GracePrintf("yaxis–¹Ntick“major“2000");Ž¡‘+å:GracePrintf("yaxis–¹Ntick“minor“1000");Ž¡‘+å:GracePrintf("s0‘¹Non");Ž¡‘+å:GracePrintf("s0–¹Nsymbol“1");Ž¡‘+å:GracePrintf("s0–¹Nsymbol“size“0.3");Ž¡‘+å:GracePrintf("s0–¹Nsymbol“fill“pattern“1");Ž¡‘+å:GracePrintf("s1‘¹Non");Ž¡‘+å:GracePrintf("s1–¹Nsymbol“1");Ž¡‘+å:GracePrintf("s1–¹Nsymbol“size“0.3");Ž¡‘+å:GracePrintf("s1–¹Nsymbol“fill“pattern“1");Ž¡¡‘+å:/*–¹NDisplay“sample“data“*/Ž¡‘+å:for–¹N(i“=“1;“i“<=“100“&&“GraceIsOpen();“i++)“{Ž¡‘>ÊrGracePrintf("g0.s0–¹Npoint“%d,“%d",“i,“i);Ž¡‘>ÊrGracePrintf("g0.s1–¹Npoint“%d,“%d",“i,“i“*“i);Ž¡‘>Êr/*–¹NUpdate“the“Grace“display“after“every“ten“steps“*/Ž¡‘>Êrif–¹N(i“%“10“==“0)“{Ž¡‘Q¯ªGracePrintf("redraw");Ž¡‘Q¯ª/*–¹NWait“a“second,“just“to“simulate“some“time“needed“forŽ¡‘_Û”calculations.–¹NYour“real“application“shouldn't“wait.“*/Ž¡‘Q¯ªsleep(1);Ž¡‘>Êr}Ž¡‘+å:}Ž¡¡‘+å:if–¹N(GraceIsOpen())“{Ž¡‘>Êr/*–¹NTell“Grace“to“save“the“data“*/Ž¡‘>ÊrGracePrintf("saveall‘¹N\"sample.agr\"");Ž¡ŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹3×Dïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.51) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹51Ž’ÕÁGï color popŽŽ £n ýˆ.\‘>ÊrÇ/*–¹NFlush“the“output“buffer“and“close“Grace“*/ޤ Š=‘>ÊrGraceClose();Ž¡¡‘>Êr/*–¹NWe“are“done“*/Ž¡‘>Êrexit(EXIT_SUCCESS);Ž¡‘+å:}–¹Nelse“{Ž¡‘>Êrexit(EXIT_FAILURE);Ž¡‘+å:}Ž¡‘}ŽŸ&Z‰ffÕÁGŸ ȹT‘ÿ*¸o–U compile“this“program,“t¸èypGeŽ© ‚¶‰ffÕÁGŸ ¨ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÇcc–¹Nexample.c“-lgrace_npŽ¡žff‰ffÕÁGŸ ȹIf–¸ËGrace‘¸Êwš¸èasn't“propGerly“installed,‘ѵy˜ou“ma˜y›¸Êneed“to˜instruct“the“compiler˜abGout“include“and˜library“pathsŽŸ ®explicitly‘ÿ*¸,‘U e.g.ަ‰ffÕÁGŸ ?œïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘>ÊrÇcc–¹N-I/usr/local/grace/include“example.c“-L/usr/local/grace/lib“-lgrace_npŽ¡žff‰ffÕÁGŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.3) cvn /DEST pdfmark endŸ r¬Ä6.3Ž‘¾FFTW‘¸tuningŽŸMª¹When›}»the–}¼FFTW‘}°capabilities“are˜compiled˜in,‘‡âGrace“loGoks˜at˜t•¸èw“o‘}¼en“vironmen“t˜v‘ÿqÐariables˜to˜decide‘}¼what˜toޤ ®do–Ò^with›Ò]the“FFTW‘Ò='wisdom'˜capabilities.‘é9First,‘ñ­a˜quic¸èk“summary˜of“what“this˜is.‘é9The˜FFTW‘Ò=pac¸èk‘ÿqÐage“isŽ¡capable–Édof“adaptivš¸èely‘Éedetermining“the“most“ecien˜t“factorization‘Éeof“a“set“to“giv˜e‘Éethe“fastest“computation.Ž¡It–óócan›óòstore“these“factorizations“as˜'wisdom',‘¨so“that˜if“a“transform“of˜a“giv¸èen“size“is˜to“bšGe“rep˜eated,‘§it“isŽ¡došGes–Œfnot“ha•¸èv“e‘Œeto–Œfre-adapt.‘RThe“go˜o˜d›Œenews“is“that“this“seems“to˜wš¸èork“v˜ery“w˜ell.‘QThe“bad“news“is“that,‘š7theŽ¡rst–‚‡time›‚ˆa“transform˜of“a“giv¸èen˜size“is˜computed,‘áif“it˜is“not“a˜sub-m¸èultiple“of˜one“already“knoš¸èwn,‘âit“tak˜esŽ¡a–U LONG“time“(seconds“to“min¸èutes).Ž©ؼThe–rst“en•¸èvironmen“t›v‘ÿqÐariable–is“GRA¸èCE_FFTW_WISDOM_FILE.“If“this˜is“set“to“the“name“of˜a“le“whic¸èhŽ¡can–t®bGe“read“and“written“(e.g.,‘|‘$HOME/.grace_t¸èw_wisdom)“then“Grace“will“automatically“create“this“leŽ¡(if–Ñ´needed)›ѳand“main¸ètain˜it.‘ç;If˜the“le“is˜read-only‘ÿ*¸,‘ðÙit˜will“bGe˜read,‘ðÙbut˜not“upGdated˜with“new˜wisdom.‘ç;IfŽ¡the›@{sym•¸èbGol‘@zGRA“CE_FFTW_WISDOM_FILE‘@ueither˜doGesn't–@zexist,‘Dœor“ev‘ÿqÐaluates˜to“an˜empt¸èy“string,‘DœGraceŽ¡will–bqdrop“the“use“of“wisdom,‘eÆand“will“use“the“tš¸èw“estimator“(FFTW_ESTIMA‘ÿ*¸TE‘bnag“sen˜t“to“the“planner)Ž¡to–U guess“a“go•Go“d–U factorization,“instead“of“adaptiv¸èely“determining“it.ަThe–ñ²second›ñ³v‘ÿqÐariable“is˜GRA¸èCE_FFTW_RAM_WISDOM.“If˜this“v‘ÿqÐariable˜is“dened˜to“bGe˜non-zero,‘×andŽ¡GRA¸èCE_FFTW_WISDOM_FILE‘¾\v‘ÿqÐariable›¾vis–¾wnot“dened“(or“is˜an“empt¸èy“string),‘ØÍGrace˜will“use“wisdomŽ¡in•¸èternally‘ÿ*¸,‘/cbut›%ómain“tain˜no˜pGersisten“t˜cac“he˜of˜it.‘aÇThis˜will˜result˜in˜v“ery˜slo“w˜execution‘%ôtimes˜the˜rst˜timeŽ¡a–EÃtransform›EÂis“executed“after“Grace˜is“started,‘HÖbut˜v¸èery“fast“repGeats.‘laI‘E¿am˜not“sure“whš¸èy“an˜y˜one‘EÂw˜ould“w˜an˜tŽ¡to–U use“wisdom“without“writing“it“to“disk,“but“if“yš¸èou“do,“y˜ou“can“use“this“ag“to“enable“it.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.4) cvn /DEST pdfmark endŸ.ÂÄ6.4Ž‘¾DL‘¸mo_údulesŽŸMª¹Grace–Óëcan“access›Óìexternal“functions“presen¸èt“in˜either“system“or“third-part¸èy“shared˜libraries“or“moGdulesŽ¡spGecially–U compiled“for“use“with“Grace.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹4àtïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.52) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹52Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.4.1) cvn /DEST pdfmark endŸ Â6.4.1Ž‘#!\F‘ÿ ºunction‘Õt®>ypQÂesŽŸMª¹One–U mš¸èust“mak˜e“sure,“ho˜w˜ev˜er,“that“the“external“function“is“of“one“of“suppGorted“b˜y“Grace“t˜ypGes:Ž Ã!d ÿJ}5ïcolor push Black µ‚ËŸ˜Ô7‘>uïcolor push Blackï color popŽŽ‘CuŸ²d‰ffN×>¤ “q‘Grace‘U t¸èypGeŽ‘NCZDescriptionŽŽ©‰ffN×>¡‘f_of_iŽ‘NCZa–U function“of“1“¿int“¹v‘ÿqÐariableŽŽ¤ ®‘f_of_dŽ‘NCZa–U function“of“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_nnŽ‘NCZa–U function“of“2“¿int“¹parametersŽŽ¡‘f_of_ndŽ‘NCZa–U function“of“1“¿int“¹parameter“and“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_ddŽ‘NCZa–U function“of“2“¿double“¹v‘ÿqÐariablesŽŽ¡‘f_of_nndŽ‘NCZa–U function“of“2“¿int“¹parameters“and“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_ppGdŽ‘NCZa–U function“of“2“¿double“¹parameters“and“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_pppGdŽ‘NCZa–U function“of“3“¿double“¹parameters“and“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_ppppGdŽ‘NCZa–U function“of“4“¿double“¹parameters“and“1“¿double“¹v‘ÿqÐariableŽŽ¡‘f_of_pppppGdŽ‘NCZa–U function“of“5“¿double“¹parameters“and“1“¿double“¹v‘ÿqÐariableŽŽ¦‰ffN×>ŽŽŽŸe:!’†cïcolor push BlackT‘ÿ*¸able›U 33:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.33) cvn /DEST pdfmark endï color pop“Grace˜t¸èypGes˜for˜external˜functions˜ï color popŽŽŽï color popŽŸ”The–U return“v‘ÿqÐalues“of“functions“are“assumed“to“bšGe“of“the“¿double“¹t¸èyp˜e.Ž©ؼNote,‘ÿthat–¹Óthere“is›¹Òno“dierence“from˜the“pGoin¸èt˜of“view“of˜function“protot¸èypšGe“b˜et•¸èw“een‘¹Òparameters‘¹Óandޤ ®v‘ÿqÐariables;‘”áthe›Ô÷dierence–Ôöis“in“the“w•¸èa“y˜Grace–Ôötreats“them“-“an˜attempt“to“use“a“v¸èector˜expression“as“aŽ¡parameter–U argumen¸èt“will“result“in“a“parse“error.ަLet–U us“consider“few“examples.ŽŸËAïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.4.2) cvn /DEST pdfmark endŸçÂ6.4.2Ž‘#!\ExamplesŽŸMª¹Caution:‘ðâthe–Ñexamples“proš¸èvided“bGelo˜w‘Ð(paths“and“compiler“ags)“are“v‘ÿqÐalid“for“Lin˜ux/ELF‘Ÿwith“gcc.‘°“OnŽ¡other–U opGerating“systems,“yš¸èou“ma˜y“need“to“refer“to“compiler/link˜er“man˜uals“or“ask“a“guru.ŽŸYpïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.30) cvn /DEST pdfmark endŸXäÂExample‘q1‘ pb¹SuppGose›þI‘þw•¸èan“t–þto˜use˜function“¿pow(x,y)˜¹from˜the“Un*x˜math˜library“(libm).‘T}Of“course,‘y¸èouŽ¡can–Åuse“the›Ä""“opGerator“dened“in“the˜Grace“language,›¤but“here,˜for‘Äthe“sak¸èe“of“example,˜w•¸èe‘Äw“an“t–Åto“accessŽ¡the–U function“directly‘ÿ*¸.ަThe–U command“to“makš¸èe“it“accessible“b˜y“Grace“isŽŸ2žïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"pow"“TYPE“f_of_dd“FROM“"/usr/lib/libm.so"ŽŸ2¹T‘ÿ*¸ry–Mõto“plot“y›Mö=“pGo¸èw(x,2)“and“y“=“x2˜graphs“(using,›Odfor“example,˜"create“new“-µ>‘Mö¹F‘ÿ*¸ormš¸èula"“from“an˜y“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1.2ï color popŸù•¼ïps:SDict begin H.R endŽï{ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (section*.3) cvn H.B /ANN pdfmark endï color popŽ¡(set–U selector))“and“compare.ŽŸYpïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.31) cvn /DEST pdfmark endŸXäÂExample‘‹ 2‘Šj¹Noš¸èw,‘ãlet–óVus“try“to“write‘óWa“function“ourselv˜es.‘L"W‘ÿ*¸e“will“dene“function“¿my_function“¹whic˜hŽ¡simply–U returns“its“(second)“argumenš¸èt“m˜ultiplied“b˜y“in˜teger“parameter“transferred“as“the“rst“argumen˜t.ަIn–U a“text“editor,“tš¸èypGe“in“the“follo˜wing“C“coGde“and“sa˜v˜e“it“as“"m˜y_func.c":ŽŸ >ã‰ffÕÁGŸ ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Çdouble–¹Nmy_function“(int“n,“double“x)ŽŸ Š=‘:${ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹5ðmïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.53) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹53Ž’ÕÁGï color popŽŽ £n ýˆ.\‘Lö\Çdouble‘¹Nretval;ޤ Š=‘Lö\retval–¹N=“(double)“n“*“x;Ž¡‘Lö\return‘¹N(retval);Ž¡‘:$}Ž¡¨ff‰ffÕÁGŸfû¹OK,–U no¸èw“compile“it:ŽŸ ʉffÕÁGŸ Qsïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Ç$gcc–¹N-c“-fPIC“my_func.cŽ¡‘:$$gcc–¹N-shared“my_func.o“-o“/tmp/my_func.soŽ¡¦‰ffÕÁGŸc¹(Y‘ÿ*¸ou–U maš¸èy“strip“it“to“sa˜v˜e“some“disk“space):ŽŸ XB‰ffÕÁGŸ Qrïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Ç$strip‘¹N/tmp/my_func.soŽ¡¦‰ffÕÁGŸfû¹That's–¡©all!‘WReady“to›¡ªmak¸èe“it“visible“to˜Grace“as“"m¸èyf"“-˜w¸èe“are“toGo“lazy˜to“tš¸èypGe“the“v˜ery‘¡ªlong“stringޤ ®"m•¸èy_function"›U man“y˜times.ŽŸ1ïïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"my_function"“TYPE“f_of_nd“FROM“"/tmp/my_func.so"“ALIAS“"myf"ŽŸ01ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.32) cvn /DEST pdfmark endŸØÜÂExample‘#¸3‘ #¹A‘º»more–ºãserious›ºâexample.‘>There“is˜a“spGecial˜third-partš¸èy“library“a˜v‘ÿqÐailable‘ºâon“y˜our‘ºâsystem“whic˜hŽ¡includes–”Ía‘”Îvš¸èery“impGortan˜t‘”Îfor“y˜ou‘”Îy˜et“v˜ery›”Îdicult-to-program“from“the˜scratc¸èh“function˜that“y•¸èou˜w“an“t‘”ÍtoŽ¡use–Ìäwith“Grace.‘ØÌBut,‘êÕthe“function“protot¸èypGe“is›ÌãNOT‘ÌÆone“of˜anš¸èy“predened“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 133ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.33) cvn H.B /ANN pdfmark endï color pop“(t˜ypGes).‘ØÌThe“solution“is“toŽ¡write–U a“simple“function“wrappGer.‘q€Here“is“ho¸èw:ŽŸؼSuppGose,‘átthe›’/name–’0of“the˜library“is“"spGecial_lib"“and˜the“function“y¸èou˜are“in¸èterested“in“is˜called“"spGe-Ž¡cial_func"–râand“according›ráto“the“library“man¸èual,‘ !should“bGe˜accessed“as“¿void–?¬special_func(double“*input,Ž¡double–?¬*output,“int“parameter)¹.‘q€The–U wrappšGer“w¸èould“lo˜ok“lik¸èe“this:ŽŸ *‰ffÕÁGŸ Qsïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Çdouble–¹Nmy_wrapper(int“n,“double“x)ޤ Š=‘:${Ž¡‘Lö\extern–¹Nvoid“special_func(double“*x,“double“*y,“int“n);Ž¡‘Lö\double‘¹Nretval;Ž¡‘Lö\(void)–¹Nspecial_func(&x,“&retval,“n);Ž¡‘Lö\return‘¹N(retval);Ž¡‘:$}Ž¡¦‰ffÕÁGŸfû¹Compile‘U it:ŽŸ ʉffÕÁGŸ Qsïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Ç$gcc–¹N-c“-fPIC“my_wrap.cŽ¡‘:$$gcc–¹N-shared“my_wrap.o“-o“/tmp/my_wrap.so“-lspecial_lib“-lblasŽ¡‘:$$strip‘¹N/tmp/my_wrap.soŽ¡¦‰ffÕÁGŸfû¹Note–ø.that“I‘øadded“¿-lblas“¹assuming“that“the“spGecial_lib“library“uses“some“functions“from“the“BLAS.“Gener-ޤ ®ally‘ÿ*¸,‘[Íy•¸èou›Zwha“v“e‘Zxto˜add˜Åal‘‚Ðl‘bî¹libraries˜whic“h‘Zxy“our˜mo•Gdule˜dep“ends˜on–Zx(and˜all˜libraries˜those“libraries˜rely˜upGonŽ¡etc.),–U as“if“yš¸èou“w˜an˜ted“to“compile“a“plain“executable.ŽŸؼFine,–U makš¸èe“Grace“a˜w˜are“of“the“new“functionŽŸ1îïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"my_wrapper"“TYPE“f_of_nd“FROM“"/tmp/my_wrap.so"“ALIAS“"special_func"ŽŸ1ï¹so–U w¸èe“can“use“it“with“its“original“name.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹6Ðïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.54) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8A®>dv‘ÿ\|anced‘Õtopics’g©•¹54Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.33) cvn /DEST pdfmark endŸ ÂExample‘Õ4‘ Ôx¹An–U example“of“using“F‘ÿ*¸ortran“moGdules.ŽŸؼHere–U wš¸èe“will“try“to“ac˜hiev˜e“the“same“functionalit˜y“as“in“Example“2,“but“with“the“help“of“F77.ŽŸ ؉ffÕÁGŸ öïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$ÇDOUBLE–¹NPRECISION“FUNCTION“MYFUNC“(N,“X)ޤ Š=‘:$IMPLICIT‘¹NNONEŽ¡‘:$INTEGER‘¹NNŽ¡‘:$DOUBLE–¹NPRECISION“XŽ¡‘CŽ¡‘:$MYFUNC–¹N=“N“*“XŽ¡‘CŽ¡‘:$RETURNŽ¡‘:$ENDŽ¡¨ff‰ffÕÁGŸ8ˆ¹As–íúoppGosite“to›íûC,“there“is“no˜w•¸èa“y–íúto“call“suc¸èh“a˜function“from“Grace“directly˜-“the“problem“is˜that“in“F‘ÿ*¸ortranŽŸ ®all–U argumenš¸èts“to“a“function“(or“subroutine)“are“passed“b˜y“reference.‘q€So,“w˜e“need“a“wrappGer:ŽŸ fM‰ffÕÁGŸ õïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Çdouble–¹Nmyfunc_wrapper(int“n,“double“x)Ž¡‘:${Ž¡‘Lö\extern–¹Ndouble“myfunc_(int“*,“double“*);Ž¡‘Lö\double‘¹Nretval;Ž¡‘Lö\retval–¹N=“myfunc_(&n,“&x);Ž¡‘Lö\return‘¹N(retval);Ž¡‘:$}Ž¡¦‰ffÕÁGŸ8ˆ¹Note›}$that–}#most“of˜f77˜compilers“b¸èy˜default“add˜underscore“to˜the“function˜names“and˜con•¸èv“ert–}#all˜names“toޤ ®the›Ü(lo•¸èw“er–Ü'case,‘ýêhence“I‘Ürefer“to˜the˜F‘ÿ*¸ortran“function˜¿MYFUNC–ܹfrom˜m¸èy˜C“wrappGer˜as–Ü'¿myfunc_¹,‘ýêbut“in˜y¸èourŽ¡case–U it“can“bGe“dieren¸èt!ŽŸؼLet–U us“compile“the“whole“stu:ŽŸ ؉ffÕÁGŸ õïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘:$Ç$g77–¹N-c“-fPIC“myfunc.fޤ Š=‘:$$gcc–¹N-c“-fPIC“myfunc_wrap.cŽ¡‘:$$gcc–¹N-shared“myfunc.o“myfunc_wrap.o“-o“/tmp/myfunc.so“-lf2c“-lmŽ¡‘:$$strip‘¹N/tmp/myfunc.soŽ¡¦‰ffÕÁGŸ8ˆ¹And–U nally‘ÿ*¸,“inform“Grace“abGout“this“new“function:ŽŸ|ïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"myfunc_wrapper"“TYPE“f_of_nd“FROM“"/tmp/myfunc.so"“ALIAS“"myfunc"ŽŸØ‚ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.6.4.3) cvn /DEST pdfmark endŸØÜÂ6.4.3Ž‘#!\OpQÂerating–Õsystem“issuesŽŸf–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïIps:SDict begin [/View [/XYZ H.V]/Dest (section*.34) cvn /DEST pdfmark endŸçOS/2‘ @¹In–Ôgeneral›Ôthe“methoGd“outlined“in“the“examples˜abšGo•¸èv“e–Ôcan“b˜e“used“on‘ÔOS/2,‘íåto˜o.‘F~Ho•¸èw“ev“er›Ôy“ou˜ha“v“eޤ ®to–œWcreate›œVa“DLL‘œD(Dynamic“Link˜Library)“whic¸èh˜is“a“bit˜more“tric¸èky˜on“OS/2“than˜on“most˜Un*x“systems.Ž¡Since–ð¦Grace›ð§w¸èas“pGorted˜b¸èy“using˜EMX‘ð~w¸èe˜also“use˜it“to“create˜the“examples;‘>jho•¸èw“ev“er˜other‘ð¦dev“elopmen“tŽ¡en•¸èvironmen“ts–ºshould“wš¸èork‘»as“w˜ell“(ensure“to“use“the‘»_System“calling“con˜v˜en˜tion!).‘NW‘ÿ*¸e‘»refer“to“Example“2Ž¡only‘ÿ*¸.‘XExample–Ñ1“mighš¸èt“demonstrate“that“DLLs“can“ha˜v˜e“their“en˜try“pGoin˜ts“(i.e.‘XexpGorted“functions)“callableŽ¡via›:7ordinals–:8only‘ÿ*¸,‘s}so“y•¸èou˜migh“t˜not‘:8kno“w˜ho“w–:8to˜access“a˜spGecic˜function“without˜some“researc¸èh.‘ ÆFirstŽ¡compile–U the“source“from“Example“2“to“"m¸èy_func.ob‘Ž0j"ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹7Ôïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.55) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹55Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘ï color popŽŽ‘Çgcc–¹N-Zomf“-Zmt“-c“my_func.c“-o“my_func.objŽ©ý¹Then–Ççyš¸èou“need‘Çèto“create“a“link˜er‘Çèdenition“le“"m˜y_func.def"“whic˜h‘Çècon˜tains“some“basic“info‘ÇèabGout“the“DLLŽŸ ®and–U declares“the“expGorted“functions.ŽŸ Û·‰ffÕÁGŸ Uèïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘CƒÀÇLIBRARY–¹Nmy_func“INITINSTANCE“TERMINSTANCEޤ Š=‘CƒÀCODE‘¹NLOADONCALLŽ¡‘CƒÀDATA–¹NLOADONCALL“MULTIPLE“NONSHAREDŽ¡‘CƒÀDESCRIPTION–¹N'This“is“a“test“DLL:“my_func.dll'Ž¡‘CƒÀEXPORTSŽ¡‘CƒÀmy_functionŽ¡žff‰ffÕÁGŸÙq¹(don't–U forget“abGout“the“8“c¸èharacters“limit“on“the“DLL“name!).‘q€Finally“link“the“DLL:ŽŸüïcolor push Black‘ï color popŽŽ‘Çgcc–¹Nmy_func.obj“my_func.def“-o“my_func.dll“-Zdll“-Zno-rte“-Zmt“-Zomfަ¹(c•¸èhec“k–Nïout“the“EMX‘N¯došGcumen¸ètation“ab˜out“the“compiler/link¸èer“ags“used“here!)‘^íT‘ÿ*¸o“use“this“new“libraryޤ ®function–U within“Grace“yš¸èou“ma˜y“either“put“the“DLL“in“the“LIBP–ÿ*¸A“TH–U and“use“the“short“form:ަïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"my_function"“TYPE“f_of_nd“FROM“"my_func"“ALIAS“"myf"ަ¹or–U put“it“in“an“arbitrary“path“whicš¸èh“y˜ou“need“to“spGecify“explicitly“then:ަïcolor push Black‘ï color popŽŽ‘ÇUSE–¹N"my_function"“TYPE“f_of_nd“FROM“"e:/foo/my_func.dll"“ALIAS“"myf"ަ¹(as–U for“most“system-APIs“yš¸èou“ma˜y“use“the“Un*x-lik˜e“forw˜ard“slashs“within“the“path!)ŽŸl½ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.7) cvn /DEST pdfmark endŸ/îÁ7Ž‘ÁReferencesŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.1) cvn /DEST pdfmark endŸ jÄ7.1Ž‘¾T yp_úesettingŽŸMª¹Grace–ÌpšGermits“quite‘Ícomplex“t¸èyp˜esetting“on“a“p˜er“string‘Íbasis.‘‰„Anš¸èy“string“displa˜y˜ed‘Í(titles,–4wlegends,“tic˜kŽ¡marks,...)‘q€ma•¸èy›U con“tain˜spGecial˜con“trol˜coGdes˜to˜displa“y˜subscripts,˜c“hange˜fon“ts˜within˜the˜string˜etc.ޤؼExample:Ž¡F¸n¹sX¸n¹N(¸n¹xe¸n¹f¸fg¹)–U =“sin(¸n¹xe¸n¹f¸fg¹)¸n¹#¸f¹b7¸g¹e¸n¹S-X¸n¹N¸n¹#¸f¹b7¸g¹cos(¸n¹xe¸n¹f¸fg¹)Ž¡prin¸èts‘U roughlyŽŸ åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ’…¦Ç-xޤ Š=‘:$F–¹N(e)“=“sin(e).e‘ rœ.cos(e)Ž¡‘>ÊrxŽ¡Ÿ1½¹using–U string's“initial“fonš¸èt“and“e“prin˜ts“as“epsilon“from“the“Sym˜bGol“fon˜t.ŽŸؼNOTE:–¦rCharacters›¦qfrom“the˜uppGer“half˜of“the“c¸èhar˜table“can˜bGe“en¸ètered˜directly“from˜the“k¸èeybGoard,‘ºÆusingŽŸ ®appropriate–U ¿xmodmap(1)“¹settings,“or“with“the“help“of“the“fonš¸èt“toGol“("Windo˜w/F‘ÿ*¸on˜t“toGol").ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹8 Äïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.56) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹56Ž’ÕÁGï color popŽŽ £n ý~.\ïcolor push Black ®í þæ‘ 9ýïcolor push Blackï color popŽŽ‘%9ý þ´al‰ff‹MM¤ “q‘Con¸ètrol‘U coGdeŽ‘\nDescriptionŽŽ©‰ff‹MM¡‘¸n¹f¸f¹x¸gŽ‘\n¹switcš¸èh–U to“fon˜t“named“"x"ŽŽ¤ ®‘¸n¹f¸f¹n¸gŽ‘\n¹switcš¸èh–U to“fon˜t“n˜um˜bGer“nŽŽ¡‘¸n¹f¸fgŽ‘\n¹return–U to“original“fon¸ètŽŽ¡‘¸n¹R¸f¹x¸gŽ‘\n¹switc¸èh–U to“color“named“"x"ŽŽ¡‘¸n¹R¸f¹n¸gŽ‘\n¹switcš¸èh–U to“color“n˜um˜bGer“nŽŽ¡‘¸n¹R¸fgŽ‘\n¹return–U to“original“colorŽŽ¡‘¸n¹#¸f¹x¸gŽ‘\n¹treat–U "x"“(mš¸èust“bGe“of“ev˜en“length)“as“list“of“hexadecimal“c˜har“coGdesŽŽ¡‘¸n¹t¸f¹xx–U xy“yx“yy¸gŽ‘\n¹apply–U transformation“matrixŽŽ¡‘¸n¹t¸fgŽ‘\n¹reset–U transformation“matrixŽŽ¡‘¸n¹z¸f¹x¸gŽ‘\n¹zoGom–U x“timesŽŽ¡‘¸n¹z¸fgŽ‘\n¹return–U to“original“zoGomŽŽ¡‘¸n¹r¸f¹x¸gŽ‘\n¹rotate–U b¸èy“x“degreesŽŽ¡‘¸n¹l¸f¹x¸gŽ‘\n¹slan•¸èt›U b“y˜factor˜xŽŽ¡‘¸n¹v¸f¹x¸gŽ‘\n¹shift–U vš¸èertically“b˜y“xŽŽ¡‘¸n¹v¸fgŽ‘\n¹return–U to“unshifted“baselineŽŽ¡‘¸n¹V¸f¹x¸gŽ‘\n¹shift–U baseline“b¸èy“xŽŽ¡‘¸n¹V¸fgŽ‘\n¹reset‘U baselineŽŽ¡‘¸n¹h¸f¹x¸gŽ‘\n¹horizonš¸ètal–U shift“b˜y“xŽŽ¡‘¸n¹nŽ‘\nnew‘U lineŽŽ¡‘¸n¹uŽ‘\nbGegin‘U underlineŽŽ¡‘¸n¹UŽ‘\nstop‘U underlineŽŽ¡‘¸n¹oŽ‘\nbGegin‘U o•¸èv“erlineŽŽ¡‘¸n¹OŽ‘\nstop‘U o•¸èv“erlineŽŽ¡‘¸n¹FkŽ‘\nenable‘U k¸èerningŽŽ¡‘¸n¹FKŽ‘\ndisable‘U k¸èerningŽŽ¡‘¸n¹FlŽ‘\nenable‘U ligaturesŽŽ¡‘¸n¹FLŽ‘\ndisable‘U ligaturesŽŽ¡‘¸n¹m¸f¹n¸gŽ‘\n¹mark–U curren¸èt“pGosition“as“nŽŽ¡‘¸n¹M¸f¹n¸gŽ‘\n¹return–U to“sa•¸èv“ed–U pGosition“nŽŽ¡‘¸n¹dlŽ‘\nLtoR–U substring“directionŽŽ¡‘¸n¹drŽ‘\nR¸ètoL–U substring“directionŽŽ¡‘¸n¹dLŽ‘\nLtoR–U text“adv‘ÿqÐancingŽŽ¡‘¸n¹dRŽ‘\nR¸ètoL–U text“adv‘ÿqÐancingŽŽ¦‰ff‹MMŸ “q‘¸n¹xŽ‘\nswitcš¸èh–U to“Sym˜bGol“fon˜t“(same“as“¸n¹f¸f¹Sym˜bGol¸g¹)ŽŽ¡‘¸n¹+Ž‘\nincrease–U size“(same“as“¸n¹z¸f¹1.19¸g“¹;“1.19“=“sqrt(sqrt(2)))ŽŽ¡‘¸n¹-Ž‘\ndecrease–U size“(same“as“¸n¹z¸f¹0.84¸g“¹;“0.84“=“1/sqrt(sqrt(2)))ŽŽ¡‘¸n¹sŽ‘\nbGegin–U subscripting“(same“as“¸n¹v¸f¹-0.4¸gn¹z¸f¹0.71¸g¹)ŽŽ¡‘¸n¹SŽ‘\nb•Gegin›U sup“erscripting˜(same˜as˜¸n¹v¸f¹0.6¸gn¹z¸f¹0.71¸g¹)ŽŽ¡‘¸n¹T¸f¹xx–U xy“yx“yy¸gŽ‘\n¹same–U as“¸n¹t¸fgn¹t¸f¹xx“xy“yx“yy¸gŽŽ¡‘n¹Z¸f¹x¸gŽ‘\n¹absolute–U zoGom“x“times“(same“as“¸n¹z¸fgn¹z¸f¹x¸g¹)ŽŽ¡‘¸n¹qŽ‘\nmak•¸èe›U fon“t˜oblique˜(same˜as˜¸n¹l¸f¹0.25¸g¹)ŽŽ¡‘¸n¹QŽ‘\nundo–U oblique“(same“as“¸n¹l¸f¹-0.25¸g¹)ŽŽ¡‘¸n¹NŽ‘\nreturn–U to“normal“st¸èyle“(same“as“¸n¹v¸fgn¹t¸fg¹)ŽŽ¦‰ff‹MM¤ “q‘¸nnŽ‘\n¹prin¸èt‘U ¸nŽŽ¦‰ff‹MM¡‘n¹nŽ‘\nswitcš¸èh–U to“fon˜t“n˜um˜bGer“n“(0-9)“(deprecated)ŽŽ¤ ®‘¸n¹cŽ‘\nbšGegin–U using“upp˜er“128“c¸èharacters“of“set“(deprecated)ŽŽ¡‘¸n¹CŽ‘\nstop–U using“uppGer“128“c¸èharacters“of“set“(deprecated)ŽŽ¦‰ff‹MMŽŽŽ bè’°§Öïcolor push BlackT‘ÿ*¸able›U 34:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.34) cvn /DEST pdfmark endï color pop“Con¸ètrol˜coGdes.“ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹9-´ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.57) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹57Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.2) cvn /DEST pdfmark endŸ Ä7.2Ž‘¾Device-sp_úecic‘¸limitationsŽŸMª¹Grace–æ|can“output“plots“using‘æ{sevš¸èeral“device“bac˜k˜ends.‘LŸThe“list“of“a˜v‘ÿqÐailable“devices‘æ{can“bGe“seen“(among“otherŽŸ ®stu‘Ç)–U bš¸èy“spGecifying“the“"-v˜ersion"“command“line“switc˜h.ŽŸؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹X11,–U P¸èostScript“and“EPS“are“full-featured“devicesޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Raster–U driv¸èers“(PNM/JPEG/PNG):Ž¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹only–U ev¸èen-ošGdd“ll“rule“is“supp˜ortedŽ©®‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹patterned–U lines“are“not“implemen¸ètedŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹PDF‘U driv¸èer:Ž¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹bitmappGed–U text“strings“are“not“transparen¸ètŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹MIF‘U driv¸èer:Ž¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹some–U of“patterned“lls“not“implemen¸ètedަ‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹bitmappGed–U text“strings“not“implemen¸ètedŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹SV•¸èG‘U driv“er:Ž¡‘ïcolor push Black‘ @\ÂŽ‘ï color popŽŽ‘/¹bitmappGed–U text“strings“not“implemen¸ètedŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.3) cvn /DEST pdfmark endŸ.ÂÄ7.3Ž‘¾Device-sp_úecic‘¸settingsŽŸMª¹Some–  of› Ÿthe“output˜devices“accept˜sev¸èeral“conguration˜options.‘SÿY‘ÿ*¸ou˜can“set˜the“options˜b¸èy“passing˜aޤ ®respGectivš¸èe–ºÔstring“to“the‘ºÕin˜terpreter“using“the“"DEVICE–º­Å"devname"‘—8¹OP“Å"options"‘Üd¹"‘ºÕcommand–ºÔ(see“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 122ï color popŸù•¼ïps:SDict begin H.R endŽïyps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (table.22) cvn H.B /ANN pdfmark endï color pop“(DeviceŽ¡parameters)).‘q€A–U few“options“can“bGe“passed“in“one“command,“separated“b¸èy“commas.Ž úºï ÿÄéïcolor push Black ì; ÿ}x‘D?Sïcolor push Blackï color popŽŽ‘I?SŸ–³>‰ffCB¢¤ “q‘CommandŽ‘`PrDescriptionŽŽ©‰ffCB¢¡‘gra¸èyscaleŽ‘`Prset–U gra¸èyscale“outputŽŽ¤ ®‘colorŽ‘`Prset–U color“outputŽŽ¡‘lev¸èel1Ž‘`Pruse–U only“PS“Lev¸èel“1“subset“of“commandsŽŽ¡‘lev¸èel2Ž‘`Pruse–U also“PS“Lev¸èel“2“commands“if“neededŽŽ¡‘doGcdata:7bitŽ‘`Prthe–U doGcumen¸èt“data“is“7bit“cleanŽŽ¡‘doGcdata:8bitŽ‘`Prthe–U doGcumen¸èt“data“is“8bit“cleanŽŽ¡‘doGcdata:binaryŽ‘`Prthe–U doGcumenš¸èt“data“ma˜y“bGe“binaryŽŽ¡‘xoset:ÅxŽ‘`Pr¹set–U page“oset“in“X“direction“Åx‘‰P¹ppŽŽ¡‘y¸èoset:ÅyŽ‘`Pr¹set–U page“oset“in“Y“direction“Åy‘7޹ppŽŽ¡‘mediafeed:autoŽ‘`Prdefault–U input“tra¸èyŽŽ¡‘mediafeed:matc¸èhŽ‘`Prselect–U input“with“media“matc¸èhing“page“dimensionsŽŽ¡‘mediafeed:man¸èualŽ‘`Prman¸èual–U media“feedŽŽ¡‘h¸èwresolution:onŽ‘`Prset–U hardw¸èare“resolutionŽŽ¡‘h¸èwresolution:oŽ‘`Prdo–U not“set“hardw¸èare“resolutionŽŽ¦‰ffCB¢ŽŽŽ €–G’™å´ïcolor push BlackT‘ÿ*¸able›U 35:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.35) cvn /DEST pdfmark endï color pop“P•¸èostScript˜driv“er˜options˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹:<¹ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.58) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹58Ž’ÕÁGï color popŽŽ £n þbKŸ5ïcolor push BlackŸ~ÊŸ´0]‘_šïcolor push Blackï color popŽŽ‘dšŸÍkЉff *¤ “q‘CommandŽ‘>ý2DescriptionŽŽ©‰ff *¡‘gra¸èyscaleŽ‘>ý2set–U gra¸èyscale“outputŽŽ¤ ®‘colorŽ‘>ý2set–U color“outputŽŽ¡‘lev¸èel1Ž‘>ý2use–U only“PS“Lev¸èel“1“subset“of“commandsŽŽ¡‘lev¸èel2Ž‘>ý2use–U also“PS“Lev¸èel“2“commands“if“neededŽŽ¡‘bbGo•¸èx:tigh“tŽ‘>ý2enable–U "tigh¸èt"“bšGounding“b˜o¸èxŽŽ¡‘bbGo¸èx:pageŽ‘>ý2b•Gounding›U b“o¸èx˜coincides˜with˜page˜dimensionsŽŽ¦‰ff *ŽŽŽŸIÝû’§Œïcolor push BlackT‘ÿ*¸able›U 36:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.36) cvn /DEST pdfmark endï color pop“EPS˜driv¸èer˜options˜ï color popŽŽŽï color popŽ ïMŸŽã”ïcolor push BlackŸqlŸ»f‘fR‡ïcolor push Blackï color popŽŽ‘kR‡ŸÔB”‰ffÿ:¤ “q‘CommandŽ‘`,æDescriptionŽŽ©‰ffÿ:¡‘PDF1.3Ž‘`,æset–U compatibilit¸èy“moGde“to“PDF-1.3ŽŽ¤ ®‘PDF1.4Ž‘`,æset–U compatibilit¸èy“moGde“to“PDF-1.4ŽŽ¡‘compression:v‘ÿqÐalueŽ‘`,æset–U compression“lev¸èel“(0“-“9)ŽŽ¡‘patterns:onŽ‘`,æenable–U use“of“patternsŽŽ¡‘patterns:oŽ‘`,ædisable–U use“of“patternsŽŽ¦‰ffÿ:ŽŽŽŸCò’¦(~ïcolor push BlackT‘ÿ*¸able›U 37:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.37) cvn /DEST pdfmark endï color pop“PDF˜driv¸èer˜options˜ï color popŽŽŽï color popŽ ïLŸŽã”ïcolor push BlackŸqlŸ»f’‡0yïcolor push Blackï color popŽŽ’Œ0yŸÔB”‰ff½`V¤ “q‘CommandŽ‘EgvDescriptionŽŽ©‰ff½`V¡‘format:pbmŽ‘Egvoutput–U in“PBM“formatŽŽ¤ ®‘format:pgmŽ‘Egvoutput–U in“PGM“formatŽŽ¡‘format:ppmŽ‘Egvoutput–U in“PPM“formatŽŽ¡‘ra¸èwbits:onŽ‘Egv"ra¸èwbits"–U (binary)“outputŽŽ¡‘ra¸èwbits:oŽ‘EgvASCIGI‘U outputŽŽ¦‰ff½`VŽŽŽŸCò’¤è’ïcolor push BlackT‘ÿ*¸able›U 38:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.38) cvn /DEST pdfmark endï color pop“PNM˜driv¸èer˜options˜ï color popŽŽŽï color popŽ ÒU¬ ÿJ}5ïcolor push Black µ‚ËŸ˜Ô7‘`]ïcolor push Blackï color popŽŽ‘e]Ÿ²d‰ff ¢Ž¤ “q‘CommandŽ‘_¢DescriptionŽŽ©‰ff ¢Ž¡‘gra¸èyscaleŽ‘_¢set–U gra¸èyscale“outputŽŽ¤ ®‘colorŽ‘_¢set–U color“outputŽŽ¡‘optimize:on/oŽ‘_¢enable/disable‘U optimizationŽŽ¡‘qualit¸èy:v‘ÿqÐalueŽ‘_¢set–U compression“qualit¸èy“(0“-“100)ŽŽ¡‘smoGothing:v‘ÿqÐalueŽ‘_¢set–U smoGothing“(0“-“100)ŽŽ¡‘baseline:on/oŽ‘_¢do/don't–U force“baseline“outputŽŽ¡‘progressiv¸èe:on/oŽ‘_¢do/don't–U output“in“progressiv¸èe“formatŽŽ¡‘dct:ifastŽ‘_¢use–U fast“in¸èteger“DCT“methoGdŽŽ¡‘dct:islo¸èwŽ‘_¢use–U sloš¸èw“in˜teger“DCT“methoGdŽŽ¡‘dct:oatŽ‘_¢use–U oating-pšGoin¸èt“DCT“metho˜dŽŽ¦‰ff ¢ŽŽŽŽŸe:!’£X«ïcolor push BlackT‘ÿ*¸able›U 39:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.39) cvn /DEST pdfmark endï color pop“JPEG˜driv¸èer˜options˜ï color popŽŽŽï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹;M<ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.59) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹59Ž’ÕÁGï color popŽŽ £n ýïJÈŸŽã”ïcolor push BlackŸqlŸ»f‘k;ïcolor push Blackï color popŽŽ‘p;ŸÔB”‰ffõœÒ¤ “q‘CommandŽ‘`,æDescriptionŽŽ©‰ffõœÒ¡‘in¸èterlaced:onŽ‘`,æmak•¸èe›U in“terlaced˜imageŽŽ¤ ®‘in¸èterlaced:oŽ‘`,ædon't–U makš¸èe“in˜terlaced“imageŽŽ¡‘transparen¸èt:onŽ‘`,æproGduce–U transparen¸èt“imageŽŽ¡‘transparen¸èt:oŽ‘`,ædon't–U proGduce“transparen¸èt“imageŽŽ¡‘compression:v‘ÿqÐalueŽ‘`,æset–U compression“lev¸èel“(0“-“9)ŽŽ¦‰ffõœÒŽŽŽŸCò’¥‘kïcolor push BlackT‘ÿ*¸able›U 40:–q€ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïFps:SDict begin [/View [/XYZ H.V]/Dest (table.40) cvn /DEST pdfmark endï color pop“PNG˜driv¸èer˜options˜ï color popŽŽŽï color popŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.4) cvn /DEST pdfmark endŸ Ä7.4Ž‘¾Dates–¸in“GraceŽŸMª¹W‘ÿ*¸e›}use‘|t•¸èw“o˜calendars–|in˜Grace:‘P®the“one˜that“w¸èas˜established˜in“532˜bš¸èy“Den˜ys›}and“lasted˜un¸ètil“1582,‘ and˜theޤ ®one–tthat“wš¸èas‘ucreated“b˜y“Luigi“Lilio“(Aly˜osius›uLilius)“and“Christoph“Klau“(Christophorus˜Cla¸èvius)“for“p•Gop“eŽ¡Gregorius›âMXI•GI“I.–âLBoth˜use“the˜same˜mon¸èths“(they˜w•¸èere˜in“tro•Gduced‘âLunder˜emp“eror–âLAugustus,‘ùDa˜few“y¸èears˜afterŽ¡Julian–½²calendar“inš¸ètro•Gduction,‘××b“oth–½²Julius“and“Augustus“w˜ere“honored“b˜y“a“mon˜th“bGeing“named“after“eac˜hŽ¡one).Ž©ؼThe–t3leap“yš¸èears“oGccurred“regularly“in“Den˜ys's“calendar:‘¯§once“ev˜ery“four“y˜ears,‘»øthere“is“no“y˜ear“0“in“thisŽ¡calendar–r(the“leap“yš¸èear‘r-1“w˜as“just“bGefore“y˜ear“1).‘È6This“calendar“w˜as“not“complian˜t‘rwith“earth“motion“andŽ¡the–U dates“wš¸èere“slo˜wly“shifting“with“regard“to“astronomical“ev˜en˜ts.ަThis–÷vw¸èas›÷ucorrected“in˜1582“bš¸èy“in˜troGducing›÷uGregorian“calendar.‘RGFirst“a˜ten“da¸èys“shift˜wš¸èas“in˜troGduced‘÷uto“resetŽ¡correct– ³dates“(Th•¸èursda“y– ³OctobGer“the“4th“wš¸èas“follo˜w˜ed“b˜y“F‘ÿ*¸rida˜y“OctobGer“the“15th).‘YThe“rules“for“leap“y˜earsŽ¡w•¸èere‘½also›½€c“hanged:‘%¯three˜leap›½y“ears˜are‘½€remo“v“ed˜ev“ery˜four‘½€cen“turies.‘>õThese˜y“ears–½€are˜those˜that“are˜m¸èultipleŽ¡of–dÙ100›dØbut“not“m¸èultiple“of˜400:‘ò1700,–hÇ1800,“and–dÙ1900˜wš¸èere“not“leap“y˜ears,‘hÇbut‘dØ1600“and“2000“w˜ere‘dØ(will“bGe)Ž¡leap‘U y¸èears.ަW‘ÿ*¸e–¼!still›¼"use“Gregorian˜calendar“toGdaš¸èy‘ÿ*¸,‘Ú»but“w˜e‘¼"no˜w“ha˜v˜e‘¼"sev˜eral“time“scales›¼"for“increased˜accuracy‘ÿ*¸.‘>The“In¸èter-Ž¡national–9mA¸ètomic›9nTime“(T‘ÿ*¸AI)‘9fis“a˜linear“scale:‘c¦the˜bGest“scale“to“use˜for“scien¸ètic“reference.‘hEThe“CoGordinatedŽ¡Univ¸èersal–Œ3Time›Œ4(UTC,“often“confused˜with“Green•¸èwic“h–Œ3Mean“Time)˜is“a“legal˜time“that“is˜almost“sync¸èhronizedŽ¡with–¬earth“motion.‘W¯Ho•¸èw“ev“er,‘*since–¬the“earth“is“slighš¸ètly“slo˜wing“do˜wn,‘*leap“seconds“are“in˜troGduced“from“timeŽ¡to–èÍtime›èÌin“UTC‘è±(abGout“one“second˜evš¸èery“18“mon˜ths).‘MdUTC‘è±is“not“a‘èÌcon˜tin˜uous“scale“!‘MdWhen“a“leap‘èÌsecond“isŽ¡in•¸ètroGduced›ãmb“y‘ãnIn“ternational˜Earth–ãnRotation˜Service,‘ú+this˜is“published˜in“adv‘ÿqÐance˜and“the˜legal“time˜sequenceŽ¡is–È as“folloš¸èws:‘W[23:59:59“follo˜w˜ed“one“second“later“b˜y“23:59:60‘Èfollo˜w˜ed“one“second“later“b˜y“00:00:00.‘ÊHA˜t“theŽ¡time–of“this›writing“(1999-01-05)“the“dierence“bGet•¸èw“een˜T‘ÿ*¸AI–çand›UTC“w¸èas˜32˜seconds,‘CÖand‘the˜last˜leapŽ¡second–U wš¸èas“in˜troGduced“in“1998-12-31.ަThese–Täcalendars›Tãallo¸èw“to˜represenš¸èt“an˜y›Tãdate“from“the˜mist“of˜the“past˜to“the“fog˜of“the˜future,‘Tðbut˜they“areŽ¡not›÷/con•¸èv“enien“t˜for˜computation.‘W¬Another˜time˜scale˜is‘÷.pGossible:‘µžcoun“ting˜only˜the˜da“ys‘÷.from˜a˜reference.Ž¡Sucš¸èh–ä#a“time“scale“w˜as“in˜troGduced“b˜y“Joseph-Juste“Scaliger“(Joseph˜us“Justus“Scaliger)“in‘ä"1583.‘K×He“decided“toŽ¡use–sÀ"-4713-01-01T12:00:00"“as›sÁa“reference“date“bGecause“it“w¸èas˜at“the“same“time“a“Mondaš¸èy‘ÿ*¸,‘{irst“of“Jan˜uaryŽ¡of–Pa‘Pleap“yš¸èear,‘Qthere“w˜as‘Pan“exact“n˜um˜bGer›Pof“19˜y¸èears“Meton˜cycle“bGet•¸èw“een–Pthis˜date“and˜y¸èear“1˜(for“EasterŽ¡computation),‘Áíand–¬*it“wš¸èas“at“the“bGeginning“of“a“15“y˜ears“ÅR‘ÿ}/oman‘ãÃindiction‘p¹cycle.‘vžThe“da˜y“n˜um˜bGer“coun˜tedŽ¡from–Æ=this›Æ>reference“is“traditionally˜called“ÅJulian‘¹Preferences)“pGopup“of“the“GUI.‘¹mIf“yš¸èou“often“w˜ork“with“a“spGecic“referenceŽ¡date–My¸èou›Lcan“set“it“for˜ev¸èery“sessions“with˜a“REFERENCE–>Dš¸èA‘ÿ*¸TE“command–Min“y˜our“conguration‘Lle“(seeŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹<\©ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.60) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹60Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.3.3ï color popŸù•¼ïps:SDict begin H.R endŽï„ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.3.3.3) cvn H.B /ANN pdfmark endï color pop–U (Default“template)).ŽŸؼThe–U folloš¸èwing“date“formats“are“suppGorted“(hour,“min˜utes“and“seconds“are“alw˜a˜ys“optional):ŽŸ Xïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.23) cvn /DEST pdfmark end¤²ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘iso8601‘U :‘q€1999-12-31T23:59:59.999ŽŸ×vïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.24) cvn /DEST pdfmark endŸ…Šïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘europGean–U :‘q€31/12/1999“23:59:59.999“or“31/12/99“23:59:59.999Ž©WNïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.25) cvn /DEST pdfmark end¡ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘us–U :‘q€12/31/1999“23:59:59.999“or“12/31/99“23:59:59.999ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.26) cvn /DEST pdfmark end¡ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Julian‘U :‘q€123456.789ŽŸ One–ù—should›ù˜bGe“a•¸èw“are˜that–ù—Grace˜doGes“not˜allo¸èw“to˜put“a˜space“in˜one“data˜column“as˜spaces“are˜used“toޤ ®separate–±«elds.‘‡!Y‘ÿ*¸ou‘±ªshould“alw•¸èa“ys–±«use“another“separator“(:/.-“or“bšGetter“T)‘±“b˜et•¸èw“een‘±ªdate–±«and“time“in“dataŽ¡les.‘ÄaThe–kGUI,›lthe“batc¸èh“language“and“the“command“line“ags“do˜not“ha•¸èv“e–kthis“limitation,‘Lþy¸èou“can“useŽ¡spaces–¯“¹pGopup˜of“the“GUI.“The˜formats“are“triedŽ¡in–the›follo¸èwing“order:‘ü_rst˜the“hin•¸èt˜giv“en›b“y˜the–user,›Kìthen“iso,˜europGean“and›us“(there˜is“no˜am•¸èbiguit“yŽ¡bšGet•¸èw“een–rcalendar“formats“and“n¸èumerical‘rformats“and“therefore“no“order“is“sp˜ecied“for“them).‘%ÔThe“separatorsŽ¡bšGet•¸èw“een– ˜v‘ÿqÐarious“elds“can‘ ™b˜e“anš¸èy“c˜haracters“in“the“set:‘q"“:/.-T"“(one“or“more“spaces‘ ™act“as“one“separator,Ž¡other– ãcš¸èharacters“can“not“b•Ge‘ ârep“eated,‘:Ôthe– ãT‘ ³separator“is“allo˜w˜ed“only“bGet˜w˜een“date“and“time,‘:Ómainly“forŽ¡iso8601),‘ @so–the“string“"1999-12“31:23/59"“is‘allo•¸èw“ed–(but“not“recommended).‘[xThe“'-'“c¸èharacter“is“used“bGothŽ¡as–å,a“separator“(it›å-is“traditionally“used“in“iso8601“format)“and˜as“the“unary“min¸èus“(for“dates“in˜the“far“past“orŽ¡for–õÅn¸èumerical›õÄdates).‘Q·By“default˜y¸èears“are“left˜un•¸ètouc“hed,‘×so–õÅ99˜is“a˜date“far“a•¸èw“a“y˜in–õÅthe˜past.‘Q·This“bGeha¸èviorŽ¡can–€bšGe“c¸èhanged‘with“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.4.11ï color popŸù•¼ïps:SDict begin H.R endŽï…ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsubsection.4.4.11) cvn H.B /ANN pdfmark endï color pop“(Edit-µ>¹preferences)“p˜opup,‘or“with“the‘¿DATE–?¬WRAP“on–€¹and“¿DATE–?¬WRAP“YEARŽ¡year–8¡¹commands.‘hSuppGose“for‘8¢example“that“the“wrap“yš¸èear“is“c˜hosen“as“1950,‘>Tif“the“y˜ear“is“bGet˜w˜een“0“and“99Ž¡and–U is“written“with“t•¸èw“o–U or“less“digits,“it“is“mappGed“to“the“presenš¸èt“era“as“follo˜ws:ަrange–U [00“;“49]“is“mappGed“to“[2000“;“2049]ަrange–U [50“;“99]“is“mappGed“to“[1950“;“1999]ަwith–U a“wrap“yš¸èear“set“to“1970,“the“mapping“w˜ould“ha˜v˜e“bGeen:ަrange–U [00“;“69]“is“mappGed“to“[2000“;“2069]ަrange–U [70“;“99]“is“mappGed“to“[1970“;“1999]ަthis–¨‹is›¨Šreasonably“Y2K‘¨3complian¸èt˜and“is“consisten¸èt˜with“curren¸èt˜use.‘kÀSpGecifying“y¸èear˜1“is˜still“pGossibleŽ¡using–¿y“our˜data˜y“ourself˜(for˜example˜using˜In“ternational‘>A“tomic˜Time).‘iÒBut˜if˜y“ou˜bGother˜with˜that˜y“ouŽ¡probably–U already“kno¸èw“what“to“do.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹=síïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.61) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8References’ƒäC¹61Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.5) cvn /DEST pdfmark endŸ Ä7.5Ž‘¾Xmgr–¸to“Grace“migration“guideŽŸMª¹This–7is“a“vš¸èery“brief“guide“describing“problems“and“w˜ork‘ÿqÐarounds“for“reading“in“pro‘Ž0ject“les“sa˜v˜ed“with“Xmgr.ޤ ®Y‘ÿ*¸ou–U should“read“the“doGcs“or“just“plaš¸èy“with“Grace“to“test“new“features“and“con˜trols.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.27) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Grace–åWm¸èust›åXbGe“explicitly“told˜the“vš¸èersion“n˜um˜bGer‘åXof“the“soft˜w˜are“used›åXto“create“a˜le.‘ "&Y‘ÿ*¸ou“canŽ¡‘manš¸èually–ïput“"@v˜ersion›ï~VERSIONID"“string“at“the˜bGeginning“of“the“le.‘O The˜VERSIONID‘ïeis“built“asŽ¡‘MAJOR_REV*10000–¸º+“MINOR_REV*100“+“P–ÿ*¸A“TCHLEVEL;‘¸¹so–¸º40101“correspGonds“to“xmgr-4.1.1.Ž¡‘Pro‘Ž0jects›Eksa•¸èv“ed˜with–EjXmgr-4.1.2˜do˜NOT‘Egneed˜the“abGo•¸èv“e,‘Hsince˜they˜already˜ha“v“e˜the‘Ejv“ersion˜string˜inŽ¡‘them.‘…If–…wyš¸èou“ha˜v˜e‘…xno“idea“what“v˜ersion“of“Xmgr“y˜our“le“w˜as“created–…xwith,‘‘Œtry“some.‘…In–…wmost“cases,Ž¡‘40102–U wš¸èould“do“the“tric˜k.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.28) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘The›%abGo•¸èv“e˜relates˜to‘&the˜ASCIGI‘òpro–Ž0jects˜only‘ÿ*¸.‘ÀThe˜old˜binary˜pro“jects‘&(sa•¸èv“ed˜with˜xmgr-4.0.*)˜areŽ¡‘not›æautomatically‘æcon•¸èv“erted˜an“ymore.‘$-An˜input˜lter‘æm“ust˜bGe–ædened˜to“mak¸èe˜the“con•¸èv“ersion˜w“orkŽ¡‘on-the-y‘ÿ*¸.‘[vAš¸èdd–the“follo˜wing“line“to‘&/.gracerc“or‘the“system-wide“$GRA˜CE_HOME/gracerc“resourceŽ¡‘le:‘/`DEFINE–оIFIL‘ÿ*¸TER“"grcon•¸èv“ert›Ðß%s–Ðà-"“MA¸èGIC‘о"00000031"˜See“doGcs˜for“more˜info“on˜the“I/O‘оlters.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.29) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘DoGcumenš¸ètation–U on“the“script“language“is“sev˜erely“lac˜king“still.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.30) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Grace–×”is›דWYSIWYG.“Xmgr“w•¸èas˜not.‘øÜMan“y˜c“hanges–×”required“to˜ac•¸èhiev“e–×”the“WYSIWYG'ness˜led“toŽ¡‘the–ìsituation›ì when“graphs˜with“ob‘Ž0jects“carefully˜aligned“under˜Xmgr“ma¸èy“not˜loGok“so˜under“Grace.Ž¡‘Grace–Jbtries“its“bšGest“to“comp˜ensate›Jafor“the“dierences,‘‡³but“sometimes˜yš¸èou“ma˜y“ha˜v˜e“to“adjust“suc˜hŽ¡‘graphs‘U man¸èually‘ÿ*¸.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.31) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘A‘ùOlot–ùzof‘ùysymš¸èbGol“t˜ypGes›ùy(all“except˜*real*“sym¸èbGols)˜are“remo•¸èv“ed.‘^Œ"LoGcation‘ùz*"˜t“yp•Ges‘ùzcan˜b“e‘ùzreplacedŽ¡‘(with›®5m•¸èuc“h‘®6higher˜comfort)˜b“y–®6A(nnotating)v‘ÿqÐalues.‘|¿"Impulse“*",‘Äz"Histogram“*"˜and˜"Stair“steps˜*"Ž¡‘eects–~ªcan“bšGe“ac•¸èhiev“ed–~ªusing“the‘~©connecting“line“parameters“(T¸èyp˜e,‘É Drop‘~©lines).‘î"Dot"“sym¸èb˜ol“isŽ¡‘remo•¸èv“ed–U as“wš¸èell;“use“the“lled“circle“sym˜bGol“of“the“zero“size“with“no“outline“to“get“the“same“eect.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.32) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘Default–øHpage“la•¸èy“out›øHswitc“hed‘øGfrom˜free˜(allo“wing˜to˜resize˜can“v‘ÿqÐas‘øGwith˜mouse)˜to˜xed.‘Z÷F‘ÿ*¸or˜the˜oldŽ¡‘bGeha•¸èvior,‘A7put‘"P›ÿ*¸A“GE‘ÎLA˜YOUT‘ÏFREE"–ÿin›the“Grace“resource˜le“or˜use“the“"-free"˜command“lineŽ¡‘switc¸èh.‘q€ÂThe–Õuse“of“the“"free"“page“la•®>y“out–Õis“in“general“deprecated,“though.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.33) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b¹7.Ž‘ï color popŽŽ‘System–U (shell)“v‘ÿqÐariables“GR_*“renamed“to“GRA¸èCE_*ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.34) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b8.Ž‘ï color popŽŽ‘Smith–U plots“don't“wš¸èork“no˜w.‘q€They'll“bGe“put“bac˜k“soGon.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒø‹µƒ’À;è©K…ÕÁG =óë ecbi1000óqLË ectt0900ó½HЃ ecti1000ó¥!¢N ecbx1200ó]fŒ ecbx1000ó&Lt$ffffecbx1440óqLË ectt1000óø8‹ ecsi1000ó»y&³ ecsx1000óŒ6 ecss1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ùŸûßßßßßßgrace-5.1.23/doc/grconvert.10000644000076500001440000000205606757102720015301 0ustar fnevgenyusers.TH GRCONVERT 1 .LO 1 .SH NAME grconvert .SH DESCRIPTION grconvert converts old binary project files from Xmgr 4.0 to an ASCII format understood by late versions of Xmgr and Grace 5.x .SH SYNOPSIS .B grconvert .RI "<" infile "> <" outfile ">" .SH OPTIONS .TP None. .SH "SEE ALSO" grace(1), gracebat(1), xmgrace(1) .SH HOME PAGE http://plasma-gate.weizmann.ac.il/Grace/ .SH BUGS The best way to submit a bug report is using the "Help/Comments" menu entry of xmgrace (GUI version of Grace). Alternatively, see the home page. .SH AUTHORS .B Grace is derived from .B ACE/gr (a.k.a .B Xmgr ) written by Paul J Turner. From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik. .SH COPYRIGHT Copyright (c) 1991-95 Paul J Turner, Portland, OR .br Copyright (c) 1996-99 Grace Development Team .SH LICENSE The program is distributed under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. grace-5.1.23/doc/10a.dat0000644000076500001440000000652306671062261014264 0ustar fnevgenyusers@type xy -9.42478 -0.011358 -9.23438 -0.0266403 -9.04398 -0.0414277 -8.85358 -0.0551688 -8.66318 -0.0673321 -8.47278 -0.0774251 -8.28238 -0.0850133 -8.09198 -0.0897366 -7.90158 -0.0913249 -7.71118 -0.0896103 -7.52078 -0.0845363 -7.33038 -0.0761636 -7.13998 -0.0646719 -6.94958 -0.0503584 -6.75918 -0.0336307 -6.56878 -0.0149977 -6.37839 0.00494501 -6.18799 0.0255318 -5.99759 0.0460475 -5.80719 0.0657501 -5.61679 0.0838944 -5.42639 0.0997581 -5.23599 0.112666 -5.04559 0.122017 -4.85519 0.127304 -4.66479 0.128139 -4.47439 0.124266 -4.28399 0.115583 -4.09359 0.102144 -3.90319 0.0841697 -3.71279 0.0620476 -3.52239 0.0363259 -3.33199 0.00770493 -3.14159 -0.0229778 -2.95119 -0.0547667 -2.76079 -0.0866121 -2.57039 -0.117397 -2.37999 -0.145968 -2.18959 -0.171166 -1.9992 -0.191861 -1.8088 -0.206987 -1.6184 -0.21557 -1.428 -0.216764 -1.2376 -0.20988 -1.0472 -0.194406 -0.856798 -0.17003 -0.666398 -0.136659 -0.475999 -0.0944213 -0.285599 -0.0436783 -0.0951998 0.0149833 0.0951998 0.080758 0.285599 0.152637 0.475999 0.229427 0.666398 0.309779 0.856798 0.392217 1.0472 0.475173 1.2376 0.557023 1.428 0.636131 1.6184 0.710881 1.8088 0.779728 1.9992 0.841229 2.18959 0.894079 2.37999 0.937152 2.57039 0.969522 2.76079 0.990491 2.95119 0.999603 3.14159 0.996662 3.33199 0.981731 3.52239 0.955134 3.71279 0.917447 3.90319 0.86948 4.09359 0.812262 4.28399 0.747009 4.47439 0.675097 4.66479 0.598025 4.85519 0.517377 5.04559 0.434783 5.23599 0.35188 5.42639 0.270267 5.61679 0.191473 5.80719 0.116917 5.99759 0.047875 6.18799 -0.0145472 6.37839 -0.0694373 6.56878 -0.116095 6.75918 -0.154042 6.94958 -0.183032 7.13998 -0.203044 7.33038 -0.214281 7.52078 -0.217153 7.71118 -0.212261 7.90158 -0.200375 8.09198 -0.182408 8.28238 -0.15938 8.47278 -0.132395 8.66318 -0.1026 8.85358 -0.0711552 9.04398 -0.0392013 9.23438 -0.00782556 9.42478 0.021965 & grace-5.1.23/doc/shiftdata.sh0000755000076500001440000000016506671062261015513 0ustar fnevgenyusers#!/bin/sh mv 10c.dat tuttemp.dat mv 10b.dat 10c.dat mv 10a.dat 10b.dat mv 10.1.dat 10a.dat mv tuttemp.dat 10.1.dat grace-5.1.23/doc/FAQ.html0000644000076500001440000020267112032153131014471 0ustar fnevgenyusers Grace FAQ (for Grace-5.1.23)

Grace FAQ (for Grace-5.1.23)

by the Grace Team

12.06.2010
This document contains Frequently Asked Questions (FAQ) about Grace, a WYSIWYG 2D plotting tool for scientific data. (A German translation of this document, made by Tobias Brinkert, is available here: Grace FAQ.)

1. General Questions

2. Getting Help

3. Providing Help: Finding and Reporting Bugs

4. Installation

5. Runtime Problems

6. Basic Concepts

7. Using Grace

8. Mathematics

9. Command Line Interface

10. Miscellaneous


1. General Questions

1.1 What is Grace?

Grace is a tool to make two-dimensional plots of numerical data. It runs under various (if not all) flavours of UNIX with X11 and M*tif. Its capabilities are roughly similar to GUI-based programs like Sigmaplot or Microcal Origin plus script-based tools like gnuplot or Genplot. Its strength lies in the fact that it combines the convenience of a graphical user interface with the power of a scripting language which enables it to do sophisticated calculations or perform automated tasks.

Grace is derived from Xmgr (a.k.a. ACE/gr), originally written by Paul Turner.

From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik.

When its copyright was changed to GPL, the name was changed to Grace, which stands for ``GRaphing, Advanced Computation and Exploration of data'' or ``Grace Revamps ACE/gr''. The first version of Grace available is named 5.0.0, while the last public version of Xmgr has the version number 4.1.2.

Paul still maintains and develops a non-public version of Xmgr for internal use.

1.2 Where can I get Grace?

You can get the newest information about Grace and download the latest version at the Grace home page.

You can fetch it from a mirror site as well. The list of mirror sites can be found at ftp://plasma-gate.weizmann.ac.il/pub/grace/MIRRORS.

1.3 Where can I get the most recent information about Grace?

Please refer to the official Grace Home Page. There you can also find the latest version of this FAQ, links to the latest release and to mirror sites closer to you.

1.4 What is the difference between Xmgr and Grace?

Apart from the licensing, the main difference is that Grace is WYSIWYG (What You See Is What You Get). This was achieved through a major rewrite of all the mid-level drawing routines and the use of the device-independent Type 1 font rendering library T1lib for typesetting.

For help with changing from Xmgr to Grace see section Xmgr to Grace migration guide in the User's Guide (question User's Guide.

There are currently several features of Xmgr which are not yet implemented in Grace (of course, alongside with a lot of new stuff not found in Xmgr). A full compatibility is desirable except for ``bad'' features of Xmgr.

Among the Xmgr features not (yet) implemented in Grace are:

  • X-Y graph flip
  • Horizontal and vertical lines as symbols
  • Smith plots

1.5 Why did you change the name?

When the licensing was changed to GPL, Paul wanted to keep the name for his non-public version of Xmgr, so we chose a new name.

1.6 Is Grace free?

Yes. Grace is free in terms of the GNU General Public License (GPL) (see the file LICENSE which comes with Grace or the GNU Home Page for details).

1.7 Who wrote Grace?

The sources of Grace still contain a significant amount of code from Xmgr by Paul Turner. For a list of those who contributed to Grace since then, see the file CHANGES in the Grace distribution.

Some integral parts of Grace are borrowed from other packages, namely libraries which are also available as stand-alone distributions. In alphabetical order:

1.8 Is there a Postscript|LaTeX|HTML|SGML version of this document?

Yes. It is written in SGML which means that all the above versions can easily be created using sgml-tools (see their home page). At the Grace home page (see question Home Page), all these versions are available.

2. Getting Help

2.1 Are there any books about Grace?

As of now, Grace is a purely virtual creature living in the net, i.e. there is no printed literature. All relevant docs are currently bundled with Grace. See questions Home Page and User's Guide for details. You can print your own copy of the FAQ, the User's Guide and the Tutorial by converting the DVI files to PostScript output.

2.2 Is there a User's Guide available for Grace?

Yes. It is part of the Grace distribution and usually is located in $GRACE_HOME/doc/. There are several versions: the SGML source and HTML, LaTeX, DVI and PS derived from it. You can read the HTML version from a running Grace session by clicking on "Help/User Guide". You need a web browser to read the HTML version (see also question Environment Variables). You can always download the newest version from the Grace homepage (see question Home Page).

The User's Guide is not quite complete, yet.

2.3 Is there a Tutorial available for Grace?

Yes. There are several tutorials which give detailed step-by-step information how to achieve various tasks. They are also part of the Grace distribution. You can find them in $GRACE_HOME/doc/.

There are tutorials about creating a simple plot, batch plotting, fitting curves, transformations (graphical - simple ones, interpolation, feature extraction, using the command line), using pipes, overlaying graphs, hot links.

2.4 Where do I get support for Grace?

You have the following options:

  • There is a User's Guide (see question User's Guide) which came with Grace on your computer. It is usually located in $GRACE_HOME/doc/ along with other files which may contain useful help for your problem. If you downloaded the sources, there are even more files in the main directory of the source tree.
  • Have a look at the Grace home page (question Home Page).
  • On the Grace forums (see question Forums for details) you can easily get in contact with users and developers of Grace. However be aware that people here are trying to help in their spare time - so you can't always expect quick responses.

2.5 Is there a newsgroup devoted to Grace?

No, there isn't. We feel that a bulletin board (see question Forums) is more appropriate to discuss the topics related to Grace.

2.6 Is there a mailing list for Grace?

There used to be a few, but now they are replaced with bulletin-board-style forums (see question Forums).

The mailing list archives are still available for browsing.

2.7 Is there a forum for Grace?

Yes. Just follow this link: forums. It has its own FAQ.

3. Providing Help: Finding and Reporting Bugs

3.1 I think I found a bug in Grace! How do I report it?

First

Make sure that what you found really is a bug.

Second

Try to make sure that it is a bug in Grace, and that the failure is not caused by another piece of software.

Third

Make sure you are running the latest official release of Grace. The development of Grace is rather fast, so your bug might already be fixed.

Fourth

Try to find out if the bug is already known (see question Known Bugs).

Fifth

OK: You have found a new bug. Use w3todo (question Known Bugs) to report it. Follow the instructions on the page and try to be as precise as possible. It won't be of much help if you write ``The program crashes.'' Try to find a simple reproducible case. Mention the version of Grace and where you got the build and the operating system you use. You should submit the system info as provided by ``uname -a'' (if this utility exists, of course) and the output of ``xmgrace -version''. Often the problem is related to some specific data set. Please try hard on reducing this to the minimum which is sufficient of reproducing the bug. If it's only a few lines of data please submit it together with the other details. Once you submit the bug report, it will be automatically relayed to the mailing list. You will usually be notified when the bug is fixed or if we need more information, so please don't forget to give your correct e-mail address.

3.2 Is there a list of known bugs?

Yes. You can search and browse the database of known bugs in Grace at the bug report facility w3todo or using the "Help/Comments" menu from within Grace. The database also keeps track of the status of the bug (Confirmed, Working on, Testing, Fixed, Closed, etc.). This is also the place to submit bug reports and wishes.

Some bugs and fixes may not appear in w3todo, but are covered on the forums.

3.3 The bug report #xxx is marked as "Fixed" in the w3todo, but I checked the last version of Grace and the bug is still there!

The term "fixed" means the bug is fixed in the current development version, and the next public version will have the fix in it. Reports with fixes incorporated in an existing public version are marked as "Closed".

3.4 The bug report #xxx I reported is marked as "Ignored" in the w3todo and I even got no reply?!

You must have missed something very obvious. Check out how to properly submit a bug report in this document. Most probably your report was incomplete or just redundant to an existing entry. It's worth checking the log file of the bug report (the "View log" button at the bottom of the report viewing page).

3.5 I have got an idea! How do I report a wish?

You can submit wishes and suggestions just the way you would submit bug reports (see question Known Bugs). Suggestions for improvement are generally very welcome. It may be possible, however, that the developers are busy or that your wish is rejected for some good reason, so it may be necessary to persuade (better convince) them to get at it.

3.6 I want to help! How can I contribute to Grace?

Fine! There are always things to do.

If you are a C programmer, you can almost certainly find something useful to do. Just ask on the forums. The same applies if you are a technical writer. The documentation will certainly need to be updated, corrected or completed. Every small contribution is appreciated!

Make Grace known to your friends and colleagues. The more users Grace has, the faster it will be improved.

3.7 How do I submit patches/contributions?

Prepare diffs against the most recent version. Use either unified (-u) or context (-c) diff format. Specify exactly against which version the diff is supposed to work. Finally send them to mailto:fnevgeny at weizmann dot ac dot il

In case you plan to help this way more than once you should join the forums.

3.8 I like Grace! Should I donate anything to its authors?

No need to. But if you feel like making a donation, choose any charity organization you like. You wanted to give them some money, anyway, right? ;-)

4. Installation

4.1 How do I install Grace?

You have the choice: either you compile the sources yourself or you download precompiled binaries (we strongly suggest you take the first route). You can get both from the Grace Home Page. Whether binaries for your platforms are available (see question Binaries) depends on whether one of the developers has access to the respective platform and has had time to do it.

It is always a good idea to read the READMEs that accompany the downloading packages of Grace.

4.2 Can I compile Grace myself?

Yes! Actually, this is the preferred method of installation. After getting the sources (question Installation) and ungzipping and untaring them (use e.g. gzip -dc grace-5.0.4.tar.gz | tar xvf -), proceed according to the relevant section of the User's Guide, which covers the compilation process.

4.3 When I run `configure', it says the XXX package is not found, whereas I am certain it was installed on my system!

There are several possible reasons:

  • You have only the run-time part installed (this especially concerns GNU/Linux users). However, you should have the relevant development package (C header files etc) installed, too. E.g., for the JPEG library to be recognized by `configure', both libjpeg62 and libjpeg62-devel packages must be installed.
  • The library and the header files don't match each other (they are from different versions). This usually happens on large Unix systems with a less than capable sysadmin...
  • Either the library or the header files can't be found by the compiler. Use the --with-extra-ldpath and --with-extra-incpath configure options to provide the extra paths, respectively.

4.4 When I type './configure' I get: ``configure: error M*tif has not been found''

Check whether M*tif (question M*tif) is installed on your system. If it is, look at the file config.log: there is a line like this:

configure:8900: checking for a Motif >= 1002 compatible API

What comes directly after it? Could be a hint. Also, see the previous question.

4.5 What is Motif (LessTif)?

Throughout the Grace docs, saying "M*tif" we actually refer to the Motif API, defining a set of functions for building graphical user interfaces (GUI) via numerous widgets (buttons, labels, etc). Grace makes a heavy use of the M*tif API.

There are several implementations of the interface. The original OSF Motif (see http://www.opengroup.org) recently changed its license: on open-source platforms you may have a chance to use it for free, although it's not in general qualified as either a FreeSource or OpenSource product.

There is, however, a free replacement for Motif called LessTif (see http://www.lesstif.org). LessTif is intended to be a 100% source compatible replacement for Motif, but is still under development. For the purposes of Grace, try using the latest version of LessTif (at least 0.92.6 and above). The LessTif people usually receive many bug reports from the Grace developers, so you might hope that a few remaining bugs in LessTif will be fixed rather quickly.

4.6 `configure' stops telling it can't find "ar".

"ar" is the library archiver (the program used to create static libraries like libFoo.a). You should have it in your path. Under Solaris, for example, this can be found in /usr/ccs/bin.

4.7 Are there Grace binaries available? For which platforms?

We do not officially support binary packages. When contributed by volunteers they're put in under the contrib area. Again, these are NOT supported (bug reports like "I can't install that RPM" will be silently ignored), but feel free using the Grace forums for relevant discussions.

4.8 Is there a Windows|OS/2|VMS port of Grace?

Yes, Grace runs on VMS. Just compile it there.

As for Win32 (Windows 95/98/NT/2000/XP) and OS/2, there are ports for these platforms, though they are not "native", i.e. in order to run them, one needs an X server for the respective platform.

Both OS/2 and Win32 ports may lack some of the functionality (notably, support for "direct"/native printing; probably you will have to use the Postscript output for printing).

A port to OS/2 made by Alexander Mai can be found at http://www.tu-darmstadt.de/~st002279/os2/. It requires the XFree86 libraries and an X Server (e.g. XFree86, Hob X11, Exceed, etc.).

4.9 Compilation with gcc fails on Solaris complaining about unresolved symbols.

If you get such a message at the linkage stage, telling about .LL794 (or similar) unresolved symbols, try compiling with native cc compiler instead (./configure --with-cc=cc).

5. Runtime Problems

5.1 When I start Grace I get the message ``Can't find library libXXX.so'' or similar.

For certain tasks, Grace needs external libraries which are neither provided by Grace nor the operating system. You will need to install these libraries yourself. This applies to M*tif, PDF (see question Output Devices) and probably other libraries. If the message is exactly Can't find library libXm.so (usually this happens on GNU/Linux systems ...) then you don't have M*tif (the Xm libraries) installed (see question M*tif), or the linker doesn't know where it is. In the first case, try downloading LessTif. In the second case, you have to tell your linker where it is (may be a platform-specific task). On GNU/Linux look at the file /etc/ld.so.conf. It contains pathnames of the directories where dynamic libraries are stored. Add (as root) your directory to this file and run ldconfig -v. Now the libraries should be in the list. If you're not root you may try to adjust the environment variable LD_LIBRARY_PATH to include the required pathname.

For some versions of Motif, the ``soname'' (which identifies the version of the library and is stored somewhere in the library) on your computer doesn't match the soname of the library on the computer where your copy of Grace was compiled on. Then you should use a (semi)statically linked version or compile Grace on your computer.

5.2 I get errors like "X Error of failed request: BadValue (integer parameter out of range for operation)"

This means that Grace made an incorrect access to an X library. This is most probably not Grace's fault. Probably a not-yet-correctly-implemented LessTif function (see question M*tif) caused this behaviour. If you use LessTif, try to get the latest version (see question M*tif). If this error persists, report it as a bug (question Bug Reports).

5.3 Grace crashes with "Oops Got SIGSEV" (on GNU/Linux)

Detect whether you are using a version linked against LessTif. "xmgrace -version" and "ldd xmgrace" are useful commands for this purpose.

If you are using LessTif, read the according FAQ M*tif else report it as a bug ( Bug Reports).

5.4 I run Grace and get the following error messages: "Warning: translation table syntax error: Unknown keysym name: osfPageLeft Warning: ... found while parsing '<Key>osfPageLeft:SWLeftPage()'"

Get the XKeySymDB file from the X11R6 distribution. Put it somewhere where you can access it and set the XKEYSYMDB environment variable to "/place/where/you/put/XKeysymDB". See question Environment Variables on how to set environment variables.

5.5 I run Grace on a Solaris 2.5.1 box, and when I try to open a file, I can't read the names of the files (files section of the dialog) because Grace writes ALL the path of each file in the list and there is no horizontal scroll.

This is a known bug of Motif implementation on Solaris 2.5.1 (both Sparc and Intel hardware). Ask your vendor for a patch.

5.6 Grace can not find font database and initialize the T1 library

You have probably tried to run Grace without installing it, just after compilation. You got the following message :

scanFontDBase(): Font Database File not found
T1_InitLib(): Fatal error scanning Font Database File
--> Broken or incomplete installation - read the FAQ!

Grace uses either the GRACE_HOME environment variable or a compiled in default path to find the font database. If the variable is not set and you have not installed the database with make install it cannot find it. If you want to test Grace before installing it, you should set the environment variable to the distribution directory (the one where the file configure lies), this is what the dotest script does when you run make check. The easiest thing to do however is to install everything with make install. See question Environment Variables on how to set environment variables.

If you get this message after installing a prebuilt package, then you have either forgotten to download the platform-independent part of the installation (named like grace-x.y.zz.common.tar.gz) or not set the GRACE_HOME environment variable, see a few lines above.

5.7 Pressing Ctrl and clicking with the left mouse button on the canvas or dialog panels make Grace crash.

This is a known bug in Motif-2.1. Most vendors have fixed it in their ports and/or have a patch ready, but not all, a notable exception being Motif libraries shipped by Red Hat for GNU/Linux for Intel hardware (versions 6.*). Grace has a workaround for this bug. In order to enable it, add the following lines to the X resources:


XMgrace*XmDrawingArea.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmRowColumn.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmForm.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmFrame.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmScrolledWindow.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmFileSelectionBox.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmScale.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmCommand.translations: #override\n\
        Ctrl <Btn1Down>: do_nothing()
XMgrace*XmMessageBox.translations: #override\n\
      Ctrl <Btn1Down>: do_nothing()
        

5.8 The size of the canvas is huge.

It should be exactly the size of the hardcopy (A4/US letter). If not, check your X server settings (run `xdpyinfo' and watch the "dimensions:" line; check the numbers with a ruler).

5.9 Extended ASCII characters do not appear and/or appear as incorrect control characters in text input fields.

Are you using OpenMotif 2.2 (see Help/About)? It's known to behave wrongly with several locale settings. Try setting the shell variable LANG to a safe value, e.g. "C". The bug is known and fixed ( bug #1257). Nag your vendor to apply the patch.

5.10 File selection dialogs are unusable.

It happens with OpenMotif 2.2 and some locale settings. See the previous entry for a remedy.

5.11 All of the text in the menus and dialog boxes are represented as squares.

This happens when a Unicode font is picked by the X/Motif and, for a reason, is treated as a wchar one (so you see one "square" glyph for every two chars). Try different font settings; for starters, run


    xmgrace -xrm "XMgrace*fontList:fixed"
        

5.12 On Fedora Core 4, all set selectors collapse into a single of even a zero-height line after a few operations.

FC4 uses a BETA version of OpenMotif 2.3 (see Help/About). The bug is known and fixed ( bug #1331). Ask Fedora folks to apply the patch.

6. Basic Concepts

6.1 What is a project?

A project is a file which contains all information necessary to restore a plot created by Grace.

6.2 What is a parameter file?

A parameter file contains informations about settings. Every batch command of Grace is a valid line in a parameter file. A parameter file is essentially a project file without sets in a slightly different format (i.e. without leading @s).

6.3 Which data formats does Grace recognize?

You can read in several kinds of files where data is arranged in columns separated by spaces or tabs. Lines beginning with "#" are ignored.

6.4 What is block data?

The option Read Block Data can be used to read in files where the values are organized in columns. You can interactively select the type of set to be created and which columns should be used. Refer to the User's Guide (question User's Guide) for details.

6.5 What is the NXY data type?

Strictly speaking, it's not a data format. Rather, you may want to use the relevant command line switch to read in a block data file and automatically assign the data columns to sets of the XY type so that the first column of the block data is used as X for all the sets and the rest of the data columns are assigned to Y's. Refer to the User's Guide (question User's Guide) for details.

6.6 What is the Julian Date?

The Julian Date, not to be confused with the Julian calendar, is a format to represent the time in a single number. Julian Date 0 is a day way in the past, namely the 1st January 4713 before Christ (don't ask me why). The following days are numbered sequentially, each day starting at noon. This numbering scheme is in wide use, especially in astronomy, and is used for the internal representation of dates in Grace. Some further explanations are given on this page.

The convcal utility in $GRACE_HOME/auxiliary/ can be used for about any to Julian date convertion.

7. Using Grace

7.1 How do I start Grace?

There are three ways to invoke Grace. The full-featured GUI-based version is called xmgrace. A batch-printing version is called gracebat (see question Gracebat). A command-line interface mode is called grace.

All three of them are usually located in $GRACE_HOME/bin/.

7.2 Where is gracebat? How does batch printing work?

gracebat is simply a copy of Grace named gracebat or a symbolic link from gracebat to Grace. In the case of the symbolic link:

ln -s xmgrace gracebat

done wherever the Grace binary is located will do the trick (rehash or logout and login to make sure that gracebat shows up in your path). Executing gracebat with no command line parameters or data files will produce a hardcopy on the default printer.

7.3 How can I customize the default appearance of Grace?

There are several ways: the init files, X Resources, and environment (shell) variables. Please refer to the User's Guide (question User Guide) for details.

7.4 Which environment variables does Grace use?

There are few, the most important being GRACE_HOME. It specifies the directory where the Grace files (fonts, docs, libs, ...) are stored. Default is /usr/local/grace.

You can set environment variables using (e.g.):

export GRACE_HOME="/usr/local/grace"

in bash and sh or

setenv GRACE_HOME "/usr/local/grace"

in tcsh and csh.

Please refer to the User's Guide (question User Guide) for description of all relevant variables.

7.5 What command line options does Grace recognize?

Quite a few. You can display them with xmgrace -help.

Or check for the man page xmgrace(1). However it may not always be up-to-date.

7.6 Can one change the colour selecton for the menu, locator, tool, and status bars, and all the popup menus?

As with any X application, use the "-bg <colorname> -fg <another_colorname>" command line flags. Or, define the relevant X resources:

XMgrace*foreground: ...
XMgrace*background: ...

7.7 What different kinds of sets can Grace plot?

The standard set is the regular (x,y) set, but there are others including error bars or descriptive strings. See the User's Guide (question User's Guide) for details.

7.8 I'd like to plot data against an axis on the right (top) and another data set in a different scale against an axis on the left (bottom)

Use two overlaying graphs, one with a scale on the left(bottom), the other one on the right (top). Thus you can achieve the desired effect, but you'll need to pay close attention to which graph is the 'current' graph. This is also how to display a second scale on the top (right) side of the graph.

7.9 How do I do polar plots?

The support for polar plots is currently being implemented, so you can expect polar plots to work soon. The polar coordinates can be selected from the "Plot/Graph Appearance" menu. Please refer to the User's Guide (question User Guide) for details.

7.10 Can I use different fonts, symbols, font size, or sub/superscripts in Grace?

Yes, Grace has all these features. Wherever you can type a text in Grace, e.g. Axis labels, graph title, text from Plot->Drawing objects, etc., you can use all those features within the same text. Please refer to the User Guide (question User's Guide) for details.

7.11 How do I produce special characters (Umlauts) with Grace?

If you asked this question, then you are probably familiar with the issue of keymap modifying in X. Once you configured the key mapping (with the use of xmodmap), you can enter the extended characters from the keyboard in any text input field. If, in addition, the appropriate for your language font encoding is anything but ISO Latin1 (used in most Western Europe countries), you'll have to tell Grace so. See the next question.

7.12 Can I use my own fonts and/or encodings?

Yes. Starting with version 5.0.1, you can use your own fonts, in addition to the standard 14 fonts which include Times-Roman, Helvetica, Courier, Symbols and Zapf Dingbats and come with Grace, and as a replacement for the default fonts (for the purporse of localization). As well, an alternative encoding scheme can be specified.

Please refer to the User's Guide (question User's Guide) for details.

7.13 At which precision is numerical data saved? How can I set the precision?

By default, numbers are saved with eight valid digits. To set your own precision, use the command

DEFAULT SFORMAT formatstring

in an init resource file (see question Customization) with formatstring being in the printf(3) format.

As well, you can set the precision on a per-project basis. When you save a project for the first time (or use "File/Save as"), there is a relevant "Data format" field in the popup you are presented with.

7.14 When I save a project and then re-open it, the Julian date values appear to be rounded to the nearest half day.

For time plots, the default precision may be insufficient. See the previous question on how to alter it.

7.15 How do I read in project files created by Xmgr?

From Xmgr-4.1.2 on, each project file starts with a string giving the version number by which is was saved. These files should cause no problems. You can modify older files by inserting a version line at the beginning. For example, @VERSION 40102 stands for version 4.1.2. If you have no idea what version of Xmgr your file was created with, try some. In most cases, 40102 would do the trick. Also, make sure to read the "Xmgr to Grace migration" section of the User's Guide (question User's Guide).

7.16 I can't open anymore project files saved with an old version of Xmgr.

In Xmgr-4.1.0, support for the binary file format (the former default one) was dropped. You must use the grconvert utility supplied with the Grace distribution in order to convert the files. This can easily be achieved defining an input filter like in the gracerc sample file which comes with Grace.

7.17 When I load a project saved with an earlier version of Xmgr (<4.0), symbols of all (some) sets are drawn in black.

Make sure you added a valid @VERSION versionid line to the beginning of the file.

7.18 How do I save disk space? Can I use compressed project files?

Yes. You can use your favorite compression program (e.g. `gzip') as input or output filter so that files on disk are automagically (de)compressed. Just add the lines

DEFINE IFILTER "gzip -dc %s" PATTERN "*.gz"

and

DEFINE OFILTER "gzip - > %s" PATTERN "*.gz"

into your personal grace init file. Then, everytime you specify a file name that ends with .gz, gzip is used as input and output filters. You can use this mechanism to do other things, e.g. reading and storing files into a database.

7.19 Can I import bitmap graphics into Grace?

Well, not yet. The import of images will be implemented in a future release.

7.20 Can I export Grace graphs to GIF|TIFF| PostScript|PDF etc?

PostScript (for printing), EPS (encapsulated PostScript; for the inclusion of graphics into e.g. LaTeX documents), PNM (PBM/PGM/PPM), MIF (for inclusion in FrameMaker) and SVG (Scalable Vector Graphics) are implemented by default.

Additionally, if some extra libraries are installed, listed in the User's Guide (question User's Guide), the JPEG, PNG, and PDF backends will be built as well.

You can get various other formats using netpbm and pstoedit.

Bitmaps: Using the PNM device + the netpbm utils (available at e.g. ftp://ftp.x.org/contrib/utilities/ one can get TIFF, GIF, G3, BMP, PCX,... (conversion can be done on the fly with appropriate filter definitions).

Notice that the direct support of the GIF format is impossible due to the copyright policy of Unisys - it's not a technical problem. In fact it was supported in earlier versions but to avoid any legal problems this feature has been removed.

One can use pstoedit to convert PS to a lot of other vector formats: MIF, CGM, xfig's, tgif's, Windoze and OS/2 metafiles,... even Java applets!

7.21 Where have all the region operations gone to?

Region operations have no meaning by themselves. Regions are restriction conditions applied to data set(s) which a transformation is performed on. For example, to kill data points in a region, use "Evaluate expression", select same source and dest set(s), leave the "formula" field empty, select your region in the "Restriction" menu, check "Negated".

7.22 How can I input data in date/time formats?

You can use several date/time formats in input data files. Make sure, however, that the time fields don't contain space separators inside, e.g. 1999-12-31-23:59:59.5

Also, you can use an external program to convert the data into the Julian Date format, like the one (convcal) that is supplied with Grace.

7.23 How do I set the background color of a plot, outside of the graph frame?

This can be done using the "Plot/Plot appearance" popup.

This changes the background of the entire canvas, not only the background of graphs.

7.24 How do I use more than 16 colors for objects/lines in Grace?

You may edit your Default.agr file in $GRACE_HOME/templates. Just add lines similar to

 @map color 2 to (255, 0, 0), "red" 
defining a RGB value and an according name for that color triplet. Please notice that altering colors 0 (white) and 1 (black) is strongly discouraged.

7.25 How can I use pipes with Grace?

A named pipe is a pseudo file to which one application writes data which another one reads from it.

Applications like measurement programs can write data to a pipe and make it thus available to Grace which reads from the pipe. So Grace can serve as data displayer for otherwise non-graphical programs.

Refer to the User's Guide (question User's Guide) or the tutorials (question Tutorials) for further information.

One example for using pipes is included in the `make tests' slide show.

7.26 Is it possible to make Grace starting with a completely empty canvas, until the commands are loaded and executed?

Start Grace with -pexec "G0 OFF" or load a parameter file with the above command.

7.27 When I include an EPS file generated by Grace into my (La)TeX document, the graphic hides some of the surrounding text.

LaTeX does not do hard clipping of EPS files unless instructed to do so. Use \includegraphics*{filename} and NOT \includegraphics{filename} (package graphics) or \includegraphics[clip]{filename} (package graphicx). If using the epsf package, remember to include the \epsfclipon flag (but note that the epsf package is obsolet and buggy and not maintained by the LaTeX team and in general should not be used).

The erasing comes about because Grace fills the background with the page size and not the bbox size. The background filling can be disabled from the "Plot/Plot appearance" popup.

7.28 Printing to my old PostScript printer produces an error.

By default, the PS driver uses Level 2 features, while your printer may not be PostScript Level 2 compliant. You can force the use of PS Level 1 only features in the PostScript device setup, though output may be not exactly as expected (there will be no pattern fills, for example).

7.29 How do I make a Grace image fit on a given paper size?

Select the correct paper size in the Device setup popup.

You can also try the command psresize from the psutils package in order to resize a Postscript file generated by Grace.

7.30 My decimal tick labels are systematically of the form e.g. 0,5 instead of 0.5 (i.e. I get a comma instead of a dot).

You're using a localized version of OS. You have either LANG or LC_NUMERIC shell variables set, so Grace uses the locale setting to produce numeric labels. Set at least LC_NUMERIC to C or POSIX to disable this behaviour. Notice that there is nothing specific to Grace about locale. Either you want the localization or not. Setting by default LANG to anything but C/POSIX assumes you do.

7.31 Is it possible to use the dB (decibel) axis scale?

In "Plot/Axis props", enable logarithmic axis scaling, then go to the "Tick labels" tab of this dialog, find the "Axis transform" input field in the "Extra" frame, and enter there "10*log10(10*$t)" (w/o quotes, of course).

7.32 In "Data set properties", I don't see a possibility to view the more essential part of the mantissa; it's swallowed in the black triangle.

If you find some columns are too narrow to show all significant digits, you can drag the vertical rules using Shift+Button 2.

7.33 When making use of -param via the command line to set the parameters, the world scaling is not correctly set (it just auto-scales).

The -param flag and its argument should be placed on the command line after the data filenames. Alternatively, disable the autoscale with -autoscale none - but before your data is read in.

7.34 I am unable to find "Load & Evaluate" which I used quite a lot with Xmgr.

Use "Create new->By formula" from any set selector popup menu.

7.35 How can I specify a template other than the default one on the command line? In the scripts?

Template is just an empty (in the sense that there are no data sets) but otherwise a valid project file. So just put your favorite template's filename as the first argument on the command line. If your script creates several plots, use 'new from "filename"' to initialize a new project from the non-default template.

7.36 How can I save my 'preferences' options?

A part of them are saved with the project; most of the rest are available via command-line options and/or X resources. A more homogeneous approach will be implemented in a future version.

7.37 In an XY-plot with a huge number of points some regions become straight lines instead of the original curve. When I zoom in to the area the data becomes correctly drawn.

Enlarge "Max drawing path length" in Edit/Preferences. Also, consider whether you really need that huge number of points drawn connected by line?

8. Mathematics

8.1 What algorithm is used for non-linear curve fitting?

It is the Levenberg-Marquardt algorithm, based on LMDIF from MINPACK, with some modifications.

9. Command Line Interface

9.1 Which non-interactive batch commands does Grace know?

Lots. Almost every mouseclick in the GUI has an equivalent in the batch language. See the User's Guide (question User's Guide) for details.

9.2 How can I do feature extraction non-interactively?

Currently not at all. This will be implemented in a later release.

9.3 How can I use non-linear fits in the batch mode?

Example - make a batch file with the following commands:

          fit formula "y = a0 + a1 * sin (a2 + x * pi / 180)"
          fit with 3 parameters
          fit prec 0.05
          a0 = 1
          a0 constraints on
          a0min = 0
          a0max = 2
          a1 = 1
          a1 constraints off
          a2 = 1
          a2 constraints off
          nonlfit (s0, 100)
        

This assumes that your original curve is in set s0 and that you want to make 100 iterations.

nonlfit() doesn't produce any plots by itself. It only fits. I.e., at this point, you can use the fitted values A0, A1, A2...:

Plot a set, e.g.:

          s3 on
          s3 length s0.length
          s3.x = s0.x
          s3.y = a0 + a1 * sin (a2 + x * pi / 180)
        

Use for another fit as the initial values, or just ECHO them (to stdout) with ECHO A0.

9.4 Is it possible to call the command "POINT expr, expr" with more than two values, as needed, for example, for points in XYDYDY sets?

No, but you can do something like this (given the set type was properly defined):

          S0 POINT expr, expr
          S0.Y1[S0.LENGTH - 1] = expr
          S0.Y2[S0.LENGTH - 1] = expr
          ...
        

10. Miscellaneous

10.1 Does Grace have an UNDO function?

Not yet. Although it would be nice to have such a function, it is quite hard to implement. We can only ask you to be careful with certain actions and remember to save often and early (TM).

10.2 Can Grace plot 3D graphs?

No. Not yet, I should say. Be patient. It may take quite a while to implement it, though.

10.3 Which features are planned for the future?

Among the many features planned to be introduced in the future are enhancing the spreadsheet-like frontend for dataset operations, contour plots, many-level undo/redo, image import and manipulations, a library for 2-way communication, ... Then 3D plots would come :-)

10.4 Are there things that Grace can't do?

Probably. If you have an idea for improvement, post it as a wish to the w3todo web page (see question Known Bugs).

10.5 How should Grace be acknowledged when it is used to prepare a publication?

You are not required to, but you if wish, refer to the home page link (see Grace home page).

grace-5.1.23/doc/FAQ.dvi0000644000076500001440000055145412032153134014320 0ustar fnevgenyusers÷ƒ’À;è TeX output 2012.10.01:0131‹ÿÿÿÿï¬! systemdict /pdfmark known{userdict /?pdfmark systemdict /exec get put}{userdict /?pdfmark systemdict /pop get put userdict /pdfmark systemdict /cleartomark get put}ifelseï’ps:SDict begin [/Producer (dvips + Distiller)/Title ()/Subject ()/Creator (LaTeX with hyperref package)/Author ()/Keywords () /DOCINFO pdfmark endòo! /DvipsToPDF{72.27 mul Resolution div} def/PDFToDvips{72.27 div Resolution mul} def/BPToDvips{72 div Resolution mul}def/BorderArrayPatch{[exch{dup dup type/integertype eq exch type/realtype eq or{BPToDvips}if}forall]}def/HyperBorder {1 PDFToDvips} def/H.V {pdf@hoff pdf@voff null} def/H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def/H.S {currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF 72 add /pdf@hoff exch def HyperBorder sub /pdf@llx exch def} def/H.L {2 sub dup/HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint HyperBaseDvips sub /pdf@ury exch def/pdf@urx exch def} def/H.A {H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt sub sub /pdf@voff exch def} def/H.R {currentpoint HyperBorder sub /pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def} defŽ¥©K… ýV´{ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.1) cvn /DEST pdfmark endï color popŽŽ¡ ý>‘ìïcolor push Black’ÕÁGï color popŽŽ £n ý~.\ïZps:SDict begin [/Count -8/Dest (section.1) cvn/Title (General Questions ) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsection.1.1) cvn/Title (What is Grace? ) /OUT pdfmark endïdps:SDict begin [/Count -0/Dest (subsection.1.2) cvn/Title (Where can I get Grace? ) /OUT pdfmark endïŠps:SDict begin [/Count -0/Dest (subsection.1.3) cvn/Title (Where can I get the most recent information about Grace? \040) /OUT pdfmark endï|ps:SDict begin [/Count -0/Dest (subsection.1.4) cvn/Title (What is the difference between Xmgr and Grace? ) /OUT pdfmark endïjps:SDict begin [/Count -0/Dest (subsection.1.5) cvn/Title (Why did you change the name? ) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsection.1.6) cvn/Title (Is Grace free? ) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsection.1.7) cvn/Title (Who wrote Grace? ) /OUT pdfmark endïps:SDict begin [/Count -0/Dest (subsection.1.8) cvn/Title (Is there a Postscript|LaTeX|HTML|SGML version of this document? ) /OUT pdfmark endïUps:SDict begin [/Count -7/Dest (section.2) cvn/Title (Getting Help ) /OUT pdfmark endïnps:SDict begin [/Count -0/Dest (subsection.2.1) cvn/Title (Are there any books about Grace? ) /OUT pdfmark endï~ps:SDict begin [/Count -0/Dest (subsection.2.2) cvn/Title (Is there a User's Guide available for Grace? \040) /OUT pdfmark endïzps:SDict begin [/Count -0/Dest (subsection.2.3) cvn/Title (Is there a Tutorial available for Grace? \040) /OUT pdfmark endïsps:SDict begin [/Count -0/Dest (subsection.2.4) cvn/Title (Where do I get support for Grace? \040) /OUT pdfmark endïtps:SDict begin [/Count -0/Dest (subsection.2.5) cvn/Title (Is there a newsgroup devoted to Grace? ) /OUT pdfmark endïpps:SDict begin [/Count -0/Dest (subsection.2.6) cvn/Title (Is there a mailing list for Grace? ) /OUT pdfmark endïmps:SDict begin [/Count -0/Dest (subsection.2.7) cvn/Title (Is there a forum for Grace? \040) /OUT pdfmark endïsps:SDict begin [/Count -8/Dest (section.3) cvn/Title (Providing Help: Finding and Reporting Bugs ) /OUT pdfmark endï…ps:SDict begin [/Count -0/Dest (subsection.3.1) cvn/Title (I think I found a bug in Grace! How do I report it? \040) /OUT pdfmark endïpps:SDict begin [/Count -0/Dest (subsection.3.2) cvn/Title (Is there a list of known bugs? \040) /OUT pdfmark endïÌps:SDict begin [/Count -0/Dest (subsection.3.3) cvn/Title (The bug report \043xxx is marked as "Fixed" in the w3todo, but I checked the last version of Grace and the bug is still there! ) /OUT pdfmark endï®ps:SDict begin [/Count -0/Dest (subsection.3.4) cvn/Title (The bug report \043xxx I reported is marked as "Ignored" in the w3todo and I even got no reply?! ) /OUT pdfmark endïyps:SDict begin [/Count -0/Dest (subsection.3.5) cvn/Title (I have got an idea! How do I report a wish? ) /OUT pdfmark endï|ps:SDict begin [/Count -0/Dest (subsection.3.6) cvn/Title (I want to help! How can I contribute to Grace? ) /OUT pdfmark endïtps:SDict begin [/Count -0/Dest (subsection.3.7) cvn/Title (How do I submit patches/contributions? ) /OUT pdfmark endï„ps:SDict begin [/Count -0/Dest (subsection.3.8) cvn/Title (I like Grace! Should I donate anything to its authors? ) /OUT pdfmark endïUps:SDict begin [/Count -9/Dest (section.4) cvn/Title (Installation ) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsection.4.1) cvn/Title (How do I install Grace? \040) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsection.4.2) cvn/Title (Can I compile Grace myself? ) /OUT pdfmark endï¿ps:SDict begin [/Count -0/Dest (subsection.4.3) cvn/Title (When I run `configure', it says the XXX package is not found, whereas I am certain it was installed on my system! ) /OUT pdfmark endïœps:SDict begin [/Count -0/Dest (subsection.4.4) cvn/Title (When I type './configure' I get: ``configure: error M*tif has not been found'' ) /OUT pdfmark endïlps:SDict begin [/Count -0/Dest (subsection.4.5) cvn/Title (What is Motif \(LessTif\)? \040) /OUT pdfmark endï{ps:SDict begin [/Count -0/Dest (subsection.4.6) cvn/Title (`configure' stops telling it can't find "ar". ) /OUT pdfmark endïŠps:SDict begin [/Count -0/Dest (subsection.4.7) cvn/Title (Are there Grace binaries available? For which platforms? \040) /OUT pdfmark endïxps:SDict begin [/Count -0/Dest (subsection.4.8) cvn/Title (Is there a Windows|OS/2|VMS port of Grace? ) /OUT pdfmark endï™ps:SDict begin [/Count -0/Dest (subsection.4.9) cvn/Title (Compilation with gcc fails on Solaris complaining about unresolved symbols. ) /OUT pdfmark endïZps:SDict begin [/Count -12/Dest (section.5) cvn/Title (Runtime Problems ) /OUT pdfmark endïŸps:SDict begin [/Count -0/Dest (subsection.5.1) cvn/Title (When I start Grace I get the message ``Can't find library libXXX.so'' or similar. ) /OUT pdfmark endï¶ps:SDict begin [/Count -0/Dest (subsection.5.2) cvn/Title (I get errors like "X Error of failed request: BadValue \(integer parameter out of range for operation\)" ) /OUT pdfmark endïƒps:SDict begin [/Count -0/Dest (subsection.5.3) cvn/Title (Grace crashes with "Oops Got SIGSEV" \(on GNU/Linux\) ) /OUT pdfmark endòps:SDict begin [/Count -0/Dest (subsection.5.4) cvn/Title (I run Grace and get the following error messages: "Warning: translation table syntax error: Unknown keysym name: osfPageLeft Warning: ... found while parsing 'osfPageLeft:SWLeftPage\(\)'" ) /OUT pdfmark endò2ps:SDict begin [/Count -0/Dest (subsection.5.5) cvn/Title (I run Grace on a Solaris 2.5.1 box, and when I try to open a file, I can't read the names of the files \(files section of the dialog\) because Grace writes ALL the path of each file in the list and there is no horizontal scroll. ) /OUT pdfmark endïŒps:SDict begin [/Count -0/Dest (subsection.5.6) cvn/Title (Grace can not find font database and initialize the T1 library ) /OUT pdfmark endï´ps:SDict begin [/Count -0/Dest (subsection.5.7) cvn/Title (Pressing Ctrl and clicking with the left mouse button on the canvas or dialog panels make Grace crash. ) /OUT pdfmark endïmps:SDict begin [/Count -0/Dest (subsection.5.8) cvn/Title (The size of the canvas is huge. ) /OUT pdfmark endï¹ps:SDict begin [/Count -0/Dest (subsection.5.9) cvn/Title (Extended ASCII characters do not appear and/or appear as incorrect control characters in text input fields. ) /OUT pdfmark endïsps:SDict begin [/Count -0/Dest (subsection.5.10) cvn/Title (File selection dialogs are unusable. ) /OUT pdfmark endï˜ps:SDict begin [/Count -0/Dest (subsection.5.11) cvn/Title (All of the text in the menus and dialog boxes are represented as squares. ) /OUT pdfmark endï¼ps:SDict begin [/Count -0/Dest (subsection.5.12) cvn/Title (On Fedora Core 4, all set selectors collapse into a single of even a zero-height line after a few operations. ) /OUT pdfmark endïWps:SDict begin [/Count -6/Dest (section.6) cvn/Title (Basic Concepts ) /OUT pdfmark endï`ps:SDict begin [/Count -0/Dest (subsection.6.1) cvn/Title (What is a project? ) /OUT pdfmark endïkps:SDict begin [/Count -0/Dest (subsection.6.2) cvn/Title (What is a parameter file? \040) /OUT pdfmark endïvps:SDict begin [/Count -0/Dest (subsection.6.3) cvn/Title (Which data formats does Grace recognize? ) /OUT pdfmark endïaps:SDict begin [/Count -0/Dest (subsection.6.4) cvn/Title (What is block data? ) /OUT pdfmark endïhps:SDict begin [/Count -0/Dest (subsection.6.5) cvn/Title (What is the NXY data type? ) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsection.6.6) cvn/Title (What is the Julian Date? ) /OUT pdfmark endïUps:SDict begin [/Count -37/Dest (section.7) cvn/Title (Using Grace ) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsection.7.1) cvn/Title (How do I start Grace? ) /OUT pdfmark endï‚ps:SDict begin [/Count -0/Dest (subsection.7.2) cvn/Title (Where is gracebat? How does batch printing work? \040) /OUT pdfmark endï†ps:SDict begin [/Count -0/Dest (subsection.7.3) cvn/Title (How can I customize the default appearance of Grace? \040) /OUT pdfmark endï}ps:SDict begin [/Count -0/Dest (subsection.7.4) cvn/Title (Which environment variables does Grace use? \040) /OUT pdfmark endï}ps:SDict begin [/Count -0/Dest (subsection.7.5) cvn/Title (What command line options does Grace recognize? ) /OUT pdfmark endï·ps:SDict begin [/Count -0/Dest (subsection.7.6) cvn/Title (Can one change the colour selecton for the menu, locator, tool, and status bars, and all the popup menus? ) /OUT pdfmark endïzps:SDict begin [/Count -0/Dest (subsection.7.7) cvn/Title (What different kinds of sets can Grace plot? ) /OUT pdfmark endïÙps:SDict begin [/Count -0/Dest (subsection.7.8) cvn/Title (I'd like to plot data against an axis on the right \(top\) and another data set in a different scale against an axis on the left \(bottom\) ) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsection.7.9) cvn/Title (How do I do polar plots? ) /OUT pdfmark endï›ps:SDict begin [/Count -0/Dest (subsection.7.10) cvn/Title (Can I use different fonts, symbols, font size, or sub/superscripts in Grace? ) /OUT pdfmark endïŠps:SDict begin [/Count -0/Dest (subsection.7.11) cvn/Title (How do I produce special characters \(Umlauts\) with Grace? ) /OUT pdfmark endï{ps:SDict begin [/Count -0/Dest (subsection.7.12) cvn/Title (Can I use my own fonts and/or encodings? \040) /OUT pdfmark endï—ps:SDict begin [/Count -0/Dest (subsection.7.13) cvn/Title (At which precision is numerical data saved? How can I set the precision? ) /OUT pdfmark endï¾ps:SDict begin [/Count -0/Dest (subsection.7.14) cvn/Title (When I save a project and then re-open it, the Julian date values appear to be rounded to the nearest half day. ) /OUT pdfmark endï~ps:SDict begin [/Count -0/Dest (subsection.7.15) cvn/Title (How do I read in project files created by Xmgr? ) /OUT pdfmark endï”ps:SDict begin [/Count -0/Dest (subsection.7.16) cvn/Title (I can't open anymore project files saved with an old version of Xmgr. ) /OUT pdfmark endïÅps:SDict begin [/Count -0/Dest (subsection.7.17) cvn/Title (When I load a project saved with an earlier version of Xmgr \(<4.0\), symbols of all \(some\) sets are drawn in black. ) /OUT pdfmark endïŒps:SDict begin [/Count -0/Dest (subsection.7.18) cvn/Title (How do I save disk space? Can I use compressed project files? ) /OUT pdfmark endïwps:SDict begin [/Count -0/Dest (subsection.7.19) cvn/Title (Can I import bitmap graphics into Grace? ) /OUT pdfmark endïps:SDict begin [/Count -0/Dest (subsection.7.20) cvn/Title (Can I export Grace graphs to GIF|TIFF| PostScript|PDF etc? \040) /OUT pdfmark endï|ps:SDict begin [/Count -0/Dest (subsection.7.21) cvn/Title (Where have all the region operations gone to? ) /OUT pdfmark endïyps:SDict begin [/Count -0/Dest (subsection.7.22) cvn/Title (How can I input data in date/time formats? ) /OUT pdfmark endï—ps:SDict begin [/Count -0/Dest (subsection.7.23) cvn/Title (How do I set the background color of a plot, outside of the graph frame? ) /OUT pdfmark endï‹ps:SDict begin [/Count -0/Dest (subsection.7.24) cvn/Title (How do I use more than 16 colors for objects/lines in Grace? ) /OUT pdfmark endïnps:SDict begin [/Count -0/Dest (subsection.7.25) cvn/Title (How can I use pipes with Grace? ) /OUT pdfmark endïÀps:SDict begin [/Count -0/Dest (subsection.7.26) cvn/Title (Is it possible to make Grace starting with a completely empty canvas, until the commands are loaded and executed? ) /OUT pdfmark endïÈps:SDict begin [/Count -0/Dest (subsection.7.27) cvn/Title (When I include an EPS file generated by Grace into my \(La\)TeX document, the graphic hides some of the surrounding text. ) /OUT pdfmark endï‡ps:SDict begin [/Count -0/Dest (subsection.7.28) cvn/Title (Printing to my old PostScript printer produces an error. ) /OUT pdfmark endï…ps:SDict begin [/Count -0/Dest (subsection.7.29) cvn/Title (How do I make a Grace image fit on a given paper size? ) /OUT pdfmark endïÅps:SDict begin [/Count -0/Dest (subsection.7.30) cvn/Title (My decimal tick labels are systematically of the form e.g. 0,5 instead of 0.5 \(i.e. I get a comma instead of a dot\). ) /OUT pdfmark endïƒps:SDict begin [/Count -0/Dest (subsection.7.31) cvn/Title (Is it possible to use the dB \(decibel\) axis scale? ) /OUT pdfmark endïÙps:SDict begin [/Count -0/Dest (subsection.7.32) cvn/Title (In "Data set properties", I don't see a possibility to view the more essential part of the mantissa; it's swallowed in the black triangle. ) /OUT pdfmark endïÔps:SDict begin [/Count -0/Dest (subsection.7.33) cvn/Title (When making use of -param via the command line to set the parameters, the world scaling is not correctly set \(it just auto-scales\). ) /OUT pdfmark endï›ps:SDict begin [/Count -0/Dest (subsection.7.34) cvn/Title (I am unable to find "Load \046 Evaluate" which I used quite a lot with Xmgr. ) /OUT pdfmark endï«ps:SDict begin [/Count -0/Dest (subsection.7.35) cvn/Title (How can I specify a template other than the default one on the command line? In the scripts? ) /OUT pdfmark endïwps:SDict begin [/Count -0/Dest (subsection.7.36) cvn/Title (How can I save my 'preferences' options? ) /OUT pdfmark endïøps:SDict begin [/Count -0/Dest (subsection.7.37) cvn/Title (In an XY-plot with a huge number of points some regions become straight lines instead of the original curve. When I zoom in to the area the data becomes correctly drawn. ) /OUT pdfmark endïTps:SDict begin [/Count -1/Dest (section.8) cvn/Title (Mathematics ) /OUT pdfmark endï‚ps:SDict begin [/Count -0/Dest (subsection.8.1) cvn/Title (What algorithm is used for non-linear curve fitting? ) /OUT pdfmark endïcps:SDict begin [/Count -4/Dest (section.9) cvn/Title (Command Line Interface \040) /OUT pdfmark endïƒps:SDict begin [/Count -0/Dest (subsection.9.1) cvn/Title (Which non-interactive batch commands does Grace know? ) /OUT pdfmark endï€ps:SDict begin [/Count -0/Dest (subsection.9.2) cvn/Title (How can I do feature extraction non-interactively? ) /OUT pdfmark endï~ps:SDict begin [/Count -0/Dest (subsection.9.3) cvn/Title (How can I use non-linear fits in the batch mode? ) /OUT pdfmark endïÑps:SDict begin [/Count -0/Dest (subsection.9.4) cvn/Title (Is it possible to call the command "POINT expr, expr" with more than two values, as needed, for example, for points in XYDYDY sets? ) /OUT pdfmark endïWps:SDict begin [/Count -5/Dest (section.10) cvn/Title (Miscellaneous ) /OUT pdfmark endïpps:SDict begin [/Count -0/Dest (subsection.10.1) cvn/Title (Does Grace have an UNDO function? ) /OUT pdfmark endïhps:SDict begin [/Count -0/Dest (subsection.10.2) cvn/Title (Can Grace plot 3D graphs? ) /OUT pdfmark endïyps:SDict begin [/Count -0/Dest (subsection.10.3) cvn/Title (Which features are planned for the future? ) /OUT pdfmark endïtps:SDict begin [/Count -0/Dest (subsection.10.4) cvn/Title (Are there things that Grace can't do? ) /OUT pdfmark endï™ps:SDict begin [/Count -0/Dest (subsection.10.5) cvn/Title (How should Grace be acknowledged when it is used to prepare a publication? ) /OUT pdfmark endïNps:SDict begin [/PageMode /UseOutlines/Page 1/View [/Fit] /DOCVIEW pdfmark endï/ps:SDict begin [ {Catalog}<<>> /PUT pdfmark endïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (Doc-Start) cvn /DEST pdfmark endïpapersize=8.5in,11inŸ†áóþÖëI½q½qecss2074»Grace–fÑF‘þfKA›ÿwmQ“(fo˜r“Grace-5.1.23)ޤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹b¸èy–U the“Grace“T‘ÿ*¸eam’P¢}12.06.2010Ž¡Ÿ&°–1[óŒ6 ecss1000¼This›1ZdoGcument“contains˜Fš¸èrequently“Ask˜ed‘1ZQuestions“(F‘ÿ*¸A˜Q)›1"abGout–1Zó»y&³ ecsx1000½Grace¼,‘hja“WYSIWYG˜2D˜plotting“toGol‘1[fo¸èrŽ¡scientic–wƒdata.‘ب(A‘wyGerman“translation“of›w‚this“doGcument,‘€made“b¸èy“T‘ÿ*¸obias˜Brink¸èert,‘€is˜available“here:‘¶Eóø8‹ ecsi1000¾Grace“F‘ÿ*¸A¸èQŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1óqLË ectt1000¿http://www.semibyte.de/dokuwiki/informatik:linux:xmgrace:grace_faqï color popŸù¨ïps:SDict begin H.R endŽïÊps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.semibyte.de/dokuwiki/informatik:linux:xmgrace:grace_faq) >>/Subtype /Link H.B /ANN pdfmark endï color pop‘U ¼.)ŽŸ(Àœó&Lt$ffffecbx1440ÁCon•cten“tsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.1) cvn /DEST pdfmark endŸñžïcolor push rgb 0 0 1ïps:SDict begin H.S endó]fŒ ecbx1000Â1Ž‘ÿGeneral–ÕQuestions“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’`²5ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹1.1Ž‘þ‘What–U is“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÀM‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.2Ž‘þ‘Where–U can“I“get“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ñ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.3Ž‘þ‘Where–U can“I“get“the“most“recen¸èt“information“abGout“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘\™‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.4Ž‘þ‘What–U is“the“dierence“bGet•¸èw“een–U Xmgr“and“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘pU‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.5Ž‘þ‘Whš¸èy–U did“y˜ou“c˜hange“the“name?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¢×‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.6Ž‘þ‘Is–U Grace“free?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.7Ž‘þ‘Who–U wrote“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘r‰‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.8Ž‘þ‘Is–U there“a“Pš¸èostscriptó !",š cmsy10¸j¹LaT‘ÿ*¸eX¸j¹HTML¸j¹SGML“v˜ersion“of“this“doGcumen˜t?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Vf‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ2Ž‘ÿGetting–ÕHelp“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’zêƒ6ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹2.1Ž‘þ‘Are–U there“an¸èy“b•Go“oks›U ab“out˜Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘µ5‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.2Ž‘þ‘Is–U there“a“User's“Guide“a¸èv‘ÿqÐailable“for“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘º‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.3Ž‘þ‘Is–U there“a“T‘ÿ*¸utorial“a¸èv‘ÿqÐailable“for“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ q‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.4Ž‘þ‘Where–U do“I“get“suppGort“for“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ÿ¹‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.5Ž‘þ‘Is–U there“a“newsgroup“dev¸èoted“to“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘6‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.6Ž‘þ‘Is–U there“a“mailing“list“for“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘{ý‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.7Ž‘þ‘Is–U there“a“forum“for“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘;)‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ3Ž‘ÿPro®>viding–ÕHelp:‘ Finding“and“RepQÂorting“Bugs“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’ØÈ8ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹3.1Ž‘þ‘I–U think“I“found“a“bug“in“Grace!›q€Ho¸èw“do“I“repGort“it?˜ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÔE‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.2Ž‘þ‘Is–U there“a“list“of“kno¸èwn“bugs?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘[‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.3Ž‘þ‘The–¨‚bug“repGort›¨ƒ#xxx“is“mark¸èed“as˜"Fixed"“in“the“w3toGdo,‘½[but“I‘¨mc•¸èhec“k“ed–¨‚the˜last“v¸èersion“ofŽŸ ®‘%ý¡Grace–U and“the“bug“is“still“there!‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.4Ž‘þ‘The–µbug‘µ~repšGort“#xxx“I‘µVrep˜orted›µ~is“mark¸èed“as˜"Ignored"“in˜the“w3toGdo“and˜I‘µWev¸èen˜got“no˜reply?!‘‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹2Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.6Ž‘þ‘I›U w•¸èan“t˜to˜help!‘q€Ho“w˜can˜I˜con“tribute˜to˜Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Z©‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popޤؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.7Ž‘þ‘Hoš¸èw–U do“I“submit“patc˜hes/con˜tributions?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘GÑü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end3.8Ž‘þ‘I–U likš¸èe“Grace!‘q€Should“I“donate“an˜ything“to“its“authors?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.3.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘øI‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ4Ž‘ÿInstallation‘Õïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’~OG10ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹4.1Ž‘þ‘Ho¸èw–U do“I“install“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Oí‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2Ž‘þ‘Can–U I“compile“Grace“m¸èyself‘Ç?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘í-‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3Ž‘þ‘When–å~I›åZrun“`congure',‘ –it‘åsa¸èys“the“XXX˜pac¸èk‘ÿqÐage“is‘ånot“found,‘ –whereas“I˜am“certain‘åit“w¸èasŽŸ ®‘%ý¡installed–U on“m¸èy“system!‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘!§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4Ž‘þ‘When–U I“t¸èypšGe“'./congure'“I“get:–q€congure:“error–U M*tif“has“not“b˜een“found‘*hïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘°Û‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.5Ž‘þ‘What–U is“Motif“(LessTif‘Ç)?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘áã‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.6Ž‘þ‘`congure'–U stops“telling“it“can't“nd“"ar".‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ý_‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.7Ž‘þ‘Are–U there“Grace“binaries“aš¸èv‘ÿqÐailable?‘q€F‘ÿ*¸or“whic˜h“platforms?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘cm‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.8Ž‘þ‘Is–U there“a“Windo¸èws¸j¹OS/2¸j¹VMS“pGort“of“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘o‹‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.9Ž‘þ‘Compilation–U with“gcc“fails“on“Solaris“complaining“abGout“unresolvš¸èed“sym˜bGols.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ5Ž‘ÿRun®>time–ÕProblems“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’X±¡12ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹5.1Ž‘þ‘When–U I“start“Grace“I“get“the“message“Can't“nd“library“libXXX.so‘*hor“similar.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ßÑ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.2Ž‘þ‘I›nGget–nerrors“lik¸èe“"X˜Error“of“failed“request:‘¤`BadV‘ÿ*¸alue“(in¸èteger‘nparameter“out“of“range“forŽ© ®‘%ý¡opGeration)"‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘µ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.3Ž‘þ‘Grace–U crashes“with“"Oops“Got“SIGSEV"“(on“GNU/Lin¸èux)“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘'‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.4Ž‘þ‘I‘]Arun–^ Grace›^ and“get˜the“follo¸èwing“error˜messages:‘ ƒR"W‘ÿ*¸arning:‘ ƒStranslation˜table“syn-ަ‘%ý¡tax–Ôerror:‘ ouUnknoš¸èwn“k˜eysym“name:‘ ouosfP˜ageLeft“W‘ÿ*¸arning:‘ ou...‘îqfound‘Ôwhile“parsingަ‘%ý¡'ó  b> cmmi10µ<¹Keyµ>¹osfP•¸èageLeft:SWLeftP“age()'"‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘°ã‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.5Ž‘þ‘I‘Ámrun›ÁŠGrace–Á‰on“a“Solaris˜2.5.1“bGo¸èx,‘Ü£and˜when“I‘Ámtry“to˜opGen“a“le,‘ܤI‘Ámcan't“read˜the“names“ofަ‘%ý¡the–:—les›:–(les“section˜of“the˜dialog)“bGecause˜Grace“writes˜ALL‘:the“path˜of“eac¸èh˜le“in˜the“listަ‘%ý¡and–U there“is“no“horizon¸ètal“scroll.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ª#‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.6Ž‘þ‘Grace–U can“not“nd“fon¸èt“database“and“initialize“the“T1“library“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color poprU‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.7Ž‘þ‘Pressing–TCtrl“and“clicš¸èking“with“the“left“mouse‘Ubutton“on“the“can˜v‘ÿqÐas“or“dialog“panels“mak˜eަ‘%ý¡Grace‘U crash.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.8Ž‘þ‘The–U size“of“the“canš¸èv‘ÿqÐas“is“h˜uge.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘†?‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.9Ž‘þ‘Extended–ÿòASCIšGI‘ÿÇc¸èharacters“do‘ÿónot“app˜ear“and/or‘ÿóapp˜ear“as›ÿóincorrect“con•¸ètrol˜c“haracters‘ÿòinަ‘%ý¡text–U input“elds.‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘®Ç‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.10Ž‘þ‘File–U selection“dialogs“are“un¸èusable.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.5.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘•7‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.11Ž‘þ‘All–U of“the“text“in“the“menš¸èus“and“dialog“bGo˜xes“are“represen˜ted“as“squares.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.5.11) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘/‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.12Ž‘þ‘On–DßF‘ÿ*¸edora›DàCore“4,‘H all“set“selectors˜collapse“in¸èto˜a“single“of˜evš¸èen“a“zero-heigh˜t›Dàline“after˜a“fewަ‘%ý¡opGerations.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.5.12) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ã3‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹{¨ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.3) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹3Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ6Ž‘ÿBasic–ÕConcepts“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’jÇA14ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹6.1Ž‘þ‘What–U is“a“pro‘Ž0ject?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÄK‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2Ž‘þ‘What–U is“a“parameter“le?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Zß‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.3Ž‘þ‘Whic¸èh–U data“formats“doGes“Grace“recognize?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¶m‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.4Ž‘þ‘What–U is“bloGc¸èk“data?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘!'‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.5Ž‘þ‘What–U is“the“NXY“data“t¸èypGe?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ûw‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.6Ž‘þ‘What–U is“the“Julian“Date?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘÷G‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽŸØïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ7Ž‘ÿUsing–ÕGrace“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’y$ï15ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹7.1Ž‘þ‘Ho¸èw–U do“I“start“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘dá‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2Ž‘þ‘Where–U is“gracebat?‘q€Hoš¸èw“doGes“batc˜h“prin˜ting“w˜ork?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘—Ç‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.3Ž‘þ‘Ho¸èw–U can“I“customize“the“default“appGearance“of“Grace?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘y‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.4Ž‘þ‘Whic•¸èh›U en“vironmen“t˜v‘ÿqÐariables˜doGes˜Grace˜use?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘šm‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.5Ž‘þ‘What–U command“line“options“doGes“Grace“recognize?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘÷±‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.6Ž‘þ‘Can–´/one›´0c¸èhange“the“colour˜selecton“for“the˜men¸èu,–ËólošGcator,“to˜ol,“and›´0status‘´/bars,“and˜all‘´/theŽ© ®‘%ý¡pGopup‘U men¸èus?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Y‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.7Ž‘þ‘What–U dieren¸èt“kinds“of“sets“can“Grace“plot?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘„á‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.8Ž‘þ‘I'd–öólik¸èe›öòto“plot˜data“against˜an“axis“on˜the“righ¸èt˜(top)“and“another˜data“set˜in“a˜dieren¸èt“scaleަ‘%ý¡against–U an“axis“on“the“left“(bGottom)“ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Üg‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.9Ž‘þ‘Ho¸èw–U do“I“do“pGolar“plots?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘áÓ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.10Ž‘þ‘Can–U I“use“dierenš¸èt“fon˜ts,“sym˜bGols,“fon˜t“size,“or“sub/supGerscripts“in“Grace?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘É•‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.11Ž‘þ‘Ho¸èw–U do“I“prošGduce“sp˜ecial“c¸èharacters“(Umlauts)“with“Grace?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.11) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘•‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.12Ž‘þ‘Can–U I“use“mš¸èy“o˜wn“fon˜ts“and/or“encoGdings?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.12) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘òë‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.13Ž‘þ‘A•¸èt›U whic“h˜precision˜is˜n“umerical˜data˜sa“v“ed?‘q€Ho“w˜can˜I˜set˜the˜precision?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.13) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Í ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.14Ž‘þ‘When›ß½I‘ß™sa•¸èv“e˜a˜pro‘Ž0ject˜and˜then˜re-op•Gen˜it,‘ethe˜Julian˜date˜v‘ÿqÐalues˜app“ear˜to˜b“e˜rounded˜toަ‘%ý¡the–U nearest“half“da¸èy‘ÿ*¸.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.14) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Òó‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.15Ž‘þ‘Hoš¸èw–U do“I“read“in“pro‘Ž0ject“les“created“b˜y“Xmgr?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.15) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘?‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.16Ž‘þ‘I–U can't“opGen“anš¸èymore“pro‘Ž0ject“les“sa˜v˜ed“with“an“old“v˜ersion“of“Xmgr.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.16) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘oÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.17Ž‘þ‘When–žI‘qload›a“pro‘Ž0ject˜sa•¸èv“ed–žwith˜an“earlier˜v¸èersion“of˜Xmgr“(µ<¹4.0),‘,¼sym¸èbGols“of˜all“(some)ަ‘%ý¡sets–U are“draš¸èwn“in“blac˜k.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.17) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘“w‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.18Ž‘þ‘Hoš¸èw–U do“I“sa˜v˜e“disk“space?›q€Can“I“use“compressed“pro‘Ž0ject“les?˜ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.18) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.19Ž‘þ‘Can–U I“impGort“bitmap“graphics“in¸èto“Grace?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.19) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘(‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black18Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.20Ž‘þ‘Can–U I“expGort“Grace“graphs“to“GIF¸j¹TIFF¸j“¹P¸èostScript¸j¹PDF“etc?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.20) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘`0‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.21Ž‘þ‘Where›U ha•¸èv“e˜all˜the˜region˜opGerations˜gone˜to?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.21) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¬C‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.22Ž‘þ‘Ho¸èw–U can“I“input“data“in“date/time“formats?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.22) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘K‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.23Ž‘þ‘Hoš¸èw–U do“I“set“the“bac˜kground“color“of“a“plot,“outside“of“the“graph“frame?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.23) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘T‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹¾Šïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.4) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂCONTENTS’â¹4Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.24Ž‘þ‘Ho¸èw–U do“I“use“more“than“16“colors“for“ob‘Ž0jects/lines“in“Grace?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.24) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¤ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black19Ž‘wŸï color popޤؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.25Ž‘þ‘Ho¸èw–U can“I“use“pipGes“with“Grace?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.25) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¦‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.26Ž‘þ‘Is–Ýçit“pGossible“to“makš¸èe‘ÝèGrace“starting“with“a“completely“empt˜y“can˜v‘ÿqÐas,‘õÀun˜til“the“commands“areŽ© ®‘%ý¡loaded–U and“executed?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.26) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¯‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.27Ž‘þ‘When–àTI‘à6include“an“EPS‘à7le“generated“bš¸èy“Grace“in˜to“m˜y“(La)T‘ÿ*¸eX‘à6doGcumen˜t,‘÷°the“graphic“hidesަ‘%ý¡some–U of“the“surrounding“text.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.27) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Û_‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.28Ž‘þ‘Prinš¸èting–U to“m˜y“old“P˜ostScript“prin˜ter“proGduces“an“error.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.28) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘mבü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.29Ž‘þ‘Hoš¸èw–U do“I“mak˜e“a“Grace“image“t“on“a“giv˜en“papGer“size?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.29) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘±Q‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black20Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.30Ž‘þ‘My–¥ódecimal“tic¸èk“labGels“are“systematically“of‘¥ôthe“form“e.g.›70,5“instead“of“0.5“(i.e.˜I‘¥Çget“a“commaަ‘%ý¡instead–U of“a“dot).‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.30) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘®¿‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.31Ž‘þ‘Is–U it“pšGossible“to“use“the“dB“(decib˜el)“axis“scale?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.31) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ë‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.32Ž‘þ‘In–Ð)"Data›Ð(set“propGerties",‘.êI‘ÏÇdon't“see˜a“pGossibilit¸èy˜to“view˜the“more˜essen¸ètial“part˜of“theަ‘%ý¡manš¸ètissa;–U it's“sw˜allo˜w˜ed“in“the“blac˜k“triangle.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.32) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.33Ž‘þ‘When–"ômaking›"óuse“of˜ó½HЃ ecti1000Ã-p–ÿ}/ar“am‘çI¹via˜the–"ôcommand“line˜to“set˜the“parameters,‘,üthe“w¸èorld˜scaling“isަ‘%ý¡not–U correctly“set“(it“just“auto-scales).‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.33) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.34Ž‘þ‘I–U am“unable“to“nd“"Load“&“Ev‘ÿqÐaluate"“whic¸èh“I“used“quite“a“lot“with“Xmgr.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.34) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘”‹‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.35Ž‘þ‘Ho¸èw–3can›3I‘3‡spGecify“a“template˜other“than“the˜default“one“on˜the“command˜line?‘fOIn˜the“scripts?‘fPïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.35) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘©ïcolor push Black21Ž‘ ï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.36Ž‘þ‘Hoš¸èw–U can“I“sa˜v˜e“m˜y“'preferences'“options?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.36) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘y·‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black21Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.37Ž‘þ‘In–õIan“XY-plot“with“a“hš¸èuge“n˜um˜bšGer“of“p˜oin¸èts‘õJsome“regions“b˜ecome“straigh¸èt“lines“instead“of“theަ‘%ý¡original–U curv¸èe.‘q€When“I“zošGom“in“to“the“area“the“data“b˜ecomes“correctly“dra¸èwn.‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.7.37) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ8Ž‘ÿMathematics‘Õïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’vQŽ22ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹8.1Ž‘þ‘What–U algorithm“is“used“for“non-linear“curv¸èe“tting?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.8.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¦‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ9Ž‘ÿCommand–ÕLine“In®>terface“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’: <22ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹9.1Ž‘þ‘Whic•¸èh›U non-in“teractiv“e˜batc“h˜commands˜doGes˜Grace˜kno“w?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘•Y‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end9.2Ž‘þ‘Hoš¸èw–U can“I“do“feature“extraction“non-in˜teractiv˜ely?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘×»‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end9.3Ž‘þ‘Hoš¸èw–U can“I“use“non-linear“ts“in“the“batc˜h“moGde?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop; ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black22Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end9.4Ž‘þ‘Is–ß=it“pGossible›ß>to“call“the“command“"POINT‘ß expr,‘öÑexpr"“with“more“than˜t•¸èw“o–ß=v‘ÿqÐalues,‘öÑas“needed,ŽŸ ®‘%ý¡for–U example,“for“pGoinš¸èts“in“XYD˜YD˜Y“sets?‘q€ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¤g‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÂ10Ž‘ÿMiscellaneous‘Õïps:SDict begin 13.68 H.L endï{ps:SDict begin [/Subtype /Link/Dest (section.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’rZ23ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹10.1Ž‘þ‘DoGes–U Grace“ha•¸èv“e–U an“UNDO“function?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘µ¥‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.2Ž‘þ‘Can–U Grace“plot“3D“graphs?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘—¥‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.3Ž‘þ‘Whic¸èh–U features“are“planned“for“the“future?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ˆ7‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.4Ž‘þ‘Are–U there“things“that“Grace“can't“do?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ò%‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black23Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.5Ž‘þ‘Hoš¸èw–U should“Grace“bGe“ac˜kno˜wledged“when“it“is“used“to“prepare“a“publication?‘q€ïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘õ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black24Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ oïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.5) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ1.‘ñ8General‘ÕQuestions’bd9¹5Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.1) cvn /DEST pdfmark endŸ Á1Ž‘ÁGeneral‘G\QuestionsŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.1) cvn /DEST pdfmark endŸSËó¥!¢N ecbx1200Å1.1Ž‘¾What–¸is“Grace?ŽŸMª¹Grace–~is›}a“toGol“to˜makš¸èe“t˜w˜o-dimensional“plots‘}of“n˜umerical“data.‘ö˜It“runs“under›}v‘ÿqÐarious“(if“not˜all)“a•¸èv“oursޤ ®of–cªUNIX‘c¦with“X11“and“M*tif.‘Its“capabilities“are“roughly“similar“to“GUI-based“programs“lik¸èe“Sigmaplot“orŽ¡MicrošGcal–EOrigin“plus“script-based“to˜ols“likš¸èe“gn˜uplot“or“Genplot.‘ZIts“strength“lies“in“the“fact“that“it“com˜binesŽ¡the›™ùcon•¸èv“enience–™øof˜a“graphical˜user˜in¸èterface“with˜the˜pGo•¸èw“er–™øof˜a“scripting˜language˜whic¸èh“enables˜it“to˜doŽ¡sophisticated–U calculations“or“pGerform“automated“tasks.ޤؼGrace–U is“derivš¸èed“from“Xmgr“(a.k.a.‘q€A˜CE/gr),“originally“written“b˜y“P˜aul“T‘ÿ*¸urner.Ž¡F‘ÿ*¸rom–Ojvš¸èersion“n˜um˜bGer“4.00,‘Pthe“dev˜elopmen˜t“w˜as‘Oktak˜en“o˜v˜er“b˜y“a“team“of‘Okv˜olun˜teers“under“the“coGordinationŽ© ®of–U Evgenš¸èy“Stam˜bulc˜hik.Ž¡When›/Ëits‘/Êcop•¸èyrigh“t˜w“as˜c“hanged–/Êto˜GPL,˜the“name˜wš¸èas“c˜hanged–/Ëto“Grace,‘fuwhic˜h“stands‘/Êfor“GRaphing,ަA¸èdv‘ÿqÐanced–¦"Computation›¦!and“Exploration“of˜data‘{jor“Grace“Rev‘ÿqÐamps˜Aš¸èCE/gr.‘d…The“rst“v˜ersion‘¦!of“Graceަaš¸èv‘ÿqÐailable–U is“named“5.0.0,“while“the“last“public“v˜ersion“of“Xmgr“has“the“v˜ersion“n˜um˜bGer“4.1.2.Ž¡Pš¸èaul–U still“main˜tains“and“dev˜elops“a“non-public“v˜ersion“of“Xmgr“for“in˜ternal“use.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.2) cvn /DEST pdfmark endŸ.ÂÅ1.2Ž‘¾Where–¸can“I“get“Grace?ŽŸMª¹Y‘ÿ*¸ou–µ®can›µ¯get“the˜new¸èest“information˜abGout“Grace˜and“do¸èwnload˜the“latest˜v¸èersion“at˜the“ÃGr–ÿ}/ac“e–ì…home“p‘ÿ}/ageަïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/ï color popŸù¨ïps:SDict begin H.R endŽï°ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop‘U ¹.Ž¡Y‘ÿ*¸ou–´0can“fetcš¸èh“it‘´1from“a“mirror“site“as“w˜ell.‘ޱThe“list“of“mirror“sites‘´1can“bGe“found“atަïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿ftp://plasma-‘€gate.weizmann.ac.il/pub/grace/MIRRORSï color popŸù¨ïps:SDict begin H.R endŽïºps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (ftp://plasma-gate.weizmann.ac.il/pub/grace/MIRRORS) >>/Subtype /Link H.B /ANN pdfmark endï color pop‘U ¹.ŽŸ6ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.3) cvn /DEST pdfmark endŸçªÅ1.3Ž‘¾Where–¸can“I“get“the“most“recen t“information“ab_úout“Grace?ޤMª¹Please–Î{refer“to“the“Ãocial›VGr–ÿ}/ac“e‘UHome˜Page–Î{ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/ï color popŸù¨ïps:SDict begin H.R endŽï°ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹.‘Ý‘There“y¸èouަcan–U also“nd“the“latest“vš¸èersion“of“this“F‘þã A˜Q,“links“to“the“latest“release“and“to“mirror“sites“closer“to“y˜ou.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.4) cvn /DEST pdfmark endŸ.ÂÅ1.4Ž‘¾What–¸is“the“dierence“b_úet• w“een–¸Xmgr“and“Grace?Ž¡¹Apart–G›from›Gšthe“licensing,‘„9the˜main“dierence˜is“that˜Grace“is˜WYSIWYG‘G\(What“Y‘ÿ*¸ou˜See“Is˜What“Y‘ÿ*¸ouަGet).‘ð#This›Ô¬w•¸èas‘Ô«ac“hiev“ed˜through˜a–Ô«ma‘Ž0jor˜rewrite˜of“all˜the“mid-lev•¸èel˜dra“wing˜routines–Ô«and˜the˜use“of˜theަdevice-indepšGenden•¸èt‘U T“yp˜e–U 1“fonš¸èt“rendering“library“T1lib“for“t˜ypGesetting.ޤؼF‘ÿ*¸or–B]help›B^with“c¸èhanging“from˜Xmgr“to“Grace“see˜section“¿Xmgr–?¬to“Grace“migration“guide–B]¹in˜the“User'sަGuide–U (question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide).Ž¡There–‡[are‘‡Zcurrenš¸ètly“sev˜eral“features‘‡Zof“Xmgr“whic˜h›‡Zare“not˜yš¸èet“implemen˜ted“in‘‡ZGrace“(of“course,‘“éalongsideަwith–ta“lot›sof“new“stu“not˜found“in“Xmgr).‘£{A‘Dfull“compatibilit¸èy˜is“desirable“except“for˜bad‘å¼features“ofަXmgr.Ž¡Among–U the“Xmgr“features“not“(yš¸èet)“implemen˜ted“in“Grace“are:ŽŸؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹X-Y–U graph“ipŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹Jlïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.6) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ2.‘ñ8Getting‘ÕHelp’|œ/¹6Ž’ÕÁGï color popŽŽ £n ýˆ.\ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Horizonš¸ètal–U and“v˜ertical“lines“as“sym˜bGolsŽŸ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Smith‘U plotsŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.5) cvn /DEST pdfmark endŸ.ÂÅ1.5Ž‘¾Whš y–¸did“y˜ou“c˜hange“the“name?ޤMª¹When–’the“licensing‘‘wš¸èas“c˜hanged“to“GPL,“P˜aul“w˜an˜ted‘‘to“k˜eep“the“name“for“his‘‘non-public“v˜ersion“of“Xmgr,Ž© ®so–U wš¸èe“c˜hose“a“new“name.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.6) cvn /DEST pdfmark endŸ jÅ1.6Ž‘¾Is–¸Grace“free?Ž¡¹Y‘ÿ*¸es.‘1Grace›âis–âfree“in˜terms“of˜the“GNU‘ááGeneral“Public˜License“(GPL)‘áá(see“the“le˜¿LICENSE‘áá¹whic¸èh“comesަwith–U Grace“or“the“ÃGNU–“°Home“Page–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.gnu.orgï color popŸù¨ïps:SDict begin H.R endŽïšps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.gnu.org) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹for“details).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.7) cvn /DEST pdfmark endŸ ’Å1.7Ž‘¾Who–¸wrote“Grace?Ž¡¹The–sources›of“Grace˜still“con¸ètain˜a“signican•¸èt˜amoun“t–of˜coGde“from˜Xmgr“b•¸èy˜P“aul›T–ÿ*¸urner.‘ºOF“or˜a‘list˜ofަthose–U who“con¸ètributed“to“Grace“since“then,“see“the“le“¿CHANGES“¹in“the“Grace“distribution.ŽŸؼSome–6qinš¸ètegral“parts“of‘6rGrace“are“bGorro˜w˜ed“from“other“pac˜k‘ÿqÐages,‘<”namely“libraries“whic˜h‘6rare“also“a˜v‘ÿqÐailable“asަstand-alone–U distributions.‘q€In“alphabGetical“order:ŽŸؼïcolor push Black‘¸Ž‘ï color popŽŽ‘ÃCephes–“°math“libr‘ÿ}/ary‘U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.moshier.net/ï color popŸù¨ïps:SDict begin H.R endŽïŸps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.moshier.net/) >>/Subtype /Link H.B /ANN pdfmark endï color popޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘ÃT1lib‘U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://metalab.unc.edu/pub/Linux/libs/graphics/ï color popŸù¨ïps:SDict begin H.R endŽï·ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://metalab.unc.edu/pub/Linux/libs/graphics/) >>/Subtype /Link H.B /ANN pdfmark endï color popŽ¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘ÃXb‘ÿ}/ae‘U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.lesstif.org/Xbae.htmlï color popŸù¨ïps:SDict begin H.R endŽï¨ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.lesstif.org/Xbae.html) >>/Subtype /Link H.B /ANN pdfmark endï color popŽŸ6ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.8) cvn /DEST pdfmark endŸçªÅ1.8Ž‘¾Is–¸there“a“Pš ostscriptó!!",š cmsy10ÌjÅLaT‘þàeXÌjÅHTMLÌjÅSGML“v˜ersion“of“this“do_úcumen˜t?ޤMª¹Y‘ÿ*¸es.‘_×It› #is– $written“in“SGML‘ whic¸èh“means“that˜all“the“abGo•¸èv“e‘ $v“ersions˜can– $easily“bGe“created˜using“¿sgml-toolsަ¹(see–P1their“Ãhome‘zªp‘ÿ}/age“ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.sgmltools.org/ï color popŸù¨ïps:SDict begin H.R endŽï¡ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.sgmltools.org/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹).‘b³A¸èt“the“Grace“home“page“(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.1.3) cvn H.B /ANN pdfmark endï color pop“(HomeަPš¸èage)),–U all“these“v˜ersions“are“a˜v‘ÿqÐailable.ŽŸ®ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.2) cvn /DEST pdfmark endŸ/îÁ2Ž‘ÁGetting‘G\HelpŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.1) cvn /DEST pdfmark endŸSËÅ2.1Ž‘¾Are–¸there“an y“b•_úo“oks›¸ab“out˜Grace?Ž¡¹As–þBof›þCno¸èw,‘¢Grace“is“a˜purely“virtual“creature˜living“in˜the“net,‘¢i.e.‘T‹there˜is“no˜prinš¸èted“literature.‘TŒAll“relev‘ÿqÐan˜tަdoGcs–®èare›®çcurren¸ètly“bundled˜with“Grace.‘~ÖSee“questions˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.1.3) cvn H.B /ANN pdfmark endï color pop“(Home˜P¸èage)“and˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's˜Guide)“for˜details.ަY‘ÿ*¸ou–kcan“prinš¸èt“y˜our“o˜wn“cop˜y“of“the‘kF‘þã A˜Q,“the“User's“Guide“and“the“T‘ÿ*¸utorial“b˜y“con˜v˜erting“the“D˜VI‘kles“toަP¸èostScript‘U output.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹`‘ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.7) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ2.‘ñ8Getting‘ÕHelp’|œ/¹7Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.2) cvn /DEST pdfmark endŸ Å2.2Ž‘¾Is–¸there“a“User's“Guide“a v‘ÿ@ ailable“for“Grace?Ž©Mª¹Y‘ÿ*¸es.‘ç‹It–'$is›'#part“of“the˜Grace“distribution“and˜usually“is˜loGcated“in“¿$GRACE_HOME/doc/¹.‘ç‹There˜are“sev¸èeralޤ ®vš¸èersions:‘O0the–CøSGML‘Cºsource“and“HTML,“LaT‘ÿ*¸eX,“D˜VI›Cºand“PS˜deriv¸èed“from“it.‘>Y‘ÿ*¸ou“can“read“the“HTMLŽ¡v¸èersion–‰•from›‰”a“running˜Grace“session˜bš¸èy“clic˜king›‰”on“¿"Help/User‘?¬Guide"¹.‘ÝY‘ÿ*¸ou“need˜a“w•¸èeb˜bro“wser‘‰•to˜readŽ¡the–Ù¯HTML‘ÙŒvš¸èersion“(see“also“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.4ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.4) cvn H.B /ANN pdfmark endï color pop“(En˜vironmen˜t‘Ù®V–ÿ*¸ariables)).‘ÿ-Y“ou–Ù¯can“alw˜a˜ys‘Ù®do˜wnload“the“new˜estŽ¡vš¸èersion–U from“the“Grace“homepage“(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.1.3) cvn H.B /ANN pdfmark endï color pop“(Home“P˜age)).ŽŸؼThe–U User's“Guide“is“not“quite“complete,“y¸èet.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.3) cvn /DEST pdfmark endŸ.ÂÅ2.3Ž‘¾Is–¸there“a“T‘þàutorial“a v‘ÿ@ ailable“for“Grace?ަ¹Y‘ÿ*¸es.‘X†There–¢"are“sevš¸èeral“tutorials“whic˜h“giv˜e‘¢!detailed“step-b˜y-step“information“ho˜w“to“ac˜hiev˜e“v‘ÿqÐarious“tasks.Ž¡They–U are“also“part“of“the“Grace“distribution.‘q€Y‘ÿ*¸ou“can“nd“them“in“¿$GRACE_HOME/doc/¹.ŽŸؼThere–X¦are“tutorials“abGout“creating‘X¥a“simple“plot,‘Yˆbatcš¸èh“plotting,‘Y‡tting“curv˜es,‘Y‡transformations“(graphical“-Ž¡simple›gèones,–l›in¸èterpGolation,“feature˜extraction,“using˜the‘gécommand˜line),“using˜pipGes,“o•¸èv“erla“ying˜graphs,‘l›hotŽ¡links.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.4) cvn /DEST pdfmark endŸ jÅ2.4Ž‘¾Where–¸do“I“get“supp_úort“for“Grace?ަ¹Y‘ÿ*¸ou›U ha•¸èv“e˜the˜follo“wing˜options:ŽŸؼïcolor push Black‘¸Ž‘ï color popŽŽ‘¹There–âèis“a“User's›âçGuide“(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))˜whicš¸èh“came“with“Grace“on“y˜our‘âçcomputer.‘KnItŽ¡‘is–^¥usually›^¦loGcated“in˜¿$GRACE_HOME/doc/“¹along“with˜other“les˜whicš¸èh“ma˜y“con˜tain›^¦useful“help˜for“y¸èourŽ¡‘problem.‘§ãIf–gAyš¸èou“do˜wnloaded‘gBthe“sources,‘kÉthere“are“ev˜en“more“les“in‘gBthe“main“directory“of“the“sourceŽ¡‘tree.ޤ®ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Ha•¸èv“e–U a“loGok“at“the“Grace“home“page“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 11.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.1.3) cvn H.B /ANN pdfmark endï color pop“(Home“P¸èage)).Ž¡ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹On–§Wthe›§VGrace“forums˜(see“question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.7) cvn H.B /ANN pdfmark endï color pop“(F‘ÿ*¸orums)˜for“details)˜y¸èou“can˜easily“get˜in“con¸ètact˜with“usersޤ ®‘and–ddevš¸èelopGers‘cof“Grace.‘YëHo˜w˜ev˜er“bGe‘ca˜w˜are“that›cpGeople“here˜are“trying˜to“help˜in“their˜spare“time˜-“soŽ¡‘yš¸èou–U can't“alw˜a˜ys“expGect“quic˜k“respGonses.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.5) cvn /DEST pdfmark endŸ.ÂÅ2.5Ž‘¾Is–¸there“a“newsgroup“dev oted“to“Grace?ަ¹No,‘0 there–&Èisn't.‘b W‘ÿ*¸e“feel›&Çthat“a“bulletin˜bGoard“(see˜question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.7) cvn H.B /ANN pdfmark endï color pop“(F‘ÿ*¸orums))˜is“more˜appropriate“to˜discuss“theŽ¡topics–U related“to“Grace.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.6) cvn /DEST pdfmark endŸ.ÂÅ2.6Ž‘¾Is–¸there“a“mailing“list“for“Grace?ަ¹There–º:used“to“bšGe“a“few,‘Ó€but“no¸èw“they“are“replaced“with‘º9bulletin-b˜oard-st¸èyle“forums“(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.7) cvn H.B /ANN pdfmark endï color pop“(F‘ÿ*¸o-Ž¡rums)).ŽŸؼThe›‡‹Ãmailing–Âlist“ar‘ÿ}/chives–‡Œïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/maillists/grace/ï color popŸù¨ïps:SDict begin H.R endŽïÀps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/maillists/grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop˜¹are“still˜a¸èv‘ÿqÐail-Ž¡able–U for“bro¸èwsing.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹xVïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.8) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Pro®>viding–ÕHelp:‘ Finding“and“RepQÂorting“Bugs’ÙÂt¹8Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.7) cvn /DEST pdfmark endŸ Å2.7Ž‘¾Is–¸there“a“forum“for“Grace?ŽŸMª¹Y‘ÿ*¸es.‘ã'Just–ÐWfollo¸èw›ÐXthis“link:‘gïÃforums˜ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/phpbb/ï color popŸù¨ïps:SDict begin H.R endŽï¶ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/phpbb/) >>/Subtype /Link H.B /ANN pdfmark endï color pop˜¹.‘ã&It˜has“its˜o¸èwnŽ© ®F‘þã A¸èQ.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.3) cvn /DEST pdfmark endŸ¾Á3Ž‘ÁProcviding–G\Help:‘ ÐFinding“and“Reppœorting“BugsŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.1) cvn /DEST pdfmark endŸSËÅ3.1Ž‘¾I–¸think“I“found“a“bug“in“Grace!‘ÿ Ho w“do“I“rep_úort“it?ŽŸ#‘ûïcolor push Black‘ÂFirstï color popŽŽŽ¤®‘¹Makš¸èe–U sure“that“what“y˜ou“found“really“is“a“bug.ŽŸ®‘ûïcolor push Black‘ÂSecondï color popŽŽŽ¡‘¹T‘ÿ*¸ry–Lto›Lmak¸èe“sure˜that“it˜is“a“bug˜in“Grace,‘Škand“that˜the“failure“is˜not“caused˜b¸èy“another˜piece“ofަ‘soft•¸èw“are.ŽŸ®‘ûïcolor push Black‘ÂThirdï color popŽŽŽ¡‘¹Makš¸èe–í’sure“y˜ou“are›í‘running“the“latest“ocial“release“of˜Grace.‘NüThe“dev•¸èelopmen“t–í’of˜Grace“is“rather“fast,ަ‘so–U yš¸èour“bug“migh˜t“already“bGe“xed.Ž©®‘ûïcolor push Black‘ÂF‘ÿ ºourthï color popŽŽŽ¡‘¹T‘ÿ*¸ry–U to“nd“out“if“the“bug“is“already“knoš¸èwn“(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.2) cvn H.B /ANN pdfmark endï color pop“(Kno˜wn“Bugs)).ަ‘ûïcolor push Black‘ÂFifthï color popŽŽŽ¡‘¹OK:›¬•Y‘ÿ*¸ou–¬–Ãhave‘lä¹found“a˜new“bug.‘wàUse˜Âw3toQÂdo“¹(question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.2) cvn H.B /ANN pdfmark endï color pop“(Kno¸èwn˜Bugs))˜to“repGort˜it.‘wáF‘ÿ*¸ollo¸èw˜theޤ ®‘instructions–Ï>on›Ï?the“page“and“try˜to“bGe“as“precise˜as“pšGossible.‘DàIt“w¸èon't“b˜e“of›Ï?m•¸èuc“h–Ï>help“if“y¸èou˜write“TheŽ¡‘program–ì9crashes.‘#ÑT‘ÿ*¸ry“to“nd›ì:a“simple“reproGducible“case.‘N‰Men¸ètion“the˜v¸èersion“of“Grace“and˜where“y¸èouŽ¡‘got–â9the“build“and“the›â:opGerating“system“y¸èou“use.‘ËY‘ÿ*¸ou“should“submit“the˜system“info“as“proš¸èvided“b˜yŽ¡‘uname– Ï-a‘ß(if“this› Ðutilit¸èy“exists,‘àof“course)˜and“the˜output“of˜xmgrace“-v¸èersion.‘XfOften“the˜problem“isŽ¡‘related–dàto›dßsome“spGecic“data˜set.‘ ¿Please“try˜hard“on“reducing˜this“to˜the“minimš¸èum“whic˜h‘dßis“sucien˜tŽ¡‘of–areproGducing“the“bug.‘^AIf“it's“only“a“few›blines“of“data“please“submit“it“together˜with“the“other“details.Ž¡‘Once–i×y¸èou“submit“the“bug“repšGort,‘oit“will“b˜e“automatically“rela•¸èy“ed–i×to“the“mailing‘iÖlist.‘¯¥Y‘ÿ*¸ou“will“usuallyŽ¡‘bGe–¾ notied›¾ when“the“bug“is˜xed“or“if“w¸èe˜need“more“information,‘ØFso˜please“don't“forget“to˜givš¸èe“y˜ourŽ¡‘correct–U e-mail“address.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.2) cvn /DEST pdfmark endŸ jÅ3.2Ž‘¾Is–¸there“a“list“of“kno wn“bugs?ŽŸMª¹Y–ÿ*¸es.‘×Y“ou›5“can–5’searc¸èh“and˜bro¸èwse“the˜database“of“kno¸èwn˜bugs“in˜Grace“at“the˜bug“repGort˜facilit¸èy“Ãw3to‘ÿ}/doŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/w3todo/index.phtmlï color popŸù¨ïps:SDict begin H.R endŽï¼ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/w3todo/index.phtml) >>/Subtype /Link H.B /ANN pdfmark endï color pop–­¹or“using‘­the“¿"Help/Comments"“¹men¸èu“fromŽ¡within–3•Grace.‘fRThe“database“also‘3”kš¸èeeps“trac˜k“of“the“status“of“the“bug“(¿Confirmed,–?¬Working“on,“Testing,Ž¡Fixed,‘?¬Closed,–U ¹etc.).‘q€This“is“also“the“place“to“submit“bug“repGorts“and“wishes.ŽŸؼSome–U bugs“and“xes“ma¸èy“not“appšGear“in“w3to˜do,“but“are“co•¸èv“ered–U on“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.7) cvn H.B /ANN pdfmark endï color pop“(forums).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ‘ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.9) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ3.‘ñ8Pro®>viding–ÕHelp:‘ Finding“and“RepQÂorting“Bugs’ÙÂt¹9Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.3) cvn /DEST pdfmark endŸ Å3.3Ž‘¾The– ebug› frep_úort“#xxx“is˜mark ed“as˜"Fixed"“in“the˜w3to_údo,‘/but˜I‘ Ac• hec“k“edޤõ‘¾the–¸last“v ersion“of“Grace“and“the“bug“is“still“there!Ž©Mª¹The–úòterm“"xed"“means“the“bug“is“xed“in“the“currenš¸èt“Ãdevelopment‘í¼¹v˜ersion,‘ ûand“the“next“Ãpublic‘‹ž¹v˜ersion“willŽŸ ®ha•¸èv“e–U the“x“in“it.‘q€RepšGorts“with“xes“incorp˜orated“in“an“existing“public“vš¸èersion“are“mark˜ed“as“"Closed".ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.4) cvn /DEST pdfmark endŸ.ÂÅ3.4Ž‘¾The–äëbug›äìrep_úort“#xxx˜I‘äÄrep_úorted“is“mark ed˜as“"Ignored"˜in“the˜w3to_údo“andŽ¡‘¾I–¸ev en“got“no“reply?!ަ¹Y‘ÿ*¸ou–Uímš¸èust“ha˜v˜e‘Uîmissed“something“v˜ery“ob˜vious.‘sèChec˜k“out“ho˜w›Uîto“propGerly“submit“a“bug˜repGort“in“thisޤ ®doGcumenš¸èt.‘¶2Most–±probably“y˜our“repGort“w˜as‘°incomplete“or“just“redundan˜t‘°to“an“existing“en˜try‘ÿ*¸.‘¶2It's“w˜orthŽ¡c•¸èhec“king–U the“log“le“of“the“bug“repšGort“(the“"View“log"“button“at“the“b˜ottom“of“the“rep˜ort“viewing“page).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.5) cvn /DEST pdfmark endŸ ’Å3.5Ž‘¾I›¸ha• v“e˜got˜an˜idea!‘ÿ Ho“w˜do˜I˜rep_úort˜a˜wish?ަ¹Y‘ÿ*¸ou–Ôcan“submit“wishes“and“suggestions“just“the“w•¸èa“y‘Ôy“ou›Ôw“ould˜submit˜bug˜repGorts˜(see˜question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.2) cvn H.B /ANN pdfmark endï color pop˜(Kno“wnŽ¡Bugs)).‘›Suggestions‘1Ófor›1Ôimpro•¸èv“emen“t˜are‘1Ógenerally˜v“ery˜w“elcome.‘šIt˜ma“y˜b•Ge‘1Óp“ossible,‘iho•¸èw“ev“er,‘ithat˜theŽ¡devš¸èelopGers–qOare‘qNbusy“or“that“y˜our›qNwish“is“rejected˜for“some“go•Go“d˜reason,‘x[so˜it–qOma¸èy“bGe“necessary˜to“pGersuadeŽ¡(bGetter–U con¸èvince)“them“to“get“at“it.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.6) cvn /DEST pdfmark endŸ ’Å3.6Ž‘¾I›¸w• an“t˜to˜help!‘ÿ Ho“w˜can˜I˜con“tribute˜to˜Grace?ަ¹Fine!‘q€There–U are“alw•¸èa“ys–U things“to“do.Ž©ؼIf–rãyš¸èou‘râare“a“C‘r©programmer,‘ "y˜ou“can›râalmost“certainly˜nd“something“useful˜to“do.‘&Just˜ask“on“the˜forums.‘&TheŽ¡same–zAapplies“if‘z@yš¸èou“are“a“tec˜hnical“writer.‘àâThe“doGcumen˜tation“will“certainly“need‘z@to“bšGe“up˜dated,‘ƒ‰correctedŽ¡or–U completed.‘q€Evš¸èery“small“con˜tribution“is“appreciated!ަMakš¸èe–ù÷Grace“kno˜wn‘ùøto“y˜our“friends“and“colleagues.‘SThe“more“users“Grace“has,‘ 3the“faster“it‘ùøwill“bGe“impro˜v˜ed.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.7) cvn /DEST pdfmark endŸ.ÂÅ3.7Ž‘¾Hoš w–¸do“I“submit“patc˜hes/con˜tributions?ŽŸMª¹Prepare–³dis“against“the‘´most“recenš¸èt“v˜ersion.‘ª9Use‘´either“unied“(-u)“or“con˜text“(-c)“di‘´format.‘ª9SpGecifyŽ¡exactly–U against“whicš¸èh“v˜ersion“the“di“is“suppGosed“to“w˜ork.‘q€Finally“send“them“toަïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿mailto:fnevgenyatweizmanndotacdotilï color popŸùãðïps:SDict begin H.R endŽïÃps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (mailto:fnevgeny\040at\040weizmann\040dot\040ac\040dot\040il) >>/Subtype /Link H.B /ANN pdfmark endï color popަ¹In–U case“yš¸èou“plan“to“help“this“w˜a˜y“more“than“once“y˜ou“should“join“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.7) cvn H.B /ANN pdfmark endï color pop“(forums).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.3.8) cvn /DEST pdfmark endŸ ’Å3.8Ž‘¾I–¸likš e“Grace!‘ÿ Should“I“donate“an˜ything“to“its“authors?ŽŸMª¹No–’need›‘to.‘\¦But“if“y¸èou˜feel“lik¸èe“making˜a“donation,‘#cš¸èhoGose“an˜y“c˜harit˜y‘‘organization“y˜ou“lik˜e.‘\¦Y‘ÿ*¸ou‘‘w˜an˜ted“toŽ¡givš¸èe–U them“some“money‘ÿ*¸,“an˜yw˜a˜y‘ÿ*¸,“righ˜t?‘q€;-)ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ¦Àïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.10) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Installation’€Àç¹10Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.4) cvn /DEST pdfmark endŸ Á4Ž‘ÁInstallationŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.1) cvn /DEST pdfmark endŸ jÅ4.1Ž‘¾Ho w–¸do“I“install“Grace?Ž©Mª¹Y‘ÿ*¸ou›Ûha•¸èv“e˜the˜c“hoice:‘ æõeither˜y“ou˜compile˜the˜sources˜y“ourself˜or‘Úy“ou˜do“wnload˜precompiled˜bina-ޤ ®ries–ßP(w¸èe›ßQstrongly“suggest˜yš¸èou“tak˜e›ßQthe“rst˜route).‘ Y‘ÿ*¸ou˜can“get“bGoth˜from“the˜ÃGr–ÿ}/ac“e–éÛHome“PageŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/ï color popŸù¨ïps:SDict begin H.R endŽï°ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop–{d¹.‘äMWhether“binaries›{efor“y¸èour“platforms“are˜a¸èv‘ÿqÐailable“(seeŽ¡question–ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.7ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.7) cvn H.B /ANN pdfmark endï color pop›€(Binaries))“depGends˜on“whether˜one“of“the˜dev¸èelopGers“has˜access“to˜the“respGectiv¸èe˜platform“andŽ¡has–U had“time“to“do“it.ŽŸؼIt–U is“alw•¸èa“ys–U a“go•Go“d–U idea“to“read“the“¿README¹s“that“accompanš¸èy“the“do˜wnloading“pac˜k‘ÿqÐages“of“Grace.ŽŸæüïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.2) cvn /DEST pdfmark endŸ.ÂÅ4.2Ž‘¾Can–¸I“compile“Grace“m yself‘:—?ަ¹Y–ÿ*¸es!‘1UA¸èctually“,‘åthis›•is–•the“preferred˜methoGd“of“installation.‘1TAfter“getting“the˜sources“(question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.1) cvn H.B /ANN pdfmark endï color pop“(In-Ž¡stallation))–öand“un¿gzip¹ping‘õÿand“un¿tar¹ing“them“(use“e.g.‘T¿gzip–?¬-dc“grace-5.0.4.tar.gz“¸j“¿tar“xvf“-¹),Ž¡proGceed–U according“to“the“relev‘ÿqÐanš¸èt“section“of“the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide),“whic˜h“co˜v˜ers“the“compilation“proGcess.ŽŸu-ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.3) cvn /DEST pdfmark endŸ ’Å4.3Ž‘¾When–19I‘1 run“`congure',‘]šit“saš ys“the–1:XXX‘1 pac˜k‘ÿ@ age“is–19not“found,‘]šwhereas“IŽŸõ‘¾am–¸certain“it“wš as“installed“on“m˜y“system!ަ¹There–U are“sev¸èeral“pGossible“reasons:ŽŸ³{ïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Y‘ÿ*¸ou›×]ha•¸èv“e–×\only˜the“run-time˜part“installed˜(this“espGecially˜concerns“GNU/Lin•¸èux˜users).‘ø5Ho“w“ev“er,Ž¡‘yš¸èou–Qushould“ha˜v˜e“the“relev‘ÿqÐan˜t“dev˜elopmen˜t“pac˜k‘ÿqÐage‘Qt(C‘Q4header“les“etc)“installed,–ŠtoGo.‘fE.g.,“for‘QutheŽ¡‘JPEG‘Õ^library–Õto›Õ~bGe“recognized“b¸èy“`congure',‘õ—Ãb‘ÿ}/oth‘™Ô¿libjpeg62˜¹and“¿libjpeg62-devel“¹pacš¸èk‘ÿqÐages“m˜ustŽ¡‘bGe‘U installed.ŽŸ›tïcolor push Black‘¸Ž‘ï color popŽŽ‘¹The–Ñôlibrary›Ñóand“the˜header“les“don't˜matcš¸èh“eac˜h›Ñóother“(they“are˜from“dierenš¸èt“v˜ersions).‘EÆThis“usuallyŽ¡‘happGens–U on“large“Unix“systems“with“a“less“than“capable“sysadmin...ŽŸ›sïcolor push Black‘¸Ž‘ï color popŽŽ‘¹Either–âƒthe›â„library“or“the˜header“les“can't˜bGe“found˜b¸èy“the“compiler.‘ªUse˜the“¿with-extra-ldpathŽ¡‘¹and–U ¿with-extra-incpath“¹congure“options“to“proš¸èvide“the“extra“paths,“respGectiv˜ely‘ÿ*¸.ŽŸ.ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.4) cvn /DEST pdfmark endŸçªÅ4.4Ž‘¾When–W[I‘Wt ypš_úe“'./congure'“I‘Wget:‘kqcongure:‘krerror“M*tif“has“not“b˜een“foundަ¹Chec¸èk–®whether›®M*tif“(question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.5) cvn H.B /ANN pdfmark endï color pop“(M*tif‘Ç))˜is“installed“on˜y¸èour“system.‘|KIf“it“is,‘ÄJloGok˜at“the˜le“cong.log:Ž¡there–U is“a“line“lik¸èe“this:ޤؼ¿configure:8900:‘ Xchecking–?¬for“a“Motif“µ>¿=“1002“compatible“APIŽ¡¹What–U comes“directly“after“it?›q€Could“bGe“a“hin¸èt.˜Also,“see“the“previous“question.ŽŸæüïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.5) cvn /DEST pdfmark endŸ.ÂÅ4.5Ž‘¾What–¸is“Motif“(LessTif‘:—)?ަ¹Throughout–®Lthe›®MGrace“doGcs,‘Ϫsa¸èying˜"M*tif"“w¸èe“actually˜refer“to˜the“Motif˜ÃAPI‘”†¹,“dening“a˜set“of˜functions“forޤ ®building–…graphical›…user“in¸èterfaces˜(GUI)‘… via“n¸èumerous˜widgets“(buttons,–‘labGels,“etc).‘cGrace–…mak¸èes˜a“hea¸èvyŽ¡use–U of“the“M*tif“API.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ºíïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.11) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ4.‘ñ8Installation’€Àç¹11Ž’ÕÁGï color popŽŽ £n ýˆ.\There– ware“sevš¸èeral“Ãimplementations‘ I²¹of“the“in˜terface.‘ØøThe“original“OSF‘ uBMotif“(seeޤ ®ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.opengroup.orgï color popŸù¨ïps:SDict begin H.R endŽï ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.opengroup.org) >>/Subtype /Link H.B /ANN pdfmark endï color pop– ü¹)‘ ýrecenš¸ètly“c˜hanged“its“license:‘ 9on“opGen-source“platforms‘ ýy˜ou“ma˜y“ha˜v˜eŽ¡a–¶/c¸èhance›¶.to“use“it˜for“free,‘ralthough“it's˜not“in“general˜qualied“as˜either“a“F‘ÿ*¸reeSource˜or“OpGenSourceŽ¡proGduct.ޤؼThere–U is,“ho•¸èw“ev“er,–U a“free“replacemen¸èt“for“Motif“called“LessTif“(seeŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.lesstif.orgï color popŸù¨ïps:SDict begin H.R endŽïžps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.lesstif.org) >>/Subtype /Link H.B /ANN pdfmark endï color pop–ùϹ).‘SLessTif“is“inš¸ètended“to“bGe“a“100%“source“compatible“replacemen˜t‘ùÐfor“Motif,‘ butޤ ®is–2›still“under“dev•¸èelopmen“t.‘eþF‘ÿ*¸or–2›the“purpGoses“of“Grace,‘9ƒtry“using“the“latest“v¸èersion“of“LessTif“(at“least“0.92.6Ž¡and›lmabGo•¸èv“e).‘·eThe˜LessTif–llpGeople˜usually“receiv•¸èe˜man“y–llbug˜repGorts˜from“the˜Grace“devš¸èelopGers,‘r@so“y˜ou‘lmmigh˜tŽ¡hopšGe–U that“a“few“remaining“bugs“in“LessTif“will“b˜e“xed“rather“quic¸èkly‘ÿ*¸.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.6) cvn /DEST pdfmark endŸ.ÂÅ4.6Ž‘¾`congure'–¸stops“telling“it“can't“nd“"ar".Ž©Mª¹"ar"–XÊis“the“library›XËarc•¸èhiv“er–XÊ(the“program“used“to“create˜static“libraries“lik¸èe“libF–ÿ*¸oGo.a).‘|~Y“ou˜should›XÊha•¸èv“e˜it˜inŽ¡y¸èour–U path.‘q€Under“Solaris,“for“example,“this“can“bGe“found“in“/usr/ccs/bin.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.7) cvn /DEST pdfmark endŸ ’Å4.7Ž‘¾Are–¸there“Grace“binaries“aš v‘ÿ@ ailable?‘ÿ F‘þàor“whic˜h“platforms?ަ¹W‘ÿ*¸e–Mêdo“not‘Méocially“suppGort“binary“pacš¸èk‘ÿqÐages.‘ÄWhen“con˜tributed‘Méb˜y“v˜olun˜teers“they're“put“in‘Méunder“the“Ãc‘ÿ}/ontribŽ¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿ftp://plasma-‘€gate.weizmann.ac.il/pub/grace/contrib/ï color popŸù¨ïps:SDict begin H.R endŽï»ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (ftp://plasma-gate.weizmann.ac.il/pub/grace/contrib/) >>/Subtype /Link H.B /ANN pdfmark endï color pop–ïܹarea.‘A¶Again,‘‹these‘ïÝare“NOT‘ïµsuppGorted“(bugŽ¡repšGorts–!ølik¸èe“"I‘!Âcan't“install“that“RPM"“will‘!÷b˜e“silen¸ètly“ignored),‘U.but›!÷feel“free“using“the˜Grace“forums“forŽ¡relev‘ÿqÐan¸èt‘U discussions.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.8) cvn /DEST pdfmark endŸ jÅ4.8Ž‘¾Is–¸there“a“Windo wsÌjÅOS/2ÌjÅVMS“p_úort“of“Grace?ަ¹Y‘ÿ*¸es,–U Grace“runs“on“VMS.“Just“compile“it“there.Ž©ؼAs–¹Nfor“Win32“(Windo¸èws‘¹O95/98/NT/2000/XP)‘¹4and“OS/2,›ÒZthere“are“pGorts“for“these“platforms,˜though“theyŽ¡are–U not“"nativš¸èe",“i.e.‘q€in“order“to“run“them,“one“needs“an“X“serv˜er“for“the“respGectiv˜e“platform.ަBoth–GÊOS/2“and‘GËWin32“pGorts“maš¸èy“lac˜k“some‘GËof“the“functionalit˜y“(notably‘ÿ*¸,‘}¨suppGort‘GËfor“"direct"/nativ˜e“prin˜ting;Ž¡probably–U yš¸èou“will“ha˜v˜e“to“use“the“P˜ostscript“output“for“prin˜ting).ަA‘2CpGort–2Kto“OS/2›2Lmade“b¸èy“Alexander˜Mai“can˜bGe“found“at‘d—ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.tu-‘€darmstadt.de/~st002279/os2/ï color popŸù¨ïps:SDict begin H.R endŽï±ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.tu-darmstadt.de/~st002279/os2/) >>/Subtype /Link H.B /ANN pdfmark endï color popŽ¡¹.›q€It–U requires“the“XF‘ÿ*¸ree86“libraries“and“an“X“Serv¸èer“(e.g.˜XF‘ÿ*¸ree86,“Hob“X11,“Exceed,“etc.).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.9) cvn /DEST pdfmark endŸ ’Å4.9Ž‘¾Compilation–d7with“gcc“fails“on‘d8Solaris“complaining“ab_úout“unresolv ed“sym-ŽŸõ‘¾b_úols.ŽŸMª¹If–&xyš¸èou“get‘&ysuc˜h“a“message“at“the“link‘ÿqÐage›&ystage,‘ZÎtelling“abGout“.LL794“(or“similar)˜unresolvš¸èed“sym˜bGols,‘ZÎtryŽ¡compiling–U with“nativ¸èe“cc“compiler“instead“(./congure“with-cc=cc).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ Ò@ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.12) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Run®>time‘ÕProblems’[#A¹12Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.5) cvn /DEST pdfmark endŸ Á5Ž‘ÁRunctime‘G\ProblemsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.1) cvn /DEST pdfmark endŸ jÅ5.1Ž‘¾When–œMI‘œstart“Grace–œLI‘œget“the–œMmessage“Can't›œLnd“library˜libXXX.so‘¼;orŽ©õ‘¾similar.ŽŸMª¹F‘ÿ*¸or–x£certain“tasks,‘Á„Grace“needs“external“libraries“whicš¸èh“are‘x¤neither“pro˜vided“b˜y“Grace“nor“the“opGeratingޤ ®system.›ÃÕY‘ÿ*¸ou–p’will“need“to‘p‘install“these“libraries“y¸èourself.˜This“applies“to“M*tif,‘·nPDF‘pH(see“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.20ï color popŸù•¼ïps:SDict begin H.R endŽï€ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.20) cvn H.B /ANN pdfmark endï color popŽ¡(Output–®oDevices))›®pand“probably“other˜libraries.‘}mIf˜the“message“is˜exactly“¿Can't–?¬find“library“libXm.soŽ¡¹(usually–Éthis›ÉhappGens“on“GNU/Lin¸èux“systems˜...)‘BÌthen“yš¸èou“don't“ha˜v˜e›ÉM*tif“(the“Xm“libraries)˜installed“(seeŽ¡question–?ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.5) cvn H.B /ANN pdfmark endï color pop“(M*tif‘Ç)),‘‰Èor“the“linkš¸èer“doGesn't‘@kno˜w“where“it“is.‘ïÞIn“the“rst‘@case,‘‰Çtry“do˜wnloading“LessTif.‘ïÞInŽ¡the‘€˜second–€—case,‘‹vyš¸èou“ha˜v˜e›€˜to“tell˜yš¸èour“link˜er›€˜where“it˜is˜(ma¸èy“bGe˜a“platform-spGecic˜task).‘óæOn˜GNU/Lin¸èuxŽ¡loGok–tNat›tMthe“le“¿/etc/ld.so.conf¹.‘Ï It“con¸ètains˜pathnames“of“the˜directories“where“dynamic˜libraries“areŽ¡stored.‘užAš¸èdd–«Ô(as‘«ÕroGot)“y˜our›«Õdirectory“to˜this“le˜and“run˜¿ldconfig‘?¬-v¹.‘uNo¸èw˜the“libraries˜should“bGe˜in“theŽ¡list.‘ ¡If–2Öyš¸èou're“not“roGot“y˜ou‘2Õma˜y“try“to“adjust‘2Õthe“en˜vironmen˜t“v‘ÿqÐariable“¿LD_LIBRARY_PATH‘2œ¹to“include“theŽ¡required‘U pathname.ŽŸؼF‘ÿ*¸or–ñÏsome“vš¸èersions‘ñÐof“Motif,‘¬the“soname‘Ç(whic˜h“iden˜ties‘ñÐthe“v˜ersion“of“the“library“and‘ñÐis“stored“somewhereŽ¡in–*—the›*˜library)“on“y¸èour“computer˜doGesn't“matc¸èh“the“soname˜of“the“library˜on“the“computer“where˜yš¸èour“cop˜yŽ¡of–{ÈGrace“wš¸èas“compiled“on.‘åxThen“y˜ou“should‘{Çuse“a“(semi)statically“link˜ed“v˜ersion“or“compile“Grace“on“y˜ourŽ¡computer.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.2) cvn /DEST pdfmark endŸ.ÂÅ5.2Ž‘¾I›*sget‘* errors–*Ÿlik e“"X˜Error‘* of“failed“request:‘UoBadV‘þàalue“(in teger“parameterަ‘¾out–¸of“range“for“op_úeration)"Ž©Mª¹This–›Dmeans“that“Grace“made“an“incorrect“access“to“an‘›EX‘›2library‘ÿ*¸.‘CìThis“is“most“probably“not“Grace's“fault.Ž¡Probably›õa‘õnot-y•¸èet-correctly-implemen“ted˜LessTif–õfunction˜(see“question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.5) cvn H.B /ANN pdfmark endï color pop“(M*tif‘Ç))˜caused“this˜bGeha¸èviour.Ž¡If–[‹y¸èou“use›[ŠLessTif,‘]&try“to“get˜the“latest“v¸èersion“(see“question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.5) cvn H.B /ANN pdfmark endï color pop“(M*tif‘Ç)).‘„ÁIf˜this“error“p•Gersists,‘]%rep“ort–[‹it“asŽ¡a–U bug“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.1) cvn H.B /ANN pdfmark endï color pop“(Bug“RepGorts)).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.3) cvn /DEST pdfmark endŸ ’Å5.3Ž‘¾Grace–¸crashes“with“"Oops“Got“SIGSEV"“(on“GNU/Lin ux)ަ¹Detect–«gwhether“yš¸èou‘«hare“using“a“v˜ersion‘«hlink˜ed“against“LessTif.‘tV"xmgrace“-v˜ersion"“and‘«h"ldd“xmgrace"“areŽ¡useful–U commands“for“this“purpGose.ŽŸؼIf–U yš¸èou“are“using“LessTif,“read“the“according“F‘þã A˜Q“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 14.5ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.4.5) cvn H.B /ANN pdfmark endï color pop“(M*tif‘Ç)“else“repšGort“it“as“a“bug“(ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.1ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.1) cvn H.B /ANN pdfmark endï color pop“(Bug“Rep˜orts)).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.4) cvn /DEST pdfmark endŸ ’Å5.4Ž‘¾I‘O[run–O¨Grace“and“get‘O©the“follo wing“error“messages:‘g™"W‘þàarning:‘g˜translation“ta-ޤõ‘¾ble–š¾synš tax“error:‘5¬Unkno˜wn“k˜eysym“name:‘5¬osfP˜ageLeft“W‘þàarning:‘5¬...‘P²foundŽ¡‘¾while–¸parsing“'ó·ág£ cmmi12É<ÅKeyÉ>ÅosfP• ageLeft:SWLeftP“age()'"ަ¹Get–œthe›œXKeySymDB‘›åle“from˜the“X11R6“distribution.‘3ÑPut“it“somewhere˜where“y¸èou“can˜access“it“and˜set“theޤ ®¿XKEYSYMDB‘™ˆ¹en•¸èvironmen“t–™šv‘ÿqÐariable‘™›to“¿"/place/where/you/put/XKeysymDB"¹.‘>îSee“question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.4ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.4) cvn H.B /ANN pdfmark endï color pop“(En•¸èvironmen“tŽ¡V‘ÿ*¸ariables)–U on“hoš¸èw“to“set“en˜vironmen˜t“v‘ÿqÐariables.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ ç ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.13) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ5.‘ñ8Run®>time‘ÕProblems’[#A¹13Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.5) cvn /DEST pdfmark endŸ Å5.5Ž‘¾I‘-³run–-ßGrace›-àon“a˜Solaris“2.5.1˜b_úo x,‘Yiand˜when“I‘-³try“to˜op_úen“a˜le,‘YiI‘-³can'tޤõ‘¾read–Û•the›Û–names“of˜the“les˜(les“section˜of“the˜dialog)“b_úecause˜Grace“writesŽ¡‘¾ALL–¸the“path“of“eacš h“le“in“the“list“and“there“is“no“horizon˜tal“scroll.ޤMª¹This–Æ>is“a“knoš¸èwn“bug“of“Motif“implemen˜tation“on“Solaris‘Æ?2.5.1“(bGoth“Sparc“and“In˜tel“hardw˜are).‘ÄÚAsk“y˜ourŽ© ®vš¸èendor–U for“a“patc˜h.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.6) cvn /DEST pdfmark endŸ.ÂÅ5.6Ž‘¾Grace–¸can“not“nd“fon t“database“and“initialize“the“T1“libraryŽ¡¹Y‘ÿ*¸ou›ú9ha•¸èv“e˜probably–ú8tried˜to˜run˜Grace˜without˜installing“it,‘#just˜after˜compilation.‘`ËY‘ÿ*¸ou“got˜the˜follo¸èwingަmessage‘U :ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘ó%qLË ectt0900ÐscanFontDBase():–¹NFont“Database“File“not“foundޤ Š=‘T1_InitLib():–¹NFatal“error“scanning“Font“Database“FileŽ¡‘-->–¹NBroken“or“incomplete“installation“-“read“the“FAQ!ŽŸؼ¹Grace–æ¿uses“either›æ¾the“¿GRACE_HOME‘æW¹en•¸èvironmen“t–æ¿v‘ÿqÐariable“or“a“compiled˜in“default“path“to˜nd“the“fon¸ètަdatabase.‘ëIf–Ò÷the‘Òöv‘ÿqÐariable“is“not“set“and“yš¸èou“ha˜v˜e“not“installed“the‘Òödatabase“with“¿make‘?¬install“¹it“cannotަnd–Þžit.‘ üIf“y•¸èou›ÞŸw“an“t–Þžto˜test“Grace˜bGefore“installing˜it,‘@þy¸èou“should˜set“the˜en•¸èvironmen“t–Þžv‘ÿqÐariable˜to“theަdistribution–4¬directory“(the“one›4«where“the“le“¿configure“¹lies),‘;)this“is“what“the“¿dotest˜¹script“doGes“when“y¸èouަrun–V½¿make‘?¬check¹.‘vVThe“easiest“thing“to›V¼do“ho•¸èw“ev“er–V½is“to˜install“ev¸èerything“with“¿make‘?¬install¹.‘vVSee“questionަïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.4ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.4) cvn H.B /ANN pdfmark endï color pop›U (En•¸èvironmen“t˜V‘ÿ*¸ariables)˜on˜ho“w˜to˜set˜en“vironmen“t˜v‘ÿqÐariables.ŽŸؼIf–Æy¸èou›Æget“this“message˜after“installing“a˜prebuilt“pacš¸èk‘ÿqÐage,‘"Othen“y˜ou‘Æha˜v˜e“either“forgotten‘Æto“do˜wnloadަthe–{*platform-indepGenden¸èt›{)part“of˜the“installation“(named˜lik¸èe“grace-x.y‘ÿ*¸.zz.common.tar.gz)˜or“not˜set“theަ¿GRACE_HOME›U ¹en•¸èvironmen“t˜v‘ÿqÐariable,˜see˜a˜few˜lines˜abGo“v“e.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.7) cvn /DEST pdfmark endŸ.ÂÅ5.7Ž‘¾Pressing–>oCtrl“and“clic king›>nwith“the“left“mouse“button“on˜the“can v‘ÿ@ as“orŽŸõ‘¾dialog–¸panels“mak e“Grace“crash.ŽŸMª¹This–bis“a‘bknoš¸èwn“bug“in“Motif-2.1.‘˜$Most“v˜endors“ha˜v˜e›bxed“it“in“their“pGorts˜and/or“ha•¸èv“e–ba“patc¸èh“ready‘ÿ*¸,‘e:butަnot–Ûall,‘GIa“notable›Úexception“bGeing“Motif˜libraries“shippGed˜b¸èy“Red“Hat˜for“GNU/Lin¸èux“for˜Inš¸ètel“hardw˜areަ(vš¸èersions–t%6.*).‘ÎGrace“has“a“w˜ork‘ÿqÐaround“for“this›t&bug.‘ÎIn“order“to“enable˜it,‘{æadd“the“follo¸èwing˜lines“to“the“Xަresources:ŽŸ ‘‰ffÕÁGŸ ?œïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘ÐXMgrace*XmDrawingArea.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmRowColumn.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmForm.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmFrame.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmScrolledWindow.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmFileSelectionBox.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmScale.translations:‘¹N#override\n\ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹?ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.14) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ6.‘ñ8Basic‘ÕConcepts’m8á¹14Ž’ÕÁGï color popŽŽ £n ýˆ.\‘>ÊrÐCtrl–¹N:“do_nothing()ޤ Š=‘XMgrace*XmCommand.translations:‘¹N#override\n\Ž¡‘>ÊrCtrl–¹N:“do_nothing()Ž¡‘XMgrace*XmMessageBox.translations:‘¹N#override\n\Ž¡‘5WÖCtrl–¹N:“do_nothing()Ž¡žff‰ffÕÁGŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.8) cvn /DEST pdfmark endŸ r¬Å5.8Ž‘¾The–¸size“of“the“canš v‘ÿ@ as“is“h˜uge.ޤMª¹It–xOshould“bGe“exactly‘xNthe“size“of“the“hardcopš¸èy“(A4/US‘xletter).‘Û If“not,‘Ác˜hec˜k“y˜our‘xNX‘xserv˜er“settings“(runŽ© ®`xdpš¸èyinfo'–U and“w˜atc˜h“the“"dimensions:"“line;“c˜hec˜k“the“n˜um˜bGers“with“a“ruler).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.9) cvn /DEST pdfmark endŸ ’Å5.9Ž‘¾Extended–$PASCIš_úI‘$9c haracters“do“not“app˜ear“and/or‘$Qapp˜ear“as“incorrect“con-ŽŸõ‘¾trol–¸c haracters“in“text“input“elds.Ž¡¹Are–PRy¸èou›PQusing“OpGenMotif˜2.2“(see˜Help/AbGout)?‘oæIt's˜kno¸èwn“to˜bGeha•¸èv“e–PRwrongly˜with“sev¸èeral˜loGcale“settings.ަT‘ÿ*¸ry–þsetting“the“shell“v‘ÿqÐariable›þLANG‘ýÝto“a“safe˜v‘ÿqÐalue,‘(Be.g.–l8"C".“The˜bug–þis“kno¸èwn“and“xed“(“Ãbug‘/#1257ަïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://bugs.motifzone.net/show_bug.cgi?id=1257ï color popŸù¨ïps:SDict begin H.R endŽï¶ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://bugs.motifzone.net/show_bug.cgi?id=1257) >>/Subtype /Link H.B /ANN pdfmark endï color pop–U ¹).‘q€Nag“yš¸èour“v˜endor“to“apply“the“patc˜h.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.10) cvn /DEST pdfmark endŸ ’Å5.10Ž‘%}¨File–¸selection“dialogs“are“un usable.Ž¡¹It–U happšGens“with“Op˜enMotif“2.2“and“some“lo˜cale“settings.‘q€See“the“previous“en¸ètry“for“a“remedy‘ÿ*¸.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.11) cvn /DEST pdfmark endŸ.ÂÅ5.11Ž‘%}¨All–|Æof›|Çthe“text˜in“the˜men us“and˜dialog“b_úo xes˜are“represen ted˜as“squares.Ž¡¹This–1¯happšGens‘1°when“a“Unico˜de‘1°fonš¸èt“is“pic˜k˜ed‘1°b˜y“the“X/Motif–1°and,‘8Åfor“a–1¯reason,‘8Æis“treated‘1°as“a“w˜c˜har‘1°one“(soަyš¸èou–U see“one“"square"“glyph“for“ev˜ery“t˜w˜o“c˜hars).‘q€T‘ÿ*¸ry“dieren˜t“fon˜t“settings;“for“starters,“runŽŸ æ‰ffÕÁGŸ ¨ïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘+å:Ðxmgrace–¹N-xrm“"XMgrace*fontList:fixed"ŽŸ Š=žff‰ffÕÁGŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.12) cvn /DEST pdfmark endŸ r¬Å5.12Ž‘%}¨On–ATF‘þàedora›ASCore“4,‘q»all“set˜selectors“collapse“in to˜a“single“of“ev en˜a“zero-ŽŸõ‘%}¨heigh t–¸line“after“a“few“op_úerations.Ž¡¹Fš¸èC4–é€uses‘éa“BET‘ÿ*¸A‘éYv˜ersion“of›éOpGenMotif“2.3˜(see“Help/AbGout).‘.ŸThe˜bug“is˜kno¸èwn“and˜xed“(˜Ãbug‘1#1331ަïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://bugs.motifzone.net/show_bug.cgi?id=1331ï color popŸù¨ïps:SDict begin H.R endŽï¶ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://bugs.motifzone.net/show_bug.cgi?id=1331) >>/Subtype /Link H.B /ANN pdfmark endï color pop–U ¹).‘q€Ask“F‘ÿ*¸edora“folks“to“apply“the“patc¸èh.ŽŸ®ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.6) cvn /DEST pdfmark endŸ/îÁ6Ž‘ÁBasic‘G\ConceptsŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.1) cvn /DEST pdfmark endŸSËÅ6.1Ž‘¾What–¸is“a“pro‘¿ôject?Ž¡¹A–U pro‘Ž0ject“is“a“le“whicš¸èh“con˜tains“all“information“necessary“to“restore“a“plot“created“b˜y“Grace.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹‰ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.15) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹15Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.2) cvn /DEST pdfmark endŸ Å6.2Ž‘¾What–¸is“a“parameter“le?Ž©Mª¹A‘•parameter–²le›±con¸ètains“informations˜abGout“settings.‘º5Ev•¸èery˜batc“h–²command˜of“Grace˜is“a˜v‘ÿqÐalid“line˜in“aޤ ®parameter–Þ2le.‘ ¸A‘Þparameter“le›Þ3is“essen¸ètially˜a“pro‘Ž0ject“le˜without“sets˜in“a˜slighš¸ètly“dieren˜t‘Þ3format“(i.e.Ž¡without–U leading“¿@¹s).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.3) cvn /DEST pdfmark endŸ ’Å6.3Ž‘¾Whic h–¸data“formats“do_úes“Grace“recognize?ަ¹Y‘ÿ*¸ou–jcan“read›jŽin“sev¸èeral“kinds“of“les˜where“data“is“arranged“in“columns˜separated“b¸èy“spaces“or“tabs.‘±ÌLinesŽ¡bGeginning–U with“"#"“are“ignored.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.4) cvn /DEST pdfmark endŸ.ÂÅ6.4Ž‘¾What–¸is“blo_úc k“data?ަ¹The–£option“¿Read–?¬Block“Data–£¹can›£bGe“used“to“read“in“les˜where“the“v‘ÿqÐalues“are“organized“in˜columns.‘[VY‘ÿ*¸ouŽ¡can›6ÿin•¸èteractiv“ely–7select˜the“t¸èypGe˜of“set˜to˜bGe“created˜and“whic¸èh˜columns“should˜bGe˜used.‘gvRefer˜to“the˜User'sŽ¡Guide–U (question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.5) cvn /DEST pdfmark endŸ ’Å6.5Ž‘¾What–¸is“the“NXY“data“t yp_úe?ަ¹Strictly–7spGeaking,›= it's“not“a‘7data“format.‘gxRather,˜yš¸èou“ma˜y“w˜an˜t›7to“use“the˜relev‘ÿqÐan¸èt“command“line˜switc¸èh“toŽ¡read–i4in›i5a“bloGc¸èk˜data“le“and˜automatically“assign˜the“data“columns˜to“sets“of˜the“XY‘i/t¸èypGe˜so“that˜the“rstŽ¡column–w×of›wØthe“bloGc¸èk˜data“is˜used“as˜X‘wÎfor˜all“the˜sets“and˜the“rest˜of“the˜data“columns˜are“assigned˜to“Y's.Ž¡Refer–U to“the“User's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.6) cvn /DEST pdfmark endŸ ’Å6.6Ž‘¾What–¸is“the“Julian“Date?ަ¹The–…Julian“Date,‘‘not“to›…bGe“confused“with“the“Julian˜calendar,‘‘is˜a“format“to“represen¸èt“the“time˜in“a“singleŽ¡n•¸èum“bGer.‘Julian–vDate“0›uis“a“da•¸èy˜w“a“y–vin“the˜past,‘›Œnamely˜the“1st“Jan¸èuary˜4713“bGefore“Christ“(don't˜ask“meŽ¡wh•¸èy).‘€îThe›ïfollo“wing˜da“ys‘ðare˜n“um“bGered˜sequen“tially‘ÿ*¸,‘0ãeac“h‘ðda“y˜starting˜at–ðnošGon.‘€íThis“n•¸èum“b˜ering‘ïsc“hemeŽ¡is–Œåin›Œäwide“use,‘šÖespGecially“in“astronom¸èy‘ÿ*¸,‘šÕand“is“used“for˜the“inš¸èternal“represen˜tation“of‘Œädates“in“Grace.‘ÎSomeŽ¡further–U explanations“are“giv¸èen“onޤؼÃthis‘“°p‘ÿ}/age–U ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://en.wikipedia.org/wiki/Julian_dayï color popŸù¨ïps:SDict begin H.R endŽï¯ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://en.wikipedia.org/wiki/Julian_day) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹.Ž¡The–U ¿convcal“¹utilit¸èy“in“¿$GRACE_HOME/auxiliary/“¹can“bšGe“used“for“ab˜out“anš¸èy“to“Julian“date“con˜v˜ertion.ŽŸI–ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.7) cvn /DEST pdfmark endŸwÁ7Ž‘ÁUsing‘G\GraceŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.1) cvn /DEST pdfmark endŸSËÅ7.1Ž‘¾Ho w–¸do“I“start“Grace?ަ¹There–3$are“three›3#w•¸èa“ys–3$to“in•¸èv“ok“e–3$Grace.‘ ‹The“full-featured“GUI-based“v¸èersion˜is“called“¿xmgrace¹.‘ ‹A‘2ëbatc¸èh-ޤ ®prin•¸èting›iív“ersion˜is˜called˜¿gracebat‘iì¹(see˜question˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.2) cvn H.B /ANN pdfmark endï color pop˜(Gracebat)).‘¯çA‘içcommand-line˜in“terface˜moGde˜is˜calledŽ¡¿grace¹.ŽŸؼAll–U three“of“them“are“usually“loGcated“in“¿$GRACE_HOME/bin/¹.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹%xïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.16) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹16Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.2) cvn /DEST pdfmark endŸ Å7.2Ž‘¾Where–¸is“gracebat?‘ÿ Hoš w“do_úes“batc˜h“prin˜ting“w˜ork?ŽŸMª¿gracebat–ݼ¹is“simply“a›ݽcop¸èy“of“Grace“named“¿gracebat“¹or˜a“sym¸èbGolic“link“from“¿gracebat“¹to“Grace.‘ UIn“theŽ© ®case–U of“the“sym¸èbGolic“link:ޤؼ¿ln–?¬-s“xmgrace“gracebatŽ¡¹done–½swherevš¸èer“the“Grace“binary“is“loGcated“will“do“the“tric˜k“(rehash“or“logout“and“login“to“mak˜e“sure“thatަ¿gracebat–R}¹sho¸èws›R|up“in˜y¸èour“path).‘pŸExecuting˜¿gracebat“¹with˜no“command˜line“parameters˜or“data˜les“willަproGduce–U a“hardcopš¸èy“on“the“default“prin˜ter.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.3) cvn /DEST pdfmark endŸ.ÂÅ7.3Ž‘¾Ho w–¸can“I“customize“the“default“app_úearance“of“Grace?ޤMª¹There–òbare‘òasevš¸èeral“w˜a˜ys:‘¬the“init‘òales,–²X‘ò9Resources,“and–òben˜vironmen˜t“(shell)›òav‘ÿqÐariables.‘IEPlease“refer˜to“theަUser's–U Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User“Guide))“for“details.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.4) cvn /DEST pdfmark endŸ ’Å7.4Ž‘¾Whic• h›¸en“vironmen“t˜v‘ÿ@ ariables˜do_úes˜Grace˜use?Ž¡¹There–>are›?few,‘(lthe“most˜impšGortan¸èt“b˜eing›?¿GRACE_HOME¹.“It˜spGecies“the˜directory“where˜the“Grace˜les“(fon¸èts,ަdoGcs,–U libs,“...)›q€are“stored.˜Default“is“¿/usr/local/grace¹.ޤؼY‘ÿ*¸ou–U can“set“en•¸èvironmen“t–U v‘ÿqÐariables“using“(e.g.):Ž¡¿export‘?¬GRACE_HOME="/usr/local/grace"Ž¡¹in–U bash“and“sh“orŽ¡¿setenv–?¬GRACE_HOME“"/usr/local/grace"Ž¡¹in–U tcsh“and“csh.Ž¡Please–U refer“to“the“User's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User“Guide))“for“description“of“all“relev›ÿqÐan¸èt“v˜ariables.Ž©}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.5) cvn /DEST pdfmark endŸ ’Å7.5Ž‘¾What–¸command“line“options“do_úes“Grace“recognize?ŽŸMª¹Quite–U a“few.‘q€Y‘ÿ*¸ou“can“displa¸èy“them“with“¿xmgrace‘?¬-help¹.Ž¡Or›U c•¸èhec“k˜for˜the˜man˜page˜xmgrace(1).‘q€Ho“w“ev“er˜it˜ma“y˜not˜alw“a“ys˜bGe˜up-to-date.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.6) cvn /DEST pdfmark endŸ ’Å7.6Ž‘¾Can–uone“cš hange“the“colour“selecton‘u‘for“the“men˜u,–w˜loš_úcator,“to˜ol,“and‘ustatusŽŸõ‘¾bars,–¸and“all“the“p_úopup“men us?ŽŸMª¹As–1öwith›1õan¸èy“X‘1ìapplication,‘8þuse“the˜"-bg“µ<¹colornameµ>“¹-fg˜µ<¹another_colornameµ>¹"“command˜line“ags.‘eÇOr,ŽŸ ®dene–U the“relev‘ÿqÐan¸èt“X“resources:ŽŸ´åïcolor push Black‘ï color popŽ‘ïcolor push Blackï color popŽŽ‘ÐXMgrace*foreground:‘¹N...ŽŸ Š=‘XMgrace*background:‘¹N...ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹:ƒïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.17) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹17Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.7) cvn /DEST pdfmark endŸ Å7.7Ž‘¾What–¸dieren t“kinds“of“sets“can“Grace“plot?ޤMª¹The–ístandard›ìset“is˜the“regular“(x,y)˜set,‘*but“there“are˜others“including˜error“bars“or˜descriptiv¸èe“strings.‘VoSeeŽ© ®the–U User's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.8) cvn /DEST pdfmark endŸ ’Å7.8Ž‘¾I'd–ålikš e“to“plot‘ædata“against“an“axis“on“the“righ˜t“(top)‘æand“another“data“setŽŸõ‘¾in–¸a“dieren t“scale“against“an“axis“on“the“left“(b_úottom)Ž¡¹Use›.Ët•¸èw“o˜o“v“erla“ying˜graphs,–6vone˜with˜a‘.Ìscale˜on˜the˜left(bGottom),“the˜other˜one˜on˜the‘.Ìrigh•¸èt˜(top).‘d¹Th“us˜y“ouަcan›™ac•¸èhiev“e˜the‘™desired˜eect,‘ªbut˜y“ou'll˜need˜to˜pa“y‘™close˜atten“tion˜to˜whic“h˜graph˜is‘™the˜'curren“t'˜graph.ަThis–U is“also“hoš¸èw“to“displa˜y“a“second“scale“on“the“top“(righ˜t)“side“of“the“graph.ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.9) cvn /DEST pdfmark endŸ ’Å7.9Ž‘¾Ho w–¸do“I“do“p_úolar“plots?Ž¡¹The–%ËsuppšGort‘%Ìfor“p˜olar“plots‘%Ìis“curren¸ètly“b˜eing“implemenš¸èted,‘Y÷so“y˜ou“can“exp•Gect›%Ìp“olar–%Ëplots“to˜w¸èork“soGon.ަThe›þap•Golar‘þ`co“ordinates˜can˜b“e˜selected–þ`from˜the˜¿"Plot/Graph‘?¬Appearance"“¹men¸èu.‘T–Please˜refer˜to“the˜User'sަGuide–U (question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User“Guide))“for“details.ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.10) cvn /DEST pdfmark endŸ ’Å7.10Ž‘%}¨Can–¯AI‘¯ use“dierenš t“fon˜ts,‘Øòsym˜b_úols,–Øófon˜t›¯@size,“or˜sub/sup_úerscripts–¯Ain“Grace?Ž¡¹Y‘ÿ*¸es,‘Y¯Grace–XÅhas›XÆall“these˜features.‘|pWherevš¸èer“y˜ou‘XÆcan“t˜ypGe›XÆa“text˜in“Grace,–Y¯e.g.‘|pAxis˜labGels,“graph‘XÅtitle,“textަfrom–*¿Plot-µ>¿Drawing‘?¬objects¹,‘Áetc.,‘Ây¸èou›)can“use“all“those˜features“within“the“same˜text.‘W„Please˜refer“to“theަUser–U Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.11) cvn /DEST pdfmark endŸ ’Å7.11Ž‘%}¨Ho w–¸do“I“proš_úduce“sp˜ecial“c haracters“(Umlauts)“with“Grace?Ž¡¹If›¿4y•¸èou‘¿5ask“ed˜this˜question,‘Ùºthen˜y“ou˜are–¿5probably˜familiar˜with“the˜issue˜of“k¸èeymap˜moGdifying˜in“X.˜Onceަyš¸èou–Ncongured“the“k˜ey‘Nmapping“(with“the“use“of“¿xmodmap¹),‘Oyy˜ou“can“en˜ter“the‘Nextended“c˜haracters“from“theަk•¸èeybGoard›û"in‘û!an“y˜text˜input–û!eld.‘SIf,› "in“addition,˜the“appropriate–û"for“yš¸èour‘û!language“fon˜t“encoGding‘û!is“an˜ythingަbut–ÌISO‘ËõLatin1“(used›Ìin“most˜W‘ÿ*¸estern“EuropGe“coun•¸ètries),‘éÑy“ou'll‘Ìha“v“e˜to–Ìtell˜Grace“so.‘Ö]See“the˜ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.12ï color popŸù•¼ïps:SDict begin H.R endŽï€ps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.12) cvn H.B /ANN pdfmark endï color pop“(nextަquestion).ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.12) cvn /DEST pdfmark endŸ ’Å7.12Ž‘%}¨Can–¸I“use“mš y“o˜wn“fon˜ts“and/or“enco_údings?Ž¡¹Y‘ÿ*¸es.‘ÊStarting– 8with‘ 9vš¸èersion“5.0.1,‘6?y˜ou“can– 9use“y˜our‘ 8o˜wn“fon˜ts,‘6>in“addition› 8to“the˜standard“14˜fonš¸èts“whic˜hަinclude‘ÂîTimes-Roman,–bHelvš¸èetica,“Courier,‘aSym˜bGols›Âïand–ÂîZapf“Dingbats“and“come˜with“Grace,‘band“as“aަreplacemenš¸èt–<¢for“the“default“fon˜ts“(for“the‘<¡purpšGorse“of“lo˜calization).‘iVAs“wš¸èell,‘Aˆan“alternativ˜e“encoGding“sc˜hemeަcan–U bšGe“sp˜ecied.Ž©ؼPlease–U refer“to“the“User's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸK ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.13) cvn /DEST pdfmark endŸ ’Å7.13Ž‘%}¨A• t›^„whic“h˜precision˜is˜n“umerical˜data˜sa“v“ed?‘ôHo“w˜can˜I‘^{set˜the˜precision?Ž¡¹By–U default,“n•¸èum“bGers–U are“sa•¸èv“ed–U with“eighš¸èt“v‘ÿqÐalid“digits.‘q€T‘ÿ*¸o“set“y˜our“o˜wn“precision,“use“the“commandަ¿DEFAULT–?¬SFORMAT“formatstringŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹J4ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.18) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹18Ž’ÕÁGï color popŽŽ £n ýˆ.\in–.âan›.áinit“resource˜le“(see˜question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 17.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.7.3) cvn H.B /ANN pdfmark endï color pop˜(Customization))“with˜formatstring“bGeing˜in“the˜¿printf(3)“¹format.ŽŸؼAs›Riw•¸èell,‘Rôy“ou–Rhcan˜set˜the˜precision˜on“a˜pGer-pro‘Ž0ject˜basis.‘p˜When˜y•¸èou˜sa“v“e˜a–Rhpro‘Ž0ject˜for˜the˜rst“time˜(or˜useŽ© ®"File/Sa•¸èv“e–U as"),“there“is“a“relev‘ÿqÐanš¸èt“"Data“format"“eld“in“the“pGopup“y˜ou“are“presen˜ted“with.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.14) cvn /DEST pdfmark endŸ ’Å7.14Ž‘%}¨When›põI‘pðsa• v“e˜a–pôpro‘¿ôject˜and“then˜re-op_úen“it,‘séthe“Julian˜date“v‘ÿ@ alues˜app_úearŽŸõ‘%}¨to–¸b_úe“rounded“to“the“nearest“half“da y‘þà.ޤMª¹F‘ÿ*¸or–U time“plots,“the“default“precision“maš¸èy“bGe“insucien˜t.‘q€See“the“previous“question“on“ho˜w“to“alter“it.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.15) cvn /DEST pdfmark endŸ.ÂÅ7.15Ž‘%}¨Hoš w–¸do“I“read“in“pro‘¿ôject“les“created“b˜y“Xmgr?Ž¡¹F‘ÿ*¸rom–HÞXmgr-4.1.2“on,‘KReacš¸èh‘HÝpro‘Ž0ject“le“starts“with“a“string“giving“the“v˜ersion“n˜um˜bGer“b˜y“whic˜h“is“w˜as“sa˜v˜ed.ަThese–ðÃles›ðÄshould“cause˜no“problems.‘P Y‘ÿ*¸ou˜can“moGdify˜older“les˜b¸èy“inserting˜a“v¸èersion˜line“at˜the“bGeginning.ަF‘ÿ*¸or–ˆòexample,‘•æ¿@VERSION‘?¬40102›ˆñ¹stands“for˜vš¸èersion“4.1.2.‘ õIf“y˜ou‘ˆñha˜v˜e“no‘ˆñidea“what“v˜ersion›ˆñof“Xmgr˜y¸èour“leަw¸èas–3Ìcreated›3Íwith,‘:wtry“some.‘fdIn˜most“cases,‘:w40102“w¸èould˜do“the˜tric•¸èk.‘fdAlso,‘:vmak“e˜sure–3Ìto˜read“the˜"Xmgr“toަGrace–U migration"“section“of“the“User's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide)).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.16) cvn /DEST pdfmark endŸ ’Å7.16Ž‘%}¨I–¸can't“op_úen“anš ymore“pro‘¿ôject“les“sa˜v˜ed“with“an“old“v˜ersion“of“Xmgr.Ž¡¹In–› Xmgr-4.1.0,‘¬…suppGort›› for“the“binary˜le“format“(the˜former“default“one)˜wš¸èas“droppGed.‘C?Y‘ÿ*¸ou“m˜ust‘› use“theަ¿grconvert–|¹utilit¸èy›|supplied“with“the“Grace˜distribution“in“order“to˜con•¸èv“ert–|the“les.‘ædThis“can˜easily“bGeަac•¸èhiev“ed–U dening“an“input“lter“likš¸èe“in“the“¿gracerc“¹sample“le“whic˜h“comes“with“Grace.ŽŸ6ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.17) cvn /DEST pdfmark endŸçªÅ7.17Ž‘%}¨When–*¯I‘*šload“a“pro‘¿ôject“sa• v“ed–*¯with“an“earlier‘*°v ersion“of“Xmgr“(É<Å4.0),‘;±sym-ŽŸõ‘%}¨b_úols–¸of“all“(some)“sets“are“draš wn“in“blac˜k.Ž¡¹Makš¸èe–U sure“y˜ou“added“a“v‘ÿqÐalid“¿@VERSION‘?¬versionid“¹line“to“the“bGeginning“of“the“le.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.18) cvn /DEST pdfmark endŸ.ÂÅ7.18Ž‘%}¨Hoš w–¸do“I“sa˜v˜e“disk“space?‘ÿ Can“I“use“compressed“pro‘¿ôject“les?Ž¡¹Y–ÿ*¸es.‘ÈýY“ou–ÇŸcan“use“yš¸èour“fa˜v˜orite“compression“program“(e.g.‘Èþ`gzip')“as“input“or“output“lter“so“that“les“onަdisk–U are“automagically“(de)compressed.‘q€Just“add“the“linesޤؼ¿DEFINE–?¬IFILTER“"gzip“-dc“%s"“PATTERN“"*.gz"Ž¡¹andŽ¡¿DEFINE–?¬OFILTER“"gzip“-“µ>“¿%s"“PATTERN“"*.gz"Ž¡¹in•¸èto›ŽÃy“our–ŽÄpGersonal˜grace“init˜le.‘kThen,‘,evš¸èerytime“y˜ou›ŽÃspGecify“a˜le“name˜that“ends˜with“¿.gz¹,‘,gzip“is˜usedަas–ÉÙinput›ÉÚand“output˜lters.‘ϬY‘ÿ*¸ou˜can“use˜this“mec¸èhanism˜to“do˜other“things,‘çe.g.‘Ï­reading“and˜storing“lesަin¸èto–U a“database.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.19) cvn /DEST pdfmark endŸ jÅ7.19Ž‘%}¨Can–¸I“imp_úort“bitmap“graphics“in to“Grace?ŽŸMª¹W‘ÿ*¸ell,–U not“y¸èet.‘q€The“impšGort“of“images“will“b˜e“implemen¸èted“in“a“future“release.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹a¼ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.19) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹19Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.20) cvn /DEST pdfmark endŸ Å7.20Ž‘%}¨Can–¸I“exp_úort“Grace“graphs“to“GIFÌjÅTIFFÌj“ÅP ostScriptÌjÅPDF“etc?ŽŸMª¹P•¸èostScript›%Š(for‘%‰prin“ting),‘/EPS‘%}(encapsulated˜P“ostScript;‘5gfor–%‰the˜inclusion˜of˜graphics“in¸èto˜e.g.‘a£LaT‘ÿ*¸eX‘%~doGcu-ޤ ®men¸èts),‘}PNM–ò»(PBM/PGM/PPM),›òÕMIF“(for–òÔinclusion“in˜F‘ÿ*¸rameMakš¸èer)“and“SV˜G‘ò¼(Scalable“V‘ÿ*¸ector“Graphics)Ž¡are–U implemenš¸èted“b˜y“default.Ž©ؼA¸èdditionally‘ÿ*¸,‘èif›ʯsome–ʰextra“libraries˜are“installed,‘èlisted˜in“the“User's˜Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop˜(User's“Guide)),Ž¡the–U JPEG,“PNG,“and“PDF“bac•¸èk“ends–U will“bGe“built“as“w¸èell.ަY‘ÿ*¸ou–U can“get“v‘ÿqÐarious“other“formats“using“netpbm“and“pstoGedit.ަBitmaps:‘ 7Using–){the“PNM‘%ëdevice“+“the›)|¿netpbm“¹utils“(a¸èv‘ÿqÐailable˜at“e.g.Ž¡ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿ftp://ftp.x.org/contrib/utilities/ï color popŸù¨ïps:SDict begin H.R endŽïªps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (ftp://ftp.x.org/contrib/utilities/) >>/Subtype /Link H.B /ANN pdfmark endï color pop–«§¹one“can“get“TIFF,›«¨GIF,“G3,‘AHBMP‘ÿ*¸,˜PCX,...‘ u(con•¸èv“ersion‘«§canŽ¡bGe–U done“on“the“y“with“appropriate“lter“denitions).ަNotice–¶Xthat›¶Ythe“direct“suppGort˜of“the“GIF‘¶?format˜is“impGossible“due˜to“the“cop•¸èyrigh“t˜pGolicy–¶Xof“Unisys˜-“it'sŽ¡not–ð“a“tecš¸èhnical“problem.‘CÚIn“fact“it“w˜as‘ð”suppGorted“in“earlier“v˜ersions“but“to“a˜v˜oid‘ð”an˜y“legal“problems“thisŽ¡feature–U has“bGeen“remo•¸èv“ed.ަOne–lAcan›lBuse“Ãpsto–ÿ}/e“dit–lAïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.geocities.com/SiliconValley/Network/1958/pstoedit/ï color popŸù¨ïps:SDict begin H.R endŽïÅps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.geocities.com/SiliconValley/Network/1958/pstoedit/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹to˜con•¸èv“ert‘lAPSŽ¡to–Ù•a“lot›Ù–of“other“v¸èector“formats:‘3»MIF,“CGM,“xg's,‘òKtgif‘Ç's,‘òJWindoze“and“OS/2˜metales,...‘HRevš¸èen“Ja˜v‘ÿqÐa“applets!ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.21) cvn /DEST pdfmark endŸ ’Å7.21Ž‘%}¨Where›¸ha• v“e˜all˜the˜region˜op_úerations˜gone˜to?Ž©Mª¹Region›B¡opGerations‘B ha•¸èv“e˜no˜meaning˜b“y‘B themselv“es.‘kVRegions˜are–B restriction˜conditions˜applied˜to“data˜set(s)Ž¡whic¸èh–;Ja“transformation‘;Kis“pšGerformed“on.‘#ÿF‘ÿ*¸or“example,‘tÕto“kill“data“p˜oin¸èts“in‘;Ka“region,‘tÕuse“"Ev‘ÿqÐaluate“ex-Ž¡pression",‘îàselect›œìsame–œísource“and˜dest“set(s),‘îßlea•¸èv“e–œíthe“"form¸èula"˜eld“empt•¸èy‘ÿ*¸,‘îàselect˜y“our–œíregion˜in“theŽ¡"Restriction"–U menš¸èu,“c˜hec˜k“"Negated".ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.22) cvn /DEST pdfmark endŸ.ÂÅ7.22Ž‘%}¨Ho w–¸can“I“input“data“in“date/time“formats?ަ¹Y‘ÿ*¸ou–ßjcan“use›ßksev¸èeral“date/time“formats“in“input˜data“les.‘^Mak•¸èe˜sure,‘üho“w“ev“er,‘ýthat–ßjthe˜time“elds“don'tŽ¡con¸ètain–U space“separators“inside,“e.g.‘q€1999-12-31-23:59:59.5ŽŸؼAlso,‘Ü)y¸èou–Á(can›Á'use“an“external˜program“to˜con•¸èv“ert–Á(the˜data“in¸èto˜the“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 16.6ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.6.6) cvn H.B /ANN pdfmark endï color pop˜(Julian“Date)˜format,‘Ü*lik¸èe˜the“oneŽ¡(con•¸èv“cal)–U that“is“supplied“with“Grace.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.23) cvn /DEST pdfmark endŸ ’Å7.23Ž‘%}¨Hoš w–¸do“I“set“the“bac˜kground“color“of“a“plot,“outside“of“the“graph“frame?ަ¹This–U can“bšGe“done“using“the“¿"Plot/Plot‘?¬appearance"“¹p˜opup.ŽŸؼThis–U cš¸èhanges“the“bac˜kground“of“the“en˜tire“can˜v‘ÿqÐas,“not“only“the“bac˜kground“of“graphs.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.24) cvn /DEST pdfmark endŸ.ÂÅ7.24Ž‘%}¨Ho w–¸do“I“use“more“than“16“colors“for“ob‘¿ôjects/lines“in“Grace?ަ¹Y‘ÿ*¸ou–U maš¸èy“edit“y˜our“Default.agr“le“in“¿$GRACE_HOME/templates¹.‘q€Just“add“lines“similar“toŽŸؼ‘ûïcolor push Blackï color popŽŽ–?¬¿@map“color“2“to“(255,“0,“0),“"red"ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹u?ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.20) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹20Ž’ÕÁGï color popŽŽ £n ýˆ.\dening–]üa›]ýR¸èGB‘]¸v‘ÿqÐalue“and“an“according˜name“for“that“color˜triplet.‘ŒPlease“notice“that“altering˜colors“0ޤ ®(white)–U and“1“(blac¸èk)“is“strongly“discouraged.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.25) cvn /DEST pdfmark endŸ ’Å7.25Ž‘%}¨Ho w–¸can“I“use“pip_úes“with“Grace?ŽŸMª¹A–U named“pipGe“is“a“pseudo“le“to“whicš¸èh“one“application“writes“data“whic˜h“another“one“reads“from“it.Ž©ؼApplications–ý9likš¸èe“measuremen˜t›ý:programs“can“write“data˜to“a“pipGe“and˜makš¸èe“it“th˜us“a˜v‘ÿqÐailable‘ý:to“Grace“whic˜hŽ¡reads–U from“the“pipGe.‘q€So“Grace“can“servš¸èe“as“data“displa˜y˜er“for“otherwise“non-graphical“programs.ަRefer–üeto“the›üfUser's“Guide“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))˜or“the“tutorials“(question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.3ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.3) cvn H.B /ANN pdfmark endï color pop˜(T‘ÿ*¸utorials))“for“furtherŽ¡information.ަOne–U example“for“using“pipGes“is“included“in“the“¿`make‘?¬tests'“¹slide“sho¸èw.ޤïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.26) cvn /DEST pdfmark end©.ÂÅ7.26Ž‘%}¨Is–. it“p_úossible“to“makš e“Grace‘. starting“with“a“completely“empt˜y“can˜v‘ÿ@ as,ŽŸõ‘%}¨un til–¸the“commands“are“loaded“and“executed?ŽŸMª¹Start–U Grace“with“-pšGexec“"G0“OFF"“or“load“a“parameter“le“with“the“ab˜o•¸èv“e‘U command.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.27) cvn /DEST pdfmark end¦Å7.27Ž‘%}¨When–AdI‘A1include“an›AcEPS‘A2le“generated˜b y“Grace˜inš to“m˜y‘Ac(La)T‘þàeX‘A2do_úcu-ŽŸõ‘%}¨men t,–¸the“graphic“hides“some“of“the“surrounding“text.Ž©Mª¹LaT‘ÿ*¸eX›­\doGes–­snot“do“hard“clipping“of“EPS˜les“unless“instructed“to‘­rdo“so.‘zyUse“¸n¹includegraphics*¸f¹lename¸gޤ ®¹and–"MNOT‘!•¸n¹includegraphics¸f¹lename¸g“¹(pac¸èk‘ÿqÐage›"N¿graphics¹)“or˜¸n¹includegraphics[clip]¸f¹lename¸g“¹(pac¸èk‘ÿqÐageŽ¡¿graphicx¹).‘¨If–)using›*the“¿epsf˜¹pac•¸èk‘ÿqÐage,‘Alremem“bGer–)to˜include“the˜¸n¹epsfclipGon“ag˜(but“note˜that“the˜¿epsfŽ¡¹pacš¸èk‘ÿqÐage–U is“obsolet“and“buggy“and“not“main˜tained“b˜y“the“LaT‘ÿ*¸eX“team“and“in“general“should“not“bGe“used).ŽŸؼThe–Wçerasing‘Wæcomes“abšGout“b˜ecause›WæGrace“lls“the˜bac¸èkground“with“the˜page“size˜and“not“the˜bbGo¸èx“size.‘yÔTheŽ¡bac¸èkground–U lling“can“bšGe“disabled“from“the“"Plot/Plot“app˜earance"“p˜opup.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.28) cvn /DEST pdfmark endŸ ’Å7.28Ž‘%}¨Prinš ting–¸to“m˜y“old“P˜ostScript“prin˜ter“pro_úduces“an“error.ަ¹By–šdefault,‘éthe“PS‘Šdrivš¸èer“uses‘›Lev˜el“2‘›features,‘èwhile“y˜our‘›prin˜ter“ma˜y››not“bGe˜Pš¸èostScript“Lev˜el‘›2“complian˜t.Ž¡Y‘ÿ*¸ou–0ùcan“force“the“use“of“PS‘0ðLevš¸èel“1“only“features“in‘0úthe“P˜ostScript“device“setup,‘84though“output“ma˜y“bGe“notŽ¡exactly–U as“expšGected“(there“will“b˜e“no“pattern“lls,“for“example).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.29) cvn /DEST pdfmark endŸ ’Å7.29Ž‘%}¨Hoš w–¸do“I“mak˜e“a“Grace“image“t“on“a“giv˜en“pap_úer“size?ަ¹Select–U the“correct“papšGer“size“in“the“¿Device‘?¬setup“¹p˜opup.ޤؼY‘ÿ*¸ou–U can“also“try“the“command“psresize“from“theŽ¡Ãpsutils‘Bp‘ÿ}/ackage–˳ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://www.dcs.ed.ac.uk/~ajcd/psutils/ï color popŸù¨ïps:SDict begin H.R endŽï®ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://www.dcs.ed.ac.uk/~ajcd/psutils/) >>/Subtype /Link H.B /ANN pdfmark endï color pop“¹in“order“to“resize“a“Pš¸èostscript“le“generated“b˜yŽŸ ®Grace.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ŠÞïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.21) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ7.‘ñ8Using‘ÕGrace’{–¹21Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.30) cvn /DEST pdfmark endŸ Å7.30Ž‘%}¨My–ldecimal›mtic k“lab_úels˜are“systematically˜of“the“form˜e.g.‘“½0,5˜instead“ofŽŸõ‘%}¨0.5–¸(i.e.‘ÿ I“get“a“comma“instead“of“a“dot).Ž©Mª¹Y‘ÿ*¸ou're–Qusing›Qa“loGcalized“v¸èersion˜of“OS.˜Y‘ÿ*¸ou“ha•¸èv“e–Qeither˜LANG‘PÒor“LC_NUMERIC‘PÑshell“v‘ÿqÐariables“set,‘soޤ ®Grace–-½uses›-¼the“loGcale“setting˜to“proGduce“n¸èumeric˜labGels.‘ûVSet“at“least˜LC_NUMERIC›-…to“C˜or‘-¼POSIX˜toŽ¡disable–,ythis›,xbGeha¸èviour.‘÷ŠNotice“that“there˜is“nothing“spGecic˜to“Grace˜abšGout“lo˜cale.‘÷ŠEither“y•¸èou‘,xw“an“t‘,ytheŽ¡loGcalization–U or“not.‘q€Setting“bš¸èy“default“LANG“to“an˜ything“but“C/POSIX“assumes“y˜ou“do.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.31) cvn /DEST pdfmark endŸ ’Å7.31Ž‘%}¨Is–¸it“pš_úossible“to“use“the“dB“(decib˜el)“axis“scale?ަ¹In–»É"Plot/Axis›»Èprops",‘Õsenable“logarithmic“axis“scaling,‘Õrthen“go“to“the˜"Tic¸èk“labGels"“tab“of˜this“dialog,‘ÕsndŽ¡the–ÔÇ"Axis“transform"“input“eld“in›ÔÆthe“"Extra"“frame,‘ô±and“en¸èter“there“"10*log10(10*$t)"˜(w/o“quotes,‘ô±ofŽ¡course).ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.32) cvn /DEST pdfmark endŸ ’Å7.32Ž‘%}¨In–æ"Data“set‘åpropš_úerties",‘dªI‘‹don't“see“a“p˜ossibilitš y“to“view‘åthe“more“essen˜tialŽŸõ‘%}¨part–¸of“the“manš tissa;“it's“sw˜allo˜w˜ed“in“the“blac˜k“triangle.ަ¹If–b*y¸èou›b+nd“some“columns˜are“toGo“narro¸èw˜to“sho¸èw“all˜signicanš¸èt“digits,‘emy˜ou“can‘b+drag“the“v˜ertical‘b+rules“usingŽ¡Shift+Button‘U 2.ŽŸÒ¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.33) cvn /DEST pdfmark endŸK"Å7.33Ž‘%}¨When–:ymaking“use›:xof“ó&”ñÖ• ecbi1200Ñ-p–ÿO°ar“am‘PÎÅvia–:ythe“command“line˜to“set“the“parameters,ŽŸõ‘%}¨the–¸w orld“scaling“is“not“correctly“set“(it“just“auto-scales).ަ¹The›£ãÃ-p–ÿ}/ar“am‘h8¹ag˜and–£äits˜argumen¸èt˜should˜bGe˜placed˜on“the˜command˜line˜Âafter˜¹the˜data“lenames.‘]ÉAlter-Ž¡nativš¸èely‘ÿ*¸,–U disable“the“autoscale“with“Ã-autosc‘ÿ}/ale‘“°none‘o¹-“but“ÂbQÂefore“¹y˜our“data“is“read“in.ޤïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.34) cvn /DEST pdfmark endŸ.ÂÅ7.34Ž‘%}¨I‘`Nam–`—unable›`˜to“nd˜"Load“&“Ev‘ÿ@ aluate"˜whic h“I‘`Nused˜quite“a“lot˜with“Xmgr.ަ¹Use–U "Create“new-µ>¹By“formš¸èula"“from“an˜y“set“selector“pGopup“men˜u.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.35) cvn /DEST pdfmark endŸ.ÂÅ7.35Ž‘%}¨Ho w– ¢can“I‘ Šsp_úecify“a‘ ¡template“other“than“the“default“one“on“the“commandŽŸõ‘%}¨line?‘ÿ In–¸the“scripts?ަ¹T‘ÿ*¸emplate–»ªis“just“an›»«empt¸èy“(in“the“sense“that“there“are˜no“data“sets)“but“otherwise“a“v‘ÿqÐalid“pro‘Ž0ject˜le.‘¥Soޤ ®just–S…put“y•¸èour›S„fa“v“orite–S…template's“lename“as˜the“rst“argumen¸èt“on˜the“command“line.‘p÷If˜y¸èour“script“createsŽ¡sev¸èeral–U plots,“use“'new“from“"lename"'“to“initialize“a“new“pro‘Ž0ject“from“the“non-default“template.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.36) cvn /DEST pdfmark endŸ.ÂÅ7.36Ž‘%}¨Hoš w–¸can“I“sa˜v˜e“m˜y“'preferences'“options?ަ¹A‘ƒ³part–ƒ¿of“them›ƒ¾are“sa•¸èv“ed–ƒ¿with“the“pro‘Ž0ject;‘›most“of“the“rest“are“a¸èv‘ÿqÐailable˜via“command-line“options“and/orŽ¡X–U resources.‘q€A“more“homogeneous“approacš¸èh“will“bGe“implemen˜ted“in“a“future“v˜ersion.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ž6ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.22) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ8.‘ñ8Mathematics’xÃ.¹22Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.37) cvn /DEST pdfmark endŸ Å7.37Ž‘%}¨In–±´an“XY-plot“with“a“hš uge“n˜um˜bš_úer‘±µof“p˜oin ts“some“regions“b˜ecome“straigh tޤõ‘%}¨lines–èinstead“of“the“original“curv e.‘:When‘èŽI‘èrzo_úom“in“to“the“area“the“dataŽ¡‘%}¨b_úecomes–¸correctly“dra wn.ޤMª¹Enlarge–n3"Max›n2dra¸èwing“path“length"˜in“Edit/Preferences.‘¼¸Also,‘twconsider“whether˜y¸èou“really“need˜that“h¸èugeŽŸ ®n•¸èum“bšGer–U of“p˜oinš¸èts“dra˜wn“connected“b˜y“line?Ž©~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.8) cvn /DEST pdfmark endŸ¾Á8Ž‘ÁMathematicsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.8.1) cvn /DEST pdfmark endŸ jÅ8.1Ž‘¾What–¸algorithm“is“used“for“non-linear“curv e“tting?Ž¡¹It–U is“the“Lev•¸èen“bšGerg-Marquardt–U algorithm,“based“on“LMDIF“from“MINP‘ÿ*¸A¸èCK,“with“some“mo˜dications.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.9) cvn /DEST pdfmark endŸ¾Á9Ž‘ÁCommand–G\Line“IncterfaceŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.1) cvn /DEST pdfmark endŸ jÅ9.1Ž‘¾Whic• h›¸non-in“teractiv“e˜batc“h˜commands˜do_úes˜Grace˜kno“w?Ž¡¹Lots.‘·ØAlmost‘Áéev•¸èery›Áèmouseclic“k˜in˜the˜GUI‘ÁÌhas˜an‘Áéequiv‘ÿqÐalen“t˜in˜the˜batc“h˜language.‘·ÙSee˜the˜User's˜GuideŽ© ®(question–U ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 12.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.2.2) cvn H.B /ANN pdfmark endï color pop“(User's“Guide))“for“details.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.2) cvn /DEST pdfmark endŸ ’Å9.2Ž‘¾Hoš w–¸can“I“do“feature“extraction“non-in˜teractiv˜ely?Ž¡¹Currenš¸ètly–U not“at“all.‘q€This“will“bGe“implemen˜ted“in“a“later“release.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.3) cvn /DEST pdfmark endŸ.ÂÅ9.3Ž‘¾Hoš w–¸can“I“use“non-linear“ts“in“the“batc˜h“mo_úde?Ž¡¹Example–U -“makš¸èe“a“batc˜h“le“with“the“follo˜wing“commands:ޤؼ‘ûïcolor push Blackï color popŽŽ‘4|¸¿fit–?¬formula“"y“=“a0“+“a1“*“sin“(a2“+“x“*“pi“/“180)"ަ‘4|¸fit–?¬with“3“parametersަ‘4|¸fit–?¬prec“0.05ަ‘4|¸a0–?¬=“1ަ‘4|¸a0–?¬constraints“onަ‘4|¸a0min–?¬=“0ަ‘4|¸a0max–?¬=“2ަ‘4|¸a1–?¬=“1ަ‘4|¸a1–?¬constraints“offަ‘4|¸a2–?¬=“1ަ‘4|¸a2–?¬constraints“offަ‘4|¸nonlfit–?¬(s0,“100)ަ¡¹This–U assumes“that“yš¸èour“original“curv˜e“is“in“set“s0“and“that“y˜ou“w˜an˜t“to“mak˜e“100“iterations.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹¯ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.23) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ10.‘ñ8Miscellaneous’nÌV¹23Ž’ÕÁGï color popŽŽ £n ýˆ.\¿nonlfit()›ZE¹do•Gesn't‘ZFpro“duce˜an•¸èy˜plots‘ZFb“y˜itself.‘€ðIt˜only–ZFÂts¹.‘€ïI.e.,‘[at˜this“pGoin•¸èt,‘[Žy“ou–ZFcan˜use˜the“tted˜v‘ÿqÐaluesޤ ®¿A0,–?¬A1,“A2...¹:ŽŸؼPlot–U a“set,“e.g.:Ž©B]‘ûïcolor push Blackï color popŽŽ‘4|¸¿s3‘?¬onŽ¡‘4|¸s3–?¬length“s0.lengthŽ¡‘4|¸s3.x–?¬=“s0.xŽ¡‘4|¸s3.y–?¬=“a0“+“a1“*“sin“(a2“+“x“*“pi“/“180)Ž¡¦¹Use–U for“another“t“as“the“initial“v‘ÿqÐalues,“or“just“ECHO“them“(to“¿stdout¹)“with“¿ECHO‘?¬A0¹.ŽŸ79ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.4) cvn /DEST pdfmark endŸ ’Å9.4Ž‘¾Is–±mit›±np_úossible“to“call˜the“command“"POINT‘±expr,‘ýÛexpr"“with˜more“thanŽŸõ‘¾t• w“o–¸v‘ÿ@ alues,“as“needed,“for“example,“for“p_úoinš ts“in“XYD˜YD˜Y“sets?ŽŸMª¹No,–U but“yš¸èou“can“do“something“lik˜e“this“(giv˜en“the“set“t˜ypGe“w˜as“propGerly“dened):ަ‘ûïcolor push Blackï color popŽŽ‘4|¸¿S0–?¬POINT“expr,“exprŽ¡‘4|¸S0.Y1[S0.LENGTH–?¬-“1]“=“exprŽ¡‘4|¸S0.Y2[S0.LENGTH–?¬-“1]“=“exprŽ¡‘4|¸...Ž¡ŸÊÞïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section.10) cvn /DEST pdfmark endŸ¯ÆÁ10Ž‘¬%MiscellaneousŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.1) cvn /DEST pdfmark endŸ jÅ10.1Ž‘%}¨Do_úes–¸Grace“ha• v“e–¸an“UNDO“function?Ž©Mª¹Not–>˜yš¸èet.‘iþAlthough“it‘>™w˜ould“bGe“nice‘>™to“ha˜v˜e“suc˜h›>™a“function,‘Cit“is“quite˜hard“to“implemen¸èt.‘iþW‘ÿ*¸e“can˜only“askŽ¡yš¸èou–U to“bGe“careful“with“certain“actions“and“remem˜bGer“to“¿save–?¬often“and“early“(TM)¹.ŽŸð"ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.2) cvn /DEST pdfmark endŸçªÅ10.2Ž‘%}¨Can–¸Grace“plot“3D“graphs?ަ¹No.‘q€Not–U yš¸èet,“I“should“sa˜y‘ÿ*¸.‘q€Be“patien˜t.‘q€It“ma˜y“tak˜e“quite“a“while“to“implemen˜t“it,“though.ŽŸ© ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.3) cvn /DEST pdfmark endŸ.ÂÅ10.3Ž‘%}¨Whic h–¸features“are“planned“for“the“future?ަ¹Among–µŒthe“manš¸èy‘µfeatures“planned“to“bGe“in˜troGduced›µin“the“future“are“enhancing˜the“spreadsheet-likš¸èe“fron˜tendŽ¡for–^îdataset“opGerations,›abcon¸ètour“plots,˜man•¸èy-lev“el–^îundo/redo,˜image“impGort‘^ïand“manipulations,˜a“library“forŽ¡2-w•¸èa“y›U comm“unication,˜...‘q€Then˜3D˜plots˜w“ould˜come˜:-)ŽŸ79ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.4) cvn /DEST pdfmark endŸ ’Å10.4Ž‘%}¨Are–¸there“things“that“Grace“can't“do?ަ¹Probably‘ÿ*¸.‘»›If–mÔyš¸èou“ha˜v˜e‘mÓan“idea“for“impro˜v˜emen˜t,‘tpGost“it“as›mÓa“wish“to“the˜w3toGdo“w¸èeb“page“(see˜question“ïcolor push rgb 0 0 1ïps:SDict begin H.S endïcolor push rgb 0 0 13.2ï color popŸù•¼ïps:SDict begin H.R endŽïps:SDict begin [/Color [1 0 0]/H /I/Border [0 0 0]BorderArrayPatch/Subtype /Link/Dest (subsection.3.2) cvn H.B /ANN pdfmark endï color popŽ¡(Kno¸èwn‘U Bugs)).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹½qïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.24) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÂ10.‘ñ8Miscellaneous’nÌV¹24Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.5) cvn /DEST pdfmark endŸ Å10.5Ž‘%}¨Hoš w–Oshould“Grace“b_úe‘Oac˜kno˜wledged“when“it“is“used“to‘Oprepare“a“publica-ŽŸõ‘%}¨tion?ŽŸMª¹Y‘ÿ*¸ou–A˜are›A—not“required˜to,‘<¶but“y¸èou˜if“wish,‘<µrefer“to˜the“home“page˜link“(see˜ÃGr–ÿ}/ac“e–/Êhome“p‘ÿ}/ageŽŸ ®ïcolor push rgb 0 0 1Ÿ8Àïps:SDict begin H.S endŽïcolor push rgb 0 0 1¿http://plasma-‘€gate.weizmann.ac.il/Grace/ï color popŸù¨ïps:SDict begin H.R endŽï°ps:SDict begin [/H /I/Border [0 0 0]BorderArrayPatch/Color [0 1 1]/Action << /Subtype /URI /URI (http://plasma-gate.weizmann.ac.il/Grace/) >>/Subtype /Link H.B /ANN pdfmark endï color pop‘U ¹).ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒøÌ!ƒ’À;è©K…ÕÁGó&”ñÖ• ecbi1200ó%qLË ectt0900ó!!",š cmsy10ó·ág£ cmmi12ó¥!¢N ecbx1200ó½HЃ ecti1000ó]fŒ ecbx1000ó&Lt$ffffecbx1440óqLË ectt1000óø8‹ ecsi1000ó»y&³ ecsx1000óŒ6 ecss1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ùÑßßßßgrace-5.1.23/doc/CHANGES.html0000644000076500001440000020717312032152764015147 0ustar fnevgenyusers Grace: List of changes

Grace list of changes

5.1.23

Bug fixes

* [ES] removed *86 specific optimizations (rep. #2154) * [ES] renamed RMS per cent error -> relative error (rep. #2192) * [ES] a workaround for a bug in recent Xorg not releasing grab of popup menus * [ES] accept -graphtype chart instead of bar. List possible values in the help output * [TK] fix building against png-1.5 * [SM] a grace_np fix * [ES] IsoLatin5.enc was not included in the distribution

5.1.22

Interface

* [DC] mention object type when asking for user's confirmation on delete

Parser

* [ES] added "LINCONV(set1, set2)" command - an equivalent of Transformations->Linear convolution * [ES] added "VOIGT(gamma, sigma, x)" function (rep. #2144)

Bug fixes

* [ES] in the grace_np library GraceClose() could kill all user processes if by that time the Grace subprocess has exited (rep. #2035) * [ES] certain hand-modified settings in project files might cause the GUI crash (incl. rep. #2139) * [ES] ungraceful closing of anonymous pipes could result in high CPU load

5.1.21

Functionality

* [ES] added IsoLatin5 (ISO 8859-9) encoding file * [ES] now honor locale in number stringifications (rep. #2109) * [ES] extended range of prefixes in the Engineering format up to 10^{+/-24} * [HR] added "Computing" tick label format

Interface

* [ES] added "-maxpath" command line option for setting maximal drawing path length * [ES] allow for longer legend lines

Parser

* [ES] added "KILL BLOCK" command (deallocates the memory of the current block data)

Bug fixes

* [ES] there was a misleading error message when attempting to redefine an existing variable/keyword in the parser * [ES] fixed rounding-off problem with zero labels (rep. #2098)

Portability/Compilation

* [IG] eliminated some of gcc-4.1 warnings (rep. #2111) * [IG] man page cleaned (rep. #2110)

5.1.20

Parser

* [ES] added SGN() function

Defaults

* [ES] changed default major tick spacings to 0.2

Bug fixes

* [ES] command argument "-graphtype pie" wasn't recognized (rep. #2058) * [ES] fixed openning of help documents when using an external browser * [ES] "Geometric transforms" with order: "Rotate, scale, translate" in fact was doing "Translate, scale, rotate" * [ES] Grace might crash when using "Engineering" tick label format (rep. #2094) * [ES] file selection dialog wasn't closed when fit parameters file was read in successfully

5.1.19

Functionality

* [ES] BARDY and BARDYDY sets are now allowed in XY graphs

Bug fixes

* [RL] loading a DL module could fail with an irrelevant error message (rep. #2071) * [ES] a bug in the PS driver caused CUPS to output empty page if printing accounting was enabled in foomatic (rep. #2047) * [ES] automatic data point purging (enabled when set length exceeds "Max drawing path length" in Edit/Preferences) could fail silently (rep. #2069) * [ES] the point purging could result in wrong set filling when fill to the baseline was selected * [ES] configure's option --with-helpviewer was broken (rep. #1414)

5.1.18

Parser

* [ES] implemented concatenation of quoted strings and numerical expressions

Bug fixes

* [ES] some X font configurations could make Grace crash (rep. #1436) * [ES] DEFAULT ... commands had no effect on new drawing objects (including rep. #1437) * [ES] DEFAULT CHAR SIZE had no effect on tick labels of new axes

5.1.17

Drivers

* [ES] changed default resolution of the PDF driver to 300 dpi

Documentation/Info

* [ES] minor documentation updates, including rep. #1421

Bug fixes

* [ES] with page fill disabled, the page frame line might be drawn with wrong properties * [ES] due to a bug in the Xbae widget, when a TrueType font was used, several dialogs could become unusable (including rep. #1366) * [ES] enabling patterned fills and PDF-1.4 compatibility mode could result in crash when printing to PDF

5.1.16

Interface

* [ES] set scrolling of the custom ticks/labels table to 1 row per click (rep. #1419)

Documentation/Info

* [ES] updates relevant to the status of mailing lists/forums

Portability/Compilation

* [ES] PDF driver updated to work with PDFlib-6 (rep. #1426). Minimal supported version is now 5.0

Drivers

* [ES] added option to generate PDF-1.4 format (Acrobat5). Support for PDF-1.2 (Acrobat3) removed

Bug fixes

* [ES] replaced meaningless error message issued when trying to load data with a few string columns as a single set * [ES] in the spreadsheet editor, the last entered cell's data wasn't committed (rep. #1420)

5.1.15

Functionality

* [ES] increased max number of custom tick marks/labels to 256 per a popular demand

Project files

* [ES] now using one-line format for saving graph's world and viewport settings

Defaults

* [ES] changed default external help viewer to mozilla

Documentation/Info

* [ES] misc documentation updates (including rep. #1411)

Bug fixes

* [ES] fixed crash when number of custom tick marks/labels exceeded 100 * [ES] fixed evaluation of FWHM in "Feature extraction" (old version might produce wrong results for multi-peak data) * [ES] support for loadable functions of 4 and 5 parameters, introduced in 5.1.14, was incomplete * [ES] in correlation/covariance, only the absolute value at 0 is normalized to 1, so for anti-correlation the sign is preserved

5.1.14

Interface

* [ES] use multiplication sign in formulae of regression report (rep. #1360)

Parser

* [ES] allow for DL modules to define functions of 4 and 5 parameters (rep. #1343)

Portability/Compilation

* [ES] fixed compilation under FreeBSD-5.1 and OS/X (rep. #1371)

Bug fixes

* [ES] on 64-bit platforms, when specific compiler/optimization combinations were used, some dialogs could crash randomly (e.g. rep. #1310) * [ES] on 64-bit platforms, when specific compiler/optimization combinations were used, X run-time warnings could be issued about unrecognized XKeySym's * [ES] set filling defaulted to even-odd filling rule in the X11 driver (rep. #1368) * [ES] fixed potential memory corruption * [ES] fixed page size sync in the free mode * [TO] fixed a race condition in the grace_np library

5.1.13

Functionality

* [ES] enabled annotated values for HILO sets

Parser

* [ES] added IMIN(x) and IMAX(x) functions returning index of minimal or maximal value of array x (thusly providing a way to solve reps. #1340 and #1344)

Portability/Compilation

* [ES] updates for T1lib-5.0 API (rep. #1303)

Documentation/Info

* [WB] documented commands for calculating running properties

Drivers

* [MD] enabled font kerning in the MIF driver

Bug fixes

* [ES] Grace might fail starting in the GUI mode when a certain sequence of command line arguments was passed

5.1.12

Functionality

* [MO] implemented zooming and scrolling of log plots

Parser

* [ES] added INT(x,y) evaluating integral value of y dx * [ES] added RSUM(vexpr) - running sum

Bug fixes

* [ES] fixed memory corruption when reading in block data (rep. #1258). The bug was introduced in 5.1.11 * [ES] fixed a couple of tiny memory leaks associated with loading block data * [ES] fixed crash in histogram and interpolation dialogs with multiple sets selected (rep. #1259) * [TO] signal issues with the grace_np library fixed (rep. #1270) * [ES] implied references to current graph in parser might crash Grace if the graph didn't exist (including reps. #886 and #1267) * [ES] removed extraneous accent glyphs in the 0x9? range of IsoLatin1 and IsoLatin2 encodings (including rep. #1269) * [MO] IsoLatin7 encoding file wasn't installed by "make install" * [ES] entering negative values of set symbol skip could crash Grace (rep. #1276)

5.1.11

Functionality

* [ES] hotlinks now work for all set types (rep. #572) * [ES] updating hot-linked sets now works for all graphs, not the current one only * [YZ] added encoding files for Russian codepages koi8-r and cp1251 and for Ukrainian codepage koi8-u

Interface

* [ES] use "+"/"-" instead of "shown"/"hidden" in the graph selectors

Parser

* [ES] added UPDATEALL command, equivalent of "View/Update all"

Drivers

* [ES] set resolution in the PNG output (rep. #1225)

Portability/Compilation

* [ES] updated auto* stuff to work with autoconf-2.5.* (rep. #1199)

Bug fixes

* [SR] precision used for special tick locations was insufficient (rep. #1228) * [ES] referring to "S_" in the parser with no sets in the current project crashed the app * [ES] GraceIsOpen() from the grace_np library returned true after the Grace process exited (rep. #922) * [ES] excluded .cvsignore files from source tarballs (rep. #1248) * [ES] a minor memory leak fixed (40 bytes per set import/reading in) * [ES] configure --with=f77=/absolute/path/to/f77 was broken (rep. #1243) * [ES] in XY charts, explicitly check that abscissas of all sets are the same

5.1.10

Functionality

* [MO] added IsoLatin7 encoding file

Interface

* [ES] disable showing hidden files in file selection dialogs by default and added a checkbox to alter this behaviour (Motif-2.* only) * [ES] in the spreadsheet dataset editor, set text insertion position corresponding to the mouse click location

Defaults

* [ES] changed default data format to %.8g (rep. #985)

Bug fixes

* [ES] the default GRACE_HELPVIEWER command was incompatible with Mozilla (rep. #1198) * [ES] fonts with long names (> 27 chars) could crash Grace (rep. #1200) * [ES] font antialiasing was broken for projects with more than 16 default colors defined * [ES] fonttool might crash on fonts with an invalid FontBBox entry (rep. #1202) * [ES] some font glyphs might not fit in the fonttool matrix cells, especially on low-resolution displays * [ES] canvas wasn't refreshed after a region started to be re-defined (rep. #1211) * [ES] provided workaround for a PDFlib bug, resulting, in rare cases, in wrong colorspace settings in the PDF output (rep. #1209)

5.1.9

Drivers

* [MD] implemented patterned fills in the SVG driver * [MD] better font name definitions in the SVG driver * [MD] updated SVG DTD reference

Compilation

* [PB] installed binary of convcal now gets stripped * [PB] "make install links" now works * [PB] DESTDIR introduced for building binary packages (e.g. "make DESTDIR=/tmp install links")

Bug fixes

* [SR] -(no)safe flags were missed in the -help output * [ES] some standard Xt flags (-geometry etc) were ignored (the bug was introduced in 5.1.8) * [MD] patterned fills were transparent in the PDF output * [MD] font family might be set inconsistently in the MIF driver * [ES] xmgrace was run in the safe mode when invoked from GraceOpen() via the grace_np interface (rep. #1179) * [ES] fixed 1/n error in calculation of correlation coefficient in the non-linear fit (the value was used for information purposes only). The bug was introduced in 5.1.5 * [ES] redrawing canvas in the free mode might in some cases result in modified graph viewport values (rep. #1176) * [ES] allow trailing semicolon in the batch language (rep. #1193) * [ES] some fonts couldn't be opened when running under NT4 (rep. #1186). This was a T1lib bug, in fact * [ES] the cross-covariance was wrongly calculated (rep. #1196)

5.1.8

Security

* [ES] implemented (and enabled by default) "safe" mode, in which statements of the command language which may result in file modifications are disabled. This is to prevent execution of such commands contained in potentially malicious project files acquired from untrusted sources

Functionality

* [ES] use leading zeros in axis year formats so to make up to 2 or 4 digits in total (depending on whether the two-digit year span is enabled in the project preferences)

Interface

* [ES] simplified X initialization - the resolution detection introduced in 5.1.5 prevented Grace from starting up with some buggy X servers (notably, StarNet's X-win32) (rep. #1138) * [ES] -safe/-nosafe command line options for switching the safe mode * [ES] "Run in safe mode" checkbox in "Edit/Preferences" for the same purpose * [ES] removed broken "Command" function of the hotlink popup

Drivers

* [MD] backported from 5.2 pattern fills in PDF driver (off by default) * [MD] better font definitions in the MIF driver

Portability/Compilation

* [ES] use strchr() instead of BSD-ish index() which broke compilation under newer IRIX boxes (rep. #1139) * [ES] stop with error (instead of warning as used to be) if Motif can't be found by configure

Bug fixes

* [ES] background of the canvas, if page filling was disabled, might get filled in with the last object's fill props (rep. #1152) * [ES] changing HTML viewer by setting the GRACE_HELPVIEWER shell variable might result in memory corruption (rep. #1160) * [ES] canvas wasn't refreshed after feature extraction

5.1.7

Functionality

* [ES] allow XYZ sets in polar graphs * [ES] allow defining string columns when creating sets from block data via the command line or parser, e.g. -bxy "1:2:{3}" (rep. #978) * [ES] honour symskip for all set types (it wasn't for BAR, BARDY, BARDYDY, XYHILO, XYR, XYVMAP, and BOXPLOT) * [ES] extended x-correlation routines to calculate x-covariance if desired * [ES] implemented optional snake-like matrix fill in graph arranging (rep. #1119)

Interface

* [ES] accept non-ASCII characters from nationalized keyboards

Documentation/Info

* [ES] added compile-time $(LDFLAGS) to the `-version' output

Parser

* [ES] added an extra flag to the XCOR function to switch between x-correlation/x-covariance * [ES] when accessing drawing objects by id (e.g. "WITH STRING nexpr") allocate the referenced object if necessary * [ES] added optional argument to ARRANGE command to enable snake-like graph matrix filling

Drivers

* [ES] set resolution of the X11 device from the X server props * [ES] detect max request size of the X server and set max drawing path length accordingly

Portability/Compilation

* [ES] fixed new Motif checks introduced in 5.1.6 (rep. #1107)

Bug fixes

* [ES] applying graph properties reset axis limits of polar graphs * [ES] simply ignore comments (lines beginning with '#') in data files instead of splitting the set (rep. #831) * [ES] honour symskip for error bars (rep. #936) * [ES] when enabling log axis scaling on the command line, set reasonable major/minor settings and world bounds (reps. #723, #1021) * [ES] under very rare circumstances, Grace might cause a (probably buggy) X window manager misbehave * [MD] make sure the EPS/PS output lines don't exceed 255 chars in lenth (rep. #1100)

5.1.6

Parser

! [ES] implemented region on set evaluation: REGNUM(selectset) * [ES] implemented applying region and logical restrictions to a set: RESTRICT(selectset, vexpr) and RESTRICT(selectset, REGNUM, onoff) ! [ES] implemented KILL REGNUM * [ES] added SUM(vexpr) * [ES] allow accessing array segments (e.g. x[4:10])

Portability/Compilation

* [ES] use the bundled Xbae by default to make sure we don't come across a buggy version installed * [ES] upgraded to T1lib-1.3.1, which fixed several bugs (see below) * [ES] re-wrote Motif checks; in some rare cases, Motif libraries might be misdetected * [ES] added a "My Computer" (actually, a list of drives) file selection box chdir entry for the Cygwin port * [ES] check for FFTW library version >= 2.1.3 * [ES] fixed compilation on systems without setlocale()

Bug fixes

* [ES] re-loading projects with polygon regions defined might result in memory leaks and wrong region evaluations * [ES] optimize (again) updating large pulldown selectors (rep. #1082) * [ES] axis label with "Auto" placement was misplaced/absent with tick marks and labels disabled on the respective side (rep. #1086) * [ES] in the interpolation and histogram dialogs it wasn't checked that the source and destinations sets were different (rep. #1084) * [ES] when the invert x-axis flag was turned on, pie charts were wrongly reproduced in all but screen outputs (rep. #1092) * [ES] when saving project under the same name, don't warn about file overwriting (rep. #1094) * [ES] there might be problems finding fonts under non-Unix environments (rep. #1013). This was a T1lib bug, in fact * [ES] text overlining didn't work for Symbol font (rep. #1026). This was a T1lib bug, in fact * [ES] fixed calculation of x-correlation. Previously, a broken x-covariance was calculated * [ES] lines starting with spaces weren't parsed by the command interpreter (rep. #1101)

5.1.5

Functionality

* [ES] honour X axis start value and invert flag in pie charts * [ES] extended maximum allowed line width to 20

Interface

* [ES] automatically adjust Xresources for low-resolution (800x600) displays so all dialogs fit in the screen * [ES] allow for setting via the GUI negative gaps in bar charts (rep. #1059) * [ES] allow to select font and symbol sizes up to 1000 * [ES] make the size scale controls change by 25 and angle controls by 10 when pressing Ctrl+Left/Right arrows on them

Parser

* [ES] implicitly cast to boolean double arguments used as bool

Documentation/Info

* [JS] added man page for convcal * [ES] added examples of XYCOLOR set presentation and reciprocal axis scale, contributed by Nels Dumin * [AM] include libpng, libjpeg, and libpdf versions in the `-version' and "Help/About" outputs * [ES] documented S$ and S_ special parser set names

Bug fixes

* [ES] PS output might be broken for plots containing XYCOLOR sets * [ES] when Line type:left/right stairs was selected, drawing with a dashed line of multiple short steps broke the dash pattern (rep. #1024) * [PM] the argument of --with-printcmd configure switch wasn't quoted * [ES] make result file output line-buffered instead of block-buffered * [LM] date format hint was ignored in the parser * [ES] legend and viewport dialog were not updated when moving legend or resizing graph from canvas * [ES] std. dev. was calculated using n instead of n-1 in the denominator (rep. #1042) * [ES] fixed crash under some platforms with zero width world/view coordinates (rep. #1014) * [ES] optimize updating large pulldown selectors (e.g. in the "Edit block data" popup) * [ES] fixed broken AA font rendering and potential crash when the color palette size exceeded 128 (rep. #1061)

5.1.4

Bug fixes

* [ES] reading in a project file right after printing to a raster file (PNG, JPEG,...) caused a crash (rep. #990) * [ES] in the "Sample points" dialog, even when the "log. expression" is selected, one had to input some values into start/step input fields anyway * [AM] ellpe(x) and ellpk(x) in fact returned ellpe(1-x) and ellpk(1-x), respectively (rep. #989) * [ES] "graphno OFF" merely makes the graph hidden instead of killing it

5.1.3

Interface

* [AM/ES] set icon's title = project name (rep. #957) * [ES] when switching to log scale, set major/minor tick settings to 10/9 respectively (rep. #826)

Documentation

* [ES] docs updates (including reps. #926, #965) * [EV] fixed a typo in Tutorials (rep. #916)

Parser

* [ES] added "HELP url" and "HELP" to the parser * [LM] added "AUTOSCALE ONREAD NONE|XAXES|YAXES|XYAXES" to the parser

Drivers

* [MD] produce MIF files with a textflow in which the graph is included, so it can be included in another FrameMaker document * [ES] list used fonts in %%DocumentNeededResources in the PS output (rep. #956)

Portability/Compilation

* [AM] allow to specify print command at config time * [AM] fixed problem compiling bundled Xbae (rep. #959)

Bug fixes

* [ES] fixed rounding error in calculation of pulldown menu length (rep. #929) * [RL] precision of offsets in the Axes dialog were restricted to two digits (rep. #911) * [AM/ES] double click on canvas with a pie chart might cause crash * [EV] legend entries for BARDY and BARDYDY sets weren't drawn * [MD] fixed conversion table for non-ASCII codes in the MIF driver (rep. #946) * [LM] reading in data files with floats when they were explicitly signed and positive resulted in parse error * [ES] failure to save project to a file due to wrong permissions didn't produce an error message * [ES] using non-standard fonts might crash the PDF driver * [ES] specifing a file-only output device with "-hdevice" didn't actually set the output to file (rep. #899) * [ES] the "Rescale plot on page size change" option in the "File/Print setup" dialog had no effect if the selected device was X11 * [ES] fixed (actually, just now implemented) automatic axis label placement (rep. #744) * [ES] projects with sets using symbol char from the upper half of the ASCII table weren't saved correctly * [ES] line width of drawing elements wasn't accounted for in the bbox calculations, which in rare cases resulted in a wrong EPS bbox

5.1.2

Functionality

* [DB] implemented baseline setting to the set (y) average

Interface

* [ES] don't hardcode file extensions in file selection dialogs, but define them via X resources instead (rep. #671)

Documentation

* [ES] HTML docs now include tables of contents

Parser

* [ES] added "PAGE RESIZE xdim, ydim" which sets the page dimensions of all output devices (in pp) and rescales the current plot accordingly

Drivers

* [ES] implemented font kerning in the (E)PS output * [ES] added option to choose document data (7bit/8bit/binary) for the PS driver

Portability/Compilation

* [AM] OS/2 updates

Bug fixes

* [ES] "-saveall" filename argument was ignored (rep. #841) * [ES] not enough arguments to "-world" or "-viewport" could cause crash * [ES] with "Auto redraw" disabled, several operations still caused an immediate redraw * [ES] backslashes in text strings weren't escaped in the (E)PS output * [AM] interpolating non-monotonic data by spline caused crash or meaningless results (rep. #866) * [ES] for some non-standard fonts and/or encodings, the (E)PS output might be binary while declared as 8bit clean * [ES] path in print setup * [ES] too wide pulldowns in "Edit block data" if block data contained too many columns * [ES] it was impossible using GUI to disable annotated values in the XYZ set type * [LM] creating sets with strings from block data might crash * [ES] fixed a floating point rounding bug in the polygon clipping which (in rare cases under some OS's) caused set filling be performed wrong (rep. #874) * [ES] fixed a bug in the Xbae widget crashing under a multi-head X server (rep. #878)

5.1.1

Functionality

* [ES] interpolation now takes into account all data set columns * [ES] normalized histograms can be calculated * [ES] histograms with varying bin widths - abscissas of a set can be used as the bin mesh * [EV/ES] added GraceOpenVA() function to the grace_np API * [ES] \V{} escape code in strings - baseline shift * [ES] \n escape code in strings - new line * [ES] a region can be linked only to a single graph * [UH] implemented logit axis scale

Interface

* [ES] "Edit/Locator props" popup rewritten * [ES] "Spline" popup removed * [ES] "Interpolation" popup rewritten; now includes the former "Spline" functionality * [ES] "Histograms" popup rewritten * [ES] "Arrange graphs" rewritten (including reps. #368, #592, #735) * [ES] double click on a set selector entry now pops up the SS editor * [ES] date/time format can be used in the SS editor to display/enter values * [ES] many other enhancements in the SS editor * [ES] if the XmHTML widget library is available, it will be used for displaying on-line help ("Gracilla"). The libhelp support is scheduled to be withdrawn soon * [ES] removed -[no]logwindow command line options and X resource * [ES] removed -arrange, -cols, and -rows command line options * [ES] "Results" and error message windows merged into "Console" * [ES] menubar added to the "Graph appearance" dialog * [ES] "File/Read/Sets" and "File/Write/Sets" moved to the "Data/Import" and "Data/Export" submenus, respectively * [ES] "File/Read/Parameters" and "File/Write/Parameters" moved to the "Plot" menu * [ES] renamed "File/Device setup" to "File/Print setup" and added "View/Page setup" (same dialog but with X11 as the selected device) * [ES] split axis/tick label offset input fields into two

Documentation/Info

* [WB] some fixes/additions to the User's Guide * [AM] include Xbae version in -version and "Help/About" * [DP] User's Guide additions * [EV] Tutorials updated * [AM] man page corrections * [ES] re-enabled on-line help for several dialogs

Parser

* [ES] removed restriction on the max line length (512) in parameter files * [ES] SPLINE, ASPLINE, and INTERP removed and INTERPOLATE added which includes the functionality of the former ones * [ES] added RAND(N) - creates an array of N random numbers * [ES] HISTO renamed to HISTOGRAM and syntax changed * [ES] changed syntax of ARRANGE command * [ES] removed UNLINK REGNUM FROM selectgraph; now that a region links to a single graph only the command makes no sense * [DP] added READ NXY CHRSTR for reading in data in the NXY format

Portability/Compilation

* [ES] configure checks for netCDF version * [AC] a couple of configure fixes * [AM] check for build/runtime Xbae version match * [AM] OS/2 updates * [JH] VMS updates

Bug fixes

* [ES] fixed text under/overlining in SVG * [ES] fixed dashed patterns for thick lines in SVG * [ES] a bug in interpolation caused crash under some conditions (rep. #783) * [ES] fixed overflowing of some tables in dvi output of the User's guide * [ES] fixed interpolation of reversed arrays (rep. #675) * [ES] fixed a memory leak in interpolation using splines * [ES] there was no automatic canvas refresh after performing interpolation * [ES] there was no automatic canvas refresh after changes in locator props * [ES] fixed "\\" in strings * [ES] check for positive page dims and dpi in device setup (rep. #779) * [ES] invert logics of the yesno dialog popped up if printout is truncated (rep. #778) * [JSB] text color might be wrongly set on raster devices with antialiasing off (rep. #803) * [ES] memory leak fix in the SS editor * [ES] "File/New" didn't update project description in "File/Save as" * [ES] graph operations on killed graphs result in crash (rep. #805) * [ES] drawing objects cursor remained active after closing window (rep. #807) * [ES] switching between (overlaid) graphs updated the locator bar only after pointer move (rep. #808) * [GJ] canvas didn't refresh on autoscale shortcut (rep. #809) * [ES] initial values of fit parameters with bounds set were printed wrongly in the "Results" window * [ES] disable canvas events on hidden graphs * [ES] white space at the beginning of text strings wasn't accounted in bbox calculations * [ES] fixed wrong initial canvas size in the free page mode (rep. #821) * [ES] fixed set split crash * [ES] couldn't use constant expressions in "Load & evaluate" (rep. #828) * [ES] a severe memory leak in "Load & evaluate" fixed * [ES] regions were displayed wrongly on plots with several graphs

5.1.0

Functionality

* [ES] VMAP plots implemented (rep. #440) * [ES] BOXPLOT sets re-implemented. The control over appearance details is more detailed than in Xmgr (including rep. #188) * [ES] XYSIZE sets implemented (a generalized form of "bubble" plots) * [ES] XYCOLOR sets implemented (rep. #484) * [ES] pie charts implemented ! [EV] set restrictions in "Window/Point explorer" * [ES] \#{} escape code in strings - allows to enter non-printable chars by their hex codes * [ES] \r{} escape code in strings - text rotation * [ES] \q, \Q escape codes in strings - start/stop text slanting (rep. #716) * [ES] \l{} escape code in strings - slanting text with any factor * [ES] \t{}, \T{} escape codes in strings - generic text coordinate transforms * [ES] \R{} escape code in strings - changes color inside a string (rep. #535) * [ES] \Fl, \FL escape codes in strings - start/stop ligature processing * [ES] \Fk, \FK escape codes in strings - start/stop kerning pair processing * [ES] more font encoding files added ! [ES] alternative tick labels ("transformed" axes) (rep. #93) * [ES] changed default placement of error bars to two-sided (rep. #737) * [ES] for XYBAR/XYBOXPLOT sets draw the symbols in the legend with the fixed height (of the legend text) for better readability (rep. #741) ! [ES] user-defined tick labels are no longer allowed without tick mark positions ! [ES] autoticking now alters # of minor ticks only if the current value is anomalous * [LM] allow to use 'T' as date-time separator (as recommended by ISO8601) * [ES] new fonts from GNU gs-5.50 (including the euro symbol)

Interface

! [ES] re-designed "Create by formula"; any set type can be defined ! [ES] controls for justifications of strings cover all possibilities (vertical and horizontal alignments) ! [ES] combined point ops dialogs into one, "Window/Point explorer" * [ES] print all point data (was only x, y) during point tracking * [ES] (optional) set comments in set selectors * [ES] "File/Describe" merged with "File/Save as" * [ES] reading in block data no longer resets set column selectors * [ES] implemented the color sync option in the "set app." dialog * [EV] "-barebones" command line switch (switch all tool bars off) * [ES] annotated strings can be modified in the spreadsheet editor * [ES] in "File/Device setup", introduced options to sync page size of all devices and rescale plot on page size change

Drivers

* [LM] FrameMaker MIF driver added (rep. #590) * [LM] implemented SVG driver * [ES] PS Level 1/2 option in the EPS driver * [ES] now any font encoding is correctly represented in (E)PS output * [ES] added under/overlining to the E(PS) driver (rep. #756) * [ES] PS output made a bit more compact * [ES] under/overlining now works in PDF output * [ES] PDF driver setup options: 1.2/1.3 compatibility and compression level * [ES] use "thin" lines in X11 driver if the line width <= 1 pixel * [ES] list fonts, colors and other resources in the metafile driver * [ES] don't rotate output in EPS landscape mode * [ES] optionally set hardware resolution in PS output * [ES] in PS driver, option to select input tray: auto/manual/match page dimensions

Documentation/Info

* [AM] omit a few GUI-specific flags/help strings when compiling a GUI-less exec * [EV] Tutorials updated - added a regions section and updated the create by formula * [LM] added usage help for convcal * [HS] updated instructions for Motif-2.1 bug work-around (<Ctrl>+<left mouse button> = crash) in the FAQ * [ES] re-structured the FAQ * [ES] documented numeric operators and functions

Parser

* [ES] finally, introduced variables (usual and 1D arrays)... * [ES] as a result of the above, removed scratch arrays (A, B, C, D) ! [DP] SWAP selectset AND selectset * [ES] EXIT(iexpr) * [ES] enlarged parser buffer to 4K

Portability/Compilation

* [ES] new configure options (including rep. #757) * [ES] the GRACE_HOME dir is now set by `configure' as PREFIX/grace (rep. #758) * [ES] checks for proper versions and consistency of libs and includes * [AM/ES] checks for Motif/LessTif run-time clash * [ES] the grace_np Fortran wrapper is compiled independently of whether a F77 compiler has been found * [JH] VMS updates * [AM] OS/2 updates

Bug fixes

* [ES] "duplicate graph" caused memory corruption (rep. #752) * [ES] too long text strings (>255) crashed Grace (rep. #759) * [ES] parser errors in too long lines (>255), if processed from a RTI caused crash * [ES] using very long formulae (>~100) in the non-linear fit caused memory corruption * [ES] text strings were justified by the lower edge of the bounding box instead of the baseline (rep. #710) * [ES] "-" in PS output was squeezed (rep. #711) * [RW] empty src/buildinfo.h prevented further compilation (rep. #717) * [ES] fixed \m{} in the beginning of a string * [AM] fixed reading in files with DOS <cr> * [ES] graph overlay fixes (including rep. #734) * [ES] fixed spurious error message about non-monotonic bins when calculating histograms (happened sometimes due to a rounding error) * [ES] histogramming from command file crashed (rep. #736) * [KS] the lower error bar in BARDY and BARDYDY was shadowed by bar * [ES] rescaling did not follow mouse (rep. #715) * [JM] a workaround for strange behaviour of some versions of Motif resulting in several popup windows being too big (rep. #720) * [AH] on some platforms, "make install" moved files instead of copying (rep. #743) * [AM] feature extraction didn't update set lists (rep. #731) * [ES] fixed triangle symbols (now correctly centered) * [ES] font antialising was broken on X displays with 24 bits per pixel format of pixmaps * [EV] feature extraction/FFT was incorrectly determining if the set length was a power of 2 (unimportant if FFTW was used) * [ES] upon loading a project, set print file name automatically (rep. #641) * [ES] fixed a memory leak in set sort * [ES] fixed bugs in set and point operations with sets containing annotated strings (including rep. #767) * [ES] in "Window/Results...", the vertical scrollbar was missing when compiled with Motif-2.1 * [ES] closing (by means of window manager) a dialog with file selection box in it rendered the window unusable next time it was popped up (rep. #743)

5.0.5

Functionality

! [ES] long drawing paths (of polylines and polygons) with length exceeding a threshold are transformed to be shorter than the limit; the latter is adjustable in "Edit/Preferences" popup. This works around internal restrictions of some devices, notably old X11 and PS, causing visual data point drops (rep. #634, #651)

Interface

* [ES] the "Autoscale on read" option moved back from "Edit/Preferences" to "File/Read sets" ! [ES] added "Autoscale on load" for creating sets from block data * [ES] added possibility to select target set(s) produced from a block data (rep. #87)

Documentation/Info

* [ES] added docs on adding/replacing fonts * [AM] miscellaneous FAQ updates

Portability/Compilation

* [AM] OS/2 updates * [JH] VMS updates (including rep. #681) * [ES] fixed compilation on HP/UX-11.0 * [ES] compilation outside of the source tree is now possible

Bug fixes

* [HS] fixed text string copy/edit bug (rep. #661) * [LM/ES] under some conditions, project or parameter saving caused crash (rep. #678) * [ES] quotes were not escaped in several places (append/prepend strings of tick labels, avalues etc) * [LM] setting reference date worked incorrectly since did not ignore current reference date * [ES] a Linux libc5/locale memory leak workaround (rep. #676) * [ES] a parser memory leak fixed * [ES] applied a patch to fix a nasty memory leak in the bundled T1lib * [ES] compiling GUI-less version failed (rep. #680) * [ES/HS] a workaround for bug in Motif-2.1 (<Ctrl>+<left mouse button> crashed) (rep. #685) * [OT/ES] fixed a floating point overflow, causing crashes on non-IEEE compliant FPU (rep. #689) * [AM/ES] problems with autoscale and log axis scales (rep. #325, #688) * [ES] killing set data erroneously set the "hidden" flag of the set on (rep. #691) * [ES] hidden sets were not saved (rep. #338)

5.0.4

Functionality

* [ES] nonl-fit: added region restrictions (rep. #251) * [ES] nonl-fit: added optional stat weights * [ES] print some basic statistics on the non-linear fit quality * [LM] implemented proper rounding for date/time axis formats * [ES] in PS output, issue an explicit page size selection call. This should allow to automatically choose between several input trays with different paper (for printers that have mutiple trays, of course)

Interface

* [ES] nonl-fit GUI reworked (including part of rep. #77)

Documentation/Info

* [AM] docs on building DL modules under OS/2

Parser

! [ES] extended variant of NONLFIT added: NONLFIT (selectset, vexpr, nexpr). The vexpr argument is an array of weights (of proper length)

Defaults

* [ES] the default template had the 2-digit year format enabled and the wrap year set to 1900, imitating older versions. Changed to off and 1950 respectively - should be more Y2K compliant :)

Portability/Compilation

* [ES] upgraded to T1lib-0.9.2 (fixing rep. #650) * [AM] OS/2 updates * [AM/ES] header files of the bundled Xbae and T1lib could in some cases clash with system-wide installations of respective library

Bug fixes

* [ES] strings (titles, legends,...) with only spaces in them caused crash (rep. #640) * [ES] enabling bounds for fit parameters in the non-linear fit popup crashed Grace (rep. #642) * [HF/ES] fixed bug in creating sets from block data (rep. #644) * [ES] "rawbits" PPM format was broken on big endian machines (rep. #645) * [ES] in the non-linear fit window, set was deselected after each step of fit (rep. #646) * [JB] WRITE setselect crashed * [ES] fixed crash when selecting "Show data-less" or "Show hidden" from set popup menus (rep. #652) * [LM] fixed a few bugs in the date/Julian day conversion * [LM] fixed "day of week" format that was broken for negative dates * [ES] use "%g" format in the point tracking window * [ES] selecting multiple graphs in "graph appearance" corrupted titles/ subtitles (#566) * [ES] couldn't parse data from multicolumn files containing non-numerics fields (rep. #655) * [ES] the user tick locations were saved with insufficient precision; now we use the same format as for storing data sets (rep. #298)

5.0.3

Functionality

! [ES] added "Fixed" graph type (rep. #556) * [ES] XYR set is back ! [ES] filled circles in XYR (rep. #206) * [ES] RtoL text advancing (not yet if using device fonts) ! [ES] extended options for line arrows - see "examples/arrows.agr" * [ES] automatic allocation of drawing objects; -maxlines and like command line options removed * [LM] RTI is processed also when running in gui-less or batch mode * [LM] millisecond resolution of timer ! [ES] added XYdXdXdYdY set type ! [ES] color & pattern of error bars can be selected independently from symbols ! [ES] arrow clipping of error bars (rep. #451) * [ES] no limit on number of columns in block and nxy data reads anymore (reps. #357, #596) * [ES] empty line works as set delimiter (#540) * [ES] added JPEG backend * [ES] added PNG backend ! [ES] any set type now may have an additional column of text strings associated; as a result, the XYSTRING set type removed * [ES] canvas page dimensions, as saved in the project file, set the page dimensions of all devices (which afterwards can be adjusted separately) * [LM] Grace now can parse input data in several date/time formats, including the recommended ISO8601 * [LM] reference date for date conversions is adjustable * [LM] 2-digit format for years for the current century is now optional and the wrap year is adjustable

Interface

* [ES] start in the command line interface (CLI) mode if the exec's name is "grace" ! [ES] dataset operations GUI re-worked * [ES] new canvas hotkeys for drawing objects (rep. #585) * [ES] changind axis scale to Log updates world min if necessary (rep. #625) ! [ES] all file selection box (FSB) dialogs replaced (fixing reps. #465, #549, #568) * [ES] "File/Working dir" removed, since this option is in any FSB now * [ES] "File/Read/Block data" removed - it's in the "File/Read/Sets" now * [EV] in the non-linear fit popup, allow to use expressions when giving bounds for the loaded function ! [ES] applying changes in "Set appearance" for multiple sets selected doesn't act on legends by default; this can be changed from the "Options" menu (part of rep. #588) * [ES] added "File/Revert to saved" * [ES] -nxy command line flag requires a filename immediately after it * [ES] use GXinvert rather than GXxor for rubberband lines by default ! [ES] "Evaluate expression" rewritten * [HS] invert selection in set/graph lists ! [ES] removed column width controls from SS editor; the spreadsheet columns may be resized with Shift+middle button ! [ES] option to select set string column from block data

Documentation/Info

* [AM/ES] many more buildinfo details are displayed by "-version" command line option * [LM] many User's Guide additions/updates * [AM/ES] added man page for grace/xmgrace/gracebat * [AM] added man page for grconvert * [AM] FAQ updates (including rep. #562) * [ES] FAQ updates (including reps. #580, #587) * [ES] "Help/Examples" menu tree

Parser

* [HS/ES] several logical constructs of mixed type arguments (vector and scalar) didn't work * [ES] added '?' and ':' to the operator precedence list; no conflicts in the parser anymore * [ES] no need for () around boolean expressions ! [ES] new color selection options: COLOR "name", COLOR (R, G, B) ! [ES] PRINT TO DEVICE added; PRINT TO "filename" doesn't actually print, only sets the output to a file (rep. #605) ! [LM] TIMER NUMBER - set timer's resolution ! [ES] G.S can be used anywhere ! [ES] allow to use SET[index] amd GRAPH[index] for set & graph selections ! [EV] REVERSE setselect APPEND setselect TO setselect SPLIT setselect number ! [ES] no setno.extremetype ! [ES] extremetype(vexpr) ! [ES] expressions can be used virtually in any statement (where only numbers were allowed formerly) ! [ES] checks for expression types ! [ES] JDAY function (has been never documented) renamed to DATE ! [ES] removed INDEX and LOAD SCRARRAY ! [ES] added MESH (a la linspace) ! [ES] several statements per line are allowed, separated by ';' * [ES] PAGE SIZE x y -> PAGE SIZE x, y ! [LM] REFERENCE DATE, DATE WRAP onoff, DATE WRAP YEAR iexpr ! [ES] strict array length checks

Defaults

! [LM] the default value for the timer has been reduced from 1000 to 200ms * [ES] sformat is saved in projects

Portability

* [ES] configure honours $CC; if available and not overridden, gcc will be picked * [ES] motif find fix * [ES] Irix-6.5 config fix (rep. #558) * [ES] compilation errors when using some weird old versions of make fixed (rep. #583) * [ES] configure checks for declarations of all math functions * [ES] removed the remnants of support for Motif-1.1 * [ES] PDF driver updated to use pdflib-2.01 * [ES] updated to Xbae-4.7 (which fixed rep. #560) * [ES] T1 font machinery updated to T1lib-0.9.1 * [ES] no need for GD lib (for raster drivers); a customized version is included * [AM] OS/2 updates * [JH] VMS updates

Bug fixes

* [MR] popping up PS GUI setup window caused crash (rep. #563) * [ES] set split was broken in 5.0.2 * [EV] frequency/period feature extraction fix (rep. #538) * [ES] in the PS driver, pattern fills were not opaque (rep. #567) * [ES] crosshairs were left as lines on canvas (rep. #571) * [ES] description length was limited to 2K (rep. #575) * [ES] setting negative offsets for PS driver was impossible via GUI (rep. #579) * [ES] antialiased (default) text strings were invisible on mono X terminals (rep. #582) * [ES] join sets is working now (rep. #513) * [ES] error bar clipping wasn't enabled * [ES] error bars were drawn above symbols * [ES] settings from "Ellipse props..." were ignored * [ES] Bitmapped strings with no AA were broken in the PDF output * [ES] non-POSIX locales caused invalid PS output in rare cases * [LM] detect cases of accesses beyond array bounds of drawing objects * [ES] problems with operations with sets of different lengths (rep. #227) resolved * [HS] "Start load at" of the regression window was ignored * [ES] non-linear fit didn't work in batch mode for any but S0 set * [ES] fixed crashes with log axes (rep. #282, #525) * [AM/ES] fixed crashes when major tick spacing was equal to 0 (rep. #591) * [AM] the default filename of hardcopy output was truncated at first period (rep. #593) * [LM] several bugs in date formats fixed * [ES] locator properties didn't work; changing the locator format caused chaotic behavior (rep. #621) * [ES] patterned fills of ellipses gave segmentation fault (rep. #616). This was a GD library's bug, in fact

Misc

* [ES] removed GD and GIF backends (the latter due to patent issues) * [LM] an auxiliary utility added (convcal) to convert between "usual" and julian day date formats. This obsoletes the former greg2jul.c and jul2greg.c utilities.

5.0.2

Functionality

* [ES] graphs and sets are allocated dynamically; -maxgraph, -maxsets and -graphsets removed * [ES] XY chart is back * [ES] XYZ set type is back ! [ES] new chart set presentations: stacked line and scatter ! [ES] new options for charts (different bar border/fill colors and patterns etc) ! [ES] inter-bar gap for bar charts is adjustable (rep. #198) ! [ES] new set type: BarDY (bar charts with error bars) * [ES] precision can be used for XYZ sets (rep. #519) * [ES] new set auto-coloring is back * [ES] added 16 new patterns * [ES] added a few more line styles (rep. #305) ! [ES] legends can be displayed in reverse order (rep. #205) * [ES] legends are drawn by default * [ES] enhanced backward compatibility with Xmgr * [ES] in free mode, auto-re-scale all the plot objects (imitating Xmgr) (rep. #537) ! [ES] color map stuff (rep. #512) ! [AM] auto-scaling with range restrictions * [LM] added internals for RT (real time) input monitoring ! [LM] grace_np library now uses anonymous instead of named pipes ! [ES] write format is used for all dataset types ! [ES] FP line widths (rep. #483) ! [ES] locale, if available and set, is used for numeric labels * [ES] in case of crash, Grace tries to save the project anyway ! [ES] added an option to fill (or not to) the page background * [ES] Grace honors $GRACE_PRINT_CMD environment variable (rep. #522) * [ES] PS and PDF drivers optimized for speed and file size * [ES] added color/gray-scale and bbox:tight/page options to the EPS driver * [ES] added adjustable printer page offsets to the PS driver * [ES] warning issued on truncated printout (if display and hard-copy device aspect ratio don't coincide, for example)

Interface

! [ES] menu shuffles ! [ES] new graph selectors - with many operations available from the popup menu (right mouse button) ! [ES] new set selectors - with many operations available from the popup menu (right mouse button). Set selectors in the Data/* popups are of the old style yet * [ES] pattern selectors have pattern bitmaps displayed * [ES] line style selectors have dash bitmaps displayed * [ES] graph number for ops is automatically graph that has focus (rep. #104) ! [ES] (approximate) number of tick divisions for auto-ticking is set in "Axis properties" now instead of "Autoscale" ! [ES] a simplistic (by now) fonttool added * [ES] removed all set pick operations ! [ES] "Set appearance/Edit/*" now act on selected sets only * [HS] it's possible to refer to the index of blockdata as column 0 via command line (rep. #464) * [ES] removed -xy, -xydy etc command line flags; use -(set)type instead * [ES] -source stdin removed ! [ES] "-" and "stdin/stdout" can be used anywhere (rep. #486) * [ES] Block data window reworked ! [ES] canvas events redone * [ES] immediate feedback for drawing object reposition/editing is back (rep. #532) ! [ES] Activate/Edit/Create/Reactivate Set menu confusion eliminated (rep. #136) * [ES] print popup fixes ! [ES] in the X11 driver, put dots every 0.1 viewport (visible only if the page bg is not filled) ! [ES] <Ctrl+E> from text inputs fires up font tool * [ES] xwindow title has "Grace: " prefix prepended and, if project is modified, "(modified)" suffix ! [ES] removed "Clear all" and added "New" instead ! [ES] removed "Verify Pick sets operations" option, added "Don't ask questions" (same as -noask) ! [LM] added -dpipe command line switch for monitoring an already open file descriptor * [ES] removed -symcolorbug command line option * [ES] removed -dc/-nodc, -redraw/-noredraw, -GXxor/-GXinvert command line options * [ES] max error count upon reading in reduced from 50 to 5

Documentation/Info

* [ES] old HTML docs removed; a draft version of User's Guide added * [EV] Tutorials prepared. It's a recommended reading not only for newbies, especially taking into account the rudimentary state of the User's Guide * [AM] -version additions

Parser

* [ES] device commands (rep. #490) ! [ES] VXMAX and VYMAX - max viewport values of the current device ! [ES] TRUE/FALSE and ON/OFF are interchangeable ! [ES] NEW - start new project from scratch using default template; NEW FROM "filename" - start new project from scratch using filename template ! [ES] MAP COLOR color_id TO (R, G, B), "colorname" (0 <= R, G, B < 256) ! [ES] S$ - currently processed (in parser) SETNUM ! [ES] S_ - recently assigned SETNUM (e.g., after a data have been read in) ! [ES] SETNUM.ID - id of the set (i.e., S5.ID is 5) ! [ES] G$, G_ and GRAPHNO.ID - same as above, but for graphs

Defaults

* [ES] toolbar X resources ! [ES] use IsoLatin1 encoding if Default.enc is not found * [ES] gracerc magic path ! [ES] gracerc re-read upon SIGHUP * [ES] templates (rep. #520)

Portability

* [LM] grace_np library now compiles and works correctly on OS/2 and Win32 (in addition to all Unices, of course). There is an unresolved problem with VMS, though * [ES] added configuration for use of lcc as compiler * [JH] VMS updates * [AM] OS/2 updates * [ES] grconvert works on Win32 * [ES] Win32 port should compile out of the box

Bug fixes

* [ES] configure issued wrong messages * [ES] drawing objects might not be drawn sometimes * [ES] fixed patterns #7, #14 and #15 * [ES] fixed rounding errors in clipping routines (in particular, rep. #476 and #504) * [EV] a feature extraction bug fixed * [ES] view/world coords in string edit (rep. #469) * [LM] input data line length restriction removed (rep. #260, #357, #443) * [ES] npipe "buffer overflow" fixed * [ES] npipe load bug fixed * [LM] linear regression on a two-point set was performed wrongly * [ES] spreadsheet fixes and clean-ups (rep. #203, #259, #409) * [ES] auto-scale fixes (rep. #510) * [LM] configure fixes * [LM] updated several explanation strings on example files with the new GUI layout * [LM] the correct stack depth was displayed only after cycling * [ES] regions and graph fixed points not drawn in hardcopy output anymore * [ES] if no set has a legend string defined, the empty legend box is not drawn (even when legends are enabled) * [ES] Disk/Pipe selector was broken (rep. #454) * [ES] Set appearance/Data/Load comments didn't update GUI settings for the currently selected set (rep. #474) * [ES] ignore non-printable characters in formulae (rep. #241) * [ES] working dir not initialized (rep. #470) * [ES] `make tests' failed if ran before `make install' (rep. #491) * [ES] incorrect postscript output of bar charts fixed (rep. #341, #410) * [ES] fixed crash if applying axis settings to all graphs (rep. #503) * [ES] warning popup on exit sometimes appeared even after no changes have been made (rep. #274) * [ES] auto-scale didn't work if specified from the command line together with some other arguments (rep. #385, #441) * [ES] File/Write/Sets didn't work for multiple set selection (rep. #394) * [ES] strange font size decrement (rep. #242) * [ES] crashes on SGI when accents are used in the legends (rep. #268) * [ES] Strings & Things : Default size is zero on HP (rep. #288) * [ES] sometimes in plots with multiple graphs, one couldn't get the x axis tick marks or labels to be displayed on any of the graphs except for graph 0 (rep. #339) * [LM] in applications linked against grace_np, a call to system() or like functions would abort execution (rep. #382) * [ES] Core dump in SetSelectedSet if optimized (rep. #366) * [ES] misc other bug fixes

Misc

* [ES] memory consumption reduced (typically, 0.5 MB less than that of 5.0.1 and about same as of Xmgr-4.1.2) * [ES] removed "Coalesce sets" (will be back in 5.0.3) * [ES] no input date/time formats (a smart input data filter is planned for 5.0.3). Please use Julian dates for a time being

5.0.1

Functionality

! [ES] added FORMAT_SCIENTIFIC, FORMAT_ENGINEERING ! [ES] polar plots (a work in progress - far from being completed, but definitely better than nothing :)) ! [ES] added tunable offsets for tick labels (in particular, rep. #467) ! [ES] added option of placing axis ticks at rounded positions (rep. #124) * [HS2] implemented axis label placement op (normal/opposite side) (rep. #463) * [HS2] changed tick and axis label offsets from (x,y) to (parallel/perpendicular) * [HS2] introduced tick label placement auto/spec (similar to axis label) ! [ES] fill rules for sets: winding/even-odd; not honored by raster formats ! [ES] smart colormap management: -install/-noinstall flags force a given behavior; default is to switch to the private colormap automatically as needed ! [ES] -rvideo now acts on all devices; XMgrace.reverseVideo removed from the list of X resources ! [ES] selecting devices by names instead of numbers; "-device" command line argument renamed to "-hdevice"; GR_HDEV not used anymore ! [ES] zero axes are back. Now, both "primary" and alternative axes can be "zero" ones ! [ES] PDF device options added: binary/ASCII output; misc fixes ! [ES] GIF device options added: transparent and interlaced output ! [ES] PS device options added: grayscale/color; Level2 toggle is back (in fact, nobody of developers has a Level 1 printer to really check it) * [ES] fixed bug when text strings might be typed wrong sometimes in the PS output * [ES] all drivers slightly rewritten ! [ES] added PNM (PBM/PGM/PPM) device (both ASCII and "rawbits" outputs) ! [ES] Courier font family added * [ES] added \f, \h, \v, \z, \m, \M and \d string controls. Load typeset.agr in the "examples" dir to get an idea ! [ES] in the batch language, in any statement with FONT NUMBER, the font selection can be done by fontname instead of the number: FONT "fontname" ! [ES] Grace can now use any number of user-defined fonts, both in addition and as a replacement for bundled ones (rep. #26)

Documentation/Info

* [HS] added a text (http://plasma-gate.weizmann.ac.il/Grace/y2k.html) on the Year 2000 problem (rep. #342) * [HS2] new extended FAQ written * [AM] version string includes GUI toolkit (Motif/Lesstif/None) * [AM] help screen updated * [ES] font docs (doc/fonts.html) updated

Portability

* [ES] configure should now be smarter about finding Motif (rep. #416) * [ES] added configuration file for Interix (aka OpenNT) (rep. #437) * [ES] SunOS4 build fixes * [AM] OS/2 updates

Bug fixes

* [AM] "Read/Block data" crash fixed (rep. #445) * [ES] Zooming now zooms exactly to the window specified by mouse (rep. #5) * [ES] "AutoT" doesn't alter graph min/max values (rep. #165) * [ES] killing sets in polar plots with parameters preserved caused crash (rep. #125) * [HS2] ellipses might be sometimes drawn incorrectly in X11 * [ES] a memory leak in "Edit String" fixed * [HS] leap year function corrected * [ES] XYString sets were not saved (rep. #452) * [ES] Disk/Pipe selector was broken (rep. #455) * [AM] fixed broken axis scaling when set min/max was +/- Inf * [EV] stack manipulation fixed (#417) * [AM] "-version" now outputs to stdout instead of stderr * [ES] misc small fixes

5.0.0 (since Xmgr-4.1.2):

Functionality

* [ES] T1 fonts are used for all devices using the T1lib library of Rainer Menzner. There should be no discrepancies anymore between characters displayed and printed (rep. #16) * [ES] routines of drawing layer rewritten from the scratch; Grace is now almost WYSIWYG, except patterns (rep. #184) * [EV] generic I/O filtering implemented (including rep. #240); see docs for details ! [ES] reciprocal axis scale implemented (rep. #33) * [EV] system-wide gracerc ($GRACE_HOME/gracerc) will be read at startup time, if exists ! [ES] overlined strings are possible (\o \O) (rep. #176). Doesn't work with device fonts yet ! [MM] extensions to regions including horizontal-inside, horizontal-outside, vertical-inside and vertical-outside ! [MM] Grace will use the FFTW library for Fourier transform if present on the system; see README.FFTW * [MM] negative indices in "Drop points" allowed (counting from the end of a set) * [EV] added a new feature to be extracted - the integral of each set ! [ES] "unit" and "const" added to the possible proctype's for modules. DEG (below) is an example what "unit" can be used for ! [ES] DEG and RAD are now meaningful. E.g., expressions like sin(90 deg) and sin(pi/2 rad) both are legitimate (and equivalent!) ("rad" can be omitted - it's there just for the sake of completeness) * [ES] metafile driver (not in final state) * [ES] PDF driver using the PDFlib of Thomas Merz; see README.PDF * [ES] GIF/GD driver using the GD library of Thomas Boutell (rep. #14); see README.GIF * [ES] logarithmic scales can have any base (rep. #370) * [ES] patterns and colors can be used simultaneously (rep. #291) * [ES] power tick label format changed to work in scientific format (rep. #361) * [ES] \B in composite strings will reset the font to the string's initial font (rep. #388) * [ES] PS/EPS driver rewritten from the scratch * [ES] X11 driver heavily rewritten

Interface

! [ES] removed "Plot/World scaling" popup ! [ES] re-designed axis props GUI popup (in particular, rep. #63, #313) * [EV] point ops popup fixes ! [ES] graph appearance props GUI popup ! [ES] removed "Viewport", "Frame", "Titles" and "Legends" popups. ! [ES] removed "Error bars" and "Edit legends" popups. ! [ES] re-designed set appearance props GUI popup (rep. #311, #369 should be fixed) * [EV] added expression evaluation to text input fields in all widgets * [EV] error window changed - only 1 window, not 1 window per error ! [EV] regression fits can be applied to specified interval and results are printed out in readable form * [EV] scrolled windows for explicitly requested expressions * [EV] canvas hotkeys added ! [ES] re-designed print setup GUI popup (problems in rep. #372, #412 should be fixed) * [ES] changing page size is possible for any device separately; the units can be "pix"els, "cm" or "in" (rep. #108, #211, #216, #405)

Project files

* [EV] background color saved * [MM] all regions, whether active or not, are saved to the file, so temporarily inactive regions don't get lost * [ES] page size is saved (rep. #312)

Parser

* [ES] cleaned grammar parser; instead of 350 shift/reduce and 231 reduce/reduce conflicts - > 61 & 0 respectively * [ES] MAX() and MIN() renamed to MAXOF() and MINOF() ! [ES] removed DX, DY, IMAGE ! [ES] removed GRAPHNO *BAR SIZE NUMBER ! [ES] removed SETNUM = SETNUM etc ! [ES] removed CMAP, STATUS, STATUSBAR, TOOLBAR, LOCATORBAR, LOCATOR

Defaults

! [ES] default page layout changed from free to fixed * [ES] \+ increases font size sqrt(sqrt(2)) times; \- respectively, decreases. Sub/superscripts are 1/sqrt(2) of the preceeding font size

Portability

* [AM] implemented dynamic modules for OS/2 * [EV] popen() for VMS * [JH/RN] VMS fixes * [AM] OS/2 updates

Misc

! [ES] removed (broke) xwd image loading ! [ES] removed all app-defaults not specific to GUI ! [ES] \x and \b control sequences removed

Bug fixes

* [ES] "-mono" command line flag now works * [EV] "-wd" command line flag fixed * [EV] trying to create a new set preceded with soft kill of all sets caused crash (rep. #367) * [MM] FFT fixes * [MM] when regions were read in from a saved file, they ended up linked to all graphs * [MM] in saved projects, REGNUM TRUE was used instead of REGNUM ON * [EV] several sets can be linked to the same file as in xny data (rep. #269) * [ES] crash on mono X servers fixed (rep. #285) * [ES] canvas refresh (rep. #217, #271 #317, #333, #375) * [ES] axis labels were not displayed if `display tick marks' wasn't selected (rep. #3) * [ES] coordinates of legend frame now corresponds to the left upper corner of the frame (rep. #31) * [ES] ticklabel format was reset by autoscale (rep. #119, #144) * [ES] bounding box of EPS was calculated only approximately (rep. #123, #145) * [ES] legend frame didn't account for sub/superscripts (rep. #189) * [ES] extraneous logarithmic tick marks were drawn in some cases (rep. #193) * [ES] accentuated titles weren't centered correctly (rep. #195) * [ES] switch to log scale with an axis containing zero might cause error messages infinitely looped (rep. #210) * [ES] filling of legend frame didn't work unless one turned the frame on (rep. #215) * [ES] the axes tick marks were behind set curves (rep. #224) * [ES] popup positioning left up to WM for all windows (rep. #273) * [ES] if graph contained too many ticks, autoscale was applied instead of tick position recalculation (rep. #275) * [EV] in "Point ops", 'Delete' ignored set number (rep. #293) * [ES] once activated, legends fill frame couldn't be switched off from within GUI (rep. #326) * [CM] adding legends to plots with number of data sets exceeding the default maximum caused a crash (rep. #344) * [ES] arranging or rearranging graphs by means of the "arrange" dialog reset previously set tick properties to defaults (rep. #356) * [ES] user tick labels w/subscripts did not show up in PS output (rep. #383) * [ES] FFT command didn't work correctly in parser (rep. #398) * [HS] command line parsing was wrong in several places (rep. #400) * [ES] misc. small fixes (including rep. #289, #406, #287) Legend: [EV] - Ed Vigmond <vigmonde(at-nospam)IGB.UMontreal.CA> [RN] - Rolf Niepraschk <niepraschk(at-nospam)ChbRB.berlin.ptb.de> [HS] - Henrik Seidel <henrik.seidel(at-nospam)gmx.de> [JH] - John Hasstedt <John.Hasstedt(at-nospam)sunysb.edu> [AM] - Alexander Mai <st002279(at-nospam)hrzpub.tu-darmstadt.de> [CM] - Charles Myers <myers(at-nospam)oicinc.com> [MM] - Marcus H. Mendenhall <marcus.h.mendenhall(at-nospam)vanderbilt.edu> [HS2] - Heiko R. Selber <selber(at-nospam)fhi-berlin.mpg.de> [LM] - Luc Maisonobe [MR] - Mark Rintoul <rintoul(at-nospam)cs.sandia.gov> [HF] - Harald Freyer <hf(at-nospam)nike.cup.uni-muenchen.de> [JB] - Jesko Brudermann <jbruder(at-nospam)gwdg.de> [OT] - Ovidiu Toader <ovidiut(at-nospam)ostrich.physics.utoronto.ca> [RW] - Robin Williams <Robin.Williams(at-nospam)astro.cf.ac.uk> [JM] - John McKitterick <jbmck(at-nospam)batc.allied.com> [AH] - A. Stewart Hopkins <ahopkins(at-nospam)mail.arc.nasa.gov> [KS] - Keith Stribley <keith(at-nospam)stribley.dabsol.co.uk> [DP] - Donald A. Peterson <donald(at-nospam)nd.edu> [WB] - Wolfgang Braun <braun(at-nospam)pdi-berlin.de> [JSB] - J. Scott Berg <jsberg(at-nospam)bnl.gov> [AC] - Alber Chin <china(at-nospam)thewrittenword.com> [GJ] - Gerd Jahn <Gerd.Jahn(at-nospam)dss.dornier.dasa.de> [UH] - Ulrich Harttig <harttigu(at-nospam)ucs.orst.edu> [DB] - Dominique Bissieres <dominique.bissieres(at-nospam)turbomeca.fr> [RL] - R. Lahaye <lahaye(at-nospam)postech.edu> [MD] - Matthias Dillier <Matthias.Dillier(at-nospam)snb.ch> [PM] - Petrie L M <lmp(at-nospam)ornl.gov> [JS] - Jan Schaumann <jschauma(at-nospam)netmeister.org> [SR] - Stewart Rounds <sarounds(at-nospam)usgs.gov> [PB] - Peter Breitenlohner <peb(at-nospam)mppmu.mpg.de> [MO] - Marius Olechnovičius <img(at-nospam)mail.lt> [YZ] - Yura Zotov <yznews(at-nospam)hotbox.ru> [TO] - Tobias Oed <tobias(at-nospam)physics.odu.edu> [IG] - Ionut Georgescu <ionutg(at-nospam)gmail.com> [HR] - Harvey Richardson [DC] - Dan Connelly <djconnel(at-nospam)ieee.org> [TK] - Thomas Klausner [SM] - Stan Maree <stan.maree(at-nospam)bbsrc.ac.uk> [ES] - Evgeny Stambulchik <evgeny(at-nospam)stambulchik.net> "!" means no documentation provided (yet)
grace-5.1.23/doc/7.1.2.agr0000644000076500001440000003272606671062261014355 0ustar fnevgenyusers# Grace project file # @version 50002 @page size 600 600 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 1 to "Times-Italic" , "Times-Italic" @map font 2 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 5 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 6 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 8 to "Courier" , "Courier" @map font 9 to "Courier-Oblique" , "Courier-Oblique" @map font 10 to "Courier-Bold" , "Courier-Bold" @map font 11 to "Courier-BoldOblique" , "Courier-BoldOblique" @map font 12 to "Symbol" , "Symbol" @map font 13 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Oct 23 18:25:23 1998" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 20 @ world ymin -50 @ world ymax 50 @ stack world 0, 20, -20, 50 @ stack world 0, 20, -20, 50 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 20 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.5 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "X=x , Y=4-2*x" @ s0 legend "" @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol center false @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "X=x , Y=3*x" @ s1 legend "" @target S0 @type xy 0 4 0.202683 3.59463 0.405367 3.18927 0.60805 2.7839 0.810734 2.37853 1.01342 1.97317 1.2161 1.5678 1.41878 1.16243 1.62147 0.757066 1.82415 0.351699 2.02683 -0.0536679 2.22952 -0.459035 2.4322 -0.864402 2.63488 -1.26977 2.83757 -1.67514 3.04025 -2.0805 3.24293 -2.48587 3.44562 -2.89124 3.6483 -3.2966 3.85098 -3.70197 4.05367 -4.10734 4.25635 -4.5127 4.45903 -4.91807 4.66172 -5.32344 4.8644 -5.7288 5.06708 -6.13417 5.26977 -6.53954 5.47245 -6.9449 5.67514 -7.35027 5.87782 -7.75564 6.0805 -8.161 6.28319 -8.56637 6.48587 -8.97174 6.68855 -9.3771 6.89124 -9.78247 7.09392 -10.1878 7.2966 -10.5932 7.49929 -10.9986 7.70197 -11.4039 7.90465 -11.8093 8.10734 -12.2147 8.31002 -12.62 8.5127 -13.0254 8.71539 -13.4308 8.91807 -13.8361 9.12075 -14.2415 9.32344 -14.6469 9.52612 -15.0522 9.7288 -15.4576 9.93149 -15.863 10.1342 -16.2683 10.3369 -16.6737 10.5395 -17.0791 10.7422 -17.4844 10.9449 -17.8898 11.1476 -18.2952 11.3503 -18.7005 11.553 -19.1059 11.7556 -19.5113 11.9583 -19.9166 12.161 -20.322 12.3637 -20.7274 12.5664 -21.1327 & @target S1 @type xy 1.2 3.6 1.34957 4.0487 1.49913 4.4974 1.6487 4.9461 1.79827 5.3948 1.94783 5.8435 2.0974 6.2922 2.24697 6.7409 2.39653 7.1896 2.5461 7.6383 2.69567 8.087 2.84523 8.5357 2.9948 8.9844 3.14437 9.4331 3.29393 9.8818 3.4435 10.3305 3.59307 10.7792 3.74263 11.2279 3.8922 11.6766 4.04177 12.1253 4.19133 12.574 4.3409 13.0227 4.49047 13.4714 4.64003 13.9201 4.7896 14.3688 4.93917 14.8175 5.08873 15.2662 5.2383 15.7149 5.38787 16.1636 5.53743 16.6123 5.687 17.061 5.83657 17.5097 5.98613 17.9584 6.1357 18.4071 6.28527 18.8558 6.43483 19.3045 6.5844 19.7532 6.73397 20.2019 6.88353 20.6506 7.0331 21.0993 7.18267 21.548 7.33223 21.9967 7.4818 22.4454 7.63137 22.8941 7.78093 23.3428 7.9305 23.7915 8.08007 24.2402 8.22963 24.6889 8.3792 25.1376 8.52876 25.5863 8.67833 26.035 8.8279 26.4837 8.97746 26.9324 9.12703 27.3811 9.2766 27.8298 9.42616 28.2785 9.57573 28.7272 9.7253 29.1759 9.87486 29.6246 10.0244 30.0733 10.174 30.522 10.3236 30.9707 10.4731 31.4194 10.6227 31.8681 10.7723 32.3168 10.9218 32.7655 11.0714 33.2142 11.221 33.6629 11.3705 34.1116 11.5201 34.5603 11.6697 35.009 11.8192 35.4577 11.9688 35.9064 12.1184 36.3551 12.2679 36.8038 12.4175 37.2525 12.5671 37.7012 12.7166 38.1499 12.8662 38.5986 13.0158 39.0473 13.1653 39.496 13.3149 39.9447 13.4645 40.3934 13.614 40.8421 13.7636 41.2908 13.9132 41.7395 14.0627 42.1882 14.2123 42.6369 14.3619 43.0856 14.5114 43.5343 14.661 43.983 14.8106 44.4317 14.9601 44.8804 15.1097 45.3291 15.2593 45.7778 15.4088 46.2265 15.5584 46.6752 15.708 47.1239 & grace-5.1.23/doc/UsersGuide.sgml0000644000076500001440000047764112032137500016154 0ustar fnevgenyusers
Grace User's Guide (for Grace-5.1.23) by the Grace Team 30.09.2012 This document explains the usage of Grace, a WYSIWYG 2D plotting tool for numerical data. (A German translation of this document, made by Tobias Brinkert, is available here: .) Introduction

What is Grace?

Grace is a WYSIWYG tool to make two-dimensional plots of numerical data. It runs under various (if not all) flavors of Unix with X11 and M*tif (LessTif or Motif). It also runs under VMS, OS/2, and Windows (95/98/NT/2000/XP). Its capabilities are roughly similar to GUI-based programs like Sigmaplot or Microcal Origin plus script-based tools like Gnuplot or Genplot. Its strength lies in the fact that it combines the convenience of a graphical user interface with the power of a scripting language which enables it to do sophisticated calculations or perform automated tasks. Grace is derived from Xmgr (a.k.a. ACE/gr), originally written by Paul Turner. From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik. You can get the newest information about Grace and download the latest version at the . When its copyright was changed to GPL, the name was changed to Grace, which stands for ``GRaphing, Advanced Computation and Exploration of data'' or ``Grace Revamps ACE/gr''. The first version of Grace available is named 5.0.0, while the last public version of Xmgr has the version number 4.1.2. Paul still maintains and develops a non-public version of Xmgr for internal use. Copyright statement

Copyright (©) 1991-1995 Paul J Turner, Portland, OR Copyright (©) 1996-2012 Grace Development Team Maintained by Evgeny Stambulchik All Rights Reserved This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

For certain libraries required to build Grace (which are therefore even included in a suitable version) there may be different Copyright/License statements. Though their License may by chance match the one used for Grace, the Grace Copyright holders can not influence or change them.

Package | License @ cephes library | Free @ T1lib | LGPL @ Xbae | BSD-like @ Tab Widget | BSD-like @
Licenses

Installation guide

Installing from sources

Configuration

Note: If you change one of the --with-extra-incpath or --with-extra-ldpath options from one run of configure to another, remember to delete the config.cache file!!! Compilation Issue make

If something goes wrong, try to see if the problem has been described already in the Grace FAQ (in the doc directory). Testing make tests

This will give you a slide show demonstrating some nice features of Grace. Installation make install make links

The later (optional) step will make soft links from some files under the Grace home directory to the system-wide default locations (can be changed by the --prefix option during the configuration, see above). Binary installation

Getting pre-built packages Installation Running tests Alternative packaging schemes (RPM, ...)

Not written yet... Getting started

For a jump-in start, you can browse the demos ("Help/Examples" menu tree). These are ordinary Grace projects, so you can play with them and modify them. Also, read the .

O.k. Here's a VERY quick introduction: Start the GUI version: xmgrace (return). Select/check the output medium and canvas size in File/Device Setup. If needed, set the graph size ('Viewport' in Plot/Graph Appearance). Load your data with Data/Import/ASCII. 'Load as': 'Single set' for two-column ASCII data, 'Block data' for multi-column ASCII data. Adjust the scales, axis labels and tick marks in Plot/Axis properties. Acknowledge all changes with 'Apply'. Adjust lines, symbols, legends in Plot/Set appearance. Adjust titles, plot frame and legend display in Plot/Graph Appearance. Data can be manipulated in Data/Transformations. To shift a data set by 20 to the left, e.g., in 'Evaluate Expression' select the same set on the left and the right, and say Formula: y=y-20. As you'll probably notice, Grace can do MUCH more than that. Explore at your leisure. When you like your plot, select File/Print. That's it! General concepts

Project files

A project file contains all information necessary to restore a plot created by Grace, as well as some of preferences. Each plot is represented on a single page, but may have an unlimited number of graphs.You create a project file of your current graph with File/Save,Save as. Parameter files

A parameter file contains the detailed settings of your project. It can be used to transfer these settings to a different plot/project. You generate a parameter file with File/Save menu entry selected from the "Plot/Graph appearance popup". You can load the settings contained in a parameter file with File/Open. Input file formats

Grace understands several input files formats. The most basic one is ASCII text files containing space and comma separated columns of data. The data fields can be either numeric (Fortran 'd' and 'D' exponent markers are also supported) or alphanumeric (with or without quotes). Several calendar date formats are recognized automatically and you can specify your own reference for numeric date formats. Lines beginnig with "#" are ignored. Blank lines indicate new dataset. Grace also has a command language (see ), you can include commands in data files using lines having "@" as their first non-blank character, though this is not recommended. Depending on configuration, Grace can also read NetCDF files (see ). Graphs

A graph consists of (every element is optional): a graph frame, axes, a title and a subtitle, a number of sets and additional annotative objects (time stamp string, text strings, lines, boxes and ellipses). The graph type can be any of:

A dataset is a collection of points with x and y coordinates, up to four optional data values (which, depending on the set type, can be displayed as error bars or like) and one optional character string. Sets

A set is a way of representing datasets. It consists of a pointer to a dataset plus a collection of parameters describing the visual appearance of the data (like color, line dash pattern etc). The set type can be any of the following:

Set type | # of num. cols | Description @ XY | 2 | An X-Y scatter and/or line plot, plus (optionally) an annotated value @ XYDX | 3 | Same as XY, but with error bars (either one- or two-sided) along X axis @ XYDY | 3 | Same as XYDX, but error bars are along Y axis @ XYDXDX | 4 | Same as XYDX, but left and right error bars are defined separately @ XYDYDY | 4 | Same as XYDXDX, but error bars are along Y axis @ XYDXDY | 4 | Same as XY, but with X and Y error bars (either one- or two-sided) @ XYDXDXDYDY | 6 | Same as XYDXDY, but left/right and upper/lower error bars are defined separately @ BAR | 2 | Same as XY, but vertical bars are used instead of symbols @ BARDY | 3 | Same as BAR, but with error bars (either one- or two-sided) along Y axis @ BARDYDY | 4 | Same as BARDY, but lower and upper error bars are defined separately @ XYHILO | 5 | Hi/Low/Open/Close plot @ XYZ | 3 | Same as XY; makes no sense unless the annotated value is Z @ XYR | 3 | X, Y, Radius. Only allowed in Fixed graphs @ XYSIZE | 3 | Same as XY, but symbol size is variable @ XYCOLOR | 3 | X, Y, color index (of the symbol fill)@ XYCOLPAT | 4 | X, Y, color index, pattern index (currently used for Pie charts only) @ XYVMAP | 4 | Vector map @ XYBOXPLOT | 6 | Box plot (X, median, upper/lower limit, upper/lower whisker) @
Set types

Not all set types, however, can be plotted on any graph type. The following table summarizes it:

Set type | XY Graph | XY Chart | Fixed | Polar | Pie @ XY | + | + | + | + | + @ XYDX | + | - | + | - | - @ XYDY | + | + | + | - | - @ XYDXDX | + | - | + | - | - @ XYDYDY | + | + | + | - | - @ XYDXDY | + | - | + | - | - @ XYDXDXDYDY | + | - | + | - | - @ BAR | + | + | + | - | - @ BARDY | + | + | - | - | - @ BARDYDY | + | + | - | - | - @ XYHILO | + | - | - | - | - @ XYZ | + | - | + | + | - @ XYR | - | - | + | - | - @ XYSIZE | + | + | + | + | - @ XYCOLOR | + | + | + | + | + @ XYCOLPAT | - | - | - | - | + @ XYVMAP | + | - | + | - | - @ XYBOXPLOT | + | - | - | - | - @
Graph/Set type connection
Regions

Regions are sections of the graph defined by the interior or exterior of a polygon, or a half plane defined by a line. Regions are used to restrict data transformations to a geometric area occupied by region. Real Time Input

Real Time Input refers to the ability Grace has to be fed in real time by an external program. The Grace process spawned by the driver program is a full featured Grace process: the user can interact using the GUI at the same time the program sends data and commands. The process will adapt itself to the incoming data rate. Hotlinks

Hotlinks are sources containing varying data. Grace can be instructed a file or a pipe is a hotlink in which case it will provide specific commands to refresh the data on a mouse click (a later version will probably allow automatic refresh). Devices

Grace allows the user to choose between several output devices to produce its graphics. The current list of supported devices is: X11 PostScript (level 1 and level 2) EPS (encapsulated PostScript) Metafile (which is Grace format, used at the moment mostly for debugging purposes) MIF (Maker Interchange Format used by FrameMaker) SVG (Scalable Vector Graphics, a language for describing two-dimensional vector and mixed vector/raster graphics in XML) PDF (depends on extra libraries, see ) PNM (portable anymap file format) JPEG (depends on extra libraries, see ) PNG (depends on extra libraries, see )

Note that Grace no longer supports GIF due to the copyright policy of Unisys. Grace can also be instructed to launch conversion programs automatically based on file name. As an example you can produce MIF (FrameMaker Interchange Format) or Java applets using pstoedit, or almost any image format using the netpbm suite (see the ). Magic path

In many cases, when Grace needs to access a file given with a relative pathname, it searches for the file along the following path: ./pathname:./.grace/pathname:~/.grace/pathname:$GRACE_HOME/pathname Dynamic modules

Grace can access external functions present in either system or third-party shared libraries or modules specially compiled for use with it. The term dynamic refers to the possibility Grace has to open the library at run time to find the code of the external function, there is no need to recompile Grace itself (the functions already compiled in Grace are "statically linked"). Coordinate frames

There are two types of coordinates in Grace: the world coordinates and the viewport coordinates. Points of data sets are defined in the world coordinates. The viewport coordinates correspond to the image of the plot drawn on the canvas (or printed on, say, PS output page). The transformation converting the world coordinates into the viewport ones is determined by both the graph type and the axis scaling.

Actually, there is yet another level in the hierarchy of coordinates - the device coordinates. However, you (as a user of Grace) should not worry about the latter. The mapping between the viewport coordinates and the device coordinates is always set in such a way that the origin of the viewport corresponds to the left bottom corner of the device page, the smallest of the device dimensions corresponds to one unit in the viewport coordinates. Oh, and the most important thing about the viewport → device transformation is that it is homotetic, i.e. a square is guaranteed to remain a square, not a rectangle, a circle remains a circle (not an ellipse) etc.

Invocation

Operational mode

With respect to the user interface, there are three modes of operation that Grace can be invoked in. The full-featured GUI-based version is called xmgrace. A batch-printing version is called gracebat. A command-line interface mode is called grace. Usually, a single executable is called in all cases, with two of the three files being (symbolic) links to a "real" one. Command line options

-autoscale x|y|xy Override any parameter file settings -barebones Turn off all toolbars -batch batch_file Execute batch_file on start up (i.e., after all other options have been processed and the UI initialized) -block block_data Assume data file is block data -bxy x:y:etc. Form a set from the current block data set using the current set type from columns given in the argument -datehint iso|european|us|days|seconds|nohint Set the hint for dates analysis -dpipe descriptor Read data from descriptor (anonymous pipe) on startup -fixed width height Set canvas size fixed to width*height -free Use free page layout -graph graph_number Set the current graph number -graphtype xy|chart|fixed|polar|pie Set the type of the current graph -hardcopy No interactive session, just print and quit -hdevice hardcopy_device_name Set default hardcopy device -install Install private colormap -legend load Turn the graph legend on -log x|y|xy Set the axis scaling of the current graph to logarithmic -maxpath length Set the maximal drawing path length -mono Run Grace in monochrome mode (affects the display only) -netcdf file Assume data file is in netCDF format. This option is present only if the netCDF support was compiled in -netcdfxy X_var Y_var If -netcdf was used previously, read from the netCDF file X_var Y_var variables and create a set. If X_var name is "null" then load the index of Y to X. This option is present only if the netCDF support was compiled in -noask Assume the answer is yes to all requests - if the operation would overwrite a file, Grace will do so without prompting -noinstall Don't use private colormap -noprint In batch mode, do not print -nosafe Disable safe mode -nosigcatch Don't catch signals -npipe file Read data from named pipe on startup -nxy nxy_file Assume data file is in X Y1 Y2 Y3 ... format -param parameter_file Load parameters from parameter_file to the current graph -pexec parameter_string Interpret string as a parameter setting -pipe Read data from stdin on startup -printfile file Save print output to file -remove Remove data file after read -results results_file Write results of some data manipulations to results_file -rvideo Exchange the color indices for black and white -safe Run in the safe mode (default) - no file system modifications are allowd through the batch language -saveall save_file Save all graphs to save_file -seed seed_value Integer seed for random number generator -settype xy|xydx|... Set the type of the next data file -source disk|pipe Source type of next data file -timer delay Set allowed time slice for real time inputs to delay ms -timestamp Add timestamp to plot -version Show the program version -viewport xmin ymin xmax ymax Set the viewport for the current graph -wd directory Set the working directory -world xmin ymin xmax ymax Set the world coordinates for the current graph -usage|-help This message Customization

Environment variables

GRACE_HOME

Set the location of Grace. This will be where help files, auxiliary programs, and examples are located. If you are unable to find the location of this directory, contact your system administrator.

GRACE_PRINT_CMD

Print command. If the variable is defined but is an empty string, "Print to file" will be selected as default.

GRACE_EDITOR

The editor used for manual editing of dataset values.

GRACE_HELPVIEWER

The shell command to run an HTML viewer for on-line browsing of the help documents. Must include at least one instance of "%s" which will be replaced with the actual URL by Grace.

GRACE_FFTW_WISDOM_FILE and GRACE_FFTW_RAM_WISDOM

These flags control behavior of the FFTW planner (see for detailed info)

Init file

Upon start-up, Grace loads its init file, gracerc. The file is searched for in the magic path (see ); once found, the rest of the path is ignored. It's recommended that in the gracerc file, one doesn't use statements which are part of a project file - such defaults, if needed, should be set in the default template (see ). Default template

Whenever a new project is started, Grace loads the default template, templates/Default.agr. The file is searched for in the magic path (see ); once found, the rest of the path is ignored. It's recommended that in the default template, one doesn't use statements which are NOT part of a project file - such defaults, if needed, should be set in the gracerc (see ). X resources

The following Grace-specific X resource settings are supported: XMgrace.invertDraw Use GXinvert rather than GXxor for rubber-band lines. If the rubber-banding for zooms and lines, etc. doesn't appear on the canvas, set this resource to yes. XMgrace.allowDoubleClick When Yes, allow double clicks on the canvas to bring up various popups depending on the location of the pointer when the double click occurs. XMgrace.toolBar Enables button toolbar XMgrace.statusBar Enables status bar XMgrace.locatorBar Enables locator bar It is also possible to customize menus by assigning key accelerators to any item. You'll need to derive the item's X resource name from the respective menu label, which is easily done following these rules: All non-alphanumeric characters are skipped Start with lower case; each new word (if any) continues from the capital letter Add the item's type to the end - "Menu" for pulldown menus, "Button" for menu buttons. For example, in order to make Grace popup the Non-linear curve fitting by pressing Control+F, you would add the following two lines XMgrace*transformationsMenu.nonLinearCurveFittingButton.acceleratorText: Ctrl+F XMgrace*transformationsMenu.nonLinearCurveFittingButton.accelerator: Ctrl<Key>f to your .Xresources file (the file which is read when an X session starts; it could be .Xdefaults, .Xsession or some other file - ask your system administrator when in doubt).

Similarly, it may be desirable to alter default filename patterns of file selection dialogs. The recipe for the dialog's name is like for menu buttons outlined above, with "Button" being replaced with "FSB". E.g., to list all files in the "Open project" dialog ("File/Open..."), set the following resource: XMgrace*openProjectFSB.pattern: *

Guide to the graphical user interface
grace-5.1.23/doc/3.dat0000644000076500001440000000004306671062261014034 0ustar fnevgenyusers1 4 3 2 2 3 3 4 3 2 3 2 4 1 3 4 grace-5.1.23/doc/FAQ.sgml0000644000076500001440000014765311404714707014515 0ustar fnevgenyusers
Grace FAQ (for Grace-5.1.23) <author>by the Grace Team <date>12.06.2010 <abstract> This document contains Frequently Asked Questions (FAQ) about <bf>Grace</bf>, a WYSIWYG 2D plotting tool for scientific data. (A German translation of this document, made by Tobias Brinkert, is available here: <url name="Grace FAQ" url="http://www.semibyte.de/dokuwiki/informatik:linux:xmgrace:grace_faq">.) </abstract> <toc> <!-- **************************************** --> <sect>General Questions <p> <sect1>What is Grace? <p> Grace is a tool to make two-dimensional plots of numerical data. It runs under various (if not all) flavours of UNIX with X11 and M*tif. Its capabilities are roughly similar to GUI-based programs like Sigmaplot or Microcal Origin plus script-based tools like gnuplot or Genplot. Its strength lies in the fact that it combines the convenience of a graphical user interface with the power of a scripting language which enables it to do sophisticated calculations or perform automated tasks. Grace is derived from Xmgr (a.k.a. ACE/gr), originally written by Paul Turner. From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik. When its copyright was changed to GPL, the name was changed to Grace, which stands for ``GRaphing, Advanced Computation and Exploration of data'' or ``Grace Revamps ACE/gr''. The first version of Grace available is named 5.0.0, while the last public version of Xmgr has the version number 4.1.2. Paul still maintains and develops a non-public version of Xmgr for internal use. <sect1>Where can I get Grace? <p> You can get the newest information about Grace and download the latest version at the <url url="http://plasma-gate.weizmann.ac.il/Grace/" name="Grace home page">. You can fetch it from a mirror site as well. The list of mirror sites can be found at <url url="ftp://plasma-gate.weizmann.ac.il/pub/grace/MIRRORS">. <sect1>Where can I get the most recent information about Grace? <label id="homepage"> <p> Please refer to the <url name="official Grace Home Page" url="http://plasma-gate.weizmann.ac.il/Grace/">. There you can also find the latest version of this FAQ, links to the latest release and to mirror sites closer to you. <sect1>What is the difference between Xmgr and Grace? <p> Apart from the licensing, the main difference is that Grace is WYSIWYG (What You See Is What You Get). This was achieved through a major rewrite of all the mid-level drawing routines and the use of the device-independent Type 1 font rendering library T1lib for typesetting. For help with changing from Xmgr to Grace see section <tt>Xmgr to Grace migration guide</tt> in the User's Guide (question <ref id="manual" name="User's Guide">. There are currently several features of Xmgr which are not yet implemented in Grace (of course, alongside with a lot of new stuff not found in Xmgr). A full compatibility is desirable except for ``bad'' features of Xmgr. Among the Xmgr features not (yet) implemented in Grace are: <itemize> <item>X-Y graph flip <item>Horizontal and vertical lines as symbols <item>Smith plots </itemize> <sect1>Why did you change the name? <p> When the licensing was changed to GPL, Paul wanted to keep the name for his non-public version of Xmgr, so we chose a new name. <sect1>Is Grace free? <p> Yes. Grace is free in terms of the GNU General Public License (GPL) (see the file <tt>LICENSE</tt> which comes with Grace or the <url url="http://www.gnu.org" name="GNU Home Page"> for details). <sect1>Who wrote Grace? <p> The sources of Grace still contain a significant amount of code from Xmgr by Paul Turner. For a list of those who contributed to Grace since then, see the file <tt>CHANGES</tt> in the Grace distribution. <p> Some integral parts of Grace are borrowed from other packages, namely libraries which are also available as stand-alone distributions. In alphabetical order: <itemize> <item> <url url="http://www.moshier.net/" name="Cephes math library"> <item> <url url="http://metalab.unc.edu/pub/Linux/libs/graphics/" name="T1lib"> <item> <url url="http://www.lesstif.org/Xbae.html" name="Xbae"> </itemize> <sect1>Is there a Postscript|LaTeX|HTML|SGML version of this document? <p> Yes. It is written in SGML which means that all the above versions can easily be created using <tt>sgml-tools</tt> (see their <url name="home page" url="http://www.sgmltools.org/">). At the Grace home page (see question <ref id="homepage" name="Home Page">), all these versions are available. <!-- **************************************** --> <sect>Getting Help <p> <sect1>Are there any books about Grace? <p> As of now, Grace is a purely virtual creature living in the net, i.e. there is no printed literature. All relevant docs are currently bundled with Grace. See questions <ref id="homepage" name="Home Page"> and <ref id="manual" name="User's Guide"> for details. You can print your own copy of the FAQ, the User's Guide and the Tutorial by converting the DVI files to PostScript output. <sect1>Is there a User's Guide available for Grace? <label id="manual"> <p> Yes. It is part of the Grace distribution and usually is located in <tt>$GRACE_HOME/doc/</tt>. There are several versions: the SGML source and HTML, LaTeX, DVI and PS derived from it. You can read the HTML version from a running Grace session by clicking on <tt>"Help/User Guide"</tt>. You need a web browser to read the HTML version (see also question <ref id="environment" name="Environment Variables">). You can always download the newest version from the Grace homepage (see question <ref id="homepage" name="Home Page">). The User's Guide is not quite complete, yet. <sect1>Is there a Tutorial available for Grace? <label id="tutorial"> <p> Yes. There are several tutorials which give detailed step-by-step information how to achieve various tasks. They are also part of the Grace distribution. You can find them in <tt>$GRACE_HOME/doc/</tt>. There are tutorials about creating a simple plot, batch plotting, fitting curves, transformations (graphical - simple ones, interpolation, feature extraction, using the command line), using pipes, overlaying graphs, hot links. <sect1>Where do I get support for Grace? <label id="support"> <p> You have the following options: <itemize> <item>There is a User's Guide (see question <ref id="manual" name="User's Guide">) which came with Grace on your computer. It is usually located in <tt>$GRACE_HOME/doc/</tt> along with other files which may contain useful help for your problem. If you downloaded the sources, there are even more files in the main directory of the source tree. <item>Have a look at the Grace home page (question <ref id="homepage" name="Home Page">). <item>On the Grace forums (see question <ref id="forums" name="Forums"> for details) you can easily get in contact with users and developers of Grace. However be aware that people here are trying to help in their spare time - so you can't always expect quick responses. </itemize> <sect1>Is there a newsgroup devoted to Grace? <p> No, there isn't. We feel that a bulletin board (see question <ref id="forums" name="Forums">) is more appropriate to discuss the topics related to Grace. <sect1>Is there a mailing list for Grace? <p> There used to be a few, but now they are replaced with bulletin-board-style forums (see question <ref id="forums" name="Forums">). The <url name="mailing list archives" url="http://plasma-gate.weizmann.ac.il/Grace/maillists/grace/"> are still available for browsing. <sect1>Is there a forum for Grace? <label id="forums"> <p> Yes. Just follow this link: <url name="forums" url="http://plasma-gate.weizmann.ac.il/Grace/phpbb/">. It has its own FAQ. <!-- **************************************** --> <sect>Providing Help: Finding and Reporting Bugs <p> <sect1>I think I found a bug in Grace! How do I report it? <label id="bugreport"> <p> <descrip> <tag>First</tag> Make sure that what you found really is a bug. <tag>Second</tag> Try to make sure that it is a bug in Grace, and that the failure is not caused by another piece of software. <tag>Third</tag> Make sure you are running the latest official release of Grace. The development of Grace is rather fast, so your bug might already be fixed. <tag>Fourth</tag> Try to find out if the bug is already known (see question <ref id="w3todo" name="Known Bugs">). <tag>Fifth</tag> OK: You <em>have</em> found a new bug. Use <bf>w3todo</bf> (question <ref id="w3todo" name="Known Bugs">) to report it. Follow the instructions on the page and try to be as precise as possible. It won't be of much help if you write ``The program crashes.'' Try to find a simple reproducible case. Mention the version of Grace and where you got the build and the operating system you use. You should submit the system info as provided by ``uname -a'' (if this utility exists, of course) and the output of ``xmgrace -version''. Often the problem is related to some specific data set. Please try hard on reducing this to the minimum which is sufficient of reproducing the bug. If it's only a few lines of data please submit it together with the other details. Once you submit the bug report, it will be automatically relayed to the mailing list. You will usually be notified when the bug is fixed or if we need more information, so please don't forget to give your correct e-mail address. </descrip> <sect1>Is there a list of known bugs? <label id="w3todo"> <p> Yes. You can search and browse the database of known bugs in Grace at the bug report facility <url name="w3todo" url="http://plasma-gate.weizmann.ac.il/w3todo/index.phtml"> or using the <tt>"Help/Comments"</tt> menu from within Grace. The database also keeps track of the status of the bug (<tt>Confirmed, Working on, Testing, Fixed, Closed,</tt> etc.). This is also the place to submit bug reports and wishes. <p> Some bugs and fixes may not appear in w3todo, but are covered on the <ref id="forums" name="forums">. <sect1>The bug report #xxx is marked as "Fixed" in the w3todo, but I checked the last version of Grace and the bug is still there! <p> The term "fixed" means the bug is fixed in the current <it>development</it> version, and the next <it>public</it> version will have the fix in it. Reports with fixes incorporated in an existing public version are marked as "Closed". <sect1>The bug report #xxx I reported is marked as "Ignored" in the w3todo and I even got no reply?! <p> You must have missed something very obvious. Check out how to properly submit a bug report in this document. Most probably your report was incomplete or just redundant to an existing entry. It's worth checking the log file of the bug report (the "View log" button at the bottom of the report viewing page). <sect1>I have got an idea! How do I report a wish? <p> You can submit wishes and suggestions just the way you would submit bug reports (see question <ref id="w3todo" name="Known Bugs">). Suggestions for improvement are generally very welcome. It may be possible, however, that the developers are busy or that your wish is rejected for some good reason, so it may be necessary to persuade (better convince) them to get at it. <sect1>I want to help! How can I contribute to Grace? <p> Fine! There are always things to do. If you are a C programmer, you can almost certainly find something useful to do. Just ask on the forums. The same applies if you are a technical writer. The documentation will certainly need to be updated, corrected or completed. Every small contribution is appreciated! Make Grace known to your friends and colleagues. The more users Grace has, the faster it will be improved. <sect1>How do I submit patches/contributions? <p> Prepare diffs against the most recent version. Use either unified (-u) or context (-c) diff format. Specify exactly against which version the diff is supposed to work. Finally send them to <url url="mailto:fnevgeny at weizmann dot ac dot il"> In case you plan to help this way more than once you should join the <ref id="forums" name="forums">. <sect1>I like Grace! Should I donate anything to its authors? <p> No need to. But if you feel like making a donation, choose any charity organization you like. You wanted to give them some money, anyway, right? ;-) <!-- **************************************** --> <sect>Installation <p> <sect1>How do I install Grace? <label id="install"> <p> You have the choice: either you compile the sources yourself or you download precompiled binaries (we strongly suggest you take the first route). You can get both from the <url url="http://plasma-gate.weizmann.ac.il/Grace/" name="Grace Home Page">. Whether binaries for your platforms are available (see question <ref id="binaries" name="Binaries">) depends on whether one of the developers has access to the respective platform and has had time to do it. It is always a good idea to read the <tt>README</tt>s that accompany the downloading packages of Grace. <sect1>Can I compile Grace myself? <p> Yes! Actually, this is the preferred method of installation. After getting the sources (question <ref id="install" name="Installation">) and un<tt>gzip</tt>ping and un<tt>tar</tt>ing them (use e.g. <tt>gzip -dc grace-5.0.4.tar.gz | tar xvf -</tt>), proceed according to the relevant section of the <ref id="manual" name="User's Guide">, which covers the compilation process. <sect1>When I run `configure', it says the XXX package is not found, whereas I am certain it was installed on my system! <p> There are several possible reasons: <itemize> <item> You have only the run-time part installed (this especially concerns GNU/Linux users). However, you should have the relevant development package (C header files etc) installed, too. E.g., for the JPEG library to be recognized by `configure', <it>both</it> <tt>libjpeg62</tt> and <tt>libjpeg62-devel</tt> packages must be installed. </item> <item> The library and the header files don't match each other (they are from different versions). This usually happens on large Unix systems with a less than capable sysadmin... </item> <item> Either the library or the header files can't be found by the compiler. Use the <tt>--with-extra-ldpath</tt> and <tt>--with-extra-incpath</tt> configure options to provide the extra paths, respectively. </item> </itemize> <sect1>When I type './configure' I get: ``configure: error M*tif has not been found'' <p> Check whether M*tif (question <ref id="motif" name="M*tif">) is installed on your system. If it is, look at the file config.log: there is a line like this: <tt>configure:8900: checking for a Motif >= 1002 compatible API</tt> What comes directly after it? Could be a hint. Also, see the previous question. <sect1>What is Motif (LessTif)? <label id="motif"> <p> Throughout the Grace docs, saying "M*tif" we actually refer to the Motif <it>API</it>, defining a set of functions for building graphical user interfaces (GUI) via numerous widgets (buttons, labels, etc). Grace makes a heavy use of the M*tif API. There are several <it>implementations</it> of the interface. The original OSF Motif (see <url url="http://www.opengroup.org">) recently changed its license: on open-source platforms you may have a chance to use it for free, although it's not in general qualified as either a FreeSource or OpenSource product. There is, however, a free replacement for Motif called LessTif (see <url url="http://www.lesstif.org">). LessTif is intended to be a 100% source compatible replacement for Motif, but is still under development. For the purposes of Grace, try using the latest version of LessTif (at least 0.92.6 and above). The LessTif people usually receive many bug reports from the Grace developers, so you might hope that a few remaining bugs in LessTif will be fixed rather quickly. <sect1>`configure' stops telling it can't find "ar". <p> "ar" is the library archiver (the program used to create static libraries like libFoo.a). You should have it in your path. Under Solaris, for example, this can be found in /usr/ccs/bin. <sect1>Are there Grace binaries available? For which platforms? <label id="binaries"> <p> We do not officially support binary packages. When contributed by volunteers they're put in under the <url name="contrib" url="ftp://plasma-gate.weizmann.ac.il/pub/grace/contrib/"> area. Again, these are NOT supported (bug reports like "I can't install that RPM" will be silently ignored), but feel free using the Grace forums for relevant discussions. <sect1>Is there a Windows|OS/2|VMS port of Grace? <p> Yes, Grace runs on VMS. Just compile it there. As for Win32 (Windows 95/98/NT/2000/XP) and OS/2, there are ports for these platforms, though they are not "native", i.e. in order to run them, one needs an X server for the respective platform. Both OS/2 and Win32 ports may lack some of the functionality (notably, support for "direct"/native printing; probably you will have to use the Postscript output for printing). A port to OS/2 made by Alexander Mai can be found at <url url="http://www.tu-darmstadt.de/~st002279/os2/">. It requires the XFree86 libraries and an X Server (e.g. XFree86, Hob X11, Exceed, etc.). <sect1>Compilation with gcc fails on Solaris complaining about unresolved symbols. <p> If you get such a message at the linkage stage, telling about .LL794 (or similar) unresolved symbols, try compiling with native cc compiler instead (./configure --with-cc=cc). <!-- **************************************** --> <sect>Runtime Problems <p> <sect1>When I start Grace I get the message ``Can't find library libXXX.so'' or similar. <p> For certain tasks, Grace needs external libraries which are neither provided by Grace nor the operating system. You will need to install these libraries yourself. This applies to M*tif, PDF (see question <ref id="export" name="Output Devices">) and probably other libraries. If the message is exactly <tt>Can't find library libXm.so</tt> (usually this happens on GNU/Linux systems ...) then you don't have M*tif (the Xm libraries) installed (see question <ref id="motif" name="M*tif">), or the linker doesn't know where it is. In the first case, try downloading LessTif. In the second case, you have to tell your linker where it is (may be a platform-specific task). On GNU/Linux look at the file <tt>/etc/ld.so.conf</tt>. It contains pathnames of the directories where dynamic libraries are stored. Add (as root) your directory to this file and run <tt>ldconfig -v</tt>. Now the libraries should be in the list. If you're not root you may try to adjust the environment variable <tt>LD_LIBRARY_PATH</tt> to include the required pathname. For some versions of Motif, the ``soname'' (which identifies the version of the library and is stored somewhere in the library) on your computer doesn't match the soname of the library on the computer where your copy of Grace was compiled on. Then you should use a (semi)statically linked version or compile Grace on your computer. <sect1>I get errors like "X Error of failed request: BadValue (integer parameter out of range for operation)" <p> This means that Grace made an incorrect access to an X library. This is most probably not Grace's fault. Probably a not-yet-correctly-implemented LessTif function (see question <ref id="motif" name="M*tif">) caused this behaviour. If you use LessTif, try to get the latest version (see question <ref id="motif" name="M*tif">). If this error persists, report it as a bug (question <ref id="bugreport" name="Bug Reports">). <sect1>Grace crashes with "Oops Got SIGSEV" (on GNU/Linux) <p> Detect whether you are using a version linked against LessTif. "xmgrace -version" and "ldd xmgrace" are useful commands for this purpose. <p> If you are using LessTif, read the according FAQ <ref id="motif" name="M*tif"> else report it as a bug (<ref id="bugreport" name="Bug Reports">). <sect1>I run Grace and get the following error messages: "Warning: translation table syntax error: Unknown keysym name: osfPageLeft Warning: ... found while parsing '<Key>osfPageLeft:SWLeftPage()'" <p> Get the XKeySymDB file from the X11R6 distribution. Put it somewhere where you can access it and set the <tt>XKEYSYMDB</tt> environment variable to <tt>"/place/where/you/put/XKeysymDB"</tt>. See question <ref id="environment" name="Environment Variables"> on how to set environment variables. <sect1>I run Grace on a Solaris 2.5.1 box, and when I try to open a file, I can't read the names of the files (files section of the dialog) because Grace writes ALL the path of each file in the list and there is no horizontal scroll. <p> This is a known bug of Motif implementation on Solaris 2.5.1 (both Sparc and Intel hardware). Ask your vendor for a patch. <sect1>Grace can not find font database and initialize the T1 library <p> You have probably tried to run Grace without installing it, just after compilation. You got the following message : <tscreen><verb> scanFontDBase(): Font Database File not found T1_InitLib(): Fatal error scanning Font Database File --> Broken or incomplete installation - read the FAQ! </verb></tscreen> Grace uses either the <tt>GRACE_HOME</tt> environment variable or a compiled in default path to find the font database. If the variable is not set and you have not installed the database with <tt>make install</tt> it cannot find it. If you want to test Grace before installing it, you should set the environment variable to the distribution directory (the one where the file <tt>configure</tt> lies), this is what the <tt>dotest</tt> script does when you run <tt>make check</tt>. The easiest thing to do however is to install everything with <tt>make install</tt>. See question <ref id="environment" name="Environment Variables"> on how to set environment variables. If you get this message after installing a prebuilt package, then you have either forgotten to download the platform-independent part of the installation (named like grace-x.y.zz.common.tar.gz) or not set the <tt>GRACE_HOME</tt> environment variable, see a few lines above. <sect1>Pressing Ctrl and clicking with the left mouse button on the canvas or dialog panels make Grace crash. <p> This is a known bug in Motif-2.1. Most vendors have fixed it in their ports and/or have a patch ready, but not all, a notable exception being Motif libraries shipped by Red Hat for GNU/Linux for Intel hardware (versions 6.*). Grace has a workaround for this bug. In order to enable it, add the following lines to the X resources: <tscreen><code> XMgrace*XmDrawingArea.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmRowColumn.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmForm.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmFrame.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmScrolledWindow.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmFileSelectionBox.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmScale.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmCommand.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() XMgrace*XmMessageBox.translations: #override\n\ Ctrl <Btn1Down>: do_nothing() </code></tscreen> <sect1>The size of the canvas is huge. <p> It should be exactly the size of the hardcopy (A4/US letter). If not, check your X server settings (run `xdpyinfo' and watch the "dimensions:" line; check the numbers with a ruler). <sect1>Extended ASCII characters do not appear and/or appear as incorrect control characters in text input fields. <p> Are you using OpenMotif 2.2 (see Help/About)? It's known to behave wrongly with several locale settings. Try setting the shell variable LANG to a safe value, e.g. "C". The bug is known and fixed (<url url="http://bugs.motifzone.net/show_bug.cgi?id=1257" name="bug #1257">). Nag your vendor to apply the patch. <sect1>File selection dialogs are unusable. <p> It happens with OpenMotif 2.2 and some locale settings. See the previous entry for a remedy. <sect1>All of the text in the menus and dialog boxes are represented as squares. <p> This happens when a Unicode font is picked by the X/Motif and, for a reason, is treated as a wchar one (so you see one "square" glyph for every two chars). Try different font settings; for starters, run <tscreen><code> xmgrace -xrm "XMgrace*fontList:fixed" </code></tscreen> <sect1>On Fedora Core 4, all set selectors collapse into a single of even a zero-height line after a few operations. <p> FC4 uses a BETA version of OpenMotif 2.3 (see Help/About). The bug is known and fixed (<url url="http://bugs.motifzone.net/show_bug.cgi?id=1331" name="bug #1331">). Ask Fedora folks to apply the patch. <!-- **************************************** --> <sect>Basic Concepts <p> <sect1>What is a project? <p> A project is a file which contains all information necessary to restore a plot created by Grace. <sect1>What is a parameter file? <label id="parameter"> <p> A parameter file contains informations about settings. Every batch command of Grace is a valid line in a parameter file. A parameter file is essentially a project file without sets in a slightly different format (i.e. without leading <tt/@/s). <sect1>Which data formats does Grace recognize? <p> You can read in several kinds of files where data is arranged in columns separated by spaces or tabs. Lines beginning with "#" are ignored. <sect1>What is block data? <p> The option <tt>Read Block Data</tt> can be used to read in files where the values are organized in columns. You can interactively select the type of set to be created and which columns should be used. Refer to the User's Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>What is the NXY data type? <p> Strictly speaking, it's not a data format. Rather, you may want to use the relevant command line switch to read in a block data file and automatically assign the data columns to sets of the XY type so that the first column of the block data is used as X for all the sets and the rest of the data columns are assigned to Y's. Refer to the User's Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>What is the Julian Date?<label id="jdate"> <p> The Julian Date, not to be confused with the Julian calendar, is a format to represent the time in a single number. Julian Date 0 is a day way in the past, namely the 1st January 4713 before Christ (don't ask me why). The following days are numbered sequentially, each day starting at noon. This numbering scheme is in wide use, especially in astronomy, and is used for the internal representation of dates in Grace. Some further explanations are given on <url url="http://en.wikipedia.org/wiki/Julian_day" name="this page">. The <tt>convcal</tt> utility in <tt>$GRACE_HOME/auxiliary/</tt> can be used for about any to Julian date convertion. <!-- **************************************** --> <sect>Using Grace <p> <sect1>How do I start Grace? <p> There are three ways to invoke Grace. The full-featured GUI-based version is called <tt>xmgrace</tt>. A batch-printing version is called <tt>gracebat</tt> (see question <ref id="gracebat" name="Gracebat">). A command-line interface mode is called <tt>grace</tt>. All three of them are usually located in <tt>$GRACE_HOME/bin/</tt>. <sect1>Where is gracebat? How does batch printing work? <label id="gracebat"> <p> <tt>gracebat</tt> is simply a copy of Grace named <tt>gracebat</tt> or a symbolic link from <tt>gracebat</tt> to Grace. In the case of the symbolic link: <tt>ln -s xmgrace gracebat</tt> done wherever the Grace binary is located will do the trick (rehash or logout and login to make sure that <tt>gracebat</tt> shows up in your path). Executing <tt>gracebat</tt> with no command line parameters or data files will produce a hardcopy on the default printer. <sect1>How can I customize the default appearance of Grace? <label id="custom"> <p> There are several ways: the init files, X Resources, and environment (shell) variables. Please refer to the User's Guide (question <ref id="manual" name="User Guide">) for details. <sect1>Which environment variables does Grace use? <label id="environment"> <p> There are few, the most important being <tt>GRACE_HOME</tt>. It specifies the directory where the Grace files (fonts, docs, libs, ...) are stored. Default is <tt>/usr/local/grace</tt>. You can set environment variables using (e.g.): <tt>export GRACE_HOME="/usr/local/grace"</tt> in bash and sh or <tt>setenv GRACE_HOME "/usr/local/grace"</tt> in tcsh and csh. Please refer to the User's Guide (question <ref id="manual" name="User Guide">) for description of all relevant variables. <sect1>What command line options does Grace recognize? <p> Quite a few. You can display them with <tt>xmgrace -help</tt>. Or check for the man page xmgrace(1). However it may not always be up-to-date. <sect1>Can one change the colour selecton for the menu, locator, tool, and status bars, and all the popup menus? <p> As with any X application, use the "-bg <colorname> -fg <another_colorname>" command line flags. Or, define the relevant X resources: <tscreen><verb> XMgrace*foreground: ... XMgrace*background: ... </verb></tscreen> <sect1>What different kinds of sets can Grace plot? <p> The standard set is the regular (x,y) set, but there are others including error bars or descriptive strings. See the User's Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>I'd like to plot data against an axis on the right (top) and another data set in a different scale against an axis on the left (bottom) <p> Use two overlaying graphs, one with a scale on the left(bottom), the other one on the right (top). Thus you can achieve the desired effect, but you'll need to pay close attention to which graph is the 'current' graph. This is also how to display a second scale on the top (right) side of the graph. <sect1>How do I do polar plots? <p> The support for polar plots is currently being implemented, so you can expect polar plots to work soon. The polar coordinates can be selected from the <tt>"Plot/Graph Appearance"</tt> menu. Please refer to the User's Guide (question <ref id="manual" name="User Guide">) for details. <sect1>Can I use different fonts, symbols, font size, or sub/superscripts in Grace? <p> Yes, Grace has all these features. Wherever you can type a text in Grace, e.g. Axis labels, graph title, text from <tt/Plot->Drawing objects/, etc., you can use all those features within the same text. Please refer to the User Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>How do I produce special characters (Umlauts) with Grace? <p> If you asked this question, then you are probably familiar with the issue of keymap modifying in X. Once you configured the key mapping (with the use of <tt>xmodmap</tt>), you can enter the extended characters from the keyboard in any text input field. If, in addition, the appropriate for your language font encoding is anything but ISO Latin1 (used in most Western Europe countries), you'll have to tell Grace so. See the <ref id="fonts" name="next question">. <sect1>Can I use my own fonts and/or encodings? <label id="fonts"> <p> Yes. Starting with version 5.0.1, you can use your own fonts, in addition to the standard 14 fonts which include Times-Roman, Helvetica, Courier, Symbols and Zapf Dingbats and come with Grace, and as a replacement for the default fonts (for the purporse of localization). As well, an alternative encoding scheme can be specified. Please refer to the User's Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>At which precision is numerical data saved? How can I set the precision? <p> By default, numbers are saved with eight valid digits. To set your own precision, use the command <tt>DEFAULT SFORMAT formatstring</tt> in an init resource file (see question <ref id="custom" name="Customization">) with formatstring being in the <tt>printf(3)</tt> format. As well, you can set the precision on a per-project basis. When you save a project for the first time (or use "File/Save as"), there is a relevant "Data format" field in the popup you are presented with. <sect1>When I save a project and then re-open it, the Julian date values appear to be rounded to the nearest half day. <p> For time plots, the default precision may be insufficient. See the previous question on how to alter it. <sect1>How do I read in project files created by Xmgr? <p> From Xmgr-4.1.2 on, each project file starts with a string giving the version number by which is was saved. These files should cause no problems. You can modify older files by inserting a version line at the beginning. For example, <tt>@VERSION 40102</tt> stands for version 4.1.2. If you have no idea what version of Xmgr your file was created with, try some. In most cases, 40102 would do the trick. Also, make sure to read the "Xmgr to Grace migration" section of the User's Guide (question <ref id="manual" name="User's Guide">). <sect1>I can't open anymore project files saved with an old version of Xmgr. <p> In Xmgr-4.1.0, support for the binary file format (the former default one) was dropped. You must use the <tt>grconvert</tt> utility supplied with the Grace distribution in order to convert the files. This can easily be achieved defining an input filter like in the <tt>gracerc</tt> sample file which comes with Grace. <sect1>When I load a project saved with an earlier version of Xmgr (<4.0), symbols of all (some) sets are drawn in black. <p> Make sure you added a valid <tt>@VERSION versionid</tt> line to the beginning of the file. <sect1>How do I save disk space? Can I use compressed project files? <p> Yes. You can use your favorite compression program (e.g. `gzip') as input or output filter so that files on disk are automagically (de)compressed. Just add the lines <tt>DEFINE IFILTER "gzip -dc %s" PATTERN "*.gz"</tt> and <tt>DEFINE OFILTER "gzip - > %s" PATTERN "*.gz"</tt> into your personal grace init file. Then, everytime you specify a file name that ends with <tt>.gz</tt>, gzip is used as input and output filters. You can use this mechanism to do other things, e.g. reading and storing files into a database. <sect1>Can I import bitmap graphics into Grace? <p> Well, not yet. The import of images will be implemented in a future release. <sect1>Can I export Grace graphs to GIF|TIFF| PostScript|PDF etc? <label id="export"> <p> PostScript (for printing), EPS (encapsulated PostScript; for the inclusion of graphics into e.g. LaTeX documents), PNM (PBM/PGM/PPM), MIF (for inclusion in FrameMaker) and SVG (Scalable Vector Graphics) are implemented by default. Additionally, if some extra libraries are installed, listed in the User's Guide (question <ref id="manual" name="User's Guide">), the JPEG, PNG, and PDF backends will be built as well. You can get various other formats using netpbm and pstoedit. Bitmaps: Using the PNM device + the <tt>netpbm</tt> utils (available at e.g. <url url="ftp://ftp.x.org/contrib/utilities/"> one can get TIFF, GIF, G3, BMP, PCX,... (conversion can be done on the fly with appropriate filter definitions). Notice that the direct support of the GIF format is impossible due to the copyright policy of Unisys - it's not a technical problem. In fact it was supported in earlier versions but to avoid any legal problems this feature has been removed. One can use <url name="pstoedit" url="http://www.geocities.com/SiliconValley/Network/1958/pstoedit/"> to convert PS to a lot of other vector formats: MIF, CGM, xfig's, tgif's, Windoze and OS/2 metafiles,... even Java applets! <sect1>Where have all the region operations gone to? <p> Region operations have no meaning by themselves. Regions are restriction conditions applied to data set(s) which a transformation is performed on. For example, to kill data points in a region, use "Evaluate expression", select same source and dest set(s), leave the "formula" field empty, select your region in the "Restriction" menu, check "Negated". <sect1>How can I input data in date/time formats? <p> You can use several date/time formats in input data files. Make sure, however, that the time fields don't contain space separators inside, e.g. 1999-12-31-23:59:59.5 Also, you can use an external program to convert the data into the <ref id="jdate" name="Julian Date"> format, like the one (convcal) that is supplied with Grace. <sect1>How do I set the background color of a plot, outside of the graph frame? <p> This can be done using the <tt>"Plot/Plot appearance"</tt> popup. This changes the background of the entire canvas, not only the background of graphs. <sect1>How do I use more than 16 colors for objects/lines in Grace? <p> You may edit your Default.agr file in <tt>$GRACE_HOME/templates</tt>. Just add lines similar to <verb> @map color 2 to (255, 0, 0), "red" </verb> defining a RGB value and an according name for that color triplet. Please notice that altering colors 0 (white) and 1 (black) is strongly discouraged. <sect1>How can I use pipes with Grace? <p> A named pipe is a pseudo file to which one application writes data which another one reads from it. Applications like measurement programs can write data to a pipe and make it thus available to Grace which reads from the pipe. So Grace can serve as data displayer for otherwise non-graphical programs. Refer to the User's Guide (question <ref id="manual" name="User's Guide">) or the tutorials (question <ref id="tutorial" name="Tutorials">) for further information. One example for using pipes is included in the <tt>`make tests'</tt> slide show. <sect1>Is it possible to make Grace starting with a completely empty canvas, until the commands are loaded and executed? <p> Start Grace with -pexec "G0 OFF" or load a parameter file with the above command. <sect1>When I include an EPS file generated by Grace into my (La)TeX document, the graphic hides some of the surrounding text. <p> LaTeX does not do hard clipping of EPS files unless instructed to do so. Use \includegraphics*{filename} and NOT \includegraphics{filename} (package <tt>graphics</tt>) or \includegraphics[clip]{filename} (package <tt>graphicx</tt>). If using the <tt>epsf</tt> package, remember to include the \epsfclipon flag (but note that the <tt>epsf</tt> package is obsolet and buggy and not maintained by the LaTeX team and in general should not be used). The erasing comes about because Grace fills the background with the page size and not the bbox size. The background filling can be disabled from the "Plot/Plot appearance" popup. <sect1>Printing to my old PostScript printer produces an error. <p> By default, the PS driver uses Level 2 features, while your printer may not be PostScript Level 2 compliant. You can force the use of PS Level 1 only features in the PostScript device setup, though output may be not exactly as expected (there will be no pattern fills, for example). <sect1>How do I make a Grace image fit on a given paper size? <p> Select the correct paper size in the <tt>Device setup</tt> popup. You can also try the command psresize from the <url name="psutils package" url="http://www.dcs.ed.ac.uk/~ajcd/psutils/"> in order to resize a Postscript file generated by Grace. <sect1>My decimal tick labels are systematically of the form e.g. 0,5 instead of 0.5 (i.e. I get a comma instead of a dot). <p> You're using a localized version of OS. You have either LANG or LC_NUMERIC shell variables set, so Grace uses the locale setting to produce numeric labels. Set at least LC_NUMERIC to C or POSIX to disable this behaviour. Notice that there is nothing specific to Grace about locale. Either you want the localization or not. Setting by default LANG to anything but C/POSIX assumes you do. <sect1>Is it possible to use the dB (decibel) axis scale? <p> In "Plot/Axis props", enable logarithmic axis scaling, then go to the "Tick labels" tab of this dialog, find the "Axis transform" input field in the "Extra" frame, and enter there "10*log10(10*$t)" (w/o quotes, of course). <sect1>In "Data set properties", I don't see a possibility to view the more essential part of the mantissa; it's swallowed in the black triangle. <p> If you find some columns are too narrow to show all significant digits, you can drag the vertical rules using Shift+Button 2. <sect1>When making use of <it>-param</it> via the command line to set the parameters, the world scaling is not correctly set (it just auto-scales). <p> The <it>-param</it> flag and its argument should be placed on the command line <bf>after</bf> the data filenames. Alternatively, disable the autoscale with <it>-autoscale none</it> - but <bf>before</bf> your data is read in. <sect1>I am unable to find "Load & Evaluate" which I used quite a lot with Xmgr. <p> Use "Create new->By formula" from any set selector popup menu. <sect1>How can I specify a template other than the default one on the command line? In the scripts? <p> Template is just an empty (in the sense that there are no data sets) but otherwise a valid project file. So just put your favorite template's filename as the first argument on the command line. If your script creates several plots, use 'new from "filename"' to initialize a new project from the non-default template. <sect1>How can I save my 'preferences' options? <p> A part of them are saved with the project; most of the rest are available via command-line options and/or X resources. A more homogeneous approach will be implemented in a future version. <sect1>In an XY-plot with a huge number of points some regions become straight lines instead of the original curve. When I zoom in to the area the data becomes correctly drawn. <p> Enlarge "Max drawing path length" in Edit/Preferences. Also, consider whether you really need that huge number of points drawn connected by line? <!-- **************************************** --> <sect>Mathematics <p> <sect1>What algorithm is used for non-linear curve fitting? <p> It is the Levenberg-Marquardt algorithm, based on LMDIF from MINPACK, with some modifications. <!-- **************************************** --> <sect>Command Line Interface <label id="commands"> <p> <sect1>Which non-interactive batch commands does Grace know? <p> Lots. Almost every mouseclick in the GUI has an equivalent in the batch language. See the User's Guide (question <ref id="manual" name="User's Guide">) for details. <sect1>How can I do feature extraction non-interactively? <p> Currently not at all. This will be implemented in a later release. <sect1>How can I use non-linear fits in the batch mode? <p> Example - make a batch file with the following commands: <verb> fit formula "y = a0 + a1 * sin (a2 + x * pi / 180)" fit with 3 parameters fit prec 0.05 a0 = 1 a0 constraints on a0min = 0 a0max = 2 a1 = 1 a1 constraints off a2 = 1 a2 constraints off nonlfit (s0, 100) </verb> This assumes that your original curve is in set s0 and that you want to make 100 iterations. <tt>nonlfit()</tt> doesn't produce any plots by itself. It only <bf>fits</bf>. I.e., at this point, you can use the fitted values <tt>A0, A1, A2...</tt>: Plot a set, e.g.: <verb> s3 on s3 length s0.length s3.x = s0.x s3.y = a0 + a1 * sin (a2 + x * pi / 180) </verb> Use for another fit as the initial values, or just ECHO them (to <tt>stdout</tt>) with <tt>ECHO A0</tt>. <sect1>Is it possible to call the command "POINT expr, expr" with more than two values, as needed, for example, for points in XYDYDY sets? <p> No, but you can do something like this (given the set type was properly defined): <verb> S0 POINT expr, expr S0.Y1[S0.LENGTH - 1] = expr S0.Y2[S0.LENGTH - 1] = expr ... </verb> <!-- **************************************** --> <sect>Miscellaneous <p> <sect1>Does Grace have an UNDO function? <p> Not yet. Although it would be nice to have such a function, it is quite hard to implement. We can only ask you to be careful with certain actions and remember to <tt>save often and early (TM)</tt>. <sect1>Can Grace plot 3D graphs? <p> No. Not yet, I should say. Be patient. It may take quite a while to implement it, though. <sect1>Which features are planned for the future? <p> Among the many features planned to be introduced in the future are enhancing the spreadsheet-like frontend for dataset operations, contour plots, many-level undo/redo, image import and manipulations, a library for 2-way communication, ... Then 3D plots would come :-) <sect1>Are there things that Grace can't do? <p> Probably. If you have an idea for improvement, post it as a wish to the w3todo web page (see question <ref id="w3todo" name="Known Bugs">). <sect1>How should Grace be acknowledged when it is used to prepare a publication? <p> You are not required to, but you if wish, refer to the home page link (see <url url="http://plasma-gate.weizmann.ac.il/Grace/" name="Grace home page">). </article> <!-- End of FAQ.sgml --> �������������������������������������������������������������������������������������grace-5.1.23/doc/Makefile���������������������������������������������������������������������������0000644�0000765�0000144�00000004651�07505061045�014645� 0����������������������������������������������������������������������������������������������������ustar �fnevgeny������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������##################################################### # Makefile for documentation of Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf .SUFFIXES : .sgml .dvi .html .pdf .ps .tex # NB: the language and papersize options should be made `configure'able LANGUAGE = english PAPERSIZE = letter LINUXDOC = linuxdoc --language=$(LANGUAGE) --papersize=$(PAPERSIZE) SGML2HTML = $(LINUXDOC) --backend=html --split=0 --toc=2 SGML2LATEX = $(LINUXDOC) --backend=latex --output=tex SGML2DVI = $(LINUXDOC) --backend=latex --output=dvi DVI2PS = dvips -t $(PAPERSIZE) LATEX = latex PDFLATEX = pdflatex .sgml.html : $(SGML2HTML) $< .sgml.dvi : $(SGML2DVI) $< .sgml.tex : $(SGML2LATEX) $< .tex.dvi : $(LATEX) $< $(LATEX) $< .dvi.ps : $(DVI2PS) $< -o $@ .tex.pdf : $(PDFLATEX) $< $(PDFLATEX) $< SGMLS = FAQ.sgml Tutorial.sgml UsersGuide.sgml HTMLS = CHANGES.html GPL.html philosophical-gnu-sm.jpg nohelp.html HTMLDOCS = FAQ.html Tutorial.html UsersGuide.html DVIDOCS = FAQ.dvi Tutorial.dvi UsersGuide.dvi PSDOCS = FAQ.ps Tutorial.ps UsersGuide.ps PDFDOCS = FAQ.pdf Tutorial.pdf UsersGuide.pdf TEXDOCS = FAQ.tex Tutorial.tex UsersGuide.tex TUTDATA = 2.1.dat 3.dat 7.1.2.agr 7.1.3.agr 8.2.dat \ 10.1.dat 10a.dat 10c.dat 10b.dat shiftdata.sh mygraph.png GRACEMAN = grace.1 MANLINKS = xmgrace.1 gracebat.1 MANPAGES = $(GRACEMAN) grconvert.1 convcal.1 all : html dvi html : $(HTMLDOCS) dvi : $(DVIDOCS) pdf : $(PDFDOCS) ps : $(PSDOCS) tex : $(TEXDOCS) clean : $(RM) $(TEXDOCS) *.aux *.log *.toc distclean : clean $(RM) *.orig devclean : distclean $(RM) $(DVIDOCS) $(PSDOCS) $(PDFDOCS) $(HTMLDOCS) install : $(HTMLS) $(HTMLDOCS) $(DVIDOCS) $(TUTDATA) $(MANPAGES) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/doc for i in $?; do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/doc; done cd $(DESTDIR)$(GRACE_HOME)/doc; \ for i in $(MANLINKS); do $(RM) $$i; $(LN_S) $(GRACEMAN) $$i; done $(DESTDIR)$(GRACE_HOME)/doc/grace.1 : $(MANPAGES) $(MAKE) install links : $(DESTDIR)$(GRACE_HOME)/doc/grace.1 $(MKINSTALLDIRS) $(DESTDIR)$(PREFIX)/man $(MKINSTALLDIRS) $(DESTDIR)$(PREFIX)/man/man1 cd $(DESTDIR)$(PREFIX)/man/man1; \ for i in $(MANPAGES) $(MANLINKS); do $(RM) $$i; $(LN_S) $(GRACE_HOME)/doc/$$i $$i; done tests : dummy dummy : ���������������������������������������������������������������������������������������grace-5.1.23/doc/10b.dat����������������������������������������������������������������������������0000644�0000765�0000144�00000006523�06671062261�014265� 0����������������������������������������������������������������������������������������������������ustar �fnevgeny������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@type xy -9.42478 0.0181147 -9.23438 0.0299375 -9.04398 0.0409639 -8.85358 0.0507734 -8.66318 0.0589787 -8.47278 0.0652403 -8.28238 0.0692794 -8.09198 0.0708899 -7.90158 0.0699473 -7.71118 0.0664153 -7.52078 0.0603496 -7.33038 0.0518983 -7.13998 0.0412991 -6.94958 0.0288737 -6.75918 0.0150183 -6.56878 0.000192065 -6.37839 -0.0150973 -6.18799 -0.0303102 -5.99759 -0.0448931 -5.80719 -0.0582975 -5.61679 -0.0699998 -5.42639 -0.07952 -5.23599 -0.0864401 -5.04559 -0.0904207 -4.85519 -0.0912156 -4.66479 -0.0886832 -4.47439 -0.0827953 -4.28399 -0.0736415 -4.09359 -0.0614305 -3.90319 -0.0464871 -3.71279 -0.0292447 -3.52239 -0.0102347 -3.33199 0.0099285 -3.14159 0.0305653 -2.95119 0.0509518 -2.76079 0.0703429 -2.57039 0.0879967 -2.37999 0.1032 -2.18959 0.115294 -1.9992 0.123697 -1.8088 0.12793 -1.6184 0.127636 -1.428 0.122595 -1.2376 0.112741 -1.0472 0.0981701 -0.856798 0.0791434 -0.666398 0.0560876 -0.475999 0.0295894 -0.285599 0.000384056 -0.0951998 -0.0306602 0.0951998 -0.0625627 0.285599 -0.0942546 0.475999 -0.124607 0.666398 -0.152462 0.856798 -0.176666 1.0472 -0.196099 1.2376 -0.209715 1.428 -0.216571 1.6184 -0.215854 1.8088 -0.206917 1.9992 -0.189294 2.18959 -0.162727 2.37999 -0.127174 2.57039 -0.0828223 2.76079 -0.0300873 2.95119 0.0303898 3.14159 0.0977522 3.33199 0.170944 3.52239 0.248732 3.71279 0.329732 3.90319 0.412444 4.09359 0.495281 4.28399 0.576614 4.47439 0.654806 4.66479 0.728258 4.85519 0.795443 5.04559 0.854949 5.23599 0.905514 5.42639 0.946057 5.61679 0.975704 5.80719 0.993815 5.99759 0.999999 6.18799 0.994121 6.37839 0.976308 6.56878 0.946946 6.75918 0.90667 6.94958 0.856347 7.13998 0.797052 7.33038 0.730045 7.52078 0.656734 7.71118 0.578642 7.90158 0.497369 8.09198 0.41455 8.28238 0.331815 8.47278 0.250752 8.66318 0.172865 8.85358 0.0995409 9.04398 0.0320169 9.23438 -0.0286462 9.42478 -0.0815865 & �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������grace-5.1.23/doc/2.1.dat����������������������������������������������������������������������������0000644�0000765�0000144�00000000043�06671062261�014172� 0����������������������������������������������������������������������������������������������������ustar �fnevgeny������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 4 3 2 2 3 3 4 3 2 3 2 4 1 3 4 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������grace-5.1.23/doc/GPL.html���������������������������������������������������������������������������0000644�0000765�0000144�00000046523�06626627163�014535� 0����������������������������������������������������������������������������������������������������ustar �fnevgeny������������������������users������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> <HTML> <HEAD> <TITLE>GNU General Public License

GNU General Public License

 [image of a Philosophical Gnu]


Table of Contents


GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.  
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

  • a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

  • b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

  • c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

  • a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

  • b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

  • c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

one line to give the program's name and an idea of what it does.
Copyright (C) 19yy  name of author

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
type `show w'.  This is free software, and you are welcome
to redistribute it under certain conditions; type `show c' 
for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright
interest in the program `Gnomovision'
(which makes passes at compilers) written 
by James Hacker.

signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.


grace-5.1.23/doc/UsersGuide.html0000644000076500001440000046326512032153132016152 0ustar fnevgenyusers Grace User's Guide (for Grace-5.1.23)

Grace User's Guide (for Grace-5.1.23)

by the Grace Team

30.09.2012
This document explains the usage of Grace, a WYSIWYG 2D plotting tool for numerical data. (A German translation of this document, made by Tobias Brinkert, is available here: Grace Benutzerhandbuch.)

1. Introduction

2. Installation guide

3. Getting started

4. Guide to the graphical user interface

5. Command interpreter

6. Advanced topics

7. References


1. Introduction

1.1 What is Grace?

Grace is a WYSIWYG tool to make two-dimensional plots of numerical data. It runs under various (if not all) flavors of Unix with X11 and M*tif (LessTif or Motif). It also runs under VMS, OS/2, and Windows (95/98/NT/2000/XP). Its capabilities are roughly similar to GUI-based programs like Sigmaplot or Microcal Origin plus script-based tools like Gnuplot or Genplot. Its strength lies in the fact that it combines the convenience of a graphical user interface with the power of a scripting language which enables it to do sophisticated calculations or perform automated tasks.

Grace is derived from Xmgr (a.k.a. ACE/gr), originally written by Paul Turner.

From version number 4.00, the development was taken over by a team of volunteers under the coordination of Evgeny Stambulchik. You can get the newest information about Grace and download the latest version at the Grace home page.

When its copyright was changed to GPL, the name was changed to Grace, which stands for ``GRaphing, Advanced Computation and Exploration of data'' or ``Grace Revamps ACE/gr''. The first version of Grace available is named 5.0.0, while the last public version of Xmgr has the version number 4.1.2.

Paul still maintains and develops a non-public version of Xmgr for internal use.

1.2 Copyright statement

Copyright (©) 1991-1995 Paul J Turner, Portland, OR
Copyright (©) 1996-2012 Grace Development Team

Maintained by Evgeny Stambulchik


                         All Rights Reserved

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

For certain libraries required to build Grace (which are therefore even included in a suitable version) there may be different Copyright/License statements. Though their License may by chance match the one used for Grace, the Grace Copyright holders can not influence or change them.


Package License
cephes library Free
T1lib LGPL
Xbae BSD-like
Tab Widget BSD-like
Licenses

2. Installation guide

2.1 Installing from sources

  1. Configuration
    • Requirements. Grace usually compiles out of the box in a regular Unix-like environment. You need an ANSI C compiler (gcc is just fine), the X11R5 or above libraries and headers, and an implementaion of the M*tif API, version 1.2 or above. If you want to compile your own changes to certain parts of Grace, you will need a parser generator (yacc or, better, bison).
    • Extra libraries. Some features will be available only if additional libraries are installed. Those are:
      • The JPEG backend needs the IJG's ( JPEG library), version 6.x.
      • The PNG backend needs the ( libpng) library (version 0.96 or above).
      • The PDF driver requires the PDFlib library of Thomas Merz to be installed, which is available here, version 4.0.3 or above.
      • If your computer has the FFTW library installed when Grace is compiled, Grace will link itself to this, and drop all conventional FFT's and DFT's. All transforms will be routed through this package. Note that there is then no difference between pushing the "FFT" button and the "DFT" button, except that FFT will complain if the length isn't a power of 2, and DFT will not. For more information on this package, see the FFTW Home page. In short, this package allows one to do non-power-of-2 length FFT's along with the normal ones. It seems to work very efficiently for any set length which factors into 2^a 3^b 5^c 7^d for integer a, b, c, d. The great feature here is that set lengths which are powers of 10 (e.g. 1000, 10000) and integer multiples of these (500, 2000, 2500, 5000, etc.) can be computed with no significant penalty (maybe 20%) over power-of-2 transforms. Very often, real datasets come in these sizes, and not in powers of 2.
      • In order to read/write sets in the NetCDF data format, you will also need the NetCDF libraries.
    • Decide whether you want to compile in a separate place (thus leaving the source tree pristine). You most probably would want it if compiling Grace for more than one OS and keeping the sources in a central shared (e.g. via NFS) location. If you don't need it, skip the rest of this paragraph and go right to the next step. Otherwise, assuming the sources are in /usr/local/src/grace-x.y.z and the compilation will be performed in /tmp/grace-obj, do the following:
        % mkdir /tmp/grace-obj
        % cd /tmp/grace-obj
        % /usr/local/src/grace-x.y.z/ac-tools/shtool mkshadow \
          /usr/local/src/grace-x.y.z .
                       
      
    • The configure shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create Make.conf in the top directory of the package. It also create config.h file containing system-dependent definitions. Finally, it creates a shell script config.status that you can run in the future to recreate the current configuration, a file config.cache that saves the results of its tests to speed up reconfiguring, and a file config.log containing compiler output (useful mainly for debugging configure). If at some point config.cache contains results you don't want to keep, you may remove or edit it.
    • Run ./configure --help to get list of additional switches specific to Grace
    • Run ./configure <options>. Just an example:
        % ./configure --enable-grace-home=/opt/grace 
          --with-extra-incpath=/usr/local/include:/opt/include \
          --with-extra-ldpath=/usr/local/lib:/opt/lib --prefix=/usr
                       
      
      would use /usr/local/include and /opt/include in addition to the default include path and /usr/local/lib and /opt/lib in addition to the default ld path. As well, all stuff would be put under the /opt/grace directory and soft links made to /usr/bin, /usr/lib and /usr/include.

      Note: If you change one of the --with-extra-incpath or --with-extra-ldpath options from one run of configure to another, remember to delete the config.cache file!!!

  2. Compilation
    • Issue make

      If something goes wrong, try to see if the problem has been described already in the Grace FAQ (in the doc directory).

  3. Testing
    • make tests

      This will give you a slide show demonstrating some nice features of Grace.

  4. Installation
    • make install
    • make links

      The later (optional) step will make soft links from some files under the Grace home directory to the system-wide default locations (can be changed by the --prefix option during the configuration, see above).

2.2 Binary installation

  1. Getting pre-built packages
  2. Installation
  3. Running tests

2.3 Alternative packaging schemes (RPM, ...)

Not written yet...

3. Getting started

For a jump-in start, you can browse the demos ("Help/Examples" menu tree). These are ordinary Grace projects, so you can play with them and modify them. Also, read the Tutorial.

O.k. Here's a VERY quick introduction:

  1. Start the GUI version: xmgrace (return).
  2. Select/check the output medium and canvas size in File/Device Setup.
  3. If needed, set the graph size ('Viewport' in Plot/Graph Appearance).
  4. Load your data with Data/Import/ASCII. 'Load as': 'Single set' for two-column ASCII data, 'Block data' for multi-column ASCII data.
  5. Adjust the scales, axis labels and tick marks in Plot/Axis properties. Acknowledge all changes with 'Apply'.
  6. Adjust lines, symbols, legends in Plot/Set appearance.
  7. Adjust titles, plot frame and legend display in Plot/Graph Appearance.
  8. Data can be manipulated in Data/Transformations. To shift a data set by 20 to the left, e.g., in 'Evaluate Expression' select the same set on the left and the right, and say Formula: y=y-20. As you'll probably notice, Grace can do MUCH more than that. Explore at your leisure.
  9. When you like your plot, select File/Print. That's it!

3.1 General concepts

Project files

A project file contains all information necessary to restore a plot created by Grace, as well as some of preferences. Each plot is represented on a single page, but may have an unlimited number of graphs.You create a project file of your current graph with File/Save,Save as.

Parameter files

A parameter file contains the detailed settings of your project. It can be used to transfer these settings to a different plot/project. You generate a parameter file with File/Save menu entry selected from the "Plot/Graph appearance popup". You can load the settings contained in a parameter file with File/Open.

Input file formats

Grace understands several input files formats. The most basic one is ASCII text files containing space and comma separated columns of data. The data fields can be either numeric (Fortran 'd' and 'D' exponent markers are also supported) or alphanumeric (with or without quotes). Several calendar date formats are recognized automatically and you can specify your own reference for numeric date formats. Lines beginnig with "#" are ignored. Blank lines indicate new dataset. Grace also has a command language (see command interpreter), you can include commands in data files using lines having "@" as their first non-blank character, though this is not recommended. Depending on configuration, Grace can also read NetCDF files (see configuration).

Graphs

A graph consists of (every element is optional): a graph frame, axes, a title and a subtitle, a number of sets and additional annotative objects (time stamp string, text strings, lines, boxes and ellipses).

The graph type can be any of:

  • XY Graph
  • XY Chart
  • Polar Graph
  • Fixed Graph
  • Pie chart

The idea of "XY Chart" is to plot bars (or symbols in general) of several sets side by side, assuming the abscissas of all the sets are the same (or subsets of the longest set).

Datasets

A dataset is a collection of points with x and y coordinates, up to four optional data values (which, depending on the set type, can be displayed as error bars or like) and one optional character string.

Sets

A set is a way of representing datasets. It consists of a pointer to a dataset plus a collection of parameters describing the visual appearance of the data (like color, line dash pattern etc).

The set type can be any of the following:


Set type # of num. cols Description
XY 2 An X-Y scatter and/or line plot, plus (optionally) an annotated value
XYDX 3 Same as XY, but with error bars (either one- or two-sided) along X axis
XYDY 3 Same as XYDX, but error bars are along Y axis
XYDXDX 4 Same as XYDX, but left and right error bars are defined separately
XYDYDY 4 Same as XYDXDX, but error bars are along Y axis
XYDXDY 4 Same as XY, but with X and Y error bars (either one- or two-sided)
XYDXDXDYDY 6 Same as XYDXDY, but left/right and upper/lower error bars are defined separately
BAR 2 Same as XY, but vertical bars are used instead of symbols
BARDY 3 Same as BAR, but with error bars (either one- or two-sided) along Y axis
BARDYDY 4 Same as BARDY, but lower and upper error bars are defined separately
XYHILO 5 Hi/Low/Open/Close plot
XYZ 3 Same as XY; makes no sense unless the annotated value is Z
XYR 3 X, Y, Radius. Only allowed in Fixed graphs
XYSIZE 3 Same as XY, but symbol size is variable
XYCOLOR 3 X, Y, color index (of the symbol fill)
XYCOLPAT 4 X, Y, color index, pattern index (currently used for Pie charts only)
XYVMAP 4 Vector map
XYBOXPLOT 6 Box plot (X, median, upper/lower limit, upper/lower whisker)
Set types

Not all set types, however, can be plotted on any graph type. The following table summarizes it:


Set type XY Graph XY Chart Fixed Polar Pie
XY + + + + +
XYDX + - + - -
XYDY + + + - -
XYDXDX + - + - -
XYDYDY + + + - -
XYDXDY + - + - -
XYDXDXDYDY + - + - -
BAR + + + - -
BARDY + + - - -
BARDYDY + + - - -
XYHILO + - - - -
XYZ + - + + -
XYR - - + - -
XYSIZE + + + + -
XYCOLOR + + + + +
XYCOLPAT - - - - +
XYVMAP + - + - -
XYBOXPLOT + - - - -
Graph/Set type connection

Regions

Regions are sections of the graph defined by the interior or exterior of a polygon, or a half plane defined by a line. Regions are used to restrict data transformations to a geometric area occupied by region.

Real Time Input

Real Time Input refers to the ability Grace has to be fed in real time by an external program. The Grace process spawned by the driver program is a full featured Grace process: the user can interact using the GUI at the same time the program sends data and commands. The process will adapt itself to the incoming data rate.

Hotlinks

Hotlinks are sources containing varying data. Grace can be instructed a file or a pipe is a hotlink in which case it will provide specific commands to refresh the data on a mouse click (a later version will probably allow automatic refresh).

Devices

Grace allows the user to choose between several output devices to produce its graphics. The current list of supported devices is:

  • X11
  • PostScript (level 1 and level 2)
  • EPS (encapsulated PostScript)
  • Metafile (which is Grace format, used at the moment mostly for debugging purposes)
  • MIF (Maker Interchange Format used by FrameMaker)
  • SVG (Scalable Vector Graphics, a language for describing two-dimensional vector and mixed vector/raster graphics in XML)
  • PDF (depends on extra libraries, see configuration)
  • PNM (portable anymap file format)
  • JPEG (depends on extra libraries, see configuration)
  • PNG (depends on extra libraries, see configuration)

Note that Grace no longer supports GIF due to the copyright policy of Unisys. Grace can also be instructed to launch conversion programs automatically based on file name. As an example you can produce MIF (FrameMaker Interchange Format) or Java applets using pstoedit, or almost any image format using the netpbm suite (see the FAQ).

Magic path

In many cases, when Grace needs to access a file given with a relative pathname, it searches for the file along the following path: ./pathname:./.grace/pathname:~/.grace/pathname:$GRACE_HOME/pathname

Dynamic modules

Grace can access external functions present in either system or third-party shared libraries or modules specially compiled for use with it. The term dynamic refers to the possibility Grace has to open the library at run time to find the code of the external function, there is no need to recompile Grace itself (the functions already compiled in Grace are "statically linked").

Coordinate frames

There are two types of coordinates in Grace: the world coordinates and the viewport coordinates. Points of data sets are defined in the world coordinates. The viewport coordinates correspond to the image of the plot drawn on the canvas (or printed on, say, PS output page). The transformation converting the world coordinates into the viewport ones is determined by both the graph type and the axis scaling.

Actually, there is yet another level in the hierarchy of coordinates - the device coordinates. However, you (as a user of Grace) should not worry about the latter. The mapping between the viewport coordinates and the device coordinates is always set in such a way that the origin of the viewport corresponds to the left bottom corner of the device page, the smallest of the device dimensions corresponds to one unit in the viewport coordinates. Oh, and the most important thing about the viewport -> device transformation is that it is homotetic, i.e. a square is guaranteed to remain a square, not a rectangle, a circle remains a circle (not an ellipse) etc.

3.2 Invocation

Operational mode

With respect to the user interface, there are three modes of operation that Grace can be invoked in. The full-featured GUI-based version is called xmgrace. A batch-printing version is called gracebat. A command-line interface mode is called grace. Usually, a single executable is called in all cases, with two of the three files being (symbolic) links to a "real" one.

Command line options

-autoscale x|y|xy

Override any parameter file settings

-barebones

Turn off all toolbars

-batch batch_file

Execute batch_file on start up (i.e., after all other options have been processed and the UI initialized)

-block block_data

Assume data file is block data

-bxy x:y:etc.

Form a set from the current block data set using the current set type from columns given in the argument

-datehint iso|european|us|days|seconds|nohint

Set the hint for dates analysis

-dpipe descriptor

Read data from descriptor (anonymous pipe) on startup

-fixed width height

Set canvas size fixed to width*height

-free

Use free page layout

-graph graph_number

Set the current graph number

-graphtype xy|chart|fixed|polar|pie

Set the type of the current graph

-hardcopy

No interactive session, just print and quit

-hdevice hardcopy_device_name

Set default hardcopy device

-install

Install private colormap

-legend load

Turn the graph legend on

-log x|y|xy

Set the axis scaling of the current graph to logarithmic

-maxpath length

Set the maximal drawing path length

-mono

Run Grace in monochrome mode (affects the display only)

-netcdf file

Assume data file is in netCDF format. This option is present only if the netCDF support was compiled in

-netcdfxy X_var Y_var

If -netcdf was used previously, read from the netCDF file X_var Y_var variables and create a set. If X_var name is "null" then load the index of Y to X. This option is present only if the netCDF support was compiled in

-noask

Assume the answer is yes to all requests - if the operation would overwrite a file, Grace will do so without prompting

-noinstall

Don't use private colormap

-noprint

In batch mode, do not print

-nosafe

Disable safe mode

-nosigcatch

Don't catch signals

-npipe file

Read data from named pipe on startup

-nxy nxy_file

Assume data file is in X Y1 Y2 Y3 ... format

-param parameter_file

Load parameters from parameter_file to the current graph

-pexec parameter_string

Interpret string as a parameter setting

-pipe

Read data from stdin on startup

-printfile

file Save print output to file

-remove

Remove data file after read

-results results_file

Write results of some data manipulations to results_file

-rvideo

Exchange the color indices for black and white

-safe

Run in the safe mode (default) - no file system modifications are allowd through the batch language

-saveall save_file

Save all graphs to save_file

-seed seed_value

Integer seed for random number generator

-settype xy|xydx|...

Set the type of the next data file

-source disk|pipe

Source type of next data file

-timer delay

Set allowed time slice for real time inputs to delay ms

-timestamp

Add timestamp to plot

-version

Show the program version

-viewport xmin ymin xmax ymax

Set the viewport for the current graph

-wd directory

Set the working directory

-world xmin ymin xmax ymax

Set the world coordinates for the current graph

-usage|-help

This message

3.3 Customization

Environment variables

  • GRACE_HOME

    Set the location of Grace. This will be where help files, auxiliary programs, and examples are located. If you are unable to find the location of this directory, contact your system administrator.

  • GRACE_PRINT_CMD

    Print command. If the variable is defined but is an empty string, "Print to file" will be selected as default.

  • GRACE_EDITOR

    The editor used for manual editing of dataset values.

  • GRACE_HELPVIEWER

    The shell command to run an HTML viewer for on-line browsing of the help documents. Must include at least one instance of "%s" which will be replaced with the actual URL by Grace.

  • GRACE_FFTW_WISDOM_FILE and GRACE_FFTW_RAM_WISDOM

    These flags control behavior of the FFTW planner (see FFTW tuning for detailed info)

Init file

Upon start-up, Grace loads its init file, gracerc. The file is searched for in the magic path (see magic path); once found, the rest of the path is ignored. It's recommended that in the gracerc file, one doesn't use statements which are part of a project file - such defaults, if needed, should be set in the default template (see default template).

Default template

Whenever a new project is started, Grace loads the default template, templates/Default.agr. The file is searched for in the magic path (see magic path); once found, the rest of the path is ignored. It's recommended that in the default template, one doesn't use statements which are NOT part of a project file - such defaults, if needed, should be set in the gracerc (see init file).

X resources

The following Grace-specific X resource settings are supported:

  • XMgrace.invertDraw
    Use GXinvert rather than GXxor for rubber-band lines. If the rubber-banding for zooms and lines, etc. doesn't appear on the canvas, set this resource to yes.
  • XMgrace.allowDoubleClick
    When Yes, allow double clicks on the canvas to bring up various popups depending on the location of the pointer when the double click occurs.
  • XMgrace.toolBar
    Enables button toolbar
  • XMgrace.statusBar
    Enables status bar
  • XMgrace.locatorBar
    Enables locator bar

It is also possible to customize menus by assigning key accelerators to any item.

You'll need to derive the item's X resource name from the respective menu label, which is easily done following these rules:

  • All non-alphanumeric characters are skipped
  • Start with lower case; each new word (if any) continues from the capital letter
  • Add the item's type to the end - "Menu" for pulldown menus, "Button" for menu buttons.

For example, in order to make Grace popup the Non-linear curve fitting by pressing Control+F, you would add the following two lines

XMgrace*transformationsMenu.nonLinearCurveFittingButton.acceleratorText: Ctrl+F
XMgrace*transformationsMenu.nonLinearCurveFittingButton.accelerator: Ctrl<Key>f

to your .Xresources file (the file which is read when an X session starts; it could be .Xdefaults, .Xsession or some other file - ask your system administrator when in doubt).

Similarly, it may be desirable to alter default filename patterns of file selection dialogs. The recipe for the dialog's name is like for menu buttons outlined above, with "Button" being replaced with "FSB". E.g., to list all files in the "Open project" dialog ("File/Open..."), set the following resource:

XMgrace*openProjectFSB.pattern: *

4. Guide to the graphical user interface

4.1 GUI controls

This section describes interface controls - basic building blocks, used in many popups.

File selection dialogs

Whenever the user is expected to provide a filename, either for reading in or writing some data, a file selection dialog is popped up. In addition to the standard entries (the directory and file lists and the filter entry), there is a pulldown menu for quick directory change to predefined locations (the current working directory, user's home directory and the file system root). Also, a "Set as cwd" button is there which allows to set any directory as you navigate through the directory tree as the current working directory (cwd). Once defined, it can be used in any other file selection dialog to switch to that directory quickly.

List selectors

Various selectors are available in several popups. They all display lists of objects (graphs, sets, ...) and can be used to perform simple operations on these objects (copying, deleting, ...). The operations are available from a popup menu that appears when pressing mouse button 3 on them. Depending on the required functionality, they may allow multiple choices or not. The following shortcuts are enabled (if the result of an action would contradict the list's selection policy, this would be ignored):

  • Ctrl+a select all
  • Ctrl+u unselect all
  • Ctrl+i invert selection

Graph selector

The operations that can be performed on graphs through the graph selector's popup menu are:

  • focus to
  • hide
  • show
  • duplicate
  • kill
  • swap
  • create new
All this operations are not available in every instance of the selector. For example in the "read sets" popup only one graph can be selected at a time, and the swap operation is disabled.

Double-clicking on a list entry will switch the focus to that graph.

Set selector

The operations that can be performed on sets through the set selector's popup menu are:

  • hide
  • show
  • bring to front
  • send to back
  • duplicate
  • kill
  • kill data
  • swap
  • edit
  • create new
  • pack all sets
  • selector operations
    • view set comments
    • show data-less
    • show hidden
    • select all
    • unselect all
    • invert selection
    • update

Double-clicking on a list entry will open the spreadsheet editor (see Spreadsheet data set editor) on the set data.

4.2 The main window

The canvas

Canvas hotkeys

When the pointer focus is on the canvas (where the graph is drawn), there are some shortcuts to activate several actions. They are:

  • Ctrl <Key>A: Autoscale the current graph
  • Ctrl <Key>D: Delete an object
  • Ctrl <Key>L: Move current graph legend
  • Ctrl <Key>M: Move an object
  • Ctrl <Key>T: Place timestamp
  • Ctrl <Key>U: Refresh hotlinks
  • Ctrl <Key>V: Set the viewport with mouse
  • Ctrl <Key>Z: Zoom
  • Ctrl Alt <Key>L: Draw a line
  • Ctrl Alt <Key>B: Draw a box
  • Ctrl Alt <Key>E: Draw an ellipse
  • Ctrl Alt <Key>T: Write a text string

Clicks and double clicks

A single click inside a graph switches focus to that graph. This is the default policy, but it can be changed from the "Edit/Preferences" popup.

Double clicking on parts of the canvas will invoke certain actions or raise some popups:

  • on a focus marker: move selected viewport corner
  • on an axis: "Plot/Axis properties" popup
  • on a set: "Plot/Set appearance" popup
  • on a legend: "Plot/Graph appearance" popup
  • on a (sub)title: "Plot/Graph appearance" popup
  • on an object (box, line, ...): a popup for editing properties of that object

The double clicking actions can be enabled/disabled from the "Edit/Preferences" popup.

Toolbar buttons

Along the left-hand side of the canvas (if shown) is the ToolBar. It is armed with several buttons to provide quick and easy access to the more commonly used Grace functions.

  • Draw: This will redraw the canvas and sets. Useful if "Auto Redraw" has been deselected in the Edit|Preferences dialog or after executing commands directly from the Window|Commands interpreter.
  • Lens: A zoom lens. Click on the lens, then select the area of interest on the graph with the "rubber band". The region enclosed by the rubber band will fill the entire graph.
  • AS: AutoScale. Autoscales the graph to contain all data points of all visible (not hidden) sets.
  • Z/z: Zoom in/out by 5%. The zoom percentage can be set in the Edit/Preferences dialog.
  • Arrows: Scroll active graph by 5% in the arrow's direction. The scroll percentage can be set in the Edit/Preferences dialog.
  • AutoT: AutoTick Axes. This will find the optimum number of major and minor tick marks for both axes.
  • AutoO: Autoscale On set. Click the AutoO button, then click on the graph near the set you wish to use for determining the autoscale boundaries of the graph.
  • ZX,ZY: Zoom along an axis. These buttons work like the zoom lens above but are restricted to a single axis.
  • AX,AY: Autoscale one axis only.

    The following buttons deal with the graph stack and there is a good example under Help/Examples/General Intro/World Stack.

  • Pu/Po: Push and pop the current world settings to/from the graph stack. When popping, makes the new stack top current.
  • PZ: Push before Zooming. Functions as the zoom lens, but first pushes the current world settings to the stack.
  • Cy: Cycles through the stack settings of the active graph. Each graph may have up to twenty layers on the stack.

  • Exit: Pretty obvious, eh?

4.3 File menu

The file menu contains all entries related to the input/output features of Grace.

New

Reset the state of Grace as if it had just started (one empty graph ranging from 0 to 1 along both axes). If some work has been done and not yet saved, a warning popup is displayed to allow canceling the operation.

Open

Open an existing project file. A popup is displayed that allow to browse the file system.

Save

Save the current work in a project file, using the name that was used for the last open or save. If no name has been set (i.e., if the project has been created from scratch) act as save as.

Save as

Save the current work in a project file with a new name. A popup allows to browse the file system and set the name, the format to use for saving data points (the default value is "%16.8g"), and a textual description of the project. A warning is displayed if a file with the same name already exists.

Revert to saved

Abandon all modifications performed on the project since the last save. A confirmation popup is fired to allow the user canceling the operation.

Print setup

Set the properties of the printing device. Each device has its own set of specific options (see Device-specific settings). According to the device, the output can be sent either directly to a printer or directed to a file. The global settings available for all devices are the sizing parameters. The size of the graph is fixed. Changing the 'Page' settings changes the size of the canvas underneath the graph. Switching between portrait and landscape rotates the canvas. Make sure the canvas size is large enough to hold your graph. Otherwise you get a 'Printout truncated' warning. If your canvas size cannot easily be changed because, for example, you want to print on letter size paper, you need to adjust the size of your graph ('Viewport' in Plot/Graph Appearance).

Print

Print the project using the current printer settings

Exit

Exit from Grace. If some work has been done and not saved, a warning popup will be displayed to allow the user to cancel the operation.

4.4 Edit menu

Data sets

Using the data set popup, you can view the properties of datasets. This include its type, length, associated comment and some statistics (min, max, mean, standard deviation). A horizontal scrollbar at the bottom allows to get the two last properties, they are not displayed by default. Also note that if you find some columns are too narrow to show all significant digits, you can drag the vertical rules using Shift+Button 2.

Using the menu on the top of this dialog, you can manipulate existing sets or add new ones. Among the most important entries in the menu, are options to create or modify a set using the spreadsheet data set editor (see Spreadsheet data set editor).

Spreadsheet data set editor

The dialog presents an editable matrix of numbers, corresponding to the data set being edited. The set type (and hence, the number of data columns) can be changed using the "Type:" selector. Clicking on a column label pops up a dialog allowing to adjust the column formatting. Clicking on the row labels toggles the respective row state (selected/unselected). The selected rows can be deleted via the dialog's "Edit" menu. Another entry in this menu lets you add a row; the place of the new row is determined by the row containing a cell with the keyboard focus on. As well, just typing in an empty cell will add one or several rows (filling the intermediate rows with zeros).

To resize columns, drag the vertical rules using Shift+Button 2.

Set operations

The set operations popup allows you to interact with sets as a whole. If you want to operate on the data ordering of the sets, you should use the data set operations popup from the Data menu. The popup allows you to select a source (one set within one graph) and a destination and perform some action upon them (copy, move, swap). This popup also give you a quick access to several graph and set selectors if you want to perform some other operation like hiding a graph or creating a new set from block data.

Arrange graphs

This entry fires up a popup to lay out several graphs in a regular grid given by M rows and N columns.

The graph selector at the top allows one to select a number of graphs the arrangement will operate on. If the number of selected graphs isn't equal to M times N, new graphs may be created or extra graphs killed if needed. These options are controlled by the respective checkboxes below the graph selector.

The order in which the matrix is filled in with the graphs can be selected (first horizontally then vertically or vise versa, with either of them inverted). Additionaly, one may choose to fill the matrix in the snake-like manner (adjacent "strokes" are anti-parallel).

The rest of the controls of the dialog window deal with the matrix spacing: left/right/top/bottom page offsets (in the viewport coordinates) and relative inter-cell distances, vertical and horizontal. Next to each of the vertical/horizontal spacing spinboxes, a "Pack" checkbox is found. Enabling it effectively sets the respective inter-cell distance to zero and alter axis tickmark settings such that only bottom/left-most tickmarks are visible.

If you don't want the regular layout this arrangement gives you, you can change it afterwards using the mouse (select a graph and double click on the focus marker, see clicks and double clicks).

Overlay graphs

You can overlay a graph on top of another one. The main use of this feature is to plot several curves using different scales on the same (apparently) graph. The main difficulty is to be sure you operate on the graph you want at all times (you can hide one for a moment if this becomes too difficult).

Autoscale

Using this entry, you can autoscale one graph or all graphs according to the specified sets only. This is useful if you need either to have truly comparable graphs despite every one contains data of different ranges, or if you want to focus your attention on one set only while it is displayed with other data in a complex graph.

Regions menu

Status

This small popup only displays the current state (type and whether it is active or not) of the existing regions.

Define

You can define a new region (or redefine an existing one), the allowed region types are:

  • Inside polygon
  • Outside polygon
  • Above line
  • Below line
  • Left of line
  • Right of line
  • In horizontal range
  • In vertical range
  • Out of horizontal range
  • Out of vertical range

A region can be either linked to the current graph only or to all graphs.

Clear

This kills a region.

Report on

This popup reports you which sets or points are inside or outside of a region.

Hot links

You can link a set to a file or a pipe using this feature. Once a link has been established, you can update it (i.e., read data again) by clicking on the update button.

Currently, only simple XY sets can be used for hotlinks.

Set locator fixed point

After having selected this menu entry, you can select a point on a graph that will be used as the origin of the locator display (just below the menu bar). The fixed point is taken into account only when the display type of the locator is set to [DX,DY].

Clear locator fixed point

This entry is provided to remove a fixed point set before and use the default again: point [0, 0].

Locator props

The locator props popup allows you to customize the display of the locator, mainly its type and the format and precision of the display. You can use all the formats that are allowed in the graphs scales.

Preferences

The preferences popup allows you to set miscellaneous properties of your Grace session, such as GUI behavior, cursor type, date reading hint and reference date used for calendar conversions.

4.5 Data menu

Data set operations

This popup gathers all operations that are related to the ordering of data points inside a set or between sets. If you want to operate on the sets as a whole, you should use the set operations popup from the Edit menu. You can sort according to any coordinate (X, Y, DX, ...) in ascending or descending order, reverse the order of the points, join several sets into one, split one set into several others of equal lengths, or drop a range of points from a set. The set selector of the popup shows the number of points in each set in square brackets like this: G0.S0[63], the points are numbered from 0 to n-1.

Transformations menu

The transformations sub-menu gives you access to all data-mining features of Grace.

Evaluate expression

Using evaluate expression allows you to create a set by applying an explicit formula to another set, or to parts of another set if you use regions restrictions.

All the classical mathematical functions are available (cos, sin, but also lgamma, j1, erf, ...). As usual all trigonometric functions use radians by default but you can specify a unit if you prefer to say cos (x rad) or sin (3 * y deg). For the full list of available numerical functions and operators, see Operators and functions.

In the formula, you can use X, Y, Y1, ..., Y4 to denote any coordinate you like from the source set. An implicit loop will be used around your formula so if you say:

         x = x - 4966.5
         

you will shift all points of your set 4966.5 units to the left.

You can use more than one set in the same formula, like this:

         y = y - 0.653 * sin (x deg) + s2.y
         

which means you use both X and Y from the source set but also the Y coordinate of set 2. Beware that the loop is a simple loop over the indices, all the sets you use in such an hybrid expression should therefore have the same number of points and point i of one set should really be related to point i of the other set. If your sets do not follow these requirements, you should first homogenize them using interpolation.

Histograms

The histograms popup allows you to compute either standard or cumulative histograms from the Y coordinates of your data. Optionally, the histograms can be normalized to 1 (hence producing a PDF (Probability Distribution Function).

The bins can be either a linear mesh defined by its min, max, and length values, or a mesh formed by abscissas of another set (in which case abscissas of the set must form a strictly monotonic array).

Fourier transforms

This popup is devoted to direct and inverse Fourier transforms (actually, what is computed is a power spectrum). The default is to perform a direct transform on unfiltered data and to produce a set with the index as abscissa and magnitude as ordinate. You can filter the input data window through triangular, Hanning, Welch, Hamming, Blackman and Parzen filters. You can load magnitude, phase or coefficients and use either index, frequency or period as abscissas. You can choose between direct and inverse Fourier transforms. If you specify real input data, X is assumed to be equally spaced and ignored; if you specify complex input data X is taken as the real part and Y as the imaginary part.

If Grace was configured with the FFTW library (see configuration), then the DFT and FFT buttons really perform the same transform (so there is no speed-up in using FFT in this case). If you want Grace can to use FFTW wisdom files, you should set several environment variables to name them.

Running averages

The running average popup allows you to compute some values on a sliding window over your data. You choose both the value you need (average, median, minimum, maximum, standard deviation) and the length of the window and perform the operation. You can restrict the operation to the points belonging to (or outside of) a region.

Differences

The differences popup is used to compute approximations of the first derivative of a function with finite differences. The only choice (apart from the source set of course) is the type of differences to use: forward, backward or centered.

Seasonal differences

The seasonal differences popup is used to subtract data from a period to data of the preceding period (namely y[i] - y[i + period]). Beware that the period is entered in terms of index in the set and not in terms of abscissa!

Integration

The integration popup is used to compute the integral of a set and optionally to load it. The numerical value of the integral is shown in the text field after computation. Selecting "cumulative sum" in the choice item will create and load a new set with the integral and compute the end value, selecting "sum only" will only compute the end value.

Interpolation/Splines

This popup is used to interpolate a set on an array of alternative X coordinates. This is mainly used before performing some complex operations between two sets with the evaluate expression popup.

The sampling array can be either a linear mesh defined by its min, max, and length values, or a mesh formed by abscissas of another set.

Several interpolation methods can be used: linear, spline or Akima spline.

Note that if the sampling mesh is not entirely within the source set X bounds, evaluation at the points beyond the bounds will be performed using interpolation parameters from the first (or the last) segment of the source set, which can be considered a primitive extrapolation. This behaviour can be disabled by checking the "Strict" option on the popup.

The abscissas of the set being interpolated must form a strictly monotonic array.

Regression

The regression popup can be used to fit a set against polynomials or some specific functions (y=A*x^B, y=A*exp(B*x), y=A+B*ln(x) and y=1/(A+Bx)) for which a simple transformation of input data can be used to apply linear regression formulas.

You can load either the fitted values, the residuals or the function itself. Choosing to load fitted values or residuals leads to a set of the same length and abscissas as the initial set. Choosing to load the function is almost similar to load the fitted values except that you choose yourself the boundaries and the number of points. This can be used for example to draw the curve outside of the data sample range or to produce an evenly spaced set from an irregular one.

Non-linear fit

The non linear fit popup can be used for functions outside of the simple regression methods scope. With this popup you provide the expression yourself using a0, a1, ..., a9 to denote the fit parameters (as an example you can say y = a0 * cos (a1 * x + a2)). You specify a tolerance, starting values and optional bounds and run several steps before loading the results.

The fit characteristics (number of parameters, formula, ...) can be saved in a file and retrieved as needed using the file menu of the popup.

In the "Advanced" tab, you can additionally apply a restriction to the set(s) to be fitted (thus ignoring points not satisfying the criteria), use one of preset weighting schemes or define your own (notice that "dY" in the preset "1/dY^2" one actually refers to the third column of the data set; use the "Custom" function if this doesn't make sense for your data set), and choose whether to load the fitted values, the residuals or the function itself. Choosing to load fitted values or residuals leads to a set of the same length and abscissas as the initial set. Choosing to load the function is almost similar to load the fitted values except that you choose yourself the boundaries and the number of points. This can be used for example to draw the curve outside of the data sample range or to produce an evenly spaced set from an irregular one.

Correlation/covariance

This popup can be used to compute autocorrelation of one set or cross correlation between two sets. You only select the set (or sets) and specify the maximum lag. A check box allows one to evaluate covariance instead of correlation. The result is normalized so that abs(C(0)) = 1.

Digital filter

You can use a set as a weight to filter another set. Only the Y part and the length of the weighting set are important, the X part is ignored.

Linear convolution

The convolution popup is used to ... convolve two sets. You only select the sets and apply.

Geometric transforms

You can rotate, scale or translate sets using the geometric transformations popup. You specify the characteristics of each transform and the application order.

Sample points

This popup provides two sampling methods. The first one is to choose a starting point and a step, the second one is to select only the points that satisfy a boolean expression you specify.

Prune data

This popup is devoted to reducing huge sets (and then saving both computation time and disk space).

The interpolation method can be applied only to ordered sets: it is based on the assumption that if a real point and an interpolation based on neighboring points are closer than a specified threshold, then the point is redundant and can be eliminated.

The geometric methods (circle, ellipse, rectangle) can be applied to any set, they test each point in turn and keep only those that are not in the neighborhood of previous points.

Feature extraction

Given a set of curves in a graph, extract a feature from each curve and use the values of the feature to provide the Y values for a new curve.


Feature Description
Y minimum Minimum Y value of set
Y maximum Maximum Y value of set
Y average Average Y value of set
Y std. dev. Standard deviation of Y values
Y median Median Y value
X minimum Minimum X value of set
X maximum Maximum X value of set
X average Average X value of set
X std. dev. Standard deviation of X values
X median Median X value
Frequency Perform DFT (FFT if set length a power of 2) to find largest frequency component
Period Inverse of above
Zero crossing Time of the first zero crossing, + or - going
Rise time Assume curve starts at the minimum and rises to the maximum, get time to go from 10% to 90% of rise. For single exponential curves, this is 2.2*time constant
Fall time Assume curve starts at the maximum and drops to the minimum, get time to go from 90% to 10% of fall
Slope Perform linear regression to obtain slope
Y intercept Perform linear regression to obtain Y-intercept
Set length Number of data points in set
Half maximal width Assume curve starts from the minimum, rises to the maximum and drops to the minimum again. Determine the time for which the curve is elevated more than 50% of the maximum rise.
Barycenter X Barycenter along X axis
Barycenter Y Barycenter along Y axis
X (Y max) X of Maximum Y
Y (X max) Y of Maximum X
integral cumulative sum
Extractable features

Import menu

ASCII

Read new sets of data in a graph. A graph selector is used to specify the graph where the data should go (except when reading block data, which are copied to graphs later on).

Reading as "Single set" means that if the source contains only one column of numeric data, one set will be created using the indices (from 1 to the total number of points) as abscissas and read values as ordinates and that if the source contains more than one column of data, the first two numeric columns will be used. Reading as "NXY" means that the first numeric column will provide the abscissas and all remaining columns will provide the ordinates of several sets. Reading as "Block data" means all column will be read and stored and that another popup will allow to select the abscissas and ordinates at will. It should be noted that block data are stored as long as you do not override them by a new read. You can still retrieve data from a block long after having closed all popups, using the set selector.

The set type can be one of the predefined set presentation types (see sets).

The data source can be selected as "Disk" or "Pipe". In the first case the text in the "Selection" field is considered to be a file name (it can be automatically set by the file selector at the top of the popup). In the latter case the text is considered to be a command which is executed and should produce the data on its standard output. On systems that allows is, the command can be a complete sequence of programs glued together with pipes.

If the source contains date fields, they should be automatically detected. Several formats are recognized (see appendix dates in grace). Calendar dates are converted to numerical dates upon reading.

The "Autoscale on read" menu controls whether, upon reading in new sets, which axes of the graph should be autoscaled.

NetCDF

This entry exists only if Grace has been compiled with support for the NetCDF data format (see configuration).

Export menu

ASCII

Save data sets in a file. A set selector is used to specify the set to be saved. The format to use for saving data points can be specified (the default value is "%16.8g"). A warning is displayed if a file with the same name already exists.

4.6 Plot menu

Plot appearance

The plot appearance popup let you set the time stamp properties and the background color of the page. The color is used outside of graphs and also on graphs were no specific background color is set. The time stamp is updated every time the project is modified.

Graph appearance

The graph appearance popup can be displayed from both the plot menu and by double-clicking on a legend, title, or subtitle of a graph (see Clicks and double clicks). The graph selector at the top allows to choose the graph you want to operate on, it also allows certain common actions through its popup menu (see graph selector). Most of the actions can also be performed using the "Edit" menu available from the popup menubar. The main tab includes the properties you will need more often (title for example), and other tabs are used to fine tune some less frequently used options (fonts, sizes, colors, placements).

If you need special characters or special formatting in your title or subtitle, you can use Grace escape sequences (the sequence will appear verbatim in the text field but will be rendered on the graph), see typesetting. If you don't remember the mapping between alphabetic characters and the glyph you need in some specific fonts (mainly symbol and zapfdingbats), you can invoke the font tool from the text field by hitting CTRL-e. You can change fonts and select characters from there, they will be copied back in the text field when you press the "Accept" button. Beware of the position of the cursor as you enter text or change font in the font tool, the character or command will be inserted at this position, not at the end of the string!

You can save graph appearance parameters or retrieve settings previously saved via the "File" menu of this popup. In the "Save parameters" dialog, you can choose to save settings either for the current graph only or for all graphs.

Set appearance

The set appearance popup can be displayed from both the plot menu and by double-clicking anywhere in a graph (see Clicks and double clicks). The set selector at the top allows to choose the set you want to operate on, it also allows certain common actions through its popup menu (see set selector). The main tab gathers the properties you will need more often (line and symbol properties or legend string for example), and other tabs are used to fine tune some less frequently used options (drop lines, fill properties, annotated values and error bars properties for example).

You should note that despite the legend string related to one set is entered in the set appearance popup, this is not sufficient to display it. Displaying all legends is a graph level decision, so the toggle is in the main tab of the graph appearance popup.

If you need special characters or special formatting in your legend, you can use Grace escape sequences (the sequence will appear verbatim in the text field but will be rendered on the graph), see typesetting. If you don't remember the mapping between alphabetic characters and the glyph you need in some specific fonts (mainly symbol and zapfdingbats), you can invoke the font tool from the text field by hitting CTRL-e. You can change fonts and select characters from there, they will be copied back in the text field when you press the "Accept" button. Beware of the position of the cursor as you enter text or change font in the font tool, the character or command will be inserted at this position, not at the end of the string!

Axis properties

The axis properties popup can be displayed from both the "Plot" menu and by double-clicking exactly on an axis (see Clicks and double clicks). The pulldown menu at the top allows to select the axis you want to operate on. The "Active" toggle globally activates or deactivates the axis (all GUI elements are insensitive for deactivated axes). The start and stop fields depict the displayed range. Three types of scales are available: linear, logarithmic or reciprocal, and you can invert the axis (which normally increases from left to right and from bottom to top). The main tab includes the properties you will need more often (axis label, tick spacing and format for example), and other tabs are used to fine tune some less frequently used options (fonts, sizes, colors, placements, stagger, grid lines, special ticks, ...).

If you need special characters or special formatting in your label, you can use Grace escape sequences (the sequence will appear verbatim in the text field but will be rendered on the graph), see typesetting. If you don't remember the mapping between alphabetic characters and the glyph you need in some specific fonts (mainly symbol and zapfdingbats), you can invoke the font tool from the text field by hitting CTRL-e. You can change fonts and select characters from there, they will be copied back in the text field when you press the "Accept" button. Beware of the position of the cursor as you enter text or change font in the font tool, the character or command will be inserted at this position, not at the end of the string!

Most of the controls in the dialog should be self-explanatory. One that is not (and frequently missed) is the "Axis transform" input field in the "Tick labels" tab. Entering there e.g. "-$t" will make the tick labels show negates of the real coordinates their ticks are placed at. You can use any expression understood by the interpreter (see command interpreter).

Once you have set the options as you want, you can apply them. One useful feature is that you can set several axes at once with the bottom pulldown menu (current axis, all axes current graph, current axis all graphs, all axes all graphs). Beware that you always apply the properties of all tabs, not only the selected one.

4.7 View menu

Show locator bar

This toggle item shows or hides the locator below the menu bar.

Show status bar

This toggle item shows or hides the status string below the canvas.

Show tool bar

This toggle item shows or hides the tool bar at the left of the canvas.

Page setup

Set the properties of the display device. It is the same dialog as in Print setup.

Redraw

This menu item triggers a redrawing of the canvas.

Update all

This menu item causes an update of all GUI controls. Usually, everything is updated automatically, unless one makes modifications by entering commands in the Command tool.

4.8 Window menu

Commands

Command driven version of the interface to Grace. Here, commands are typed at the "Command:" text item and executed when <Return> is pressed. The command will be parsed and executed, and the command line is placed in the history list. Items in the history list can be recalled by simply clicking on them with the left mouse button. For a reference on the Grace command interpreter, see Command interpreter.

Point tracking

Not written yet...

Drawing objects

Not written yet...

Font tool

Not written yet...

Console

The console window displays errors and results of some numerical operations, e.g. nonlinear fit (see Non-linear fit). The window is popped up automatically whenever an error occurs or new result messages appear. This can be altered by checking the "Options/Popup only on errors" option.

4.9 Help menu

On context

Click on any element of the interface to get context-sensitive help on it. Only partially implemented at the moment.

User's guide

Browse the Grace user's guide.

Tutorial

Browse the Grace tutorial.

FAQ

Frequently Asked Questions with answers.

Changes

The list of changes during the Grace development.

Examples

The whole tree of submenus each loading a sample plot.

Comments

Use this to send your suggestions or bug reports.

License terms

Grace licensing terms will be displayed (GPL version 2).

About

A popup with basic info on the software, including some configuration details. More details can be found when running Grace with the "-version" command line flag.

5. Command interpreter

5.1 General notes

The interpreter parses its input in a line-by-line manner. There may be several statements per line, separated by semicolon (;). The maximal line length is 4 kbytes (hardcoded). The parser is case-insensitive and ignores lines beginning with the "#" sign.

5.2 Definitions


Name Description Examples
expr Any numeric expression 1.5 + sin(2)
iexpr Any expression that evaluates to an integer 25, 0.1 + 1.9, PI/asin(1)
nexpr Non-negative iexpr 2 - 1
indx Non-negative iexpr  
sexpr String expression "a string", "a " . "string", "square root of 4 = " . sqrt(4)
vexpr Vector expression "2*x"
Basic types


Expression Description Types Example
GRAPH[id] graph id indx id GRAPH[0]
Gnn graph nn nn: 0-99 G0
Graph selections


Expression Description Types Example
graph.SETS[id] set id in graph graphindx id, graphsel graph GRAPH[0].SETS[1]
graph.Snn set nn in graph graphnn: 0-99, graphsel graph G0.S1
SET[id] set id in the current graphindx id SET[1]
Snn set nn in the current graphnn: 0-99 S1
S_ the last implicitly (i.e. as a result of a data transformation) allocated set in the current graph- S_
S$ the active set in the current graph- S$
Set selections


Expression Description Types Example
Rn region n n: 0-4 R0
Region selections


Expression Description Types Example
COLOR "colorname" a mapped color colorname - COLOR "red"
COLOR id a mapped color with ID id nexpr id COLOR 2
Color selections


Expression Description Types Example
PATTERN id pattern with ID id nexpr id PATTERN 1
Pattern selections


Expression Description Types Example
X the first column - X
Y the second column - Y
Yn (n + 2)-th column n = 0 - 4 Y3
Data column selections

Not finished yet...

5.3 Variables


Variable Description
datacolumn data column of current ("active") set
set.datacolumn data column of set
vvar user-defined array
vvariable [i:j] segment of a vector variable (elements from i-th to j-th inclusive, i <= j)
Vector variables


Variable Description
vvariable[i] i-th element of a vector variable
var user-defined variable
Scalar variables

5.4 Numerical operators and functions

In numerical expressions, the infix format is used. Arguments of both operators and functions can be either scalars or vector arrays. Arithmetic, logical, and comparison operators are given in tables below.


Operator Description
+ addition
- substraction
* multiplication
/ division
% modulus
^ raising to power
Arithmetic operators


Operator Description
AND or && logical AND
OR or || logical OR
NOT or ! logical NOT
Logical operators


Operator Description
EQ or == equal
NE or != not equal
LT or < less than
LE or <= less than or equal
GT or > greater than
GE or >= greater than or equal
Comparison operators

Another conditional operator is the "?:" (or ternary) operator, which operates as in C and many other languages.

(expr1) ? (expr2) : (expr3);

This expression evaluates to expr2 if expr1 evaluates to TRUE, and expr3 if expr1 evaluates to FALSE.


Function Description
abs(x) absolute value
acos(x) arccosine
acosh(x) hyperbolic arccosine
asin(x) arcsine
asinh(x) hyperbolic arcsine
atan(x) arctangent
atan2(y,x) arc tangent of two variables
atanh(x) hyperbolic arctangent
ceil(x) greatest integer function
cos(x) cosine
cosh(x) hyperbolic cosine
exp(x) e^x
fac(n) factorial function, n!
floor(x) least integer function
irand(n) random integer less than n
ln(x) natural log
log10(x) log base 10
log2(x) base 2 logarithm of x
maxof(x,y) returns greater of x and y
mesh(n) mesh array (0 ... n - 1)
mesh(x1, x2, n) mesh array of n equally spaced points between x1 and x2 inclusive
minof(x,y) returns lesser of x and y
mod(x,y) mod function (also x % y)
pi the PI constant
rand pseudo random number distributed uniformly on (0.0,1.0)
rand(n) array of n random numbers
rint(x) round to closest integer
rsum(x) running sum of x
sgn(x) signum function
sin(x) sine function
sinh(x) hyperbolic sine
sqr(x) x^2
sqrt(x) x^0.5
tan(x) tangent function
tanh(x) hyperbolic tangent
Functions


Function Description
chdtr(df, x) chi-square distribution
chdtrc(v, x) complemented Chi-square distribution
chdtri(df, y) inverse of complemented Chi-square distribution
erf(x) error function
erfc(x) complement of error function
fdtr(df1, df2, x) F distribution function
fdtrc(x) complemented F distribution
fdtri(x) inverse of complemented F distribution
gdtr(a, b, x) gamma distribution function
gdtrc(a, b, x) complemented gamma distribution function
ndtr(x) Normal distribution function
ndtri(x) inverse of Normal distribution function
norm(x) gaussian density function
pdtr(k, m) Poisson distribution
pdtrc(k, m) complemented Poisson distribution
pdtri(k, y) inverse Poisson distribution
rnorm(xbar,s) pseudo random number distributed N(xbar,s)
stdtr(k, t) Student's t distribution
stdtri(k, p) functional inverse of Student's t distribution
Statistical functions


Function Description
ai(x), bi(x) Airy functions (two independent solutions of the differential equation y''(x) = xy)
beta(x) beta function
chi(x) hyperbolic cosine integral
ci(x) cosine integral
dawsn(x) Dawson's integral
ellie(phi, m) incomplete elliptic integral of the second kind
ellik(phi, m) incomplete elliptic integral of the first kind
ellpe(m) complete elliptic integral of the second kind
ellpk(m) complete elliptic integral of the first kind
expn(n, x) exponential integral
fresnlc(x) cosine Fresnel integral
fresnls(x) sine Fresnel integral
gamma(x) gamma function
hyp2f1(a, b, c, x) Gauss hyper-geometric function
hyperg(a, b, x) confluent hyper-geometric function
i0e(x) modified Bessel function of order zero, exponentially scaled
i1e(x) modified Bessel function of order one, exponentially scaled
igam(a, x) incomplete gamma integral
igamc(a, x) complemented incomplete gamma integral
igami(a, p) inverse of complemented incomplete gamma integral
incbet(a, b, x) incomplete beta integral
incbi(a, b, y) Inverse of incomplete beta integral
iv(v, x) modified Bessel function of order v
jv(v, x) Bessel function of order v
k0e(x) modified Bessel function, third kind, order zero, exponentially scaled
k1e(x) modified Bessel function, third kind, order one, exponentially scaled
kn(n, x) modified Bessel function, third kind, integer order
lbeta(x) natural log of |beta(x)|
lgamma(x) log of gamma function
psi(x) psi (digamma) function
rgamma(x) reciprocal gamma function
shi(x) hyperbolic sine integral
si(x) sine integral
spence(x) dilogarithm
struve(v, x) Struve function
voigt(gamma, sigma, x) Voigt function (convolution of Lorentzian and Gaussian)
yv(v, x) Bessel function of order v
zeta(x, q) Riemann zeta function of two arguments
zetac(x) Riemann zeta function
Special math functions


Function Description
MIN(x) min value of array x
MAX(x) max value of array x
AVG(x) average of array x
SD(x) standard deviation of array x
SUM(x) sum of all elements of array x
INT(x,y) integral of y dx
IMIN(x) index of min value of array x
IMAX(x) index of max value of array x
Aggregate functions

5.5 Procedures

Methods of directly manipulating the data corresponding to the Data|Transformation menu are described in table transformations . To evaluate expressions, you can directly submit them to the command interpreter like you would in the evaluate expression window. As an example, S1.X = S1.X * 0.000256 scales the x-axis coordinates. The functionality of the 'Sample points' menu entry can be obtained through RESTRICT.


Statement Description Types Example
RUNAVG (set, npoints) running average of set using npoints number of points nexpr npoints RUNAVG (S0, 100)
RUNMED (set, npoints) running median of set using npoints number of points nexpr npoints RUNMED (S0, 100)
RUNMIN (set, npoints) running minimum of set using npoints number of points nexpr npoints RUNMIN (S0, 100)
RUNMAX (set, npoints) running maximum of set using npoints number of points nexpr npoints RUNMAX (S0, 100)
RUNSTD (set, npoints) running standard deviation of set using npoints number of points nexpr points RUNSTD (S0, 100)
INTERPOLATE (set, mesh, method, strict) interpolate set on a sampling mesh using method. strict flag controls whether result should be bound within the source set vexpr mesh, method: one of LINEAR, SPLINE, and ASPLINE, onoff strict INTERPOLATE (S0, S1.X, ASPLINE, OFF)
HISTOGRAM (set, bins, cumulative, normalize) calculate histogram of set on defined bins. cumulative and normalize flags control whether to calculate cumulative and normalized (aka PDF) histograms, respectively. Data points are placed at upper limit of the bin vexpr bins, onoff cumulative, onoff normalize HISTOGRAM (S0, MESH(0, 1, 11), OFF, ON)
INTEGRATE (set) cumulative integral of set   INTEGRATE (S0)
XCOR (set1, set2, maxlag, covar) calculate cross-correlation (or -covariance if the covar flag is set) of set1 with set2 with maximum lag maxlag. nexpr maxlag, onoff covar XCOR (S0, S0, 50, OFF)
LINCONV (set1, set2) calculate linear convolution of the array of ordinates of set1 with that of set2.   LINCONV (S0, S1)
RESTRICT (set, restriction) filter set according to logical restriction. The original set will be overwritten vexpr restriction RESTRICT (S0, S0.X < 0)
RESTRICT (set, region, negate) filter set by keeping only points lying inside/outside region. The original set will be overwritten onoff negateRESTRICT (S0, R1, OFF)
Transformations

Not finished yet...

5.6 Device parameters

For producing "hard copy", several parameters can be set via the command interpreter. They are summarized in table Device parameters.


Command Description
PAGE SIZE xdim, ydim set page dimensions (in pp) of all devices
PAGE RESIZE xdim, ydim same as above plus rescale the current plot accordingly
DEVICE "devname" PAGE SIZE xdim, ydim set page dimensions (in pp) of device devname
DEVICE "devname" DPI dpi set device's dpi (dots per pixel)
DEVICE "devname" FONT onoff enable/disable usage of built-in fonts for device devname
DEVICE "devname" FONT ANTIALIASING onoff enable/disable font aliasing for device devname
DEVICE "devname" OP "options" set device specific options (see Device-specific settings)
HARDCOPY DEVICE "devname" set device devname as current hardcopy device
PRINT TO "filename" set print output to filename (but do not print)
PRINT TO DEVICE set print output to hardcopy device (but do not print)
Device parameters

5.7 Flow control


Statement Description Types Example
EXIT(status) cause normal program termination with exit status status iexpr status EXIT(0)
EXIT cause normal program termination; same as EXIT(0)   EXIT
HELP url open a HTML document pointed to by url sexpr url HELP "doc/FAQ.html"
HELP open User's Guide   HELP
PRINT execute print job   PRINT
AUTOSCALE scale the graph   AUTOSCALE
AUTOSCALE XAXES scale the graph in x only   AUTOSCALE XAXES
AUTOSCALE YAXES scale the graph in y only   AUTOSCALE YAXES
AUTOSCALE set scale to a specific set   AUTOSCALE S0
AUTOTICKS autotick all axes   AUTOTICKS
REDRAW refresh the canvas to reflect the current project state   REDRAW
SLEEP n sleep for n seconds expr n SLEEP(3)
UPDATEALL update the GUI (graph and set selectors etc) to reflect the current project state   UPDATEALL
SAVEALL "file" save project to file sexpr file SAVEALL "foo.agr"
LOAD "file" load project file sexpr file LOAD "foo.agr"
Flow control

5.8 Declarations

User-defined variables are set and used according to the syntax described in table User variables.


Statement Description Types Example
DEFINE var define new scalar variable var   DEFINE myvar
DEFINE vvar[] define new vector variable vvar of zero length   DEFINE myvvar[]
DEFINE vvar[n] define new vector variable vvar of length n nexpr n DEFINE myvvar[10]
CLEAR var undefine new variable var and deallocate associated storage   CLEAR myvar
vvar LENGTH n reallocate vector variable vvar nexpr n myvvar LENGTH 25
User variables

Not finished yet...

5.9 Graph properties

We divide the commands pertaining to the properties and appearance of graphs into those which directly manipulate the graphs and those that affect the appearance of graph elements---the parameters that can appear in a Grace project file.

Command operations

General graph creation/annihilation and control commands appear in table Graph operations.


Statement Description Types Example
FOCUS graph Makes graph current and unhides it if necessary graphsel graph FOCUS G0
KILL graph Kills graph graphsel graph KILL G0
ARRANGE(nrows, ncols, offset, hgap, vgap) Arrange existing graphs (or add extra if needed) to form an nrows by ncols matrix, leaving offset at each page edge with hgap and vgap relative horizontal and vertical spacings nexpr nrows, ncols, expr offset, hgap, vgap ARRANGE(2, 2, 0.1, 0.15, 0.2)
ARRANGE(nrows, ncols, offset, hgap, vgap, hvinv, hinv, vinv) Same as above, plus additional hvinv, hinv, and vinv flags allowing to alter the order of the matrix filling nexpr nrows, ncols, expr offset, hgap, vgap, onoff hvinv, hinv, vinv ARRANGE(2, 2, 0.1, 0.15, 0.2, ON, OFF, ON)
ARRANGE(nrows, ncols, offset, hgap, vgap, hvinv, hinv, vinv, snake) Same as above, plus additional snake flag allowing to fill the matrix in a snake-like fashion nexpr nrows, ncols, expr offset, hgap, vgap, onoff hvinv, hinv, vinv, snake ARRANGE(2, 2, 0.1, 0.15, 0.2, ON, OFF, ON, ON)
Graph operations

Parameter settings

Setting the active graph and its type is accomplished with the commands found in table Graph selection parameters.


Statement Description Types Example
WITH graph Makes graph current graphsel graph WITH G0
TYPE type Sets type of current graph graphtype type TYPE XY
graph onoff (De)Activates selected graph graphsel graph, onoff G0 ON
graph HIDDEN onoff Hides selected graph graphsel graph, onoff G1 HIDDEN TRUE
graph TYPE type Sets type of graph graphsel graph, graphtype type G0 TYPE XYDY
Graph selection parameters

The axis range and scale of the current graph as well as its location on the plot viewport are set with the commands listed in table Axis parameters.

Statement Description Types Example
WORLD XMIN xmin Sets minimum value of current graph's x axis to xmin expr xmin WORLD XMIN -10
WORLD XMAX xmax Sets maximum value of current graph's x axis to xmin expr xmax WORLD XMAX 22.5
WORLD YMIN ymin Sets minimum value of current graph's y axis to ymin expr ymin WORLD YMIN 0
WORLD YMAX ymax Sets maximum value of current graph's y axis to ymax expr ymax WORLD YMAX 1e4
VIEW XMIN xmin Sets left edge of current graph at x=xmin in the viewport expr xmin VIEW XMIN .2
VIEW XMAX xmax Sets right edge of current graph at x=xmax in the viewport expr xmax VIEW XMAX 1.0
VIEW YMIN ymin Sets bottom edge of current graph at y=ymin in the viewport expr ymin VIEW YMIN .25
VIEW YMAX ymax Sets top edge of current graph at y=ymax in the viewport expr ymax VIEW YMAX .75
VIEW xmin, ymin, xmax, ymax Sets graph's viewport expr xmin, ymin, xmax, ymax VIEW 0.15, 0.15, 1.15, 0.85
XAXES SCALE type Set scaling of the x axes to type type: one of NORMAL, LOGARITHMIC, or RECIPROCAL XAXES SCALE NORMAL
YAXES SCALE type Set scaling of the y axes to type type: one of NORMAL, LOGARITHMIC, or RECIPROCAL YAXES SCALE LOGARITHMIC
XAXES INVERT onoff If ON, draws xmin to xmax from right to left onoff XAXES INVERT OFF
YAXES INVERT onoff If ON, draws ymin to ymax from top to bottom onoff YAXES INVERT OFF
AUTOSCALE ONREAD type Set automatic scaling on read according to type type: one of NONE, XAXES, YAXES, XYAXES AUTOSCALE ONREAD NONE
Axis parameters

The commands to set the appearance and textual content of titles and legends are given in table Titles and legends.


Statement Description Types Example
TITLE title Sets the title of current graph sexpr title TITLE "Foo"
TITLE FONT font Selects font of title string fontsel font TITLE FONT 1
TITLE SIZE size Sets size of title string expr size TITLE SIZE 1.5
TITLE COLOR color Sets color of title string colorsel color TITLE COLOR 1
SUBTITLE subtitle Sets the subtitle of current graph sexpr subtitle SUBTITLE "Bar"
SUBTITLE FONT font Selects font of subtitle string fontsel font SUBTITLE FONT "Times-Italic"
SUBTITLE SIZE size Sets size of subtitle string expr size SUBTITLE SIZE .60
SUBTITLE COLOR color Sets color of subtitle string colorsel color SUBTITLE COLOR "blue"
LEGEND onoff Toggle legend display onoff LEGEND ON
LEGEND LOCTYPE type Posistion legend in type coordinates type: either WORLD or VIEW LEGEND LOCTYPE WORLD
LEGEND xloc, yloc Set location of legend box (upper left corner) expr xloc, yloc LEGEND .5,.75
LEGEND FONT font Set legend font type fontsel font LEGEND FONT "Helvetica"
LEGEND CHAR SIZE size Sets size of legend label characters (1 is normal)expr size LEGEND CHAR SIZE .30
LEGEND color Set color of legend text colorsel color LEGEND COLOR 1
LEGEND VGAP gap Sets vertical gap between legend entries nexpr gap LEGEND VGAP 1
LEGEND HGAP gap Sets horizontal gap between symbol and description nexpr gap LEGEND HGAP 4
LEGEND LENGTH length Sets length of legendnexpr length LEGEND LENGTH 5
LEGEND INVERT onoff Determines relationship between order of sets and order of legend labels onoff LEGEND INVERT true
LEGEND BOX onoff Determines if the legend bounding box is drawn onoff LEGEND BOX off
LEGEND BOX COLOR color Sets color of legend bounding box colorsel color LEGEND BOX COLOR 1
LEGEND BOX PATTERN pattern Sets pattern of legend bounding box patternsel pattern LEGEND BOX PATTERN 2
LEGEND BOX LINESTYLE style Sets line style of bounding box nexpr style LEGEND BOX LINESTYLE 1
LEGEND BOX LINEWIDTH width Sets line width of bounding boxnexpr width LEGEND BOX LINEWIDTH 2
LEGEND BOX FILL onoff Determines if the legend bounding box is filled onoff LEGEND BOX FILL false
LEGEND BOX FILL COLOR color Sets color of legend box fill colorsel color LEGEND BOX COLOR 3
LEGEND BOX FILL pattern Sets pattern of legend box fill patternsel pattern LEGEND BOX FILL PATTERN 1
Titles and legends

Not finished yet...

5.10 Set properties

Again, as with the graphs, we separate those parser commands that manipulate the data in a set from the commands that determine parameters---elements that are saved in a project file.

Commands

Operations for set I/O are summarized in table Set input, output, and creation. (Note that this is incomplete and only lists input commands at the moment.)


Statement Description Types Example
READ "file" Reads file as a single set sexpr file READ "foo.dat"
READ settype "file" Reads file into a single set of type settype xytype settype, sexpr file READ xydy "bar.dat"
READ NXY "file" Reads file as NXY data sexpr file READ NXY "gad.dat"
READ BLOCK "file" Reads file as block data sexpr file READ BLOCK "zooks.dat"
KILL BLOCK Kills the current block data and frees the associated memory   KILL BLOCK
BLOCK settype columns Forms a data set of type settype using columns from current block data file. xytype settype, sexpr columns BLOCK xydxdy "0:2:1:3"
WRITE set writes set to stdoutsetsel set WRITE G0.S1
WRITE set FORMAT "formatstring" writes set to stdout using format specification formatstring setsel set sexpr formatstring WRITE G0.S1 FORMAT "%18.8g"
WRITE set FILE "file" writes set to file setsel set sexpr file WRITE G0.S1 FILE "data.dat"
WRITE set FILE "file" FORMAT "formatstring" writes set to file using format specification formatstring setsel set sexpr file sexpr formatstring WRITE G0.S1 FILE "data.dat" FORMAT "%18.8g"
Set input, output, and creation

The parser commands analogous to the Data|Data set operations dialogue can be found in table Set operations.

Statement Description Types Example
COPY src TO dest Copies src to destsetsel src,dest COPY S0 TO S1
MOVE src TO dest Moves src to dest setsel src,dest MOVE G0.S0 TO G1.S0
SWAP src AND dest Interchanges src and dest setsel src,dest SWAP G0.S0 AND G0.S1
KILL set Kills set setsel set KILL G0.S0
Set operations

Not Finished yet...

Parameter settings

Not written yet...

6. Advanced topics

6.1 Fonts

For all devices, Grace uses Type1 fonts. Both PFA (ASCII) and PFB (binary) formats can be used.

Font configuration

The file responsible for the font configurations of Grace is fonts/FontDataBase. The first line contains a positive integer specifying the number of fonts declared in that file. All remaining lines contain declarations of one font each, composed out of three fields:

  1. Font name. The name will appear in the font selector controls. Also, backend devices that has built-in fonts, will be given the name as a font identifier.
  2. Font fall-back. Grace will try to use this in case the real font is not found.
  3. Font filename. The file with the font outline data.

Here is the default FontDataBase file:


14
Times-Roman             Times-Roman             n021003l.pfb
Times-Italic            Times-Italic            n021023l.pfb
Times-Bold              Times-Bold              n021004l.pfb
Times-BoldItalic        Times-BoldItalic        n021024l.pfb
Helvetica               Helvetica               n019003l.pfb
Helvetica-Oblique       Helvetica-Oblique       n019023l.pfb
Helvetica-Bold          Helvetica-Bold          n019004l.pfb
Helvetica-BoldOblique   Helvetica-BoldOblique   n019024l.pfb
Courier                 Courier                 n022003l.pfb
Courier-Oblique         Courier-Oblique         n022023l.pfb
Courier-Bold            Courier-Bold            n022004l.pfb
Courier-BoldOblique     Courier-BoldOblique     n022024l.pfb
Symbol                  Symbol                  s050000l.pfb
ZapfDingbats            ZapfDingbats            d050000l.pfb
      

Font data files

For text rastering, three types of files are used.

  1. .pfa-/.pfb-files: These contain the character outline descriptions. The files are assumed to be in the fonts/type1 directory; these are the filenames specified in the FontDataBase configuration file.
  2. .afm-files: These contain high-precision font metric descriptions as well as some extra information, such as kerning and ligature information for a particular font. It is assumed that the filename of a font metric file has same basename as the respective font outline file, but with the .afm extension; the metric files are expected to be found in the fonts/type1 directory, too.
  3. .enc-files: These contain encoding arrays in a special but simple form. They are only needed if someone wants to load a special encoding to re-encode a font. Their place is fonts/enc

Custom fonts

It is possible to use custom fonts with Grace. One mostly needs to use extra fonts for the purpose of localization. For many European languages, the standard fonts supplied with Grace should contain all the characters needed, but encoding may have to be adjusted. This is done by putting a Default.enc file with proper encoding scheme into the fonts/enc directory. Grace comes with a few encoding files in the directory; more can be easily found on the Internet. (If the Default.enc file doesn't exist, the IsoLatin1 encoding will be used). Notice that for fonts having an encoding scheme in themselves (such as the Symbol font, and many nationalized fonts) the default encoding is ignored.

If you do need to use extra fonts, you should modify the FontDataBase file accordingly, obeying its format. However, if you are going to exchange Grace project files with other people who do not have the extra fonts configured, an important thing is to define reasonable fall-back font names.

For example, let us assume I use Hebrew fonts, and the configuration file has lines like these:


    ...
Courier-Hebrew              Courier                 courh___.pfa
Courier-Hebrew-Oblique      Courier-Oblique         courho__.pfa
    ...
      

My colleague, who lives in Russia, uses Cyrillic fonts with Grace configured like this:

    ...
Cronix-Courier              Courier                 croxc.pfb
Cronix-Courier-Oblique      Courier-Oblique         croxco.pfb
    ...
      

The font mapping information (Font name <-> Font fall-back) is stored in the Grace project files. Provided that all the localized fonts have English characters in the lower part of the ASCII table unmodified, I can send my friend files (with no Hebrew characters, of course) and be sure they render correctly on his computer.

Thus, with properly configured national fonts, you can make localized annotations for plots intended for internal use of your institution, while being able to exchange files with colleagues from abroad. People who ever tried to do this with MS Office applications should appreciate the flexibility :-).

6.2 Interaction with other applications

Using pipes

Using grace_np library

The grace_np library is a set of compiled functions that allows you to launch and drive a Grace subprocess from your C or Fortran application. Functions are provided to start the subprocess, to send it commands or data, to stop it or detach from it.


Function Arguments Description
int GraceOpenVA (char *exe, int buf_size, ...) launch a Grace executable exe and open a communication channel with it using buf_size bytes for data buffering. The remaining NULL-terminated list of options is command line arguments passed to the Grace process
int GraceOpen (int buf_size) equivalent to GraceOpenVA("xmgrace", buf_size, "-nosafe", "-noask", NULL)
int GraceIsOpen (void) test if a Grace subprocess is currently connected
int GraceClose (void) close the communication channel and exit the Grace subprocess
int GraceClosePipe (void) close the communication channel and leave the Grace subprocess alone
int GraceFlush (void) flush all the data remaining in the buffer
int GracePrintf (const char* format, ...) format a command and send it to the Grace subprocess
int GraceCommand (const char* cmd) send an already formated command to the Grace subprocess
GraceErrorFunctionType GraceRegisterErrorFunction (GraceErrorFunctionType f) register a user function f to display library errors
grace_np library C functions.


Function Arguments Description
integer GraceOpenF (integer buf_size) launch a Grace subprocess and open a communication channel with it
integer GraceIsOpenF (void) test if a Grace subprocess is currently connected
integer GraceCloseF (void) close the communication channel and exit the Grace subprocess
integer GraceClosePipeF (void) close the communication channel and leave the Grace subprocess alone
integer GraceFlushF (void) flush all the data remaining in the buffer
integer GraceCommandF (character*(*) cmd) send an already formatted command to the Grace subprocess
GraceFortranFunctionType GraceRegisterErrorFunctionF (GraceFortranFunctionType f) register a user function f to display library errors
grace_np library F77 functions.

There is no Fortran equivalent for the GracePrintf function, you should format all the data and commands yourself before sending them with GraceCommandF.

The Grace subprocess listens for the commands you send and interprets them as if they were given in a batch file. You can send any command you like (redraw, autoscale, ...). If you want to send data, you should include them in a command like "g0.s0 point 3.5, 4.2".

Apart from the fact it monitors the data sent via an anonymous pipe, the Grace subprocess is a normal process. You can interact with it through the GUI. Note that no error can be sent back to the parent process. If your application send erroneous commands, an error popup will be displayed by the subprocess.

If you exit the subprocess while the parent process is still using it, the broken pipe will be detected. An error code will be returned to every further call to the library (but you can still start a new process if you want to manage this situation).

Here is an example use of the library, you will find this program in the distribution.


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <grace_np.h>

#ifndef EXIT_SUCCESS
#  define EXIT_SUCCESS 0
#endif

#ifndef EXIT_FAILURE
#  define EXIT_FAILURE -1
#endif

void my_error_function(const char *msg)
{
    fprintf(stderr, "library message: \"%s\"\n", msg);
}

int
main(int argc, char* argv[])
{
    int i;

    GraceRegisterErrorFunction(my_error_function);

    /* Start Grace with a buffer size of 2048 and open the pipe */
    if (GraceOpen(2048) == -1) {
        fprintf(stderr, "Can't run Grace. \n");
        exit(EXIT_FAILURE);
    }
    
    /* Send some initialization commands to Grace */
    GracePrintf("world xmax 100");
    GracePrintf("world ymax 10000");
    GracePrintf("xaxis tick major 20");
    GracePrintf("xaxis tick minor 10");
    GracePrintf("yaxis tick major 2000");
    GracePrintf("yaxis tick minor 1000");
    GracePrintf("s0 on");
    GracePrintf("s0 symbol 1");
    GracePrintf("s0 symbol size 0.3");
    GracePrintf("s0 symbol fill pattern 1");
    GracePrintf("s1 on");
    GracePrintf("s1 symbol 1");
    GracePrintf("s1 symbol size 0.3");
    GracePrintf("s1 symbol fill pattern 1");

    /* Display sample data */
    for (i = 1; i <= 100 && GraceIsOpen(); i++) {
        GracePrintf("g0.s0 point %d, %d", i, i);
        GracePrintf("g0.s1 point %d, %d", i, i * i);
        /* Update the Grace display after every ten steps */
        if (i % 10 == 0) {
            GracePrintf("redraw");
            /* Wait a second, just to simulate some time needed for
               calculations. Your real application shouldn't wait. */
            sleep(1);
        }
    }

    if (GraceIsOpen()) {
        /* Tell Grace to save the data */
        GracePrintf("saveall \"sample.agr\"");

        /* Flush the output buffer and close Grace */
        GraceClose();

        /* We are done */
        exit(EXIT_SUCCESS);
    } else {
        exit(EXIT_FAILURE);
    }
}

To compile this program, type


        cc example.c -lgrace_np
      

If Grace wasn't properly installed, you may need to instruct the compiler about include and library paths explicitly, e.g.

        cc -I/usr/local/grace/include example.c -L/usr/local/grace/lib -lgrace_np
      

6.3 FFTW tuning

When the FFTW capabilities are compiled in, Grace looks at two environment variables to decide what to do with the FFTW 'wisdom' capabilities. First, a quick summary of what this is. The FFTW package is capable of adaptively determining the most efficient factorization of a set to give the fastest computation. It can store these factorizations as 'wisdom', so that if a transform of a given size is to be repeated, it is does not have to re-adapt. The good news is that this seems to work very well. The bad news is that, the first time a transform of a given size is computed, if it is not a sub-multiple of one already known, it takes a LONG time (seconds to minutes).

The first environment variable is GRACE_FFTW_WISDOM_FILE. If this is set to the name of a file which can be read and written (e.g., $HOME/.grace_fftw_wisdom) then Grace will automatically create this file (if needed) and maintain it. If the file is read-only, it will be read, but not updated with new wisdom. If the symbol GRACE_FFTW_WISDOM_FILE either doesn't exist, or evaluates to an empty string, Grace will drop the use of wisdom, and will use the fftw estimator (FFTW_ESTIMATE flag sent to the planner) to guess a good factorization, instead of adaptively determining it.

The second variable is GRACE_FFTW_RAM_WISDOM. If this variable is defined to be non-zero, and GRACE_FFTW_WISDOM_FILE variable is not defined (or is an empty string), Grace will use wisdom internally, but maintain no persistent cache of it. This will result in very slow execution times the first time a transform is executed after Grace is started, but very fast repeats. I am not sure why anyone would want to use wisdom without writing it to disk, but if you do, you can use this flag to enable it.

6.4 DL modules

Grace can access external functions present in either system or third-party shared libraries or modules specially compiled for use with Grace.

Function types

One must make sure, however, that the external function is of one of supported by Grace types:

Grace type Description
f_of_i a function of 1 int variable
f_of_d a function of 1 double variable
f_of_nn a function of 2 int parameters
f_of_nd a function of 1 int parameter and 1 double variable
f_of_dd a function of 2 double variables
f_of_nnd a function of 2 int parameters and 1 double variable
f_of_ppd a function of 2 double parameters and 1 double variable
f_of_pppd a function of 3 double parameters and 1 double variable
f_of_ppppd a function of 4 double parameters and 1 double variable
f_of_pppppd a function of 5 double parameters and 1 double variable
Grace types for external functions

The return values of functions are assumed to be of the double type.

Note, that there is no difference from the point of view of function prototype between parameters and variables; the difference is in the way Grace treats them - an attempt to use a vector expression as a parameter argument will result in a parse error.

Let us consider few examples.

Examples

Caution: the examples provided below (paths and compiler flags) are valid for Linux/ELF with gcc. On other operating systems, you may need to refer to compiler/linker manuals or ask a guru.

Example 1

Suppose I want to use function pow(x,y) from the Un*x math library (libm). Of course, you can use the "^" operator defined in the Grace language, but here, for the sake of example, we want to access the function directly.

The command to make it accessible by Grace is

USE "pow" TYPE f_of_dd FROM "/usr/lib/libm.so"

Try to plot y = pow(x,2) and y = x^2 graphs (using, for example, "create new -> Formula" from any set selector) and compare.

Example 2

Now, let us try to write a function ourselves. We will define function my_function which simply returns its (second) argument multiplied by integer parameter transferred as the first argument.

In a text editor, type in the following C code and save it as "my_func.c":


       double my_function (int n, double x)
       {
           double retval;
           retval = (double) n * x;
           return (retval);
       }
       

OK, now compile it:


       $gcc -c -fPIC my_func.c
       $gcc -shared my_func.o -o /tmp/my_func.so
       

(You may strip it to save some disk space):


       $strip /tmp/my_func.so
       

That's all! Ready to make it visible to Grace as "myf" - we are too lazy to type the very long string "my_function" many times.

USE "my_function" TYPE f_of_nd FROM "/tmp/my_func.so" ALIAS "myf"

Example 3

A more serious example. There is a special third-party library available on your system which includes a very important for you yet very difficult-to-program from the scratch function that you want to use with Grace. But, the function prototype is NOT one of any predefined types. The solution is to write a simple function wrapper. Here is how:

Suppose, the name of the library is "special_lib" and the function you are interested in is called "special_func" and according to the library manual, should be accessed as void special_func(double *input, double *output, int parameter). The wrapper would look like this:


       double my_wrapper(int n, double x)
       {
           extern void special_func(double *x, double *y, int n);
           double retval;
           (void) special_func(&x, &retval, n);
           return (retval);
       }
       

Compile it:


       $gcc -c -fPIC my_wrap.c
       $gcc -shared my_wrap.o -o /tmp/my_wrap.so -lspecial_lib -lblas
       $strip /tmp/my_wrap.so
       

Note that I added -lblas assuming that the special_lib library uses some functions from the BLAS. Generally, you have to add all libraries which your module depends on (and all libraries those libraries rely upon etc.), as if you wanted to compile a plain executable.

Fine, make Grace aware of the new function

USE "my_wrapper" TYPE f_of_nd FROM "/tmp/my_wrap.so" ALIAS "special_func"

so we can use it with its original name.

Example 4

An example of using Fortran modules.

Here we will try to achieve the same functionality as in Example 2, but with the help of F77.


       DOUBLE PRECISION FUNCTION MYFUNC (N, X)
       IMPLICIT NONE
       INTEGER N
       DOUBLE PRECISION X
C
       MYFUNC = N * X
C
       RETURN
       END
       

As opposite to C, there is no way to call such a function from Grace directly - the problem is that in Fortran all arguments to a function (or subroutine) are passed by reference. So, we need a wrapper:


       double myfunc_wrapper(int n, double x)
       {
           extern double myfunc_(int *, double *);
           double retval;
           retval = myfunc_(&n, &x);
           return (retval);
       }
       

Note that most of f77 compilers by default add underscore to the function names and convert all names to the lower case, hence I refer to the Fortran function MYFUNC from my C wrapper as myfunc_, but in your case it can be different!

Let us compile the whole stuff:


       $g77 -c -fPIC myfunc.f
       $gcc -c -fPIC myfunc_wrap.c
       $gcc -shared myfunc.o myfunc_wrap.o -o /tmp/myfunc.so -lf2c -lm
       $strip /tmp/myfunc.so
       

And finally, inform Grace about this new function:

USE "myfunc_wrapper" TYPE f_of_nd FROM "/tmp/myfunc.so" ALIAS "myfunc"

Operating system issues

OS/2

In general the method outlined in the examples above can be used on OS/2, too. However you have to create a DLL (Dynamic Link Library) which is a bit more tricky on OS/2 than on most Un*x systems. Since Grace was ported by using EMX we also use it to create the examples; however other development environments should work as well (ensure to use the _System calling convention!). We refer to Example 2 only. Example 1 might demonstrate that DLLs can have their entry points (i.e. exported functions) callable via ordinals only, so you might not know how to access a specific function without some research. First compile the source from Example 2 to "my_func.obj"

gcc -Zomf -Zmt -c my_func.c -o my_func.obj

Then you need to create a linker definition file "my_func.def" which contains some basic info about the DLL and declares the exported functions.


         LIBRARY my_func INITINSTANCE TERMINSTANCE
         CODE LOADONCALL
         DATA LOADONCALL MULTIPLE NONSHARED
         DESCRIPTION 'This is a test DLL: my_func.dll'
         EXPORTS
         my_function
         

(don't forget about the 8 characters limit on the DLL name!). Finally link the DLL:

gcc my_func.obj my_func.def -o my_func.dll -Zdll -Zno-rte -Zmt -Zomf

(check out the EMX documentation about the compiler/linker flags used here!) To use this new library function within Grace you may either put the DLL in the LIBPATH and use the short form:

USE "my_function" TYPE f_of_nd FROM "my_func" ALIAS "myf"

or put it in an arbitrary path which you need to specify explicitly then:

USE "my_function" TYPE f_of_nd FROM "e:/foo/my_func.dll" ALIAS "myf"

(as for most system-APIs you may use the Un*x-like forward slashs within the path!)

7. References

7.1 Typesetting

Grace permits quite complex typesetting on a per string basis. Any string displayed (titles, legends, tick marks,...) may contain special control codes to display subscripts, change fonts within the string etc.


Control code Description
\f{x} switch to font named "x"
\f{n} switch to font number n
\f{} return to original font
\R{x} switch to color named "x"
\R{n} switch to color number n
\R{} return to original color
\#{x} treat "x" (must be of even length) as list of hexadecimal char codes
\t{xx xy yx yy} apply transformation matrix
\t{} reset transformation matrix
\z{x} zoom x times
\z{} return to original zoom
\r{x} rotate by x degrees
\l{x} slant by factor x
\v{x} shift vertically by x
\v{} return to unshifted baseline
\V{x} shift baseline by x
\V{} reset baseline
\h{x} horizontal shift by x
\n new line
\u begin underline
\U stop underline
\o begin overline
\O stop overline
\Fk enable kerning
\FK disable kerning
\Fl enable ligatures
\FL disable ligatures
\m{n} mark current position as n
\M{n} return to saved position n
\dl LtoR substring direction
\dr RtoL substring direction
\dL LtoR text advancing
\dR RtoL text advancing
\x switch to Symbol font (same as \f{Symbol})
\+ increase size (same as \z{1.19} ; 1.19 = sqrt(sqrt(2)))
\- decrease size (same as \z{0.84} ; 0.84 = 1/sqrt(sqrt(2)))
\s begin subscripting (same as \v{-0.4}\z{0.71})
\S begin superscripting (same as \v{0.6}\z{0.71})
\T{xx xy yx yy} same as \t{}\t{xx xy yx yy}
\Z{x} absolute zoom x times (same as \z{}\z{x})
\q make font oblique (same as \l{0.25})
\Q undo oblique (same as \l{-0.25})
\N return to normal style (same as \v{}\t{})
\\ print \
\n switch to font number n (0-9) (deprecated)
\c begin using upper 128 characters of set (deprecated)
\C stop using upper 128 characters of set (deprecated)
Control codes.

Example:

F\sX\N(\xe\f{}) = sin(\xe\f{})\#{b7}e\S-X\N\#{b7}cos(\xe\f{})

prints roughly

                       -x
       F (e) = sin(e)·e  ·cos(e)
        x
       

using string's initial font and e prints as epsilon from the Symbol font.

NOTE: Characters from the upper half of the char table can be entered directly from the keyboard, using appropriate xmodmap(1) settings, or with the help of the font tool ("Window/Font tool").

7.2 Device-specific limitations

Grace can output plots using several device backends. The list of available devices can be seen (among other stuff) by specifying the "-version" command line switch.

  • X11, PostScript and EPS are full-featured devices
  • Raster drivers (PNM/JPEG/PNG):
    • only even-odd fill rule is supported
    • patterned lines are not implemented
  • PDF driver:
    • bitmapped text strings are not transparent
  • MIF driver:
    • some of patterned fills not implemented
    • bitmapped text strings not implemented
  • SVG driver:
    • bitmapped text strings not implemented

7.3 Device-specific settings

Some of the output devices accept several configuration options. You can set the options by passing a respective string to the interpreter using the "DEVICE "devname" OP "options"" command (see Device parameters). A few options can be passed in one command, separated by commas.


Command Description
grayscale set grayscale output
color set color output
level1 use only PS Level 1 subset of commands
level2 use also PS Level 2 commands if needed
docdata:7bit the document data is 7bit clean
docdata:8bit the document data is 8bit clean
docdata:binary the document data may be binary
xoffset:x set page offset in X direction x pp
yoffset:y set page offset in Y direction y pp
mediafeed:auto default input tray
mediafeed:match select input with media matching page dimensions
mediafeed:manual manual media feed
hwresolution:on set hardware resolution
hwresolution:off do not set hardware resolution
PostScript driver options


Command Description
grayscale set grayscale output
color set color output
level1 use only PS Level 1 subset of commands
level2 use also PS Level 2 commands if needed
bbox:tight enable "tight" bounding box
bbox:page bounding box coincides with page dimensions
EPS driver options


Command Description
PDF1.3 set compatibility mode to PDF-1.3
PDF1.4 set compatibility mode to PDF-1.4
compression:value set compression level (0 - 9)
patterns:on enable use of patterns
patterns:off disable use of patterns
PDF driver options


Command Description
format:pbm output in PBM format
format:pgm output in PGM format
format:ppm output in PPM format
rawbits:on "rawbits" (binary) output
rawbits:off ASCII output
PNM driver options


Command Description
grayscale set grayscale output
color set color output
optimize:on/off enable/disable optimization
quality:value set compression quality (0 - 100)
smoothing:value set smoothing (0 - 100)
baseline:on/off do/don't force baseline output
progressive:on/off do/don't output in progressive format
dct:ifast use fast integer DCT method
dct:islow use slow integer DCT method
dct:float use floating-point DCT method
JPEG driver options


Command Description
interlaced:on make interlaced image
interlaced:off don't make interlaced image
transparent:on produce transparent image
transparent:off don't produce transparent image
compression:value set compression level (0 - 9)
PNG driver options

7.4 Dates in Grace

We use two calendars in Grace: the one that was established in 532 by Denys and lasted until 1582, and the one that was created by Luigi Lilio (Alyosius Lilius) and Christoph Klau (Christophorus Clavius) for pope Gregorius XIII. Both use the same months (they were introduced under emperor Augustus, a few years after Julian calendar introduction, both Julius and Augustus were honored by a month being named after each one).

The leap years occurred regularly in Denys's calendar: once every four years, there is no year 0 in this calendar (the leap year -1 was just before year 1). This calendar was not compliant with earth motion and the dates were slowly shifting with regard to astronomical events.

This was corrected in 1582 by introducing Gregorian calendar. First a ten days shift was introduced to reset correct dates (Thursday October the 4th was followed by Friday October the 15th). The rules for leap years were also changed: three leap years are removed every four centuries. These years are those that are multiple of 100 but not multiple of 400: 1700, 1800, and 1900 were not leap years, but 1600 and 2000 were (will be) leap years.

We still use Gregorian calendar today, but we now have several time scales for increased accuracy. The International Atomic Time (TAI) is a linear scale: the best scale to use for scientific reference. The Coordinated Universal Time (UTC, often confused with Greenwich Mean Time) is a legal time that is almost synchronized with earth motion. However, since the earth is slightly slowing down, leap seconds are introduced from time to time in UTC (about one second every 18 months). UTC is not a continuous scale ! When a leap second is introduced by International Earth Rotation Service, this is published in advance and the legal time sequence is as follows: 23:59:59 followed one second later by 23:59:60 followed one second later by 00:00:00. At the time of this writing (1999-01-05) the difference between TAI and UTC was 32 seconds, and the last leap second was introduced in 1998-12-31.

These calendars allow to represent any date from the mist of the past to the fog of the future, but they are not convenient for computation. Another time scale is possible: counting only the days from a reference. Such a time scale was introduced by Joseph-Juste Scaliger (Josephus Justus Scaliger) in 1583. He decided to use "-4713-01-01T12:00:00" as a reference date because it was at the same time a Monday, first of January of a leap year, there was an exact number of 19 years Meton cycle between this date and year 1 (for Easter computation), and it was at the beginning of a 15 years Roman indiction cycle. The day number counted from this reference is traditionally called Julian day, but it has really nothing to do with the Julian calendar.

Grace stores dates internally as reals numbers counted from a reference date. The default reference date is the one chosen by Scaliger, it is a classical reference for astronomical events. It can modified for a single session using the Edit->Preferences popup of the GUI. If you often work with a specific reference date you can set it for every sessions with a REFERENCE DATE command in your configuration file (see Default template).

The following date formats are supported (hour, minutes and seconds are always optional):

  1. iso8601 : 1999-12-31T23:59:59.999
  2. european : 31/12/1999 23:59:59.999 or 31/12/99 23:59:59.999
  3. us : 12/31/1999 23:59:59.999 or 12/31/99 23:59:59.999
  4. Julian : 123456.789

One should be aware that Grace does not allow to put a space in one data column as spaces are used to separate fields. You should always use another separator (:/.- or better T) between date and time in data files. The GUI, the batch language and the command line flags do not have this limitation, you can use spaces there without any problem. The T separator comes from the ISO8601 standard. Grace support its use also in european and us formats.

You can also provide a hint about the format ("ISO8601", "european", "us") using the -datehint command line flag or the ref name="Edit->Preferences" id="preferences"> popup of the GUI. The formats are tried in the following order: first the hint given by the user, then iso, european and us (there is no ambiguity between calendar formats and numerical formats and therefore no order is specified for them). The separators between various fields can be any characters in the set: " :/.-T" (one or more spaces act as one separator, other characters can not be repeated, the T separator is allowed only between date and time, mainly for iso8601), so the string "1999-12 31:23/59" is allowed (but not recommended). The '-' character is used both as a separator (it is traditionally used in iso8601 format) and as the unary minus (for dates in the far past or for numerical dates). By default years are left untouched, so 99 is a date far away in the past. This behavior can be changed with the Edit->preferences popup, or with the DATE WRAP on and DATE WRAP YEAR year commands. Suppose for example that the wrap year is chosen as 1950, if the year is between 0 and 99 and is written with two or less digits, it is mapped to the present era as follows:

range [00 ; 49] is mapped to [2000 ; 2049]

range [50 ; 99] is mapped to [1950 ; 1999]

with a wrap year set to 1970, the mapping would have been:

range [00 ; 69] is mapped to [2000 ; 2069]

range [70 ; 99] is mapped to [1970 ; 1999]

this is reasonably Y2K compliant and is consistent with current use. Specifying year 1 is still possible using more than two digits as follows: "0001-03-04" is unambiguously March the 4th, year 1. The inverse transform is applied for dates written by Grace, for example as tick labels. Using two digits only for years is not recommended, we introduce a wrap year + 100 bug here so this feature should be removed at some point in the future ...

The date scanner can be used either for Denys's and Gregorian calendars. Inexistent dates are detected, they include year 0, dates between 1582-10-05 and 1582-10-14, February 29th of non leap years, months below 1 or above 12, ... the scanner does not take into account leap seconds: you can think it works only in International Atomic Time (TAI) and not in Coordinated Unified Time (UTC). If you find yourself in a situation were you need UTC, a very precise scale, and should take into account leap seconds ... you should convert your data yourself (for example using International Atomic Time). But if you bother with that you probably already know what to do.

7.5 Xmgr to Grace migration guide

This is a very brief guide describing problems and workarounds for reading in project files saved with Xmgr. You should read the docs or just play with Grace to test new features and controls.

  1. Grace must be explicitly told the version number of the software used to create a file. You can manually put "@version VERSIONID" string at the beginning of the file. The VERSIONID is built as MAJOR_REV*10000 + MINOR_REV*100 + PATCHLEVEL; so 40101 corresponds to xmgr-4.1.1. Projects saved with Xmgr-4.1.2 do NOT need the above, since they already have the version string in them. If you have no idea what version of Xmgr your file was created with, try some. In most cases, 40102 would do the trick.
  2. The above relates to the ASCII projects only. The old binary projects (saved with xmgr-4.0.*) are not automatically converted anymore. An input filter must be defined to make the conversion work on-the-fly. Add the following line to  /.gracerc or the system-wide $GRACE_HOME/gracerc resource file: DEFINE IFILTER "grconvert %s -" MAGIC "00000031" See docs for more info on the I/O filters.
  3. Documentation on the script language is severely lacking still.
  4. Grace is WYSIWYG. Xmgr was not. Many changes required to achieve the WYSIWYG'ness led to the situation when graphs with objects carefully aligned under Xmgr may not look so under Grace. Grace tries its best to compensate for the differences, but sometimes you may have to adjust such graphs manually.
  5. A lot of symbol types (all except *real* symbols) are removed. "Location *" types can be replaced (with much higher comfort) by A(nnotating)values. "Impulse *", "Histogram *" and "Stair steps *" effects can be achieved using the connecting line parameters (Type, Drop lines). "Dot" symbol is removed as well; use the filled circle symbol of the zero size with no outline to get the same effect.
  6. Default page layout switched from free (allowing to resize canvas with mouse) to fixed. For the old behavior, put "PAGE LAYOUT FREE" in the Grace resource file or use the "-free" command line switch. The use of the "free" page layout is in general deprecated, though.
  7. System (shell) variables GR_* renamed to GRACE_*
  8. Smith plots don't work now. They'll be put back soon.

grace-5.1.23/doc/10c.dat0000644000076500001440000000652306671062261014266 0ustar fnevgenyusers@type xy -9.42478 -0.0815865 -9.23438 -0.0286462 -9.04398 0.0320169 -8.85358 0.0995409 -8.66318 0.172865 -8.47278 0.250752 -8.28238 0.331815 -8.09198 0.41455 -7.90158 0.497369 -7.71118 0.578642 -7.52078 0.656734 -7.33038 0.730045 -7.13998 0.797052 -6.94958 0.856347 -6.75918 0.90667 -6.56878 0.946946 -6.37839 0.976308 -6.18799 0.994121 -5.99759 0.999999 -5.80719 0.993815 -5.61679 0.975704 -5.42639 0.946057 -5.23599 0.905514 -5.04559 0.854949 -4.85519 0.795443 -4.66479 0.728258 -4.47439 0.654806 -4.28399 0.576614 -4.09359 0.495281 -3.90319 0.412444 -3.71279 0.329732 -3.52239 0.248732 -3.33199 0.170944 -3.14159 0.0977522 -2.95119 0.0303898 -2.76079 -0.0300873 -2.57039 -0.0828223 -2.37999 -0.127174 -2.18959 -0.162727 -1.9992 -0.189294 -1.8088 -0.206917 -1.6184 -0.215854 -1.428 -0.216571 -1.2376 -0.209715 -1.0472 -0.196099 -0.856798 -0.176666 -0.666398 -0.152462 -0.475999 -0.124607 -0.285599 -0.0942546 -0.0951998 -0.0625627 0.0951998 -0.0306602 0.285599 0.000384056 0.475999 0.0295894 0.666398 0.0560876 0.856798 0.0791434 1.0472 0.0981701 1.2376 0.112741 1.428 0.122595 1.6184 0.127636 1.8088 0.12793 1.9992 0.123697 2.18959 0.115294 2.37999 0.1032 2.57039 0.0879967 2.76079 0.0703429 2.95119 0.0509518 3.14159 0.0305653 3.33199 0.0099285 3.52239 -0.0102347 3.71279 -0.0292447 3.90319 -0.0464871 4.09359 -0.0614305 4.28399 -0.0736415 4.47439 -0.0827953 4.66479 -0.0886832 4.85519 -0.0912156 5.04559 -0.0904207 5.23599 -0.0864401 5.42639 -0.07952 5.61679 -0.0699998 5.80719 -0.0582975 5.99759 -0.0448931 6.18799 -0.0303102 6.37839 -0.0150973 6.56878 0.000192065 6.75918 0.0150183 6.94958 0.0288737 7.13998 0.0412991 7.33038 0.0518983 7.52078 0.0603496 7.71118 0.0664153 7.90158 0.0699473 8.09198 0.0708899 8.28238 0.0692794 8.47278 0.0652403 8.66318 0.0589787 8.85358 0.0507734 9.04398 0.0409639 9.23438 0.0299375 9.42478 0.0181147 & grace-5.1.23/doc/Tutorial.sgml0000644000076500001440000012204007314216714015670 0ustar fnevgenyusers
Grace Tutorials Edward Vigmond evigmon@tulane.edu for Grace-5.1.4 Introduction

These tutorials assumes that you are a new user to Grace but are somewhat familiar with a windowing system. They are designed to show you some of the basic operation of Grace as well as a few of its less intuitive features. Please feel free to go beyond the bounds of the actions described herein and explore the possibilities of using Grace. After all, you will be the one who benefits.

Purpose

The purpose of these tutorials are to give brief examples to show you the basics of how to do something. Essentials and some of the more esoteric features of Grace will be demonstrated to give the user an idea of the capabilities of this program. It is not possible to show everything that Grace is capable of doing. That knowledge only comes with use and experimentation. I recommend that you do the tutorial and then by playing around with things, you will begin to understand them. Finally, when you get stuck, read the user guide to help you.

Nomenclature

In referring to what item to select, the tutorial will use something of the form snaf:/foo/bar/bell which means that on the snaf popup, select from the foo menu the submenu bar and from the bar menu, the entry bell. The popup main is the large one with the graph that pops up when you run xmgrace. If there is a space in the menu item, it will be replaced by an underscore. So , if the menu item was actually "Bell jar" instead of bell in the last example, it would be snaf:/foo/bar/Bell_jar.

Things that are to be typed in will be presented in a typewriter font, eg, type y = 3*sin(x).

Some of examples require you to input a data file or graph. In such instances, there should be a file in the tutorial directory named data.N or N.agr where N is the tutorial number. For example, when doing tutorial 7.1.3, you should look for a file 7.1.3.agr. It is assumed that each major tutorial section starts with a clean graph.

Computer System

Some of the following examples require that system commands be run. The commands may be different on your machine or require a slightly different syntax. In this tutorial, an attempt will be made to use the most commonly available UNIX commands. This tutorial was prepared on a Linux machine with kernel 2.0.32.

Generalities

A couple of points should be made about the GUI before we begin to make life easier.

It is often possible to select more than one item from a list at a time (some lists may prevent it when it makes no sense.). Clicking on a list entry without any keyboard modifier pressed will deselect all other entries and select only that one. Depressing shift while clicking an entry selects all entries from a previously selected entry to the currently selected one. Finally, depressing control allows one to individually toggle the selection of an entry. There are often two buttons on a pop up: Apply and Accept. Changes are not registered until either of these buttons is pressed. The difference between them is that Accept also closes the window.

Disclaimer

Even though I do my best to keep this up to date with the latest release, I cannot guarantee it. Think of this a perpetual work in progress. Therefore, if something is wrong, you can notify me and I'll fix it but keep in mind that I am doing it in my spare time for no money.

Making a Simple Graph

The object of this tutorial is to do the most basic function of Grace: read in some data into a graph and then label the graph. Along the way, a few of the basic Grace commands and widgets will be introduced.

Reading the data from a file

Start by bringing up the set reading widget Main:Data/Import/ASCII. Select the file 2.1.dat (both double clicking and hitting return work). You should see a black curve drawn on a graph.

Now we would like to add some more sets to the graph, but this time the data file will be in a slightly different format. Looking at the file "2.1.dat" (with the program of your choice), you can see that its several columns of numbers. One way to interpret this file is the first column gives the x-values and the rest of the columns are y-values. From Grace, again open the "Read Sets" widget. This time, check the "NXY" button. Now select the file "2.1.dat". At this point you will have several differently coloured curves.

You should now have 2 copies of the first set since you've read the file twice. It would be nice to eliminate one copy. This is most easily accomplished by bringing up a popup which lists all the sets. Selecting Main:Edit/Data_sets...bring up the Data set props popup. It lists all the sets and for the selected set, its type and a few statistics. To eliminate a set, select it and then press the right mouse button. A menu should appear from which you can select kill. You'll note that there is a kill and kill data. The former totally eliminates everything associated with a set while the latter eliminates the data but keeps the settings for it so that if new data is read into the set, it will have the same properties like colouring and line width, etc. Kill set 0 for now.

Set appearance

We would now like style the sets. Practically all aspects of the curves are configurable including colour, line thickness, symbols, drop lines, fills, etc. These operations are available under the "Set appearance" widget which is invoked by selecting Main:Plot/Set appearance... or by double clicking near the target set within the graph frame.

When the widget comes up, there will be a list of the sets with their number (eg. G0.S1 refers to set 1 in graph 0). Later operations will require you to know the number. Like the data sets pop up, clicking on mouse button 3 in the set list will bring up the menu of set operations.

Colouring all sets differently

The simplest way to colour all sets differently is from Set_Appearance:Data/All colors. First select the sets which you wish to recolour and then select Set_Appearance:Data/All colors. Do this now to your graph.

Customizing each set

When a set in the list is highlighted, the widgets change to reflect the settings. Practically all aspects are configurable. Experiment by changing the line colours and widths, placing a symbol at each data point, not connecting data points and fill the space between the x-axis and the curve. Don't forget to try out what is available under the other tabs besides Main. To see the effect of a change, you have to hit the "Apply" button. N.B.: Things are drawn in numerical order so if there is overlap, the highest numbered item will be on top. This applies to graphs and sets within each graph.

Labelling the axes using the font tool

Aspects of the axes are controlled by the axes popup which is called from Main:Plot/Axis properties or by double clicking the graph frame. All aspects of the axes can be changed like the title, the font, colour, whether or not to draw grid lines, or user defined tick marks and labels. There are many settings and the best thing to do is to experiment to see what each setting does.

For now, let's start by labelling the axes. Suppose these curves represent the number of tasks a processor runs as the function of the number of users. To make it more interesting, assume we are doing this in Quebec. That means we want to plot "Nombre de tâches vs. nombre d'usagers". Note the importance of having the accent over the a in tâches or we would end up plotting the number of stains which is entirely another case. Bring up the Axes pop up, select the Y axis, and click in the space to enter the label string of the axis label. Start typing Nombre de t. At this point we need to enter a accented letter, so we bring up the font tool by pressing Control-E. You will now see what we have typed in the Cstring widget. Move the cursor to where you want to place the accented letter and click on the letter. It should now appear in the string. You can either finish the string here or hit accept and keep editing. Label the x axis as well. This font tool is available wherever text needs to be entered.

All the attributes regarding the axis labels like size, colour, font, position are changeable.

Graph titles

Our next exercise will be to title the graph so other. Operation pertaining to this are found in the "Graph appearance" widget which we open by selecting Main:Plot/Graph appearance or by double clicking just above the graph frame.

We can now fill in the title of the graph and by clicking on the "Titles" tab, the font and size and colour can be chosen. The Viewport box under the "Main" tab defines the 4 corners of the graph frame. You can type them in or use the mouse to move them by first double clicking on them.

Other things which can be controlled in this widget are the frame drawn around the graph, whether or not the graph background is coloured and the legends. Legends will be dealt with a little later.

Legends

Since we have several lines in our graph, it makes sense that we label them with a legend so that other people can figure out what they mean. The first thing to do is to give each set a label. This is done by entering a legend string for each set in the Set appearance popup. Now, from the Main form in the Graph appearance popup, click on "Display legend" to see the legend box. The location and appearance of the box is controlled by clicking on the "Leg. box" tab. The appearance and spacing of the legend entries is controlled by the "Legends" tab. For simplicity, label the sets alphabetically and then play with the appearance, etc. to get something you like.

Specifying the placement of the graph by entering the coordinates can be painful, especially the fine tuning. To alleviate this problem, a graphical method is also available, although not readily apparent. After a legend appears, it may be dragged to a new location. To do this, press Ctrl-L with your mouse on the main canvas. You should see the arrow cursor turn into a hand. If this doesn't work, double click on the main canvas (to get its attention) and then press Ctrl-L. Click on the legend and drag it. To cancel the legend drag mode (as with all other modes), click on mouse button 3.

A challenge

I got bored so I took the data files and produced my own, albeit ugly, graph. See if you can copy

Block Data

A block of data is a table of number which are interpreted as columns of numbers. How sets are created from the columns depends on the information you want to extract from the file.

We first need to read in a block of data. We do this from Main:Data/Import/ASCII. Select the file "3.dat" and Load as "Block data". If the read was successful, a window should pop up asking you to create a set from the block data. At the top it will list how many columns of data were read.

First we choose the type of set we would like. For now we'll stick with xy.

Next we choose which column of data contains the x-ordinate. If there is no column, we can select "index" which will use the index into the column as the x ordinate starting from one.

The values Y1 through Y4 are used for selecting error bars as may be needed by other set types.

The last thing to specify is the graph into which to load the set if we have more than 1 set.

Finally, hitting accept will create the set.

If you close this window, it can reopened by bringing up a set list (eg. Main:Edit/Data_sets) and then selecting Create_new/From_block_data from the menu brought up by right clicking on the set list.

Try creating a new set of type XYdY. This is an XY curve with error bars. Try X, Y, and Y1(the error) from different columns.

Creating sets within Grace

Besides reading in data files, Grace has an extensive scripting language with a large number of math functions built in, These function include the basic add, multiply, square root, etc, and also the cephes library of higher order math functions like Bessel functions and the gamma function. Hence, functions in Grace are basically unlimited. See the user guide for more details. In addition, users can dynamically add libraries to Grace with any desired function. As well, points may be added manually to a set by the use of editors. To begin, choose Main:Edit/Data sets. To create a set, press mouse button 3 (the rightmost one for right handed people) anywhere within the data set list (which may be empty) and select Create new. A menu with 4 different ways of creating new sets will be presented. We'll go through them one by one.

By formula

The load and evaluate window will pop up when this is selected.

The first step is to set up the parameter mesh which will determine the range and sampling of the variable $t. Most often, $t will simply be the abscissa. Next, choose the type of set you would like to produce. Using the syntax of the command language, an expression for x is entered which uses $t as the independent variable. This can be an extremely complicated function. Likewise, an expression for y is entered and for any other expressions that may be needed. Fields after y are labelled y1, y2, y3 and y4. For example, if the set type xydxdy is chosen, y1 will hold dx and y2 will hold dy and it will be necessary to enter expressions for them. Pressing apply or accept will perform the calculations and create the new set. You may have to autoscale to see the new set.

Below are a few samples:

To plot one cycle of a sine wave: Load: Set X, Start load at: 0, Stop load at: 2*pi, Length: 100, X=$t, Y=sin($t) A unit circle by parameterization: Start at:0, Stop at: 2*pi, Length: 100, X=cos($t), Y=sin($t)

In spreadsheet

If your system has the Xbae widget set, this choice brings up a spreadsheet like editor to allow one to enter the points of the set by hand. Initially, it just has the point ( 0, 0 ). Clicking on add will insert a copy of the currently selected row immediately below the selected row. Clicking delete will delete the row which contains the cursor. This method is best suited to examining or modifying existing sets or creating very small sets. The sets gets updated after one hits enter or leaves the cell.

In text editor

If your system doesn't have the Xbae widget set or you want the power of your favourite external editor, a text editor of your choice may be used to enter data. The editor is selected by the GRACE_EDITOR environment variable. If the set is new, it will contain only the point (0,0). During editing, no other operations are possible. After the editor is closed, the set will be updated.

From block data

This creates a new set from a block of data which has been read in. See section 3.

Batch plotting

Grace supports a large number of command line options which allow the user to control the appearance and placement of graphs. This can be very useful if you want to use it to quickly print something without going through the GUI, use it within a script to automatically generate graphs, or have a plot come up already configured which can be much quicker than going through the GUI menus.

Simple nonGUI printing

Invoking Grace with the command "grbatch"from the command line will cause Grace to start, produce a plot, send it to the printer (unless a file is specified) and then exit. In its simplest form, to produce a plot of the file a.agr, type

gracebat a.agr

If gracebat is unavailable on your system, the hardcopy option to xmgrace will do the same thing. Assuming the hardcopy device is a postscript printer, one could also type

xmgrace -hdevice PostScript -hardcopy a.agr

Multiple graphs

Often, one wishes to plot several graphs with each graph having different characteristics. This is easily accomplished from the command line. Options specified on the command line are parsed in order and stay in effect until overridden by specifying them again.

The first step in plotting multiple graphs is usually telling Grace how many graphs we have and how to arrange them. The interpreter command "arrange" will do this. For example, if we want 4 graphs arranged in a simple 2x2 table, we specify -pexec "arrange ( 2, 2, .1, .1,.1,ON,ON,ON)" The exact meaning of all the options is explained in the reference manual. Specify any global options. Specify for each graph, the data to plot and any options. Options should be specified in the following order: "-graph g" where g is the graph number starting at 0. This says to apply all following options to this graph. Set any autoscaling options. Autoscaling is performed when the file is read; ergo, the autoscaling must be specified BEFORE the file is read. Remember, this setting is persistent. Set the set type. This is also a persistent setting. Specify the graph type and the input file. If reading in block data, create the sets with the "-bxy" option. Specify any world scaling. It is important to do this AFTER sets are read (unless autoscaling is off) as the graph gets rescaled when data is read in. Specify anything else

An example

Let's try an example. We will assume 5 plots, the first 4 of which are to be stacked vertically, and the fifth inset into the fourth. We wish to plot the files a.dat, b.dat, c.dat and d.dat with the inset graph being a magnified portion of d.dat. Assume a.dat contains multiple columns of data, b.dat is a block of data from which we wish to make a curve from columns 2 and 4 with the error given by column 3, c.dat is to be represented as a bar graph, and for the inset graph, we wish to graph to region (0,0) to (1,1). This can be accomplished by

gracebat -pexec "arrange (4,1,.1,.1,.1,ON,ON,ON)" -nxy a.dat -graph 1 -block b.dat -settype xydy -bxy 2:4:3 -graph 2 -settype bar c.dat -graph 3 -settype xy d.dat -graph 4 d.dat -world 0 0 1 1 -viewport .15 .3 .8 .88

Note that the graph numbers start at 0 and that 0 is the default so it does not have to be specified for the first graph.

Things for which no command line option exists

Undoubtedly, you will reach a point where you want to do something for which no command line option exists. (We have been doing this with the arrange command.) This is where Grace's parameter file language is vital. The option "-pexec" will execute the next argument as if it had read it from a parameter file or excuted on the command line. If you want to do something more complicated than one command, you can use several pexec's or put the commands in a file and run the file with the "-batch" option.

Pexec example

To read in the files foo.dat and bar.dat and scale foo.dat in Y by 1000, the simplest way is

xmgrace foo.dat bar.dat -pexec "s0.y = s0.y * 1000"

Batch example

To do the same as the previous example but also label the axes and recolour the curves, make a file called "bfile" with the Grace commands

#Obligatory descriptive comment s0.y = s0.y * 1000 s0 line color 3 s1 line color 4 title "A Gnasty Graph" xaxis label "Time ( s )" yaxis label "Gnats ( 1000's )" autoscale

and then run xmgrace with

xmgrace foo.dat bar.dat -batch bfile

Fitting curves

This tutorial will explain some of Grace's curve fitting abilities. Grace can perform two types of fittings. The first type is regression or linear fitting where optimization is done on a linear equation or an equation which can be expressed in a linear form. This includes fitting polynomials and certain forms of equations. The other type of fitting is nonlinear and allows for arbitrary user supplied functions.

Let's take a curve and see how each type of fitting works. To begin, create a curve of the function y = sqrt(x) + exp(x)/3 -1 over the range 0 to 3 with 100 points.

Linear Regression

Choosing Main:Data/Transformations/Regression will pop up the Regression window.

Select the set you just created Select the type of fit. For now, pick Linear. We will load the fitted value for now. Press the accept button to see the results of the fit. A window will pop up which will give you the results of the fit including the final expression. You might have to scroll back a bit to see it. See how high of a polynomial is needed to get an acceptable fit and try fitting other types of functions. Note that for the non-polynomial fits, A and B are the fitting parameters of the equation. Now, we are not limited to computing our fitted curve at the points of the original function. Suppose these data are quarterly sales and we wish to predict our next quarter. Choose the type of fit which you found to work best. Instead of loading fitted values, Load: Function. Now the bottom of the widget will become active. We wish to extrapolate over the next quarter, so we would like to start at 0 and end at 4 and choose 100 points. Press accept to see the extrapolation.

Non-linear

We pop up the widget by selecting Main:Data/Transformations/Non-linear curve fitting. You may want to kill all the sets except the original function and the extrapolated function at this point.

Begin by selecting the set to optimize, the original function. Next, we write a function of the form we wish to fit. The unknown parameters are labelled a0..a9. You must start with a0 and work your way up. In this case, since you know the form of the equation already, so try: y = a0*sqrt(x) + a1*exp(x) + a2. Next we must specify that we have three parameters to fit which are a0, a1 and a2 and the tolerance of the solution. You must specify initial values for the parameters and put any bounds on them if necessary. Depending on the function you are optimizing, different initial conditions may lead to drastically different optima. The solution process is iterative and you must click on a button to run a certain number of iterations. You should see the parameters change and a curve created with these parameters. In this example, the exact solution is reached within 5 steps. More parameters and more difficult functions may require more steps in which case you may choose to run 20 or 100 or more steps. The newly created optimized curve should converge with an increasing number of steps. As in linear curve fitting, you can choose to load the fit function at the points of the original curve, over an arbitrary range or load the error at each point. For comparison, load the fitted curve over the range (3,4) by selecting Nonlinear:Options/Load/Function and filling in the bottom of the widget. How does the true answer compare to your previous extrapolation? Fitting arbitrary curves can be a tricky business. Initial conditions are very important. If you don't get a good fit, you may have to experiment a lot with the initial parameters values. Finally, note that the fitted curve does not get added until the accept button is pressed. This allows you to "fool around" until you get a good fit without creating a lot of garbage sets.

Transformations Graphical Simple Geometrical

You can rotate sets around an arbitrary axis perpendicular to the canvas (e.g. the Z-axis). Also it is possible to scale sets and translate them. Mathematical operations between sets

It is possible to perform operations between sets. With many operations, however, it is required that the 2 sets have the identical abscissa, i.e., the x values of both sets are the exact same. This is necessary since most operations are performed on a point by point basis. Eg. multiplying 2 sets is done by multiplying the Y values of the 2 sets together to produce a new Y value. About the only operations that don't do this are filtering and convolution. Fortunately, Grace has a function to help out when the abscissas differ. It is called interpolation which interpolates a set over the domain of another set to produce a new curve.

Let us now add the cosine of a set to the sine of another set to create a new curve. However, we will complicate this example by having different domains with different sampling:

Read in 7.1.2.agr Note how the abscissa are different. We begin by using interpolate to produce a third set which is the second set sampled at the x values of the first. Call up the Interpolate popup from Main:Data/Transformations/Interpolation/splines ... Select S1 as the source set but don't specify a destination set. A set will automatically be made. Use the Strict, linear method, Sampling:Abscissas of another set and use S0 as the Sampling set. Pressing Apply should produce a curve which is S1 interpolated at the points of S0. Note that the new curve only exists over the portion of the x axis common to both curves. We still have a problem since set 2 is sampled the same as set 0 but has a smaller domain. We can perform the computation only over the common region so we now interpolate on set 0 at points from set 2 to produce set 3. Now set 2 and set 3 have the exact same abscissas. Call up the command interpreter from Main:Window/Commands ... We need to create a set to hold the result, S4. We can either make a copy (using Main:Edit/Set_operations...) of S2 which will be guaranteed to have the proper size to hold out result or we can use type a command: s4 length s2.length We have to break up the computation into an x part and a y part. In this instance, we simply wish to keep the same x values. The final result will be put into set 4, so we issue the command: s4.x = s2.x Now we can perform the math between our interpolated copies of sets 0 and 1: s4.y = cos(s3.y) + sin(s2.y). So where is the new set? It's there but it's hidden. Since we already have the command window open, we can unhide the set by typing: S4 on. For the GUI minded (no offense intended), bring up a set list with the set operations menu (eg. Main:Edit/Data_sets or Main:Plot/Set_appearance), select set 4 and unhide it by selecting show from the operation menu (mouse button 3).

N.B. If the abscissas of the original curves had been the same, we could have started at step 5. If the sampling had been the same we could have skipped step 4.

Feature extraction

Feature extraction is a way of creating one curve from a family of curves. It generates one data point from each curve by measuring a characteristic of the curve. For example, one might have a series of curves which plot the gnat population as a function of time. Each curve is produced by varying some condition, like the number of gnus in the environment. Using feature extraction, one could use this family of curves to produce a new curve of the peak number of gnats as a function of gnus or the time of the peak number of gnats as a function of the number of gnus. This is most often useful with more than one graph.

Read in graph 7.1.3.agr Bring up the feature extraction form by clicking on Main:Data/Transformations/Feature_extraction. Select Results to graph 1. Select the feature you are interested in. Choose Y maximum. Select what will determine the x value of the data point. The value of the characteristic determines the Y value. The X value can be determined by the set number. The x or y values of a specified set can also be used to produce the abscissa. Finally, the legend entry of the curve itself can be used to produce the x value. In this case, the legend entry must be specified as a single number. Choose index for now. Press accept, click on graph 1 and then click on the autoscale button to see your results. Choose another feature, like frequency, this time and get X values from the legend. Make sure that graph 0 has the focus when you hit accept.

Restrictions

Often we only wish to examine part of a data set or perform transformations only on a portion of one. Restrictions allow us to define a region of the graph on which to perform operations.

Defining a region

There are several ways a region may be defined. It may be defined by a straight line (left of, right of, above, below), by a polygon (inside or outside), or by a range ( in x, out of x, in y, out of y). Call the define region popup from Main:Edit/Regions/Define. Choose which one of the regions you would like to define, and press the define button.

Line typeDefine the ends of the line by clicking with mouse button 1. Polygon typeFrom the define region popup, choose a polygon type and then the define button. Use mouse button 1 to pick the vertices of the polygon and then mouse button 3 when you are done. Range typeFrom the define region popup, choose a range type and then pick 2 points which define the range.

Using regions

Regions may be only be used to restrict an expression evaluation. Bring up the evaluateExpressions popup (Main:Data/Transformations/Evaluate_expression). Choose the source and destination sets and specify the formula to apply to the region of interest. Not specifying an expression is equivalent to the identity transformation. Choose the region you wish to use. By checking negate, the complement of the specified region is used.

Click on Apply to perform the operation. The resultant set will be the expression evaluated only on points contained in the specified region. Thus, if no expression was specified, the effect is to produce a new set of only those points contained in the region. Conversely, to delete points in a region, leave the expression empty, and negate the region selection.

Using Pipes

Pipes are a way of capturing the output of a running process without the intermediary step of pacing the output in a file. Instead, the executing program puts the data in one end of the pipe, and Grace reads it from the other end of the pipe.

Instead of data files

On certain popups, e.g. Main:Data/Import/ASCII, the option to read from a file or pipe can be specified. If a pipe is chosen, the command in the selection widget will be run and the stdout will be captured and treated as though it was data which was read from a file.

Named pipes

A named pipe is a special case of the pipe previously described. In the previous case, after the program has finished execution and the output had been read, the pipe was destroyed. A named pipe is a static structure with the property that multiple processes can write to and/or read from it. The purpose of using a named pipe with Grace is to start up a Grace window and then control Grace by sending commands and data through a named pipe. This is very powerful and lets you do practically anything you can do directly from the GUI. To use this feature, try the following:

Start a named pipe (you will have to find the command specific to your operating system. For example, it could be mkfifo or mknod): mkfifo pvc. If you do a directory listing, you should see the file pvc. Start up Grace in the background using the named pipe option: xmgrace -npipe pvc&. Grace is now monitoring the pipe for any data which might be sent to it. It will interpret things as though they were entered using the command interpreter. For a simple test, we will create a simple graph over the pipe. From your command line, type: echo "read \"8.2.dat\"" > pvc. (The back slashes are needed to escape the quotation marks so that Grace really received the command :read "8.2.dat".) This just told Grace to read the file data. Now we would like to autoscale. We could simply click on the button but the point is to use a named pipe. This time we type echo autoscale > pvc followed by echo redraw > pvc. Your graph should now have autoscaled and redrawn. Exit Grace with echo exit > pvc. You should also clean up by removing pvc. The true power in named pipes lies in driving Grace using another program. The controlling program can open a named pipe for writing, which is treated as an ordinary file. It can be opened with the fopen() function or whatever other I/O function you prefer. Commands and data are then written to the file where they are interpreted by Grace.

Multiple Graphs Selecting graphs

When multiple graphs are present, a graph is selected by clicking inside the graph frame. In cases where graph frames overlap, clicking will cycle among the overlapping graphs.

It might be annoying if one is trying to work in a region of overlapping graphs. If will not be possible to double click on something because the each click will be interpreted as a single click and you will only end up changing the graph focus. In such an instance, turning off the graph selection by clicking might be desirable. Choose Main:Edit/Preferences and then set Misc:Graph_focus to "As set". This means one must explicitly set the focus. Simply bring up a graph list (eg. Main:Edit/Overlay_graphs is but one), select the graph you want to work on and then, using the menu under mouse button 3, choose "Focus to".

Arranging a tableau of graphs

Placing a large number of regularly spaced graphs is easily done with Main:Edit/Arrange_graphs. This will automatically calculate the layout:

Choose 3 rows and 3 columns and Apply. You should now see 9 graphs. The Order button refers to the way the graphs are numbered. The beginning of the line on the diagram of the button shows which graph is numbered 0 and how the numbers increase, by row or column. You realize you need horizontal packing, i.e. no horizontal gap between graphs. Click on the Pack button beside the Hgap/width input and then Apply. Suddenly, you realize you only need 6 graphs and not 9. Choose 2 rows and press Apply. There is a slight problem as graphs 6, 7 an 8 are still visible. This is a feature since you don't want to accidentally kill a graph. You can kill the extra graphs by clicking on the "Kill extra graphs" check box. Now, any graphs other than the explicitly arranged ones will be automatically killed. The margins are controlled by the Page Offsets, and the intergraph spacing by the Hgap and Vgap inputs. Press close to remove the window.

Note that only graphs which are selected are taken into consideration. So, if you wish to reorganize your existing graphs, make sure they are selected or new ones may be created.

Arranging individual graphs

Arranging individual graphs may either be done (1) exactly, by specifying the viewport coordinates from Main:Plot/Graph_appearance or using the previously explained Arrange graphs popup, or (2) roughly, by double clicking a graph focus marker and then moving it.

Overlaying Graphs

Overlaying one graph onto another is useful for creating a graph with two different x axes and/or y axes. For example, you may wish to have a graph which on the x axis has the month of the year. There could be 2 curves on it, one using the left y axis which is number of gnus sold and one using the right y-axis which is the number of gnats exported on a logarithmic scale. Likewise, if one is plotting spectral data, one could have one x axis in Hz and another one in wavelength. Let's proceed with an example:data

Begin by selecting Main:Edit/Overlay graphs to bring up the Overlay widget. Select the graph numbers with which we would like to deal. In this example, we will overlay graph 1 onto graph 0. At this point, only graph 0 is visible. We cannot see Graph 1 to select since it does not exist at this point. We need to create simply by pressing mouse button 3 in a graph list window and selecting create new. The overlay type is determined by what is common among the overlayed graphs. In our example, the x axis is common so we will select X-axes same, Y-axes different. This is important because we don't want to alter any axes of the Overlay graph which we set the same as the underlay graph. In this example, we don't want to alter the x-axis of graph 1. We are now ready to label the graph axes and read the data. One thing we must be careful to do is to always make sure that we are working on the intended graph. Seeing as the graphs are overlain, clicking within the frame is ambiguous as to what graph is selected. The rule is that in a region of overlay, clicking will cycle between the graphs. Hence, if graph 1 is selecting, clicking within the frame will toggle to graph 0. Making sure that graph 0 is active, bring up the Axis properties widget. Now set the y axis title to Gnus. Select graph 1 as active as set the title as Gnats. Notice how it overlaps the Gnus. We want to put this on the right side. From the axis label and bar tab, select label Properties/Side=Opposite. Label the x axis to label it. If graph 1 is the current graph, noticed how it is greyed out because only 1 x axis need be active. Select graph 0 and you should now be able to alter the axis label. You are ready to read in data. Just make sure the graph that is active when you read in the data (or create your set) is the one in which you intend it to go.

Hot Links

Hot links are a way of of updating a set without having to delete it first and then reread it. The Hot Links window is opened available under Main:Data/Hot links.

File containing a Single Set

The simplest hot link is to a file containing just one set. To make a hot link to a single set, we must first select the set we want to get updated and then specify the file. We may also link to a pipe in which case we must specify it is a pipe to which we are linking. A command may also be entered which will be run every time the hot link is updated. A common command might be autoscale which will make sure that the entire set can be seen if it changes size. It's possible you may want to execute more commands than one. One could, for example, have a set that is a function of 2 sets that needs to be recomputed if either set is updated. If this is the case, put your commands in a file and then use the "READ BATCH" command.

Pressing the Link button will now create the link and if the update button is pressed, the set will be updated with the current contents of the file you linked and the contents of the Command widget will be executed.

For a simple example, read in the set 10.1.dat and set up the hot link. Now, run the command shiftdata.sh and update the hotlink. You should have seen the peak in the graph shift. Try repeating this a couple of more times.

Multiple sets within a file

Sometimes a data file may contain multiple columns of data and we would like to be able to link to all or some of those columns. To specify this, select as many sets as there are xy columns of data in the file. The "x y1 y2" format is assumed. Choose the file the data and link. Now in the link list, the links will show the file name with an appended colon and number. The number tells what column of data the link refers to. Any unwanted columns may be selected and unlinked at this point. When the update button is selected, all sets in the graph will be updated.

Updating by hot keys

Instead of having to keep the Hot links window open all the time, the update action is bound to alt-u. If you find that alt-u has no effect, try double clicking inside the graph you want to update and close the window that pops up. This will "alert" the canvas to process future hot key strokes.

grace-5.1.23/doc/nohelp.html0000644000076500001440000000022606654716571015371 0ustar fnevgenyusers Grace: No help available

No help

Sorry, no help available on this item (yet) grace-5.1.23/doc/philosophical-gnu-sm.jpg0000644000076500001440000001375306626627163017770 0ustar fnevgenyusersÿØÿàJFIFÿþHCREATOR: XV Version 3.10a Rev: 12/29/94 Quality = 75, Smoothing = 0 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÀ È ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÚ?÷ú(¢Š(¢Š(¢Š(¢Š+/_¹¾±Ðo®ôØRkÈ!ibŠ@H¨ÎÞ9ÉîE3Ãú寈´k}N×!$2’ŒOÐŽ½ÆCQx‹ÄvÚv‹"<÷W· ommÒ;3’pddž9©îQEQEQEQETRJÆÒH걨,ÌÇ@êI®?ÀQÉf†ÑË&™§Þ#dhŒ,>˜·Cõ&³¼D~)éW÷>sÛéËi¨å#7Fê-Ä{È–Ã=°+Ѩ¢Š(¢ª­õ›\ý˜]@gÉW˜7d{u«TW;/Œ4çžHtè¯uG‰ŠHÖí,hê™8MÃ<®ìŽâã >8Œ—¶Ú¥Š©ùÍÎ0D¬áJï»­a©Øj™tûëk¸Á{yVEê «”QEqú®¥ÿ ;I èÇÏ´˜µ+ô9Š(úb/1\@Ï,d68m²JÃÞ*¿£ø†âÈô?m·Õ€Û Æ6èüQ›»´}GlŽk©¢¢–T†'–WT³;ROa\áñ®rï…úôëü:p àŸšv"!Ó¦íÜô4‹kã Hæâ÷OÑ %IŠÎ3u>1Ïïd €ÿÛ6úšxð>q —VûNµ(%³©Ìf'¸‡ˆ—þ‚¬xP ŒøcEØ:/Ø"Çå¶³Qƒ5›Hÿ°µ9¾ÏNå…•ÁRQP“‘í*¢¶Ð8l >-ioŸáø&x›T˜­ÃÆHt¶E-)tÏÉz7#¥oÙÚ[ØZCii pÛÂ#Š5Ú¨£ ¬V5ÿ…|?©ÎóßhzmÌî0ÓKjŒçþFZÍ»Ðtme×/ôtB|·:£ìÁ&fLM¸¨lÆ¡#®ãèï™W,’Ekq·ß÷A0:u­ tÿLª‡Ä| Ÿ™íô¶bó:ÅMW“ÁwìÍ­jZ®°‡¹¼¸ ±D¨ÿSWµkëO è+ökDù1•º„ód?r$`gé€'€j}L}'HŠÚi·,Í5Ì `I3±yÀ³ÃµEâ]kÚ3Ú¤ÆÞéf´¹ ‚t;‘Æ}Æî ë;M¿°ñ……Þ®ið‹ëbÿOwnΙꇪ¸ý¦7„õKDèÞ/Õ-!W,°]$Wˆ£û¡¤_3ÝÍJš‰¥”ŸL‘Ž«g§A?Œ‚OåO‹Á+Ëúœsë)È—S™®>¢3û´?‰UcPªªŒú(®_dž)|%w§•2]êµ±Eûßinc`{laæü! íTäð¦«a{«¥k×wºŒ Иµw ±9Rëûµ6%†ã© 7ÅÖ—qéÚœ3i«ð¶—€)ãýTƒä”dÿ Ϩ¹=Ä6¶ÒÜ\JÁ—’I*¢’I<zåïuÑâ;ÄÒ|=ªÃöQ›QÔ­$Y<ˆ²@eDŽCr~ê«¥Mgiö¾•·x_ÁöºŽÖÛý§pˆ‘Hsó7žá¤—ýõWûÕ¥©hº¦¾aއá}ÉÒ[ ×ûÝVŽ?â¬ï øzÆMvGM¶³·²Ó]á1A‰¯æc—<ˆ”’ä唞ݧâ+Kº6/9¹Ôvî[ D3\7"ä¨?Þl/<‘Pi:]õÎ¤Úæ¶ª·{vYÙ£ïK(Ï^z4üL8mSŒ–é(¬MkÃV:ãÅ<¦âÞúDÖ²˜§ˆ 0ê?Ù`T÷¨ÇŒ´Ñ±fÒõ¸‚œ=Ák)³ž7YÎ8áPTc[ñ™Èÿ„6Ô6:avçëåçô¨µk¯E¦ß^E•n Þ;kU–öy˜ áIò€=qò·nCËZM«Þݬw‡TÖîæ´K›o°ø„[Dcl|ä"[¼™VLg¥¾ð׊’òÞôC©EeŸ2×Kñ=Ì÷%Ž0ßéFÛpß'È䃫áo¥Õ¤Öº•¾±-ݤÏκT®\;L‰“íÆU‚óÈ"·_ő̥4Í#Y½º?v'Óåµ^‡“$êŠâO 5&•£^5ÿö¾¹43ê@‚(3äZ!ê#Ï,Çøœ€O@q]T½°³Ô­ZÖþÒ «wÆè§ŒH‡êÅsWt¹¬ÖÚÒëT²^8ã¾–H«QäÈÍÐT|»@Ç ~¿ºšKMRxf´º¯5)cBŸm|펅‰X•7Nì’ Wfˆ± DPª£  `è+Ä×÷+nšN”ûu}@€ÏÙÓ€ó· @xõb«Þ«CðÿA‚Â;þÔû" AÖ.ü½£¶Ï7n=±ŠÛÓ4;Fµû6™cmis²‚}N'Þ¯ÑEQEpš~ƒkws«øzãÎôÛï·i·0–ñO— r8“ÏL‚ªVÄgÅöcÊxômPq¶všK6#î@’‚}ÁØR[i7sø‚=jòÞÚÂî4òŸìwM*ÝFAÂÈ4û­†R2zŽ9é(¢Š+Å—:½‡g¾Ñ¶5ͱIBe2Æ>úª†lryÆÜŒäUŠãÅWVÐÏawáû»kˆÄ‘]ùS *Ã!„a›päϵ^Ò4/ìé§¼»»’ÿS¸ ³Ýº…ùW;Qpˆ2pNI$“ÍmÑEQEWâ]A´ÏY_XÛ½ÅÅ­„²j1GÕ¬üÄŒrá·ºá$QËW]m}kycíµÄrÚÈžbLŒ 2ã9Ò²ô RãZ’÷P ¿ÙR8OÂàÊ«òçј¾ª‡Þ­ê(¢ŠÊ#ÐΧý˜5­;ûC~ϲý©<ÝÞ›3œûb²Ü¢×`Ô, lŠGa,c $œE•Ga]eQEQEqÞ+ø‘áï +¥ÍâÝ_) XÚº¼ÀŸ˜gåõÆ{dñV| ÍÕ“xƒQÇö†¬±Êȹ!„b‰H$3g¹vg²YŽrÓí|Y¥øÑ,uý"Âm#XûbÛ[êW1¯“3†]ÖÒ¼d¶€à Äm9½f8’Ö8ÑQUQ€è¯7øŸâK jº.¯©Û­ÌP,Ïkf‡žèÛ+€‘«ÉÎI !N3\¤¿-<]¡Ï$Ú#XÞi·P]ÙHób’dc ‹xPQäHåEàƒ’3ØúÇ„ôY´m7βê·nnµ AÎùß’û*0Š?º¢º (¢Š(¢Š(ªÍy z„6%¿4RL‹ê¨P1üä_β­®¼¯j,ä,Ö0\Ä…‰ ÁäI°<~¢·«ÉMÚòÚêp-Ðÿ¾h=ÌKÔ½jjmÿ߈×[7Q1ÛjtŠ_»çÐt§–z)®®Š(¢¹_Û0ñ§ƒï”¶êæÕ½J½´üáÕQEQEQEÄkº}¶™©Ü5âìu„Wç$}–çb˜áݵT·gXˆÇ&´4‹É.φ5åY¯b„‚Ì>Kûsòù zóµ×øXú&-:[¯ jVÚ%ôÒ\i·,cÓo$|º0¼‰I䜵»ƒó[¬¢Š+Ÿñü†ü'ÿaY?ôŠêº (¢Š(¢Š(¢«ÝÚ[ßÙÍgw Mm2äÆU”ŒEp×–7¶Ëk¢<Äêv¦ðö£#s6Åæ O÷¶e[9Ÿ8ù”íÓ×g_|8¹Ô,ã‘n>ËöÛTþ8®býâþÒÈ€ìEtÖwPߨÛÞ[¶øn#YcoUa#V(¢¹o;ÙÙišÊÈ#M+R†âf# BÙ†R}„s;g¶Úêh¢Š(¢Š(¢Š++[Ò†«`#Vòî`•n-eÿžr¡ÊŸ§PGu$w¨4]ë–±ŸÝC©1EÏÝ2EÍù¼Ž­à2ñø6ÊÊVV“Nitæ+ßÈ‘¡ñã]-U[Ö³K)šù¡[@‡Î3#ÙŽwgŒcÖ¸¿ ëÚ}®¯ýƒ§jÑjZC‚4ùV_1­ÙA&Ý›’˵Y£cÕQ†NÜžúŠ(¢Š(¢Š(¢¸­KT—ÃÚoµÈŽ÷¶!¢‰ÆSÌ[hÈ$8%”‡ [š&Ÿ5…î¸]BÁu¨}¢ÜÏÊaˆ1öÌ‚CøÖÍs'ÂQßÉ<ºÞ£~Ó1Ä)q%½º&NExÆK–$ŒñÐg_hVþ ÓßYÐæÚÚÍŒ÷¶Fw– ãÍ*ŽÄ#ª‚ÊW+ƒjåÔ â/ý’eéz:,’ÄÉ”šíÆT6F–˜|zʇªŠÃ¼ñN•âoˆÖÒâ¸}GH¼77Wˆ‹åĉ£¦íÛŽZAÇÌ}+Ñ袊(¢Š(¢ŠÆºñ.‹e»í•°Â!_y ¸.H\àn gÔÖ²õ•³×¬µ_é¡%—T³™®.— $¡…vܘÏ6 x§]±y&Ydx$™ñƒ;JÒÌ©ƒ÷TS?ÞVéƒ^“EQEQEâM5ÝâÍ”J3BIàI´‘ÐŽH ðA5ÁëÞH¥‚ÖÕ§†)5¡³`#i ÎL>{sœüƒµVÕí5 kæëK)û!³ ë½"‚âöà†bN ˆsê}éúN¨÷:,zmÜ ÜZÍ¥í¿Ê1²[‹i`gý$äc€àRÞÝ[뺥î¡m¥Í#·ZzM¶[‚bó"¹·n6Nˆ§‚ʤpBæÝÀKñ'†µH²¨Ú­ëéרA9Yc1¶æ!S>”ÍW»»Ö†¤šyÕu‹—û,w7.lí-×`”Å º™ˆØCòðüsŒ Êñ<šõí•§ˆÕ®‰w}jEµ¾šòËsvÝNÁ`±D •i@Ý^³¦i¶šF„ ¬+µ#\œw$“É$ä’y$’rM^¢Š(¢Š(¢Š(®wÄž‡[X¿v…šx>Ñ“ƒ$Q³>ªdfõâÛkM?^ÓeV33¤òä€[Í9 ô*/ÓÇiͪØx§OxŒ^dM°£åÉ4½–ú úÜÇÆ9©!½»»ÒµM2Öéâ»ÔV t’b™–HUŸi'&Þ{r{îŠAÎÓQjºª·Ä}CW³¸¹â;yÔÅï RP3Óu¹yUŽ2ck ð6•&¥â9fÔŽôÑãX Žá ûÝ_î²9^¿,«ÎPcÔè¬ýCSµÓ$²IËî¼¹[hB©bÎAoÀaX“íV|ø±)óSœHw“€yôàƒÏcR+PÊAR29S袊(¢Š(®?ÆÖ‘³i·—'6.Ϧ_© ~âëjèD« Ïaº²u 5î·u¦ÉtEÆ¡aö¨®B¿i|‰œ¯ð†[¶ᣠ9ZÂ[ÉåÑï5è‘Và+·—œ©D58IÈþ$±žœ?µaêšiÚY{ g‘’&‰\ƒ,bK­­íˆ¡pIþ#¥z·…4”´ó¯cgWgžÒDà‰+™|·'æÃ6}sì+©ªz–¡“¥Þj7%…½¤<¥FHDRÇ¿×5â-Hx/OŒ#¤·W,á³·m¬Ê¿ƒooûä×1}t·š¦«ÌQMe&¹q4¶ò©Ùpmì¢Xâe?{2lw(+µðž«¦Ýh6¶ÖWBE´#O Ãg™$h3´ ¨Ü=¹®ŽŠ(¢Š(¢Š¥ªi°jÚ]ÞŸv [ÝDÐÈÁÚñô=ª;--`“\Ènµ-…»]²íiŽqPN+Ï`Ò&Ó­›B¿ì£[ÒÅ”HK$wñBð0>_2…zdFéÁ·«[ixY5Ùí¼›;‹+®!ˆìkP’–Ÿúç4 úl¼iÔoK#¨d`C+ ‚b+™·ð&‹”Ö¿ér+ybá¼ËTŒ“Dã 8ç‘ìïcolor push Black’ÕÁGï color popŽŽ £n ý~.\ïTps:SDict begin [/Count -5/Dest (section.1) cvn/Title (Introduction) /OUT pdfmark endïTps:SDict begin [/Count -0/Dest (subsection.1.1) cvn/Title (Purpose) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.1.2) cvn/Title (Nomenclature) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsection.1.3) cvn/Title (Computer System) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.1.4) cvn/Title (Generalities) /OUT pdfmark endïWps:SDict begin [/Count -0/Dest (subsection.1.5) cvn/Title (Disclaimer) /OUT pdfmark endï]ps:SDict begin [/Count -6/Dest (section.2) cvn/Title (Making a Simple Graph) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsection.2.1) cvn/Title (Reading the data from a file) /OUT pdfmark endï[ps:SDict begin [/Count -2/Dest (subsection.2.2) cvn/Title (Set appearance) /OUT pdfmark endïpps:SDict begin [/Count -0/Dest (subsubsection.2.2.1) cvn/Title (Colouring all sets differently) /OUT pdfmark endïfps:SDict begin [/Count -0/Dest (subsubsection.2.2.2) cvn/Title (Customizing each set) /OUT pdfmark endïsps:SDict begin [/Count -0/Dest (subsection.2.3) cvn/Title (Labelling the axes using the font tool) /OUT pdfmark endïYps:SDict begin [/Count -0/Dest (subsection.2.4) cvn/Title (Graph titles) /OUT pdfmark endïTps:SDict begin [/Count -0/Dest (subsection.2.5) cvn/Title (Legends) /OUT pdfmark endïXps:SDict begin [/Count -0/Dest (subsection.2.6) cvn/Title (A challenge) /OUT pdfmark endïRps:SDict begin [/Count -0/Dest (section.3) cvn/Title (Block Data) /OUT pdfmark endïbps:SDict begin [/Count -4/Dest (section.4) cvn/Title (Creating sets within Grace) /OUT pdfmark endïWps:SDict begin [/Count -0/Dest (subsection.4.1) cvn/Title (By formula) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsection.4.2) cvn/Title (In spreadsheet) /OUT pdfmark endï[ps:SDict begin [/Count -0/Dest (subsection.4.3) cvn/Title (In text editor) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsection.4.4) cvn/Title (From block data) /OUT pdfmark endïWps:SDict begin [/Count -3/Dest (section.5) cvn/Title (Batch plotting ) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsection.5.1) cvn/Title (Simple nonGUI printing) /OUT pdfmark endï\ps:SDict begin [/Count -1/Dest (subsection.5.2) cvn/Title (Multiple graphs) /OUT pdfmark endï\ps:SDict begin [/Count -0/Dest (subsubsection.5.2.1) cvn/Title (An example) /OUT pdfmark endï{ps:SDict begin [/Count -2/Dest (subsection.5.3) cvn/Title (Things for which no command line option exists) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.5.3.1) cvn/Title (Pexec example) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.5.3.2) cvn/Title (Batch example) /OUT pdfmark endïWps:SDict begin [/Count -2/Dest (section.6) cvn/Title (Fitting curves ) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsection.6.1) cvn/Title (Linear Regression) /OUT pdfmark endïWps:SDict begin [/Count -0/Dest (subsection.6.2) cvn/Title (Non-linear) /OUT pdfmark endïXps:SDict begin [/Count -2/Dest (section.7) cvn/Title (Transformations ) /OUT pdfmark endïWps:SDict begin [/Count -3/Dest (subsection.7.1) cvn/Title (Graphical ) /OUT pdfmark endïdps:SDict begin [/Count -0/Dest (subsubsection.7.1.1) cvn/Title (Simple Geometrical) /OUT pdfmark endïvps:SDict begin [/Count -0/Dest (subsubsection.7.1.2) cvn/Title (Mathematical operations between sets) /OUT pdfmark endïeps:SDict begin [/Count -0/Dest (subsubsection.7.1.3) cvn/Title (Feature extraction ) /OUT pdfmark endïYps:SDict begin [/Count -2/Dest (subsection.7.2) cvn/Title (Restrictions) /OUT pdfmark endïcps:SDict begin [/Count -0/Dest (subsubsection.7.2.1) cvn/Title (Defining a region) /OUT pdfmark endï_ps:SDict begin [/Count -0/Dest (subsubsection.7.2.2) cvn/Title (Using regions) /OUT pdfmark endïTps:SDict begin [/Count -2/Dest (section.8) cvn/Title (Using Pipes ) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsection.8.1) cvn/Title (Instead of data files) /OUT pdfmark endïXps:SDict begin [/Count -0/Dest (subsection.8.2) cvn/Title (Named pipes) /OUT pdfmark endïWps:SDict begin [/Count -2/Dest (section.9) cvn/Title (Multiple Graphs) /OUT pdfmark endï]ps:SDict begin [/Count -2/Dest (subsection.9.1) cvn/Title (Selecting graphs) /OUT pdfmark endïops:SDict begin [/Count -0/Dest (subsubsection.9.1.1) cvn/Title (Arranging a tableau of graphs) /OUT pdfmark endïmps:SDict begin [/Count -0/Dest (subsubsection.9.1.2) cvn/Title (Arranging individual graphs) /OUT pdfmark endï^ps:SDict begin [/Count -0/Dest (subsection.9.2) cvn/Title (Overlaying Graphs) /OUT pdfmark endïRps:SDict begin [/Count -3/Dest (section.10) cvn/Title (Hot Links) /OUT pdfmark endïjps:SDict begin [/Count -0/Dest (subsection.10.1) cvn/Title (File containing a Single Set) /OUT pdfmark endïips:SDict begin [/Count -0/Dest (subsection.10.2) cvn/Title (Multiple sets within a file) /OUT pdfmark endïbps:SDict begin [/Count -0/Dest (subsection.10.3) cvn/Title (Updating by hot keys) /OUT pdfmark endïNps:SDict begin [/PageMode /UseOutlines/Page 1/View [/Fit] /DOCVIEW pdfmark endï/ps:SDict begin [ {Catalog}<<>> /PUT pdfmark endïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (Doc-Start) cvn /DEST pdfmark endïpapersize=8.5in,11inŸà óþÖëI½q½qecss2074»Grace‘fÑT‘þfKuto‘ÿwmrialsޤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹Edw¸èard–U Vigmond“óqLË ectt1000¼evigmon@tulane.edu’æL±¹for“Grace-5.1.4Ž¡Ÿ&°Ÿ(Àœó&Lt$ffffecbx1440¿Con•cten“tsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section*.1) cvn /DEST pdfmark endŸñžïcolor push rgb 0 0 1ïps:SDict begin H.S endó]fŒ ecbx1000À1Ž‘ÿIn®>troQÂductionïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’Ÿm2ŽŽ¤ؼ‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹1.1Ž‘þ‘PurpGoseïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘I§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.2Ž‘þ‘Nomenclatureïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Cƒ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.3Ž‘þ‘Computer‘U Systemïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ä‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.4Ž‘þ‘Generalitiesïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘†µ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end1.5Ž‘þ‘Disclaimerïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.1.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘‚ÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black3Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ2Ž‘ÿMaking–Õa“Simple“Graphïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’Gß{4ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹2.1Ž‘þ‘Reading–U the“data“from“a“leïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘”‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black4Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.2Ž‘þ‘Set‘U appGearanceïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘|‹‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black4Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end2.2.1Ž‘ýþColouring–U all“sets“dieren¸ètlyïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.2.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘±©‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black4Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end2.2.2Ž‘ýþCustomizing–U eac¸èh“setïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.2.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¾Á‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.3Ž‘þ‘LabšGelling–U the“axes“using“the“fon¸èt“to˜olïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popc»‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.4Ž‘þ‘Graph‘U titlesïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘jU‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.5Ž‘þ‘Legendsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘—Û‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black5Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end2.6Ž‘þ‘A‘U c¸èhallengeïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.2.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ê/‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black6Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ3Ž‘ÿBloQÂc®>k‘ÕDataïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’ˆi«6ŽŽ¦ïcolor push rgb 0 0 1ïps:SDict begin H.S end4Ž‘ÿCreating–Õsets“within“Graceïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’9S<6ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹4.1Ž‘þ‘By‘U form¸èulaïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘J‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.2Ž‘þ‘In‘U spreadsheetïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘µ;‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.3Ž‘þ‘In–U text“editorïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘5+‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end4.4Ž‘þ‘F‘ÿ*¸rom–U bloGc¸èk“dataïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.4.4) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘’‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black7Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ5Ž‘ÿBatc®>h–Õplotting“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.5) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’tSÐ8ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹5.1Ž‘þ‘Simple–U nonGUI“prin¸ètingïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Ýý‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.2Ž‘þ‘Multiple‘U graphsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘§c‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black8Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.2.1Ž‘ýþAn‘U exampleïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘=A‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŽŒ‹*ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.2) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ1.‘ñ8In®>troQÂduction’|¹2Ž’ÕÁGï color popŽŽ £n ýˆ.\‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end5.3Ž‘þ‘Things–U for“whic¸èh“no“command“line“option“existsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.5.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¬[‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popޤؼ‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.3.1Ž‘ýþP¸èexec‘U exampleïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.3.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘¶}‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end5.3.2Ž‘ýþBatc¸èh‘U exampleïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.5.3.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘(M‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wïïcolor push Black9Ž‘wŸï color popŽ©Øïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ6Ž‘ÿFitting–Õcurv®>es“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.6) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’qŒ10ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹6.1Ž‘þ‘Linear‘U Regressionïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘'‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end6.2Ž‘þ‘Non-linearïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.6.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘´Ã‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black10Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ7Ž‘ÿT‘ÿ ºransformations‘Õïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.7) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’e¤11ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹7.1Ž‘þ‘Graphical‘U ïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘[å‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end7.1.1Ž‘ýþSimple‘U Geometricalïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.7.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘³§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end7.1.2Ž‘ýþMathematical–U opšGerations“b˜et•¸èw“een‘U setsïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.7.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘]‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black11Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end7.1.3Ž‘ýþF‘ÿ*¸eature–U extraction“ïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.7.1.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘Å…‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black12Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2Ž‘þ‘Restrictionsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.7.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘f·‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2.1Ž‘ýþDening–U a“regionïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.7.2.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘蹑ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end7.2.2Ž‘ýþUsing‘U regionsïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.7.2.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘}u‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ8Ž‘ÿUsing–ÕPipQÂes“ïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.8) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’{Rª13ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹8.1Ž‘þ‘Instead–U of“data“lesïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.8.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop=_‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black13Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end8.2Ž‘þ‘Named‘U pipGesïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.8.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘fÏ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ9Ž‘ÿMultiple‘ÕGraphsïps:SDict begin 13.68 H.L endïzps:SDict begin [/Subtype /Link/Dest (section.9) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’g¾é14ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹9.1Ž‘þ‘Selecting‘U graphsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘|£‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end9.1.1Ž‘ýþArranging–U a“tableau“of“graphsïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.9.1.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color popqõ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black14Ž‘wŸï color popŽ¡‘%ý¡ïcolor push rgb 0 0 1ïps:SDict begin H.S end9.1.2Ž‘ýþArranging–U individual“graphsïps:SDict begin 13.68 H.L endï„ps:SDict begin [/Subtype /Link/Dest (subsubsection.9.1.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘ÿÝ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end9.2Ž‘þ‘Ov•¸èerla“ying‘U Graphsïps:SDict begin 13.68 H.L endïps:SDict begin [/Subtype /Link/Dest (subsection.9.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘é‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black15Ž‘wŸï color popަïcolor push rgb 0 0 1ïps:SDict begin H.S endÀ10Ž‘ÿHot‘ÕLinksïps:SDict begin 13.68 H.L endï{ps:SDict begin [/Subtype /Link/Dest (section.10) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop’‰Ó16ŽŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end¹10.1Ž‘þ‘File–U con¸ètaining“a“Single“Setïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.1) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘7[‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.2Ž‘þ‘Multiple–U sets“within“a“leïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.2) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘…G‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black16Ž‘wŸï color popŽ¡‘ÿïcolor push rgb 0 0 1ïps:SDict begin H.S end10.3Ž‘þ‘UpGdating–U bš¸èy“hot“k˜eysïps:SDict begin 13.68 H.L endï€ps:SDict begin [/Subtype /Link/Dest (subsection.10.3) cvn/H /I/Border [0 0 0]BorderArrayPatch/Color [1 0 0] H.B /ANN pdfmark endï color pop‘=‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?ïcolor push Black17Ž‘wŸï color popŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.1) cvn /DEST pdfmark endŸ¾¿1Ž‘ÁInctropœductionŽŸ¿:¹These–]Ätutorials“assumes›]Ãthat“y¸èou“are“a“new“user˜to“Grace“but“are“somewhat“familiar˜with“a“windo¸èwingޤ ®system.‘Ó~They– uare“designed‘ tto“shoš¸èw“y˜ou“some› tof“the“basic“opGeration˜of“Grace“as“w¸èell˜as“a“few“of˜its“lessŽ¡in•¸ètuitiv“e–„features.‘þ*Please›„feel“free“to˜go“bšGey¸èond“the“b˜ounds›„of“the“actions˜describGed“herein“and˜explore“theŽ¡pšGossibilities–U of“using“Grace.‘q€After“all,“y¸èou“will“b˜e“the“one“who“b˜enets.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹Záïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.3) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ1.‘ñ8In®>troQÂduction’|¹3Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.1) cvn /DEST pdfmark endŸ ó¥!¢N ecbx1200Â1.1Ž‘¾Purp_úoseŽ©Mª¹The–ìÈpurpGose›ìÉof“these“tutorials˜are“to˜giv¸èe“brief“examples˜to“shoš¸èw“y˜ou›ìÉthe“basics˜of“ho¸èw“to˜do“something.ޤ ®Essen¸ètials–mÀand“some“of›m¿the“more“esoteric“features“of“Grace˜will“bGe“demonstrated“to“giv¸èe“the˜user“an“idea“ofŽ¡the–mMcapabilities“of›mLthis“program.‘ºIt“is“not“pGossible“to˜shoš¸èw“ev˜erything“that“Grace‘mLis“capable“of“doing.‘ºThatŽ¡knoš¸èwledge–úZonly“comes“with“use“and‘ú[expGerimen˜tation.‘a.I‘ú/recommend“that“y˜ou‘ú[do“the“tutorial“and“then“b˜yŽ¡plaš¸èying–xƒaround‘x„with“things,‘\y˜ou›x„will“bGegin˜to“understand“them.‘Û«Finally‘ÿ*¸,‘\when“y¸èou˜get“stuc¸èk,‘\read˜the“userŽ¡guide–U to“help“y¸èou.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.2) cvn /DEST pdfmark endŸ.ÂÂ1.2Ž‘¾Nomenclatureަ¹In–¿referring“to›¿what“item“to“select,‘Ý the“tutorial˜will“use“something“of“the“form˜óŒ6 ecss1000½snaf:/fo•Go/baš¸èr/b“ell–¿¹whic˜h“meansŽ¡that–‡,on“the“snaf‘‡+pšGopup,‘“¯select“from“the“fo˜o“menš¸èu“the‘‡+submen˜u“bar“and“from“the“bar‘‡+men˜u,‘“¯the“en˜try“bGell.Ž¡The–KæpGopup›Kåmain“is“the˜large“one˜with“the“graph˜that“pGops“up˜when“y¸èou“run˜xmgrace.‘nmIf˜there“is“a˜space“inŽ¡the›š½men¸èu–š¼item,‘¬$it“will˜bGe˜replaced“b¸èy˜an“underscore.‘BVSo˜,‘¬#if˜the˜men¸èu“item˜w¸èas“actually˜"Bell“jar"˜insteadŽ¡of–U bšGell“in“the“last“example,“it“w¸èould“b˜e“½snaf:/fo˜o/ba•¸èr/Bell_ja“r.ޤؼ¹Things–U that“are“to“bšGe“t¸èyp˜ed“in“will“b˜e“presenš¸èted“in“a“t˜ypGewriter“fon˜t,“eg,“t˜ypGe“¼y–?¬=“3*sin(x)¹.Ž¡Some–€of›€examples“require“y¸èou˜to“input“a˜data“le˜or“graph.‘ò6In“suc¸èh˜instances,‘ŠÁthere“should˜bGe“a“le˜in“theޤ ®tutorial–÷directory“named“data.N›èor“N.agr“where“N˜is“the“tutorial“n•¸èum“bGer.‘^rF‘ÿ*¸or–÷example,‘'ewhen“doing“tutorialŽ¡7.1.3,‘l¬y¸èou–g÷should“loGok“for›göa“le“7.1.3.agr.‘ªIt“is˜assumed“that“eac¸èh“ma‘Ž0jor˜tutorial“section“starts“with˜a“cleanŽ¡graph.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.3) cvn /DEST pdfmark endŸ.ÂÂ1.3Ž‘¾Computer‘¸Systemަ¹Some–U¤of›U¥the“follo¸èwing˜examples“require“that˜system“commands˜bGe“run.‘s The“commands˜ma¸èy“bGe˜dieren¸èt“onŽ¡y•¸èour›ò×mac“hine˜or‘òÖrequire˜a˜sligh“tly˜dieren“t‘òÖsyn“tax.‘P½In˜this˜tutorial,‘an˜attempt–òÖwill˜bGe˜made˜to“use˜the˜mostŽ¡commonly–U aš¸èv‘ÿqÐailable“UNIX“commands.‘q€This“tutorial“w˜as“prepared“on“a“Lin˜ux“mac˜hine“with“k˜ernel“2.0.32.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.4) cvn /DEST pdfmark endŸ.ÂÂ1.4Ž‘¾Generalitiesަ¹A–U couple“of“pšGoin¸èts“should“b˜e“made“ab˜out“the“GUI“b˜efore“w¸èe“b˜egin“to“mak¸èe“life“easier.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.1) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘It–W0is›W/often“pGossible“to˜select“more“than˜one“item“from˜a“list“at˜a“time“(some˜lists“maš¸èy“prev˜en˜t‘W/it“whenŽ¡‘it–æmakš¸èes‘æno“sense.).‘$vClic˜king“on“a“list‘æen˜try“without“an˜y‘æk˜eybšGoard“mo˜dier“pressed“will‘ædeselect“allŽ¡‘other–hen¸ètries›hand“select“only“that˜one.‘ª{Depressing“shift“while“clic¸èking˜an“en¸ètry“selects“all˜en¸ètries“fromŽ¡‘a–vÊpreviously“selected“enš¸ètry“to“the‘vÉcurren˜tly“selected“one.‘Ö~Finally‘ÿ*¸,‘¿4depressing“con˜trol“allo˜ws“one“toŽ¡‘individually–U toggle“the“selection“of“an“en¸ètry‘ÿ*¸.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.2) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘There–v7are“often“t•¸èw“o–v7buttons“on“a“pGop“up:‘³¯Apply“and“Aš¸èccept.‘ÔÅChanges“are“not“registered“un˜til“eitherŽ¡‘of–U these“buttons“is“pressed.‘q€The“dierence“bGet•¸èw“een–U them“is“that“Aš¸èccept“also“closes“the“windo˜w.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.1.5) cvn /DEST pdfmark endŸ.ÂÂ1.5Ž‘¾DisclaimerŽŸMª¹Evš¸èen–·though“I‘¶údo“m˜y“bGest“to“k˜eep“this›·up“to“date“with“the“latest˜release,‘Ï‘I‘¶ûcannot“guaran¸ètee“it.‘—[Think“ofŽ¡this›ùæa‘ùçp•Gerp“etual˜w¸èork–ùçin˜progress.‘_ÔTherefore,‘#if˜something“is˜wrong,‘#y¸èou“can˜notify“me˜and“I'll˜x“it˜butŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ž)ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.4) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ2.‘ñ8Making–Õa“Simple“Graph’E¼¹4Ž’ÕÁGï color popŽŽ £n ýˆ.\kš¸èeep–U in“mind“that“I“am“doing“it“in“m˜y“spare“time“for“no“money‘ÿ*¸.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.2) cvn /DEST pdfmark endŸ¾¿2Ž‘ÁMaking–G\a“Simple“GraphŽŸ¿:¹The–ÒÅob‘Ž0ject“of“this›ÒÆtutorial“is“to“do“the“most“basic˜function“of“Grace:‘lÊread“in“some“data˜in¸èto“a“graph“andޤ ®then–U labšGel“the“graph.‘q€Along“the“w•¸èa“y‘ÿ*¸,–U a“few“of“the“basic“Grace“commands“and“widgets“will“b˜e“in¸ètro˜duced.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.1) cvn /DEST pdfmark endŸ.ÂÂ2.1Ž‘¾Reading–¸the“data“from“a“leŽŸMª¹Start–vôb¸èy›vóbringing“up˜the“set˜reading“widget“ó½HЃ ecti1000ÃMain:Data/Imp‘ÿ}/ort/ASCII‘”†¹.˜Select“the˜le“2.1.dat˜(bGoth“doubleŽ¡clicš¸èking–U and“hitting“return“w˜ork).‘q€Y‘ÿ*¸ou“should“see“a“blac˜k“curv˜e“dra˜wn“on“a“graph.Ž©ؼNo•¸èw›R›w“e˜w“ould˜lik“e˜to˜add˜some–Ršmore˜sets˜to˜the˜graph,‘‘úbut˜this˜time˜the“data˜le˜will˜bGe˜in˜a˜sligh¸ètlyŽ¡dieren¸èt–ôüformat.‘QuLoGoking“at›ôýthe“le˜"2.1.dat"“(with˜the“program˜of“y•¸èour˜c“hoice),‘7y“ou–ôücan˜see“that˜its“sev¸èeralŽ¡columns‘V…of›V„n•¸èum“bGers.‘u®One˜w“a“y‘V…to˜in“terpret–V…this˜le“is˜the“rst˜column“giv¸èes˜the“x-v‘ÿqÐalues˜and“the˜rest“of˜theŽ¡columns–Êare“y-v‘ÿqÐalues.‘CKF‘ÿ*¸rom“Grace,‘æ9again“opGen“the“"Read›Ê€Sets"“widget.‘CJThis˜time,‘æ9c•¸èhec“k–Êthe“"NXY"“button.Ž¡Noš¸èw–U select“the“le“"2.1.dat".‘q€A˜t“this“pGoin˜t“y˜ou“will“ha˜v˜e“sev˜eral“dieren˜tly“coloured“curv˜es.ަY‘ÿ*¸ou–~Ushould“no•¸èw›~Tha“v“e–~U2“copies“of“the“rst˜set“since“y•¸èou'v“e–~Uread“the“le˜tš¸èwice.‘íIt“w˜ould“bGe‘~Tnice“to“eliminateŽ¡one–º»copš¸èy‘ÿ*¸.‘¢PThis“is“most“easily‘ººaccomplished“b˜y“bringing“up“a“pGopup‘ººwhic˜h“lists“all“the“sets.‘¢PSelectingŽ¡ÃMain:Edit/Data_sets...¹bring–£up“the“Data“set›£props“pGopup.‘[/It“lists“all“the˜sets“and“for“the“selected“set,‘¶~itsŽ¡t¸èypGe–ßÔand›ßÕa“few˜statistics.‘JgT‘ÿ*¸o˜eliminate“a˜set,‘÷Jselect“it˜and“then˜press“the˜righ¸èt“mouse˜button.‘JgA‘ß·men¸èu“shouldŽ¡appGear–Aþfrom‘Aÿwhicš¸èh“y˜ou›Aÿcan“select“kill.‘8Y‘ÿ*¸ou'll“note“that˜there“is“a˜kill“and˜kill“data.‘8The˜former“totallyŽ¡eliminates–WÃev¸èerything›WÄassoGciated“with˜a“set˜while“the˜latter“eliminates˜the“data˜but“k¸èeeps˜the“settings˜for“itŽ¡so–«ˆthat“if“new›«‰data“is“read“in¸èto“the“set,‘Á"it˜will“ha•¸èv“e–«ˆthe“same“propGerties“lik¸èe“colouring˜and“line“width,‘Á"etc.Ž¡Kill–U set“0“for“no¸èw.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.2) cvn /DEST pdfmark endŸ jÂ2.2Ž‘¾Set‘¸app_úearanceŽŸMª¹W‘ÿ*¸e›*„w•¸èould‘*…no“w˜lik“e˜st“yle–*…the˜sets.‘cLPractically“all˜aspGects˜of˜the“curv¸èes˜are˜congurable“including˜colour,‘3 lineŽ¡thic•¸èkness,›–sym“bGols,––drop‘‰lines,˜lls,“etc.‘ vThese–‰opGerations›‰are“a¸èv‘ÿqÐailable“under˜the“"Set˜appGearance"“widgetŽ¡whicš¸èh–½ is“in˜v˜ok˜ed“b˜y“selecting“ÃMain:Plot/Set‘ó^app–ÿ}/e“ar“anc“e...‘©€¹or–½ b˜y“double“clic˜king“near“the“target“set“withinŽ¡the–U graph“frame.ަWhen–®Çthe›®Èwidget“comes˜up,‘Å1there˜will“bGe˜a“list˜of“the“sets˜with“their˜n•¸èum“bGer–®Ç(eg.‘~wG0.S1“refers˜to“set˜1“inŽ¡graph–{0).‘Ð’Later“opGerations›|will“require“y¸èou˜to“knoš¸èw“the“n˜um˜bGer.‘Ð’Lik˜e“the›|data“sets“pGop˜up,‘Rclic¸èking“onŽ¡mouse–U button“3“in“the“set“list“will“bring“up“the“men¸èu“of“set“opGerations.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.2.2.1) cvn /DEST pdfmark endŸçÀ2.2.1Ž‘#!\Colouring–Õall“sets“dieren®>tlyŽŸMª¹The–Csimplest“w•¸èa“y–Cto“colour“all“sets‘Ddieren¸ètly“is“from“Set_AppGearance:Data/All“colors.‘]ŒFirst“select“the“setsŽ¡whic•¸èh›U y“ou˜wish˜to˜recolour˜and˜then˜select˜Set_AppGearance:Data/All˜colors.‘q€Do˜this˜no“w˜to˜y“our˜graph.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹²øïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.5) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ2.‘ñ8Making–Õa“Simple“Graph’E¼¹5Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.2.2.2) cvn /DEST pdfmark endŸ À2.2.2Ž‘#!\Customizing–Õeac®>h“setŽ©Mª¹When–°Þa›°Ýset“in˜the“list˜is“highligh¸èted,‘ÇÍthe“widgets˜c¸èhange“to˜reect“the“settings.‘„¸Practically“all˜aspGects“areޤ ®congurable.‘a×ExpGerimen•¸èt›&$b“y˜c“hanging˜the˜line˜colours˜and˜widths,‘/Šplacing˜a˜sym“bGol˜at˜eac“h˜data˜pGoin“t,‘/ŠnotŽ¡connecting–ñÿdata“pšGoin¸èts“and‘òll“the“space“b˜et•¸èw“een–ñÿthe“x-axis›òand“the“curv¸èe.‘HDon't“forget˜to“try“out“whatŽ¡is–¬taš¸èv‘ÿqÐailable“under“the“other“tabs‘¬ubGesides“Main.‘w|T‘ÿ*¸o“see“the“eect“of“a“c˜hange,‘ÂJy˜ou“ha˜v˜e“to“hit“the“"Apply"Ž¡button.‘“þÀN.B¹.:‘3*Things–µõare“draš¸èwn‘µôin“n˜umerical“order“so‘µôif“there“is“o˜v˜erlap,‘Î*the“highest‘µôn˜um˜bGered“item“willŽ¡bGe–U on“top.‘q€This“applies“to“graphs“and“sets“within“eac¸èh“graph.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.3) cvn /DEST pdfmark endŸ.ÂÂ2.3Ž‘¾Labš_úelling–¸the“axes“using“the“fon t“to˜olަ¹AspGects–‡sof›‡rthe“axes˜are“con•¸ètrolled˜b“y–‡sthe˜axes“pGopup˜whic¸èh“is˜called“from˜ÃMain:Plot/Axis‘Áüpr–ÿ}/op“erties‘Y‡¹or‘‡sb¸èyŽ¡double–iIclic¸èking›iHthe“graph“frame.‘­úAll“aspGects“of˜the“axes“can“bGe˜cš¸èhanged“lik˜e“the‘iHtitle,‘®Sthe“fon˜t,‘®Scolour,Ž¡whether–¦Üor›¦Ýnot“to˜dra¸èw“grid“lines,‘»Lor“user“dened˜tic¸èk“marks˜and“labGels.‘fµThere“are˜man¸èy“settings˜and“theŽ¡bšGest–U thing“to“do“is“to“exp˜erimenš¸èt“to“see“what“eac˜h“setting“doGes.Ž©ؼF‘ÿ*¸or–ÀWnoš¸èw,‘Û&let's“start‘ÀXb˜y“labšGelling“the–ÀXaxes.‘³&Supp˜ose“these–ÀWcurvš¸èes“represen˜t‘ÀXthe“n˜um˜bGer›ÀXof“tasks˜a“proGcessorŽ¡runs–˜Ûas›˜Úthe“function˜of“the˜n•¸èum“bGer–˜Ûof“users.‘2¾T‘ÿ*¸o“mak¸èe˜it“more“in•¸èteresting,‘¾‚assume˜w“e–˜Ûare˜doing“this˜in“QuebGec.Ž¡That–Q.means‘Q/wš¸èe“w˜an˜t‘Q/to“plot“"Nom˜bre‘Q/de“t€âc˜hes–Q/vs.‘p/nom˜bre“d'usagers".‘p/Note›Q.the“impGortance˜of“ha¸èving˜theŽ¡accen•¸èt›1°o“v“er˜the˜a‘1±in˜t€âc“hes˜or˜w“e˜w“ould˜end˜up‘1±plotting˜the˜n“um“bGer˜of˜stains˜whic“h‘1±is˜en“tirely˜another˜case.Ž¡Bring–up›the“Axes˜pGop“up,‘select˜the“Y‘îaxis,‘ and“clic¸èk“in˜the“space˜to“en¸èter˜the“labGel“string˜of“the˜axis“labGel.Ž¡Start›ót•¸èyping‘óNom“bre˜de›ót.‘K!A“t˜this‘ópGoin“t˜w“e–óneed˜to“en¸èter˜a“accen•¸èted˜letter,‘xso˜w“e–óbring˜up“the˜fon¸èt“toGolŽ¡bš¸èy–ͺpressing“¼Control-E.‘?¬¹Y‘ÿ*¸ou“will‘͹no˜w“see“what“w˜e“ha˜v˜e“t˜ypGed‘͹in“the“Cstring“widget.‘ÛMMo˜v˜e“the“cursor“toŽ¡where–"5yš¸èou“w˜an˜t“to‘"6place“the“accen˜ted“letter“and“clic˜k“on‘"6the“letter.‘`‡It“should“no˜w“appGear‘"6in“the“string.‘`‡Y‘ÿ*¸ouŽ¡can–¼ºeither›¼¹nish“the“string“here˜or“hit“accept˜and“k¸èeep“editing.‘¨MLabGel“the“x˜axis“as“wš¸èell.‘¨MThis“fon˜t‘¼¹toGol“isŽ¡a•¸èv‘ÿqÐailable›U wherev“er˜text˜needs˜to˜bGe˜en“tered.ަAll–U the“attributes“regarding“the“axis“labGels“likš¸èe“size,“colour,“fon˜t,“pGosition“are“c˜hangeable.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.4) cvn /DEST pdfmark endŸ.ÂÂ2.4Ž‘¾Graph‘¸titlesŽŸMª¹Our–oÎnext“exercise“will‘oÏbšGe“to“title“the“graph“so“other.‘Á‹Op˜eration“p˜ertaining“to“this“are‘oÏfound“in“the“"GraphŽ¡appGearance"–‚äwidget“whicš¸èh“w˜e“opGen‘‚ãb˜y“selecting“ÃMain:Plot/Gr–ÿ}/aph‘ÒFapp“e“ar“anc“e‘C3¹or‘‚ãb˜y–‚ädouble“clic˜king“just“abGo˜v˜eŽ¡the–U graph“frame.ަW‘ÿ*¸e–Ë!can›Ë no¸èw“ll“in˜the“title“of˜the“graph“and˜bš¸èy“clic˜king“on›Ë the“"Titles"“tab,‘è¡the˜fon¸èt“and“size˜and“colourŽ¡can–h²bšGe‘h±c¸èhosen.‘¬5The“Viewp˜ort“b˜o¸èx“under›h±the“"Main"“tab˜denes“the“4˜corners“of“the“graph˜frame.‘¬5Y‘ÿ*¸ou“canŽ¡tš¸èypGe–U them“in“or“use“the“mouse“to“mo˜v˜e“them“b˜y“rst“double“clic˜king“on“them.ަOther–a¶things“whicš¸èh“can“bGe“con˜trolled“in‘a·this“widget“are“the“frame“dra˜wn“around“the“graph,‘dÜwhether“or“notŽ¡the–U graph“bac¸èkground“is“coloured“and“the“legends.‘q€Legends“will“bGe“dealt“with“a“little“later.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.5) cvn /DEST pdfmark endŸ.ÂÂ2.5Ž‘¾LegendsŽŸMª¹Since›»w•¸èe‘»ha“v“e˜sev“eral–»lines˜in“our˜graph,‘Ùäit“mak¸èes˜sense“that˜w¸èe“labGel˜them˜with“a˜legend“so˜that“other˜pGeopleŽ¡can–pgure›pout“what˜they“mean.‘ÂQThe˜rst“thing“to˜do“is˜to“giv•¸èe˜eac“h–pset“a˜labGel.‘ÂQThis“is˜done“b•¸èy˜en“tering‘paŽ¡legend–<ûstring›<úfor“eac¸èh“set˜in“the“Set˜appšGearance“p˜opup.‘isNo¸èw,‘AÏfrom“the“Main›<úform“in“the˜Graph“appGearanceŽ¡pGopup,‘ëªclic•¸èk‘ÑNon›ÑM"Displa“y˜legend"˜to˜see˜the˜legend˜bGo“x.‘EThe˜lo•Gcation‘ÑNand˜app“earance˜of˜the˜b“o•¸èx˜is˜con“trolledŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ÅLïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.6) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ3.‘ñ8BloQÂc®>k‘ÕData’†F?¹6Ž’ÕÁGï color popŽŽ £n ýˆ.\b•¸èy›Ó”clic“king˜on˜the˜"Leg.‘ìÜbGo“x"˜tab.‘ìÜThe‘Ó“appGearance˜and˜spacing˜of˜the˜legend˜en“tries˜is˜con“trolled˜b“y˜theޤ ®"Legends"›‡…tab.‘®F–ÿ*¸or‘‡„simplicit¸èy“,‘”lab•Gel˜the‘‡„sets˜alphab“etically˜and–‡„then˜pla¸èy“with˜the˜appGearance,‘”etc.‘®to˜getŽ¡something–U yš¸èou“lik˜e.Ž©ؼSpGecifying–^the›_placemen¸èt“of˜the“graph˜bš¸èy“en˜tering›_the“coGordinates˜can“b•Ge˜painful,‘)Resp“ecially–^the˜ne“tuning.Ž¡T‘ÿ*¸o–Øalleviate“this“problem,›à³a“graphical“methoGd“is“also“a¸èv‘ÿqÐailable,˜although“not“readily‘×apparen¸èt.‘@þAfter“a“legendŽ¡appšGears,‘it–ma¸èy“b˜e“dragged“to‘a“new“lo˜cation.‘U!T‘ÿ*¸o“do“this,‘press“Ctrl-L‘ÿìwith‘yš¸èour“mouse“on“the“main“can˜v‘ÿqÐas.Ž¡Y‘ÿ*¸ou–Húshould›Hûsee“the˜arro¸èw“cursor“turn˜in¸èto“a˜hand.‘msIf“this˜doGesn't“wš¸èork,‘Kidouble“clic˜k“on›Hûthe“main˜can¸èv‘ÿqÐas“(toŽ¡get–·hits“attenš¸ètion)“and‘·ithen“press“Ctrl-L.“Clic˜k“on“the“legend›·iand“drag“it.‘˜XT‘ÿ*¸o“cancel˜the“legend“drag“moGdeŽ¡(as–U with“all“other“moGdes),“clic¸èk“on“mouse“button“3.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.2.6) cvn /DEST pdfmark endŸ ’Â2.6Ž‘¾A‘¸c hallengeŽŸMª¹I›™øgot‘š&bGored–š'so“I˜tošGok‘š&the“data“les“and“pro˜duced“mš¸èy“o˜wn,–¿ŒalbGeit›š&ugly‘ÿ*¸,“graph.‘3.See–š'if˜yš¸èou“can“cop˜y“Ãmygr‘ÿ}/aph.pngŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.3) cvn /DEST pdfmark endŸ¾¿3Ž‘ÁBlopœcck‘G\DataŽŸ¿:¹A‘ò×bloGc¸èk–òÿof›ódata“is“a˜table“of˜n•¸èum“bGer›òÿwhic“h˜are‘óin“terpreted˜as–ócolumns˜of“n•¸èum“bGers.‘KHo“w˜sets‘óare˜createdŽ¡from–U the“columns“depGends“on“the“information“yš¸èou“w˜an˜t“to“extract“from“the“le.ަW‘ÿ*¸e–Fœrst›Fneed“to“read“in˜a“bloGc¸èk“of“data.‘lªW‘ÿ*¸e“do“this˜from“ÃMain:Data/Imp‘ÿ}/ort/ASCII‘”†¹.“Select“the˜le“"3.dat"Ž¡and–ºƒLoad“as›º„"BloGc¸èk“data".‘¡©If˜the“read“wš¸èas“successful,‘ÓÜa“windo˜w“should‘º„pGop“up“asking“y˜ou“to‘º„create“a“setŽ¡from–U the“bloGcš¸èk“data.‘q€A˜t“the“top“it“will“list“ho˜w“man˜y“columns“of“data“w˜ere“read.ަFirst–U wš¸èe“c˜hoGose“the“t˜ypGe“of“set“w˜e“w˜ould“lik˜e.‘q€F‘ÿ*¸or“no˜w“w˜e'll“stic˜k“with“xy‘ÿ*¸.ަNext–h‹wš¸èe“c˜hoGose“whic˜h“column“of“data“con˜tains“the“x-ordinate.‘«ÁIf“there“is“no“column,‘mfw˜e“can“select“"index"Ž¡whicš¸èh–U will“use“the“index“in˜to“the“column“as“the“x“ordinate“starting“from“one.ަThe–U v‘ÿqÐalues“Y1“through“Y4“are“used“for“selecting“error“bars“as“maš¸èy“bGe“needed“b˜y“other“set“t˜ypGes.ަThe–U last“thing“to“spGecify“is“the“graph“inš¸èto“whic˜h“to“load“the“set“if“w˜e“ha˜v˜e“more“than“1“set.ަFinally‘ÿ*¸,–U hitting“accept“will“create“the“set.ަIf–=Dyš¸èou“close‘=Cthis“windo˜w,‘wMit“can‘=CreopGened“b˜y“bringing“up“a‘=Cset“list“(eg.‘)ëÃMain:Edit/Data_sets‘Ò¹)“and“thenŽ¡selecting–U Create_new/F‘ÿ*¸rom_bloGcš¸èk_data“from“the“men˜u“brough˜t“up“b˜y“righ˜t“clic˜king“on“the“set“list.ަT‘ÿ*¸ry–Øècreating›Øça“new˜set“of˜t¸èypGe“XY‘ÿ*¸dY.˜This“is˜an“XY‘ØÅcurv¸èe“with˜error“bars.‘üÖT‘ÿ*¸ry“X,˜Y,“and˜Y1(the“error)Ž¡from–U dieren¸èt“columns.ŽŸÖïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.4) cvn /DEST pdfmark endŸ¯Æ¿4Ž‘ÁCreating–G\sets“within“GraceŽŸ¿:¹Besides–x’reading›x‘in“data“les,‘¤®Grace“has˜an“extensiv¸èe“scripting˜language“with“a˜large“n•¸èum“bGer–x’of˜math“functionsŽ¡built–¥œin,‘È·These›¥function“include“the˜basic“add,–È·m¸èultiply‘ÿ*¸,“square›¥œroGot,“etc,“and˜also˜the–¥cephes˜library“of˜higherŽ¡order–-Ëmath“functions“lik¸èe“Bessel‘-Ìfunctions“and“the“gamma“function.‘ddHence,‘5©functions“in“Grace“are“basicallyŽ¡unlimited.›<ƒSee–î!the“user“guide“for“more“details.˜In“addition,‘busers“can“dynamically“add“libraries“to“GraceŽ¡with–d+anš¸èy“desired“function.‘ž As“w˜ell,‘gípGoin˜ts“ma˜y“bGe“added“man˜ually“to“a‘d*set“b˜y“the“use“of“editors.‘ž T‘ÿ*¸o“bGegin,Ž¡c¸èhoGose–;~ÃMain:Edit/Data‘gŸsets‘Ò¹.‘$˜T‘ÿ*¸o“create›;}a“set,‘upress“mouse˜button“3˜(the“righ¸ètmost˜one“for˜righ¸èt“handedŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹Ûïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.7) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ4.‘ñ8Creating–Õsets“within“Grace’7/й7Ž’ÕÁGï color popŽŽ £n ýˆ.\pGeople)–>an¸èywhere›=within“the“data“set˜list“(whicš¸èh“ma˜y‘=bGe“empt˜y)“and‘=select“Create“new.‘ÃÙA‘ men˜u‘=with“4ޤ ®dieren•¸èt›U w“a“ys˜of˜creating˜new˜sets˜will˜bGe˜presen“ted.‘q€W‘ÿ*¸e'll˜go˜through˜them˜one˜b“y˜one.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.1) cvn /DEST pdfmark endŸ.ÂÂ4.1Ž‘¾By‘¸form ulaŽŸMª¹The–U load“and“ev‘ÿqÐaluate“windo¸èw“will“pGop“up“when“this“is“selected.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.3) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘The–Úrst›Ûstep“is“to“set˜up“the“parameter˜mesh“whic¸èh“will“determine˜the“range“and“sampling˜of“theŽ¡‘v‘ÿqÐariable–U $t.‘q€Most“often,“$t“will“simply“bGe“the“abscissa.ޤñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.4) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Next,–U cš¸èhoGose“the“t˜ypGe“of“set“y˜ou“w˜ould“lik˜e“to“proGduce.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.5) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘Using–‘îthe“synš¸ètax“of“the“command“language,‘¡"an“expression“for“x“is‘‘ïen˜tered“whic˜h“uses“$t“as“the“inde-ŽŸ ®‘pšGenden¸èt–U v‘ÿqÐariable.‘q€This“can“b˜e“an“extremely“complicated“function.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.6) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Likš¸èewise,‘áan–Rexpression“for‘Qy“is“en˜tered“and‘Qfor“an˜y“other‘Qexpressions“that“ma˜y‘QbGe“needed.‘UæFields“afterޤ ®‘y–!êare›!élabGelled“y1,‘,(y2,‘,'y3“and“y4.‘`nF‘ÿ*¸or˜example,‘,(if“the˜set“t¸èypGe“xydxdy˜is“c¸èhosen,‘,(y1˜will“hold“dx˜and“y2Ž¡‘will–U hold“dy“and“it“will“bGe“necessary“to“en¸èter“expressions“for“them.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.7) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Pressing–¿Xapply“or“accept›¿Wwill“pGerform“the“calculations“and“create˜the“new“set.‘°(Y‘ÿ*¸ou˜maš¸èy“ha˜v˜e“toŽ¡‘autoscale–U to“see“the“new“set.ŽŸؼBelo¸èw–U are“a“few“samples:ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.8) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘T‘ÿ*¸o–…plot›†one“cycle“of˜a“sine˜w•¸èa“v“e:‘òJLoad:‘òKSet–…X,˜Start“load˜at:‘òJ¼0¹,‘EŸStop“load˜at:–òK¼2*pi¹,‘EžLength:“¼100¹,Ž¡‘X=$t,‘U Y=¼sin($t)ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïDps:SDict begin [/View [/XYZ H.V]/Dest (Item.9) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b¹2.Ž‘ï color popŽŽ‘A–U unit“circle“b¸èy“parameterization:›q€Start“at:¼0¹,“Stop“at:˜¼2*pi¹,“Length:˜¼100¹,“X=cos($t),“Y=sin($t)ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.2) cvn /DEST pdfmark endŸ ’Â4.2Ž‘¾In‘¸spreadsheetŽ©Mª¹If–A!yš¸èour“system“has“the“Xbae“widget“set,‘E this“c˜hoice“brings“up“a“spreadsheet“lik˜e“editor“to“allo˜w“one“to“en˜terŽ¡the– ÊpGoinš¸èts‘ Ëof“the“set“b˜y– Ëhand.‘›Initially‘ÿ*¸,‘;ôit“just– Êhas“the‘ ËpGoin˜t“(“0,‘;õ0“).‘›Clic˜king› Ëon“add“will“insert˜a“cop¸èyŽ¡of–oQthe›oPcurren¸ètly“selected˜roš¸èw“immediately“bGelo˜w‘oPthe“selected“ro˜w.‘ÀClic˜king“delete“will›oPdelete“the˜roš¸èw“whic˜hŽ¡con¸ètains– the“cursor.‘ÀThis“methošGd“is“b˜est“suited‘to“examining“or“mo˜difying“existing“sets“or“creating“v¸èeryŽ¡small–U sets.‘q€The“sets“gets“upGdated“after“one“hits“enš¸èter“or“lea˜v˜es“the“cell.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.3) cvn /DEST pdfmark endŸ.ÂÂ4.3Ž‘¾In–¸text“editorަ¹If–çby¸èour›çcsystem“doGesn't˜ha•¸èv“e–çbthe“Xbae˜widget“set˜or“yš¸èou“w˜an˜t‘çcthe“pGo˜w˜er“of‘çcy˜our“fa˜v˜ourite‘çcexternal“editor,Ž¡a–ûktext›ûjeditor“of“y•¸èour˜c“hoice›ûkma“y˜bGe‘ûjused˜to˜en“ter–ûjdata.‘d`The˜editor“is˜selected˜b¸èy“the˜GRA¸èCE_EDITORŽ¡en•¸èvironmen“t–Äîv‘ÿqÐariable.‘ÀëIf“the›Äïset“is“new,‘ âit“will˜conš¸ètain“only“the“pGoin˜t‘Äï(0,0).‘ÀëDuring“editing,‘ âno“otherŽ¡opšGerations–U are“p˜ossible.‘q€After“the“editor“is“closed,“the“set“will“b˜e“up˜dated.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.4.4) cvn /DEST pdfmark endŸ.ÂÂ4.4Ž‘¾F‘þàrom–¸blo_úc k“dataަ¹This–U creates“a“new“set“from“a“bloGcš¸èk“of“data“whic˜h“has“bGeen“read“in.‘q€See“section“3.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹îïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïDps:SDict begin [/View [/XYZ H.V]/Dest (page.8) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ5.‘ñ8Batc®>h‘Õplotting’v|¹8Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.5) cvn /DEST pdfmark endŸ ¿5Ž‘ÁBatcch‘G\plottingŽŸ¿:¹Grace– suppGorts› a“large˜n•¸èum“bGer– of˜command“line˜options“whic•¸èh˜allo“w– the˜user“to˜con¸ètrol“the˜appGearance“andޤ ®placemen¸èt›3of–3graphs.‘f+This“can˜bGe˜v¸èery˜useful“if˜y•¸èou˜w“an“t–3to˜use˜it“to˜quic•¸èkly˜prin“t˜something‘3without˜goingŽ¡through–Î4the“GUI,›Î3use“it“within“a˜script“to“automatically“generate“graphs,‘ìxor“ha•¸èv“e–Î4a“plot˜come“up“alreadyŽ¡congured–U whicš¸èh“can“bGe“m˜uc˜h“quic˜k˜er“than“going“through“the“GUI“men˜us.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.1) cvn /DEST pdfmark endŸ.ÂÂ5.1Ž‘¾Simple–¸nonGUI“prin tingŽŸMª¹In•¸èv“oking–óÆGrace“with“the“command“"grbatc¸èh"from“the“command“line“will“cause“Grace“to“start,‘oproGduce“aŽ¡plot,›žüsend–6it“to“the“prin¸èter“(unless“a“le“is“spGecied)“and‘7then“exit.‘"ÂIn“its“simplest“form,˜to“proGduce“a“plotŽ¡of–U the“le“a.agr,“t¸èypGeޤؼgracebat‘U a.agrŽ¡If–æ¨gracebat›æ§is“una¸èv‘ÿqÐailable˜on“yš¸èour“system,‘ü¿the“hardcop˜y›æ§option“to“xmgrace˜will“do˜the“same“thing.‘L­AssumingŽŸ ®the–U hardcopš¸èy“device“is“a“pGostscript“prin˜ter,“one“could“also“t˜ypGeŽ¡xmgrace–U -hdevice“Pš¸èostScript“-hardcop˜y“a.agrަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.2) cvn /DEST pdfmark endŸ.ÂÂ5.2Ž‘¾Multiple‘¸graphsŽŸMª¹Often,‘Ã’one›zIwishes–zHto“plot˜sevš¸èeral“graphs“with“eac˜h‘zIgraph“ha˜ving“dieren˜t–zIc˜haracteristics.‘àøThis“is‘zHeasilyޤ ®accomplished–tØfrom“the“command›tÙline.‘ШOptions“spGecied˜on“the“command“line“are“parsed“in˜order“and“sta¸èyŽ¡in–U eect“unš¸ètil“o˜v˜erridden“b˜y“spGecifying“them“again.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.10) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘The–}…rst›}„step“in“plotting˜m¸èultiple“graphs“is˜usually“telling˜Grace“hoš¸èw“man˜y‘}„graphs“w˜e“ha˜v˜e‘}„and“ho˜wŽ¡‘to›~‘ìïcolor push BlackŸ„€ÕÁGŽÀ5.‘ñ8Batc®>h‘Õplotting’v|¹9Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.2.1) cvn /DEST pdfmark endŸ À5.2.1Ž‘#!\An‘ÕexampleŽŸMª¹Let's–bˆtry›b‡an“example.‘™·W‘ÿ*¸e˜will“assume“5˜plots,‘eâthe˜rst“4“of˜whic¸èh“are˜to“bGe“stac•¸èk“ed˜v“ertically‘ÿ*¸,‘eâand˜the‘bˆfthޤ ®inset–Þ¬in¸èto›Þ«the“fourth.‘#W‘ÿ*¸e“wish“to˜plot“the“les˜a.dat,‘b.dat,‘c.dat“and“d.dat“with˜the“inset“graph˜bGeing“aŽ¡magnied–œ…pGortion›œ„of“d.dat.‘G­Assume“a.dat˜conš¸ètains“m˜ultiple›œ„columns“of˜data,‘®^b.dat˜is“a˜bloGc¸èk“of˜data“fromŽ¡whic•¸èh›bçw“e–bæwish˜to“mak•¸èe˜a˜curv“e–bæfrom˜columns“2˜and˜4“with˜the“error˜giv•¸èen˜b“y–bæcolumn˜3,‘¦Xc.dat˜is“to˜bGeŽ¡represen¸èted–„·as“a“bar“graph,›and“for‘„¸the“inset“graph,˜w¸èe“wish“to“graph“to“region“(0,0)“to“(1,1).‘FThis“can“bGeŽ¡accomplished‘U b¸èyŽ©ؼgracebat–»Ÿ-pGexec›» "arrange“(4,1,.1,.1,.1,ON,ON,ON)"“-nxy˜a.dat“-graph“1“-bloGc¸èk˜b.dat“-sett¸èypGe“xydy˜-b¸èxy“2:4:3Ž¡-graph–U 2“-settš¸èypGe“bar“c.dat“-graph“3“-sett˜ypGe“xy“d.dat“-graph“4“d.dat“-w˜orld“0“0“1“1“-viewpGort“.15“.3“.8“.88ަNote–m¤that“the›m£graph“n•¸èum“bGers–m¤start“at˜0“and“that“0“is˜the“default“so“it“doGes˜not“ha•¸èv“e–m¤to“b•Ge˜sp“ecied–m¤for“theŽ¡rst‘U graph.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.5.3) cvn /DEST pdfmark endŸ.ÂÂ5.3Ž‘¾Things–¸for“whic h“no“command“line“option“existsŽŸMª¹Undoubtedly‘ÿ*¸,‘Gjyš¸èou–õwill“reac˜h“a“pGoin˜t‘öwhere“y˜ou“w˜an˜t“to“do“something“for“whic˜h“no“command“line“optionŽ¡exists.‘Qö(W‘ÿ*¸e›öƒha•¸èv“e˜bGeen–ö‚doing˜this“with˜the“arrange˜command.)‘QöThis˜is˜where“Grace's˜parameter“le˜languageŽ¡is–ë~vital.‘4™The“option“"-pGexec"›ë}will“execute“the“next“argumen¸èt˜as“if“it“had˜read“it“from“a˜parameter“le“orŽ¡excuted–l#on“the“command“line.‘¶‰If‘l$yš¸èou“w˜an˜t“to“do“something“more“complicated“than“one“command,‘qäy˜ou“canŽ¡use–U sevš¸èeral“pGexec's“or“put“the“commands“in“a“le“and“run“the“le“with“the“"-batc˜h"“option.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.3.1) cvn /DEST pdfmark end¤çÀ5.3.1Ž‘#!\P®>exec‘ÕexampleŽŸMª¹T‘ÿ*¸o–U read“in“the“les“fošGo.dat“and“bar.dat“and“scale“fo˜o.dat“in“Y“bš¸èy“1000,“the“simplest“w˜a˜y“isŽŸؼxmgrace–U fošGo.dat“bar.dat“-p˜exec“"s0.y“=“s0.y“*“1000"ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.5.3.2) cvn /DEST pdfmark end¡À5.3.2Ž‘#!\Batc®>h‘ÕexampleŽŸMª¹T‘ÿ*¸o–‘do“the“same“as“the“previous“example“but‘also“labGel“the“axes“and“recolour“the“curv•¸èes,‘Ÿmmak“e–‘a“le“calledޤ ®"ble"–U with“the“Grace“commandsŽŸff‰ffÕÁGŸF¸‘ûïcolor push Blackï color popŽŽ¼#Obligatory–?¬descriptive“commentŽ¡s0.y–?¬=“s0.y“*“1000Ž¡s0–?¬line“color“3Ž¡s1–?¬line“color“4Ž¡title–?¬"A“Gnasty“Graph"Ž¡xaxis–?¬label“"Time“(“s“)"Ž¡yaxis–?¬label“"Gnats“(“1000's‘ X)"Ž¡autoscaleŽŸ ff‰ffÕÁGŸ ȹand–U then“run“xmgrace“withŽŸؼxmgrace–U foGo.dat“bar.dat“-batc¸èh“bleŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ qïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.10) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ6.‘ñ8Fitting‘Õcurv®>es’sŽ,¹10Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.6) cvn /DEST pdfmark endŸ ¿6Ž‘ÁFitting‘G\curvcesŽŸ¿:¹This–ÿßtutorial›ÿàwill“explain“some“of˜Grace's“curv¸èe“tting˜abilities.‘q½Grace˜can“pšGerform“t•¸èw“o‘ÿßt“yp˜es‘ÿàof‘ÿßttings.ޤ ®The–Orst›Nt¸èypGe“is˜regression“or“linear˜tting“where“optimization˜is“done˜on“a“linear˜equation“or˜an“equationŽ¡whic¸èh–®‚can›®ƒbGe“expressed˜in“a“linear˜form.‘}§This“includes˜tting“pGolynomials“and˜certain“forms˜of“equations.Ž¡The–U other“tš¸èypGe“of“tting“is“nonlinear“and“allo˜ws“for“arbitrary“user“supplied“functions.ŽŸؼLet's–EÓtakš¸èe“a“curv˜e“and“see“ho˜w“eac˜h“t˜ypGe“of“tting“w˜orks.‘C™T‘ÿ*¸o“bGegin,‘‚create“a“curv˜e“of“the“function“¼y‘?¬=Ž¡sqrt(x)–?¬+“exp(x)/3“-1›U ¹o•¸èv“er˜the˜range˜0˜to˜3˜with˜100˜pGoin“ts.ŽŸ6ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.1) cvn /DEST pdfmark endŸçªÂ6.1Ž‘¾Linear‘¸RegressionŽŸMª¹ChoGosing›U ÃMain:Data/T‘ÿ;Èr–ÿ}/ansformations/R“e“gr“ession‘u¹will˜pGop˜up˜the˜Regression˜windo¸èw.ŽŸ ª€ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.20) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Select–U the“set“y¸èou“just“createdޤñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.21) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Select–U the“tš¸èypGe“of“t.‘q€F‘ÿ*¸or“no˜w,“pic˜k“Linear.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.22) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘W‘ÿ*¸e–U will“load“the“tted“v‘ÿqÐalue“for“no¸èw.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.23) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Press–òÜthe“accept“button“to“see“the›òÝresults“of“the“t.‘J´A‘ò³windo¸èw“will˜pGop“up“whicš¸èh“will“giv˜e“y˜ou“theŽŸ ®‘results–U of“the“t“including“the“nal“expression.‘q€Y‘ÿ*¸ou“mighš¸èt“ha˜v˜e“to“scroll“bac˜k“a“bit“to“see“it.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.24) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘See–ïhoš¸èw“high“of“a“pGolynomial“is“needed“to“get‘ïan“acceptable“t“and“try“tting“other“t˜ypGes“of“functions.ŽŸ ®‘Note–U that“for“the“non-pGolynomial“ts,“óë ecbi1000ÄA“¹and“ÄB‘S¹are“the“tting“parameters“of“the“equation.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.25) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘No•¸èw,‘Xfw“e–W¾are“not“limited“to›W¿computing“our“tted“curv¸èe“at˜the“pšGoin¸èts“of“the“original“function.‘y[Supp˜oseޤ ®‘these–¦4data“are“quarterly“sales“and“wš¸èe“wish“to“predict‘¦5our“next“quarter.‘d¼ChoGose“the“t˜ypGe“of“t“whic˜hŽ¡‘yš¸èou–¶òfound“to‘¶ów˜ork“bGest.›<ÆInstead“of“loading‘¶ótted“v‘ÿqÐalues,ÃL–ÿ}/o“ad:‘PF‘ÿ;Èunction.˜¹No¸èw–¶òthe“bGottom‘¶óof“the“widgetŽ¡‘will›™hbGecome–™gactiv¸èe.‘>WW‘ÿ*¸e“wish˜to˜extrapGolate“o•¸èv“er˜the‘™gnext˜quarter,‘ªyso˜w“e˜w“ould‘™glik“e˜to–™gstart˜at“0˜andŽ¡‘end–U at“4“and“c¸èhošGose“100“p˜oin¸èts.‘q€Press“accept“to“see“the“extrap˜olation.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.6.2) cvn /DEST pdfmark endŸ.ÂÂ6.2Ž‘¾Non-linearŽŸMª¹W‘ÿ*¸e–HÉpGop›HÈup“the“widget“b¸èy˜selecting“ÃMain:Data/T‘ÿ;Èr–ÿ}/ansformations/Non-line“ar‘ˆUcurve‘ˆVtting‘ân¹.‘mcY‘ÿ*¸ou‘HÉma•¸èy˜w“an“t‘HÉtoŽ¡kill–U all“the“sets“except“the“original“function“and“the“extrapšGolated“function“at“this“p˜oin¸èt.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.26) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Begin–U b¸èy“selecting“the“set“to“optimize,“the“original“function.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.27) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Next,‘>Âw¸èe– write›a“function˜of˜the“form˜w¸èe˜wish“to˜t.‘¢9The“unkno¸èwn˜parameters˜are“labGelled˜a0..a9.Ž¡‘Y‘ÿ*¸ou–h¥mš¸èust“start“with“a0‘h¤and“w˜ork“y˜our“w˜a˜y“up.‘¬In“this“case,‘m†since“y˜ou“kno˜w‘h¤the“form“of“the“equationŽ¡‘already‘ÿ*¸,–U so“try:‘q€¼y–?¬=“a0*sqrt(x)“+“a1*exp(x)“+“a2¹.ŽŸ8Àïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.28) cvn /DEST pdfmark endŸuTïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘Next–t.wš¸èe“m˜ust‘t/spGecify“that“w˜e“ha˜v˜e“three“parameters‘t/to“t“whic˜h“are“a0,‘{òa1“and“a2‘t/and“the“toleranceŽ¡‘of–U the“solution.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.29) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Y‘ÿ*¸ou–¡Em¸èust›¡DspGecify“initial˜v‘ÿqÐalues“for˜the“parameters˜and“put“an¸èy˜bGounds“on˜them“if˜necessary‘ÿ*¸.‘5DepGendingŽ¡‘on–çpthe›çqfunction“y¸èou“are˜optimizing,‘ý`dieren¸èt“initial˜conditions“ma¸èy˜lead“to“drastically˜dieren¸èt“optima.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ )eïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.11) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ7.‘ñ8T‘ÿ ºransformations’h¥¹11Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.30) cvn /DEST pdfmark endŸ ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘The–,zsolution›,{proGcess“is˜iterativ¸èe“and˜yš¸èou“m˜ust‘,{clic˜k“on›,{a“button˜to“run˜a“certain˜n•¸èum“bGer‘,zof˜iterations.ޤ ®‘Y‘ÿ*¸ou–î¤should“see“the“parameters“cš¸èhange“and“a“curv˜e‘î¥created“with“these“parameters.‘> In“this“example,Ž¡‘the–ôòexact›ôñsolution“is“reac¸èhed“within˜5“steps.‘QqMore“parameters˜and“more“dicult“functions˜ma¸èy“requireŽ¡‘more–öísteps›öîin“whic¸èh˜case“y•¸èou˜ma“y‘öíc“hoGose˜to–öírun˜20“or˜100“or˜more“steps.‘RThe“newly˜created“optimizedŽ¡‘curvš¸èe–U should“con˜v˜erge“with“an“increasing“n˜um˜bGer“of“steps.Ž©ñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.31) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘As–É~in“linear‘Écurvš¸èe“tting,‘æ•y˜ou‘Écan“c˜hošGose“to“load“the‘Ét“function“at“the“p˜oinš¸èts“of‘Éthe“original“curv˜e,Ž¡‘o•¸èv“er–"!an“arbitrary“range“or“load‘""the“error“at“eacš¸èh“pGoin˜t.‘؃F‘ÿ*¸or“comparison,‘Ubload“the“tted“curv˜e“o˜v˜erŽ¡‘the–xrange›y(3,4)“b¸èy˜selecting“Nonlinear:Options/Load/F‘ÿ*¸unction“and˜lling“in“the˜bGottom“of˜the“widget.Ž¡‘Hoš¸èw–U doGes“the“true“answ˜er“compare“to“y˜our“previous“extrapGolation?ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.32) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b7.Ž‘ï color popŽŽ‘Fitting–³sarbitrary›³tcurv¸èes“can˜bGe“a˜tric¸èky“business.‘ŒzInitial˜conditions“are“v•¸èery˜impGortan“t.‘ŒzIf˜y“ou‘³sdon'tŽ¡‘get–U a“go•Go“d–U t,“yš¸èou“ma˜y“ha˜v˜e“to“expGerimen˜t“a“lot“with“the“initial“parameters“v‘ÿqÐalues.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.33) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b8.Ž‘ï color popŽŽ‘Finally‘ÿ*¸,‘¦jnote––)that›–(the“tted˜curv¸èe˜doGes“not˜get˜added“un¸ètil˜the˜accept“button˜is“pressed.‘4™This˜allo¸èwsŽ¡‘yš¸èou–U to“"foGol“around"“un˜til“y˜ou“get“a“go•Go“d–U t“without“creating“a“lot“of“garbage“sets.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.7) cvn /DEST pdfmark endŸ¾¿7Ž‘ÁT‘þ®(ransformationsŽŸ æ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.1) cvn /DEST pdfmark endŸ jÂ7.1Ž‘¾GraphicalŽŸÊïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.7.1.1) cvn /DEST pdfmark endŸƒŒÀ7.1.1Ž‘#!\Simple‘ÕGeometricalŽ©Mª¹Y‘ÿ*¸ou–ÕJcan›ÕIrotate“sets“around“an˜arbitrary“axis“p•Gerp“endicular–ÕJto˜the“can¸èv‘ÿqÐas“(e.g.‘Fãthe“Z-axis).‘FäAlso“it˜is“pGossibleŽ¡to–U scale“sets“and“translate“them.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.7.1.2) cvn /DEST pdfmark endŸؼÀ7.1.2Ž‘#!\Mathematical–ÕopšQÂerations“b˜et•®>w“een‘Õsetsަ¹It–à[is›à\pGossible“to˜pšGerform“op˜erations“b˜et•¸èw“een›à\sets.‘2With‘à[man“y˜opGerations,›*ho“w“ev“er,˜it–à\is›à[required“that˜theŽ¡2–ƒ sets“ha•¸èv“e–ƒ the“iden¸ètical“abscissa,–Ž„i.e.,“the–ƒ x“v‘ÿqÐalues“of“bGoth“sets“are“the“exact“same.‘û=This“is“necessary“sinceŽ¡most–UßopšGerations“are“p˜erformed“on“a“p˜oinš¸èt“b˜y“pGoin˜t“basis.‘s¾Eg.‘s½m˜ultiplying“2“sets“is“done“b˜y“m˜ultiplying“theŽ¡Y–Uˆv‘ÿqÐalues›U‡of“the˜2“sets“together˜to“proGduce˜a“new“Y˜v‘ÿqÐalue.‘r·AbGout“the˜only“opGerations“that˜don't“do˜this“areŽ¡ltering‘ÙÙand›ÙÚcon•¸èv“olution.‘HhF–ÿ*¸ortunately“,‘òGrace˜has–ÙÙa“function˜to“help“out˜when“the“abscissas˜dier.‘HhIt˜is“calledŽ¡in•¸èterpGolation›U whic“h˜in“terpGolates˜a˜set˜o“v“er˜the˜domain˜of˜another˜set˜to˜proGduce˜a˜new˜curv“e.ŽŸؼLet–‡ßus“no¸èw“add›‡àthe“cosine“of“a“set“to“the“sine˜of“another“set“to“create“a“new˜curv•¸èe.‘ ½Ho“w“ev“er,‘Ôw“e‘‡ßwillŽ¡complicate–U this“example“bš¸èy“ha˜ving“dieren˜t“domains“with“dieren˜t“sampling:ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.34) cvn /DEST pdfmark end¤¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Read–U in“7.1.2.agrŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.35) cvn /DEST pdfmark end¡ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Note–¼”hoš¸èw“the“abscissa“are“dieren˜t.‘§ÜW‘ÿ*¸e‘¼•bGegin“b˜y“using“in˜terpšGolate“to“pro˜duce“a“third“set“whic¸èhޤ ®‘is–2Œthe“second“set›2‹sampled“at“the“x“v‘ÿqÐalues“of˜the“rst.‘ ÄCall“up˜the“In¸èterpšGolate“p˜opup“fromŽ¡‘ÃMain:Data/T‘ÿ;Èr–ÿ}/ansformations/Interp“olation/splines‘“°...ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.36) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b¹3.Ž‘ï color popŽŽ‘Select–^4S1“as›^3the“source“set“but“don't˜spšGecify“a“destination“set.‘Œ»A‘^1set“will“automatically“b˜e“made.‘Œ»UseŽ¡‘the–>¸Strict,‘C4linear“methoGd,‘C3Sampling:Abscissas“of“another›>¹set“and“use“S0“as˜the“Sampling“set.‘jPressingŽ¡‘Apply–žshould“proGduce“a“curvš¸èe“whic˜h“is“S1“in˜terpšGolated“at‘žthe“p˜oinš¸èts“of“S0.‘L5Note“that“the“new“curv˜eŽ¡‘only–U exists“o•¸èv“er–U the“pšGortion“of“the“x“axis“common“to“b˜oth“curv¸èes.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ A„ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.12) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ7.‘ñ8T‘ÿ ºransformations’h¥¹12Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.37) cvn /DEST pdfmark endŸ ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘W‘ÿ*¸e›ѹstill‘Ѹha•¸èv“e˜a–Ѹproblem˜since“set˜2˜is“sampled˜the“same˜as“set˜0“but˜has˜a“smaller˜domain.‘çIW‘ÿ*¸e˜canޤ ®‘pGerform–s±the“computation›s°only“o•¸èv“er–s±the“common˜region“so“wš¸èe“no˜w‘s°in˜terpšGolate“on“set“0‘s°at“p˜oin¸èts“fromŽ¡‘set–U 2“to“proGduce“set“3.‘q€Noš¸èw“set“2“and“set“3“ha˜v˜e“the“exact“same“abscissas.Ž©ñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.38) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Call–U up“the“command“in¸èterpreter“from“ÃMain:Window/Commands‘'5¹...ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.39) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘W›ÿ*¸e–÷need“to“create“a“set‘öto“hold“the“result,‘ /­S4.‘~W˜e‘öcan“either“makš¸èe“a“cop˜y“(usingŽ¡‘ÃMain:Edit/Set_op–ÿ}/er“ations...¹)‘¥of‘»©S2–»¨whicš¸èh“will“bGe“guaran˜teed“to“ha˜v˜e“the‘»©propGer“size“to“hold“outŽ¡‘result–U or“wš¸èe“can“use“t˜ypGe“a“command:‘q€¼s4–?¬length“s2.lengthŽŸ8Àïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.40) cvn /DEST pdfmark endŸuTïcolor push Black‘ 9b¹7.Ž‘ï color popŽŽ‘W‘ÿ*¸e›%"ha•¸èv“e˜to˜break˜up˜the˜computation˜in“to˜an˜x˜part‘%!and˜a˜y˜part.‘aIn˜this˜instance,‘.»w“e˜simply˜wish˜toŽ¡‘k¸èeep–øÕthe“same›øÖx“v‘ÿqÐalues.‘R¼The˜nal“result“will“bGe“put˜inš¸èto“set“4,‘ Kso“w˜e“issue“the“command:‘C[¼s4.x–?¬=“s2.xަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.41) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b¹8.Ž‘ï color popŽŽ‘No•¸èw›Zñw“e˜can‘Zðp•Gerform˜the˜math˜b“et•¸èw“een˜our˜in“terpGolated–Zðcopies˜of˜sets˜0˜and“1:‘}"¼s4.y–?¬=“cos(s3.y)“+Ž¡‘sin(s2.y)¹.ŽŸ8Àïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.42) cvn /DEST pdfmark endŸuTïcolor push Black‘ 9b9.Ž‘ï color popŽŽ‘So–âwhere›ãis“the˜new“set?‘\ÁIt's˜there“but“it's˜hidden.‘\ÁSince“w¸èe˜already“ha•¸èv“e˜the‘âcommand˜windo“w‘âopGen,Ž¡‘w¸èe–ã.can›ã/unhide“the˜set“b•¸èy˜t“yping:‘¼S4‘?¬on¹.‘«F‘ÿ*¸or˜the–ã.GUI‘ã minded˜(no“oense“in¸ètended),‘³bring“up˜a“setŽ¡‘list–.0with›./the“set˜opGerations“men¸èu“(eg.‘d…ÃMain:Edit/Data_sets‘E¹or˜ÃMain:Plot/Set_app–ÿ}/e“ar“anc“e‘ÀO¹),‘5ùselect‘.0setŽ¡‘4–U and“unhide“it“bš¸èy“selecting“sho˜w“from“the“opGeration“men˜u“(mouse“button“3).ŽŸؼN.B.–~³If“the“abscissas“of“the“original“curvš¸èes“had“bGeen“the“same,‘Éw˜e“could“ha˜v˜e“started“at“step“5.‘î9If“theŽ¡sampling–U had“bGeen“the“same“wš¸èe“could“ha˜v˜e“skippGed“step“4.ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.7.1.3) cvn /DEST pdfmark endŸçÀ7.1.3Ž‘#!\F‘ÿ ºeature‘ÕextractionŽŸMª¹F‘ÿ*¸eature–k“extraction“is›k’a“w•¸èa“y–k“of“creating“one˜curvš¸èe“from“a“family“of“curv˜es.‘´ØIt“generates“one‘k’data“pGoin˜t“fromŽ¡eac•¸èh›0½curv“e˜b“y˜measuring˜a˜c“haracteristic˜of˜the˜curv“e.‘e_F‘ÿ*¸or˜example,‘8one˜migh“t˜ha“v“e˜a˜series˜of˜curv“es˜whic“hŽ¡plot–u/the›u.gnat“pGopulation˜as“a˜function“of“time.‘Ñ«Eacš¸èh“curv˜e‘u.is“proGduced“b˜y›u.v‘ÿqÐarying“some˜condition,‘}2lik¸èe“theŽ¡n•¸èum“bGer› èof‘ égn“us˜in‘ éthe˜en“vironmen“t.‘XnUsing˜feature˜extraction,‘ôone˜could– éuse˜this˜family“of˜curv¸èes“to˜proGduceŽ¡a–/new“curvš¸èe“of“the“pGeak“n˜um˜bGer“of“gnats“as“a“function‘/of“gn˜us“or“the“time“of“the“pGeak“n˜um˜bGer“of“gnats“as“aŽ¡function–U of“the“n•¸èum“bGer–U of“gn¸èus.‘q€This“is“most“often“useful“with“more“than“one“graph.ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.43) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Read–U in“graph“7.1.3.agrޤñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.44) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Bring–U up“the“feature“extraction“form“bš¸èy“clic˜king“on“ÃMain:Data/T–ÿ;Èr›ÿ}/ansformations/F“e˜atur˜e_extr˜action‘ÄU¹.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.45) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘Select–U Results“to“graph“1.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.46) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘Select–U the“feature“yš¸èou“are“in˜terested“in.‘q€ChoGose“Y“maxim˜um.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.47) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Select–Îjwhat“will“determine“the“x“v›ÿqÐalue“of“the‘Îkdata“pGoin¸èt.‘Ý^The“v˜alue“of“the“c¸èharacteristic“determinesޤ ®‘the–—³Y›—¢v‘ÿqÐalue.‘99The“X˜v‘ÿqÐalue“can“bGe“determined“bš¸èy“the“set“n˜um˜bšGer.‘99The“x“or“y“v‘ÿqÐalues“of“a“sp˜ecied“setŽ¡‘can–©Ìalso‘©ÍbšGe“used“to“pro˜duce›©Íthe“abscissa.‘o…Finally‘ÿ*¸,‘¾÷the“legend˜en¸ètry“of“the˜curv¸èe“itself“can“bGe˜used“toŽ¡‘proGduce––the“x“v‘ÿqÐalue.‘WRIn“this“case,‘Kthe“legend“enš¸ètry“m˜ust“bšGe“sp˜ecied“as“a“single“n•¸èum“b˜er.‘WRCho˜ose‘–indexŽ¡‘for‘U no¸èw.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.48) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘Press–U accept,“clicš¸èk“on“graph“1“and“then“clic˜k“on“the“autoscale“button“to“see“y˜our“results.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.49) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b7.Ž‘ï color popŽŽ‘ChoGose‘àHanother–àGfeature,›lik¸èe“frequency‘ÿ*¸,˜this“time–àHand“get›àGX‘à$v‘ÿqÐalues“from˜the“legend.‘÷Mak¸èe˜sure“thatŽ¡‘graph–U 0“has“the“foGcus“when“y¸èou“hit“accept.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹ YÖïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.13) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ8.‘ñ8Using‘ÕPipQÂes’}ÄJ¹13Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.7.2) cvn /DEST pdfmark endŸ Â7.2Ž‘¾RestrictionsޤMª¹Often–fdw¸èe“only“wish“to“examine“part“of“a“data‘fcset“or“pšGerform“transformations“only“on“a“p˜ortion“of“one.Ž© ®Restrictions–U alloš¸èw“us“to“dene“a“region“of“the“graph“on“whic˜h“to“pšGerform“op˜erations.ŽŸÉïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.7.2.1) cvn /DEST pdfmark endŸçÀ7.2.1Ž‘#!\Dening–Õa“regionŽ¡¹There–Šare‘‹sevš¸èeral“w˜a˜ys“a‘‹region“ma˜y“bGe‘‹dened.‘[NIt“ma˜y“bGe‘‹dened“b˜y“a‘‹straigh˜t“line“(left–‹of,‘Ûrigh˜t“of,‘ÛabGo˜v˜e,ަbšGelo•¸èw),‘(˜b“y–va“p˜olygon“(inside›wor“outside),‘(˜or“b¸èy“a“range“(“in˜x,›(˜out“of“x,˜in“y‘ÿ*¸,˜out“of“y).‘^óCall“the“dene“regionަpšGopup‘ Ðfrom‘ ÏÃMain:Edit/R–ÿ}/e“gions/Dene‘ÀO¹.‘X»Cho˜ose– Ðwhic¸èh› Ïone“of˜the“regions“y•¸èou˜w“ould‘ Ðlik“e˜to– Ðdene,‘¬and“pressަthe–U dene“button.ŽŸü‘ûïcolor push Black‘ÀLine‘Õt®>ypQÂeï color popŽŽŽŸ‚‘¹Dene–U the“ends“of“the“line“bš¸èy“clic˜king“with“mouse“button“1.ޤV‘ûïcolor push Black‘ÀP•®>olygon‘Õt“ypQÂeï color popŽŽŽŸ‚ ‘¹F‘ÿ*¸rom–_the“dene‘`region“p•Gopup,‘Ÿ/cš¸èho“ose–_a“pGolygon“t˜ypGe“and‘`then“the“dene“button.‘#>Use“mouse“buttonަ‘1–U to“picš¸èk“the“v˜ertices“of“the“pGolygon“and“then“mouse“button“3“when“y˜ou“are“done.Ž¡‘ûïcolor push Black‘ÀRange‘Õt®>ypQÂeï color popŽŽŽŸ‚‘¹F‘ÿ*¸rom–U the“dene“region“pšGopup,“c¸èho˜ose“a“range“t¸èyp˜e“and“then“pic¸èk“2“p˜oinš¸èts“whic˜h“dene“the“range.ޤÉïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.7.2.2) cvn /DEST pdfmark endŸçÀ7.2.2Ž‘#!\Using‘ÕregionsŽŸMª¹Regions–abma¸èy“bšGe‘aaonly“b˜e“used“to“restrict“an›aaexpression“ev‘ÿqÐaluation.‘–FBring“up˜the“ev‘ÿqÐaluateExpressions“pGopupަ(ÃMain:Data/T‘ÿ;Èr–ÿ}/ansformations/Evaluate_expr“ession‘ÄU¹).‘HòChoGose›œðthe–œñsource“and˜destination“sets˜and“spGecifyަthe–6formš¸èula“to“apply“to‘6 the“region“of“in˜terest.‘}Not“spGecifying“an“expression‘6 is“equiv‘ÿqÐalen˜t“to“the“iden˜tit˜yަtransformation.‘?ÜChoGose–ï?the“region›ï>y¸èou“wish“to˜use.‘?ÜBy“c•¸èhec“king–ï?negate,‘Æthe“complemen¸èt“of˜the“spGeciedަregion–U is“used.ŽŸؼClic¸èk–d5on“Apply‘d6to“pšGerform“the“op˜eration.‘žÀThe“resultan¸èt“set‘d6will“b˜e“the“expression“ev‘ÿqÐaluated‘d6only“on“p˜oin¸ètsަconš¸ètained– ¦in“the“spGecied“region.‘•Th˜us,‘9Hif“no“expression“w˜as“spšGecied,‘9Gthe“eect“is“to“pro˜duce“a“new“setަof–ÉŠonly“those‘É‹pGoinš¸èts“con˜tained“in“the“region.‘οCon˜v˜ersely‘ÿ*¸,‘æ¥to“delete“pGoin˜ts“in‘É‹a“region,‘æ¥lea˜v˜e“the“expressionަempt¸èy‘ÿ*¸,–U and“negate“the“region“selection.ŽŸÜ—ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.8) cvn /DEST pdfmark endŸ¾¿8Ž‘ÁUsing‘G\PippœesŽŸ¿:¹PipšGes–ÂBare“a“w•¸èa“y–ÂBof“capturing“the“output“of“a‘ÂArunning“pro˜cess“without“the“in¸ètermediary“step“of“pacing“theަoutput–Ôgin“a›Ôfle.‘ïUInstead,‘ô8the“executing“program“puts“the˜data“in“one“end“of˜the“pipGe,‘ô9and˜Grace“reads“itަfrom–U the“other“end“of“the“pipGe.Ž¡ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.8.1) cvn /DEST pdfmark endŸ.ÂÂ8.1Ž‘¾Instead–¸of“data“lesŽŸMª¹On–certain“pGopups,‘›e.g.‘VÃMain:Data/Imp‘ÿ}/ort/ASCII‘”†¹,“the›option“to“read“from“a“le“or˜pipšGe“can“b˜e“sp˜ecied.ަIf–ãla“pipGe›ãkis“c¸èhosen,‘ÿthe“command“in˜the“selection“widget“will“bGe˜run“and“the“stdout“will˜bGe“captured“andަtreated–U as“though“it“wš¸èas“data“whic˜h“w˜as“read“from“a“le.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹u+ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.14) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ9.‘ñ8Multiple‘ÕGraphs’f[q¹14Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.8.2) cvn /DEST pdfmark endŸ Â8.2Ž‘¾Named‘¸pip_úesŽŸMª¹A‘dnamed–•pipšGe‘”is“a“sp˜ecial“case“of“the“pip˜e“previously“describ˜ed.‘¯ßIn“the“previous“case,‘Drafter“the“programޤ ®has–@Ònished“execution“and“the“output“had“bšGeen“read,‘{¾the“pip˜e“wš¸èas“destro˜y˜ed.‘4–A‘@•named“pipGe“is“a“staticŽ¡structure–Zwith“the“propGertš¸èy“that‘Zm˜ultiple“prošGcesses“can“write“to“and/or“read“from“it.‘€pThe“purp˜ose“of“usingŽ¡a–^hnamed›^ipipGe“with˜Grace“is˜to“start˜up“a˜Grace“windo¸èw˜and“then˜con¸ètrol“Grace˜b¸èy“sending˜commands“andŽ¡data–küthrough“a“named›kýpipGe.‘¶This“is“v•¸èery˜pGo“w“erful–küand“lets“yš¸èou“do“practically“an˜ything‘kýy˜ou“can“do“directlyŽ¡from–U the“GUI.“T‘ÿ*¸o“use“this“feature,“try“the“follo¸èwing:ŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.50) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Start–§a›§named“pipGe˜(yš¸èou“will“ha˜v˜e›§to“nd˜the“command“spGecic˜to“y¸èour˜opGerating“system.‘7{F‘ÿ*¸or“example,Ž¡‘it–U could“bGe“Ãmkfo‘ö®¹or“Ãmkno‘ÿ}/d‘w¹):–q€¼mkfifo‘?¬pvc¹.“If–U yš¸èou“do“a“directory“listing,“y˜ou“should“see“the“le“p˜v˜c.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.51) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Start–kTup›kSGrace“in˜the“bac¸èkground“using˜the“named˜pipGe“option:‘ç¼xmgraceóqLË ecit1000Å-–¼V¼npipepÅv“¼c¹&.‘´Grace˜is‘kTno¸èwŽ¡‘monitoring–þthe“pipGe“for“anš¸èy“data“whic˜h“migh˜t“bGe“sen˜t‘þto“it.‘l#It“will“in˜terpret“things“as“though“theyŽ¡‘w•¸èere›U en“tered˜using˜the˜command˜in“terpreter.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.52) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘F‘ÿ*¸or–œéa“simple›œètest,‘®Ûw¸èe“will“create“a“simple˜graph“o•¸èv“er–œéthe“pipGe.‘HÚF‘ÿ*¸rom“y¸èour“command˜line,‘®Ût¸èypGe:‘¼echoŽ¡‘"read–?¬ó !",š cmsy10¸n¼"8.2.dat¸n¼""“ó  b> cmmi10µ>“¼pvcÀ.‘ȹ(The–^bac¸èk“slashes›]are“needed“to“escapGe˜the“quotation“marks˜so“thatŽ¡‘Grace–•$really“receiv¸èed“the“command“:read“"8.2.dat".)›1ŒThis‘•%just“told“Grace“to“read“the“le“data.˜No¸èwŽ¡‘w•¸èe›2õw“ould‘2ölik“e˜to–2öautoscale.‘fW‘ÿ*¸e˜could“simply˜clic¸èk“on˜the“button˜but“the˜pGoin¸èt“is˜to“use˜a“named˜pipGe.Ž¡‘This–(Ótime‘(Òwš¸èe“t˜ypGe“¼echoautoscale–?¬µ>“¼pvc¹follo˜w˜ed‘(Òb˜y#Œ¼echo“redraw“µ>“¼pvcÃ.‘옹Y‘ÿ*¸our–(Ógraph‘(Òshould“no˜wŽ¡‘ha•¸èv“e–Âíautoscaled“and“redra¸èwn.›@ÅExit“Grace“with‘Âì¼echoexitµ>‘?¬¼pvc¹.˜Y‘ÿ*¸ou“should“also“clean“up“bš¸èy“remo˜vingŽ¡‘p•¸èv“c.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.53) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘The–5¬true“pšGo•¸èw“er‘5­in–5¬named“pip˜es“lies“in‘5­driving“Grace“using“another“program.‘gThe“con¸ètrolling“programŽ¡‘can–þqopšGen“a“named“pip˜e“for“writing,‘(Åwhic¸èh“is“treated“as“an“ordinary“le.‘msIt“can“b˜e“op˜ened“with“theŽ¡‘Ãfop‘ÿ}/en()‘ÈÁ¹function–j3or“whatevš¸èer“other“I/O‘j.function“y˜ou“prefer.‘°¹Commands‘j4and“data“are“then“written“toŽ¡‘the–U le“where“they“are“inš¸èterpreted“b˜y“Grace.ŽŸ~ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïGps:SDict begin [/View [/XYZ H.V]/Dest (section.9) cvn /DEST pdfmark endŸ¾¿9Ž‘ÁMultiple‘G\GraphsŽŸ ³ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.1) cvn /DEST pdfmark endŸSËÂ9.1Ž‘¾Selecting‘¸graphsŽ©Mª¹When–ñÕm¸èultiple›ñÔgraphs“are˜presen¸èt,‘a˜graph“is˜selected“b•¸èy˜clic“king–ñÕinside˜the“graph˜frame.‘GžIn˜cases“whereŽ¡graph–U frames“o•¸èv“erlap,›U clic“king˜will˜cycle˜among˜the˜o“v“erlapping˜graphs.ŽŸؼIt–ÚÁmighš¸èt“bGe‘ÚÀanno˜ying“if“one“is“trying“to‘ÚÀw˜ork“in“a“region“of“o˜v˜erlapping›ÚÀgraphs.‘cIf“will“not˜bšGe“p˜ossible“toŽ¡double–Ìaclicš¸èk“on“something‘ÌbbGecause“the“eac˜h“clic˜k“will“bGe“in˜terpreted‘Ìbas“a“single“clic˜k“and“y˜ou‘Ìbwill“only“end“upŽ¡cš¸èhanging–ã!the“graph“foGcus.‘KIn“suc˜h“an“instance,‘ùîturning“o“the“graph“selection‘ã"b˜y“clic˜king“migh˜t“bGe“desirable.Ž¡ChoGose› ÃMain:Edit/Pr–ÿ}/efer“enc“es‘î6¹and˜then‘!set˜ÃMisc:Gr“aph_fo“cus‘î6¹to˜"As–!set".‘^€This“means˜one“m¸èust˜explicitlyŽ¡set–gthe“foGcus.›VîSimply“bring“up‘ha“graph“list“(eg.˜ÃMain:Edit/Overlay_gr‘ÿ}/aphs‘×|¹is“but“one),‘Yselect‘hthe“graph“y¸èouŽ¡w•¸èan“t–U to“wš¸èork“on“and“then,“using“the“men˜u“under“mouse“button“3,“c˜hošGose“"F‘ÿ*¸o˜cus“to".ŽŸïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.9.1.1) cvn /DEST pdfmark endŸçÀ9.1.1Ž‘#!\Arranging–Õa“tableau“of“graphsަ¹Placing–)a›*large“n•¸èum“bGer˜of–)regularly“spaced˜graphs“is˜easily“done˜with“ÃMain:Edit/A¾˜rr–ÿ}/ange_gr“aphs‘Ò¹.‘[ÙThis‘)willŽ¡automatically–U calculate“the“la•¸èy“out:ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹†Ûïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.15) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ9.‘ñ8Multiple‘ÕGraphs’f[q¹15Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.54) cvn /DEST pdfmark endŸ ïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘ChoGose–ªÊ3“roš¸èws“and“3“columns“and“Apply–ÿ*¸.‘r~Y“ou‘ªËshould–ªÊno˜w“see“9“graphs.‘r~The“Order“button“refers“toޤ ®‘the›Øw•¸èa“y‘Øthe˜graphs˜are˜n“um“b•Gered.‘GÑThe˜b“eginning˜of–Øthe˜line˜on˜the“diagram˜of˜the˜button“sho•¸èws˜whic“hŽ¡‘graph–U is“n•¸èum“bGered–U 0“and“hoš¸èw“the“n˜um˜bGers“increase,“b˜y“ro˜w“or“column.Ž©ñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.55) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Y‘ÿ*¸ou–realize“yš¸èou“need“horizon˜tal“pac˜king,‘PNi.e.‘ÌSno“horizon˜tal“gap“bGet˜w˜een“graphs.‘ÌTClic˜k“on“the“P˜ac˜kŽ¡‘button–U bGeside“the“Hgap/width“input“and“then“Apply‘ÿ*¸.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.56) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘Suddenly‘ÿ*¸,‘·Æyš¸èou–¤ realize“y˜ou“only“need“6“graphs“and“not“9.‘^AChoGose‘¤ 2“ro˜ws“and“press“Apply‘ÿ*¸.‘^AThere“is“aŽ¡‘sligh¸èt–Âcproblem“as›Âdgraphs“6,‘ß¼7“an˜8“are“still“visible.‘@—This“is“a˜feature“since“y¸èou“don't˜w•¸èan“t–Âcto“acciden¸ètallyŽ¡‘kill–Ÿa›žgraph.‘_UY‘ÿ*¸ou“can˜kill“the“extra˜graphs“b•¸èy˜clic“king–Ÿon“the˜"Kill“extra“graphs"˜c•¸èhec“k‘ŸbGo“x.‘_UNo“w,‘)…an“yŽ¡‘graphs–U other“than“the“explicitly“arranged“ones“will“bGe“automatically“killed.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.57) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘The–úmargins“are“conš¸ètrolled“b˜y“the‘ùP˜age“Osets,‘>±and“the“in˜tergraph‘ùspacing“b˜y“the“Hgap“and“V‘ÿ*¸gapŽ¡‘inputs.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.58) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Press–U close“to“remo•¸èv“e–U the“windo¸èw.ŽŸؼ‘ÿïcolor push Black‘ï color popŽŽ‘'ÿNote–Ixthat“only‘Iwgraphs“whicš¸èh“are“selected“are“tak˜en‘Iwin˜to“consideration.‘NˆSo,‘†Žif‘Iwy˜ou“wish“toŽ¡‘reorganize–U yš¸èour“existing“graphs,“mak˜e“sure“they“are“selected“or“new“ones“ma˜y“bGe“created.Ž©ïïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïQps:SDict begin [/View [/XYZ H.V]/Dest (subsubsection.9.1.2) cvn /DEST pdfmark endŸçÀ9.1.2Ž‘#!\Arranging–Õindividual“graphsŽŸMª¹Arranging–ßindividual“graphs“maš¸èy“either“bGe‘àdone“(1)“exactly‘ÿ*¸,‘=Ob˜y“spšGecifying“the“viewp˜ort“co˜ordinates“fromŽ¡ÃMain:Plot/Gr–ÿ}/aph_app“e“ar“anc“e‘ƒÝ¹or–Ãusing›ÃŽthe“previously˜explained˜Arrange“graphs˜pGopup,‘ß*or“(2)˜roughly‘ÿ*¸,‘ß*b¸èyŽ¡double–U clicš¸èking“a“graph“foGcus“mark˜er“and“then“mo˜ving“it.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïLps:SDict begin [/View [/XYZ H.V]/Dest (subsection.9.2) cvn /DEST pdfmark endŸ.ÂÂ9.2Ž‘¾Ov• erla“ying‘¸GraphsŽŸMª¹Ov•¸èerla“ying–×1one“graph“on¸èto›×0another“is“useful“for“creating“a˜graph“with“t•¸èw“o›×1dieren“t˜x˜axes‘×0and/or˜y˜axes.Ž¡F‘ÿ*¸or–N€example,‘OÔyš¸èou“ma˜y“wish“to‘Nha˜v˜e“a“graph“whic˜h›Non“the“x“axis˜has“the“mon¸èth“of˜the“y¸èear.‘oKThere“could“bGeŽ¡2–pcurv¸èes›oon“it,‘¯ƒone“using˜the“left“y˜axis“whic¸èh˜is“n•¸èum“bGer‘pof˜gn“us–psold˜and“one“using˜the“righ¸èt˜y-axis“whic¸èhŽ¡is›Zthe‘Zn•¸èum“b•Ger˜of‘Zgnats˜exp“orted˜on–Za˜logarithmic“scale.‘€cLik¸èewise,‘[Tif˜one˜is“plotting˜spGectral“data,‘[Tone˜couldŽ¡ha•¸èv“e–U one“x“axis“in“Hz“and“another“one“in“w•¸èa“v“elength.‘q€Let's–U proGceed“with“an“example:dataŽŸ Pïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.59) cvn /DEST pdfmark end©¼lïcolor push Black‘ 9b1.Ž‘ï color popŽŽ‘Begin–U bš¸èy“selecting“ÃMain:Edit/Overlay‘“°gr‘ÿ}/aphs‘'5¹to“bring“up“the“Ov˜erla˜y“widget.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.60) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b2.Ž‘ï color popŽŽ‘Select–ˆÄthe“graph‘ˆÃn•¸èum“bGers–ˆÄwith“whicš¸èh“w˜e“w˜ould‘ˆÃlik˜e“to“deal.‘ kIn“this“example,‘•­w˜e“will‘ˆÃo˜v˜erla˜y“graph“1Ž¡‘onš¸èto–Dègraph“0.‘lA˜t‘Dçthis“pGoin˜t,‘H'only›Dçgraph“0“is“visible.‘lW‘ÿ*¸e“cannot˜see“Graph“1“to“select“since˜it“doGes“notŽ¡‘exist–€}at“this“pGoinš¸èt.‘ó—W‘ÿ*¸e“need“to“create“simply“b˜y“pressing“mouse“button“3“in“a“graph“list“windo˜w“andŽ¡‘selecting–U create“new.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.61) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b3.Ž‘ï color popŽŽ‘The›^‚o•¸èv“erla“y˜t“ypGe‘^ƒis˜determined˜b“y˜what–^ƒis˜common˜among˜the“o•¸èv“erla“y“ed˜graphs.‘§In˜our˜example,‘`ÛtheŽ¡‘x–Mëaxis›Mêis“common˜so“w¸èe˜will“select˜ÃX-axes–same,‘ŽbY-axes“dier‘ÿ}/ent.‘—¹This–Mëis˜impšGortan¸èt“b˜ecause‘Mêw¸èe“don'tŽ¡‘w•¸èan“t–#ªto›#«alter“an¸èy“axes˜of“the“Ov•¸èerla“y˜graph›#ªwhic“h˜w“e–#«set˜the˜same“as˜the˜underla¸èy“graph.‘ÝIn˜thisŽ¡‘example,–U wš¸èe“don't“w˜an˜t“to“alter“the“x-axis“of“graph“1.ŽŸñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.62) cvn /DEST pdfmark end¦ïcolor push Black‘ 9b4.Ž‘ï color popŽŽ‘W‘ÿ*¸e–¦Áare›¦Âno¸èw“ready˜to“labGel˜the“graph“axes˜and“read˜the“data.‘feOne“thing“w•¸èe˜m“ust–¦ÁbGe˜careful“to˜do“isŽ¡‘to›òPalw•¸èa“ys˜mak“e˜sure˜that˜w“e˜are˜w“orking˜on˜the‘òQin“tended˜graph.‘ISeeing˜as˜the˜graphs˜are˜o“v“erlain,Ž¡‘clic¸èking–óîwithin›óïthe“frame“is˜am¸èbiguous“as“to˜what“graph“is˜selected.‘MëThe“rule“is˜that“in“a˜region“ofŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹þïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.16) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ10.‘ñ8Hot‘ÕLinks’ù·¹16Ž’ÕÁGï color popŽŽ £n ýˆ.\‘o•¸èv“erla“y‘ÿ*¸,‘/clic“king–3will‘4cycle“bGet•¸èw“een–3the“graphs.‘Z1Hence,›0if“graph“1“is“selecting,˜clic¸èking“within“the“frameޤ ®‘will–U toggle“to“graph“0.Ž©ñ¨ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.63) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b5.Ž‘ï color popŽŽ‘Making–Âäsure“that›Âãgraph“0“is“activ¸èe,‘ÞUbring˜up“the“Axis“propGerties“widget.‘ºËNo¸èw“set“the“y˜axis“title“toŽ¡‘Gn¸èus.ŽŸïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.64) cvn /DEST pdfmark endŸ®ïcolor push Black‘ 9b6.Ž‘ï color popŽŽ‘Select–¸graph“1“as“activš¸èe“as“set“the“title“as“Gnats.‘šfNotice“ho˜w“it“o˜v˜erlaps“the“Gn˜us.‘šeW‘ÿ*¸e“w˜an˜t“to“putŽ¡‘this–U on“the“righ¸èt“side.‘q€F‘ÿ*¸rom“the“axis“labšGel“and“bar“tab,“select“lab˜el“Prop˜erties/Side=Opp˜osite.ŽŸØïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.65) cvn /DEST pdfmark endŸ.<ïcolor push Black‘ 9b7.Ž‘ï color popŽŽ‘LabšGel–Tthe“x‘Taxis“to“lab˜el“it.‘q(If“graph“1“is‘Tthe“currenš¸èt“graph,‘TMnoticed“ho˜w“it“is“grey˜ed‘Tout“bGecause“onlyŽ¡‘1–U x“axis“need“bGe“activš¸èe.‘q€Select“graph“0“and“y˜ou“should“no˜w“bšGe“able“to“alter“the“axis“lab˜el.ަïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïEps:SDict begin [/View [/XYZ H.V]/Dest (Item.66) cvn /DEST pdfmark endŸ¼lïcolor push Black‘ 9b8.Ž‘ï color popŽŽ‘Y‘ÿ*¸ou–WQare“ready“to“read“in‘WPdata.‘xJust“makš¸èe“sure“the“graph“that“is“activ˜e“when‘WPy˜ou“read“in“the“data“(orŽ¡‘create–U yš¸èour“set)“is“the“one“in“whic˜h“y˜ou“in˜tend“it“to“go.ŽŸ®ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïHps:SDict begin [/View [/XYZ H.V]/Dest (section.10) cvn /DEST pdfmark endŸ/î¿10Ž‘¬%Hot‘G\LinksŽŸ¿:¹Hot–Tlinks“are›Ta“w•¸èa“y–Tof“of˜upGdating“a“set“without˜ha¸èving“to“delete“it˜rst“and“then“reread“it.‘qOThe“Hot“LinksŽ¡windoš¸èw–U is“opGened“a˜v‘ÿqÐailable“under“ÃMain:Data/Hot‘“°links‘Ò¹.ŽŸ}1ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.1) cvn /DEST pdfmark endŸ ’Â10.1Ž‘%}¨File–¸con taining“a“Single“SetŽŸMª¹The–¶¢simplest›¶¡hot“link“is“to˜a“le“con¸ètaining˜just“one“set.‘–T‘ÿ*¸o“mak¸èe˜a“hot“link˜to“a“single˜set,‘Ïw•¸èe˜m“ust‘¶¢rstŽ¡select–ÇCthe‘ÇDset“wš¸èe“w˜an˜t“to›ÇDget“upGdated“and˜then“spGecify“the˜le.‘ÇéW‘ÿ*¸e˜ma¸èy“also“link˜to“a“pipGe“in˜whic¸èh“caseŽ¡w•¸èe›÷3m“ust–÷2spGecify˜it˜is“a˜pipGe˜to“whic•¸èh˜w“e–÷2are˜linking.‘W¸A‘÷ command“ma¸èy˜also˜bGe“en•¸ètered˜whic“h˜will‘÷2bGe˜runŽ¡evš¸èery–[Gtime“the‘[Hhot“link“is“upGdated.‘ƒöA‘[Fcommon“command“migh˜t“bGe‘[Hautoscale“whic˜h“will“mak˜e‘[Hsure“that“theŽ¡enš¸ètire–Ê´set“can“bGe‘ʵseen“if“it“c˜hanges“size.‘Ò=It's“pGossible“y˜ou“ma˜y“w˜an˜t“to“execute‘ʵmore“commands“than“one.Ž¡One›©çcould,–¿for‘©èexample,“ha•¸èv“e˜a˜set˜that–©èis˜a˜function˜of“2˜sets˜that˜needs“to˜bGe˜recomputed˜if“either˜set˜isŽ¡upGdated.‘q€If–U this“is“the“case,“put“y¸èour“commands“in“a“le“and“then“use“the“"READ“BA‘ÿ*¸TCH"“command.Ž©ؼPressing–ÌËthe“Link“button›ÌÌwill“no¸èw“create“the“link“and“if˜the“upGdate“button“is“pressed,‘èthe˜set“will“bšGe“up˜datedŽ¡with–U the“currenš¸èt“con˜ten˜ts“of“the“le“y˜ou“link˜ed“and“the“con˜ten˜ts“of“the“Command“widget“will“bGe“executed.ަF‘ÿ*¸or–Pa“simple“example,›Qread“in“the“set“10.1.dat“and“set“up“the“hot“link.‘oÓNo¸èw,˜run“the“command“shiftdata.shŽ¡and–¿upGdate›¿Žthe“hotlink.‘°ÈY‘ÿ*¸ou“should˜ha•¸èv“e–¿seen“the˜pGeak“in˜the“graph“shift.‘°ÈT‘ÿ*¸ry˜repGeating“this“a˜couple“ofŽ¡more‘U times.ŽŸ ýYïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.2) cvn /DEST pdfmark endŸ jÂ10.2Ž‘%}¨Multiple–¸sets“within“a“leŽŸMª¹Sometimes–´a›´data“le˜maš¸èy“con˜tain‘´m˜ultiple“columns›´of“data˜and“w•¸èe˜w“ould‘´lik“e˜to–´bGe˜able“to˜link“to˜all“orŽ¡some–XOof“those›XPcolumns.‘{ T‘ÿ*¸o“spGecify“this,‘Yselect“as˜man¸èy“sets“as“there“are“xy˜columns“of“data“in“the“le.‘{TheŽ¡"x–(_y1“y2"“format‘(^is“assumed.›b•ChoGose“the“le“the“data“and“Ãlink‘}¹.˜No¸èw“in›(^the“link“list,‘1Sthe˜links“will“sho¸èw“theŽ¡le–åéname“with“an‘åêappšGended“colon“and“n•¸èum“b˜er.‘#ÜThe‘åén“um“b˜er–åétells“what“column“of“data‘åêthe“link“refers“to.Ž¡An•¸èy›.un“w“an“ted‘-columns˜ma“y˜bGe‘-selected˜and˜unlink“ed–-at˜this“pGoin¸èt.‘_0When“the˜upGdate˜button“is˜selected,‘)+allŽ¡sets–U in“the“graph“will“bšGe“up˜dated.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒ‹·¡ïþps:SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if endŸÚÜ|‘þÿ ïcolor push gray 0ïps:SDict begin H.S endïcolor push gray 0ï color popïps:SDict begin H.R endïEps:SDict begin [/View [/XYZ H.V]/Dest (page.17) cvn /DEST pdfmark endï color popŽŽ ©K… ý>‘ìïcolor push BlackŸ„€ÕÁGŽÀ10.‘ñ8Hot‘ÕLinks’ù·¹17Ž’ÕÁGï color popŽŽ £n ý~.\ïps:SDict begin H.S endïps:SDict begin 13.68 H.A endïMps:SDict begin [/View [/XYZ H.V]/Dest (subsection.10.3) cvn /DEST pdfmark endŸ Â10.3Ž‘%}¨Up_údating–¸bš y“hot“k˜eysŽŸMª¹Instead–àZof›à[ha¸èving“to˜k¸èeep“the˜Hot“links“windo¸èw˜opGen“all˜the“time,‘÷µthe˜upGdate“action˜is“bGound“to˜alt-u.‘J”If“y¸èouޤ ®nd–müthat“alt-u›mûhas“no“eect,‘t3try˜double“clic¸èking“inside“the“graph˜yš¸èou“w˜an˜t“to“upGdate“and‘mûclose“the“windo˜wŽ¡that–U pšGops“up.‘q€This“will“"alert"“the“can¸èv‘ÿqÐas“to“pro˜cess“future“hot“kš¸èey“strok˜es.ŽŽŸïcolor push Black’ÕÁGï color popŽŽŽŒøÌ‘ƒ’À;è©K…ÕÁGóqLË ecit1000óë ecbi1000ó½HЃ ecti1000ó¥!¢N ecbx1200ó]fŒ ecbx1000ó&Lt$ffffecbx1440óŒ6 ecss1000óqLË ectt1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ùÑJßßßßßßßgrace-5.1.23/doc/7.1.3.agr0000644000076500001440000046000607054630166014353 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 600, 600 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1900 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Feb 11 13:59:23 2000" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 50 @ world ymin -5 @ world ymax 5 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.100000 @ view ymax 0.465000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 10 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.76 @ legend y1 0.42 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "X=x , Y=sin(x)" @ s0 legend "1" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "X=x , Y=2*sin(2*x)" @ s1 legend "2" @ s2 hidden false @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 3 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 3 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 3 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "X=x , Y=4*sin(x/2)" @ s2 legend "4" @ s3 hidden false @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 4 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 1 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 4 @ s3 errorbar pattern 1 @ s3 errorbar size 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "X=x , Y=3*sin(x/2)*sin(x)" @ s3 legend "8" @g1 on @g1 hidden false @g1 type XY @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.535000 @ view ymax 0.900000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.5 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @target G0.S0 @type xy 0 0 0.0368515 0.0368432 0.0737031 0.0736363 0.110555 0.11033 0.147406 0.146873 0.184258 0.183217 0.221109 0.219312 0.257961 0.255109 0.294812 0.29056 0.331664 0.325617 0.368515 0.360231 0.405367 0.394356 0.442218 0.427945 0.47907 0.460954 0.515921 0.493337 0.552773 0.525049 0.589624 0.556049 0.626476 0.586294 0.663327 0.615742 0.700179 0.644355 0.737031 0.672092 0.773882 0.698917 0.810734 0.724793 0.847585 0.749684 0.884437 0.773558 0.921288 0.796381 0.95814 0.818123 0.994991 0.838754 1.03184 0.858246 1.06869 0.876573 1.10555 0.893709 1.1424 0.909632 1.17925 0.92432 1.2161 0.937752 1.25295 0.949911 1.2898 0.960781 1.32665 0.970345 1.36351 0.978592 1.40036 0.985511 1.43721 0.991091 1.47406 0.995325 1.51091 0.998208 1.54776 0.999735 1.58462 0.999905 1.62147 0.998717 1.65832 0.996172 1.69517 0.992276 1.73202 0.987031 1.76887 0.980447 1.80572 0.972531 1.84258 0.963295 1.87943 0.95275 1.91628 0.940912 1.95313 0.927796 1.98998 0.913421 2.02683 0.897805 2.06369 0.880969 2.10054 0.862938 2.13739 0.843735 2.17424 0.823386 2.21109 0.801919 2.24794 0.779364 2.28479 0.75575 2.32165 0.731109 2.3585 0.705476 2.39535 0.678885 2.4322 0.651372 2.46905 0.622975 2.5059 0.593732 2.54276 0.563682 2.57961 0.532868 2.61646 0.501329 2.65331 0.46911 2.69016 0.436254 2.72701 0.402805 2.76386 0.36881 2.80072 0.334313 2.83757 0.299363 2.87442 0.264006 2.91127 0.228291 2.94812 0.192266 2.98497 0.155979 3.02183 0.119481 3.05868 0.082821 3.09553 0.0460481 3.13238 0.00921275 3.16923 -0.0276351 3.20608 -0.0644455 3.24293 -0.101168 3.27979 -0.137754 3.31664 -0.174152 3.35349 -0.210314 3.39034 -0.24619 3.42719 -0.281733 3.46404 -0.316892 3.5009 -0.351621 3.53775 -0.385873 3.5746 -0.419601 3.61145 -0.452759 3.6483 -0.485302 3.68515 -0.517186 3.722 -0.548368 3.75886 -0.578805 3.79571 -0.608457 3.83256 -0.637282 3.86941 -0.665242 3.90626 -0.692298 3.94311 -0.718415 3.97996 -0.743556 4.01682 -0.767687 4.05367 -0.790776 4.09052 -0.812791 4.12737 -0.833702 4.16422 -0.853481 4.20107 -0.872102 4.23793 -0.889538 4.27478 -0.905766 4.31163 -0.920765 4.34848 -0.934513 4.38533 -0.946992 4.42218 -0.958185 4.45903 -0.968077 4.49589 -0.976655 4.53274 -0.983906 4.56959 -0.989821 4.60644 -0.994393 4.64329 -0.997614 4.68014 -0.99948 4.717 -0.999989 4.75385 -0.999141 4.7907 -0.996935 4.82755 -0.993376 4.8644 -0.988468 4.90125 -0.982218 4.9381 -0.974634 4.97496 -0.965727 5.01181 -0.955508 5.04866 -0.943992 5.08551 -0.931194 5.12236 -0.917131 5.15921 -0.901824 5.19607 -0.885291 5.23292 -0.867557 5.26977 -0.848644 5.30662 -0.828579 5.34347 -0.807389 5.38032 -0.785103 5.41717 -0.761751 5.45403 -0.737364 5.49088 -0.711976 5.52773 -0.685621 5.56458 -0.658335 5.60143 -0.630155 5.63828 -0.60112 5.67514 -0.571268 5.71199 -0.540641 5.74884 -0.509279 5.78569 -0.477226 5.82254 -0.444525 5.85939 -0.41122 5.89624 -0.377357 5.9331 -0.342982 5.96995 -0.308141 6.0068 -0.272881 6.04365 -0.237251 6.0805 -0.201299 6.11735 -0.165073 6.1542 -0.128623 6.19106 -0.0919985 6.22791 -0.0552491 6.26476 -0.0184247 6.30161 0.0184247 6.33846 0.0552491 6.37531 0.0919985 6.41217 0.128623 6.44902 0.165073 6.48587 0.201299 6.52272 0.237251 6.55957 0.272881 6.59642 0.308141 6.63327 0.342982 6.67013 0.377357 6.70698 0.41122 6.74383 0.444525 6.78068 0.477226 6.81753 0.509279 6.85438 0.540641 6.89124 0.571268 6.92809 0.60112 6.96494 0.630155 7.00179 0.658335 7.03864 0.685621 7.07549 0.711976 7.11234 0.737364 7.1492 0.761751 7.18605 0.785103 7.2229 0.807389 7.25975 0.828579 7.2966 0.848644 7.33345 0.867557 7.37031 0.885291 7.40716 0.901824 7.44401 0.917131 7.48086 0.931194 7.51771 0.943992 7.55456 0.955508 7.59141 0.965727 7.62827 0.974634 7.66512 0.982218 7.70197 0.988468 7.73882 0.993376 7.77567 0.996935 7.81252 0.999141 7.84938 0.999989 7.88623 0.99948 7.92308 0.997614 7.95993 0.994393 7.99678 0.989821 8.03363 0.983906 8.07048 0.976655 8.10734 0.968077 8.14419 0.958185 8.18104 0.946992 8.21789 0.934513 8.25474 0.920765 8.29159 0.905766 8.32845 0.889538 8.3653 0.872102 8.40215 0.853481 8.439 0.833702 8.47585 0.812791 8.5127 0.790776 8.54955 0.767687 8.58641 0.743556 8.62326 0.718415 8.66011 0.692298 8.69696 0.665242 8.73381 0.637282 8.77066 0.608457 8.80751 0.578805 8.84437 0.548368 8.88122 0.517186 8.91807 0.485302 8.95492 0.452759 8.99177 0.419601 9.02862 0.385873 9.06548 0.351621 9.10233 0.316892 9.13918 0.281733 9.17603 0.24619 9.21288 0.210314 9.24973 0.174152 9.28658 0.137754 9.32344 0.101168 9.36029 0.0644455 9.39714 0.0276351 9.43399 -0.00921275 9.47084 -0.0460481 9.50769 -0.082821 9.54455 -0.119481 9.5814 -0.155979 9.61825 -0.192266 9.6551 -0.228291 9.69195 -0.264006 9.7288 -0.299363 9.76565 -0.334313 9.80251 -0.36881 9.83936 -0.402805 9.87621 -0.436254 9.91306 -0.46911 9.94991 -0.501329 9.98676 -0.532868 10.0236 -0.563682 10.0605 -0.593732 10.0973 -0.622975 10.1342 -0.651372 10.171 -0.678885 10.2079 -0.705476 10.2447 -0.731109 10.2816 -0.75575 10.3184 -0.779364 10.3553 -0.801919 10.3921 -0.823386 10.429 -0.843735 10.4658 -0.862938 10.5027 -0.880969 10.5395 -0.897805 10.5764 -0.913421 10.6132 -0.927796 10.6501 -0.940912 10.6869 -0.95275 10.7238 -0.963295 10.7606 -0.972531 10.7975 -0.980447 10.8343 -0.987031 10.8712 -0.992276 10.9081 -0.996172 10.9449 -0.998717 10.9818 -0.999905 11.0186 -0.999735 11.0555 -0.998208 11.0923 -0.995325 11.1292 -0.991091 11.166 -0.985511 11.2029 -0.978592 11.2397 -0.970345 11.2766 -0.960781 11.3134 -0.949911 11.3503 -0.937752 11.3871 -0.92432 11.424 -0.909632 11.4608 -0.893709 11.4977 -0.876573 11.5345 -0.858246 11.5714 -0.838754 11.6082 -0.818123 11.6451 -0.796381 11.6819 -0.773558 11.7188 -0.749684 11.7556 -0.724793 11.7925 -0.698917 11.8293 -0.672092 11.8662 -0.644355 11.903 -0.615742 11.9399 -0.586294 11.9767 -0.556049 12.0136 -0.525049 12.0504 -0.493337 12.0873 -0.460954 12.1242 -0.427945 12.161 -0.394356 12.1979 -0.360231 12.2347 -0.325617 12.2716 -0.29056 12.3084 -0.255109 12.3453 -0.219312 12.3821 -0.183217 12.419 -0.146873 12.4558 -0.11033 12.4927 -0.0736363 12.5295 -0.0368432 12.5664 -4.89843e-16 12.6032 0.0368432 12.6401 0.0736363 12.6769 0.11033 12.7138 0.146873 12.7506 0.183217 12.7875 0.219312 12.8243 0.255109 12.8612 0.29056 12.898 0.325617 12.9349 0.360231 12.9717 0.394356 13.0086 0.427945 13.0454 0.460954 13.0823 0.493337 13.1191 0.525049 13.156 0.556049 13.1928 0.586294 13.2297 0.615742 13.2665 0.644355 13.3034 0.672092 13.3403 0.698917 13.3771 0.724793 13.414 0.749684 13.4508 0.773558 13.4877 0.796381 13.5245 0.818123 13.5614 0.838754 13.5982 0.858246 13.6351 0.876573 13.6719 0.893709 13.7088 0.909632 13.7456 0.92432 13.7825 0.937752 13.8193 0.949911 13.8562 0.960781 13.893 0.970345 13.9299 0.978592 13.9667 0.985511 14.0036 0.991091 14.0404 0.995325 14.0773 0.998208 14.1141 0.999735 14.151 0.999905 14.1878 0.998717 14.2247 0.996172 14.2615 0.992276 14.2984 0.987031 14.3352 0.980447 14.3721 0.972531 14.4089 0.963295 14.4458 0.95275 14.4827 0.940912 14.5195 0.927796 14.5564 0.913421 14.5932 0.897805 14.6301 0.880969 14.6669 0.862938 14.7038 0.843735 14.7406 0.823386 14.7775 0.801919 14.8143 0.779364 14.8512 0.75575 14.888 0.731109 14.9249 0.705476 14.9617 0.678885 14.9986 0.651372 15.0354 0.622975 15.0723 0.593732 15.1091 0.563682 15.146 0.532868 15.1828 0.501329 15.2197 0.46911 15.2565 0.436254 15.2934 0.402805 15.3302 0.36881 15.3671 0.334313 15.4039 0.299363 15.4408 0.264006 15.4776 0.228291 15.5145 0.192266 15.5513 0.155979 15.5882 0.119481 15.625 0.082821 15.6619 0.0460481 15.6988 0.00921275 15.7356 -0.0276351 15.7725 -0.0644455 15.8093 -0.101168 15.8462 -0.137754 15.883 -0.174152 15.9199 -0.210314 15.9567 -0.24619 15.9936 -0.281733 16.0304 -0.316892 16.0673 -0.351621 16.1041 -0.385873 16.141 -0.419601 16.1778 -0.452759 16.2147 -0.485302 16.2515 -0.517186 16.2884 -0.548368 16.3252 -0.578805 16.3621 -0.608457 16.3989 -0.637282 16.4358 -0.665242 16.4726 -0.692298 16.5095 -0.718415 16.5463 -0.743556 16.5832 -0.767687 16.62 -0.790776 16.6569 -0.812791 16.6937 -0.833702 16.7306 -0.853481 16.7674 -0.872102 16.8043 -0.889538 16.8411 -0.905766 16.878 -0.920765 16.9149 -0.934513 16.9517 -0.946992 16.9886 -0.958185 17.0254 -0.968077 17.0623 -0.976655 17.0991 -0.983906 17.136 -0.989821 17.1728 -0.994393 17.2097 -0.997614 17.2465 -0.99948 17.2834 -0.999989 17.3202 -0.999141 17.3571 -0.996935 17.3939 -0.993376 17.4308 -0.988468 17.4676 -0.982218 17.5045 -0.974634 17.5413 -0.965727 17.5782 -0.955508 17.615 -0.943992 17.6519 -0.931194 17.6887 -0.917131 17.7256 -0.901824 17.7624 -0.885291 17.7993 -0.867557 17.8361 -0.848644 17.873 -0.828579 17.9098 -0.807389 17.9467 -0.785103 17.9835 -0.761751 18.0204 -0.737364 18.0572 -0.711976 18.0941 -0.685621 18.131 -0.658335 18.1678 -0.630155 18.2047 -0.60112 18.2415 -0.571268 18.2784 -0.540641 18.3152 -0.509279 18.3521 -0.477226 18.3889 -0.444525 18.4258 -0.41122 18.4626 -0.377357 18.4995 -0.342982 18.5363 -0.308141 18.5732 -0.272881 18.61 -0.237251 18.6469 -0.201299 18.6837 -0.165073 18.7206 -0.128623 18.7574 -0.0919985 18.7943 -0.0552491 18.8311 -0.0184247 18.868 0.0184247 18.9048 0.0552491 18.9417 0.0919985 18.9785 0.128623 19.0154 0.165073 19.0522 0.201299 19.0891 0.237251 19.1259 0.272881 19.1628 0.308141 19.1996 0.342982 19.2365 0.377357 19.2733 0.41122 19.3102 0.444525 19.3471 0.477226 19.3839 0.509279 19.4208 0.540641 19.4576 0.571268 19.4945 0.60112 19.5313 0.630155 19.5682 0.658335 19.605 0.685621 19.6419 0.711976 19.6787 0.737364 19.7156 0.761751 19.7524 0.785103 19.7893 0.807389 19.8261 0.828579 19.863 0.848644 19.8998 0.867557 19.9367 0.885291 19.9735 0.901824 20.0104 0.917131 20.0472 0.931194 20.0841 0.943992 20.1209 0.955508 20.1578 0.965727 20.1946 0.974634 20.2315 0.982218 20.2683 0.988468 20.3052 0.993376 20.342 0.996935 20.3789 0.999141 20.4157 0.999989 20.4526 0.99948 20.4894 0.997614 20.5263 0.994393 20.5632 0.989821 20.6 0.983906 20.6369 0.976655 20.6737 0.968077 20.7106 0.958185 20.7474 0.946992 20.7843 0.934513 20.8211 0.920765 20.858 0.905766 20.8948 0.889538 20.9317 0.872102 20.9685 0.853481 21.0054 0.833702 21.0422 0.812791 21.0791 0.790776 21.1159 0.767687 21.1528 0.743556 21.1896 0.718415 21.2265 0.692298 21.2633 0.665242 21.3002 0.637282 21.337 0.608457 21.3739 0.578805 21.4107 0.548368 21.4476 0.517186 21.4844 0.485302 21.5213 0.452759 21.5581 0.419601 21.595 0.385873 21.6318 0.351621 21.6687 0.316892 21.7055 0.281733 21.7424 0.24619 21.7793 0.210314 21.8161 0.174152 21.853 0.137754 21.8898 0.101168 21.9267 0.0644455 21.9635 0.0276351 22.0004 -0.00921275 22.0372 -0.0460481 22.0741 -0.082821 22.1109 -0.119481 22.1478 -0.155979 22.1846 -0.192266 22.2215 -0.228291 22.2583 -0.264006 22.2952 -0.299363 22.332 -0.334313 22.3689 -0.36881 22.4057 -0.402805 22.4426 -0.436254 22.4794 -0.46911 22.5163 -0.501329 22.5531 -0.532868 22.59 -0.563682 22.6268 -0.593732 22.6637 -0.622975 22.7005 -0.651372 22.7374 -0.678885 22.7742 -0.705476 22.8111 -0.731109 22.8479 -0.75575 22.8848 -0.779364 22.9216 -0.801919 22.9585 -0.823386 22.9954 -0.843735 23.0322 -0.862938 23.0691 -0.880969 23.1059 -0.897805 23.1428 -0.913421 23.1796 -0.927796 23.2165 -0.940912 23.2533 -0.95275 23.2902 -0.963295 23.327 -0.972531 23.3639 -0.980447 23.4007 -0.987031 23.4376 -0.992276 23.4744 -0.996172 23.5113 -0.998717 23.5481 -0.999905 23.585 -0.999735 23.6218 -0.998208 23.6587 -0.995325 23.6955 -0.991091 23.7324 -0.985511 23.7692 -0.978592 23.8061 -0.970345 23.8429 -0.960781 23.8798 -0.949911 23.9166 -0.937752 23.9535 -0.92432 23.9903 -0.909632 24.0272 -0.893709 24.064 -0.876573 24.1009 -0.858246 24.1378 -0.838754 24.1746 -0.818123 24.2115 -0.796381 24.2483 -0.773558 24.2852 -0.749684 24.322 -0.724793 24.3589 -0.698917 24.3957 -0.672092 24.4326 -0.644355 24.4694 -0.615742 24.5063 -0.586294 24.5431 -0.556049 24.58 -0.525049 24.6168 -0.493337 24.6537 -0.460954 24.6905 -0.427945 24.7274 -0.394356 24.7642 -0.360231 24.8011 -0.325617 24.8379 -0.29056 24.8748 -0.255109 24.9116 -0.219312 24.9485 -0.183217 24.9853 -0.146873 25.0222 -0.11033 25.059 -0.0736363 25.0959 -0.0368432 25.1327 -9.79685e-16 25.1696 0.0368432 25.2064 0.0736363 25.2433 0.11033 25.2801 0.146873 25.317 0.183217 25.3539 0.219312 25.3907 0.255109 25.4276 0.29056 25.4644 0.325617 25.5013 0.360231 25.5381 0.394356 25.575 0.427945 25.6118 0.460954 25.6487 0.493337 25.6855 0.525049 25.7224 0.556049 25.7592 0.586294 25.7961 0.615742 25.8329 0.644355 25.8698 0.672092 25.9066 0.698917 25.9435 0.724793 25.9803 0.749684 26.0172 0.773558 26.054 0.796381 26.0909 0.818123 26.1277 0.838754 26.1646 0.858246 26.2014 0.876573 26.2383 0.893709 26.2751 0.909632 26.312 0.92432 26.3488 0.937752 26.3857 0.949911 26.4225 0.960781 26.4594 0.970345 26.4962 0.978592 26.5331 0.985511 26.57 0.991091 26.6068 0.995325 26.6437 0.998208 26.6805 0.999735 26.7174 0.999905 26.7542 0.998717 26.7911 0.996172 26.8279 0.992276 26.8648 0.987031 26.9016 0.980447 26.9385 0.972531 26.9753 0.963295 27.0122 0.95275 27.049 0.940912 27.0859 0.927796 27.1227 0.913421 27.1596 0.897805 27.1964 0.880969 27.2333 0.862938 27.2701 0.843735 27.307 0.823386 27.3438 0.801919 27.3807 0.779364 27.4175 0.75575 27.4544 0.731109 27.4912 0.705476 27.5281 0.678885 27.5649 0.651372 27.6018 0.622975 27.6386 0.593732 27.6755 0.563682 27.7123 0.532868 27.7492 0.501329 27.7861 0.46911 27.8229 0.436254 27.8598 0.402805 27.8966 0.36881 27.9335 0.334313 27.9703 0.299363 28.0072 0.264006 28.044 0.228291 28.0809 0.192266 28.1177 0.155979 28.1546 0.119481 28.1914 0.082821 28.2283 0.0460481 28.2651 0.00921275 28.302 -0.0276351 28.3388 -0.0644455 28.3757 -0.101168 28.4125 -0.137754 28.4494 -0.174152 28.4862 -0.210314 28.5231 -0.24619 28.5599 -0.281733 28.5968 -0.316892 28.6336 -0.351621 28.6705 -0.385873 28.7073 -0.419601 28.7442 -0.452759 28.781 -0.485302 28.8179 -0.517186 28.8547 -0.548368 28.8916 -0.578805 28.9284 -0.608457 28.9653 -0.637282 29.0022 -0.665242 29.039 -0.692298 29.0759 -0.718415 29.1127 -0.743556 29.1496 -0.767687 29.1864 -0.790776 29.2233 -0.812791 29.2601 -0.833702 29.297 -0.853481 29.3338 -0.872102 29.3707 -0.889538 29.4075 -0.905766 29.4444 -0.920765 29.4812 -0.934513 29.5181 -0.946992 29.5549 -0.958185 29.5918 -0.968077 29.6286 -0.976655 29.6655 -0.983906 29.7023 -0.989821 29.7392 -0.994393 29.776 -0.997614 29.8129 -0.99948 29.8497 -0.999989 29.8866 -0.999141 29.9234 -0.996935 29.9603 -0.993376 29.9971 -0.988468 30.034 -0.982218 30.0708 -0.974634 30.1077 -0.965727 30.1445 -0.955508 30.1814 -0.943992 30.2183 -0.931194 30.2551 -0.917131 30.292 -0.901824 30.3288 -0.885291 30.3657 -0.867557 30.4025 -0.848644 30.4394 -0.828579 30.4762 -0.807389 30.5131 -0.785103 30.5499 -0.761751 30.5868 -0.737364 30.6236 -0.711976 30.6605 -0.685621 30.6973 -0.658335 30.7342 -0.630155 30.771 -0.60112 30.8079 -0.571268 30.8447 -0.540641 30.8816 -0.509279 30.9184 -0.477226 30.9553 -0.444525 30.9921 -0.41122 31.029 -0.377357 31.0658 -0.342982 31.1027 -0.308141 31.1395 -0.272881 31.1764 -0.237251 31.2132 -0.201299 31.2501 -0.165073 31.2869 -0.128623 31.3238 -0.0919985 31.3606 -0.0552491 31.3975 -0.0184247 31.4344 0.0184247 31.4712 0.0552491 31.5081 0.0919985 31.5449 0.128623 31.5818 0.165073 31.6186 0.201299 31.6555 0.237251 31.6923 0.272881 31.7292 0.308141 31.766 0.342982 31.8029 0.377357 31.8397 0.41122 31.8766 0.444525 31.9134 0.477226 31.9503 0.509279 31.9871 0.540641 32.024 0.571268 32.0608 0.60112 32.0977 0.630155 32.1345 0.658335 32.1714 0.685621 32.2082 0.711976 32.2451 0.737364 32.2819 0.761751 32.3188 0.785103 32.3556 0.807389 32.3925 0.828579 32.4293 0.848644 32.4662 0.867557 32.503 0.885291 32.5399 0.901824 32.5767 0.917131 32.6136 0.931194 32.6505 0.943992 32.6873 0.955508 32.7242 0.965727 32.761 0.974634 32.7979 0.982218 32.8347 0.988468 32.8716 0.993376 32.9084 0.996935 32.9453 0.999141 32.9821 0.999989 33.019 0.99948 33.0558 0.997614 33.0927 0.994393 33.1295 0.989821 33.1664 0.983906 33.2032 0.976655 33.2401 0.968077 33.2769 0.958185 33.3138 0.946992 33.3506 0.934513 33.3875 0.920765 33.4243 0.905766 33.4612 0.889538 33.498 0.872102 33.5349 0.853481 33.5717 0.833702 33.6086 0.812791 33.6454 0.790776 33.6823 0.767687 33.7191 0.743556 33.756 0.718415 33.7929 0.692298 33.8297 0.665242 33.8666 0.637282 33.9034 0.608457 33.9403 0.578805 33.9771 0.548368 34.014 0.517186 34.0508 0.485302 34.0877 0.452759 34.1245 0.419601 34.1614 0.385873 34.1982 0.351621 34.2351 0.316892 34.2719 0.281733 34.3088 0.24619 34.3456 0.210314 34.3825 0.174152 34.4193 0.137754 34.4562 0.101168 34.493 0.0644455 34.5299 0.0276351 34.5667 -0.00921275 34.6036 -0.0460481 34.6404 -0.082821 34.6773 -0.119481 34.7141 -0.155979 34.751 -0.192266 34.7878 -0.228291 34.8247 -0.264006 34.8615 -0.299363 34.8984 -0.334313 34.9352 -0.36881 34.9721 -0.402805 35.009 -0.436254 35.0458 -0.46911 35.0827 -0.501329 35.1195 -0.532868 35.1564 -0.563682 35.1932 -0.593732 35.2301 -0.622975 35.2669 -0.651372 35.3038 -0.678885 35.3406 -0.705476 35.3775 -0.731109 35.4143 -0.75575 35.4512 -0.779364 35.488 -0.801919 35.5249 -0.823386 35.5617 -0.843735 35.5986 -0.862938 35.6354 -0.880969 35.6723 -0.897805 35.7091 -0.913421 35.746 -0.927796 35.7828 -0.940912 35.8197 -0.95275 35.8565 -0.963295 35.8934 -0.972531 35.9302 -0.980447 35.9671 -0.987031 36.0039 -0.992276 36.0408 -0.996172 36.0776 -0.998717 36.1145 -0.999905 36.1513 -0.999735 36.1882 -0.998208 36.2251 -0.995325 36.2619 -0.991091 36.2988 -0.985511 36.3356 -0.978592 36.3725 -0.970345 36.4093 -0.960781 36.4462 -0.949911 36.483 -0.937752 36.5199 -0.92432 36.5567 -0.909632 36.5936 -0.893709 36.6304 -0.876573 36.6673 -0.858246 36.7041 -0.838754 36.741 -0.818123 36.7778 -0.796381 36.8147 -0.773558 36.8515 -0.749684 36.8884 -0.724793 36.9252 -0.698917 36.9621 -0.672092 36.9989 -0.644355 37.0358 -0.615742 37.0726 -0.586294 37.1095 -0.556049 37.1463 -0.525049 37.1832 -0.493337 37.22 -0.460954 37.2569 -0.427945 37.2937 -0.394356 37.3306 -0.360231 37.3674 -0.325617 37.4043 -0.29056 37.4412 -0.255109 37.478 -0.219312 37.5149 -0.183217 37.5517 -0.146873 37.5886 -0.11033 37.6254 -0.0736363 37.6623 -0.0368432 37.6991 -1.46953e-15 & @target G0.S1 @type xy 0 0 0.0368515 0.147273 0.0737031 0.293746 0.110555 0.438624 0.147406 0.58112 0.184258 0.720462 0.221109 0.855891 0.257961 0.986673 0.294812 1.1121 0.331664 1.23148 0.368515 1.34418 0.405367 1.44959 0.442218 1.54712 0.47907 1.63625 0.515921 1.71649 0.552773 1.78742 0.589624 1.84864 0.626476 1.89982 0.663327 1.94069 0.700179 1.97102 0.737031 1.99065 0.773882 1.99947 0.810734 1.99743 0.847585 1.98455 0.884437 1.96089 0.921288 1.92659 0.95814 1.88182 0.994991 1.82684 1.03184 1.76194 1.06869 1.68747 1.10555 1.60384 1.1424 1.5115 1.17925 1.41095 1.2161 1.30274 1.25295 1.18746 1.2898 1.06574 1.32665 0.93822 1.36351 0.80561 1.40036 0.668627 1.43721 0.528013 1.47406 0.384532 1.51091 0.238963 1.54776 0.0920962 1.58462 -0.0552703 1.62147 -0.202337 1.65832 -0.348304 1.69517 -0.492381 1.73202 -0.633784 1.76887 -0.771746 1.80572 -0.905518 1.84258 -1.03437 1.87943 -1.15761 1.91628 -1.27456 1.95313 -1.3846 1.98998 -1.48711 2.02683 -1.58155 2.06369 -1.6674 2.10054 -1.7442 2.13739 -1.81153 2.17424 -1.86903 2.21109 -1.91637 2.24794 -1.95331 2.28479 -1.97964 2.32165 -1.99523 2.3585 -1.99998 2.39535 -1.99387 2.4322 -1.97694 2.46905 -1.94927 2.5059 -1.91102 2.54276 -1.86239 2.57961 -1.80365 2.61646 -1.73511 2.65331 -1.65716 2.69016 -1.57021 2.72701 -1.47473 2.76386 -1.37124 2.80072 -1.26031 2.83757 -1.14254 2.87442 -1.01856 2.91127 -0.88905 2.94812 -0.754715 2.98497 -0.616281 3.02183 -0.474502 3.05868 -0.330146 3.09553 -0.183997 3.13238 -0.0368494 3.16923 0.110498 3.20608 0.257246 3.24293 0.402597 3.27979 0.545762 3.31664 0.685964 3.35349 0.822441 3.39034 0.954452 3.42719 1.08128 3.46404 1.20224 3.5009 1.31667 3.53775 1.42395 3.5746 1.5235 3.61145 1.61478 3.6483 1.69729 3.68515 1.77058 3.722 1.83426 3.75886 1.88798 3.79571 1.93145 3.83256 1.96444 3.86941 1.98675 3.90626 1.99828 3.94311 1.99896 3.97996 1.98879 4.01682 1.96781 4.05367 1.93615 4.09052 1.89398 4.12737 1.84153 4.16422 1.77908 4.20107 1.70696 4.23793 1.62558 4.27478 1.53537 4.31163 1.43683 4.34848 1.33048 4.38533 1.21691 4.42218 1.09674 4.45903 0.970604 4.49589 0.839202 4.53274 0.703243 4.56959 0.563465 4.60644 0.420628 4.64329 0.275508 4.68014 0.128891 4.717 -0.0184255 4.75385 -0.165642 4.7907 -0.311959 4.82755 -0.456582 4.8644 -0.598726 4.90125 -0.737619 4.9381 -0.872508 4.97496 -1.00266 5.01181 -1.12736 5.04866 -1.24595 5.08551 -1.35777 5.12236 -1.46222 5.15921 -1.55873 5.19607 -1.64677 5.23292 -1.72588 5.26977 -1.79561 5.30662 -1.85559 5.34347 -1.9055 5.38032 -1.94506 5.41717 -1.97406 5.45403 -1.99234 5.49088 -1.99981 5.52773 -1.99642 5.56458 -1.98218 5.60143 -1.95718 5.63828 -1.92156 5.67514 -1.8755 5.71199 -1.81926 5.74884 -1.75315 5.78569 -1.67751 5.82254 -1.59276 5.85939 -1.49937 5.89624 -1.39783 5.9331 -1.28871 5.96995 -1.17259 6.0068 -1.0501 6.04365 -0.921908 6.0805 -0.788712 6.11735 -0.651233 6.1542 -0.510218 6.19106 -0.366434 6.22791 -0.220659 6.26476 -0.0736864 6.30161 0.0736864 6.33846 0.220659 6.37531 0.366434 6.41217 0.510218 6.44902 0.651233 6.48587 0.788712 6.52272 0.921908 6.55957 1.0501 6.59642 1.17259 6.63327 1.28871 6.67013 1.39783 6.70698 1.49937 6.74383 1.59276 6.78068 1.67751 6.81753 1.75315 6.85438 1.81926 6.89124 1.8755 6.92809 1.92156 6.96494 1.95718 7.00179 1.98218 7.03864 1.99642 7.07549 1.99981 7.11234 1.99234 7.1492 1.97406 7.18605 1.94506 7.2229 1.9055 7.25975 1.85559 7.2966 1.79561 7.33345 1.72588 7.37031 1.64677 7.40716 1.55873 7.44401 1.46222 7.48086 1.35777 7.51771 1.24595 7.55456 1.12736 7.59141 1.00266 7.62827 0.872508 7.66512 0.737619 7.70197 0.598726 7.73882 0.456582 7.77567 0.311959 7.81252 0.165642 7.84938 0.0184255 7.88623 -0.128891 7.92308 -0.275508 7.95993 -0.420628 7.99678 -0.563465 8.03363 -0.703243 8.07048 -0.839202 8.10734 -0.970604 8.14419 -1.09674 8.18104 -1.21691 8.21789 -1.33048 8.25474 -1.43683 8.29159 -1.53537 8.32845 -1.62558 8.3653 -1.70696 8.40215 -1.77908 8.439 -1.84153 8.47585 -1.89398 8.5127 -1.93615 8.54955 -1.96781 8.58641 -1.98879 8.62326 -1.99896 8.66011 -1.99828 8.69696 -1.98675 8.73381 -1.96444 8.77066 -1.93145 8.80751 -1.88798 8.84437 -1.83426 8.88122 -1.77058 8.91807 -1.69729 8.95492 -1.61478 8.99177 -1.5235 9.02862 -1.42395 9.06548 -1.31667 9.10233 -1.20224 9.13918 -1.08128 9.17603 -0.954452 9.21288 -0.822441 9.24973 -0.685964 9.28658 -0.545762 9.32344 -0.402597 9.36029 -0.257246 9.39714 -0.110498 9.43399 0.0368494 9.47084 0.183997 9.50769 0.330146 9.54455 0.474502 9.5814 0.616281 9.61825 0.754715 9.6551 0.88905 9.69195 1.01856 9.7288 1.14254 9.76565 1.26031 9.80251 1.37124 9.83936 1.47473 9.87621 1.57021 9.91306 1.65716 9.94991 1.73511 9.98676 1.80365 10.0236 1.86239 10.0605 1.91102 10.0973 1.94927 10.1342 1.97694 10.171 1.99387 10.2079 1.99998 10.2447 1.99523 10.2816 1.97964 10.3184 1.95331 10.3553 1.91637 10.3921 1.86903 10.429 1.81153 10.4658 1.7442 10.5027 1.6674 10.5395 1.58155 10.5764 1.48711 10.6132 1.3846 10.6501 1.27456 10.6869 1.15761 10.7238 1.03437 10.7606 0.905518 10.7975 0.771746 10.8343 0.633784 10.8712 0.492381 10.9081 0.348304 10.9449 0.202337 10.9818 0.0552703 11.0186 -0.0920962 11.0555 -0.238963 11.0923 -0.384532 11.1292 -0.528013 11.166 -0.668627 11.2029 -0.80561 11.2397 -0.93822 11.2766 -1.06574 11.3134 -1.18746 11.3503 -1.30274 11.3871 -1.41095 11.424 -1.5115 11.4608 -1.60384 11.4977 -1.68747 11.5345 -1.76194 11.5714 -1.82684 11.6082 -1.88182 11.6451 -1.92659 11.6819 -1.96089 11.7188 -1.98455 11.7556 -1.99743 11.7925 -1.99947 11.8293 -1.99065 11.8662 -1.97102 11.903 -1.94069 11.9399 -1.89982 11.9767 -1.84864 12.0136 -1.78742 12.0504 -1.71649 12.0873 -1.63625 12.1242 -1.54712 12.161 -1.44959 12.1979 -1.34418 12.2347 -1.23148 12.2716 -1.1121 12.3084 -0.986673 12.3453 -0.855891 12.3821 -0.720462 12.419 -0.58112 12.4558 -0.438624 12.4927 -0.293746 12.5295 -0.147273 12.5664 -1.95937e-15 12.6032 0.147273 12.6401 0.293746 12.6769 0.438624 12.7138 0.58112 12.7506 0.720462 12.7875 0.855891 12.8243 0.986673 12.8612 1.1121 12.898 1.23148 12.9349 1.34418 12.9717 1.44959 13.0086 1.54712 13.0454 1.63625 13.0823 1.71649 13.1191 1.78742 13.156 1.84864 13.1928 1.89982 13.2297 1.94069 13.2665 1.97102 13.3034 1.99065 13.3403 1.99947 13.3771 1.99743 13.414 1.98455 13.4508 1.96089 13.4877 1.92659 13.5245 1.88182 13.5614 1.82684 13.5982 1.76194 13.6351 1.68747 13.6719 1.60384 13.7088 1.5115 13.7456 1.41095 13.7825 1.30274 13.8193 1.18746 13.8562 1.06574 13.893 0.93822 13.9299 0.80561 13.9667 0.668627 14.0036 0.528013 14.0404 0.384532 14.0773 0.238963 14.1141 0.0920962 14.151 -0.0552703 14.1878 -0.202337 14.2247 -0.348304 14.2615 -0.492381 14.2984 -0.633784 14.3352 -0.771746 14.3721 -0.905518 14.4089 -1.03437 14.4458 -1.15761 14.4827 -1.27456 14.5195 -1.3846 14.5564 -1.48711 14.5932 -1.58155 14.6301 -1.6674 14.6669 -1.7442 14.7038 -1.81153 14.7406 -1.86903 14.7775 -1.91637 14.8143 -1.95331 14.8512 -1.97964 14.888 -1.99523 14.9249 -1.99998 14.9617 -1.99387 14.9986 -1.97694 15.0354 -1.94927 15.0723 -1.91102 15.1091 -1.86239 15.146 -1.80365 15.1828 -1.73511 15.2197 -1.65716 15.2565 -1.57021 15.2934 -1.47473 15.3302 -1.37124 15.3671 -1.26031 15.4039 -1.14254 15.4408 -1.01856 15.4776 -0.88905 15.5145 -0.754715 15.5513 -0.616281 15.5882 -0.474502 15.625 -0.330146 15.6619 -0.183997 15.6988 -0.0368494 15.7356 0.110498 15.7725 0.257246 15.8093 0.402597 15.8462 0.545762 15.883 0.685964 15.9199 0.822441 15.9567 0.954452 15.9936 1.08128 16.0304 1.20224 16.0673 1.31667 16.1041 1.42395 16.141 1.5235 16.1778 1.61478 16.2147 1.69729 16.2515 1.77058 16.2884 1.83426 16.3252 1.88798 16.3621 1.93145 16.3989 1.96444 16.4358 1.98675 16.4726 1.99828 16.5095 1.99896 16.5463 1.98879 16.5832 1.96781 16.62 1.93615 16.6569 1.89398 16.6937 1.84153 16.7306 1.77908 16.7674 1.70696 16.8043 1.62558 16.8411 1.53537 16.878 1.43683 16.9149 1.33048 16.9517 1.21691 16.9886 1.09674 17.0254 0.970604 17.0623 0.839202 17.0991 0.703243 17.136 0.563465 17.1728 0.420628 17.2097 0.275508 17.2465 0.128891 17.2834 -0.0184255 17.3202 -0.165642 17.3571 -0.311959 17.3939 -0.456582 17.4308 -0.598726 17.4676 -0.737619 17.5045 -0.872508 17.5413 -1.00266 17.5782 -1.12736 17.615 -1.24595 17.6519 -1.35777 17.6887 -1.46222 17.7256 -1.55873 17.7624 -1.64677 17.7993 -1.72588 17.8361 -1.79561 17.873 -1.85559 17.9098 -1.9055 17.9467 -1.94506 17.9835 -1.97406 18.0204 -1.99234 18.0572 -1.99981 18.0941 -1.99642 18.131 -1.98218 18.1678 -1.95718 18.2047 -1.92156 18.2415 -1.8755 18.2784 -1.81926 18.3152 -1.75315 18.3521 -1.67751 18.3889 -1.59276 18.4258 -1.49937 18.4626 -1.39783 18.4995 -1.28871 18.5363 -1.17259 18.5732 -1.0501 18.61 -0.921908 18.6469 -0.788712 18.6837 -0.651233 18.7206 -0.510218 18.7574 -0.366434 18.7943 -0.220659 18.8311 -0.0736864 18.868 0.0736864 18.9048 0.220659 18.9417 0.366434 18.9785 0.510218 19.0154 0.651233 19.0522 0.788712 19.0891 0.921908 19.1259 1.0501 19.1628 1.17259 19.1996 1.28871 19.2365 1.39783 19.2733 1.49937 19.3102 1.59276 19.3471 1.67751 19.3839 1.75315 19.4208 1.81926 19.4576 1.8755 19.4945 1.92156 19.5313 1.95718 19.5682 1.98218 19.605 1.99642 19.6419 1.99981 19.6787 1.99234 19.7156 1.97406 19.7524 1.94506 19.7893 1.9055 19.8261 1.85559 19.863 1.79561 19.8998 1.72588 19.9367 1.64677 19.9735 1.55873 20.0104 1.46222 20.0472 1.35777 20.0841 1.24595 20.1209 1.12736 20.1578 1.00266 20.1946 0.872508 20.2315 0.737619 20.2683 0.598726 20.3052 0.456582 20.342 0.311959 20.3789 0.165642 20.4157 0.0184255 20.4526 -0.128891 20.4894 -0.275508 20.5263 -0.420628 20.5632 -0.563465 20.6 -0.703243 20.6369 -0.839202 20.6737 -0.970604 20.7106 -1.09674 20.7474 -1.21691 20.7843 -1.33048 20.8211 -1.43683 20.858 -1.53537 20.8948 -1.62558 20.9317 -1.70696 20.9685 -1.77908 21.0054 -1.84153 21.0422 -1.89398 21.0791 -1.93615 21.1159 -1.96781 21.1528 -1.98879 21.1896 -1.99896 21.2265 -1.99828 21.2633 -1.98675 21.3002 -1.96444 21.337 -1.93145 21.3739 -1.88798 21.4107 -1.83426 21.4476 -1.77058 21.4844 -1.69729 21.5213 -1.61478 21.5581 -1.5235 21.595 -1.42395 21.6318 -1.31667 21.6687 -1.20224 21.7055 -1.08128 21.7424 -0.954452 21.7793 -0.822441 21.8161 -0.685964 21.853 -0.545762 21.8898 -0.402597 21.9267 -0.257246 21.9635 -0.110498 22.0004 0.0368494 22.0372 0.183997 22.0741 0.330146 22.1109 0.474502 22.1478 0.616281 22.1846 0.754715 22.2215 0.88905 22.2583 1.01856 22.2952 1.14254 22.332 1.26031 22.3689 1.37124 22.4057 1.47473 22.4426 1.57021 22.4794 1.65716 22.5163 1.73511 22.5531 1.80365 22.59 1.86239 22.6268 1.91102 22.6637 1.94927 22.7005 1.97694 22.7374 1.99387 22.7742 1.99998 22.8111 1.99523 22.8479 1.97964 22.8848 1.95331 22.9216 1.91637 22.9585 1.86903 22.9954 1.81153 23.0322 1.7442 23.0691 1.6674 23.1059 1.58155 23.1428 1.48711 23.1796 1.3846 23.2165 1.27456 23.2533 1.15761 23.2902 1.03437 23.327 0.905518 23.3639 0.771746 23.4007 0.633784 23.4376 0.492381 23.4744 0.348304 23.5113 0.202337 23.5481 0.0552703 23.585 -0.0920962 23.6218 -0.238963 23.6587 -0.384532 23.6955 -0.528013 23.7324 -0.668627 23.7692 -0.80561 23.8061 -0.93822 23.8429 -1.06574 23.8798 -1.18746 23.9166 -1.30274 23.9535 -1.41095 23.9903 -1.5115 24.0272 -1.60384 24.064 -1.68747 24.1009 -1.76194 24.1378 -1.82684 24.1746 -1.88182 24.2115 -1.92659 24.2483 -1.96089 24.2852 -1.98455 24.322 -1.99743 24.3589 -1.99947 24.3957 -1.99065 24.4326 -1.97102 24.4694 -1.94069 24.5063 -1.89982 24.5431 -1.84864 24.58 -1.78742 24.6168 -1.71649 24.6537 -1.63625 24.6905 -1.54712 24.7274 -1.44959 24.7642 -1.34418 24.8011 -1.23148 24.8379 -1.1121 24.8748 -0.986673 24.9116 -0.855891 24.9485 -0.720462 24.9853 -0.58112 25.0222 -0.438624 25.059 -0.293746 25.0959 -0.147273 25.1327 -3.91874e-15 25.1696 0.147273 25.2064 0.293746 25.2433 0.438624 25.2801 0.58112 25.317 0.720462 25.3539 0.855891 25.3907 0.986673 25.4276 1.1121 25.4644 1.23148 25.5013 1.34418 25.5381 1.44959 25.575 1.54712 25.6118 1.63625 25.6487 1.71649 25.6855 1.78742 25.7224 1.84864 25.7592 1.89982 25.7961 1.94069 25.8329 1.97102 25.8698 1.99065 25.9066 1.99947 25.9435 1.99743 25.9803 1.98455 26.0172 1.96089 26.054 1.92659 26.0909 1.88182 26.1277 1.82684 26.1646 1.76194 26.2014 1.68747 26.2383 1.60384 26.2751 1.5115 26.312 1.41095 26.3488 1.30274 26.3857 1.18746 26.4225 1.06574 26.4594 0.93822 26.4962 0.80561 26.5331 0.668627 26.57 0.528013 26.6068 0.384532 26.6437 0.238963 26.6805 0.0920962 26.7174 -0.0552703 26.7542 -0.202337 26.7911 -0.348304 26.8279 -0.492381 26.8648 -0.633784 26.9016 -0.771746 26.9385 -0.905518 26.9753 -1.03437 27.0122 -1.15761 27.049 -1.27456 27.0859 -1.3846 27.1227 -1.48711 27.1596 -1.58155 27.1964 -1.6674 27.2333 -1.7442 27.2701 -1.81153 27.307 -1.86903 27.3438 -1.91637 27.3807 -1.95331 27.4175 -1.97964 27.4544 -1.99523 27.4912 -1.99998 27.5281 -1.99387 27.5649 -1.97694 27.6018 -1.94927 27.6386 -1.91102 27.6755 -1.86239 27.7123 -1.80365 27.7492 -1.73511 27.7861 -1.65716 27.8229 -1.57021 27.8598 -1.47473 27.8966 -1.37124 27.9335 -1.26031 27.9703 -1.14254 28.0072 -1.01856 28.044 -0.88905 28.0809 -0.754715 28.1177 -0.616281 28.1546 -0.474502 28.1914 -0.330146 28.2283 -0.183997 28.2651 -0.0368494 28.302 0.110498 28.3388 0.257246 28.3757 0.402597 28.4125 0.545762 28.4494 0.685964 28.4862 0.822441 28.5231 0.954452 28.5599 1.08128 28.5968 1.20224 28.6336 1.31667 28.6705 1.42395 28.7073 1.5235 28.7442 1.61478 28.781 1.69729 28.8179 1.77058 28.8547 1.83426 28.8916 1.88798 28.9284 1.93145 28.9653 1.96444 29.0022 1.98675 29.039 1.99828 29.0759 1.99896 29.1127 1.98879 29.1496 1.96781 29.1864 1.93615 29.2233 1.89398 29.2601 1.84153 29.297 1.77908 29.3338 1.70696 29.3707 1.62558 29.4075 1.53537 29.4444 1.43683 29.4812 1.33048 29.5181 1.21691 29.5549 1.09674 29.5918 0.970604 29.6286 0.839202 29.6655 0.703243 29.7023 0.563465 29.7392 0.420628 29.776 0.275508 29.8129 0.128891 29.8497 -0.0184255 29.8866 -0.165642 29.9234 -0.311959 29.9603 -0.456582 29.9971 -0.598726 30.034 -0.737619 30.0708 -0.872508 30.1077 -1.00266 30.1445 -1.12736 30.1814 -1.24595 30.2183 -1.35777 30.2551 -1.46222 30.292 -1.55873 30.3288 -1.64677 30.3657 -1.72588 30.4025 -1.79561 30.4394 -1.85559 30.4762 -1.9055 30.5131 -1.94506 30.5499 -1.97406 30.5868 -1.99234 30.6236 -1.99981 30.6605 -1.99642 30.6973 -1.98218 30.7342 -1.95718 30.771 -1.92156 30.8079 -1.8755 30.8447 -1.81926 30.8816 -1.75315 30.9184 -1.67751 30.9553 -1.59276 30.9921 -1.49937 31.029 -1.39783 31.0658 -1.28871 31.1027 -1.17259 31.1395 -1.0501 31.1764 -0.921908 31.2132 -0.788712 31.2501 -0.651233 31.2869 -0.510218 31.3238 -0.366434 31.3606 -0.220659 31.3975 -0.0736864 31.4344 0.0736864 31.4712 0.220659 31.5081 0.366434 31.5449 0.510218 31.5818 0.651233 31.6186 0.788712 31.6555 0.921908 31.6923 1.0501 31.7292 1.17259 31.766 1.28871 31.8029 1.39783 31.8397 1.49937 31.8766 1.59276 31.9134 1.67751 31.9503 1.75315 31.9871 1.81926 32.024 1.8755 32.0608 1.92156 32.0977 1.95718 32.1345 1.98218 32.1714 1.99642 32.2082 1.99981 32.2451 1.99234 32.2819 1.97406 32.3188 1.94506 32.3556 1.9055 32.3925 1.85559 32.4293 1.79561 32.4662 1.72588 32.503 1.64677 32.5399 1.55873 32.5767 1.46222 32.6136 1.35777 32.6505 1.24595 32.6873 1.12736 32.7242 1.00266 32.761 0.872508 32.7979 0.737619 32.8347 0.598726 32.8716 0.456582 32.9084 0.311959 32.9453 0.165642 32.9821 0.0184255 33.019 -0.128891 33.0558 -0.275508 33.0927 -0.420628 33.1295 -0.563465 33.1664 -0.703243 33.2032 -0.839202 33.2401 -0.970604 33.2769 -1.09674 33.3138 -1.21691 33.3506 -1.33048 33.3875 -1.43683 33.4243 -1.53537 33.4612 -1.62558 33.498 -1.70696 33.5349 -1.77908 33.5717 -1.84153 33.6086 -1.89398 33.6454 -1.93615 33.6823 -1.96781 33.7191 -1.98879 33.756 -1.99896 33.7929 -1.99828 33.8297 -1.98675 33.8666 -1.96444 33.9034 -1.93145 33.9403 -1.88798 33.9771 -1.83426 34.014 -1.77058 34.0508 -1.69729 34.0877 -1.61478 34.1245 -1.5235 34.1614 -1.42395 34.1982 -1.31667 34.2351 -1.20224 34.2719 -1.08128 34.3088 -0.954452 34.3456 -0.822441 34.3825 -0.685964 34.4193 -0.545762 34.4562 -0.402597 34.493 -0.257246 34.5299 -0.110498 34.5667 0.0368494 34.6036 0.183997 34.6404 0.330146 34.6773 0.474502 34.7141 0.616281 34.751 0.754715 34.7878 0.88905 34.8247 1.01856 34.8615 1.14254 34.8984 1.26031 34.9352 1.37124 34.9721 1.47473 35.009 1.57021 35.0458 1.65716 35.0827 1.73511 35.1195 1.80365 35.1564 1.86239 35.1932 1.91102 35.2301 1.94927 35.2669 1.97694 35.3038 1.99387 35.3406 1.99998 35.3775 1.99523 35.4143 1.97964 35.4512 1.95331 35.488 1.91637 35.5249 1.86903 35.5617 1.81153 35.5986 1.7442 35.6354 1.6674 35.6723 1.58155 35.7091 1.48711 35.746 1.3846 35.7828 1.27456 35.8197 1.15761 35.8565 1.03437 35.8934 0.905518 35.9302 0.771746 35.9671 0.633784 36.0039 0.492381 36.0408 0.348304 36.0776 0.202337 36.1145 0.0552703 36.1513 -0.0920962 36.1882 -0.238963 36.2251 -0.384532 36.2619 -0.528013 36.2988 -0.668627 36.3356 -0.80561 36.3725 -0.93822 36.4093 -1.06574 36.4462 -1.18746 36.483 -1.30274 36.5199 -1.41095 36.5567 -1.5115 36.5936 -1.60384 36.6304 -1.68747 36.6673 -1.76194 36.7041 -1.82684 36.741 -1.88182 36.7778 -1.92659 36.8147 -1.96089 36.8515 -1.98455 36.8884 -1.99743 36.9252 -1.99947 36.9621 -1.99065 36.9989 -1.97102 37.0358 -1.94069 37.0726 -1.89982 37.1095 -1.84864 37.1463 -1.78742 37.1832 -1.71649 37.22 -1.63625 37.2569 -1.54712 37.2937 -1.44959 37.3306 -1.34418 37.3674 -1.23148 37.4043 -1.1121 37.4412 -0.986673 37.478 -0.855891 37.5149 -0.720462 37.5517 -0.58112 37.5886 -0.438624 37.6254 -0.293746 37.6623 -0.147273 37.6991 -5.87811e-15 & @target G0.S2 @type xy 0 0 0.0368515 0.0736989 0.0737031 0.147373 0.110555 0.220997 0.147406 0.294545 0.184258 0.367994 0.221109 0.441318 0.257961 0.514492 0.294812 0.587491 0.331664 0.660291 0.368515 0.732867 0.405367 0.805194 0.442218 0.877248 0.47907 0.949003 0.515921 1.02044 0.552773 1.09152 0.589624 1.16224 0.626476 1.23256 0.663327 1.30247 0.700179 1.37193 0.737031 1.44092 0.773882 1.50943 0.810734 1.57742 0.847585 1.64488 0.884437 1.71178 0.921288 1.7781 0.95814 1.84382 0.994991 1.9089 1.03184 1.97335 1.06869 2.03712 1.10555 2.1002 1.1424 2.16256 1.17925 2.2242 1.2161 2.28507 1.25295 2.34517 1.2898 2.40448 1.32665 2.46297 1.36351 2.52062 1.40036 2.57742 1.43721 2.63334 1.47406 2.68837 1.51091 2.74248 1.54776 2.79567 1.58462 2.8479 1.62147 2.89917 1.65832 2.94946 1.69517 2.99874 1.73202 3.047 1.76887 3.09423 1.80572 3.14041 1.84258 3.18553 1.87943 3.22956 1.91628 3.27249 1.95313 3.31432 1.98998 3.35502 2.02683 3.39458 2.06369 3.43298 2.10054 3.47023 2.13739 3.50629 2.17424 3.54117 2.21109 3.57484 2.24794 3.60729 2.28479 3.63853 2.32165 3.66853 2.3585 3.69728 2.39535 3.72478 2.4322 3.75101 2.46905 3.77597 2.5059 3.79965 2.54276 3.82203 2.57961 3.84312 2.61646 3.86291 2.65331 3.88138 2.69016 3.89854 2.72701 3.91437 2.76386 3.92887 2.80072 3.94204 2.83757 3.95387 2.87442 3.96436 2.91127 3.97351 2.94812 3.9813 2.98497 3.98774 3.02183 3.99283 3.05868 3.99656 3.09553 3.99894 3.13238 3.99996 3.16923 3.99962 3.20608 3.99792 3.24293 3.99487 3.27979 3.99046 3.31664 3.98469 3.35349 3.97757 3.39034 3.9691 3.42719 3.95929 3.46404 3.94813 3.5009 3.93562 3.53775 3.92179 3.5746 3.90662 3.61145 3.89012 3.6483 3.87231 3.68515 3.85318 3.722 3.83274 3.75886 3.811 3.79571 3.78797 3.83256 3.76365 3.86941 3.73805 3.90626 3.71118 3.94311 3.68306 3.97996 3.65368 4.01682 3.62307 4.05367 3.59122 4.09052 3.55815 4.12737 3.52388 4.16422 3.48841 4.20107 3.45175 4.23793 3.41393 4.27478 3.37494 4.31163 3.33481 4.34848 3.29354 4.38533 3.25116 4.42218 3.20768 4.45903 3.1631 4.49589 3.11745 4.53274 3.07075 4.56959 3.023 4.60644 2.97422 4.64329 2.92444 4.68014 2.87366 4.717 2.82191 4.75385 2.76919 4.7907 2.71554 4.82755 2.66097 4.8644 2.60549 4.90125 2.54913 4.9381 2.4919 4.97496 2.43383 5.01181 2.37493 5.04866 2.31522 5.08551 2.25473 5.12236 2.19347 5.15921 2.13147 5.19607 2.06874 5.23292 2.00532 5.26977 1.94121 5.30662 1.87644 5.34347 1.81104 5.38032 1.74502 5.41717 1.6784 5.45403 1.61122 5.49088 1.54349 5.52773 1.47524 5.56458 1.40649 5.60143 1.33725 5.63828 1.26757 5.67514 1.19745 5.71199 1.12693 5.74884 1.05603 5.78569 0.984762 5.82254 0.913164 5.85939 0.841257 5.89624 0.769063 5.9331 0.696609 5.96995 0.623918 6.0068 0.551015 6.04365 0.477925 6.0805 0.404673 6.11735 0.331284 6.1542 0.257782 6.19106 0.184192 6.22791 0.110541 6.26476 0.036851 6.30161 -0.036851 6.33846 -0.110541 6.37531 -0.184192 6.41217 -0.257782 6.44902 -0.331284 6.48587 -0.404673 6.52272 -0.477925 6.55957 -0.551015 6.59642 -0.623918 6.63327 -0.696609 6.67013 -0.769063 6.70698 -0.841257 6.74383 -0.913164 6.78068 -0.984762 6.81753 -1.05603 6.85438 -1.12693 6.89124 -1.19745 6.92809 -1.26757 6.96494 -1.33725 7.00179 -1.40649 7.03864 -1.47524 7.07549 -1.54349 7.11234 -1.61122 7.1492 -1.6784 7.18605 -1.74502 7.2229 -1.81104 7.25975 -1.87644 7.2966 -1.94121 7.33345 -2.00532 7.37031 -2.06874 7.40716 -2.13147 7.44401 -2.19347 7.48086 -2.25473 7.51771 -2.31522 7.55456 -2.37493 7.59141 -2.43383 7.62827 -2.4919 7.66512 -2.54913 7.70197 -2.60549 7.73882 -2.66097 7.77567 -2.71554 7.81252 -2.76919 7.84938 -2.82191 7.88623 -2.87366 7.92308 -2.92444 7.95993 -2.97422 7.99678 -3.023 8.03363 -3.07075 8.07048 -3.11745 8.10734 -3.1631 8.14419 -3.20768 8.18104 -3.25116 8.21789 -3.29354 8.25474 -3.33481 8.29159 -3.37494 8.32845 -3.41393 8.3653 -3.45175 8.40215 -3.48841 8.439 -3.52388 8.47585 -3.55815 8.5127 -3.59122 8.54955 -3.62307 8.58641 -3.65368 8.62326 -3.68306 8.66011 -3.71118 8.69696 -3.73805 8.73381 -3.76365 8.77066 -3.78797 8.80751 -3.811 8.84437 -3.83274 8.88122 -3.85318 8.91807 -3.87231 8.95492 -3.89012 8.99177 -3.90662 9.02862 -3.92179 9.06548 -3.93562 9.10233 -3.94813 9.13918 -3.95929 9.17603 -3.9691 9.21288 -3.97757 9.24973 -3.98469 9.28658 -3.99046 9.32344 -3.99487 9.36029 -3.99792 9.39714 -3.99962 9.43399 -3.99996 9.47084 -3.99894 9.50769 -3.99656 9.54455 -3.99283 9.5814 -3.98774 9.61825 -3.9813 9.6551 -3.97351 9.69195 -3.96436 9.7288 -3.95387 9.76565 -3.94204 9.80251 -3.92887 9.83936 -3.91437 9.87621 -3.89854 9.91306 -3.88138 9.94991 -3.86291 9.98676 -3.84312 10.0236 -3.82203 10.0605 -3.79965 10.0973 -3.77597 10.1342 -3.75101 10.171 -3.72478 10.2079 -3.69728 10.2447 -3.66853 10.2816 -3.63853 10.3184 -3.60729 10.3553 -3.57484 10.3921 -3.54117 10.429 -3.50629 10.4658 -3.47023 10.5027 -3.43298 10.5395 -3.39458 10.5764 -3.35502 10.6132 -3.31432 10.6501 -3.27249 10.6869 -3.22956 10.7238 -3.18553 10.7606 -3.14041 10.7975 -3.09423 10.8343 -3.047 10.8712 -2.99874 10.9081 -2.94946 10.9449 -2.89917 10.9818 -2.8479 11.0186 -2.79567 11.0555 -2.74248 11.0923 -2.68837 11.1292 -2.63334 11.166 -2.57742 11.2029 -2.52062 11.2397 -2.46297 11.2766 -2.40448 11.3134 -2.34517 11.3503 -2.28507 11.3871 -2.2242 11.424 -2.16256 11.4608 -2.1002 11.4977 -2.03712 11.5345 -1.97335 11.5714 -1.9089 11.6082 -1.84382 11.6451 -1.7781 11.6819 -1.71178 11.7188 -1.64488 11.7556 -1.57742 11.7925 -1.50943 11.8293 -1.44092 11.8662 -1.37193 11.903 -1.30247 11.9399 -1.23256 11.9767 -1.16224 12.0136 -1.09152 12.0504 -1.02044 12.0873 -0.949003 12.1242 -0.877248 12.161 -0.805194 12.1979 -0.732867 12.2347 -0.660291 12.2716 -0.587491 12.3084 -0.514492 12.3453 -0.441318 12.3821 -0.367994 12.419 -0.294545 12.4558 -0.220997 12.4927 -0.147373 12.5295 -0.0736989 12.5664 -9.79685e-16 12.6032 0.0736989 12.6401 0.147373 12.6769 0.220997 12.7138 0.294545 12.7506 0.367994 12.7875 0.441318 12.8243 0.514492 12.8612 0.587491 12.898 0.660291 12.9349 0.732867 12.9717 0.805194 13.0086 0.877248 13.0454 0.949003 13.0823 1.02044 13.1191 1.09152 13.156 1.16224 13.1928 1.23256 13.2297 1.30247 13.2665 1.37193 13.3034 1.44092 13.3403 1.50943 13.3771 1.57742 13.414 1.64488 13.4508 1.71178 13.4877 1.7781 13.5245 1.84382 13.5614 1.9089 13.5982 1.97335 13.6351 2.03712 13.6719 2.1002 13.7088 2.16256 13.7456 2.2242 13.7825 2.28507 13.8193 2.34517 13.8562 2.40448 13.893 2.46297 13.9299 2.52062 13.9667 2.57742 14.0036 2.63334 14.0404 2.68837 14.0773 2.74248 14.1141 2.79567 14.151 2.8479 14.1878 2.89917 14.2247 2.94946 14.2615 2.99874 14.2984 3.047 14.3352 3.09423 14.3721 3.14041 14.4089 3.18553 14.4458 3.22956 14.4827 3.27249 14.5195 3.31432 14.5564 3.35502 14.5932 3.39458 14.6301 3.43298 14.6669 3.47023 14.7038 3.50629 14.7406 3.54117 14.7775 3.57484 14.8143 3.60729 14.8512 3.63853 14.888 3.66853 14.9249 3.69728 14.9617 3.72478 14.9986 3.75101 15.0354 3.77597 15.0723 3.79965 15.1091 3.82203 15.146 3.84312 15.1828 3.86291 15.2197 3.88138 15.2565 3.89854 15.2934 3.91437 15.3302 3.92887 15.3671 3.94204 15.4039 3.95387 15.4408 3.96436 15.4776 3.97351 15.5145 3.9813 15.5513 3.98774 15.5882 3.99283 15.625 3.99656 15.6619 3.99894 15.6988 3.99996 15.7356 3.99962 15.7725 3.99792 15.8093 3.99487 15.8462 3.99046 15.883 3.98469 15.9199 3.97757 15.9567 3.9691 15.9936 3.95929 16.0304 3.94813 16.0673 3.93562 16.1041 3.92179 16.141 3.90662 16.1778 3.89012 16.2147 3.87231 16.2515 3.85318 16.2884 3.83274 16.3252 3.811 16.3621 3.78797 16.3989 3.76365 16.4358 3.73805 16.4726 3.71118 16.5095 3.68306 16.5463 3.65368 16.5832 3.62307 16.62 3.59122 16.6569 3.55815 16.6937 3.52388 16.7306 3.48841 16.7674 3.45175 16.8043 3.41393 16.8411 3.37494 16.878 3.33481 16.9149 3.29354 16.9517 3.25116 16.9886 3.20768 17.0254 3.1631 17.0623 3.11745 17.0991 3.07075 17.136 3.023 17.1728 2.97422 17.2097 2.92444 17.2465 2.87366 17.2834 2.82191 17.3202 2.76919 17.3571 2.71554 17.3939 2.66097 17.4308 2.60549 17.4676 2.54913 17.5045 2.4919 17.5413 2.43383 17.5782 2.37493 17.615 2.31522 17.6519 2.25473 17.6887 2.19347 17.7256 2.13147 17.7624 2.06874 17.7993 2.00532 17.8361 1.94121 17.873 1.87644 17.9098 1.81104 17.9467 1.74502 17.9835 1.6784 18.0204 1.61122 18.0572 1.54349 18.0941 1.47524 18.131 1.40649 18.1678 1.33725 18.2047 1.26757 18.2415 1.19745 18.2784 1.12693 18.3152 1.05603 18.3521 0.984762 18.3889 0.913164 18.4258 0.841257 18.4626 0.769063 18.4995 0.696609 18.5363 0.623918 18.5732 0.551015 18.61 0.477925 18.6469 0.404673 18.6837 0.331284 18.7206 0.257782 18.7574 0.184192 18.7943 0.110541 18.8311 0.036851 18.868 -0.036851 18.9048 -0.110541 18.9417 -0.184192 18.9785 -0.257782 19.0154 -0.331284 19.0522 -0.404673 19.0891 -0.477925 19.1259 -0.551015 19.1628 -0.623918 19.1996 -0.696609 19.2365 -0.769063 19.2733 -0.841257 19.3102 -0.913164 19.3471 -0.984762 19.3839 -1.05603 19.4208 -1.12693 19.4576 -1.19745 19.4945 -1.26757 19.5313 -1.33725 19.5682 -1.40649 19.605 -1.47524 19.6419 -1.54349 19.6787 -1.61122 19.7156 -1.6784 19.7524 -1.74502 19.7893 -1.81104 19.8261 -1.87644 19.863 -1.94121 19.8998 -2.00532 19.9367 -2.06874 19.9735 -2.13147 20.0104 -2.19347 20.0472 -2.25473 20.0841 -2.31522 20.1209 -2.37493 20.1578 -2.43383 20.1946 -2.4919 20.2315 -2.54913 20.2683 -2.60549 20.3052 -2.66097 20.342 -2.71554 20.3789 -2.76919 20.4157 -2.82191 20.4526 -2.87366 20.4894 -2.92444 20.5263 -2.97422 20.5632 -3.023 20.6 -3.07075 20.6369 -3.11745 20.6737 -3.1631 20.7106 -3.20768 20.7474 -3.25116 20.7843 -3.29354 20.8211 -3.33481 20.858 -3.37494 20.8948 -3.41393 20.9317 -3.45175 20.9685 -3.48841 21.0054 -3.52388 21.0422 -3.55815 21.0791 -3.59122 21.1159 -3.62307 21.1528 -3.65368 21.1896 -3.68306 21.2265 -3.71118 21.2633 -3.73805 21.3002 -3.76365 21.337 -3.78797 21.3739 -3.811 21.4107 -3.83274 21.4476 -3.85318 21.4844 -3.87231 21.5213 -3.89012 21.5581 -3.90662 21.595 -3.92179 21.6318 -3.93562 21.6687 -3.94813 21.7055 -3.95929 21.7424 -3.9691 21.7793 -3.97757 21.8161 -3.98469 21.853 -3.99046 21.8898 -3.99487 21.9267 -3.99792 21.9635 -3.99962 22.0004 -3.99996 22.0372 -3.99894 22.0741 -3.99656 22.1109 -3.99283 22.1478 -3.98774 22.1846 -3.9813 22.2215 -3.97351 22.2583 -3.96436 22.2952 -3.95387 22.332 -3.94204 22.3689 -3.92887 22.4057 -3.91437 22.4426 -3.89854 22.4794 -3.88138 22.5163 -3.86291 22.5531 -3.84312 22.59 -3.82203 22.6268 -3.79965 22.6637 -3.77597 22.7005 -3.75101 22.7374 -3.72478 22.7742 -3.69728 22.8111 -3.66853 22.8479 -3.63853 22.8848 -3.60729 22.9216 -3.57484 22.9585 -3.54117 22.9954 -3.50629 23.0322 -3.47023 23.0691 -3.43298 23.1059 -3.39458 23.1428 -3.35502 23.1796 -3.31432 23.2165 -3.27249 23.2533 -3.22956 23.2902 -3.18553 23.327 -3.14041 23.3639 -3.09423 23.4007 -3.047 23.4376 -2.99874 23.4744 -2.94946 23.5113 -2.89917 23.5481 -2.8479 23.585 -2.79567 23.6218 -2.74248 23.6587 -2.68837 23.6955 -2.63334 23.7324 -2.57742 23.7692 -2.52062 23.8061 -2.46297 23.8429 -2.40448 23.8798 -2.34517 23.9166 -2.28507 23.9535 -2.2242 23.9903 -2.16256 24.0272 -2.1002 24.064 -2.03712 24.1009 -1.97335 24.1378 -1.9089 24.1746 -1.84382 24.2115 -1.7781 24.2483 -1.71178 24.2852 -1.64488 24.322 -1.57742 24.3589 -1.50943 24.3957 -1.44092 24.4326 -1.37193 24.4694 -1.30247 24.5063 -1.23256 24.5431 -1.16224 24.58 -1.09152 24.6168 -1.02044 24.6537 -0.949003 24.6905 -0.877248 24.7274 -0.805194 24.7642 -0.732867 24.8011 -0.660291 24.8379 -0.587491 24.8748 -0.514492 24.9116 -0.441318 24.9485 -0.367994 24.9853 -0.294545 25.0222 -0.220997 25.059 -0.147373 25.0959 -0.0736989 25.1327 -1.95937e-15 25.1696 0.0736989 25.2064 0.147373 25.2433 0.220997 25.2801 0.294545 25.317 0.367994 25.3539 0.441318 25.3907 0.514492 25.4276 0.587491 25.4644 0.660291 25.5013 0.732867 25.5381 0.805194 25.575 0.877248 25.6118 0.949003 25.6487 1.02044 25.6855 1.09152 25.7224 1.16224 25.7592 1.23256 25.7961 1.30247 25.8329 1.37193 25.8698 1.44092 25.9066 1.50943 25.9435 1.57742 25.9803 1.64488 26.0172 1.71178 26.054 1.7781 26.0909 1.84382 26.1277 1.9089 26.1646 1.97335 26.2014 2.03712 26.2383 2.1002 26.2751 2.16256 26.312 2.2242 26.3488 2.28507 26.3857 2.34517 26.4225 2.40448 26.4594 2.46297 26.4962 2.52062 26.5331 2.57742 26.57 2.63334 26.6068 2.68837 26.6437 2.74248 26.6805 2.79567 26.7174 2.8479 26.7542 2.89917 26.7911 2.94946 26.8279 2.99874 26.8648 3.047 26.9016 3.09423 26.9385 3.14041 26.9753 3.18553 27.0122 3.22956 27.049 3.27249 27.0859 3.31432 27.1227 3.35502 27.1596 3.39458 27.1964 3.43298 27.2333 3.47023 27.2701 3.50629 27.307 3.54117 27.3438 3.57484 27.3807 3.60729 27.4175 3.63853 27.4544 3.66853 27.4912 3.69728 27.5281 3.72478 27.5649 3.75101 27.6018 3.77597 27.6386 3.79965 27.6755 3.82203 27.7123 3.84312 27.7492 3.86291 27.7861 3.88138 27.8229 3.89854 27.8598 3.91437 27.8966 3.92887 27.9335 3.94204 27.9703 3.95387 28.0072 3.96436 28.044 3.97351 28.0809 3.9813 28.1177 3.98774 28.1546 3.99283 28.1914 3.99656 28.2283 3.99894 28.2651 3.99996 28.302 3.99962 28.3388 3.99792 28.3757 3.99487 28.4125 3.99046 28.4494 3.98469 28.4862 3.97757 28.5231 3.9691 28.5599 3.95929 28.5968 3.94813 28.6336 3.93562 28.6705 3.92179 28.7073 3.90662 28.7442 3.89012 28.781 3.87231 28.8179 3.85318 28.8547 3.83274 28.8916 3.811 28.9284 3.78797 28.9653 3.76365 29.0022 3.73805 29.039 3.71118 29.0759 3.68306 29.1127 3.65368 29.1496 3.62307 29.1864 3.59122 29.2233 3.55815 29.2601 3.52388 29.297 3.48841 29.3338 3.45175 29.3707 3.41393 29.4075 3.37494 29.4444 3.33481 29.4812 3.29354 29.5181 3.25116 29.5549 3.20768 29.5918 3.1631 29.6286 3.11745 29.6655 3.07075 29.7023 3.023 29.7392 2.97422 29.776 2.92444 29.8129 2.87366 29.8497 2.82191 29.8866 2.76919 29.9234 2.71554 29.9603 2.66097 29.9971 2.60549 30.034 2.54913 30.0708 2.4919 30.1077 2.43383 30.1445 2.37493 30.1814 2.31522 30.2183 2.25473 30.2551 2.19347 30.292 2.13147 30.3288 2.06874 30.3657 2.00532 30.4025 1.94121 30.4394 1.87644 30.4762 1.81104 30.5131 1.74502 30.5499 1.6784 30.5868 1.61122 30.6236 1.54349 30.6605 1.47524 30.6973 1.40649 30.7342 1.33725 30.771 1.26757 30.8079 1.19745 30.8447 1.12693 30.8816 1.05603 30.9184 0.984762 30.9553 0.913164 30.9921 0.841257 31.029 0.769063 31.0658 0.696609 31.1027 0.623918 31.1395 0.551015 31.1764 0.477925 31.2132 0.404673 31.2501 0.331284 31.2869 0.257782 31.3238 0.184192 31.3606 0.110541 31.3975 0.036851 31.4344 -0.036851 31.4712 -0.110541 31.5081 -0.184192 31.5449 -0.257782 31.5818 -0.331284 31.6186 -0.404673 31.6555 -0.477925 31.6923 -0.551015 31.7292 -0.623918 31.766 -0.696609 31.8029 -0.769063 31.8397 -0.841257 31.8766 -0.913164 31.9134 -0.984762 31.9503 -1.05603 31.9871 -1.12693 32.024 -1.19745 32.0608 -1.26757 32.0977 -1.33725 32.1345 -1.40649 32.1714 -1.47524 32.2082 -1.54349 32.2451 -1.61122 32.2819 -1.6784 32.3188 -1.74502 32.3556 -1.81104 32.3925 -1.87644 32.4293 -1.94121 32.4662 -2.00532 32.503 -2.06874 32.5399 -2.13147 32.5767 -2.19347 32.6136 -2.25473 32.6505 -2.31522 32.6873 -2.37493 32.7242 -2.43383 32.761 -2.4919 32.7979 -2.54913 32.8347 -2.60549 32.8716 -2.66097 32.9084 -2.71554 32.9453 -2.76919 32.9821 -2.82191 33.019 -2.87366 33.0558 -2.92444 33.0927 -2.97422 33.1295 -3.023 33.1664 -3.07075 33.2032 -3.11745 33.2401 -3.1631 33.2769 -3.20768 33.3138 -3.25116 33.3506 -3.29354 33.3875 -3.33481 33.4243 -3.37494 33.4612 -3.41393 33.498 -3.45175 33.5349 -3.48841 33.5717 -3.52388 33.6086 -3.55815 33.6454 -3.59122 33.6823 -3.62307 33.7191 -3.65368 33.756 -3.68306 33.7929 -3.71118 33.8297 -3.73805 33.8666 -3.76365 33.9034 -3.78797 33.9403 -3.811 33.9771 -3.83274 34.014 -3.85318 34.0508 -3.87231 34.0877 -3.89012 34.1245 -3.90662 34.1614 -3.92179 34.1982 -3.93562 34.2351 -3.94813 34.2719 -3.95929 34.3088 -3.9691 34.3456 -3.97757 34.3825 -3.98469 34.4193 -3.99046 34.4562 -3.99487 34.493 -3.99792 34.5299 -3.99962 34.5667 -3.99996 34.6036 -3.99894 34.6404 -3.99656 34.6773 -3.99283 34.7141 -3.98774 34.751 -3.9813 34.7878 -3.97351 34.8247 -3.96436 34.8615 -3.95387 34.8984 -3.94204 34.9352 -3.92887 34.9721 -3.91437 35.009 -3.89854 35.0458 -3.88138 35.0827 -3.86291 35.1195 -3.84312 35.1564 -3.82203 35.1932 -3.79965 35.2301 -3.77597 35.2669 -3.75101 35.3038 -3.72478 35.3406 -3.69728 35.3775 -3.66853 35.4143 -3.63853 35.4512 -3.60729 35.488 -3.57484 35.5249 -3.54117 35.5617 -3.50629 35.5986 -3.47023 35.6354 -3.43298 35.6723 -3.39458 35.7091 -3.35502 35.746 -3.31432 35.7828 -3.27249 35.8197 -3.22956 35.8565 -3.18553 35.8934 -3.14041 35.9302 -3.09423 35.9671 -3.047 36.0039 -2.99874 36.0408 -2.94946 36.0776 -2.89917 36.1145 -2.8479 36.1513 -2.79567 36.1882 -2.74248 36.2251 -2.68837 36.2619 -2.63334 36.2988 -2.57742 36.3356 -2.52062 36.3725 -2.46297 36.4093 -2.40448 36.4462 -2.34517 36.483 -2.28507 36.5199 -2.2242 36.5567 -2.16256 36.5936 -2.1002 36.6304 -2.03712 36.6673 -1.97335 36.7041 -1.9089 36.741 -1.84382 36.7778 -1.7781 36.8147 -1.71178 36.8515 -1.64488 36.8884 -1.57742 36.9252 -1.50943 36.9621 -1.44092 36.9989 -1.37193 37.0358 -1.30247 37.0726 -1.23256 37.1095 -1.16224 37.1463 -1.09152 37.1832 -1.02044 37.22 -0.949003 37.2569 -0.877248 37.2937 -0.805194 37.3306 -0.732867 37.3674 -0.660291 37.4043 -0.587491 37.4412 -0.514492 37.478 -0.441318 37.5149 -0.367994 37.5517 -0.294545 37.5886 -0.220997 37.6254 -0.147373 37.6623 -0.0736989 37.6991 -2.93906e-15 & @target G0.S3 @type xy 0 0 0.0368515 0.00203648 0.0737031 0.00813899 0.110555 0.0182868 0.147406 0.0324455 0.184258 0.050567 0.221109 0.0725897 0.257961 0.0984388 0.294812 0.128026 0.331664 0.161251 0.368515 0.198001 0.405367 0.23815 0.442218 0.281561 0.47907 0.328085 0.515921 0.377564 0.552773 0.429828 0.589624 0.484697 0.626476 0.541983 0.663327 0.601487 0.700179 0.663006 0.737031 0.726325 0.773882 0.791224 0.810734 0.857479 0.847585 0.924857 0.884437 0.993122 0.921288 1.06203 0.95814 1.13135 0.994991 1.20083 1.03184 1.27021 1.06869 1.33926 1.10555 1.40772 1.1424 1.47535 1.17925 1.5419 1.2161 1.60712 1.25295 1.67078 1.2898 1.73263 1.32665 1.79245 1.36351 1.85 1.40036 1.90505 1.43721 1.95741 1.47406 2.00685 1.51091 2.05318 1.54776 2.09619 1.58462 2.13572 1.62147 2.17159 1.65832 2.20362 1.69517 2.23168 1.73202 2.25561 1.76887 2.2753 1.80572 2.29061 1.84258 2.30145 1.87943 2.30772 1.91628 2.30935 1.95313 2.30626 1.98998 2.29841 2.02683 2.28575 2.06369 2.26827 2.10054 2.24594 2.13739 2.21879 2.17424 2.18681 2.21109 2.15005 2.24794 2.10855 2.28479 2.06236 2.32165 2.01157 2.3585 1.95626 2.39535 1.89652 2.4322 1.83248 2.46905 1.76425 2.5059 1.69198 2.54276 1.61581 2.57961 1.53591 2.61646 1.45244 2.65331 1.3656 2.69016 1.27556 2.72701 1.18255 2.76386 1.08675 2.80072 0.988408 2.83757 0.887733 2.87442 0.784963 2.91127 0.680337 2.94812 0.574101 2.98497 0.466504 3.02183 0.357802 3.05868 0.248249 3.09553 0.138108 3.13238 0.027638 3.16923 -0.0828975 3.20608 -0.193236 3.24293 -0.303115 3.27979 -0.412275 3.31664 -0.520457 3.35349 -0.627405 3.39034 -0.732866 3.42719 -0.836595 3.46404 -0.938347 3.5009 -1.03789 3.53775 -1.13498 3.5746 -1.22942 3.61145 -1.32097 3.6483 -1.40943 3.68515 -1.49461 3.722 -1.57631 3.75886 -1.65437 3.79571 -1.72861 3.83256 -1.79888 3.86941 -1.86503 3.90626 -1.92694 3.94311 -1.98447 3.97996 -2.03754 4.01682 -2.08603 4.05367 -2.12989 4.09052 -2.16902 4.12737 -2.2034 4.16422 -2.23297 4.20107 -2.25771 4.23793 -2.27761 4.27478 -2.29268 4.31163 -2.30293 4.34848 -2.30839 4.38533 -2.30912 4.42218 -2.30516 4.45903 -2.2966 4.49589 -2.28351 4.53274 -2.266 4.56959 -2.24417 4.60644 -2.21816 4.64329 -2.18809 4.68014 -2.15412 4.717 -2.11641 4.75385 -2.07511 4.7907 -2.03041 4.82755 -1.98251 4.8644 -1.93158 4.90125 -1.87785 4.9381 -1.82152 4.97496 -1.76281 5.01181 -1.70195 5.04866 -1.63916 5.08551 -1.57469 5.12236 -1.50878 5.15921 -1.44166 5.19607 -1.37358 5.23292 -1.30479 5.26977 -1.23555 5.30662 -1.16608 5.34347 -1.09666 5.38032 -1.02751 5.41717 -0.958893 5.45403 -0.891042 5.49088 -0.824197 5.52773 -0.758591 5.56458 -0.694454 5.60143 -0.632008 5.63828 -0.57147 5.67514 -0.51305 5.71199 -0.456948 5.74884 -0.403359 5.78569 -0.352466 5.82254 -0.304443 5.85939 -0.259456 5.89624 -0.217659 5.9331 -0.179193 5.96995 -0.144191 6.0068 -0.112771 6.04365 -0.0850411 6.0805 -0.0610951 6.11735 -0.0410145 6.1542 -0.0248675 6.19106 -0.0127091 6.22791 -0.00458045 6.26476 -0.000509227 6.30161 -0.000509227 6.33846 -0.00458045 6.37531 -0.0127091 6.41217 -0.0248675 6.44902 -0.0410145 6.48587 -0.0610951 6.52272 -0.0850411 6.55957 -0.112771 6.59642 -0.144191 6.63327 -0.179193 6.67013 -0.217659 6.70698 -0.259456 6.74383 -0.304443 6.78068 -0.352466 6.81753 -0.403359 6.85438 -0.456948 6.89124 -0.51305 6.92809 -0.57147 6.96494 -0.632008 7.00179 -0.694454 7.03864 -0.758591 7.07549 -0.824197 7.11234 -0.891042 7.1492 -0.958893 7.18605 -1.02751 7.2229 -1.09666 7.25975 -1.16608 7.2966 -1.23555 7.33345 -1.30479 7.37031 -1.37358 7.40716 -1.44166 7.44401 -1.50878 7.48086 -1.57469 7.51771 -1.63916 7.55456 -1.70195 7.59141 -1.76281 7.62827 -1.82152 7.66512 -1.87785 7.70197 -1.93158 7.73882 -1.98251 7.77567 -2.03041 7.81252 -2.07511 7.84938 -2.11641 7.88623 -2.15412 7.92308 -2.18809 7.95993 -2.21816 7.99678 -2.24417 8.03363 -2.266 8.07048 -2.28351 8.10734 -2.2966 8.14419 -2.30516 8.18104 -2.30912 8.21789 -2.30839 8.25474 -2.30293 8.29159 -2.29268 8.32845 -2.27761 8.3653 -2.25771 8.40215 -2.23297 8.439 -2.2034 8.47585 -2.16902 8.5127 -2.12989 8.54955 -2.08603 8.58641 -2.03754 8.62326 -1.98447 8.66011 -1.92694 8.69696 -1.86503 8.73381 -1.79888 8.77066 -1.72861 8.80751 -1.65437 8.84437 -1.57631 8.88122 -1.49461 8.91807 -1.40943 8.95492 -1.32097 8.99177 -1.22942 9.02862 -1.13498 9.06548 -1.03789 9.10233 -0.938347 9.13918 -0.836595 9.17603 -0.732866 9.21288 -0.627405 9.24973 -0.520457 9.28658 -0.412275 9.32344 -0.303115 9.36029 -0.193236 9.39714 -0.0828975 9.43399 0.027638 9.47084 0.138108 9.50769 0.248249 9.54455 0.357802 9.5814 0.466504 9.61825 0.574101 9.6551 0.680337 9.69195 0.784963 9.7288 0.887733 9.76565 0.988408 9.80251 1.08675 9.83936 1.18255 9.87621 1.27556 9.91306 1.3656 9.94991 1.45244 9.98676 1.53591 10.0236 1.61581 10.0605 1.69198 10.0973 1.76425 10.1342 1.83248 10.171 1.89652 10.2079 1.95626 10.2447 2.01157 10.2816 2.06236 10.3184 2.10855 10.3553 2.15005 10.3921 2.18681 10.429 2.21879 10.4658 2.24594 10.5027 2.26827 10.5395 2.28575 10.5764 2.29841 10.6132 2.30626 10.6501 2.30935 10.6869 2.30772 10.7238 2.30145 10.7606 2.29061 10.7975 2.2753 10.8343 2.25561 10.8712 2.23168 10.9081 2.20362 10.9449 2.17159 10.9818 2.13572 11.0186 2.09619 11.0555 2.05318 11.0923 2.00685 11.1292 1.95741 11.166 1.90505 11.2029 1.85 11.2397 1.79245 11.2766 1.73263 11.3134 1.67078 11.3503 1.60712 11.3871 1.5419 11.424 1.47535 11.4608 1.40772 11.4977 1.33926 11.5345 1.27021 11.5714 1.20083 11.6082 1.13135 11.6451 1.06203 11.6819 0.993122 11.7188 0.924857 11.7556 0.857479 11.7925 0.791224 11.8293 0.726325 11.8662 0.663006 11.903 0.601487 11.9399 0.541983 11.9767 0.484697 12.0136 0.429828 12.0504 0.377564 12.0873 0.328085 12.1242 0.281561 12.161 0.23815 12.1979 0.198001 12.2347 0.161251 12.2716 0.128026 12.3084 0.0984388 12.3453 0.0725897 12.3821 0.050567 12.419 0.0324455 12.4558 0.0182868 12.4927 0.00813899 12.5295 0.00203648 12.5664 3.59919e-31 12.6032 0.00203648 12.6401 0.00813899 12.6769 0.0182868 12.7138 0.0324455 12.7506 0.050567 12.7875 0.0725897 12.8243 0.0984388 12.8612 0.128026 12.898 0.161251 12.9349 0.198001 12.9717 0.23815 13.0086 0.281561 13.0454 0.328085 13.0823 0.377564 13.1191 0.429828 13.156 0.484697 13.1928 0.541983 13.2297 0.601487 13.2665 0.663006 13.3034 0.726325 13.3403 0.791224 13.3771 0.857479 13.414 0.924857 13.4508 0.993122 13.4877 1.06203 13.5245 1.13135 13.5614 1.20083 13.5982 1.27021 13.6351 1.33926 13.6719 1.40772 13.7088 1.47535 13.7456 1.5419 13.7825 1.60712 13.8193 1.67078 13.8562 1.73263 13.893 1.79245 13.9299 1.85 13.9667 1.90505 14.0036 1.95741 14.0404 2.00685 14.0773 2.05318 14.1141 2.09619 14.151 2.13572 14.1878 2.17159 14.2247 2.20362 14.2615 2.23168 14.2984 2.25561 14.3352 2.2753 14.3721 2.29061 14.4089 2.30145 14.4458 2.30772 14.4827 2.30935 14.5195 2.30626 14.5564 2.29841 14.5932 2.28575 14.6301 2.26827 14.6669 2.24594 14.7038 2.21879 14.7406 2.18681 14.7775 2.15005 14.8143 2.10855 14.8512 2.06236 14.888 2.01157 14.9249 1.95626 14.9617 1.89652 14.9986 1.83248 15.0354 1.76425 15.0723 1.69198 15.1091 1.61581 15.146 1.53591 15.1828 1.45244 15.2197 1.3656 15.2565 1.27556 15.2934 1.18255 15.3302 1.08675 15.3671 0.988408 15.4039 0.887733 15.4408 0.784963 15.4776 0.680337 15.5145 0.574101 15.5513 0.466504 15.5882 0.357802 15.625 0.248249 15.6619 0.138108 15.6988 0.027638 15.7356 -0.0828975 15.7725 -0.193236 15.8093 -0.303115 15.8462 -0.412275 15.883 -0.520457 15.9199 -0.627405 15.9567 -0.732866 15.9936 -0.836595 16.0304 -0.938347 16.0673 -1.03789 16.1041 -1.13498 16.141 -1.22942 16.1778 -1.32097 16.2147 -1.40943 16.2515 -1.49461 16.2884 -1.57631 16.3252 -1.65437 16.3621 -1.72861 16.3989 -1.79888 16.4358 -1.86503 16.4726 -1.92694 16.5095 -1.98447 16.5463 -2.03754 16.5832 -2.08603 16.62 -2.12989 16.6569 -2.16902 16.6937 -2.2034 16.7306 -2.23297 16.7674 -2.25771 16.8043 -2.27761 16.8411 -2.29268 16.878 -2.30293 16.9149 -2.30839 16.9517 -2.30912 16.9886 -2.30516 17.0254 -2.2966 17.0623 -2.28351 17.0991 -2.266 17.136 -2.24417 17.1728 -2.21816 17.2097 -2.18809 17.2465 -2.15412 17.2834 -2.11641 17.3202 -2.07511 17.3571 -2.03041 17.3939 -1.98251 17.4308 -1.93158 17.4676 -1.87785 17.5045 -1.82152 17.5413 -1.76281 17.5782 -1.70195 17.615 -1.63916 17.6519 -1.57469 17.6887 -1.50878 17.7256 -1.44166 17.7624 -1.37358 17.7993 -1.30479 17.8361 -1.23555 17.873 -1.16608 17.9098 -1.09666 17.9467 -1.02751 17.9835 -0.958893 18.0204 -0.891042 18.0572 -0.824197 18.0941 -0.758591 18.131 -0.694454 18.1678 -0.632008 18.2047 -0.57147 18.2415 -0.51305 18.2784 -0.456948 18.3152 -0.403359 18.3521 -0.352466 18.3889 -0.304443 18.4258 -0.259456 18.4626 -0.217659 18.4995 -0.179193 18.5363 -0.144191 18.5732 -0.112771 18.61 -0.0850411 18.6469 -0.0610951 18.6837 -0.0410145 18.7206 -0.0248675 18.7574 -0.0127091 18.7943 -0.00458045 18.8311 -0.000509227 18.868 -0.000509227 18.9048 -0.00458045 18.9417 -0.0127091 18.9785 -0.0248675 19.0154 -0.0410145 19.0522 -0.0610951 19.0891 -0.0850411 19.1259 -0.112771 19.1628 -0.144191 19.1996 -0.179193 19.2365 -0.217659 19.2733 -0.259456 19.3102 -0.304443 19.3471 -0.352466 19.3839 -0.403359 19.4208 -0.456948 19.4576 -0.51305 19.4945 -0.57147 19.5313 -0.632008 19.5682 -0.694454 19.605 -0.758591 19.6419 -0.824197 19.6787 -0.891042 19.7156 -0.958893 19.7524 -1.02751 19.7893 -1.09666 19.8261 -1.16608 19.863 -1.23555 19.8998 -1.30479 19.9367 -1.37358 19.9735 -1.44166 20.0104 -1.50878 20.0472 -1.57469 20.0841 -1.63916 20.1209 -1.70195 20.1578 -1.76281 20.1946 -1.82152 20.2315 -1.87785 20.2683 -1.93158 20.3052 -1.98251 20.342 -2.03041 20.3789 -2.07511 20.4157 -2.11641 20.4526 -2.15412 20.4894 -2.18809 20.5263 -2.21816 20.5632 -2.24417 20.6 -2.266 20.6369 -2.28351 20.6737 -2.2966 20.7106 -2.30516 20.7474 -2.30912 20.7843 -2.30839 20.8211 -2.30293 20.858 -2.29268 20.8948 -2.27761 20.9317 -2.25771 20.9685 -2.23297 21.0054 -2.2034 21.0422 -2.16902 21.0791 -2.12989 21.1159 -2.08603 21.1528 -2.03754 21.1896 -1.98447 21.2265 -1.92694 21.2633 -1.86503 21.3002 -1.79888 21.337 -1.72861 21.3739 -1.65437 21.4107 -1.57631 21.4476 -1.49461 21.4844 -1.40943 21.5213 -1.32097 21.5581 -1.22942 21.595 -1.13498 21.6318 -1.03789 21.6687 -0.938347 21.7055 -0.836595 21.7424 -0.732866 21.7793 -0.627405 21.8161 -0.520457 21.853 -0.412275 21.8898 -0.303115 21.9267 -0.193236 21.9635 -0.0828975 22.0004 0.027638 22.0372 0.138108 22.0741 0.248249 22.1109 0.357802 22.1478 0.466504 22.1846 0.574101 22.2215 0.680337 22.2583 0.784963 22.2952 0.887733 22.332 0.988408 22.3689 1.08675 22.4057 1.18255 22.4426 1.27556 22.4794 1.3656 22.5163 1.45244 22.5531 1.53591 22.59 1.61581 22.6268 1.69198 22.6637 1.76425 22.7005 1.83248 22.7374 1.89652 22.7742 1.95626 22.8111 2.01157 22.8479 2.06236 22.8848 2.10855 22.9216 2.15005 22.9585 2.18681 22.9954 2.21879 23.0322 2.24594 23.0691 2.26827 23.1059 2.28575 23.1428 2.29841 23.1796 2.30626 23.2165 2.30935 23.2533 2.30772 23.2902 2.30145 23.327 2.29061 23.3639 2.2753 23.4007 2.25561 23.4376 2.23168 23.4744 2.20362 23.5113 2.17159 23.5481 2.13572 23.585 2.09619 23.6218 2.05318 23.6587 2.00685 23.6955 1.95741 23.7324 1.90505 23.7692 1.85 23.8061 1.79245 23.8429 1.73263 23.8798 1.67078 23.9166 1.60712 23.9535 1.5419 23.9903 1.47535 24.0272 1.40772 24.064 1.33926 24.1009 1.27021 24.1378 1.20083 24.1746 1.13135 24.2115 1.06203 24.2483 0.993122 24.2852 0.924857 24.322 0.857479 24.3589 0.791224 24.3957 0.726325 24.4326 0.663006 24.4694 0.601487 24.5063 0.541983 24.5431 0.484697 24.58 0.429828 24.6168 0.377564 24.6537 0.328085 24.6905 0.281561 24.7274 0.23815 24.7642 0.198001 24.8011 0.161251 24.8379 0.128026 24.8748 0.0984388 24.9116 0.0725897 24.9485 0.050567 24.9853 0.0324455 25.0222 0.0182868 25.059 0.00813899 25.0959 0.00203648 25.1327 1.43967e-30 25.1696 0.00203648 25.2064 0.00813899 25.2433 0.0182868 25.2801 0.0324455 25.317 0.050567 25.3539 0.0725897 25.3907 0.0984388 25.4276 0.128026 25.4644 0.161251 25.5013 0.198001 25.5381 0.23815 25.575 0.281561 25.6118 0.328085 25.6487 0.377564 25.6855 0.429828 25.7224 0.484697 25.7592 0.541983 25.7961 0.601487 25.8329 0.663006 25.8698 0.726325 25.9066 0.791224 25.9435 0.857479 25.9803 0.924857 26.0172 0.993122 26.054 1.06203 26.0909 1.13135 26.1277 1.20083 26.1646 1.27021 26.2014 1.33926 26.2383 1.40772 26.2751 1.47535 26.312 1.5419 26.3488 1.60712 26.3857 1.67078 26.4225 1.73263 26.4594 1.79245 26.4962 1.85 26.5331 1.90505 26.57 1.95741 26.6068 2.00685 26.6437 2.05318 26.6805 2.09619 26.7174 2.13572 26.7542 2.17159 26.7911 2.20362 26.8279 2.23168 26.8648 2.25561 26.9016 2.2753 26.9385 2.29061 26.9753 2.30145 27.0122 2.30772 27.049 2.30935 27.0859 2.30626 27.1227 2.29841 27.1596 2.28575 27.1964 2.26827 27.2333 2.24594 27.2701 2.21879 27.307 2.18681 27.3438 2.15005 27.3807 2.10855 27.4175 2.06236 27.4544 2.01157 27.4912 1.95626 27.5281 1.89652 27.5649 1.83248 27.6018 1.76425 27.6386 1.69198 27.6755 1.61581 27.7123 1.53591 27.7492 1.45244 27.7861 1.3656 27.8229 1.27556 27.8598 1.18255 27.8966 1.08675 27.9335 0.988408 27.9703 0.887733 28.0072 0.784963 28.044 0.680337 28.0809 0.574101 28.1177 0.466504 28.1546 0.357802 28.1914 0.248249 28.2283 0.138108 28.2651 0.027638 28.302 -0.0828975 28.3388 -0.193236 28.3757 -0.303115 28.4125 -0.412275 28.4494 -0.520457 28.4862 -0.627405 28.5231 -0.732866 28.5599 -0.836595 28.5968 -0.938347 28.6336 -1.03789 28.6705 -1.13498 28.7073 -1.22942 28.7442 -1.32097 28.781 -1.40943 28.8179 -1.49461 28.8547 -1.57631 28.8916 -1.65437 28.9284 -1.72861 28.9653 -1.79888 29.0022 -1.86503 29.039 -1.92694 29.0759 -1.98447 29.1127 -2.03754 29.1496 -2.08603 29.1864 -2.12989 29.2233 -2.16902 29.2601 -2.2034 29.297 -2.23297 29.3338 -2.25771 29.3707 -2.27761 29.4075 -2.29268 29.4444 -2.30293 29.4812 -2.30839 29.5181 -2.30912 29.5549 -2.30516 29.5918 -2.2966 29.6286 -2.28351 29.6655 -2.266 29.7023 -2.24417 29.7392 -2.21816 29.776 -2.18809 29.8129 -2.15412 29.8497 -2.11641 29.8866 -2.07511 29.9234 -2.03041 29.9603 -1.98251 29.9971 -1.93158 30.034 -1.87785 30.0708 -1.82152 30.1077 -1.76281 30.1445 -1.70195 30.1814 -1.63916 30.2183 -1.57469 30.2551 -1.50878 30.292 -1.44166 30.3288 -1.37358 30.3657 -1.30479 30.4025 -1.23555 30.4394 -1.16608 30.4762 -1.09666 30.5131 -1.02751 30.5499 -0.958893 30.5868 -0.891042 30.6236 -0.824197 30.6605 -0.758591 30.6973 -0.694454 30.7342 -0.632008 30.771 -0.57147 30.8079 -0.51305 30.8447 -0.456948 30.8816 -0.403359 30.9184 -0.352466 30.9553 -0.304443 30.9921 -0.259456 31.029 -0.217659 31.0658 -0.179193 31.1027 -0.144191 31.1395 -0.112771 31.1764 -0.0850411 31.2132 -0.0610951 31.2501 -0.0410145 31.2869 -0.0248675 31.3238 -0.0127091 31.3606 -0.00458045 31.3975 -0.000509227 31.4344 -0.000509227 31.4712 -0.00458045 31.5081 -0.0127091 31.5449 -0.0248675 31.5818 -0.0410145 31.6186 -0.0610951 31.6555 -0.0850411 31.6923 -0.112771 31.7292 -0.144191 31.766 -0.179193 31.8029 -0.217659 31.8397 -0.259456 31.8766 -0.304443 31.9134 -0.352466 31.9503 -0.403359 31.9871 -0.456948 32.024 -0.51305 32.0608 -0.57147 32.0977 -0.632008 32.1345 -0.694454 32.1714 -0.758591 32.2082 -0.824197 32.2451 -0.891042 32.2819 -0.958893 32.3188 -1.02751 32.3556 -1.09666 32.3925 -1.16608 32.4293 -1.23555 32.4662 -1.30479 32.503 -1.37358 32.5399 -1.44166 32.5767 -1.50878 32.6136 -1.57469 32.6505 -1.63916 32.6873 -1.70195 32.7242 -1.76281 32.761 -1.82152 32.7979 -1.87785 32.8347 -1.93158 32.8716 -1.98251 32.9084 -2.03041 32.9453 -2.07511 32.9821 -2.11641 33.019 -2.15412 33.0558 -2.18809 33.0927 -2.21816 33.1295 -2.24417 33.1664 -2.266 33.2032 -2.28351 33.2401 -2.2966 33.2769 -2.30516 33.3138 -2.30912 33.3506 -2.30839 33.3875 -2.30293 33.4243 -2.29268 33.4612 -2.27761 33.498 -2.25771 33.5349 -2.23297 33.5717 -2.2034 33.6086 -2.16902 33.6454 -2.12989 33.6823 -2.08603 33.7191 -2.03754 33.756 -1.98447 33.7929 -1.92694 33.8297 -1.86503 33.8666 -1.79888 33.9034 -1.72861 33.9403 -1.65437 33.9771 -1.57631 34.014 -1.49461 34.0508 -1.40943 34.0877 -1.32097 34.1245 -1.22942 34.1614 -1.13498 34.1982 -1.03789 34.2351 -0.938347 34.2719 -0.836595 34.3088 -0.732866 34.3456 -0.627405 34.3825 -0.520457 34.4193 -0.412275 34.4562 -0.303115 34.493 -0.193236 34.5299 -0.0828975 34.5667 0.027638 34.6036 0.138108 34.6404 0.248249 34.6773 0.357802 34.7141 0.466504 34.751 0.574101 34.7878 0.680337 34.8247 0.784963 34.8615 0.887733 34.8984 0.988408 34.9352 1.08675 34.9721 1.18255 35.009 1.27556 35.0458 1.3656 35.0827 1.45244 35.1195 1.53591 35.1564 1.61581 35.1932 1.69198 35.2301 1.76425 35.2669 1.83248 35.3038 1.89652 35.3406 1.95626 35.3775 2.01157 35.4143 2.06236 35.4512 2.10855 35.488 2.15005 35.5249 2.18681 35.5617 2.21879 35.5986 2.24594 35.6354 2.26827 35.6723 2.28575 35.7091 2.29841 35.746 2.30626 35.7828 2.30935 35.8197 2.30772 35.8565 2.30145 35.8934 2.29061 35.9302 2.2753 35.9671 2.25561 36.0039 2.23168 36.0408 2.20362 36.0776 2.17159 36.1145 2.13572 36.1513 2.09619 36.1882 2.05318 36.2251 2.00685 36.2619 1.95741 36.2988 1.90505 36.3356 1.85 36.3725 1.79245 36.4093 1.73263 36.4462 1.67078 36.483 1.60712 36.5199 1.5419 36.5567 1.47535 36.5936 1.40772 36.6304 1.33926 36.6673 1.27021 36.7041 1.20083 36.741 1.13135 36.7778 1.06203 36.8147 0.993122 36.8515 0.924857 36.8884 0.857479 36.9252 0.791224 36.9621 0.726325 36.9989 0.663006 37.0358 0.601487 37.0726 0.541983 37.1095 0.484697 37.1463 0.429828 37.1832 0.377564 37.22 0.328085 37.2569 0.281561 37.2937 0.23815 37.3306 0.198001 37.3674 0.161251 37.4043 0.128026 37.4412 0.0984388 37.478 0.0725897 37.5149 0.050567 37.5517 0.0324455 37.5886 0.0182868 37.6254 0.00813899 37.6623 0.00203648 37.6991 3.23927e-30 & grace-5.1.23/doc/8.2.dat0000644000076500001440000000002706671062261014203 0ustar fnevgenyusers0 0 1 1 2 2 3 2 4 1 grace-5.1.23/doc/10.1.dat0000644000076500001440000000652306671062261014262 0ustar fnevgenyusers@type xy -9.42478 0.021965 -9.23438 -0.00782556 -9.04398 -0.0392013 -8.85358 -0.0711552 -8.66318 -0.1026 -8.47278 -0.132395 -8.28238 -0.15938 -8.09198 -0.182408 -7.90158 -0.200375 -7.71118 -0.212261 -7.52078 -0.217153 -7.33038 -0.214281 -7.13998 -0.203044 -6.94958 -0.183032 -6.75918 -0.154042 -6.56878 -0.116095 -6.37839 -0.0694373 -6.18799 -0.0145472 -5.99759 0.047875 -5.80719 0.116917 -5.61679 0.191473 -5.42639 0.270267 -5.23599 0.35188 -5.04559 0.434783 -4.85519 0.517377 -4.66479 0.598025 -4.47439 0.675097 -4.28399 0.747009 -4.09359 0.812262 -3.90319 0.86948 -3.71279 0.917447 -3.52239 0.955134 -3.33199 0.981731 -3.14159 0.996662 -2.95119 0.999603 -2.76079 0.990491 -2.57039 0.969522 -2.37999 0.937152 -2.18959 0.894079 -1.9992 0.841229 -1.8088 0.779728 -1.6184 0.710881 -1.428 0.636131 -1.2376 0.557023 -1.0472 0.475173 -0.856798 0.392217 -0.666398 0.309779 -0.475999 0.229427 -0.285599 0.152637 -0.0951998 0.080758 0.0951998 0.0149833 0.285599 -0.0436783 0.475999 -0.0944213 0.666398 -0.136659 0.856798 -0.17003 1.0472 -0.194406 1.2376 -0.20988 1.428 -0.216764 1.6184 -0.21557 1.8088 -0.206987 1.9992 -0.191861 2.18959 -0.171166 2.37999 -0.145968 2.57039 -0.117397 2.76079 -0.0866121 2.95119 -0.0547667 3.14159 -0.0229778 3.33199 0.00770493 3.52239 0.0363259 3.71279 0.0620476 3.90319 0.0841697 4.09359 0.102144 4.28399 0.115583 4.47439 0.124266 4.66479 0.128139 4.85519 0.127304 5.04559 0.122017 5.23599 0.112666 5.42639 0.0997581 5.61679 0.0838944 5.80719 0.0657501 5.99759 0.0460475 6.18799 0.0255318 6.37839 0.00494501 6.56878 -0.0149977 6.75918 -0.0336307 6.94958 -0.0503584 7.13998 -0.0646719 7.33038 -0.0761636 7.52078 -0.0845363 7.71118 -0.0896103 7.90158 -0.0913249 8.09198 -0.0897366 8.28238 -0.0850133 8.47278 -0.0774251 8.66318 -0.0673321 8.85358 -0.0551688 9.04398 -0.0414277 9.23438 -0.0266403 9.42478 -0.011358 & grace-5.1.23/scripts/0000755000076500001440000000000012032153126014112 5ustar fnevgenyusersgrace-5.1.23/scripts/makepatch0000755000076500001440000000013606626627166016023 0ustar fnevgenyusers#!/bin/sh echo -n "" > patch for i in *.orig do diff -u $i `basename $i .orig` >> patch done grace-5.1.23/scripts/makerelease0000755000076500001440000000060110340164670016321 0ustar fnevgenyusers#!/bin/sh PATH=/bin:/usr/bin:/usr/local/bin export PATH make configure cat << EOF > Make.conf .SUFFIXES: O=.o EXE= YACC=bison -y EOF make CHANGES make ChangeLog CDIR=`pwd` CDIR_BNAME=`basename $CDIR` cd src make pars.c cd .. cd doc make all cd .. rm -f Make.conf cd .. tar --exclude \*CVS\* --exclude .cvsignore --exclude autom4te.cache -cvzf ${CDIR_BNAME}.tar.gz $CDIR_BNAME cd - grace-5.1.23/scripts/cvs2cl.pl0000755000076500001440000026050110103656177015665 0ustar fnevgenyusers#!/bin/sh exec perl -w -x $0 ${1+"$@"} # -*- mode: perl; perl-indent-level: 2; -*- #!perl -w ############################################################## ### ### ### cvs2cl.pl: produce ChangeLog(s) from `cvs log` output. ### ### ### ############################################################## ## $Revision: 1.3.2.2 $ ## $Date: 2004/08/03 09:35:59 $ ## $Author: fnevgeny $ ## use strict; use File::Basename qw( fileparse ); use Getopt::Long qw( GetOptions ); use Text::Wrap qw( ); use User::pwent qw( getpwnam ); # The Plan: # # Read in the logs for multiple files, spit out a nice ChangeLog that # mirrors the information entered during `cvs commit'. # # The problem presents some challenges. In an ideal world, we could # detect files with the same author, log message, and checkin time -- # each would be a changelog entry. # We'd sort them; and spit them out. Unfortunately, CVS is *not atomic* # so checkins can span a range of times. Also, the directory structure # could be hierarchical. # # Another question is whether we really want to have the ChangeLog # exactly reflect commits. An author could issue two related commits, # with different log entries, reflecting a single logical change to the # source. GNU style ChangeLogs group these under a single author/date. # We try to do the same. # # So, we parse the output of `cvs log', storing log messages in a # multilevel hash that stores the mapping: # directory => author => time => message => filelist # As we go, we notice "nearby" commit times and store them together # (i.e., under the same timestamp), so they appear in the same log # entry. # # When we've read all the logs, we twist this mapping into # a time => author => message => filelist mapping for each directory. # # If we're not using the `--distributed' flag, the directory is always # considered to be `./', even as descend into subdirectories. # Call Tree # name number of lines (10.xii.03) # parse_options 192 # derive_changelog 13 # +-maybe_grab_accumulation_date 38 # +-read_changelog 277 # +-maybe_read_user_map_file 94 # +-run_ext 9 # +-read_file_path 29 # +-read_symbolic_name 43 # +-read_revision 49 # +-read_date_author_and_state 25 # +-parse_date_author_and_state 20 # +-read_branches 36 # +-output_changelog 424 # +-pretty_file_list 290 # +-common_path_prefix 35 # +-preprocess_msg_text 30 # +-min 1 # +-mywrap 16 # +-last_line_len 5 # +-wrap_log_entry 177 # # Utilities # # xml_escape 6 # slurp_file 11 # debug 5 # version 2 # usage 142 # -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- # # Note about a bug-slash-opportunity: # ----------------------------------- # # There's a bug in Text::Wrap, which affects cvs2cl. This script # reveals it: # # #!/usr/bin/perl -w # # use Text::Wrap; # # my $test_text = # "This script demonstrates a bug in Text::Wrap. The very long line # following this paragraph will be relocated relative to the surrounding # text: # # ==================================================================== # # See? When the bug happens, we'll get the line of equal signs below # this paragraph, even though it should be above."; # # # # Print out the test text with no wrapping: # print "$test_text"; # print "\n"; # print "\n"; # # # Now print it out wrapped, and see the bug: # print wrap ("\t", " ", "$test_text"); # print "\n"; # print "\n"; # # If the line of equal signs were one shorter, then the bug doesn't # happen. Interesting. # # Anyway, rather than fix this in Text::Wrap, we might as well write a # new wrap() which has the following much-needed features: # # * initial indentation, like current Text::Wrap() # * subsequent line indentation, like current Text::Wrap() # * user chooses among: force-break long words, leave them alone, or die()? # * preserve existing indentation: chopped chunks from an indented line # are indented by same (like this line, not counting the asterisk!) # * optional list of things to preserve on line starts, default ">" # # Note that the last two are essentially the same concept, so unify in # implementation and give a good interface to controlling them. # # And how about: # # Optionally, when encounter a line pre-indented by same as previous # line, then strip the newline and refill, but indent by the same. # Yeah... # Globals -------------------------------------------------------------------- # In case we have to print it out: my $VERSION = '$Revision: 1.3.2.2 $'; $VERSION =~ s/\S+\s+(\S+)\s+\S+/$1/; ## Vars set by options: # Print debugging messages? my $Debug = 0; # Just show version and exit? my $Print_Version = 0; # Just print usage message and exit? my $Print_Usage = 0; # What file should we generate (defaults to "ChangeLog")? my $Log_File_Name = "ChangeLog"; # Grab most recent entry date from existing ChangeLog file, just add # to that ChangeLog. my $Cumulative = 0; # `cvs log -d`, this will repeat the last entry in the old log. This is OK, # as it guarantees at least one entry in the update changelog, which means # that there will always be a date to extract for the next update. The repeat # entry can be removed in postprocessing, if necessary. # MJP 2003-08-02 # I don't think this actually does anything useful my $Update = 0; # Expand usernames to email addresses based on a map file? my $User_Map_File = ''; my $User_Passwd_File; my $Mail_Domain; # Output log in chronological order? [default is reverse chronological order] my $Chronological_Order = 0; # Grab user details via gecos my $Gecos = 0; # User domain for gecos email addresses my $Domain; # Output to a file or to stdout? my $Output_To_Stdout = 0; # Eliminate empty log messages? my $Prune_Empty_Msgs = 0; # Tags of which not to output my %ignore_tags; # Show only revisions with Tags my %show_tags; # Don't call Text::Wrap on the body of the message my $No_Wrap = 0; # Indentation of log messages my $Indent = "\t"; # Don't do any pretty print processing my $Summary = 0; # Separates header from log message. Code assumes it is either " " or # "\n\n", so if there's ever an option to set it to something else, # make sure to go through all conditionals that use this var. my $After_Header = " "; # XML Encoding my $XML_Encoding = ''; # Format more for programs than for humans. my $XML_Output = 0; my $No_XML_Namespace = 0; my $No_XML_ISO_Date = 0; # Do some special tweaks for log data that was written in FSF # ChangeLog style. my $FSF_Style = 0; # Show times in UTC instead of local time my $UTC_Times = 0; # Show times in output? my $Show_Times = 1; # Show day of week in output? my $Show_Day_Of_Week = 0; # Show revision numbers in output? my $Show_Revisions = 0; # Show dead files in output? my $Show_Dead = 0; # Hide dead trunk files which were created as a result of additions on a # branch? my $Hide_Branch_Additions = 1; # Show tags (symbolic names) in output? my $Show_Tags = 0; # Show tags separately in output? my $Show_Tag_Dates = 0; # Show branches by symbolic name in output? my $Show_Branches = 0; # Show only revisions on these branches or their ancestors. my @Follow_Branches; # Show only revisions on these branches or their ancestors; ignore descendent # branches. my @Follow_Only; # Don't bother with files matching this regexp. my @Ignore_Files; # How exactly we match entries. We definitely want "o", # and user might add "i" by using --case-insensitive option. my $Case_Insensitive = 0; # Maybe only show log messages matching a certain regular expression. my $Regexp_Gate = ''; # Pass this global option string along to cvs, to the left of `log': my $Global_Opts = ''; # Pass this option string along to the cvs log subcommand: my $Command_Opts = ''; # Read log output from stdin instead of invoking cvs log? my $Input_From_Stdin = 0; # Don't show filenames in output. my $Hide_Filenames = 0; # Don't shorten directory names from filenames. my $Common_Dir = 1; # Max checkin duration. CVS checkin is not atomic, so we may have checkin # times that span a range of time. We assume that checkins will last no # longer than $Max_Checkin_Duration seconds, and that similarly, no # checkins will happen from the same users with the same message less # than $Max_Checkin_Duration seconds apart. my $Max_Checkin_Duration = 180; # What to put at the front of [each] ChangeLog. my $ChangeLog_Header = ''; # Whether to enable 'delta' mode, and for what start/end tags. my $Delta_Mode = 0; my $Delta_From = ''; my $Delta_To = ''; my $TestCode; # Whether to parse filenames from the RCS filename, and if so what # prefix to strip. my $RCS_Root; # Whether to output information on the # of lines added and removed # by each file modification. my $Show_Lines_Modified = 0; ## end vars set by options. # latest observed times for the start/end tags in delta mode my $Delta_StartTime = 0; my $Delta_EndTime = 0; my $No_Ancestors = 0; my $No_Extra_Indent = 0; my $GroupWithinDate = 0; # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::EntrySet; sub new { my $class = shift; my %self; bless \%self, $class; } # ------------------------------------- sub output_changelog { my $output_type = $XML_Output ? 'XML' : 'Text'; my $output_class = "CVS::Utils::ChangeLog::EntrySet::Output::${output_type}"; my $output = $output_class->new(follow_branches => \@Follow_Branches, follow_only => \@Follow_Only, ignore_tags => \%ignore_tags, show_tags => \%show_tags, ); $output->output_changelog(@_); } # ------------------------------------- sub add_fileentry { my ($self, $file_full_path, $time, $revision, $state, $lines, $branch_names, $branch_roots, $branch_numbers, $symbolic_names, $author, $msg_txt) = @_; my $qunk = CVS::Utils::ChangeLog::FileEntry->new($file_full_path, $time, $revision, $state, $lines, $branch_names, $branch_roots, $branch_numbers, $symbolic_names); # We might be including revision numbers and/or tags and/or # branch names in the output. Most of the code from here to # loop-end deals with organizing these in qunk. unless ( $Hide_Branch_Additions and $msg_txt =~ /file .+ was initially added on branch \S+./ ) { # Add this file to the list # (We use many spoonfuls of autovivication magic. Hashes and arrays # will spring into existence if they aren't there already.) &main::debug ("(pushing log msg for ". $qunk->dir_key . $qunk->filename . ")\n"); # Store with the files in this commit. Later we'll loop through # again, making sure that revisions with the same log message # and nearby commit times are grouped together as one commit. $self->{$qunk->dir_key}{$author}{$time}{$msg_txt} = CVS::Utils::ChangeLog::Message->new($msg_txt) unless exists $self->{$qunk->dir_key}{$author}{$time}{$msg_txt}; $self->{$qunk->dir_key}{$author}{$time}{$msg_txt}->add_fileentry($qunk); } } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::EntrySet::Output::Text; use base qw( CVS::Utils::ChangeLog::EntrySet::Output ); use File::Basename qw( fileparse ); sub new { my $class = shift; my $self = $class->SUPER::new(@_); } # ------------------------------------- sub wday { my $self = shift; my $class = ref $self; my ($wday) = @_; return $Show_Day_Of_Week ? ' ' . $class->weekday_en($wday) : ''; } # ------------------------------------- sub header_line { my $self = shift; my ($time, $author, $lastdate) = @_; my $header_line = ''; my (undef,$min,$hour,$mday,$mon,$year,$wday) = $UTC_Times ? gmtime($time) : localtime($time); my $date = $self->fdatetime($time); if ($Show_Times) { $header_line = sprintf "%s %s\n\n", $date, $author; } else { if ( ! defined $lastdate or $date ne $lastdate or ! $GroupWithinDate ) { if ( $GroupWithinDate ) { $header_line = "$date\n\n"; } else { $header_line = "$date $author\n\n"; } } else { $header_line = ''; } } } # ------------------------------------- sub preprocess_msg_text { my $self = shift; my ($text) = @_; $text = $self->SUPER::preprocess_msg_text($text); unless ( $No_Wrap ) { # Strip off lone newlines, but only for lines that don't begin with # whitespace or a mail-quoting character, since we want to preserve # that kind of formatting. Also don't strip newlines that follow a # period; we handle those specially next. And don't strip # newlines that precede an open paren. 1 while $text =~ s/(^|\n)([^>\s].*[^.\n])\n([^>\n])/$1$2 $3/g; # If a newline follows a period, make sure that when we bring up the # bottom sentence, it begins with two spaces. 1 while $text =~ s/(^|\n)([^>\s].*)\n([^>\n])/$1$2 $3/g; } return $text; } # ------------------------------------- # Here we take a bunch of qunks and convert them into printed # summary that will include all the information the user asked for. sub pretty_file_list { my $self = shift; return '' if $Hide_Filenames; my $qunksref = shift; my @filenames; my $beauty = ''; # The accumulating header string for this entry. my %non_unanimous_tags; # Tags found in a proper subset of qunks my %unanimous_tags; # Tags found in all qunks my %all_branches; # Branches found in any qunk my $fbegun = 0; # Did we begin printing filenames yet? my ($common_dir, $qunkrefs) = $self->_pretty_file_list(\(%unanimous_tags, %non_unanimous_tags, %all_branches), $qunksref); my @qunkrefs = @$qunkrefs; # Not XML output, so complexly compactify for chordate consumption. At this # point we have enough global information about all the qunks to organize # them non-redundantly for output. if ($common_dir) { # Note that $common_dir still has its trailing slash $beauty .= "$common_dir: "; } if ($Show_Branches) { # For trailing revision numbers. my @brevisions; foreach my $branch (keys (%all_branches)) { foreach my $qunkref (@qunkrefs) { if ((defined ($qunkref->branch)) and ($qunkref->branch eq $branch)) { if ($fbegun) { # kff todo: comma-delimited in XML too? Sure. $beauty .= ", "; } else { $fbegun = 1; } my $fname = substr ($qunkref->filename, length ($common_dir)); $beauty .= $fname; $qunkref->{'printed'} = 1; # Just setting a mark bit, basically if ( $Show_Tags and defined $qunkref->tags ) { my @tags = grep ($non_unanimous_tags{$_}, @{$qunkref->tags}); if (@tags) { $beauty .= " (tags: "; $beauty .= join (', ', @tags); $beauty .= ")"; } } if ($Show_Revisions) { # Collect the revision numbers' last components, but don't # print them -- they'll get printed with the branch name # later. $qunkref->revision =~ /.+\.([\d]+)$/; push (@brevisions, $1); # todo: we're still collecting branch roots, but we're not # showing them anywhere. If we do show them, it would be # nifty to just call them revision "0" on a the branch. # Yeah, that's the ticket. } } } $beauty .= " ($branch"; if (@brevisions) { if ((scalar (@brevisions)) > 1) { $beauty .= ".["; $beauty .= (join (',', @brevisions)); $beauty .= "]"; } else { # Square brackets are spurious here, since there's no range to # encapsulate $beauty .= ".$brevisions[0]"; } } $beauty .= ")"; } } # Okay; any qunks that were done according to branch are taken care # of, and marked as printed. Now print everyone else. my %fileinfo_printed; foreach my $qunkref (@qunkrefs) { next if (defined ($qunkref->{'printed'})); # skip if already printed my $b = substr ($qunkref->filename, length ($common_dir)); # todo: Shlomo's change was this: # $beauty .= substr ($qunkref->filename, # (($common_dir eq "./") ? '' : length ($common_dir))); $qunkref->{'printed'} = 1; # Set a mark bit. if ($Show_Revisions || $Show_Tags || $Show_Dead) { my $started_addendum = 0; if ($Show_Revisions) { $started_addendum = 1; $b .= " ("; $b .= $qunkref->revision; } if ($Show_Dead && $qunkref->state =~ /dead/) { # Deliberately not using $started_addendum. Keeping it simple. $b .= "[DEAD]"; } if ($Show_Tags && (defined $qunkref->tags)) { my @tags = grep ($non_unanimous_tags{$_}, @{$qunkref->tags}); if ((scalar (@tags)) > 0) { if ($started_addendum) { $b .= ", "; } else { $b .= " (tags: "; } $b .= join (', ', @tags); $started_addendum = 1; } } if ($started_addendum) { $b .= ")"; } } unless ( exists $fileinfo_printed{$b} ) { if ($fbegun) { $beauty .= ", "; } else { $fbegun = 1; } $beauty .= $b, $fileinfo_printed{$b} = 1; } } # Unanimous tags always come last. if ($Show_Tags && %unanimous_tags) { $beauty .= " (utags: "; $beauty .= join (', ', sort keys (%unanimous_tags)); $beauty .= ")"; } # todo: still have to take care of branch_roots? $beauty = "$beauty:"; return $beauty; } # ------------------------------------- sub output_tagdate { my $self = shift; my ($fh, $time, $tag) = @_; my $fdatetime = $self->fdatetime($time); print $fh "$fdatetime tag $tag\n\n"; return; } # ------------------------------------- sub format_body { my $self = shift; my ($msg, $files, $qunklist) = @_; my $body; if ( $No_Wrap and ! $Summary ) { $msg = $self->preprocess_msg_text($msg); $files = $self->mywrap("\t", "\t ", "* $files"); $msg =~ s/\n(.+)/\n$Indent$1/g; unless ($After_Header eq " ") { $msg =~ s/^(.+)/$Indent$1/g; } if ( $Hide_Filenames ) { $body = $After_Header . $msg; } else { $body = $files . $After_Header . $msg; } } elsif ( $Summary ) { my ($filelist, $qunk); my (@DeletedQunks, @AddedQunks, @ChangedQunks); $msg = $self->preprocess_msg_text($msg); # # Sort the files (qunks) according to the operation that was # performed. Files which were added have no line change # indicator, whereas deleted files have state dead. # foreach $qunk ( @$qunklist ) { if ( "dead" eq $qunk->state) { push @DeletedQunks, $qunk; } elsif ( ! defined $qunk->lines ) { push @AddedQunks, $qunk; } else { push @ChangedQunks, $qunk; } } # # The qunks list was originally in tree search order. Let's # get that back. The lists, if they exist, will be reversed upon # processing. # # # Now write the three sections onto $filelist # if ( @DeletedQunks ) { $filelist .= "\tDeleted:\n"; foreach $qunk ( @DeletedQunks ) { $filelist .= "\t\t" . $qunk->filename; $filelist .= " (" . $qunk->revision . ")"; $filelist .= "\n"; } undef @DeletedQunks; } if ( @AddedQunks ) { $filelist .= "\tAdded:\n"; foreach $qunk (@AddedQunks) { $filelist .= "\t\t" . $qunk->filename; $filelist .= " (" . $qunk->revision . ")"; $filelist .= "\n"; } undef @AddedQunks ; } if ( @ChangedQunks ) { $filelist .= "\tChanged:\n"; foreach $qunk (@ChangedQunks) { $filelist .= "\t\t" . $qunk->filename; $filelist .= " (" . $qunk->revision . ")"; $filelist .= ", \"" . $qunk->state . "\""; $filelist .= ", lines: " . $qunk->lines; $filelist .= "\n"; } undef @ChangedQunks; } chomp $filelist; if ( $Hide_Filenames ) { $filelist = ''; } $msg =~ s/\n(.*)/\n$Indent$1/g; unless ( $After_Header eq " " or $FSF_Style ) { $msg =~ s/^(.*)/$Indent$1/g; } unless ( $No_Wrap ) { if ( $FSF_Style ) { $msg = $self->wrap_log_entry($msg, '', 69, 69); chomp($msg); chomp($msg); } else { $msg = $self->mywrap('', $Indent, "$msg"); $msg =~ s/[ \t]+\n/\n/g; } } $body = $filelist . $After_Header . $msg; } else { # do wrapping, either FSF-style or regular my $latter_wrap = $No_Extra_Indent ? $Indent : "$Indent "; if ( $FSF_Style ) { $files = $self->mywrap($Indent, $latter_wrap, "* $files"); my $files_last_line_len = 0; if ( $After_Header eq " " ) { $files_last_line_len = $self->last_line_len($files); $files_last_line_len += 1; # for $After_Header } $msg = $self->wrap_log_entry($msg, $latter_wrap, 69-$files_last_line_len, 69); $body = $files . $After_Header . $msg; } else { # not FSF-style $msg = $self->preprocess_msg_text($msg); $body = $files . $After_Header . $msg; $body = $self->mywrap($Indent, $latter_wrap, "* $body"); $body =~ s/[ \t]+\n/\n/g; } } return $body; } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::EntrySet::Output::XML; use base qw( CVS::Utils::ChangeLog::EntrySet::Output ); use File::Basename qw( fileparse ); sub new { my $class = shift; my $self = $class->SUPER::new(@_); } # ------------------------------------- sub header_line { my $self = shift; my ($time, $author, $lastdate) = @_; my $header_line = ''; my $isoDate; my ($y, $m, $d, $H, $M, $S) = (gmtime($time))[5,4,3,2,1,0]; # Ideally, this would honor $UTC_Times and use +HH:MM syntax $isoDate = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $y + 1900, $m + 1, $d, $H, $M, $S); my (undef,$min,$hour,$mday,$mon,$year,$wday) = $UTC_Times ? gmtime($time) : localtime($time); my $date = $self->fdatetime($time); $wday = $self->wday($wday); $header_line = sprintf ("%4u-%02u-%02u\n${wday}\n", $year+1900, $mon+1, $mday, $hour, $min); $header_line .= "$isoDate\n" unless $No_XML_ISO_Date; $header_line .= sprintf("%s\n" , $author); } # ------------------------------------- sub wday { my $self = shift; my $class = ref $self; my ($wday) = @_; return '' . $class->weekday_en($wday) . "\n"; } # ------------------------------------- sub escape { my $self = shift; my $txt = shift; $txt =~ s/&/&/g; $txt =~ s//>/g; return $txt; } # ------------------------------------- sub output_header { my $self = shift; my ($fh) = @_; my $encoding = length $XML_Encoding ? qq'encoding="$XML_Encoding"' : ''; my $version = 'version="1.0"'; my $declaration = sprintf '', join ' ', grep length, $version, $encoding; my $root = $No_XML_Namespace ? '' : ''; print $fh "$declaration\n\n$root\n\n"; } # ------------------------------------- sub output_footer { my $self = shift; my ($fh) = @_; print $fh "\n"; } # ------------------------------------- sub preprocess_msg_text { my $self = shift; my ($text) = @_; $text = $self->SUPER::preprocess_msg_text($text); $text = $self->escape($text); chomp $text; $text = "${text}\n"; return $text; } # ------------------------------------- # Here we take a bunch of qunks and convert them into a printed # summary that will include all the information the user asked for. sub pretty_file_list { my $self = shift; my ($qunksref) = @_; my $beauty = ''; # The accumulating header string for this entry. my %non_unanimous_tags; # Tags found in a proper subset of qunks my %unanimous_tags; # Tags found in all qunks my %all_branches; # Branches found in any qunk my $fbegun = 0; # Did we begin printing filenames yet? my ($common_dir, $qunkrefs) = $self->_pretty_file_list(\(%unanimous_tags, %non_unanimous_tags, %all_branches), $qunksref); my @qunkrefs = @$qunkrefs; # If outputting XML, then our task is pretty simple, because we # don't have to detect common dir, common tags, branch prefixing, # etc. We just output exactly what we have, and don't worry about # redundancy or readability. foreach my $qunkref (@qunkrefs) { my $filename = $qunkref->filename; my $state = $qunkref->state; my $revision = $qunkref->revision; my $tags = $qunkref->tags; my $branch = $qunkref->branch; my $branchroots = $qunkref->roots; my $lines = $qunkref->lines; $filename = $self->escape($filename); # probably paranoia $revision = $self->escape($revision); # definitely paranoia $beauty .= "\n"; $beauty .= "${filename}\n"; $beauty .= "${state}\n"; $beauty .= "${revision}\n"; if ($Show_Lines_Modified && $lines && $lines =~ m/\+(\d+)\s+-(\d+)/) { $beauty .= "$1\n"; $beauty .= "$2\n"; } if ($branch) { $branch = $self->escape($branch); # more paranoia $beauty .= "${branch}\n"; } foreach my $tag (@$tags) { $tag = $self->escape($tag); # by now you're used to the paranoia $beauty .= "${tag}\n"; } foreach my $root (@$branchroots) { $root = $self->escape($root); # which is good, because it will continue $beauty .= "${root}\n"; } $beauty .= "\n"; } # Theoretically, we could go home now. But as long as we're here, # let's print out the common_dir and utags, as a convenience to # the receiver (after all, earlier code calculated that stuff # anyway, so we might as well take advantage of it). if ((scalar (keys (%unanimous_tags))) > 1) { foreach my $utag ((keys (%unanimous_tags))) { $utag = $self->escape($utag); # the usual paranoia $beauty .= "${utag}\n"; } } if ($common_dir) { $common_dir = $self->escape($common_dir); $beauty .= "${common_dir}\n"; } # That's enough for XML, time to go home: return $beauty; } # ------------------------------------- sub output_tagdate { # NOT YET DONE } # ------------------------------------- sub output_entry { my $self = shift; my ($fh, $entry) = @_; print $fh "\n$entry\n\n"; } # ------------------------------------- sub format_body { my $self = shift; my ($msg, $files, $qunklist) = @_; $msg = $self->preprocess_msg_text($msg); return $files . $msg; } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::EntrySet::Output; use Carp qw( croak ); use File::Basename qw( fileparse ); # Class Utility Functions ------------- { # form closure my @weekdays = (qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)); sub weekday_en { my $class = shift; return $weekdays[$_[0]]; } } # ------------------------------------- sub new { my ($proto, %args) = @_; my $class = ref $proto || $proto; my $follow_branches = delete $args{follow_branches}; my $follow_only = delete $args{follow_only}; my $ignore_tags = delete $args{ignore_tags}; my $show_tags = delete $args{show_tags}; die "Unrecognized arg to EntrySet::Output::new: '$_'\n" for keys %args; bless +{follow_branches => $follow_branches, follow_only => $follow_only, show_tags => $show_tags, ignore_tags => $ignore_tags, }, $class; } # Abstract Subrs ---------------------- sub wday { croak "Whoops. Abtract method call (wday).\n" } sub pretty_file_list { croak "Whoops. Abtract method call (pretty_file_list).\n" } sub output_tagdate { croak "Whoops. Abtract method call (output_tagdate).\n" } sub header_line { croak "Whoops. Abtract method call (header_line).\n" } # Instance Subrs ---------------------- sub output_header { } # ------------------------------------- sub output_entry { my $self = shift; my ($fh, $entry) = @_; print $fh "$entry\n"; } # ------------------------------------- sub output_footer { } # ------------------------------------- sub escape { return $_[1] } # ------------------------------------- sub _revision_is_wanted { my ($self, $qunk) = @_; my ($revision, $branch_numbers) = @{$qunk}{qw( revision branch_numbers )}; my $follow_branches = $self->{follow_branches}; my $follow_only = $self->{follow_only}; #print STDERR "IG: ", join(',', keys %{$self->{ignore_tags}}), "\n"; #print STDERR "IX: ", join(',', @{$qunk->{tags}}), "\n" if defined $qunk->{tags}; #print STDERR "IQ: ", join(',', keys %{$qunk->{branch_numbers}}), "\n" if defined $qunk->{branch_numbers}; #use Data::Dumper; print STDERR Dumper $qunk; for my $ignore_tag (keys %{$self->{ignore_tags}}) { return if defined $qunk->{tags} and grep $_ eq $ignore_tag, @{$qunk->{tags}}; } if ( keys %{$self->{show_tags}} ) { for my $show_tag (keys %{$self->{show_tags}}) { return if ! defined $qunk->{tags} or ! grep $_ eq $show_tag, @{$qunk->{tags}}; } } return 1 unless @$follow_branches + @$follow_only; # no follow is follow all for my $x (map([$_, 1], @$follow_branches), map([$_, 0], @$follow_only )) { my ($branch, $followsub) = @$x; # Special case for following trunk revisions return 1 if $branch =~ /^trunk$/i and $revision =~ /^[0-9]+\.[0-9]+$/; if ( my $branch_number = $branch_numbers->{$branch} ) { # Are we on one of the follow branches or an ancestor of same? # If this revision is a prefix of the branch number, or possibly is less # in the minormost number, OR if this branch number is a prefix of the # revision, then yes. Otherwise, no. # So below, we determine if any of those conditions are met. # Trivial case: is this revision on the branch? (Compare this way to # avoid regexps that screw up Emacs indentation, argh.) if ( substr($revision, 0, (length($branch_number) + 1)) eq ($branch_number . ".") ) { if ( $followsub ) { return 1; } elsif (length($revision) == length($branch_number)+2 ) { return 1; } } elsif ( length($branch_number) > length($revision) and $No_Ancestors ) { # Non-trivial case: check if rev is ancestral to branch # r_left still has the trailing "." my ($r_left, $r_end) = ($revision =~ /^((?:\d+\.)+)(\d+)$/); # b_left still has trailing "." # b_mid has no trailing "." my ($b_left, $b_mid) = ($branch_number =~ /^((?:\d+\.)+)(\d+)\.\d+$/); return 1 if $r_left eq $b_left and $r_end <= $b_mid; } } } return; } # ------------------------------------- sub output_changelog { my $self = shift; my $class = ref $self; my ($grand_poobah) = @_; ### Process each ChangeLog while (my ($dir,$authorhash) = each %$grand_poobah) { &main::debug ("DOING DIR: $dir\n"); # Here we twist our hash around, from being # author => time => message => filelist # in %$authorhash to # time => author => message => filelist # in %changelog. # # This is also where we merge entries. The algorithm proceeds # through the timeline of the changelog with a sliding window of # $Max_Checkin_Duration seconds; within that window, entries that # have the same log message are merged. # # (To save space, we zap %$authorhash after we've copied # everything out of it.) my %changelog; while (my ($author,$timehash) = each %$authorhash) { my %stamptime; foreach my $time (sort {$a <=> $b} (keys %$timehash)) { my $msghash = $timehash->{$time}; while (my ($msg,$qunklist) = each %$msghash) { my $stamptime = $stamptime{$msg}; if ((defined $stamptime) and (($time - $stamptime) < $Max_Checkin_Duration) and (defined $changelog{$stamptime}{$author}{$msg})) { push(@{$changelog{$stamptime}{$author}{$msg}}, $qunklist->files); } else { $changelog{$time}{$author}{$msg} = $qunklist->files; $stamptime{$msg} = $time; } } } } undef (%$authorhash); ### Now we can write out the ChangeLog! my ($logfile_here, $logfile_bak, $tmpfile); my $lastdate; if (! $Output_To_Stdout) { $logfile_here = $dir . $Log_File_Name; $logfile_here =~ s/^\.\/\//\//; # fix any leading ".//" problem $tmpfile = "${logfile_here}.cvs2cl$$.tmp"; $logfile_bak = "${logfile_here}.bak"; open (LOG_OUT, ">$tmpfile") or die "Unable to open \"$tmpfile\""; } else { open (LOG_OUT, ">-") or die "Unable to open stdout for writing"; } print LOG_OUT $ChangeLog_Header; my %tag_date_printed; $self->output_header(\*LOG_OUT); my @key_list = (); if($Chronological_Order) { @key_list = sort {$a <=> $b} (keys %changelog); } else { @key_list = sort {$b <=> $a} (keys %changelog); } foreach my $time (@key_list) { next if ($Delta_Mode && (($time <= $Delta_StartTime) || ($time > $Delta_EndTime && $Delta_EndTime))); # Set up the date/author line. # kff todo: do some more XML munging here, on the header # part of the entry: my (undef,$min,$hour,$mday,$mon,$year,$wday) = $UTC_Times ? gmtime($time) : localtime($time); $wday = $self->wday($wday); # XML output includes everything else, we might as well make # it always include Day Of Week too, for consistency. my $authorhash = $changelog{$time}; if ($Show_Tag_Dates) { my %tags; while (my ($author,$mesghash) = each %$authorhash) { while (my ($msg,$qunk) = each %$mesghash) { foreach my $qunkref2 (@$qunk) { if (defined ($qunkref2->tags)) { foreach my $tag (@{$qunkref2->tags}) { $tags{$tag} = 1; } } } } } # Sort here for determinism to ease testing foreach my $tag (sort keys %tags) { if ( ! defined $tag_date_printed{$tag} ) { $tag_date_printed{$tag} = $time; $self->output_tagdate(\*LOG_OUT, $time, $tag); } } } while (my ($author,$mesghash) = each %$authorhash) { # If XML, escape in outer loop to avoid compound quoting: $author = $self->escape($author); FOOBIE: # We sort here to enable predictable ordering for the testing porpoises for my $msg (sort keys %$mesghash) { my $qunklist = $mesghash->{$msg}; my @qunklist = grep $self->_revision_is_wanted($_), @$qunklist; next FOOBIE unless @qunklist; my $files = $self->pretty_file_list(\@qunklist); my $header_line; # date and author my $wholething; # $header_line + $body my $date = $self->fdatetime($time); $header_line = $self->header_line($time, $author, $lastdate); $lastdate = $date; $Text::Wrap::huge = 'overflow' if $Text::Wrap::VERSION >= 2001.0130; # Reshape the body according to user preferences. my $body = $self->format_body($msg, $files, \@qunklist); $body =~ s/[ \t]+\n/\n/g; $wholething = $header_line . $body; # One last check: make sure it passes the regexp test, if the # user asked for that. We have to do it here, so that the # test can match against information in the header as well # as in the text of the log message. # How annoying to duplicate so much code just because I # can't figure out a way to evaluate scalars on the trailing # operator portion of a regular expression. Grrr. if ($Case_Insensitive) { unless ( $Regexp_Gate and ( $wholething !~ /$Regexp_Gate/oi ) ) { $self->output_entry(\*LOG_OUT, $wholething); } } else { unless ( $Regexp_Gate and ( $wholething !~ /$Regexp_Gate/o ) ) { $self->output_entry(\*LOG_OUT, $wholething); } } } } } $self->output_footer(\*LOG_OUT); close (LOG_OUT); if ( ! $Output_To_Stdout ) { # If accumulating, append old data to new before renaming. But # don't append the most recent entry, since it's already in the # new log due to CVS's idiosyncratic interpretation of "log -d". if ($Cumulative && -f $logfile_here) { open NEW_LOG, ">>$tmpfile" or die "trouble appending to $tmpfile ($!)"; open OLD_LOG, "<$logfile_here" or die "trouble reading from $logfile_here ($!)"; my $started_first_entry = 0; my $passed_first_entry = 0; while () { if ( ! $passed_first_entry ) { if ( ( ! $started_first_entry ) and /^(\d\d\d\d-\d\d-\d\d\s+\d\d:\d\d)/ ) { $started_first_entry = 1; } elsif ( /^(\d\d\d\d-\d\d-\d\d\s+\d\d:\d\d)/ ) { $passed_first_entry = 1; print NEW_LOG $_; } } else { print NEW_LOG $_; } } close NEW_LOG; close OLD_LOG; } if ( -f $logfile_here ) { rename $logfile_here, $logfile_bak; } rename $tmpfile, $logfile_here; } } } # ------------------------------------- # Don't call this wrap, because with 5.5.3, that clashes with the # (unconditional :-( ) export of wrap() from Text::Wrap sub mywrap { my $self = shift; my ($indent1, $indent2, @text) = @_; # If incoming text looks preformatted, don't get clever my $text = Text::Wrap::wrap($indent1, $indent2, @text); if ( grep /^\s+/m, @text ) { return $text; } my @lines = split /\n/, $text; $indent2 =~ s!^((?: {8})+)!"\t" x (length($1)/8)!e; $lines[0] =~ s/^$indent1\s+/$indent1/; s/^$indent2\s+/$indent2/ for @lines[1..$#lines]; my $newtext = join "\n", @lines; $newtext .= "\n" if substr($text, -1) eq "\n"; return $newtext; } # ------------------------------------- sub preprocess_msg_text { my $self = shift; my ($text) = @_; # Strip out carriage returns (as they probably result from DOSsy editors). $text =~ s/\r\n/\n/g; # If it *looks* like two newlines, make it *be* two newlines: $text =~ s/\n\s*\n/\n\n/g; return $text; } # ------------------------------------- sub last_line_len { my $self = shift; my $files_list = shift; my @lines = split (/\n/, $files_list); my $last_line = pop (@lines); return length ($last_line); } # ------------------------------------- # A custom wrap function, sensitive to some common constructs used in # log entries. sub wrap_log_entry { my $self = shift; my $text = shift; # The text to wrap. my $left_pad_str = shift; # String to pad with on the left. # These do NOT take left_pad_str into account: my $length_remaining = shift; # Amount left on current line. my $max_line_length = shift; # Amount left for a blank line. my $wrapped_text = ''; # The accumulating wrapped entry. my $user_indent = ''; # Inherited user_indent from prev line. my $first_time = 1; # First iteration of the loop? my $suppress_line_start_match = 0; # Set to disable line start checks. my @lines = split (/\n/, $text); while (@lines) # Don't use `foreach' here, it won't work. { my $this_line = shift (@lines); chomp $this_line; if ($this_line =~ /^(\s+)/) { $user_indent = $1; } else { $user_indent = ''; } # If it matches any of the line-start regexps, print a newline now... if ($suppress_line_start_match) { $suppress_line_start_match = 0; } elsif (($this_line =~ /^(\s*)\*\s+[a-zA-Z0-9]/) || ($this_line =~ /^(\s*)\* [a-zA-Z0-9_\.\/\+-]+/) || ($this_line =~ /^(\s*)\([a-zA-Z0-9_\.\/\+-]+(\)|,\s*)/) || ($this_line =~ /^(\s+)(\S+)/) || ($this_line =~ /^(\s*)- +/) || ($this_line =~ /^()\s*$/) || ($this_line =~ /^(\s*)\*\) +/) || ($this_line =~ /^(\s*)[a-zA-Z0-9](\)|\.|\:) +/)) { # Make a line break immediately, unless header separator is set # and this line is the first line in the entry, in which case # we're getting the blank line for free already and shouldn't # add an extra one. unless (($After_Header ne " ") and ($first_time)) { if ($this_line =~ /^()\s*$/) { $suppress_line_start_match = 1; $wrapped_text .= "\n${left_pad_str}"; } $wrapped_text .= "\n${left_pad_str}"; } $length_remaining = $max_line_length - (length ($user_indent)); } # Now that any user_indent has been preserved, strip off leading # whitespace, so up-folding has no ugly side-effects. $this_line =~ s/^\s*//; # Accumulate the line, and adjust parameters for next line. my $this_len = length ($this_line); if ($this_len == 0) { # Blank lines should cancel any user_indent level. $user_indent = ''; $length_remaining = $max_line_length; } elsif ($this_len >= $length_remaining) # Line too long, try breaking it. { # Walk backwards from the end. At first acceptable spot, break # a new line. my $idx = $length_remaining - 1; if ($idx < 0) { $idx = 0 }; while ($idx > 0) { if (substr ($this_line, $idx, 1) =~ /\s/) { my $line_now = substr ($this_line, 0, $idx); my $next_line = substr ($this_line, $idx); $this_line = $line_now; # Clean whitespace off the end. chomp $this_line; # The current line is ready to be printed. $this_line .= "\n${left_pad_str}"; # Make sure the next line is allowed full room. $length_remaining = $max_line_length - (length ($user_indent)); # Strip next_line, but then preserve any user_indent. $next_line =~ s/^\s*//; # Sneak a peek at the user_indent of the upcoming line, so # $next_line (which will now precede it) can inherit that # indent level. Otherwise, use whatever user_indent level # we currently have, which might be none. my $next_next_line = shift (@lines); if ((defined ($next_next_line)) && ($next_next_line =~ /^(\s+)/)) { $next_line = $1 . $next_line if (defined ($1)); # $length_remaining = $max_line_length - (length ($1)); $next_next_line =~ s/^\s*//; } else { $next_line = $user_indent . $next_line; } if (defined ($next_next_line)) { unshift (@lines, $next_next_line); } unshift (@lines, $next_line); # Our new next line might, coincidentally, begin with one of # the line-start regexps, so we temporarily turn off # sensitivity to that until we're past the line. $suppress_line_start_match = 1; last; } else { $idx--; } } if ($idx == 0) { # We bottomed out because the line is longer than the # available space. But that could be because the space is # small, or because the line is longer than even the maximum # possible space. Handle both cases below. if ($length_remaining == ($max_line_length - (length ($user_indent)))) { # The line is simply too long -- there is no hope of ever # breaking it nicely, so just insert it verbatim, with # appropriate padding. $this_line = "\n${left_pad_str}${this_line}"; } else { # Can't break it here, but may be able to on the next round... unshift (@lines, $this_line); $length_remaining = $max_line_length - (length ($user_indent)); $this_line = "\n${left_pad_str}"; } } } else # $this_len < $length_remaining, so tack on what we can. { # Leave a note for the next iteration. $length_remaining = $length_remaining - $this_len; if ($this_line =~ /\.$/) { $this_line .= " "; $length_remaining -= 2; } else # not a sentence end { $this_line .= " "; $length_remaining -= 1; } } # Unconditionally indicate that loop has run at least once. $first_time = 0; $wrapped_text .= "${user_indent}${this_line}"; } # One last bit of padding. $wrapped_text .= "\n"; return $wrapped_text; } # ------------------------------------- sub _pretty_file_list { my $self = shift; my ($unanimous_tags, $non_unanimous_tags, $all_branches, $qunksref) = @_; my @qunkrefs = grep +( ( ! $_->tags_exists or ! grep exists $ignore_tags{$_}, @{$_->tags}) and ( ! keys %show_tags or ( $_->tags_exists and grep exists $show_tags{$_}, @{$_->tags} ) ) ), @$qunksref; my $common_dir; # Dir prefix common to all files ('' if none) # First, loop over the qunks gathering all the tag/branch names. # We'll put them all in non_unanimous_tags, and take out the # unanimous ones later. QUNKREF: foreach my $qunkref (@qunkrefs) { # Keep track of whether all the files in this commit were in the # same directory, and memorize it if so. We can make the output a # little more compact by mentioning the directory only once. if ($Common_Dir && (scalar (@qunkrefs)) > 1) { if (! (defined ($common_dir))) { my ($base, $dir); ($base, $dir, undef) = fileparse ($qunkref->filename); if ((! (defined ($dir))) # this first case is sheer paranoia or ($dir eq '') or ($dir eq "./") or ($dir eq ".\\")) { $common_dir = ''; } else { $common_dir = $dir; } } elsif ($common_dir ne '') { # Already have a common dir prefix, so how much of it can we preserve? $common_dir = &main::common_path_prefix ($qunkref->filename, $common_dir); } } else # only one file in this entry anyway, so common dir not an issue { $common_dir = ''; } if (defined ($qunkref->branch)) { $all_branches->{$qunkref->branch} = 1; } if (defined ($qunkref->tags)) { foreach my $tag (@{$qunkref->tags}) { $non_unanimous_tags->{$tag} = 1; } } } # Any tag held by all qunks will be printed specially... but only if # there are multiple qunks in the first place! if ((scalar (@qunkrefs)) > 1) { foreach my $tag (keys (%$non_unanimous_tags)) { my $everyone_has_this_tag = 1; foreach my $qunkref (@qunkrefs) { if ((! (defined ($qunkref->tags))) or (! (grep ($_ eq $tag, @{$qunkref->tags})))) { $everyone_has_this_tag = 0; } } if ($everyone_has_this_tag) { $unanimous_tags->{$tag} = 1; delete $non_unanimous_tags->{$tag}; } } } return $common_dir, \@qunkrefs; } # ------------------------------------- sub fdatetime { my $self = shift; my ($year, $mday, $mon, $wday, $hour, $min); if ( @_ > 1 ) { ($year, $mday, $mon, $wday, $hour, $min) = @_; } else { my ($time) = @_; (undef, $min, $hour, $mday, $mon, $year, $wday) = $UTC_Times ? gmtime($time) : localtime($time); $year += 1900; $mon += 1; $wday = $self->wday($wday); } my $fdate = $self->fdate($year, $mon, $mday, $wday); if ($Show_Times) { my $ftime = $self->ftime($hour, $min); return "$fdate $ftime"; } else { return $fdate; } } # ------------------------------------- sub fdate { my $self = shift; my ($year, $mday, $mon, $wday); if ( @_ > 1 ) { ($year, $mon, $mday, $wday) = @_; } else { my ($time) = @_; (undef, undef, undef, $mday, $mon, $year, $wday) = $UTC_Times ? gmtime($time) : localtime($time); $year += 1900; $mon += 1; $wday = $self->wday($wday); } return sprintf '%4u-%02u-%02u%s', $year, $mon, $mday, $wday; } # ------------------------------------- sub ftime { my $self = shift; my ($hour, $min); if ( @_ > 1 ) { ($hour, $min) = @_; } else { my ($time) = @_; (undef, $min, $hour) = $UTC_Times ? gmtime($time) : localtime($time); } return sprintf '%02u:%02u', $hour, $min; } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::Message; sub new { my $class = shift; my ($msg) = @_; my %self = (msg => $msg, files => []); bless \%self, $class; } sub add_fileentry { my $self = shift; my ($fileentry) = @_; die "Not a fileentry: $fileentry" unless $fileentry->isa('CVS::Utils::ChangeLog::FileEntry'); push @{$self->{files}}, $fileentry; } sub files { wantarray ? @{$_[0]->{files}} : $_[0]->{files} } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::FileEntry; use File::Basename qw( fileparse ); # Each revision of a file has a little data structure (a `qunk') # associated with it. That data structure holds not only the # file's name, but any additional information about the file # that might be needed in the output, such as the revision # number, tags, branches, etc. The reason to have these things # arranged in a data structure, instead of just appending them # textually to the file's name, is that we may want to do a # little rearranging later as we write the output. For example, # all the files on a given tag/branch will go together, followed # by the tag in parentheses (so trunk or otherwise non-tagged # files would go at the end of the file list for a given log # message). This rearrangement is a lot easier to do if we # don't have to reparse the text. # # A qunk looks like this: # # { # filename => "hello.c", # revision => "1.4.3.2", # time => a timegm() return value (moment of commit) # tags => [ "tag1", "tag2", ... ], # branch => "branchname" # There should be only one, right? # roots => [ "branchtag1", "branchtag2", ... ] # lines => "+x -y" # or undefined; x and y are integers # } # Single top-level ChangeLog, or one per subdirectory? my $distributed; sub distributed { $#_ ? ($distributed = $_[1]) : $distributed; } sub new { my $class = shift; my ($path, $time, $revision, $state, $lines, $branch_names, $branch_roots, $branch_numbers, $symbolic_names) = @_; my %self = (time => $time, revision => $revision, state => $state, lines => $lines, branch_numbers => $branch_numbers, ); if ( $distributed ) { @self{qw(filename dir_key)} = fileparse($path); } else { @self{qw(filename dir_key)} = ($path, './'); } { # Scope for $branch_prefix (my ($branch_prefix) = ($revision =~ /((?:\d+\.)+)\d+/)); $branch_prefix =~ s/\.$//; if ( $branch_names->{$branch_prefix} ) { my $branch_name = $branch_names->{$branch_prefix}; $self{branch} = $branch_name; $self{branches} = [$branch_name]; } while ( $branch_prefix =~ s/^(\d+(?:\.\d+\.\d+)+)\.\d+\.\d+$/$1/ ) { push @{$self{branches}}, $branch_names->{$branch_prefix} if exists $branch_names->{$branch_prefix}; } } # If there's anything in the @branch_roots array, then this # revision is the root of at least one branch. We'll display # them as branch names instead of revision numbers, the # substitution for which is done directly in the array: $self{'roots'} = [ map { $branch_names->{$_} } @$branch_roots ] if @$branch_roots; if ( exists $symbolic_names->{$revision} ) { $self{tags} = delete $symbolic_names->{$revision}; &main::delta_check($time, $self{tags}); } bless \%self, $class; } sub filename { $_[0]->{filename} } sub dir_key { $_[0]->{dir_key} } sub revision { $_[0]->{revision} } sub branch { $_[0]->{branch} } sub state { $_[0]->{state} } sub lines { $_[0]->{lines} } sub roots { $_[0]->{roots} } sub branch_numbers { $_[0]->{branch_numbers} } sub tags { $_[0]->{tags} } sub tags_exists { exists $_[0]->{tags}; } # This may someday be used in a more sophisticated calculation of what other # files are involved in this commit. For now, we don't use it much except for # delta mode, because the common-commit-detection algorithm is hypothesized to # be "good enough" as it stands. sub time { $_[0]->{time} } # ---------------------------------------------------------------------------- package CVS::Utils::ChangeLog::EntrySetBuilder; use File::Basename qw( fileparse ); use Time::Local qw( timegm ); use constant MAILNAME => "/etc/mailname"; # In 'cvs log' output, one long unbroken line of equal signs separates files: use constant FILE_SEPARATOR => '=' x 77;# . "\n"; # In 'cvs log' output, a shorter line of dashes separates log messages within # a file: use constant REV_SEPARATOR => '-' x 28;# . "\n"; use constant EMPTY_LOG_MESSAGE => '*** empty log message ***'; # ------------------------------------- sub new { my ($proto) = @_; my $class = ref $proto || $proto; my $poobah = CVS::Utils::ChangeLog::EntrySet->new; my $self = bless +{ grand_poobah => $poobah }, $class; $self->clear_file; $self->maybe_read_user_map_file; return $self; } # ------------------------------------- sub clear_msg { my ($self) = @_; # Make way for the next message undef $self->{rev_msg}; undef $self->{rev_time}; undef $self->{rev_revision}; undef $self->{rev_author}; undef $self->{rev_state}; undef $self->{lines}; $self->{rev_branch_roots} = []; # For showing which files are branch # ancestors. $self->{collecting_symbolic_names} = 0; } # ------------------------------------- sub clear_file { my ($self) = @_; $self->clear_msg; undef $self->{filename}; $self->{branch_names} = +{}; # We'll grab branch names while we're # at it. $self->{branch_numbers} = +{}; # Save some revisions for # @Follow_Branches $self->{symbolic_names} = +{}; # Where tag names get stored. } # ------------------------------------- sub grand_poobah { $_[0]->{grand_poobah} } # ------------------------------------- sub read_changelog { my ($self, $command) = @_; # my $grand_poobah = CVS::Utils::ChangeLog::EntrySet->new; if (! $Input_From_Stdin) { my $Log_Source_Command = join(' ', @$command); &main::debug ("(run \"${Log_Source_Command}\")\n"); open (LOG_SOURCE, "$Log_Source_Command |") or die "unable to run \"${Log_Source_Command}\""; } else { open (LOG_SOURCE, "-") or die "unable to open stdin for reading"; } binmode LOG_SOURCE; XX_Log_Source: while () { chomp; s!\r$!!; # If on a new file and don't see filename, skip until we find it, and # when we find it, grab it. if ( ! defined $self->{filename} ) { $self->read_file_path($_); } elsif ( /^symbolic names:$/ ) { $self->{collecting_symbolic_names} = 1; } elsif ( $self->{collecting_symbolic_names} ) { $self->read_symbolic_name($_); } elsif ( $_ eq FILE_SEPARATOR and ! defined $self->{rev_revision} ) { $self->clear_file; } elsif ( ! defined $self->{rev_revision} ) { # If have file name, but not revision, and see revision, then grab # it. (We collect unconditionally, even though we may or may not # ever use it.) $self->read_revision($_); } elsif ( ! defined $self->{rev_time} ) { # and /^date: /) { $self->read_date_author_and_state($_); } elsif ( /^branches:\s+(.*);$/ ) { $self->read_branches($1); } elsif ( ! ( $_ eq FILE_SEPARATOR or $_ eq REV_SEPARATOR ) ) { # If have file name, time, and author, then we're just grabbing # log message texts: $self->{rev_msg} .= $_ . "\n"; # Normally, just accumulate the message... } else { if ( ! $self->{rev_msg} or $self->{rev_msg} =~ /^\s*(\.\s*)?$/ or index($self->{rev_msg}, EMPTY_LOG_MESSAGE) > -1 ) { # ... until a msg separator is encountered: # Ensure the message contains something: $self->clear_msg if $Prune_Empty_Msgs; $self->{rev_msg} = "[no log message]\n"; } $self->add_file_entry; if ( $_ eq FILE_SEPARATOR ) { $self->clear_file; } else { $self->clear_msg; } } } close LOG_SOURCE or die sprintf("Problem reading log input (exit/signal/core: %d/%d/%d)\n", $? >> 8, $? & 127, $? & 128); return; } # ------------------------------------- sub add_file_entry { $_[0]->grand_poobah->add_fileentry(@{$_[0]}{qw(filename rev_time rev_revision rev_state lines branch_names rev_branch_roots branch_numbers symbolic_names rev_author rev_msg)}); } # ------------------------------------- sub maybe_read_user_map_file { my ($self) = @_; my %expansions; my $User_Map_Input; if ($User_Map_File) { if ( $User_Map_File =~ m{^([-\w\@+=.,\/]+):([-\w\@+=.,\/:]+)} and !-f $User_Map_File ) { my $rsh = (exists $ENV{'CVS_RSH'} ? $ENV{'CVS_RSH'} : 'ssh'); $User_Map_Input = "$rsh $1 'cat $2' |"; &main::debug ("(run \"${User_Map_Input}\")\n"); } else { $User_Map_Input = "<$User_Map_File"; } open (MAPFILE, $User_Map_Input) or die ("Unable to open $User_Map_File ($!)"); while () { next if /^\s*#/; # Skip comment lines. next if not /:/; # Skip lines without colons. # It is now safe to split on ':'. my ($username, $expansion) = split ':'; chomp $expansion; $expansion =~ s/^'(.*)'$/$1/; $expansion =~ s/^"(.*)"$/$1/; # If it looks like the expansion has a real name already, then # we toss the username we got from CVS log. Otherwise, keep # it to use in combination with the email address. if ($expansion =~ /^\s*<{0,1}\S+@.*/) { # Also, add angle brackets if none present if (! ($expansion =~ /<\S+@\S+>/)) { $expansions{$username} = "$username <$expansion>"; } else { $expansions{$username} = "$username $expansion"; } } else { $expansions{$username} = $expansion; } } # fi ($User_Map_File) close (MAPFILE); } if (defined $User_Passwd_File) { if ( ! defined $Domain ) { if ( -e MAILNAME ) { chomp($Domain = slurp_file(MAILNAME)); } else { MAILDOMAIN_CMD: for ([qw(hostname -d)], 'dnsdomainname', 'domainname') { my ($text, $exit, $sig, $core) = run_ext($_); if ( $exit == 0 && $sig == 0 && $core == 0 ) { chomp $text; if ( length $text ) { $Domain = $text; last MAILDOMAIN_CMD; } } } } } die "No mail domain found\n" unless defined $Domain; open (MAPFILE, "<$User_Passwd_File") or die ("Unable to open $User_Passwd_File ($!)"); while () { # all lines are valid my ($username, $pw, $uid, $gid, $gecos, $homedir, $shell) = split ':'; my $expansion = ''; ($expansion) = split (',', $gecos) if defined $gecos && length $gecos; my $mailname = $Domain eq '' ? $username : "$username\@$Domain"; $expansions{$username} = "$expansion <$mailname>"; } close (MAPFILE); } $self->{usermap} = \%expansions; } # ------------------------------------- sub read_file_path { my ($self, $line) = @_; my $path; if ( $line =~ /^Working file: (.*)/ ) { $path = $1; } elsif ( defined $RCS_Root and $line =~ m|^RCS file: $RCS_Root[/\\](.*),v$| ) { $path = $1; $path =~ s!Attic/!!; } else { return; } if ( @Ignore_Files ) { my $base; ($base, undef, undef) = fileparse($path); my $xpath = $Case_Insensitive ? lc($path) : $path; if ( grep index($path, $_) > -1, @Ignore_Files ) { return; } } $self->{filename} = $path; return; } # ------------------------------------- sub read_symbolic_name { my ($self, $line) = @_; # All tag names are listed with whitespace in front in cvs log # output; so if see non-whitespace, then we're done collecting. if ( /^\S/ ) { $self->{collecting_symbolic_names} = 0; return; } else { # we're looking at a tag name, so parse & store it # According to the Cederqvist manual, in node "Tags", tag names must start # with an uppercase or lowercase letter and can contain uppercase and # lowercase letters, digits, `-', and `_'. However, it's not our place to # enforce that, so we'll allow anything CVS hands us to be a tag: my ($tag_name, $tag_rev) = ($line =~ /^\s+([^:]+): ([\d.]+)$/); # A branch number either has an odd number of digit sections # (and hence an even number of dots), or has ".0." as the # second-to-last digit section. Test for these conditions. my $real_branch_rev = ''; if ( $tag_rev =~ /^(\d+\.\d+\.)+\d+$/ # Even number of dots... and $tag_rev !~ /^(1\.)+1$/ ) { # ...but not "1.[1.]1" $real_branch_rev = $tag_rev; } elsif ($tag_rev =~ /(\d+\.(\d+\.)+)0.(\d+)/) { # Has ".0." $real_branch_rev = $1 . $3; } # If we got a branch, record its number. if ( $real_branch_rev ) { $self->{branch_names}->{$real_branch_rev} = $tag_name; $self->{branch_numbers}->{$tag_name} = $real_branch_rev; } else { # Else it's just a regular (non-branch) tag. push @{$self->{symbolic_names}->{$tag_rev}}, $tag_name; } } $self->{collecting_symbolic_names} = 1; return; } # ------------------------------------- sub read_revision { my ($self, $line) = @_; my ($revision) = ( $line =~ /^revision (\d+\.[\d.]+)/ ); return unless $revision; $self->{rev_revision} = $revision; return; } # ------------------------------------- { # Closure over %gecos_warned my %gecos_warned; sub read_date_author_and_state { my ($self, $line) = @_; my ($time, $author, $state) = $self->parse_date_author_and_state($line); if ( defined($self->{usermap}->{$author}) and $self->{usermap}->{$author} ) { $author = $self->{usermap}->{$author}; } elsif ( defined $Domain or $Gecos == 1 ) { my $email = $author; $email = $author."@".$Domain if defined $Domain && $Domain ne ''; my $pw = getpwnam($author); my ($fullname, $office, $workphone, $homephone, $gcos); if ( defined $pw ) { $gcos = (getpwnam($author))[6]; ($fullname, $office, $workphone, $homephone) = split /\s*,\s*/, $gcos; } else { warn "Couldn't find gecos info for author '$author'\n" unless $gecos_warned{$author}++; $fullname = ''; } for (grep defined, $fullname, $office, $workphone, $homephone) { s/&/ucfirst(lc($pw->name))/ge; } $author = $fullname . " <" . $email . ">" if $fullname ne ''; } $self->{rev_state} = $state; $self->{rev_time} = $time; $self->{rev_author} = $author; return; } } # ------------------------------------- sub read_branches { # A "branches: ..." line here indicates that one or more branches # are rooted at this revision. If we're showing branches, then we # want to show that fact as well, so we collect all the branches # that this is the latest ancestor of and store them in # $self->[rev_branch_roots}. Just for reference, the format of the # line we're seeing at this point is: # # branches: 1.5.2; 1.5.4; ...; # # Okay, here goes: my ($self, $line) = @_; # Ugh. This really bothers me. Suppose we see a log entry # like this: # # ---------------------------- # revision 1.1 # date: 1999/10/17 03:07:38; author: jrandom; state: Exp; # branches: 1.1.2; # Intended first line of log message begins here. # ---------------------------- # # The question is, how we can tell the difference between that # log message and a *two*-line log message whose first line is # # "branches: 1.1.2;" # # See the problem? The output of "cvs log" is inherently # ambiguous. # # For now, we punt: we liberally assume that people don't # write log messages like that, and just toss a "branches:" # line if we see it but are not showing branches. I hope no # one ever loses real log data because of this. if ( $Show_Branches ) { $line =~ s/(1\.)+1;|(1\.)+1$//; # ignore the trivial branch 1.1.1 $self->{rev_branch_roots} = [split /;\s+/, $line] if length $line; } } # ------------------------------------- sub parse_date_author_and_state { my ($self, $line) = @_; # Parses the date/time and author out of a line like: # # date: 1999/02/19 23:29:05; author: apharris; state: Exp; # # or, in CVS 1.12.9: # # date: 2004-06-05 16:10:32 +0000; author: somebody; state: Exp; my ($year, $mon, $mday, $hours, $min, $secs, $utcOffset, $author, $state, $rest) = $line =~ m!(\d+)[-/](\d+)[-/](\d+)\s+(\d+):(\d+):(\d+)(\s+[+-]\d{4})?;\s+ author:\s+([^;]+);\s+state:\s+([^;]+);(.*)!x or die "Couldn't parse date ``$line''"; die "Bad date or Y2K issues" unless $year > 1969 and $year < 2258; # Kinda arbitrary, but useful as a sanity check my $time = timegm($secs, $min, $hours, $mday, $mon-1, $year-1900); if ( defined $utcOffset ) { my ($plusminus, $hour, $minute) = ($utcOffset =~ m/([+-])(\d\d)(\d\d)/); my $offset = (($hour * 60) + $minute) * 60 * ($plusminus eq '+' ? -1 : 1); $time += $offset; } if ( $rest =~ m!\s+lines:\s+(.*)! ) { $self->{lines} = $1; } return $time, $author, $state; } # Subrs ---------------------------------------------------------------------- package main; sub delta_check { my ($time, $tags) = @_; # If we're in 'delta' mode, update the latest observed times for the # beginning and ending tags, and when we get around to printing output, we # will simply restrict ourselves to that timeframe... return unless $Delta_Mode; $Delta_StartTime = $time if $time > $Delta_StartTime and grep { $_ eq $Delta_From } @$tags; $Delta_EndTime = $time if $time > $Delta_EndTime and grep { $_ eq $Delta_To } @$tags; } sub run_ext { my ($cmd) = @_; $cmd = [$cmd] unless ref $cmd; local $" = ' '; my $out = qx"@$cmd 2>&1"; my $rv = $?; my ($sig, $core, $exit) = ($? & 127, $? & 128, $? >> 8); return $out, $exit, $sig, $core; } # ------------------------------------- # If accumulating, grab the boundary date from pre-existing ChangeLog. sub maybe_grab_accumulation_date { if (! $Cumulative || $Update) { return ''; } # else open (LOG, "$Log_File_Name") or die ("trouble opening $Log_File_Name for reading ($!)"); my $boundary_date; while () { if (/^(\d\d\d\d-\d\d-\d\d\s+\d\d:\d\d)/) { $boundary_date = "$1"; last; } } close (LOG); # convert time from utc to local timezone if the ChangeLog has # dates/times in utc if ($UTC_Times && $boundary_date) { # convert the utc time to a time value my ($year,$mon,$mday,$hour,$min) = $boundary_date =~ m#(\d+)-(\d+)-(\d+)\s+(\d+):(\d+)#; my $time = timegm(0,$min,$hour,$mday,$mon-1,$year-1900); # print the timevalue in the local timezone my ($ignore,$wday); ($ignore,$min,$hour,$mday,$mon,$year,$wday) = localtime($time); $boundary_date=sprintf ("%4u-%02u-%02u %02u:%02u", $year+1900,$mon+1,$mday,$hour,$min); } return $boundary_date; } # ------------------------------------- # Fills up a ChangeLog structure in the current directory. sub derive_changelog { my ($command) = @_; # See "The Plan" above for a full explanation. # Might be adding to an existing ChangeLog my $accumulation_date = maybe_grab_accumulation_date; if ($accumulation_date) { # Insert -d immediately after 'cvs log' my $Log_Date_Command = "-d\'>${accumulation_date}\'"; my ($log_index) = grep $command->[$_] eq 'log', 0..$#$command; splice @$command, $log_index+1, 0, $Log_Date_Command; &debug ("(adding log msg starting from $accumulation_date)\n"); } # output_changelog(read_changelog($command)); my $builder = CVS::Utils::ChangeLog::EntrySetBuilder->new; $builder->read_changelog($command); $builder->grand_poobah->output_changelog; } # ------------------------------------- sub min { $_[0] < $_[1] ? $_[0] : $_[1] } # ------------------------------------- sub common_path_prefix { my ($path1, $path2) = @_; # For compatibility (with older versions of cvs2cl.pl), we think in UN*X # terms, and mould windoze filenames to match. Is this really appropriate? # If a file is checked in under UN*X, and cvs log run on windoze, which way # do the path separators slope? Can we use fileparse as per the local # conventions? If so, we should probably have a user option to specify an # OS to emulate to handle stdin-fed logs. If we did this, we could avoid # the nasty \-/ transmogrification below. my ($dir1, $dir2) = map +(fileparse($_))[1], $path1, $path2; # Transmogrify Windows filenames to look like Unix. # (It is far more likely that someone is running cvs2cl.pl under # Windows than that they would genuinely have backslashes in their # filenames.) tr!\\!/! for $dir1, $dir2; my ($accum1, $accum2, $last_common_prefix) = ('') x 3; my @path1 = grep length($_), split qr!/!, $dir1; my @path2 = grep length($_), split qr!/!, $dir2; my @common_path; for (0..min($#path1,$#path2)) { if ( $path1[$_] eq $path2[$_]) { push @common_path, $path1[$_]; } else { last; } } return join '', map "$_/", @common_path; } # ------------------------------------- sub parse_options { # Check this internally before setting the global variable. my $output_file; # If this gets set, we encountered unknown options and will exit at # the end of this subroutine. my $exit_with_admonishment = 0; # command to generate the log my @log_source_command = qw( cvs log ); my (@Global_Opts, @Local_Opts); Getopt::Long::Configure(qw( bundling permute no_getopt_compat pass_through no_ignore_case )); GetOptions('help|usage|h' => \$Print_Usage, 'debug' => \$Debug, # unadvertised option, heh 'version' => \$Print_Version, 'file|f=s' => \$output_file, 'accum' => \$Cumulative, 'update' => \$Update, 'fsf' => \$FSF_Style, 'rcs=s' => \$RCS_Root, 'usermap|U=s' => \$User_Map_File, 'gecos' => \$Gecos, 'domain=s' => \$Domain, 'passwd=s' => \$User_Passwd_File, 'window|W=i' => \$Max_Checkin_Duration, 'chrono' => \$Chronological_Order, 'ignore|I=s' => \@Ignore_Files, 'case-insensitive|C' => \$Case_Insensitive, 'regexp|R=s' => \$Regexp_Gate, 'stdin' => \$Input_From_Stdin, 'stdout' => \$Output_To_Stdout, 'distributed|d' => sub { CVS::Utils::ChangeLog::FileEntry->distributed(1) }, 'prune|P' => \$Prune_Empty_Msgs, 'no-wrap' => \$No_Wrap, 'gmt|utc' => \$UTC_Times, 'day-of-week|w' => \$Show_Day_Of_Week, 'revisions|r' => \$Show_Revisions, 'show-dead' => \$Show_Dead, 'tags|t' => \$Show_Tags, 'tagdates|T' => \$Show_Tag_Dates, 'branches|b' => \$Show_Branches, 'follow|F=s' => \@Follow_Branches, 'follow-only=s' => \@Follow_Only, 'xml-encoding=s' => \$XML_Encoding, 'xml' => \$XML_Output, 'noxmlns' => \$No_XML_Namespace, 'no-xml-iso-date' => \$No_XML_ISO_Date, 'no-ancestors' => \$No_Ancestors, 'lines-modified' => \$Show_Lines_Modified, 'no-indent' => sub { $Indent = ''; }, 'summary' => sub { $Summary = 1; $After_Header = "\n\n"; # Summary implies --separate-header }, 'no-times' => sub { $Show_Times = 0; }, 'no-hide-branch-additions' => sub { $Hide_Branch_Additions = 0; }, 'no-common-dir' => sub { $Common_Dir = 0; }, 'ignore-tag=s' => sub { $ignore_tags{$_[1]} = 1; }, 'show-tag=s' => sub { $show_tags{$_[1]} = 1; }, # Deliberately undocumented. This is not a public interface, and # may change/disappear at any time. 'test-code=s' => \$TestCode, 'delta=s' => sub { my $arg = $_[1]; if ( $arg =~ /^([A-Za-z][A-Za-z0-9_\-\]\[]*):([A-Za-z][A-Za-z0-9_\-\]\[]*)$/ ) { $Delta_From = $1; $Delta_To = $2; $Delta_Mode = 1; } else { die "--delta FROM_TAG:TO_TAG is what you meant to say.\n"; } }, 'FSF' => sub { $Show_Times = 0; $Common_Dir = 0; $No_Extra_Indent = 1; $Indent = "\t"; }, 'header=s' => sub { my $narg = $_[1]; $ChangeLog_Header = &slurp_file ($narg); if (! defined ($ChangeLog_Header)) { $ChangeLog_Header = ''; } }, 'global-opts|g=s' => sub { my $narg = $_[1]; push @Global_Opts, $narg; splice @log_source_command, 1, 0, $narg; }, 'log-opts|l=s' => sub { my $narg = $_[1]; push @Local_Opts, $narg; push @log_source_command, $narg; }, 'mailname=s' => sub { my $narg = $_[1]; warn "--mailname is deprecated; please use --domain instead\n"; $Domain = $narg; }, 'separate-header|S' => sub { $After_Header = "\n\n"; $No_Extra_Indent = 1; }, 'group-within-date' => sub { $GroupWithinDate = 1; $Show_Times = 0; }, 'hide-filenames' => sub { $Hide_Filenames = 1; $After_Header = ''; }, ) or die "options parsing failed\n"; push @log_source_command, map "'$_'", @ARGV; ## Check for contradictions... if ($Output_To_Stdout && CVS::Utils::ChangeLog::FileEntry->distributed) { print STDERR "cannot pass both --stdout and --distributed\n"; $exit_with_admonishment = 1; } if ($Output_To_Stdout && $output_file) { print STDERR "cannot pass both --stdout and --file\n"; $exit_with_admonishment = 1; } if ($Input_From_Stdin && @Global_Opts) { print STDERR "cannot pass both --stdin and -g\n"; $exit_with_admonishment = 1; } if ($Input_From_Stdin && @Local_Opts) { print STDERR "cannot pass both --stdin and -l\n"; $exit_with_admonishment = 1; } if ($XML_Output && $Cumulative) { print STDERR "cannot pass both --xml and --accum\n"; $exit_with_admonishment = 1; } # Other consistency checks and option-driven logic # Bleargh. Compensate for a deficiency of custom wrapping. if ( ($After_Header ne " ") and $FSF_Style ) { $After_Header .= "\t"; } @Ignore_Files = map lc, @Ignore_Files if $Case_Insensitive; # Or if any other error message has already been printed out, we # just leave now: if ($exit_with_admonishment) { &usage (); exit (1); } elsif ($Print_Usage) { &usage (); exit (0); } elsif ($Print_Version) { &version (); exit (0); } ## Else no problems, so proceed. if ($output_file) { $Log_File_Name = $output_file; } return \@log_source_command; } # ------------------------------------- sub slurp_file { my $filename = shift || die ("no filename passed to slurp_file()"); my $retstr; open (SLURPEE, "<${filename}") or die ("unable to open $filename ($!)"); local $/ = undef; $retstr = ; close (SLURPEE); return $retstr; } # ------------------------------------- sub debug { if ($Debug) { my $msg = shift; print STDERR $msg; } } # ------------------------------------- sub version { print "cvs2cl.pl version ${VERSION}; distributed under the GNU GPL.\n"; } # ------------------------------------- sub usage { &version (); eval "use Pod::Usage qw( pod2usage )"; if ( $@ ) { print <<'END'; * Pod::Usage was not found. The formatting may be suboptimal. Consider upgrading your Perl --- Pod::Usage is standard from 5.6 onwards, and versions of perl prior to 5.6 are getting rather rusty, now. Alternatively, install Pod::Usage direct from CPAN. END local $/ = undef; my $message = ; $message =~ s/^=(head1|item) //gm; $message =~ s/^=(over|back).*\n//gm; $message =~ s/\n{3,}/\n\n/g; print $message; } else { print "\n"; pod2usage( -exitval => 'NOEXIT', -verbose => 1, -output => \*STDOUT, ); } return; } # Main ----------------------------------------------------------------------- my $log_source_command = parse_options; if ( defined $TestCode ) { eval $TestCode; die "Eval failed: '$@'\n" if $@; } else { derive_changelog($log_source_command); } __DATA__ =head1 NAME cvs2cl.pl - convert cvs log messages to changelogs =head1 SYNOPSIS B [I] [I [I ...]] =head1 DESCRIPTION cvs2cl produces a GNU-style ChangeLog for CVS-controlled sources by running "cvs log" and parsing the output. Duplicate log messages get unified in the Right Way. The default output of cvs2cl is designed to be compact, formally unambiguous, but still easy for humans to read. It should be largely self-explanatory; the one abbreviation that might not be obvious is "utags". That stands for "universal tags" -- a universal tag is one held by all the files in a given change entry. If you need output that's easy for a program to parse, use the B<--xml> option. Note that with XML output, just about all available information is included with each change entry, whether you asked for it or not, on the theory that your parser can ignore anything it's not looking for. If filenames are given as arguments cvs2cl only shows log information for the named files. =head1 OPTIONS =over 4 =item B<-h>, B<-help>, B<--help>, B<-?> Show a short help and exit. =item B<--version> Show version and exit. =item B<-r>, B<--revisions> Show revision numbers in output. =item B<-b>, B<--branches> Show branch names in revisions when possible. =item B<-t>, B<--tags> Show tags (symbolic names) in output. =item B<-T>, B<--tagdates> Show tags in output on their first occurance. =item B<--show-dead> Show dead files. =item B<--stdin> Read from stdin, don't run cvs log. =item B<--stdout> Output to stdout not to ChangeLog. =item B<-d>, B<--distributed> Put ChangeLogs in subdirs. =item B<-f> I, B<--file> I Write to I instead of ChangeLog. =item B<--fsf> Use this if log data is in FSF ChangeLog style. =item B<--FSF> Attempt strict FSF-standard compatible output. =item B<-W> I, B<--window> I Window of time within which log entries unify. =item -B I, B<--usermap> I Expand usernames to email addresses from I. =item B<--passwd> I Use system passwd file for user name expansion. If no mail domain is provided (via B<--domain>), it tries to read one from B, output of B, B, or B. cvs2cl exits with an error if none of those options is successful. Use a domain of '' to prevent the addition of a mail domain. =item B<--domain> I Domain to build email addresses from. =item B<--gecos> Get user information from GECOS data. =item B<-R> I, B<--regexp> I Include only entries that match I. This option may be used multiple times. =item B<-I> I, B<--ignore> I Ignore files whose names match I. This option may be used multiple times. =item B<-C>, B<--case-insensitive> Any regexp matching is done case-insensitively. =item B<-F> I, B<--follow> I Show only revisions on or ancestral to I. =item B<--follow-only> I Like --follow, but sub-branches are not followed. =item B<--no-ancestors> When using B<-F>, only track changes since the I started. =item B<--no-hide-branch-additions> By default, entries generated by cvs for a file added on a branch (a dead 1.1 entry) are not shown. This flag reverses that action. =item B<-S>, B<--separate-header> Blank line between each header and log message. =item B<--summary> Add CVS change summary information. =item B<--no-wrap> Don't auto-wrap log message (recommend B<-S> also). =item B<--no-indent> Don't indent log message =item B<--gmt>, B<--utc> Show times in GMT/UTC instead of local time. =item B<--accum> Add to an existing ChangeLog (incompatible with B<--xml>). =item B<-w>, B<--day-of-week> Show day of week. =item B<--no-times> Don't show times in output. =item B<--chrono> Output log in chronological order (default is reverse chronological order). =item B<--header> I Get ChangeLog header from I ("B<->" means stdin). =item B<--xml> Output XML instead of ChangeLog format. =item B<--xml-encoding> I Insert encoding clause in XML header. =item B<--noxmlns> Don't include xmlns= attribute in root element. =item B<--hide-filenames> Don't show filenames (ignored for XML output). =item B<--no-common-dir> Don't shorten directory names from filenames. =item B<--rcs> I Handle filenames from raw RCS, for instance those produced by "cvs rlog" output, stripping the prefix I. =item B<-P>, B<--prune> Don't show empty log messages. =item B<--lines-modified> Output the number of lines added and the number of lines removed for each checkin (if applicable). At the moment, this only affects the XML output mode. =item B<--ignore-tag> I Ignore individual changes that are associated with a given tag. May be repeated, if so, changes that are associated with any of the given tags are ignored. =item B<--show-tag> I Log only individual changes that are associated with a given tag. May be repeated, if so, changes that are associated with any of the given tags are logged. =item B<--delta> IB<:>I Attempt a delta between two tags (since I up to and including I). The algorithm is a simple date-based one (this is a hard problem) so results are imperfect. =item B<-g> I, B<--global-opts> I Pass I to cvs like in "cvs I log ...". =item B<-l> I, B<--log-opts> I Pass I to cvs log like in "cvs ... log I". =back Notes about the options and arguments: =over 4 =item * The B<-I> and B<-F> options may appear multiple times. =item * To follow trunk revisions, use "B<-F trunk>" ("B<-F TRUNK>" also works). This is okay because no would ever, ever be crazy enough to name a branch "trunk", right? Right. =item * For the B<-U> option, the I should be formatted like CVSROOT/users. That is, each line of I looks like this: jrandom:jrandom@red-bean.com or maybe even like this jrandom:'Jesse Q. Random ' Don't forget to quote the portion after the colon if necessary. =item * Many people want to filter by date. To do so, invoke cvs2cl.pl like this: cvs2cl.pl -l "-d'DATESPEC'" where DATESPEC is any date specification valid for "cvs log -d". (Note that CVS 1.10.7 and below requires there be no space between -d and its argument). =item * Dates/times are interpreted in the local time zone. =item * Remember to quote the argument to `B<-l>' so that your shell doesn't interpret spaces as argument separators. =item * See the 'Common Options' section of the cvs manual ('info cvs' on UNIX-like systems) for more information. =item * Note that the rules for quoting under windows shells are different. =back =head1 EXAMPLES Some examples (working on UNIX shells): # logs after 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'>2003-03-06'" # logs after 4:34PM 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'>2003-03-06 16:34'" # logs between 4:46PM 6th March, 2003 (exclusive) and # 4:34PM 6th March, 2003 (inclusive) cvs2cl.pl -l "-d'2003-03-06 16:46>2003-03-06 16:34'" Some examples (on non-UNIX shells): # Reported to work on windows xp/2000 cvs2cl.pl -l "-d"">2003-10-18;today<""" =head1 AUTHORS =over 4 =item Karl Fogel =item Melissa O'Neill =item Martyn J. Pearce =back Contributions from =over 4 =item Mike Ayers =item Tim Bradshaw =item Richard Broberg =item Nathan Bryant =item Oswald Buddenhagen =item Neil Conway =item Arthur de Jong =item Mark W. Eichin =item Dave Elcock =item Reid Ellis =item Simon Josefsson =item Robin Hugh Johnson =item Terry Kane =item Akos Kiss =item Claus Klein =item Eddie Kohler =item Richard Laager =item Kevin Lilly =item Karl-Heinz Marbaise =item Mitsuaki Masuhara =item Henrik Nordstrom =item Joe Orton =item Peter Palfrader =item Thomas Parmelan =item Johanne Stezenbach =item Joseph Walton =item Ernie Zapata =back =head1 BUGS Please report bugs to C. =head1 PREREQUISITES This script requires C, C, and C. It also seems to require C or higher. =head1 OPERATING SYSTEM COMPATIBILITY Should work on any OS. =head1 SCRIPT CATEGORIES Version_Control/CVS =head1 COPYRIGHT (C) 2001,2002,2003,2004 Martyn J. Pearce , under the GNU GPL. (C) 1999 Karl Fogel , under the GNU GPL. cvs2cl.pl is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. cvs2cl.pl is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You may have received a copy of the GNU General Public License along with cvs2cl.pl; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =head1 SEE ALSO cvs(1) grace-5.1.23/README0000644000076500001440000000067406675562260013335 0ustar fnevgenyusers GRACE - GRaphing, Advanced Computation and Exploration of data Recommended reading: COPYRIGHT - legal stuff LICENSE - license terms (GPL) CHANGES - chronological list of changes doc/FAQ.html - frequently asked questions (in HTML format) arch//README - system-specific important notes The installation procedure is covered in the User's Guide (in the doc directory). grace-5.1.23/src/0000755000076500001440000000000012032153131013206 5ustar fnevgenyusersgrace-5.1.23/src/gd.c0000644000076500001440000003767707412432043014000 0ustar fnevgenyusers#include #include #include #include #include "gd.h" #define costScale 1024 static int cost[] = { 1024, 1023, 1023, 1022, 1021, 1020, 1018, 1016, 1014, 1011, 1008, 1005, 1001, 997, 993, 989, 984, 979, 973, 968, 962, 955, 949, 942, 935, 928, 920, 912, 904, 895, 886, 877, 868, 858, 848, 838, 828, 817, 806, 795, 784, 772, 760, 748, 736, 724, 711, 698, 685, 671, 658, 644, 630, 616, 601, 587, 572, 557, 542, 527, 512, 496, 480, 464, 448, 432, 416, 400, 383, 366, 350, 333, 316, 299, 282, 265, 247, 230, 212, 195, 177, 160, 142, 124, 107, 89, 71, 53, 35, 17, 0, -17, -35, -53, -71, -89, -107, -124, -142, -160, -177, -195, -212, -230, -247, -265, -282, -299, -316, -333, -350, -366, -383, -400, -416, -432, -448, -464, -480, -496, -512, -527, -542, -557, -572, -587, -601, -616, -630, -644, -658, -671, -685, -698, -711, -724, -736, -748, -760, -772, -784, -795, -806, -817, -828, -838, -848, -858, -868, -877, -886, -895, -904, -912, -920, -928, -935, -942, -949, -955, -962, -968, -973, -979, -984, -989, -993, -997, -1001, -1005, -1008, -1011, -1014, -1016, -1018, -1020, -1021, -1022, -1023, -1023, -1024, -1023, -1023, -1022, -1021, -1020, -1018, -1016, -1014, -1011, -1008, -1005, -1001, -997, -993, -989, -984, -979, -973, -968, -962, -955, -949, -942, -935, -928, -920, -912, -904, -895, -886, -877, -868, -858, -848, -838, -828, -817, -806, -795, -784, -772, -760, -748, -736, -724, -711, -698, -685, -671, -658, -644, -630, -616, -601, -587, -572, -557, -542, -527, -512, -496, -480, -464, -448, -432, -416, -400, -383, -366, -350, -333, -316, -299, -282, -265, -247, -230, -212, -195, -177, -160, -142, -124, -107, -89, -71, -53, -35, -17, 0, 17, 35, 53, 71, 89, 107, 124, 142, 160, 177, 195, 212, 230, 247, 265, 282, 299, 316, 333, 350, 366, 383, 400, 416, 432, 448, 464, 480, 496, 512, 527, 542, 557, 572, 587, 601, 616, 630, 644, 658, 671, 685, 698, 711, 724, 736, 748, 760, 772, 784, 795, 806, 817, 828, 838, 848, 858, 868, 877, 886, 895, 904, 912, 920, 928, 935, 942, 949, 955, 962, 968, 973, 979, 984, 989, 993, 997, 1001, 1005, 1008, 1011, 1014, 1016, 1018, 1020, 1021, 1022, 1023, 1023 }; #define sintScale 1024 static int sint[] = { 0, 17, 35, 53, 71, 89, 107, 124, 142, 160, 177, 195, 212, 230, 247, 265, 282, 299, 316, 333, 350, 366, 383, 400, 416, 432, 448, 464, 480, 496, 512, 527, 542, 557, 572, 587, 601, 616, 630, 644, 658, 671, 685, 698, 711, 724, 736, 748, 760, 772, 784, 795, 806, 817, 828, 838, 848, 858, 868, 877, 886, 895, 904, 912, 920, 928, 935, 942, 949, 955, 962, 968, 973, 979, 984, 989, 993, 997, 1001, 1005, 1008, 1011, 1014, 1016, 1018, 1020, 1021, 1022, 1023, 1023, 1024, 1023, 1023, 1022, 1021, 1020, 1018, 1016, 1014, 1011, 1008, 1005, 1001, 997, 993, 989, 984, 979, 973, 968, 962, 955, 949, 942, 935, 928, 920, 912, 904, 895, 886, 877, 868, 858, 848, 838, 828, 817, 806, 795, 784, 772, 760, 748, 736, 724, 711, 698, 685, 671, 658, 644, 630, 616, 601, 587, 572, 557, 542, 527, 512, 496, 480, 464, 448, 432, 416, 400, 383, 366, 350, 333, 316, 299, 282, 265, 247, 230, 212, 195, 177, 160, 142, 124, 107, 89, 71, 53, 35, 17, 0, -17, -35, -53, -71, -89, -107, -124, -142, -160, -177, -195, -212, -230, -247, -265, -282, -299, -316, -333, -350, -366, -383, -400, -416, -432, -448, -464, -480, -496, -512, -527, -542, -557, -572, -587, -601, -616, -630, -644, -658, -671, -685, -698, -711, -724, -736, -748, -760, -772, -784, -795, -806, -817, -828, -838, -848, -858, -868, -877, -886, -895, -904, -912, -920, -928, -935, -942, -949, -955, -962, -968, -973, -979, -984, -989, -993, -997, -1001, -1005, -1008, -1011, -1014, -1016, -1018, -1020, -1021, -1022, -1023, -1023, -1024, -1023, -1023, -1022, -1021, -1020, -1018, -1016, -1014, -1011, -1008, -1005, -1001, -997, -993, -989, -984, -979, -973, -968, -962, -955, -949, -942, -935, -928, -920, -912, -904, -895, -886, -877, -868, -858, -848, -838, -828, -817, -806, -795, -784, -772, -760, -748, -736, -724, -711, -698, -685, -671, -658, -644, -630, -616, -601, -587, -572, -557, -542, -527, -512, -496, -480, -464, -448, -432, -416, -400, -383, -366, -350, -333, -316, -299, -282, -265, -247, -230, -212, -195, -177, -160, -142, -124, -107, -89, -71, -53, -35, -17 }; static void gdImageBrushApply(gdImagePtr im, int x, int y); static void gdImageTileApply(gdImagePtr im, int x, int y); gdImagePtr gdImageCreate(int sx, int sy) { int i; gdImagePtr im; im = (gdImage *) malloc(sizeof(gdImage)); /* NOW ROW-MAJOR IN GD 1.3 */ im->pixels = (unsigned char **) malloc(sizeof(unsigned char *) * sy); im->polyInts = 0; im->polyAllocated = 0; im->brush = 0; im->tile = 0; im->style = 0; for (i=0; (ipixels[i] = (unsigned char *) calloc( sx, sizeof(unsigned char)); } im->sx = sx; im->sy = sy; im->colorsTotal = 0; im->transparent = (-1); im->interlace = 0; for (i=0; (i < gdMaxColors); i++) { im->open[i] = 1; im->red[i] = 0; im->green[i] = 0; im->blue[i] = 0; }; return im; } void gdImageDestroy(gdImagePtr im) { int i; for (i=0; (isy); i++) { free(im->pixels[i]); } free(im->pixels); if (im->polyInts) { free(im->polyInts); } if (im->style) { free(im->style); } free(im); } int gdImageColorClosest(gdImagePtr im, int r, int g, int b) { int i; long rd, gd, bd; int ct = (-1); int first = 1; long mindist = 0; for (i=0; (i<(im->colorsTotal)); i++) { long dist; if (im->open[i]) { continue; } rd = (im->red[i] - r); gd = (im->green[i] - g); bd = (im->blue[i] - b); dist = rd * rd + gd * gd + bd * bd; if (first || (dist < mindist)) { mindist = dist; ct = i; first = 0; } } return ct; } int gdImageColorExact(gdImagePtr im, int r, int g, int b) { int i; for (i=0; (i<(im->colorsTotal)); i++) { if (im->open[i]) { continue; } if ((im->red[i] == r) && (im->green[i] == g) && (im->blue[i] == b)) { return i; } } return -1; } int gdImageColorAllocate(gdImagePtr im, int r, int g, int b) { int i; int ct = (-1); for (i=0; (i<(im->colorsTotal)); i++) { if (im->open[i]) { ct = i; break; } } if (ct == (-1)) { ct = im->colorsTotal; if (ct == gdMaxColors) { return -1; } im->colorsTotal++; } im->red[ct] = r; im->green[ct] = g; im->blue[ct] = b; im->open[ct] = 0; return ct; } void gdImageColorDeallocate(gdImagePtr im, int color) { /* Mark it open. */ im->open[color] = 1; } void gdImageColorTransparent(gdImagePtr im, int color) { im->transparent = color; } void gdImageSetPixel(gdImagePtr im, int x, int y, int color) { int p; switch(color) { case gdStyled: if (!im->style) { /* Refuse to draw if no style is set. */ return; } else { p = im->style[im->stylePos++]; } if (p != (gdTransparent)) { gdImageSetPixel(im, x, y, p); } im->stylePos = im->stylePos % im->styleLength; break; case gdStyledBrushed: if (!im->style) { /* Refuse to draw if no style is set. */ return; } p = im->style[im->stylePos++]; if ((p != gdTransparent) && (p != 0)) { gdImageSetPixel(im, x, y, gdBrushed); } im->stylePos = im->stylePos % im->styleLength; break; case gdBrushed: gdImageBrushApply(im, x, y); break; case gdTiled: gdImageTileApply(im, x, y); break; default: if (gdImageBoundsSafe(im, x, y)) { /* NOW ROW-MAJOR IN GD 1.3 */ im->pixels[y][x] = color; } break; } } static void gdImageBrushApply(gdImagePtr im, int x, int y) { int lx, ly; int hy; int hx; int x1, y1, x2, y2; int srcx, srcy; if (!im->brush) { return; } hy = gdImageSY(im->brush)/2; y1 = y - hy; y2 = y1 + gdImageSY(im->brush); hx = gdImageSX(im->brush)/2; x1 = x - hx; x2 = x1 + gdImageSX(im->brush); srcy = 0; for (ly = y1; (ly < y2); ly++) { srcx = 0; for (lx = x1; (lx < x2); lx++) { int p; p = gdImageGetPixel(im->brush, srcx, srcy); /* Allow for non-square brushes! */ if (p != gdImageGetTransparent(im->brush)) { gdImageSetPixel(im, lx, ly, im->brushColorMap[p]); } srcx++; } srcy++; } } static void gdImageTileApply(gdImagePtr im, int x, int y) { int srcx, srcy; int p; if (!im->tile) { return; } srcx = x % gdImageSX(im->tile); srcy = y % gdImageSY(im->tile); p = gdImageGetPixel(im->tile, srcx, srcy); /* Allow for transparency */ if (p != gdImageGetTransparent(im->tile)) { gdImageSetPixel(im, x, y, im->tileColorMap[p]); } } int gdImageGetPixel(gdImagePtr im, int x, int y) { if (gdImageBoundsSafe(im, x, y)) { /* NOW ROW-MAJOR IN GD 1.3 */ return im->pixels[y][x]; } else { return 0; } } /* Bresenham as presented in Foley & Van Dam */ void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag; dx = abs(x2-x1); dy = abs(y2-y1); if (dy <= dx) { d = 2*dy - dx; incr1 = 2*dy; incr2 = 2 * (dy - dx); if (x1 > x2) { x = x2; y = y2; ydirflag = (-1); xend = x1; } else { x = x1; y = y1; ydirflag = 1; xend = x2; } gdImageSetPixel(im, x, y, color); if (((y2 - y1) * ydirflag) > 0) { while (x < xend) { x++; if (d <0) { d+=incr1; } else { y++; d+=incr2; } gdImageSetPixel(im, x, y, color); } } else { while (x < xend) { x++; if (d <0) { d+=incr1; } else { y--; d+=incr2; } gdImageSetPixel(im, x, y, color); } } } else { d = 2*dx - dy; incr1 = 2*dx; incr2 = 2 * (dx - dy); if (y1 > y2) { y = y2; x = x2; yend = y1; xdirflag = (-1); } else { y = y1; x = x1; yend = y2; xdirflag = 1; } gdImageSetPixel(im, x, y, color); if (((x2 - x1) * xdirflag) > 0) { while (y < yend) { y++; if (d <0) { d+=incr1; } else { x++; d+=incr2; } gdImageSetPixel(im, x, y, color); } } else { while (y < yend) { y++; if (d <0) { d+=incr1; } else { x--; d+=incr2; } gdImageSetPixel(im, x, y, color); } } } } int gdImageBoundsSafe(gdImagePtr im, int x, int y) { return (!(((y < 0) || (y >= im->sy)) || ((x < 0) || (x >= im->sx)))); } /* s and e are integers modulo 360 (degrees), with 0 degrees being the rightmost extreme and degrees changing clockwise. cx and cy are the center in pixels; w and h are the horizontal and vertical diameter in pixels. Nice interface, but slow, since I don't yet use Bresenham (I'm using an inefficient but simple solution with too much work going on in it; generalizing Bresenham to ellipses and partial arcs of ellipses is non-trivial, at least for me) and there are other inefficiencies (small circles do far too much work). */ void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color) { int i; int lx = 0, ly = 0; int w2, h2; w2 = w/2; h2 = h/2; while (e < s) { e += 360; } while (s < 0) { s += 360; e += 360; } for (i=s; (i <= e); i++) { int x, y; x = ((long)cost[i % 360] * (long)w2 / costScale) + cx; y = ((long)sint[i % 360] * (long)h2 / sintScale) + cy; if (i != s) { gdImageLine(im, lx, ly, x, y, color); } lx = x; ly = y; } } void gdImageFilledArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int mode, int color) { int i, n, ntot; int w2, h2; gdPointPtr p; w2 = w/2; h2 = h/2; while (e < s) { e += 360; } while (s < 0) { s += 360; e += 360; } n = e - s + 1; if (mode == gdArcFillPieSlice) { ntot = n + 1; } else { ntot = n; } p = malloc(ntot*sizeof(gdPoint)); if (p == NULL) { return; } for (i=0; i < n; i++) { int a = i + s; p[i].x = ((long)cost[a % 360] * (long)w2 / costScale) + cx; p[i].y = ((long)sint[a % 360] * (long)h2 / sintScale) + cy; } if (mode == gdArcFillPieSlice) { p[n].x = cx; p[n].y = cy; } gdImageFilledPolygon(im, p, ntot, color); free(p); } #if 0 /* Bresenham octant code, which I should use eventually */ int x, y, d; x = 0; y = w; d = 3-2*w; while (x < y) { gdImageSetPixel(im, cx+x, cy+y, color); if (d < 0) { d += 4 * x + 6; } else { d += 4 * (x - y) + 10; y--; } x++; } if (x == y) { gdImageSetPixel(im, cx+x, cy+y, color); } #endif void gdImageRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { gdImageLine(im, x1, y1, x2, y1, color); gdImageLine(im, x1, y2, x2, y2, color); gdImageLine(im, x1, y1, x1, y2, color); gdImageLine(im, x2, y1, x2, y2, color); } void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { int x, y; for (y=y1; (y<=y2); y++) { for (x=x1; (x<=x2); x++) { gdImageSetPixel(im, x, y, color); } } } void gdImagePolygon(gdImagePtr im, gdPointPtr p, int n, int c) { int i; int lx, ly; if (!n) { return; } lx = p->x; ly = p->y; gdImageLine(im, lx, ly, p[n-1].x, p[n-1].y, c); for (i=1; (i < n); i++) { p++; gdImageLine(im, lx, ly, p->x, p->y, c); lx = p->x; ly = p->y; } } int gdCompareInt(const void *a, const void *b); void gdImageFilledPolygon(gdImagePtr im, gdPointPtr p, int n, int c) { int i; int y; int ymin, ymax; int ints; if (n < 1) { return; } if (!im->polyAllocated) { im->polyInts = (int *) malloc(sizeof(int) * n); im->polyAllocated = n; } if (im->polyAllocated < n) { while (im->polyAllocated < n) { im->polyAllocated *= 2; } im->polyInts = (int *) realloc(im->polyInts, sizeof(int) * im->polyAllocated); } ymin = p[0].y; ymax = p[0].y; for (i=1; (i < n); i++) { if (p[i].y < ymin) { ymin = p[i].y; } if (p[i].y > ymax) { ymax = p[i].y; } } for (y=ymin; (y < ymax); y++) { ints = 0; for (i=0; (i < n); i++) { int x1, x2; int y1, y2; int ind1, ind2; ind1 = i; ind2 = (i + 1) % n; y1 = p[ind1].y; y2 = p[ind2].y; x1 = p[ind1].x; x2 = p[ind2].x; /* intersection exists only if y is between y1 and y2 */ if (((y >= y1) && (y <= y2)) || ((y >= y2) && (y <= y1))) { if (y1 == y2) { /* horizontal edge - just draw it */ gdImageLine(im, x1, y, x2, y, c); } else { if ((y == y1 && y1 < y2) || (y == y2 && y2 < y1)) { /* intersecting at min of an edge, ignore to avoid double counting! */ } else { /* OK, this one we do want to count :) */ int inter = (y-y1) * (x2-x1) / (y2-y1) + x1; im->polyInts[ints++] = inter; } } } } qsort(im->polyInts, ints, sizeof(int), gdCompareInt); for (i=0; (i < (ints-1)); i+=2) { gdImageLine(im, im->polyInts[i], y, im->polyInts[i+1], y, c); } } } int gdCompareInt(const void *a, const void *b) { return (*(const int *)a) - (*(const int *)b); } void gdImageSetStyle(gdImagePtr im, int *style, int noOfPixels) { if (im->style) { free(im->style); } im->style = (int *) malloc(sizeof(int) * noOfPixels); memcpy(im->style, style, sizeof(int) * noOfPixels); im->styleLength = noOfPixels; im->stylePos = 0; } void gdImageSetBrush(gdImagePtr im, gdImagePtr brush) { int i; im->brush = brush; for (i=0; (i < gdImageColorsTotal(brush)); i++) { int index; index = gdImageColorExact(im, gdImageRed(brush, i), gdImageGreen(brush, i), gdImageBlue(brush, i)); if (index == (-1)) { index = gdImageColorAllocate(im, gdImageRed(brush, i), gdImageGreen(brush, i), gdImageBlue(brush, i)); if (index == (-1)) { index = gdImageColorClosest(im, gdImageRed(brush, i), gdImageGreen(brush, i), gdImageBlue(brush, i)); } } im->brushColorMap[i] = index; } } void gdImageSetTile(gdImagePtr im, gdImagePtr tile) { int i; im->tile = tile; for (i=0; (i < gdImageColorsTotal(tile)); i++) { int index; index = gdImageColorExact(im, gdImageRed(tile, i), gdImageGreen(tile, i), gdImageBlue(tile, i)); if (index == (-1)) { index = gdImageColorAllocate(im, gdImageRed(tile, i), gdImageGreen(tile, i), gdImageBlue(tile, i)); if (index == (-1)) { index = gdImageColorClosest(im, gdImageRed(tile, i), gdImageGreen(tile, i), gdImageBlue(tile, i)); } } im->tileColorMap[i] = index; } } void gdImageInterlace(gdImagePtr im, int interlaceArg) { im->interlace = interlaceArg; } grace-5.1.23/src/defines.h0000644000076500001440000004563210565160206015020 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * constants and typedefs * */ #ifndef __DEFINES_H_ #define __DEFINES_H_ #include /* * some constants * */ /* max path length */ #define GR_MAXPATHLEN 256 /* max length for strings */ #define MAX_STRING_LENGTH 512 #define MAXAXES 4 /* max number of axes per graph */ #define MAX_TICKS 256 /* max number of ticks/labels per axis */ #define MAXREGION 5 /* max number of regions */ #define MAX_ZOOM_STACK 20 /* max stack depth for world stack */ #define MAXPARM 10 /* max number of parameters for non-lin fit */ #define MAXFIT 12 /* max degree of polynomial+1 that can be * fitted */ /* number of extra objects of a given type to allocate if not enough */ #define OBJECT_BUFNUM 10 #define MAX_ARROW 3 #define MAX_PREC 10 /* symbol types */ #define SYM_NONE 0 #define SYM_CIRCLE 1 #define SYM_SQUARE 2 #define SYM_DIAMOND 3 #define SYM_TRIANG1 4 #define SYM_TRIANG2 5 #define SYM_TRIANG3 6 #define SYM_TRIANG4 7 #define SYM_PLUS 8 #define SYM_X 9 #define SYM_SPLAT 10 #define SYM_CHAR 11 /* max number of symbols defined */ #define MAXSYM 12 /* dot (obsolete) */ #define SYM_DOT_OBS 1 /* * types of coordinate frames */ #define COORDINATES_XY 0 /* Cartesian coordinates */ #define COORDINATES_POLAR 1 /* Polar coordinates */ /* * types of axis scale mappings */ #define SCALE_NORMAL 0 /* normal linear scale */ #define SCALE_LOG 1 /* logarithmic scale */ #define SCALE_REC 2 /* reciprocal, reserved */ #define SCALE_LOGIT 3 /* logit scale */ /* * coordinates */ #define AXIS_TYPE_ANY -1 #define AXIS_TYPE_X 0 #define AXIS_TYPE_Y 1 #define AXIS_TYPE_BAD 2 /* * types of axes */ #define ALL_AXES -3 #define ALL_X_AXES -2 #define ALL_Y_AXES -1 #define X_AXIS 0 #define Y_AXIS 1 #define ZX_AXIS 2 #define ZY_AXIS 3 /* setno == all sets selected */ #define ALL_SETS -1 /* setno == new set to be created */ #define NEW_SET -2 /* * gno == all graphs selected */ #define ALL_GRAPHS -1 /* type of splines */ #define INTERP_LINEAR 0 #define INTERP_SPLINE 1 #define INTERP_ASPLINE 2 /* Canvas types */ #define PAGE_FREE 0 #define PAGE_FIXED 1 /* Strings and things */ #define OBJECT_NONE -1 #define OBJECT_LINE 0 #define OBJECT_BOX 1 #define OBJECT_ELLIPSE 2 #define OBJECT_STRING 3 /* Region definitions */ #define REGION_ABOVE 0 #define REGION_BELOW 1 #define REGION_TOLEFT 2 #define REGION_TORIGHT 3 #define REGION_POLYI 4 #define REGION_POLYO 5 #define REGION_HORIZI 6 #define REGION_VERTI 7 #define REGION_HORIZO 8 #define REGION_VERTO 9 /* Axis label layout */ #define LAYOUT_PARALLEL 0 #define LAYOUT_PERPENDICULAR 1 /* Placement (axis labels, ticks, error bars */ typedef enum { PLACEMENT_NORMAL, PLACEMENT_OPPOSITE, PLACEMENT_BOTH } PlacementType; /* Tick label placement */ #define LABEL_ONTICK 0 #define LABEL_BETWEEN 1 /* Coordinates */ #define COORD_VIEW 0 #define COORD_WORLD 1 /* Tick sign type */ #define SIGN_NORMAL 0 #define SIGN_ABSOLUTE 1 #define SIGN_NEGATE 2 /* Tick label/display formats */ #define FORMAT_INVALID -1 #define FORMAT_DECIMAL 0 #define FORMAT_EXPONENTIAL 1 #define FORMAT_GENERAL 2 #define FORMAT_POWER 3 #define FORMAT_SCIENTIFIC 4 #define FORMAT_ENGINEERING 5 #define FORMAT_COMPUTING 6 #define FORMAT_DDMMYY 7 #define FORMAT_MMDDYY 8 #define FORMAT_YYMMDD 9 #define FORMAT_MMYY 10 #define FORMAT_MMDD 11 #define FORMAT_MONTHDAY 12 #define FORMAT_DAYMONTH 13 #define FORMAT_MONTHS 14 #define FORMAT_MONTHSY 15 #define FORMAT_MONTHL 16 #define FORMAT_DAYOFWEEKS 17 #define FORMAT_DAYOFWEEKL 18 #define FORMAT_DAYOFYEAR 19 #define FORMAT_HMS 20 #define FORMAT_MMDDHMS 21 #define FORMAT_MMDDYYHMS 22 #define FORMAT_YYMMDDHMS 23 #define FORMAT_DEGREESLON 24 #define FORMAT_DEGREESMMLON 25 #define FORMAT_DEGREESMMSSLON 26 #define FORMAT_MMSSLON 27 #define FORMAT_DEGREESLAT 28 #define FORMAT_DEGREESMMLAT 29 #define FORMAT_DEGREESMMSSLAT 30 #define FORMAT_MMSSLAT 31 /* Focus policy */ #define FOCUS_CLICK 0 #define FOCUS_SET 1 #define FOCUS_FOLLOWS 2 /* Placement of labels etc */ #define TYPE_AUTO 0 #define TYPE_SPEC 1 /* User-defined tickmarks/labels */ #define TICKS_SPEC_NONE 0 #define TICKS_SPEC_MARKS 1 #define TICKS_SPEC_BOTH 2 /* Tick direction */ #define TICKS_IN 0 #define TICKS_OUT 1 #define TICKS_BOTH 2 /* Data source type */ #define SOURCE_DISK 0 #define SOURCE_PIPE 1 /* Types of running command */ #define RUN_AVG 0 #define RUN_MED 1 #define RUN_MIN 2 #define RUN_MAX 3 #define RUN_STD 4 /* Types of Fourier transforms */ #define FFT_FFT 0 #define FFT_INVFFT 1 #define FFT_DFT 2 #define FFT_INVDFT 3 /* return codes */ #define RETURN_SUCCESS (0) #define RETURN_FAILURE (1) #ifndef TRUE # define TRUE 1 #endif #ifndef FALSE # define FALSE 0 #endif /* types of autscales */ #define AUTOSCALE_NONE 0 #define AUTOSCALE_X 1 #define AUTOSCALE_Y 2 #define AUTOSCALE_XY 3 /* * for set selector gadgets */ #define SET_SELECT_ERROR -99 #define SET_SELECT_ACTIVE 0 #define SET_SELECT_ALL -1 #define SET_SELECT_NEXT -2 #define SET_SELECT_NEAREST -3 #define GRAPH_SELECT_CURRENT -1 #define GRAPH_SELECT_ALL -2 #define FILTER_SELECT_NONE 0 #define FILTER_SELECT_ACTIVE 1 #define FILTER_SELECT_ALL 2 #define FILTER_SELECT_INACT 3 #define FILTER_SELECT_DEACT 4 #define FILTER_SELECT_SORT 5 #define SELECTION_TYPE_SINGLE 0 #define SELECTION_TYPE_MULTIPLE 1 /* Default document name */ #define NONAME "Untitled" /* for data pruning */ #define PRUNE_INTERPOLATION 0 #define PRUNE_CIRCLE 1 #define PRUNE_ELLIPSE 2 #define PRUNE_RECTANGLE 3 #define PRUNE_LIN 0 #define PRUNE_LOG 1 #define PRUNE_VIEWPORT 0 #define PRUNE_WORLD 1 /* for io filters */ #define FILTER_INPUT 0 #define FILTER_OUTPUT 1 #define FILTER_MAGIC 0 #define FILTER_PATTERN 1 /* set line types */ #define LINE_TYPE_NONE 0 #define LINE_TYPE_STRAIGHT 1 #define LINE_TYPE_LEFTSTAIR 2 #define LINE_TYPE_RIGHTSTAIR 3 #define LINE_TYPE_SEGMENT2 4 #define LINE_TYPE_SEGMENT3 5 /* baseline types */ #define BASELINE_TYPE_0 0 #define BASELINE_TYPE_SMIN 1 #define BASELINE_TYPE_SMAX 2 #define BASELINE_TYPE_GMIN 3 #define BASELINE_TYPE_GMAX 4 #define BASELINE_TYPE_SAVG 5 /* set fill types */ #define SETFILL_NONE 0 #define SETFILL_POLYGON 1 #define SETFILL_BASELINE 2 /* types of ann. values */ #define AVALUE_TYPE_NONE 0 #define AVALUE_TYPE_X 1 #define AVALUE_TYPE_Y 2 #define AVALUE_TYPE_XY 3 #define AVALUE_TYPE_STRING 4 #define AVALUE_TYPE_Z 5 /* ticks */ #define TICK_TYPE_MAJOR 0 #define TICK_TYPE_MINOR 1 /* push set direction */ #define PUSH_SET_TOFRONT 0 #define PUSH_SET_TOBACK 1 /* restriction types */ #define RESTRICT_NONE -1 #define RESTRICT_WORLD -2 #define RESTRICT_REG0 0 #define RESTRICT_REG1 1 #define RESTRICT_REG2 2 #define RESTRICT_REG3 3 #define RESTRICT_REG4 4 /* * defaults */ typedef struct { int color; int bgcolor; int pattern; int lines; double linew; double charsize; int font; double symsize; } defaults; typedef struct { int color; int pattern; /* * int transparency; */ } Pen; /* A point in world coordinates */ typedef struct { double x; double y; } WPoint; /* A point in viewport coordinates */ typedef struct { double x; double y; } VPoint; typedef struct { double x; double y; } VVector; typedef struct { double xg1, xg2, yg1, yg2; /* window into world coords */ } world; typedef struct { double xv1, xv2, yv1, yv2; /* viewport */ } view; /* * typedefs for objects */ typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; double linew; int color; int fillcolor; int fillpattern; view bb; } boxtype; typedef struct { int type; double length; /* head length (L) */ double dL_ff; /* d/L form factor */ double lL_ff; /* l/L form factor */ } Arrow; typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; double linew; int color; int arrow_end; Arrow arrow; view bb; } linetype; typedef struct { int active; int loctype; int gno; double x1; double y1; double x2; double y2; int lines; double linew; int color; int fillcolor; int fillpattern; view bb; } ellipsetype; typedef struct { int active; int loctype; int gno; double x; double y; int color; int rot; int font; int just; double charsize; char *s; view bb; } plotstr; /* * world stack */ typedef struct { world w; /* current world */ } world_stack; typedef struct { plotstr title; /* graph title */ plotstr stitle; /* graph subtitle */ } labels; typedef struct { int active; /* active flag */ int type; /* regression type */ double xmin; double xmax; double coef[15]; } Regression; typedef struct { int active; /* active flag */ int type; /* regression type */ int npts; /* number of points */ double xmin; double xmax; double *a; double *b; double *c; double *d; } Spline; typedef struct { int active; /* on/off */ PlacementType ptype; /* placement type */ Pen pen; /* pen */ double linew; /* error bar line width */ int lines; /* error bar line style */ double riser_linew; /* connecting line between error limits line width */ int riser_lines; /* connecting line between error limits line style */ double barsize; /* size of error bar */ int arrow_clip; /* draw arrows if clipped */ double cliplen; /* riser clipped length (v.p.) */ } Errbar; /* Annotative strings for data values */ typedef struct { int active; /* active or not */ int type; /* type */ double size; /* char size */ int font; /* font */ int color; /* color */ int angle; /* angle */ int format; /* format */ int prec; /* precision */ char prestr[64]; /* prepend string */ char appstr[64]; /* append string */ VPoint offset; /* offset related to symbol position */ } AValue; typedef struct { int type; double wtpos; char *label; } tickloc; typedef struct { double size; /* length of tickmarks */ int color; /* color of tickmarks */ double linew; /* linewidth of tickmarks */ int lines; /* linestyle of tickmarks */ int gridflag; /* grid lines at tick marks */ } tickprops; typedef struct { int active; /* active or not */ int zero; /* "zero" axis or plain */ plotstr label; /* graph axis label */ int label_layout; /* axis label orientation (h or v) */ int label_place; /* axis label placement (specfied or auto) */ PlacementType label_op; /* tick labels on opposite side or both */ int t_drawbar; /* draw a bar connecting tick marks */ int t_drawbarcolor; /* color of bar */ int t_drawbarlines; /* linestyle of bar */ double t_drawbarlinew; /* line width of bar */ double offsx, offsy; /* offset of axes in viewport coords (attention: these are not x and y coordinates but perpendicular and parallel offsets */ int t_flag; /* toggle tickmark display */ int t_autonum; /* approximate default number of major ticks */ int t_spec; /* special (user-defined) tickmarks/ticklabels, */ /* can be none/marks/both marks and labels */ int t_round; /* place major ticks at rounded positions */ double tmajor; /* major tick divisions */ int nminor; /* number of minor ticks per one major division */ int nticks; /* total number of ticks */ tickloc tloc[MAX_TICKS]; /* locations of ticks */ int t_inout; /* ticks inward, outward or both */ PlacementType t_op; /* ticks on opposite side */ tickprops props; tickprops mprops; int tl_flag; /* toggle ticmark labels on or off */ int tl_angle; /* angle to draw labels */ int tl_format; /* tickmark label format */ int tl_prec; /* places to right of decimal point */ char *tl_formula; /* transformation formula */ int tl_skip; /* tick labels to skip */ int tl_staggered; /* tick labels staggered */ int tl_starttype; /* start at graphmin or use tl_start/stop */ int tl_stoptype; /* start at graphmax or use tl_start/stop */ double tl_start; /* value of x to begin tick labels and major ticks */ double tl_stop; /* value of x to end tick labels and major ticks */ PlacementType tl_op; /* tick labels on opposite side or both */ int tl_gaptype; /* tick label placement auto or specified */ VVector tl_gap; /* tick label to tickmark distance (parallel and perpendicular to axis) */ int tl_font; /* font to use for tick labels */ double tl_charsize; /* character size for tick labels */ int tl_color; /* color of tick labels */ char tl_appstr[64]; /* append string to tick label */ char tl_prestr[64]; /* prepend string to tick label */ } tickmarks; typedef struct { int active; /* legend on or off */ int loctype; /* locate in world or viewport coords */ int vgap; /* verticle gap between entries */ int hgap; /* horizontal gap(s) between legend string elements */ int len; /* length of line to draw */ int invert; /* switch between ascending and descending order of set legends */ double legx; /* location on graph */ double legy; int font; double charsize; int color; Pen boxpen; Pen boxfillpen; double boxlinew; /* legend frame line width */ int boxlines; /* legend frame line style */ view bb; } legend; typedef struct { int active; /* region on or off */ int type; /* region type */ int color; /* region color */ int lines; /* region linestyle */ double linew; /* region line width */ int linkto; /* associated with graph linkto */ int n; /* number of points if type is POLY */ double *x, *y; /* coordinates if type is POLY */ double x1, y1, x2, y2; /* starting and ending points if type is not POLY */ } region; typedef struct { int type; /* frame type */ Pen pen; /* frame pen */ int lines; /* frame linestyle */ double linew; /* frame line width */ Pen fillpen; /* fill pen */ } framep; /* parameters for non-linear fit */ typedef struct { double value; /* parameter itself */ int constr; /* whether or not to use constraints */ double min; /* low bound constraint */ double max; /* upper bound constraint */ } nonlparms; /* options for non-linear fit */ typedef struct { char *title; /* fit title */ char *formula; /* fit function */ int parnum; /* # of fit parameters */ double tolerance; /* tolerance */ } nonlopts; /* real time inputs */ typedef struct _Input_buffer { int fd; /* file descriptor */ int errors; /* number of successive parse errors */ int lineno; /* line number */ int zeros; /* number of successive reads of zero byte */ int reopen; /* non-zero if we should close and reopen */ /* when other side is closed (mainly for fifos) */ char *name; /* name of the input (filename or symbolic name) */ int size; /* size of the buffer for already read lines */ int used; /* number of bytes used in the buffer */ char *buf; /* buffer for already read lines */ unsigned long id; /* id for X library */ } Input_buffer; /* dates formats */ typedef enum { FMT_iso, FMT_european, FMT_us, FMT_nohint } Dates_format; /* rounding types for dates */ #define ROUND_SECOND 1 #define ROUND_MINUTE 2 #define ROUND_HOUR 3 #define ROUND_DAY 4 #define ROUND_MONTH 5 /* tokens for the calendar dates parser */ typedef struct { int value; int digits; } Int_token; #endif /* __DEFINES_H_ */ grace-5.1.23/src/pars.yacc0000644000076500001440000046064311014400276015035 0ustar fnevgenyusers%{ /* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * evaluate expressions, commands, parameter files * */ #include #include #include #include #include #include #include #if defined(HAVE_SYS_PARAM_H) # include #endif /* bison not always handles it well itself */ #if defined(HAVE_ALLOCA_H) # include #endif #include "defines.h" #include "globals.h" #include "cephes/cephes.h" #include "device.h" #include "utils.h" #include "files.h" #include "graphs.h" #include "graphutils.h" #include "plotone.h" #include "dlmodule.h" #include "t1fonts.h" #include "ssdata.h" #include "protos.h" #include "parser.h" #include "mathstuff.h" #define MAX_PARS_STRING_LENGTH 4096 #define CAST_DBL_TO_BOOL(x) (fabs(x) < 0.5 ? 0:1) typedef double (*ParserFnc)(); extern graph *g; static double s_result; /* return value if a scalar expression is scanned*/ static grarr *v_result; /* return value if a vector expression is scanned*/ static int expr_parsed, vexpr_parsed; static int interr; static grarr freelist[100]; /* temporary vectors */ static int fcnt = 0; /* number of the temporary vectors allocated */ static target trgt_pool[100]; /* pool of temporary targets */ static int tgtn = 0; /* number of the temporary targets used */ int naxis = 0; /* current axis */ static int curline, curbox, curellipse, curstring; /* these guys attempt to avoid reentrancy problems */ static int gotparams = FALSE, gotread = FALSE, gotnlfit = FALSE; int readxformat; static int nlfit_gno, nlfit_setno, nlfit_nsteps; static double *nlfit_warray = NULL; char batchfile[GR_MAXPATHLEN] = "", paramfile[GR_MAXPATHLEN] = "", readfile[GR_MAXPATHLEN] = ""; static char f_string[MAX_PARS_STRING_LENGTH]; /* buffer for string to parse */ static int pos; /* the graph, set, and its length of the parser's current state */ static int whichgraph; static int whichset; /* the graph and set of the left part of a vector assignment */ static int vasgn_gno; static int vasgn_setno; static int alias_force = FALSE; /* controls whether aliases can override existing keywords */ extern char print_file[]; extern char *close_input; static int filltype_obs; static int index_shift = 0; /* 0 for C, 1 for F77 index notation */ static void free_tmpvrbl(grarr *vrbl); static void copy_vrbl(grarr *dest, grarr *src); static int find_set_bydata(double *data, target *tgt); static int getcharstr(void); static void ungetchstr(void); static int follow(int expect, int ifyes, int ifno); static int yylex(void); static int yyparse(void); static void yyerror(char *s); static int findf(symtab_entry *keytable, char *s); /* Total (intrinsic + user-defined) list of functions and keywords */ symtab_entry *key; %} %union { int ival; double dval; char *sval; double *dptr; target *trgt; grarr *vrbl; } %token KEY_VAR %token KEY_VEC %token KEY_CONST %token KEY_UNIT %token KEY_FUNC_I %token KEY_FUNC_D %token KEY_FUNC_NN %token KEY_FUNC_ND %token KEY_FUNC_DD %token KEY_FUNC_NND %token KEY_FUNC_PPD %token KEY_FUNC_PPPD %token KEY_FUNC_PPPPD %token KEY_FUNC_PPPPPD %token INDEX %token DATE %token VAR_D /* a (pointer to) double variable */ %token VEC_D /* a (pointer to) double array variable */ %token CONSTANT /* a (double) constant */ %token UCONSTANT /* a (double) unit constant */ %token FUNC_I /* a function of 1 int variable */ %token FUNC_D /* a function of 1 double variable */ %token FUNC_NN /* a function of 2 int parameters */ %token FUNC_ND /* a function of 1 int parameter and 1 double variable */ %token FUNC_DD /* a function of 2 double variables */ %token FUNC_NND /* a function of 2 int parameters and 1 double variable */ %token FUNC_PPD /* a function of 2 double parameters and 1 double variable */ %token FUNC_PPPD /* a function of 3 double parameters and 1 double variable */ %token FUNC_PPPPD /* a function of 4 double parameters and 1 double variable */ %token FUNC_PPPPPD/* a function of 5 double parameters and 1 double variable */ %token ABOVE %token ABSOLUTE %token ALIAS %token ALT %token ALTXAXIS %token ALTYAXIS %token ANGLE %token ANTIALIASING %token APPEND %token ARRANGE %token ARROW %token ASCENDING %token ASPLINE %token AUTO %token AUTOSCALE %token AUTOTICKS %token AVALUE %token AVG %token BACKGROUND %token BAR %token BARDY %token BARDYDY %token BASELINE %token BATCH %token BEGIN %token BELOW %token BETWEEN %token BLACKMAN %token BLOCK %token BOTH %token BOTTOM %token BOX %token CD %token CENTER %token CHAR %token CHART %token CHRSTR %token CLEAR %token CLICK %token CLIP %token CLOSE %token COEFFICIENTS %token COLOR %token COMMENT %token COMPLEX %token COMPUTING %token CONSTRAINTS %token COPY %token CYCLE %token DAYMONTH %token DAYOFWEEKL %token DAYOFWEEKS %token DAYOFYEAR %token DDMMYY %token DECIMAL %token DEF %token DEFAULT %token DEFINE %token DEGREESLAT %token DEGREESLON %token DEGREESMMLAT %token DEGREESMMLON %token DEGREESMMSSLAT %token DEGREESMMSSLON %token DESCENDING %token DESCRIPTION %token DEVICE %token DFT %token DIFFERENCE %token DISK %token DOWN %token DPI %token DROP %token DROPLINE %token ECHO %token ELLIPSE %token ENGINEERING %token ERRORBAR %token EXIT %token EXPONENTIAL %token FFT %token FILEP %token FILL %token FIT %token FIXED %token FIXEDPOINT %token FLUSH %token FOCUS %token FOLLOWS %token FONTP %token FORCE %token FORMAT %token FORMULA %token FRAMEP %token FREE %token FREQUENCY %token FROM %token GENERAL %token GETP %token GRAPH %token GRAPHNO %token GRID %token HAMMING %token HANNING %token HARDCOPY %token HBAR %token HELP %token HGAP %token HIDDEN %token HISTOGRAM %token HMS %token HORIZI %token HORIZONTAL %token HORIZO %token ID %token IFILTER %token IMAX %token IMIN %token IN %token INCREMENT %token INOUT %token INT %token INTEGRATE %token INTERPOLATE %token INVDFT %token INVERT %token INVFFT %token JUST %token KILL %token LABEL %token LANDSCAPE %token LAYOUT %token LEFT %token LEGEND %token LENGTH %token LINCONV %token LINE %token LINEAR %token LINESTYLE %token LINEWIDTH %token LINK %token LOAD %token LOCTYPE %token LOG %token LOGARITHMIC %token LOGIT %token LOGX %token LOGXY %token LOGY %token MAGIC %token MAGNITUDE %token MAJOR %token MAP %token MAXP %token MESH %token MINP %token MINOR %token MMDD %token MMDDHMS %token MMDDYY %token MMDDYYHMS %token MMSSLAT %token MMSSLON %token MMYY %token MONTHDAY %token MONTHL %token MONTHS %token MONTHSY %token MOVE %token NEGATE %token NEW %token NONE %token NONLFIT %token NORMAL %token NXY %token OFF %token OFFSET %token OFFSETX %token OFFSETY %token OFILTER %token ON %token ONREAD %token OP %token OPPOSITE %token OUT %token PAGE %token PARA %token PARAMETERS %token PARZEN %token PATTERN %token PERIOD %token PERP %token PHASE %token PIE %token PIPE %token PLACE %token POINT %token POLAR %token POLYI %token POLYO %token POP %token PORTRAIT %token POWER %token PREC %token PREPEND %token PRINT %token PS %token PUSH %token PUTP %token RAND %token READ %token REAL %token RECIPROCAL %token REDRAW %token REFERENCE %token REGNUM %token REGRESS %token RESIZE %token RESTRICT %token REVERSE %token RIGHT %token RISER %token ROT %token ROUNDED %token RSUM %token RULE %token RUNAVG %token RUNMAX %token RUNMED %token RUNMIN %token RUNSTD %token SAVEALL %token SCALE %token SCIENTIFIC %token SCROLL %token SD %token SET %token SETNUM %token SFORMAT %token SIGN %token SIZE %token SKIP %token SLEEP %token SMITH %token SORT %token SOURCE %token SPEC %token SPLINE %token SPLIT %token STACK %token STACKED %token STACKEDBAR %token STACKEDHBAR %token STAGGER %token START %token STOP %token STRING %token SUM %token SUBTITLE %token SWAP %token SYMBOL %token TARGET %token TICKLABEL %token TICKP %token TICKSP %token TIMER %token TIMESTAMP %token TITLE %token TO %token TOP %token TRIANGULAR %token TYPE %token UP %token UPDATEALL %token USE %token VERSION %token VERTI %token VERTICAL %token VERTO %token VGAP %token VIEW %token VX1 %token VX2 %token VXMAX %token VY1 %token VY2 %token VYMAX %token WELCH %token WITH %token WORLD %token WRAP %token WRITE %token WX1 %token WX2 %token WY1 %token WY2 %token X_TOK %token X0 %token X1 %token XAXES %token XAXIS %token XCOR %token XMAX %token XMIN %token XY %token XYAXES %token XYBOXPLOT %token XYCOLOR %token XYCOLPAT %token XYDX %token XYDXDX %token XYDXDXDYDY %token XYDXDY %token XYDY %token XYDYDY %token XYHILO %token XYR %token XYSIZE %token XYSTRING %token XYVMAP %token XYZ %token Y_TOK %token Y0 %token Y1 %token Y2 %token Y3 %token Y4 %token YAXES %token YAXIS %token YEAR %token YMAX %token YMIN %token YYMMDD %token YYMMDDHMS %token ZERO %token ZNORM %token FITPARM %token FITPMAX %token FITPMIN %token NUMBER %token NEW_TOKEN %type onoff %type selectgraph %type selectset %type pagelayout %type pageorient %type regiontype %type color_select %type pattern_select %type font_select %type lines_select %type linew_select %type graphtype %type xytype %type scaletype %type signchoice %type colpat_obs %type direction %type formatchoice %type inoutchoice %type justchoice %type opchoice %type opchoice_sel %type opchoice_obs %type opchoice_sel_obs %type worldview %type filtermethod %type filtertype %type tickspectype %type sourcetype %type interpmethod %type stattype %type datacolumn %type runtype %type ffttype %type fourierdata %type fourierloadx %type fourierloady %type windowtype %type nonlfitopts %type sortdir %type sorton %type proctype %type indx %type iexpr %type nexpr %type sexpr %type jdate %type jrawdate %type expr %type array %type lside_array %type vexpr /* Precedence */ %nonassoc '?' ':' %left OR %left AND %nonassoc GT LT LE GE EQ NE %right UCONSTANT %left '+' '-' %left '*' '/' '%' %nonassoc UMINUS NOT /* negation--unary minus */ %right '^' /* exponentiation */ %left '.' %% full_list: multi_list | expr { expr_parsed = TRUE; s_result = $1; } | vexpr { vexpr_parsed = TRUE; v_result = $1; } ; multi_list: list | multi_list ';' list ; list: /* empty */ | parmset {} | parmset_obs {} | regionset {} | setaxis {} | set_setprop {} | actions {} | options {} | asgn {} | vasgn {} | defines {} | error { return 1; } ; expr: NUMBER { $$ = $1; } | VAR_D { $$ = *($1); } | FITPARM { $$ = nonl_parms[$1].value; } | FITPMAX { $$ = nonl_parms[$1].max; } | FITPMIN { $$ = nonl_parms[$1].min; } | array indx { if ($2 >= $1->length) { errmsg("Access beyond array bounds"); return 1; } $$ = $1->data[$2]; } | stattype '(' vexpr ')' { double dummy, dummy2; int idummy, ind, length = $3->length; if ($3->data == NULL) { yyerror("NULL variable, check set type"); return 1; } switch ($1) { case MINP: $$ = vmin($3->data, length); break; case MAXP: $$ = vmax($3->data, length); break; case AVG: stasum($3->data, length, &$$, &dummy); break; case SD: stasum($3->data, length, &dummy, &$$); break; case SUM: stasum($3->data, length, &$$, &dummy); $$ *= length; break; case IMIN: minmax($3->data, length, &dummy, &dummy2, &ind, &idummy); $$ = (double) ind; break; case IMAX: minmax($3->data, length, &dummy, &dummy2, &idummy, &ind); $$ = (double) ind; break; } } | INT '(' vexpr ',' vexpr ')' { if ($3->length != $5->length) { yyerror("X and Y are of different length"); return 1; } else { $$ = trapint($3->data, $5->data, NULL, NULL, $3->length); } } | array '.' LENGTH { $$ = $1->length; } | selectset '.' LENGTH { $$ = getsetlength($1->gno, $1->setno); } | selectset '.' ID { $$ = $1->setno; } | selectgraph '.' ID { $$ = $1; } | CONSTANT { $$ = ((ParserFnc) (key[$1].data)) (); } | expr UCONSTANT { $$ = $1 * ((ParserFnc) (key[$2].data)) (); } | RAND { $$ = drand48(); } | FUNC_I '(' iexpr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3); } | FUNC_D '(' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3); } | FUNC_ND '(' iexpr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5); } | FUNC_NN '(' iexpr ',' iexpr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5); } | FUNC_DD '(' expr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5); } | FUNC_NND '(' iexpr ',' iexpr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7); } | FUNC_PPD '(' expr ',' expr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7); } | FUNC_PPPD '(' expr ',' expr ',' expr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9); } | FUNC_PPPPD '(' expr ',' expr ',' expr ',' expr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9, $11); } | FUNC_PPPPPD '(' expr ',' expr ',' expr ',' expr ',' expr ',' expr ')' { $$ = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9, $11, $13); } | selectgraph '.' VX1 { $$ = g[$1].v.xv1; } | selectgraph '.' VX2 { $$ = g[$1].v.xv2; } | selectgraph '.' VY1 { $$ = g[$1].v.yv1; } | selectgraph '.' VY2 { $$ = g[$1].v.yv2; } | selectgraph '.' WX1 { $$ = g[$1].w.xg1; } | selectgraph '.' WX2 { $$ = g[$1].w.xg2; } | selectgraph '.' WY1 { $$ = g[$1].w.yg1; } | selectgraph '.' WY2 { $$ = g[$1].w.yg2; } | DATE '(' jdate ')' { $$ = $3; } | DATE '(' iexpr ',' nexpr ',' nexpr ')' { /* yr, mo, day */ $$ = cal_and_time_to_jul($3, $5, $7, 12, 0, 0.0); } | DATE '(' iexpr ',' nexpr ',' nexpr ',' nexpr ',' nexpr ',' expr ')' { /* yr, mo, day, hr, min, sec */ $$ = cal_and_time_to_jul($3, $5, $7, $9, $11, $13); } | VX1 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].v.xv1; } | VX2 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].v.xv2; } | VY1 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].v.yv1; } | VY2 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].v.yv2; } | WX1 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].w.xg1; } | WX2 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].w.xg2; } | WY1 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].w.yg1; } | WY2 { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } $$ = g[whichgraph].w.yg2; } | VXMAX { double vx, vy; get_page_viewport(&vx, &vy); $$ = vx; } | VYMAX { double vx, vy; get_page_viewport(&vx, &vy); $$ = vy; } | '(' expr ')' { $$ = $2; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | '-' expr %prec UMINUS { $$ = -$2; } | '+' expr %prec UMINUS { $$ = $2; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { if ($3 != 0.0) { $$ = $1 / $3; } else { yyerror("Divide by zero"); return 1; } } | expr '%' expr { if ($3 != 0.0) { $$ = fmod($1, $3); } else { yyerror("Divide by zero"); return 1; } } | expr '^' expr { if ($1 < 0 && rint($3) != $3) { yyerror("Negative value raised to non-integer power"); return 1; } else if ($1 == 0.0 && $3 <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { $$ = pow($1, $3); } } | expr '?' expr ':' expr { $$ = $1 ? $3 : $5; } | expr GT expr { $$ = ($1 > $3); } | expr LT expr { $$ = ($1 < $3); } | expr LE expr { $$ = ($1 <= $3); } | expr GE expr { $$ = ($1 >= $3); } | expr EQ expr { $$ = ($1 == $3); } | expr NE expr { $$ = ($1 != $3); } | expr AND expr { $$ = $1 && $3; } | expr OR expr { $$ = $1 || $3; } | NOT expr { $$ = !($2); } ; sexpr: CHRSTR { $$ = $1; } | sexpr '.' sexpr { $$ = concat_strings($1, $3); xfree($3); } | sexpr '.' expr { char buf[32]; set_locale_num(TRUE); sprintf(buf, "%g", $3); set_locale_num(FALSE); $$ = concat_strings($1, buf); } ; iexpr: expr { int itmp = rint($1); if (fabs(itmp - $1) > 1.e-6) { yyerror("Non-integer value supplied for integer"); return 1; } $$ = itmp; } ; nexpr: iexpr { if ($1 < 0) { yyerror("Negative value supplied for non-negative"); return 1; } $$ = $1; } ; indx: '[' iexpr ']' { int itmp = $2 - index_shift; if (itmp < 0) { yyerror("Negative index"); return 1; } $$ = itmp; } ; jdate: expr { $$ = $1; } | sexpr { double jul; Dates_format dummy; if (parse_date($1, get_date_hint(), FALSE, &jul, &dummy) == RETURN_SUCCESS) { xfree($1); $$ = jul; } else { xfree($1); yyerror("Invalid date"); return 1; } } ; jrawdate: expr { $$ = $1; } | sexpr { double jul; Dates_format dummy; if (parse_date($1, get_date_hint(), TRUE, &jul, &dummy) == RETURN_SUCCESS) { xfree($1); $$ = jul; } else { xfree($1); yyerror("Invalid date"); return 1; } } ; array: VEC_D { $$ = $1; } | datacolumn { double *ptr = getcol(vasgn_gno, vasgn_setno, $1); $$ = &freelist[fcnt++]; $$->type = GRARR_SET; $$->data = ptr; if (ptr == NULL) { errmsg("NULL variable - check set type"); return 1; } else { $$->length = getsetlength(vasgn_gno, vasgn_setno); } } | selectset '.' datacolumn { double *ptr = getcol($1->gno, $1->setno, $3); $$ = &freelist[fcnt++]; $$->type = GRARR_SET; $$->data = ptr; if (ptr == NULL) { errmsg("NULL variable - check set type"); return 1; } else { $$->length = getsetlength($1->gno, $1->setno); } } ; vexpr: array { $$ = $1; } | array '[' iexpr ':' iexpr ']' { int start = $3 - index_shift, stop = $5 - index_shift; if (start < 0 || stop < start || stop >= $1->length) { yyerror("Invalid index range"); } else { int len = stop - start + 1; double *ptr = xmalloc(len*SIZEOF_DOUBLE); if ($$->data == NULL) { yyerror("Not enough memory"); } else { int i; $$ = &freelist[fcnt++]; $$->data = ptr; $$->length = len; $$->type = GRARR_TMP; for (i = 0; i < len; i++) { $$->data[i] = $1->data[i + $3]; } } } } | MESH '(' nexpr ')' { int len = $3; if (len < 1) { yyerror("npoints must be > 0"); } else { double *ptr = allocate_index_data(len); if (ptr == NULL) { errmsg("Malloc failed"); return 1; } else { $$ = &freelist[fcnt++]; $$->type = GRARR_TMP; $$->data = ptr; $$->length = len; } } } | MESH '(' expr ',' expr ',' nexpr ')' { int len = $7; if (len < 2) { yyerror("npoints must be > 1"); } else { double *ptr = allocate_mesh($3, $5, len); if (ptr == NULL) { errmsg("Malloc failed"); return 1; } else { $$ = &freelist[fcnt++]; $$->type = GRARR_TMP; $$->data = ptr; $$->length = len; } } } | RAND '(' nexpr ')' { int i; $$ = &freelist[fcnt++]; $$->data = xmalloc($3*SIZEOF_DOUBLE); if ($$->data == NULL) { errmsg("Not enough memory"); return 1; } else { $$->length = $3; $$->type = GRARR_TMP; } for (i = 0; i < $$->length; i++) { $$->data[i] = drand48(); } } | REGNUM '(' selectset ')' { int rtype, i, len; char *rarray; rtype = RESTRICT_REG0 + $1; if (get_restriction_array($3->gno, $3->setno, rtype, FALSE, &rarray) != RETURN_SUCCESS) { errmsg("Error in region evaluation"); return 1; } len = getsetlength($3->gno, $3->setno); $$ = &freelist[fcnt++]; $$->data = xmalloc(len*SIZEOF_DOUBLE); if ($$->data == NULL) { errmsg("Not enough memory"); return 1; } else { $$->length = len; $$->type = GRARR_TMP; } for (i = 0; i < $$->length; i++) { $$->data[i] = rarray[i]; } xfree(rarray); } | RSUM '(' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 1; i < $$->length; i++) { $$->data[i] += $$->data[i - 1]; } } | FUNC_I '(' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ((int) ($3->data[i])); } } | FUNC_D '(' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) (($3->data[i])); } } | FUNC_DD '(' vexpr ',' vexpr ')' { int i; if ($3->length != $5->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3->data[i], $5->data[i]); } } | FUNC_DD '(' expr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $5); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5->data[i]); } } | FUNC_DD '(' vexpr ',' expr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3->data[i], $5); } } | FUNC_ND '(' iexpr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $5); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5->data[i]); } } | FUNC_NND '(' iexpr ',' iexpr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $7); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7->data[i]); } } | FUNC_PPD '(' expr ',' expr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $7); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7->data[i]); } } | FUNC_PPPD '(' expr ',' expr ',' expr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $9); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9->data[i]); } } | FUNC_PPPPD '(' expr ',' expr ',' expr ',' expr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $11); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9, $11->data[i]); } } | FUNC_PPPPPD '(' expr ',' expr ',' expr ',' expr ',' expr ',' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $13); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ((ParserFnc) (key[$1].data)) ($3, $5, $7, $9, $11, $13->data[i]); } } | vexpr '+' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] + $3->data[i]; } } | vexpr '+' expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] + $3; } } | expr '+' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1 + $3->data[i]; } } | vexpr '-' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] - $3->data[i]; } } | vexpr '-' expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] - $3; } } | expr '-' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1 - $3->data[i]; } } | vexpr '*' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] * $3->data[i]; } } | vexpr '*' expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] * $3; } } | expr '*' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1 * $3->data[i]; } } | vexpr '/' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($3->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } $$->data[i] = $1->data[i] / $3->data[i]; } } | vexpr '/' expr { int i; if ($3 == 0.0) { errmsg("Divide by zero"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] / $3; } } | expr '/' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($3->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } $$->data[i] = $1 / $3->data[i]; } } | vexpr '%' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($3->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } else { $$->data[i] = fmod($1->data[i], $3->data[i]); } } } | vexpr '%' expr { int i; if ($3 == 0.0) { errmsg("Divide by zero"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = fmod($1->data[i], $3); } } | expr '%' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($3->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } else { $$->data[i] = fmod($1, $3->data[i]); } } } | vexpr '^' vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($1->data[i] < 0 && rint($3->data[i]) != $3->data[i]) { yyerror("Negative value raised to non-integer power"); return 1; } else if ($1->data[i] == 0.0 && $3->data[i] <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { $$->data[i] = pow($1->data[i], $3->data[i]); } } } | vexpr '^' expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($1->data[i] < 0 && rint($3) != $3) { yyerror("Negative value raised to non-integer power"); return 1; } else if ($1->data[i] == 0.0 && $3 <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { $$->data[i] = pow($1->data[i], $3); } } } | expr '^' vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { if ($1 < 0 && rint($3->data[i]) != $3->data[i]) { yyerror("Negative value raised to non-integer power"); return 1; } else if ($1 == 0.0 && $3->data[i] <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { $$->data[i] = pow($1, $3->data[i]); } } } | vexpr UCONSTANT { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] * ((ParserFnc) (key[$2].data)) (); } } | vexpr '?' expr ':' expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3 : $5; } } | vexpr '?' expr ':' vexpr { int i; if ($1->length != $5->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3 : $5->data[i]; } } | vexpr '?' vexpr ':' expr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3->data[i] : $5; } } | vexpr '?' vexpr ':' vexpr { int i; if ($1->length != $5->length || $1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = CAST_DBL_TO_BOOL($1->data[i]) ? $3->data[i] : $5->data[i]; } } | vexpr OR vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] || $3->data[i]; } } | vexpr OR expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] || $3; } } | expr OR vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1 || $3->data[i]; } } | vexpr AND vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] && $3->data[i]; } } | vexpr AND expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1->data[i] && $3; } } | expr AND vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $1 && $3->data[i]; } } | vexpr GT vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] > $3->data[i]); } } | vexpr GT expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] > $3); } } | expr GT vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 > $3->data[i]); } } | vexpr LT vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] < $3->data[i]); } } | vexpr LT expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] < $3); } } | expr LT vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 < $3->data[i]); } } | vexpr GE vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] >= $3->data[i]); } } | vexpr GE expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] >= $3); } } | expr GE vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 >= $3->data[i]); } } | vexpr LE vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] <= $3->data[i]); } } | vexpr LE expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] <= $3); } } | expr LE vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 <= $3->data[i]); } } | vexpr EQ vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] == $3->data[i]); } } | vexpr EQ expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] == $3); } } | expr EQ vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 == $3->data[i]); } } | vexpr NE vexpr { int i; if ($1->length != $3->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] != $3->data[i]); } } | vexpr NE expr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $1); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1->data[i] != $3); } } | expr NE vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $3); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = ($1 != $3->data[i]); } } | NOT vexpr { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $2); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = !$2->data[i]; } } | '(' vexpr ')' { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $2); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = $2->data[i]; } } | '-' vexpr %prec UMINUS { int i; $$ = &freelist[fcnt++]; copy_vrbl($$, $2); $$->type = GRARR_TMP; for (i = 0; i < $$->length; i++) { $$->data[i] = - $2->data[i]; } } ; asgn: VAR_D '=' expr { *($1) = $3; } | FITPARM '=' expr { nonl_parms[$1].value = $3; } | FITPMAX '=' expr { nonl_parms[$1].max = $3; } | FITPMIN '=' expr { nonl_parms[$1].min = $3; } | array indx '=' expr { if ($2 >= $1->length) { yyerror("Access beyond array bounds"); return 1; } $1->data[$2] = $4; } ; lside_array: array { target tgt; switch ($1->type) { case GRARR_SET: if (find_set_bydata($1->data, &tgt) == RETURN_SUCCESS) { vasgn_gno = tgt.gno; vasgn_setno = tgt.setno; } else { errmsg("Internal error"); return 1; } break; case GRARR_VEC: vasgn_gno = -1; vasgn_setno = -1; break; default: /* It can NOT be a tmp array on the left side! */ errmsg("Internal error"); return 1; } $$ = $1; } ; vasgn: lside_array '=' vexpr { int i; if ($1->length != $3->length) { errmsg("Left and right vectors are of different lengths"); return 1; } for (i = 0; i < $1->length; i++) { $1->data[i] = $3->data[i]; } } | lside_array '=' expr { int i; for (i = 0; i < $1->length; i++) { $1->data[i] = $3; } } ; defines: DEFINE NEW_TOKEN { symtab_entry tmpkey; double *var; var = xmalloc(SIZEOF_DOUBLE); *var = 0.0; tmpkey.s = $2; tmpkey.type = KEY_VAR; tmpkey.data = (void *) var; if (addto_symtab(tmpkey) != RETURN_SUCCESS) { yyerror("Adding new symbol failed"); } xfree($2); } | DEFINE NEW_TOKEN '[' ']' { if (define_parser_arr($2) == NULL) { yyerror("Adding new symbol failed"); } xfree($2); } | DEFINE NEW_TOKEN '[' nexpr ']' { grarr *var; if ((var = define_parser_arr($2)) == NULL) { yyerror("Adding new symbol failed"); } else { realloc_vrbl(var, $4); } xfree($2); } | DEFINE VAR_D { yyerror("Keyword already exists"); } | DEFINE VEC_D { yyerror("Keyword already exists"); } | CLEAR VAR_D { undefine_parser_var((void *) $2); xfree($2); } | CLEAR VEC_D { realloc_vrbl($2, 0); undefine_parser_var((void *) $2); xfree($2); } | ALIAS sexpr sexpr { int position; lowtoupper($3); if ((position = findf(key, $3)) >= 0) { symtab_entry tmpkey; tmpkey.s = $2; tmpkey.type = key[position].type; tmpkey.data = key[position].data; if (addto_symtab(tmpkey) != RETURN_SUCCESS) { yyerror("Keyword already exists"); } } else { yyerror("Aliased keyword not found"); } xfree($2); xfree($3); } | ALIAS FORCE onoff { alias_force = $3; } | USE sexpr TYPE proctype FROM sexpr { if (load_module($6, $2, $2, $4) != 0) { yyerror("DL module load failed"); } xfree($2); xfree($6); } | USE sexpr TYPE proctype FROM sexpr ALIAS sexpr { if (load_module($6, $2, $8, $4) != 0) { yyerror("DL module load failed"); } xfree($2); xfree($6); xfree($8); } ; regionset: REGNUM onoff { rg[$1].active = $2; } | REGNUM TYPE regiontype { rg[$1].type = $3; } | REGNUM color_select { rg[$1].color = $2; } | REGNUM lines_select { rg[$1].lines = $2; } | REGNUM linew_select { rg[$1].linew = $2; } | REGNUM LINE expr ',' expr ',' expr ',' expr { rg[$1].x1 = $3; rg[$1].y1 = $5; rg[$1].x2 = $7; rg[$1].y2 = $9; } | REGNUM XY expr ',' expr { rg[$1].x = xrealloc(rg[$1].x, (rg[$1].n + 1) * SIZEOF_DOUBLE); rg[$1].y = xrealloc(rg[$1].y, (rg[$1].n + 1) * SIZEOF_DOUBLE); rg[$1].x[rg[$1].n] = $3; rg[$1].y[rg[$1].n] = $5; rg[$1].n++; } | LINK REGNUM TO selectgraph { rg[$2].linkto = $4; } ; parmset: VERSION nexpr { if (set_project_version($2) != RETURN_SUCCESS) { errmsg("Project version is newer than software!"); } if (get_project_version() < 50001) { map_fonts(FONT_MAP_ACEGR); } else { map_fonts(FONT_MAP_DEFAULT); } } | PAGE RESIZE nexpr ',' nexpr { set_page_dimensions($3, $5, TRUE); } | PAGE SIZE nexpr ',' nexpr { set_page_dimensions($3, $5, FALSE); } | DEVICE sexpr PAGE SIZE nexpr ',' nexpr { int device_id; Device_entry dev; device_id = get_device_by_name($2); xfree($2); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.pg.width = (long) ($5*dev.pg.dpi/72); dev.pg.height = (long) ($7*dev.pg.dpi/72); set_device_props(device_id, dev); } } | DEVICE sexpr DPI expr { int device_id; Device_entry dev; device_id = get_device_by_name($2); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.pg.dpi = $4; set_device_props(device_id, dev); } xfree($2); } | DEVICE sexpr FONTP ANTIALIASING onoff { int device_id; Device_entry dev; device_id = get_device_by_name($2); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.fontaa = $5; set_device_props(device_id, dev); } xfree($2); } | DEVICE sexpr FONTP onoff { int device_id; Device_entry dev; device_id = get_device_by_name($2); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.devfonts = $4; set_device_props(device_id, dev); } xfree($2); } | DEVICE sexpr OP sexpr { int device_id; device_id = get_device_by_name($2); if (device_id < 0) { yyerror("Unknown device"); } else { if (parse_device_options(device_id, $4) != RETURN_SUCCESS) { yyerror("Incorrect device option string"); } } xfree($2); xfree($4); } | HARDCOPY DEVICE sexpr { set_printer_by_name($3); xfree($3); } | REFERENCE DATE jrawdate { set_ref_date($3); } | DATE WRAP onoff { allow_two_digits_years($3); } | DATE WRAP YEAR iexpr { set_wrap_year($4); } | BACKGROUND color_select { setbgcolor($2); } | PAGE BACKGROUND FILL onoff { setbgfill($4); } | PAGE SCROLL expr '%' { scroll_proc((int) $3); } | PAGE INOUT expr '%' { scrollinout_proc((int) $3); } | LINK PAGE onoff { scrolling_islinked = $3; } | STACK WORLD expr ',' expr ',' expr ',' expr { add_world(whichgraph, $3, $5, $7, $9); } | TIMER nexpr { timer_delay = $2; } | TARGET selectset { target_set = *($2); set_parser_setno(target_set.gno, target_set.setno); } | WITH selectgraph { set_parser_gno($2); } | WITH selectset { set_parser_setno($2->gno, $2->setno); } /* Hot links */ | selectset LINK sourcetype sexpr { set_hotlink($1->gno, $1->setno, 1, $4, $3); xfree($4); } | selectset LINK onoff { set_hotlink($1->gno, $1->setno, $3, NULL, 0); } /* boxes */ | WITH BOX { curbox = next_box(); } | WITH BOX nexpr { int no = $3; if (is_valid_box(no) || realloc_boxes(no + 1) == RETURN_SUCCESS) { curbox = no; } } | BOX onoff { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].active = $2; } } | BOX selectgraph { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].gno = $2; } } | BOX expr ',' expr ',' expr ',' expr { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].x1 = $2; boxes[curbox].y1 = $4; boxes[curbox].x2 = $6; boxes[curbox].y2 = $8; } } | BOX LOCTYPE worldview { box_loctype = $3; } | BOX lines_select { box_lines = $2; } | BOX linew_select { box_linew = $2; } | BOX color_select { box_color = $2; } | BOX FILL color_select { box_fillcolor = $3; } | BOX FILL pattern_select { box_fillpat = $3; } | BOX DEF { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].lines = box_lines; boxes[curbox].linew = box_linew; boxes[curbox].color = box_color; if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = 1; break; case PATTERN: boxes[curbox].fillcolor = 1; boxes[curbox].fillpattern = box_fillpat; break; default: /* NONE */ boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = 0; break; } } else { boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = box_fillpat; } boxes[curbox].loctype = box_loctype; } } /* ellipses */ | WITH ELLIPSE { curellipse = next_ellipse(); } | WITH ELLIPSE nexpr { int no = $3; if (is_valid_ellipse(no) || realloc_ellipses(no + 1) == RETURN_SUCCESS) { curellipse = no; } } | ELLIPSE onoff { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].active = $2; } } | ELLIPSE selectgraph { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].gno = $2; } } | ELLIPSE expr ',' expr ',' expr ',' expr { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].x1 = $2; ellip[curellipse].y1 = $4; ellip[curellipse].x2 = $6; ellip[curellipse].y2 = $8; } } | ELLIPSE LOCTYPE worldview { ellipse_loctype = $3; } | ELLIPSE lines_select { ellipse_lines = $2; } | ELLIPSE linew_select { ellipse_linew = $2; } | ELLIPSE color_select { ellipse_color = $2; } | ELLIPSE FILL color_select { ellipse_fillcolor = $3; } | ELLIPSE FILL pattern_select { ellipse_fillpat = $3; } | ELLIPSE DEF { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].lines = ellipse_lines; ellip[curellipse].linew = ellipse_linew; ellip[curellipse].color = ellipse_color; if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = 1; break; case PATTERN: ellip[curellipse].fillcolor = 1; ellip[curellipse].fillpattern = ellipse_fillpat; break; default: /* NONE */ ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = 0; break; } } else { ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = ellipse_fillpat; } ellip[curellipse].loctype = ellipse_loctype; } } /* lines */ | WITH LINE { curline = next_line(); } | WITH LINE nexpr { int no = $3; if (is_valid_line(no) || realloc_lines(no + 1) == RETURN_SUCCESS) { curline = no; } } | LINE onoff { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].active = $2; } } | LINE selectgraph { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].gno = $2; } } | LINE expr ',' expr ',' expr ',' expr { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].x1 = $2; lines[curline].y1 = $4; lines[curline].x2 = $6; lines[curline].y2 = $8; } } | LINE LOCTYPE worldview { line_loctype = $3; } | LINE linew_select { line_linew = $2; } | LINE lines_select { line_lines = $2; } | LINE color_select { line_color = $2; } | LINE ARROW nexpr { line_arrow_end = $3; } | LINE ARROW LENGTH expr { line_asize = $4; } | LINE ARROW TYPE nexpr { line_atype = $4; } | LINE ARROW LAYOUT expr ',' expr { line_a_dL_ff = $4; line_a_lL_ff = $6; } | LINE DEF { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].lines = line_lines; lines[curline].linew = line_linew; lines[curline].color = line_color; lines[curline].arrow_end = line_arrow_end; lines[curline].arrow.length = line_asize; lines[curline].arrow.type = line_atype; lines[curline].arrow.dL_ff = line_a_dL_ff; lines[curline].arrow.lL_ff = line_a_lL_ff; lines[curline].loctype = line_loctype; } } /* strings */ | WITH STRING { curstring = next_string(); } | WITH STRING nexpr { int no = $3; if (is_valid_string(no) || realloc_strings(no + 1) == RETURN_SUCCESS) { curstring = no; } } | STRING onoff { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].active = $2; } } | STRING selectgraph { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].gno = $2; } } | STRING expr ',' expr { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].x = $2; pstr[curstring].y = $4; } } | STRING LOCTYPE worldview { string_loctype = $3; } | STRING color_select { string_color = $2; } | STRING ROT nexpr { string_rot = $3; } | STRING font_select { string_font = $2; } | STRING JUST nexpr { string_just = $3; } | STRING CHAR SIZE expr { string_size = $4; } | STRING DEF sexpr { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { set_plotstr_string(&pstr[curstring], $3); pstr[curstring].color = string_color; pstr[curstring].font = string_font; pstr[curstring].just = string_just; pstr[curstring].loctype = string_loctype; pstr[curstring].rot = string_rot; pstr[curstring].charsize = string_size; } xfree($3); } /* timestamp */ | TIMESTAMP onoff { timestamp.active = $2; } | TIMESTAMP font_select { timestamp.font = $2; } | TIMESTAMP CHAR SIZE expr { timestamp.charsize = $4; } | TIMESTAMP ROT nexpr { timestamp.rot = $3; } | TIMESTAMP color_select { timestamp.color = $2; } | TIMESTAMP expr ',' expr { timestamp.x = $2; timestamp.y = $4; } | TIMESTAMP DEF sexpr { set_plotstr_string(×tamp, $3); xfree($3); } /* defaults */ | DEFAULT lines_select { grdefaults.lines = $2; box_lines = ellipse_lines = line_lines = $2; } | DEFAULT linew_select { grdefaults.linew = $2; box_linew = ellipse_linew = line_linew = $2; } | DEFAULT color_select { grdefaults.color = $2; box_color = ellipse_color = line_color = string_color = $2; } | DEFAULT pattern_select { grdefaults.pattern = $2; } | DEFAULT CHAR SIZE expr { grdefaults.charsize = $4; string_size = $4; } | DEFAULT font_select { grdefaults.font = $2; string_font = $2; } | DEFAULT SYMBOL SIZE expr { grdefaults.symsize = $4; } | DEFAULT SFORMAT sexpr { strcpy(sformat, $3); xfree($3); } | MAP FONTP nexpr TO sexpr ',' sexpr { if ((map_font_by_name($5, $3) != RETURN_SUCCESS) && (map_font_by_name($7, $3) != RETURN_SUCCESS)) { errmsg("Failed mapping a font"); } xfree($5); xfree($7); } | MAP COLOR nexpr TO '(' nexpr ',' nexpr ',' nexpr ')' ',' sexpr { CMap_entry cmap; cmap.rgb.red = $6; cmap.rgb.green = $8; cmap.rgb.blue = $10; cmap.ctype = COLOR_MAIN; cmap.cname = $13; if (store_color($3, cmap) == RETURN_FAILURE) { errmsg("Failed mapping a color"); } xfree($13); } | WORLD expr ',' expr ',' expr ',' expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg1 = $2; g[whichgraph].w.yg1 = $4; g[whichgraph].w.xg2 = $6; g[whichgraph].w.yg2 = $8; } | ZNORM expr { set_graph_znorm(whichgraph, $2); } | VIEW expr ',' expr ',' expr ',' expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv1 = $2; g[whichgraph].v.yv1 = $4; g[whichgraph].v.xv2 = $6; g[whichgraph].v.yv2 = $8; } | TITLE sexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } set_plotstr_string(&g[whichgraph].labs.title, $2); xfree($2); } | TITLE font_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.font = $2; } | TITLE SIZE expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.charsize = $3; } | TITLE color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.color = $2; } | SUBTITLE sexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } set_plotstr_string(&g[whichgraph].labs.stitle, $2); xfree($2); } | SUBTITLE font_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.font = $2; } | SUBTITLE SIZE expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.charsize = $3; } | SUBTITLE color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.color = $2; } | XAXES SCALE scaletype { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].xscale = $3; } | YAXES SCALE scaletype { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].yscale = $3; } | XAXES INVERT onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].xinvert = $3; } | YAXES INVERT onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].yinvert = $3; } | AUTOSCALE ONREAD NONE { autoscale_onread = AUTOSCALE_NONE; } | AUTOSCALE ONREAD XAXES { autoscale_onread = AUTOSCALE_X; } | AUTOSCALE ONREAD YAXES { autoscale_onread = AUTOSCALE_Y; } | AUTOSCALE ONREAD XYAXES { autoscale_onread = AUTOSCALE_XY; } | DESCRIPTION sexpr { char *s; s = copy_string(NULL, get_project_description()); s = concat_strings(s, $2); xfree($2); s = concat_strings(s, "\n"); set_project_description(s); xfree(s); } | CLEAR DESCRIPTION { set_project_description(NULL); } | LEGEND onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.active = $2; } | LEGEND LOCTYPE worldview { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.loctype = $3; } | LEGEND VGAP nexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.vgap = $3; } | LEGEND HGAP nexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.hgap = $3; } | LEGEND LENGTH nexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.len = $3; } | LEGEND INVERT onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.invert = $3; } | LEGEND BOX FILL color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxfillpen.color = $4; } | LEGEND BOX FILL pattern_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxfillpen.pattern = $4; } | LEGEND BOX color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxpen.color = $3; } | LEGEND BOX pattern_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxpen.pattern = $3; } | LEGEND BOX lines_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxlines = $3; } | LEGEND BOX linew_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxlinew = $3; } | LEGEND expr ',' expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legx = $2; g[whichgraph].l.legy = $4; } | LEGEND CHAR SIZE expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.charsize = $4; } | LEGEND font_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.font = $2; } | LEGEND color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.color = $2; } | FRAMEP onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.pattern = $2; } | FRAMEP TYPE nexpr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.type = $3; } | FRAMEP lines_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.lines = $2; } | FRAMEP linew_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.linew = $2; } | FRAMEP color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.color = $2; } | FRAMEP pattern_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.pattern = $2; } | FRAMEP BACKGROUND color_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.color = $3; } | FRAMEP BACKGROUND pattern_select { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.pattern = $3; } | selectgraph onoff { set_graph_hidden($1, !$2); } | selectgraph HIDDEN onoff { set_graph_hidden($1, $3); } | selectgraph TYPE graphtype { set_graph_type($1, $3); } | selectgraph STACKED onoff { set_graph_stacked($1, $3); } | selectgraph BAR HGAP expr { set_graph_bargap($1, $4); } | selectgraph FIXEDPOINT onoff { g[$1].locator.pointset = $3; } | selectgraph FIXEDPOINT FORMAT formatchoice formatchoice { g[$1].locator.fx = $4; g[$1].locator.fy = $5; } | selectgraph FIXEDPOINT PREC expr ',' expr { g[$1].locator.px = $4; g[$1].locator.py = $6; } | selectgraph FIXEDPOINT XY expr ',' expr { g[$1].locator.dsx = $4; g[$1].locator.dsy = $6; } | selectgraph FIXEDPOINT TYPE nexpr { g[$1].locator.pt_type = $4; } | TYPE xytype { curtype = $2; } /* I/O filters */ | DEFINE filtertype sexpr filtermethod sexpr { if (add_io_filter($2, $4, $5, $3) != 0) { yyerror("Failed adding i/o filter"); } xfree($3); xfree($5); } | CLEAR filtertype { clear_io_filters($2); } | SOURCE sourcetype { cursource = $2; } | FORMAT formatchoice { readxformat = $2; } | FIT nonlfitopts { } | FITPARM CONSTRAINTS onoff { nonl_parms[$1].constr = $3; } ; actions: REDRAW { drawgraph(); } | UPDATEALL { #ifndef NONE_GUI if (inwin) { update_all(); } #endif } | CD sexpr { set_workingdir($2); xfree($2); } | ECHO sexpr { echomsg($2); xfree($2); } | ECHO expr { char buf[32]; set_locale_num(TRUE); sprintf(buf, "%g", $2); set_locale_num(FALSE); echomsg(buf); } | CLOSE { close_input = copy_string(close_input, ""); } | CLOSE sexpr { close_input = copy_string(close_input, $2); } | EXIT { exit(0); } | EXIT '(' iexpr ')' { exit($3); } | PRINT { if (!safe_mode) { do_hardcopy(); } else { yyerror("File modifications are disabled in safe mode"); } } | PRINT TO DEVICE { set_ptofile(FALSE); } | PRINT TO sexpr { set_ptofile(TRUE); strcpy(print_file, $3); xfree($3); } | PAGE direction { switch ($2) { case UP: graph_scroll(GSCROLL_UP); break; case DOWN: graph_scroll(GSCROLL_DOWN); break; case RIGHT: graph_scroll(GSCROLL_RIGHT); break; case LEFT: graph_scroll(GSCROLL_LEFT); break; case IN: graph_zoom(GZOOM_SHRINK); break; case OUT: graph_zoom(GZOOM_EXPAND); break; } } | SLEEP expr { if ($2 > 0) { msleep_wrap((unsigned int) (1000 * $2)); } } | HELP sexpr { #ifndef NONE_GUI if (inwin) { HelpCB($2); } xfree($2); #endif } | HELP { #ifndef NONE_GUI if (inwin) { HelpCB("doc/UsersGuide.html"); } #endif } | GETP sexpr { gotparams = TRUE; strcpy(paramfile, $2); xfree($2); } | PUTP sexpr { if (!safe_mode) { FILE *pp = grace_openw($2); if (pp != NULL) { putparms(whichgraph, pp, 0); grace_close(pp); } } else { yyerror("File modifications are disabled in safe mode"); } xfree($2); } | selectset HIDDEN onoff { set_set_hidden($1->gno, $1->setno, $3); } | selectset LENGTH nexpr { setlength($1->gno, $1->setno, $3); } | VEC_D LENGTH nexpr { realloc_vrbl($1, $3); } | selectset POINT expr ',' expr { add_point($1->gno, $1->setno, $3, $5); } | selectset DROP nexpr ',' nexpr { int start = $3 - index_shift; int stop = $5 - index_shift; droppoints($1->gno, $1->setno, start, stop); } | SORT selectset sorton sortdir { if (is_set_active($2->gno, $2->setno)) { sortset($2->gno, $2->setno, $3, $4 == ASCENDING ? 0 : 1); } } | COPY selectset TO selectset { do_copyset($2->gno, $2->setno, $4->gno, $4->setno); } | APPEND selectset TO selectset { if ($2->gno != $4->gno) { errmsg("Can't append sets from different graphs"); } else { int sets[2]; sets[0] = $4->setno; sets[1] = $2->setno; join_sets($2->gno, sets, 2); } } | REVERSE selectset { reverse_set($2->gno, $2->setno); } | SPLIT selectset nexpr { do_splitsets($2->gno, $2->setno, $3); } | MOVE selectset TO selectset { do_moveset($2->gno, $2->setno, $4->gno, $4->setno); } | SWAP selectset AND selectset { do_swapset($2->gno, $2->setno, $4->gno, $4->setno); } | KILL selectset { killset($2->gno, $2->setno); } | KILL selectset SAVEALL { killsetdata($2->gno, $2->setno); } | KILL selectgraph { kill_graph($2); } | KILL REGNUM { kill_region($2); } | FLUSH { wipeout(); } | ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ')' { arrange_graphs_simple($3, $5, 0, FALSE, $7, $9, $11); } | ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ',' onoff ',' onoff ',' onoff ')' { int order = ($13 * GA_ORDER_HV_INV) | ($15 * GA_ORDER_H_INV ) | ($17 * GA_ORDER_V_INV ); arrange_graphs_simple($3, $5, order, FALSE, $7, $9, $11); } | ARRANGE '(' nexpr ',' nexpr ',' expr ',' expr ',' expr ',' onoff ',' onoff ',' onoff ',' onoff ')' { int order = ($13 * GA_ORDER_HV_INV) | ($15 * GA_ORDER_H_INV ) | ($17 * GA_ORDER_V_INV ); arrange_graphs_simple($3, $5, order, $19, $7, $9, $11); } | NONLFIT '(' selectset ',' nexpr ')' { gotnlfit = TRUE; nlfit_gno = $3->gno; nlfit_setno = $3->setno; nlfit_nsteps = $5; nlfit_warray = NULL; } | NONLFIT '(' selectset ',' vexpr ',' nexpr ')' { if (getsetlength($3->gno, $3->setno) != $5->length) { errmsg("Data and weight arrays are of different lengths"); return 1; } else { gotnlfit = TRUE; nlfit_gno = $3->gno; nlfit_setno = $3->setno; nlfit_nsteps = $7; nlfit_warray = copy_data_column($5->data, $5->length); } } | REGRESS '(' selectset ',' nexpr ')' { do_regress($3->gno, $3->setno, $5, 0, -1, 0, -1); } | runtype '(' selectset ',' nexpr ')' { do_runavg($3->gno, $3->setno, $5, $1, -1, 0); } | ffttype '(' selectset ',' nexpr ')' { do_fourier_command($3->gno, $3->setno, $1, $5); } | ffttype '(' selectset ',' fourierdata ',' windowtype ',' fourierloadx ',' fourierloady ')' { switch ($1) { case FFT_DFT: do_fourier($3->gno, $3->setno, 0, $11, $9, 0, $5, $7); break; case FFT_INVDFT : do_fourier($3->gno, $3->setno, 0, $11, $9, 1, $5, $7); break; case FFT_FFT: do_fourier($3->gno, $3->setno, 1, $11, $9, 0, $5, $7); break; case FFT_INVFFT : do_fourier($3->gno, $3->setno, 1, $11, $9, 1, $5, $7); break; default: errmsg("Internal error"); break; } } | INTERPOLATE '(' selectset ',' vexpr ',' interpmethod ',' onoff ')' { do_interp($3->gno, $3->setno, get_cg(), SET_SELECT_NEXT, $5->data, $5->length, $7, $9); } | HISTOGRAM '(' selectset ',' vexpr ',' onoff ',' onoff ')' { do_histo($3->gno, $3->setno, get_cg(), SET_SELECT_NEXT, $5->data, $5->length - 1, $7, $9); } | DIFFERENCE '(' selectset ',' nexpr ')' { do_differ($3->gno, $3->setno, $5); } | INTEGRATE '(' selectset ')' { do_int($3->gno, $3->setno, 0); } | XCOR '(' selectset ',' selectset ',' nexpr ',' onoff ')' { do_xcor($3->gno, $3->setno, $5->gno, $5->setno, $7, $9); } | LINCONV '(' selectset ',' selectset ')' { do_linearc($3->gno, $3->setno, $5->gno, $5->setno); } | RESTRICT '(' selectset ',' vexpr ')' { int len = getsetlength($3->gno, $3->setno); if (len != $5->length) { errmsg("Filter expression is of a wrong length"); } else { char *rarray; rarray = xmalloc(len*SIZEOF_CHAR); if (rarray) { int i; for (i = 0; i < len; i++) { rarray[i] = CAST_DBL_TO_BOOL($5->data[i]); } filter_set($3->gno, $3->setno, rarray); xfree(rarray); } } } | RESTRICT '(' selectset ',' REGNUM ',' onoff ')' { int rtype; char *rarray; rtype = RESTRICT_REG0 + $5; if (get_restriction_array($3->gno, $3->setno, rtype, $7, &rarray) != RETURN_SUCCESS) { errmsg("Error in region evaluation"); return 1; } else { filter_set($3->gno, $3->setno, rarray); xfree(rarray); } } | AUTOSCALE { if (autoscale_graph(whichgraph, AUTOSCALE_XY) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } | AUTOSCALE XAXES { if (autoscale_graph(whichgraph, AUTOSCALE_X) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } | AUTOSCALE YAXES { if (autoscale_graph(whichgraph, AUTOSCALE_Y) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } | AUTOSCALE selectset { autoscale_byset($2->gno, $2->setno, AUTOSCALE_XY); } | AUTOTICKS { autotick_axis(whichgraph, ALL_AXES); } | FOCUS selectgraph { int gno = $2; if (is_graph_hidden(gno) == FALSE) { select_graph(gno); } else { errmsg("Graph is not active"); } } | READ sexpr { gotread = TRUE; strcpy(readfile, $2); xfree($2); } | READ BATCH sexpr { strcpy(batchfile, $3); xfree($3); } | READ BLOCK sexpr { getdata(whichgraph, $3, SOURCE_DISK, LOAD_BLOCK); xfree($3); } | READ BLOCK sourcetype sexpr { getdata(whichgraph, $4, $3, LOAD_BLOCK); xfree($4); } | BLOCK xytype sexpr { int nc, *cols, scol; if (field_string_to_cols($3, &nc, &cols, &scol) != RETURN_SUCCESS) { errmsg("Erroneous field specifications"); xfree($3); return 1; } else { xfree($3); create_set_fromblock(whichgraph, NEW_SET, $2, nc, cols, scol, autoscale_onread); xfree(cols); } } | KILL BLOCK { set_blockdata(NULL); } | READ xytype sexpr { gotread = TRUE; curtype = $2; strcpy(readfile, $3); xfree($3); } | READ xytype sourcetype sexpr { gotread = TRUE; strcpy(readfile, $4); curtype = $2; cursource = $3; xfree($4); } | READ NXY sexpr { getdata(whichgraph, $3, SOURCE_DISK, LOAD_NXY); xfree($3); } | READ NXY sourcetype sexpr { getdata(whichgraph, $4, $3, LOAD_NXY); xfree($4); } | WRITE selectset { if (!safe_mode) { outputset($2->gno, $2->setno, "stdout", NULL); } else { yyerror("File modifications are disabled in safe mode"); } } | WRITE selectset FORMAT sexpr { if (!safe_mode) { outputset($2->gno, $2->setno, "stdout", $4); } else { yyerror("File modifications are disabled in safe mode"); } xfree($4); } | WRITE selectset FILEP sexpr { if (!safe_mode) { outputset($2->gno, $2->setno, $4, NULL); } else { yyerror("File modifications are disabled in safe mode"); } xfree($4); } | WRITE selectset FILEP sexpr FORMAT sexpr { if (!safe_mode) { outputset($2->gno, $2->setno, $4, $6); } else { yyerror("File modifications are disabled in safe mode"); } xfree($4); xfree($6); } | SAVEALL sexpr { if (!safe_mode) { save_project($2); } else { yyerror("File modifications are disabled in safe mode"); } xfree($2); } | LOAD sexpr { load_project($2); xfree($2); } | NEW { new_project(NULL); } | NEW FROM sexpr { new_project($3); xfree($3); } | PUSH { push_world(); } | POP { pop_world(); } | CYCLE { cycle_world_stack(); } | STACK nexpr { if ($2 > 0) show_world_stack($2 - 1); } | CLEAR STACK { clear_world_stack(); } | CLEAR BOX { do_clear_boxes(); } | CLEAR ELLIPSE { do_clear_ellipses(); } | CLEAR LINE { do_clear_lines(); } | CLEAR STRING { do_clear_text(); } ; options: PAGE LAYOUT pagelayout { #ifndef NONE_GUI set_pagelayout($3); #endif } | AUTO REDRAW onoff { auto_redraw = $3; } | FOCUS onoff { draw_focus_flag = $2; } | FOCUS SET { focus_policy = FOCUS_SET; } | FOCUS FOLLOWS { focus_policy = FOCUS_FOLLOWS; } | FOCUS CLICK { focus_policy = FOCUS_CLICK; } ; set_setprop: setprop {} | setprop_obs {} ; setprop: selectset onoff { set_set_hidden($1->gno, $1->setno, !$2); } | selectset TYPE xytype { set_dataset_type($1->gno, $1->setno, $3); } | selectset SYMBOL nexpr { g[$1->gno].p[$1->setno].sym = $3; } | selectset SYMBOL color_select { g[$1->gno].p[$1->setno].sympen.color = $3; } | selectset SYMBOL pattern_select { g[$1->gno].p[$1->setno].sympen.pattern = $3; } | selectset SYMBOL linew_select { g[$1->gno].p[$1->setno].symlinew = $3; } | selectset SYMBOL lines_select { g[$1->gno].p[$1->setno].symlines = $3; } | selectset SYMBOL FILL color_select { g[$1->gno].p[$1->setno].symfillpen.color = $4; } | selectset SYMBOL FILL pattern_select { g[$1->gno].p[$1->setno].symfillpen.pattern = $4; } | selectset SYMBOL SIZE expr { g[$1->gno].p[$1->setno].symsize = $4; } | selectset SYMBOL CHAR nexpr { g[$1->gno].p[$1->setno].symchar = $4; } | selectset SYMBOL CHAR font_select { g[$1->gno].p[$1->setno].charfont = $4; } | selectset SYMBOL SKIP nexpr { g[$1->gno].p[$1->setno].symskip = $4; } | selectset LINE TYPE nexpr { g[$1->gno].p[$1->setno].linet = $4; } | selectset LINE lines_select { g[$1->gno].p[$1->setno].lines = $3; } | selectset LINE linew_select { g[$1->gno].p[$1->setno].linew = $3; } | selectset LINE color_select { g[$1->gno].p[$1->setno].linepen.color = $3; } | selectset LINE pattern_select { g[$1->gno].p[$1->setno].linepen.pattern = $3; } | selectset FILL TYPE nexpr { g[$1->gno].p[$1->setno].filltype = $4; } | selectset FILL RULE nexpr { g[$1->gno].p[$1->setno].fillrule = $4; } | selectset FILL color_select { int prop = $3; if (get_project_version() <= 40102 && get_project_version() >= 30000) { switch (filltype_obs) { case COLOR: break; case PATTERN: prop = 1; break; default: /* NONE */ prop = 0; break; } } g[$1->gno].p[$1->setno].setfillpen.color = prop; } | selectset FILL pattern_select { int prop = $3; if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: prop = 1; break; case PATTERN: break; default: /* NONE */ prop = 0; break; } } g[$1->gno].p[$1->setno].setfillpen.pattern = prop; } | selectset BASELINE onoff { g[$1->gno].p[$1->setno].baseline = $3; } | selectset BASELINE TYPE nexpr { g[$1->gno].p[$1->setno].baseline_type = $4; } | selectset DROPLINE onoff { g[$1->gno].p[$1->setno].dropline = $3; } | selectset AVALUE onoff { g[$1->gno].p[$1->setno].avalue.active = $3; } | selectset AVALUE TYPE nexpr { g[$1->gno].p[$1->setno].avalue.type = $4; } | selectset AVALUE CHAR SIZE expr { g[$1->gno].p[$1->setno].avalue.size = $5; } | selectset AVALUE font_select { g[$1->gno].p[$1->setno].avalue.font = $3; } | selectset AVALUE color_select { g[$1->gno].p[$1->setno].avalue.color = $3; } | selectset AVALUE ROT nexpr { g[$1->gno].p[$1->setno].avalue.angle = $4; } | selectset AVALUE FORMAT formatchoice { g[$1->gno].p[$1->setno].avalue.format = $4; } | selectset AVALUE PREC nexpr { g[$1->gno].p[$1->setno].avalue.prec = $4; } | selectset AVALUE OFFSET expr ',' expr { g[$1->gno].p[$1->setno].avalue.offset.x = $4; g[$1->gno].p[$1->setno].avalue.offset.y = $6; } | selectset AVALUE PREPEND sexpr { strcpy(g[$1->gno].p[$1->setno].avalue.prestr, $4); xfree($4); } | selectset AVALUE APPEND sexpr { strcpy(g[$1->gno].p[$1->setno].avalue.appstr, $4); xfree($4); } | selectset ERRORBAR onoff { g[$1->gno].p[$1->setno].errbar.active = $3; } | selectset ERRORBAR opchoice_sel { g[$1->gno].p[$1->setno].errbar.ptype = $3; } | selectset ERRORBAR color_select { g[$1->gno].p[$1->setno].errbar.pen.color = $3; } | selectset ERRORBAR pattern_select { g[$1->gno].p[$1->setno].errbar.pen.pattern = $3; } | selectset ERRORBAR SIZE expr { g[$1->gno].p[$1->setno].errbar.barsize = $4; } | selectset ERRORBAR linew_select { g[$1->gno].p[$1->setno].errbar.linew = $3; } | selectset ERRORBAR lines_select { g[$1->gno].p[$1->setno].errbar.lines = $3; } | selectset ERRORBAR RISER linew_select { g[$1->gno].p[$1->setno].errbar.riser_linew = $4; } | selectset ERRORBAR RISER lines_select { g[$1->gno].p[$1->setno].errbar.riser_lines = $4; } | selectset ERRORBAR RISER CLIP onoff { g[$1->gno].p[$1->setno].errbar.arrow_clip = $5; } | selectset ERRORBAR RISER CLIP LENGTH expr { g[$1->gno].p[$1->setno].errbar.cliplen = $6; } | selectset COMMENT sexpr { strncpy(g[$1->gno].p[$1->setno].comments, $3, MAX_STRING_LENGTH - 1); xfree($3); } | selectset LEGEND sexpr { strncpy(g[$1->gno].p[$1->setno].lstr, $3, MAX_STRING_LENGTH - 1); xfree($3); } ; axisfeature: onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->active = $1; } | TYPE ZERO onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->zero = $3; } | TICKP tickattr {} | TICKP tickattr_obs {} | TICKLABEL ticklabelattr {} | TICKLABEL ticklabelattr_obs {} | LABEL axislabeldesc {} | LABEL axislabeldesc_obs {} | BAR axisbardesc {} | OFFSET expr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsx = $2; g[whichgraph].t[naxis]->offsy = $4; } ; tickattr: onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_flag = $1; } | MAJOR expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tmajor = $2; } | MINOR TICKSP nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->nminor = $3; } | PLACE ROUNDED onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_round = $3; } | OFFSETX expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsx = $2; } | OFFSETY expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsy = $2; } | DEFAULT nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_autonum = $2; } | inoutchoice { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_inout = $1; } | MAJOR SIZE expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.size = $3; } | MINOR SIZE expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.size = $3; } | color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.color = g[whichgraph].t[naxis]->mprops.color = $1; } | MAJOR color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.color = $2; } | MINOR color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.color = $2; } | linew_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.linew = g[whichgraph].t[naxis]->mprops.linew = $1; } | MAJOR linew_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.linew = $2; } | MINOR linew_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.linew = $2; } | MAJOR lines_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.lines = $2; } | MINOR lines_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.lines = $2; } | MAJOR GRID onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.gridflag = $3; } | MINOR GRID onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.gridflag = $3; } | opchoice_sel { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_op = $1; } | SPEC TYPE tickspectype { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = $3; } | SPEC nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->nticks = $2; } | MAJOR nexpr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[$2].wtpos = $4; g[whichgraph].t[naxis]->tloc[$2].type = TICK_TYPE_MAJOR; } | MINOR nexpr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[$2].wtpos = $4; g[whichgraph].t[naxis]->tloc[$2].type = TICK_TYPE_MINOR; } ; ticklabelattr: onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_flag = $1; } | PREC nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_prec = $2; } | FORMAT formatchoice { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_format = $2; } | FORMAT expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_format = $2; } | APPEND sexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } strcpy(g[whichgraph].t[naxis]->tl_appstr, $2); xfree($2); } | PREPEND sexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } strcpy(g[whichgraph].t[naxis]->tl_prestr, $2); xfree($2); } | ANGLE nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = $2; } | SKIP nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_skip = $2; } | STAGGER nexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_staggered = $2; } | opchoice_sel { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_op = $1; } | FORMULA sexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, $2); xfree($2); } | START expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_start = $2; } | STOP expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stop = $2; } | START TYPE SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_starttype = TYPE_SPEC; } | START TYPE AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_starttype = TYPE_AUTO; } | STOP TYPE SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stoptype = TYPE_SPEC; } | STOP TYPE AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stoptype = TYPE_AUTO; } | CHAR SIZE expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_charsize = $3; } | font_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_font = $1; } | color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_color = $1; } | nexpr ',' sexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); xfree($3); return 1; } if ($1 >= MAX_TICKS) { yyerror("Number of ticks exceeds maximum"); xfree($3); return 1; } g[whichgraph].t[naxis]->tloc[$1].label = copy_string(g[whichgraph].t[naxis]->tloc[$1].label, $3); xfree($3); } | OFFSET AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gaptype = TYPE_AUTO; } | OFFSET SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gaptype = TYPE_SPEC; } | OFFSET expr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gap.x = $2; g[whichgraph].t[naxis]->tl_gap.y = $4; } ; axislabeldesc: sexpr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } set_plotstr_string(&g[whichgraph].t[naxis]->label, $1); xfree($1); } | LAYOUT PERP { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_layout = LAYOUT_PERPENDICULAR; } | LAYOUT PARA { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_layout = LAYOUT_PARALLEL; } | PLACE AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_place = TYPE_AUTO; } | PLACE SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_place = TYPE_SPEC; } | PLACE expr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.x = $2; g[whichgraph].t[naxis]->label.y = $4; } | JUST justchoice { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.just = $2; } | CHAR SIZE expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.charsize = $3; } | font_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.font = $1; } | color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.color = $1; } | opchoice_sel { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_op = $1; } ; axisbardesc: onoff { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbar = $1; } | color_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarcolor = $1; } | lines_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarlines = $1; } | linew_select { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarlinew = $1; } ; nonlfitopts: TITLE sexpr { nonl_opts.title = copy_string(nonl_opts.title, $2); xfree($2); } | FORMULA sexpr { nonl_opts.formula = copy_string(nonl_opts.formula, $2); xfree($2); } | WITH nexpr PARAMETERS { nonl_opts.parnum = $2; } | PREC expr { nonl_opts.tolerance = $2; } ; selectgraph: GRAPHNO { $$ = $1; } | GRAPH indx { $$ = $2; } ; selectset: selectgraph '.' SETNUM { int gno = $1, setno = $3; if (allocate_set(gno, setno) == RETURN_SUCCESS) { $$ = &trgt_pool[tgtn]; $$->gno = gno; $$->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } | selectgraph '.' SET indx { int gno = $1, setno = $4; if (allocate_set(gno, setno) == RETURN_SUCCESS) { $$ = &trgt_pool[tgtn]; $$->gno = gno; $$->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } | SETNUM { int gno = whichgraph, setno = $1; if (allocate_set(gno, setno) == RETURN_SUCCESS) { $$ = &trgt_pool[tgtn]; $$->gno = gno; $$->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } | SET indx { int gno = whichgraph, setno = $2; if (allocate_set(gno, setno) == RETURN_SUCCESS) { $$ = &trgt_pool[tgtn]; $$->gno = gno; $$->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } ; setaxis: axis axisfeature {} | selectgraph axis axisfeature {} ; axis: XAXIS { naxis = X_AXIS; } | YAXIS { naxis = Y_AXIS; } | ALTXAXIS { naxis = ZX_AXIS; } | ALTYAXIS { naxis = ZY_AXIS; } ; proctype: KEY_CONST { $$ = CONSTANT; } | KEY_UNIT { $$ = UCONSTANT; } | KEY_FUNC_I { $$ = FUNC_I; } | KEY_FUNC_D { $$ = FUNC_D; } | KEY_FUNC_ND { $$ = FUNC_ND; } | KEY_FUNC_NN { $$ = FUNC_NN; } | KEY_FUNC_DD { $$ = FUNC_DD; } | KEY_FUNC_NND { $$ = FUNC_NND; } | KEY_FUNC_PPD { $$ = FUNC_PPD; } | KEY_FUNC_PPPD { $$ = FUNC_PPPD; } | KEY_FUNC_PPPPD { $$ = FUNC_PPPPD; } | KEY_FUNC_PPPPPD { $$ = FUNC_PPPPPD; } ; tickspectype: NONE { $$ = TICKS_SPEC_NONE; } | TICKSP { $$ = TICKS_SPEC_MARKS; } | BOTH { $$ = TICKS_SPEC_BOTH; } ; filtertype: IFILTER { $$ = FILTER_INPUT; } | OFILTER { $$ = FILTER_OUTPUT; } ; filtermethod: MAGIC { $$ = FILTER_MAGIC; } | PATTERN { $$ = FILTER_PATTERN; } ; xytype: XY { $$ = SET_XY; } | BAR { $$ = SET_BAR; } | BARDY { $$ = SET_BARDY; } | BARDYDY { $$ = SET_BARDYDY; } | XYZ { $$ = SET_XYZ; } | XYDX { $$ = SET_XYDX; } | XYDY { $$ = SET_XYDY; } | XYDXDX { $$ = SET_XYDXDX; } | XYDYDY { $$ = SET_XYDYDY; } | XYDXDY { $$ = SET_XYDXDY; } | XYDXDXDYDY { $$ = SET_XYDXDXDYDY; } | XYHILO { $$ = SET_XYHILO; } | XYR { $$ = SET_XYR; } | XYSIZE { $$ = SET_XYSIZE; } | XYCOLOR { $$ = SET_XYCOLOR; } | XYCOLPAT { $$ = SET_XYCOLPAT; } | XYVMAP { $$ = SET_XYVMAP; } | XYBOXPLOT { $$ = SET_BOXPLOT; } | XYSTRING { $$ = SET_XY; } ; graphtype: XY { $$ = GRAPH_XY; } | CHART { $$ = GRAPH_CHART; } | POLAR { $$ = GRAPH_POLAR; } | SMITH { $$ = GRAPH_SMITH; } | FIXED { $$ = GRAPH_FIXED; } | PIE { $$ = GRAPH_PIE; } ; pagelayout: FREE { $$ = PAGE_FREE; } | FIXED { $$ = PAGE_FIXED; } ; pageorient: LANDSCAPE { $$ = PAGE_ORIENT_LANDSCAPE; } | PORTRAIT { $$ = PAGE_ORIENT_PORTRAIT; } ; regiontype: ABOVE { $$ = REGION_ABOVE; } | BELOW { $$ = REGION_BELOW; } | LEFT { $$ = REGION_TOLEFT; } | RIGHT { $$ = REGION_TORIGHT; } | POLYI { $$ = REGION_POLYI; } | POLYO { $$ = REGION_POLYO; } | HORIZI { $$ = REGION_HORIZI; } | VERTI { $$ = REGION_VERTI; } | HORIZO { $$ = REGION_HORIZO; } | VERTO { $$ = REGION_VERTO; } ; scaletype: NORMAL { $$ = SCALE_NORMAL; } | LOGARITHMIC { $$ = SCALE_LOG; } | RECIPROCAL { $$ = SCALE_REC; } | LOGIT { $$ = SCALE_LOGIT; } ; onoff: ON { $$ = TRUE; } | OFF { $$ = FALSE; } ; runtype: RUNAVG { $$ = RUN_AVG; } | RUNSTD { $$ = RUN_STD; } | RUNMED { $$ = RUN_MED; } | RUNMAX { $$ = RUN_MAX; } | RUNMIN { $$ = RUN_MIN; } ; sourcetype: DISK { $$ = SOURCE_DISK; } | PIPE { if (!safe_mode) { $$ = SOURCE_PIPE; } else { yyerror("Pipe inputs are disabled in safe mode"); $$ = SOURCE_DISK; } } ; justchoice: RIGHT { $$ = JUST_RIGHT; } | LEFT { $$ = JUST_LEFT; } | CENTER { $$ = JUST_CENTER; } ; inoutchoice: IN { $$ = TICKS_IN; } | OUT { $$ = TICKS_OUT; } | BOTH { $$ = TICKS_BOTH; } ; formatchoice: DECIMAL { $$ = FORMAT_DECIMAL; } | EXPONENTIAL { $$ = FORMAT_EXPONENTIAL; } | GENERAL { $$ = FORMAT_GENERAL; } | SCIENTIFIC { $$ = FORMAT_SCIENTIFIC; } | ENGINEERING { $$ = FORMAT_ENGINEERING; } | COMPUTING { $$ = FORMAT_COMPUTING; } | POWER { $$ = FORMAT_POWER; } | DDMMYY { $$ = FORMAT_DDMMYY; } | MMDDYY { $$ = FORMAT_MMDDYY; } | YYMMDD { $$ = FORMAT_YYMMDD; } | MMYY { $$ = FORMAT_MMYY; } | MMDD { $$ = FORMAT_MMDD; } | MONTHDAY { $$ = FORMAT_MONTHDAY; } | DAYMONTH { $$ = FORMAT_DAYMONTH; } | MONTHS { $$ = FORMAT_MONTHS; } | MONTHSY { $$ = FORMAT_MONTHSY; } | MONTHL { $$ = FORMAT_MONTHL; } | DAYOFWEEKS { $$ = FORMAT_DAYOFWEEKS; } | DAYOFWEEKL { $$ = FORMAT_DAYOFWEEKL; } | DAYOFYEAR { $$ = FORMAT_DAYOFYEAR; } | HMS { $$ = FORMAT_HMS; } | MMDDHMS { $$ = FORMAT_MMDDHMS; } | MMDDYYHMS { $$ = FORMAT_MMDDYYHMS; } | YYMMDDHMS { $$ = FORMAT_YYMMDDHMS; } | DEGREESLON { $$ = FORMAT_DEGREESLON; } | DEGREESMMLON { $$ = FORMAT_DEGREESMMLON; } | DEGREESMMSSLON { $$ = FORMAT_DEGREESMMSSLON; } | MMSSLON { $$ = FORMAT_MMSSLON; } | DEGREESLAT { $$ = FORMAT_DEGREESLAT; } | DEGREESMMLAT { $$ = FORMAT_DEGREESMMLAT; } | DEGREESMMSSLAT { $$ = FORMAT_DEGREESMMSSLAT; } | MMSSLAT { $$ = FORMAT_MMSSLAT; } ; signchoice: NORMAL { $$ = SIGN_NORMAL; } | ABSOLUTE { $$ = SIGN_ABSOLUTE; } | NEGATE { $$ = SIGN_NEGATE; } ; direction: UP { $$ = UP; } | DOWN { $$ = DOWN; } | RIGHT { $$ = RIGHT; } | LEFT { $$ = LEFT; } | IN { $$ = IN; } | OUT { $$ = OUT; } ; worldview: WORLD { $$ = COORD_WORLD; } | VIEW { $$ = COORD_VIEW; } ; datacolumn: X_TOK { $$ = DATA_X; } | Y_TOK { $$ = DATA_Y; } | X0 { $$ = DATA_X; } | Y0 { $$ = DATA_Y; } | Y1 { $$ = DATA_Y1; } | Y2 { $$ = DATA_Y2; } | Y3 { $$ = DATA_Y3; } | Y4 { $$ = DATA_Y4; } ; sortdir: ASCENDING { $$ = ASCENDING; } | DESCENDING { $$ = DESCENDING; } ; sorton: X_TOK { $$ = DATA_X; } | Y_TOK { $$ = DATA_Y; } ; ffttype: DFT { $$ = FFT_DFT; } | FFT { $$ = FFT_FFT; } | INVDFT { $$ = FFT_INVDFT; } | INVFFT { $$ = FFT_INVFFT; } ; fourierdata: REAL {$$=0;} | COMPLEX {$$=1;} ; fourierloadx: INDEX {$$=0;} | FREQUENCY {$$=1;} | PERIOD {$$=2;} ; fourierloady: MAGNITUDE {$$=0;} | PHASE {$$=1;} | COEFFICIENTS {$$=2;} ; windowtype: NONE {$$=0;} | TRIANGULAR {$$=1;} | HANNING {$$=2;} | WELCH {$$=3;} | HAMMING {$$=4;} | BLACKMAN {$$=5;} | PARZEN {$$=6;} ; interpmethod: LINEAR { $$ = INTERP_LINEAR; } | SPLINE { $$ = INTERP_SPLINE; } | ASPLINE { $$ = INTERP_ASPLINE; } ; stattype: MINP { $$ = MINP; } | MAXP { $$ = MAXP; } | AVG { $$ = AVG; } | SD { $$ = SD; } | SUM { $$ = SUM; } | IMIN { $$ = IMIN; } | IMAX { $$ = IMAX; } ; font_select: FONTP nexpr { $$ = get_mapped_font($2); } | FONTP sexpr { $$ = get_font_by_name($2); xfree($2); } ; lines_select: LINESTYLE nexpr { int lines = $2; if (lines >= 0 && lines < number_of_linestyles()) { $$ = lines; } else { errmsg("invalid linestyle"); $$ = 1; } } ; pattern_select: PATTERN nexpr { int patno = $2; if (patno >= 0 && patno < number_of_patterns()) { $$ = patno; } else { errmsg("invalid pattern number"); $$ = 1; } } ; color_select: COLOR nexpr { int c = $2; if (c >= 0 && c < number_of_colors()) { $$ = c; } else { errmsg("Invalid color ID"); $$ = 1; } } | COLOR sexpr { int c = get_color_by_name($2); if (c == BAD_COLOR) { errmsg("Invalid color name"); c = 1; } xfree($2); $$ = c; } | COLOR '(' nexpr ',' nexpr ',' nexpr ')' { int c; CMap_entry cmap; cmap.rgb.red = $3; cmap.rgb.green = $5; cmap.rgb.blue = $7; cmap.ctype = COLOR_MAIN; cmap.cname = NULL; c = add_color(cmap); if (c == BAD_COLOR) { errmsg("Can't allocate requested color"); c = 1; } $$ = c; } ; linew_select: LINEWIDTH expr { double linew; linew = $2; if (linew < 0.0) { yyerror("Negative linewidth"); linew = 0.0; } else if (linew > MAX_LINEWIDTH) { yyerror("Linewidth too large"); linew = MAX_LINEWIDTH; } $$ = linew; } ; opchoice_sel: PLACE opchoice { $$ = $2; } ; opchoice: NORMAL { $$ = PLACEMENT_NORMAL; } | OPPOSITE { $$ = PLACEMENT_OPPOSITE; } | BOTH { $$ = PLACEMENT_BOTH; } ; parmset_obs: PAGE LAYOUT pageorient { int wpp, hpp; if ($3 == PAGE_ORIENT_LANDSCAPE) { wpp = 792; hpp = 612; } else { wpp = 612; hpp = 792; } set_page_dimensions(wpp, hpp, FALSE); } | PAGE SIZE NUMBER NUMBER { set_page_dimensions((int) $3, (int) $4, FALSE); } | PAGE nexpr { scroll_proc($2); } | PAGE INOUT nexpr { scrollinout_proc($3); } | DEFAULT FONTP SOURCE expr { } | STACK WORLD expr ',' expr ',' expr ',' expr TICKP expr ',' expr ',' expr ',' expr { add_world(whichgraph, $3, $5, $7, $9); } | BOX FILL colpat_obs {filltype_obs = $3;} | ELLIPSE FILL colpat_obs {filltype_obs = $3;} | STRING linew_select { } | TIMESTAMP linew_select { } | TITLE linew_select { } | SUBTITLE linew_select { } | LEGEND BOX onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } if ($3 == FALSE && get_project_version() <= 40102) { g[whichgraph].l.boxpen.pattern = 0; } } | LEGEND X1 expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legx = $3; } | LEGEND Y1 expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legy = $3; } | LEGEND STRING nexpr sexpr { if (is_valid_setno(whichgraph, $3)) { strncpy(g[whichgraph].p[$3].lstr, $4, MAX_STRING_LENGTH - 1); } else { yyerror("Unallocated set"); } xfree($4); } | LEGEND BOX FILL onoff { } | LEGEND BOX FILL WITH colpat_obs {filltype_obs = $5;} | LEGEND lines_select { } | LEGEND linew_select { } | selectgraph LABEL onoff { } | selectgraph TYPE LOGX { g[$1].type = GRAPH_XY; g[$1].xscale = SCALE_LOG; } | selectgraph TYPE LOGY { g[$1].type = GRAPH_XY; g[$1].yscale = SCALE_LOG; } | selectgraph TYPE LOGXY { g[$1].type = GRAPH_XY; g[$1].xscale = SCALE_LOG; g[$1].yscale = SCALE_LOG; } | selectgraph TYPE BAR { g[$1].type = GRAPH_CHART; g[$1].xyflip = FALSE; g[$1].stacked = FALSE; } | selectgraph TYPE HBAR { g[$1].type = GRAPH_CHART; g[$1].xyflip = TRUE; } | selectgraph TYPE STACKEDBAR { g[$1].type = GRAPH_CHART; g[$1].stacked = TRUE; } | selectgraph TYPE STACKEDHBAR { g[$1].type = GRAPH_CHART; g[$1].stacked = TRUE; g[$1].xyflip = TRUE; } | WORLD XMIN expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg1 = $3; } | WORLD XMAX expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg2 = $3; } | WORLD YMIN expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.yg1 = $3; } | WORLD YMAX expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.yg2 = $3; } | VIEW XMIN expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv1 = $3; } | VIEW XMAX expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv2 = $3; } | VIEW YMIN expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.yv1 = $3; } | VIEW YMAX expr { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.yv2 = $3; } | LEGEND LAYOUT expr { } | FRAMEP FILL onoff { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.pattern = $3; } | selectgraph AUTOSCALE TYPE AUTO { } | selectgraph AUTOSCALE TYPE SPEC { } | LINE ARROW SIZE expr { line_asize = 2.0*$4; } | HARDCOPY DEVICE expr { } | PS LINEWIDTH BEGIN expr { } | PS LINEWIDTH INCREMENT expr { } | PS linew_select { } ; axislabeldesc_obs: linew_select { } | opchoice_sel_obs { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_op = $1; } ; setprop_obs: selectset SYMBOL FILL nexpr { switch ($4){ case 0: g[$1->gno].p[$1->setno].symfillpen.pattern = 0; break; case 1: g[$1->gno].p[$1->setno].symfillpen.pattern = 1; break; case 2: g[$1->gno].p[$1->setno].symfillpen.pattern = 1; g[$1->gno].p[$1->setno].symfillpen.color = getbgcolor(); break; } } | selectset SKIP nexpr { g[$1->gno].p[$1->setno].symskip = $3; } | selectset FILL nexpr { switch ($3) { case 0: g[$1->gno].p[$1->setno].filltype = SETFILL_NONE; break; case 1: g[$1->gno].p[$1->setno].filltype = SETFILL_POLYGON; break; case 2: g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE; g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_0; break; case 6: g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE; g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_GMIN; break; case 7: g[$1->gno].p[$1->setno].filltype = SETFILL_BASELINE; g[$1->gno].p[$1->setno].baseline_type = BASELINE_TYPE_GMAX; break; } } | selectset ERRORBAR TYPE opchoice_obs { g[$1->gno].p[$1->setno].errbar.ptype = $4; } /* * | selectset SYMBOL COLOR '-' N_NUMBER { * g[$1->gno].p[$1->setno].sympen.color = -1; * } */ | selectset SYMBOL CENTER onoff { } | selectset lines_select { g[$1->gno].p[$1->setno].lines = $2; } | selectset linew_select { g[$1->gno].p[$1->setno].linew = $2; } | selectset color_select { g[$1->gno].p[$1->setno].linepen.color = $2; } | selectset FILL WITH colpat_obs {filltype_obs = $4;} | selectset XYZ expr ',' expr { } | selectset ERRORBAR LENGTH expr { g[$1->gno].p[$1->setno].errbar.barsize = $4; } | selectset ERRORBAR RISER onoff { } ; tickattr_obs: MAJOR onoff { /* <= xmgr-4.1 */ if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->active = $2; } | MINOR onoff { } | ALT onoff { } | MINP NUMBER { } | MAXP NUMBER { } | LOG onoff { } | TYPE AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_NONE; } | TYPE SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if (g[whichgraph].t[naxis]->t_spec != TICKS_SPEC_BOTH) { g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS; } } | MINOR expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if ($2 != 0.0) { g[whichgraph].t[naxis]->nminor = (int) rint(g[whichgraph].t[naxis]->tmajor / $2 - 1); } else { g[whichgraph].t[naxis]->nminor = 0; } } | SIZE expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.size = $2; } | nexpr ',' expr { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[$1].wtpos = $3; g[whichgraph].t[naxis]->tloc[$1].type = TICK_TYPE_MAJOR; } | opchoice_sel_obs { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_op = $1; } ; ticklabelattr_obs: linew_select { } | TYPE AUTO { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if (g[whichgraph].t[naxis]->t_spec == TICKS_SPEC_BOTH) { g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS; } } | TYPE SPEC { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_BOTH; } | LAYOUT SPEC { } | LAYOUT HORIZONTAL { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = 0; } | LAYOUT VERTICAL { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = 90; } | PLACE ON TICKSP { } | PLACE BETWEEN TICKSP { } | opchoice_sel_obs { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_op = $1; } | SIGN signchoice { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } switch($2) { case SIGN_NEGATE: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, "-$t"); break; case SIGN_ABSOLUTE: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, "abs($t)"); break; default: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, NULL); break; } } ; colpat_obs: NONE | COLOR | PATTERN ; opchoice_sel_obs: OP opchoice_obs { $$ = $2; } ; opchoice_obs: TOP { $$ = PLACEMENT_OPPOSITE; } | BOTTOM { $$ = PLACEMENT_NORMAL; } | LEFT { $$ = PLACEMENT_NORMAL; } | RIGHT { $$ = PLACEMENT_OPPOSITE; } | BOTH { $$ = PLACEMENT_BOTH; } ; %% /* list of intrinsic functions and keywords */ symtab_entry ikey[] = { {"A0", FITPARM, NULL}, {"A0MAX", FITPMAX, NULL}, {"A0MIN", FITPMIN, NULL}, {"A1", FITPARM, NULL}, {"A1MAX", FITPMAX, NULL}, {"A1MIN", FITPMIN, NULL}, {"A2", FITPARM, NULL}, {"A2MAX", FITPMAX, NULL}, {"A2MIN", FITPMIN, NULL}, {"A3", FITPARM, NULL}, {"A3MAX", FITPMAX, NULL}, {"A3MIN", FITPMIN, NULL}, {"A4", FITPARM, NULL}, {"A4MAX", FITPMAX, NULL}, {"A4MIN", FITPMIN, NULL}, {"A5", FITPARM, NULL}, {"A5MAX", FITPMAX, NULL}, {"A5MIN", FITPMIN, NULL}, {"A6", FITPARM, NULL}, {"A6MAX", FITPMAX, NULL}, {"A6MIN", FITPMIN, NULL}, {"A7", FITPARM, NULL}, {"A7MAX", FITPMAX, NULL}, {"A7MIN", FITPMIN, NULL}, {"A8", FITPARM, NULL}, {"A8MAX", FITPMAX, NULL}, {"A8MIN", FITPMIN, NULL}, {"A9", FITPARM, NULL}, {"A9MAX", FITPMAX, NULL}, {"A9MIN", FITPMIN, NULL}, {"ABOVE", ABOVE, NULL}, {"ABS", FUNC_D, (void *) fabs}, {"ABSOLUTE", ABSOLUTE, NULL}, {"ACOS", FUNC_D, (void *) acos}, {"ACOSH", FUNC_D, (void *) acosh}, {"AI", FUNC_D, (void *) ai_wrap}, {"ALIAS", ALIAS, NULL}, {"ALT", ALT, NULL}, {"ALTXAXIS", ALTXAXIS, NULL}, {"ALTYAXIS", ALTYAXIS, NULL}, {"AND", AND, NULL}, {"ANGLE", ANGLE, NULL}, {"ANTIALIASING", ANTIALIASING, NULL}, {"APPEND", APPEND, NULL}, {"ARRANGE", ARRANGE, NULL}, {"ARROW", ARROW, NULL}, {"ASCENDING", ASCENDING, NULL}, {"ASIN", FUNC_D, (void *) asin}, {"ASINH", FUNC_D, (void *) asinh}, {"ASPLINE", ASPLINE, NULL}, {"ATAN", FUNC_D, (void *) atan}, {"ATAN2", FUNC_DD, (void *) atan2}, {"ATANH", FUNC_D, (void *) atanh}, {"AUTO", AUTO, NULL}, {"AUTOSCALE", AUTOSCALE, NULL}, {"AUTOTICKS", AUTOTICKS, NULL}, {"AVALUE", AVALUE, NULL}, {"AVG", AVG, NULL}, {"BACKGROUND", BACKGROUND, NULL}, {"BAR", BAR, NULL}, {"BARDY", BARDY, NULL}, {"BARDYDY", BARDYDY, NULL}, {"BASELINE", BASELINE, NULL}, {"BATCH", BATCH, NULL}, {"BEGIN", BEGIN, NULL}, {"BELOW", BELOW, NULL}, {"BETA", FUNC_DD, (void *) beta}, {"BETWEEN", BETWEEN, NULL}, {"BI", FUNC_D, (void *) bi_wrap}, {"BLACKMAN", BLACKMAN, NULL}, {"BLOCK", BLOCK, NULL}, {"BOTH", BOTH, NULL}, {"BOTTOM", BOTTOM, NULL}, {"BOX", BOX, NULL}, {"CD", CD, NULL}, {"CEIL", FUNC_D, (void *) ceil}, {"CENTER", CENTER, NULL}, {"CHAR", CHAR, NULL}, {"CHART", CHART, NULL}, {"CHDTR", FUNC_DD, (void *) chdtr}, {"CHDTRC", FUNC_DD, (void *) chdtrc}, {"CHDTRI", FUNC_DD, (void *) chdtri}, {"CHI", FUNC_D, (void *) chi_wrap}, {"CI", FUNC_D, (void *) ci_wrap}, {"CLEAR", CLEAR, NULL}, {"CLICK", CLICK, NULL}, {"CLIP", CLIP, NULL}, {"CLOSE", CLOSE, NULL}, {"COEFFICIENTS", COEFFICIENTS, NULL}, {"COLOR", COLOR, NULL}, {"COMMENT", COMMENT, NULL}, {"COMPLEX", COMPLEX, NULL}, {"COMPUTING", COMPUTING, NULL}, {"CONST", KEY_CONST, NULL}, {"CONSTRAINTS", CONSTRAINTS, NULL}, {"COPY", COPY, NULL}, {"COS", FUNC_D, (void *) cos}, {"COSH", FUNC_D, (void *) cosh}, {"CYCLE", CYCLE, NULL}, {"DATE", DATE, NULL}, {"DAWSN", FUNC_D, (void *) dawsn}, {"DAYMONTH", DAYMONTH, NULL}, {"DAYOFWEEKL", DAYOFWEEKL, NULL}, {"DAYOFWEEKS", DAYOFWEEKS, NULL}, {"DAYOFYEAR", DAYOFYEAR, NULL}, {"DDMMYY", DDMMYY, NULL}, {"DECIMAL", DECIMAL, NULL}, {"DEF", DEF, NULL}, {"DEFAULT", DEFAULT, NULL}, {"DEFINE", DEFINE, NULL}, {"DEG", UCONSTANT, (void *) deg_uconst}, {"DEGREESLAT", DEGREESLAT, NULL}, {"DEGREESLON", DEGREESLON, NULL}, {"DEGREESMMLAT", DEGREESMMLAT, NULL}, {"DEGREESMMLON", DEGREESMMLON, NULL}, {"DEGREESMMSSLAT", DEGREESMMSSLAT, NULL}, {"DEGREESMMSSLON", DEGREESMMSSLON, NULL}, {"DESCENDING", DESCENDING, NULL}, {"DESCRIPTION", DESCRIPTION, NULL}, {"DEVICE", DEVICE, NULL}, {"DFT", DFT, NULL}, {"DIFF", DIFFERENCE, NULL}, {"DIFFERENCE", DIFFERENCE, NULL}, {"DISK", DISK, NULL}, {"DOWN", DOWN, NULL}, {"DPI", DPI, NULL}, {"DROP", DROP, NULL}, {"DROPLINE", DROPLINE, NULL}, {"ECHO", ECHO, NULL}, {"ELLIE", FUNC_DD, (void *) ellie}, {"ELLIK", FUNC_DD, (void *) ellik}, {"ELLIPSE", ELLIPSE, NULL}, {"ELLPE", FUNC_D, (void *) ellpe_wrap}, {"ELLPK", FUNC_D, (void *) ellpk_wrap}, {"ENGINEERING", ENGINEERING, NULL}, {"EQ", EQ, NULL}, {"ER", ERRORBAR, NULL}, {"ERF", FUNC_D, (void *) erf}, {"ERFC", FUNC_D, (void *) erfc}, {"ERRORBAR", ERRORBAR, NULL}, {"EXIT", EXIT, NULL}, {"EXP", FUNC_D, (void *) exp}, {"EXPN", FUNC_ND, (void *) expn}, {"EXPONENTIAL", EXPONENTIAL, NULL}, {"FAC", FUNC_I, (void *) fac}, {"FALSE", OFF, NULL}, {"FDTR", FUNC_NND, (void *) fdtr}, {"FDTRC", FUNC_NND, (void *) fdtrc}, {"FDTRI", FUNC_NND, (void *) fdtri}, {"FFT", FFT, NULL}, {"FILE", FILEP, NULL}, {"FILL", FILL, NULL}, {"FIT", FIT, NULL}, {"FIXED", FIXED, NULL}, {"FIXEDPOINT", FIXEDPOINT, NULL}, {"FLOOR", FUNC_D, (void *) floor}, {"FLUSH", FLUSH, NULL}, {"FOCUS", FOCUS, NULL}, {"FOLLOWS", FOLLOWS, NULL}, {"FONT", FONTP, NULL}, {"FORCE", FORCE, NULL}, {"FORMAT", FORMAT, NULL}, {"FORMULA", FORMULA, NULL}, {"FRAME", FRAMEP, NULL}, {"FREE", FREE, NULL}, {"FREQUENCY", FREQUENCY, NULL}, {"FRESNLC", FUNC_D, (void *) fresnlc_wrap}, {"FRESNLS", FUNC_D, (void *) fresnls_wrap}, {"FROM", FROM, NULL}, {"F_OF_D", KEY_FUNC_D, NULL}, {"F_OF_DD", KEY_FUNC_DD, NULL}, {"F_OF_I", KEY_FUNC_I, NULL}, {"F_OF_ND", KEY_FUNC_ND, NULL}, {"F_OF_NN", KEY_FUNC_NN, NULL}, {"F_OF_NND", KEY_FUNC_NND, NULL}, {"F_OF_PPD", KEY_FUNC_PPD, NULL}, {"F_OF_PPPD", KEY_FUNC_PPPD, NULL}, {"F_OF_PPPPD", KEY_FUNC_PPPPD, NULL}, {"F_OF_PPPPPD", KEY_FUNC_PPPPPD, NULL}, {"GAMMA", FUNC_D, (void *) true_gamma}, {"GDTR", FUNC_PPD, (void *) gdtr}, {"GDTRC", FUNC_PPD, (void *) gdtrc}, {"GE", GE, NULL}, {"GENERAL", GENERAL, NULL}, {"GETP", GETP, NULL}, {"GRAPH", GRAPH, NULL}, {"GRID", GRID, NULL}, {"GT", GT, NULL}, {"HAMMING", HAMMING, NULL}, {"HANNING", HANNING, NULL}, {"HARDCOPY", HARDCOPY, NULL}, {"HBAR", HBAR, NULL}, {"HELP", HELP, NULL}, {"HGAP", HGAP, NULL}, {"HIDDEN", HIDDEN, NULL}, {"HISTOGRAM", HISTOGRAM, NULL}, {"HMS", HMS, NULL}, {"HORIZI", HORIZI, NULL}, {"HORIZO", HORIZO, NULL}, {"HORIZONTAL", HORIZONTAL, NULL}, {"HYP2F1", FUNC_PPPD, (void *) hyp2f1}, {"HYPERG", FUNC_PPD, (void *) hyperg}, {"HYPOT", FUNC_DD, (void *) hypot}, {"I0E", FUNC_D, (void *) i0e}, {"I1E", FUNC_D, (void *) i1e}, {"ID", ID, NULL}, {"IFILTER", IFILTER, NULL}, {"IGAM", FUNC_DD, (void *) igam}, {"IGAMC", FUNC_DD, (void *) igamc}, {"IGAMI", FUNC_DD, (void *) igami}, {"IMAX", IMAX, NULL}, {"IMIN", IMIN, NULL}, {"IN", IN, NULL}, {"INCBET", FUNC_PPD, (void *) incbet}, {"INCBI", FUNC_PPD, (void *) incbi}, {"INCREMENT", INCREMENT, NULL}, {"INDEX", INDEX, NULL}, {"INOUT", INOUT, NULL}, {"INT", INT, NULL}, {"INTEGRATE", INTEGRATE, NULL}, {"INTERPOLATE", INTERPOLATE, NULL}, {"INVDFT", INVDFT, NULL}, {"INVERT", INVERT, NULL}, {"INVFFT", INVFFT, NULL}, {"IRAND", FUNC_I, (void *) irand_wrap}, {"IV", FUNC_DD, (void *) iv_wrap}, {"JUST", JUST, NULL}, {"JV", FUNC_DD, (void *) jv_wrap}, {"K0E", FUNC_D, (void *) k0e}, {"K1E", FUNC_D, (void *) k1e}, {"KILL", KILL, NULL}, {"KN", FUNC_ND, (void *) kn_wrap}, {"LABEL", LABEL, NULL}, {"LANDSCAPE", LANDSCAPE, NULL}, {"LAYOUT", LAYOUT, NULL}, {"LBETA", FUNC_DD, (void *) lbeta}, {"LE", LE, NULL}, {"LEFT", LEFT, NULL}, {"LEGEND", LEGEND, NULL}, {"LENGTH", LENGTH, NULL}, {"LGAMMA", FUNC_D, (void *) lgamma}, {"LINCONV", LINCONV, NULL}, {"LINE", LINE, NULL}, {"LINEAR", LINEAR, NULL}, {"LINESTYLE", LINESTYLE, NULL}, {"LINEWIDTH", LINEWIDTH, NULL}, {"LINK", LINK, NULL}, {"LN", FUNC_D, (void *) log}, {"LOAD", LOAD, NULL}, {"LOCTYPE", LOCTYPE, NULL}, {"LOG", LOG, NULL}, {"LOG10", FUNC_D, (void *) log10}, {"LOG2", FUNC_D, (void *) log2}, {"LOGARITHMIC", LOGARITHMIC, NULL}, {"LOGX", LOGX, NULL}, {"LOGXY", LOGXY, NULL}, {"LOGY", LOGY, NULL}, {"LOGIT", LOGIT, NULL}, {"LT", LT, NULL}, {"MAGIC", MAGIC, NULL}, {"MAGNITUDE", MAGNITUDE, NULL}, {"MAJOR", MAJOR, NULL}, {"MAP", MAP, NULL}, {"MAX", MAXP, NULL}, {"MAXOF", FUNC_DD, (void *) max_wrap}, {"MESH", MESH, NULL}, {"MIN", MINP, NULL}, {"MINOF", FUNC_DD, (void *) min_wrap}, {"MINOR", MINOR, NULL}, {"MMDD", MMDD, NULL}, {"MMDDHMS", MMDDHMS, NULL}, {"MMDDYY", MMDDYY, NULL}, {"MMDDYYHMS", MMDDYYHMS, NULL}, {"MMSSLAT", MMSSLAT, NULL}, {"MMSSLON", MMSSLON, NULL}, {"MMYY", MMYY, NULL}, {"MOD", FUNC_DD, (void *) fmod}, {"MONTHDAY", MONTHDAY, NULL}, {"MONTHL", MONTHL, NULL}, {"MONTHS", MONTHS, NULL}, {"MONTHSY", MONTHSY, NULL}, {"MOVE", MOVE, NULL}, {"NDTR", FUNC_D, (void *) ndtr}, {"NDTRI", FUNC_D, (void *) ndtri}, {"NE", NE, NULL}, {"NEGATE", NEGATE, NULL}, {"NEW", NEW, NULL}, {"NONE", NONE, NULL}, {"NONLFIT", NONLFIT, NULL}, {"NORM", FUNC_D, (void *) fx}, {"NORMAL", NORMAL, NULL}, {"NOT", NOT, NULL}, {"NXY", NXY, NULL}, {"OFF", OFF, NULL}, {"OFFSET", OFFSET, NULL}, {"OFFSETX", OFFSETX, NULL}, {"OFFSETY", OFFSETY, NULL}, {"OFILTER", OFILTER, NULL}, {"ON", ON, NULL}, {"ONREAD", ONREAD, NULL}, {"OP", OP, NULL}, {"OPPOSITE", OPPOSITE, NULL}, {"OR", OR, NULL}, {"OUT", OUT, NULL}, {"PAGE", PAGE, NULL}, {"PARA", PARA, NULL}, {"PARAMETERS", PARAMETERS, NULL}, {"PARZEN", PARZEN, NULL}, {"PATTERN", PATTERN, NULL}, {"PDTR", FUNC_ND, (void *) pdtr}, {"PDTRC", FUNC_ND, (void *) pdtrc}, {"PDTRI", FUNC_ND, (void *) pdtri}, {"PERIOD", PERIOD, NULL}, {"PERP", PERP, NULL}, {"PHASE", PHASE, NULL}, {"PI", CONSTANT, (void *) pi_const}, {"PIE", PIE, NULL}, {"PIPE", PIPE, NULL}, {"PLACE", PLACE, NULL}, {"POINT", POINT, NULL}, {"POLAR", POLAR, NULL}, {"POLYI", POLYI, NULL}, {"POLYO", POLYO, NULL}, {"POP", POP, NULL}, {"PORTRAIT", PORTRAIT, NULL}, {"POWER", POWER, NULL}, {"PREC", PREC, NULL}, {"PREPEND", PREPEND, NULL}, {"PRINT", PRINT, NULL}, {"PS", PS, NULL}, {"PSI", FUNC_D, (void *) psi}, {"PUSH", PUSH, NULL}, {"PUTP", PUTP, NULL}, {"RAD", UCONSTANT, (void *) rad_uconst}, {"RAND", RAND, NULL}, {"READ", READ, NULL}, {"REAL", REAL, NULL}, {"RECIPROCAL", RECIPROCAL, NULL}, {"REDRAW", REDRAW, NULL}, {"REFERENCE", REFERENCE, NULL}, {"REGRESS", REGRESS, NULL}, {"RESIZE", RESIZE, NULL}, {"RESTRICT", RESTRICT, NULL}, {"REVERSE", REVERSE, NULL}, {"RGAMMA", FUNC_D, (void *) rgamma}, {"RIGHT", RIGHT, NULL}, {"RINT", FUNC_D, (void *) rint}, {"RISER", RISER, NULL}, {"RNORM", FUNC_DD, (void *) rnorm}, {"ROT", ROT, NULL}, {"ROUNDED", ROUNDED, NULL}, {"RSUM", RSUM, NULL}, {"RULE", RULE, NULL}, {"RUNAVG", RUNAVG, NULL}, {"RUNMAX", RUNMAX, NULL}, {"RUNMED", RUNMED, NULL}, {"RUNMIN", RUNMIN, NULL}, {"RUNSTD", RUNSTD, NULL}, {"SAVEALL", SAVEALL, NULL}, {"SCALE", SCALE, NULL}, {"SCIENTIFIC", SCIENTIFIC, NULL}, {"SCROLL", SCROLL, NULL}, {"SD", SD, NULL}, {"SET", SET, NULL}, {"SFORMAT", SFORMAT, NULL}, {"SGN", FUNC_D, (void *) sign_wrap}, {"SHI", FUNC_D, (void *) shi_wrap}, {"SI", FUNC_D, (void *) si_wrap}, {"SIGN", SIGN, NULL}, {"SIN", FUNC_D, (void *) sin}, {"SINH", FUNC_D, (void *) sinh}, {"SIZE", SIZE, NULL}, {"SKIP", SKIP, NULL}, {"SLEEP", SLEEP, NULL}, {"SMITH", SMITH, NULL}, {"SORT", SORT, NULL}, {"SOURCE", SOURCE, NULL}, {"SPEC", SPEC, NULL}, {"SPENCE", FUNC_D, (void *) spence}, {"SPLINE", SPLINE, NULL}, {"SPLIT", SPLIT, NULL}, {"SQR", FUNC_D, (void *) sqr_wrap}, {"SQRT", FUNC_D, (void *) sqrt}, {"STACK", STACK, NULL}, {"STACKED", STACKED, NULL}, {"STACKEDBAR", STACKEDBAR, NULL}, {"STACKEDHBAR", STACKEDHBAR, NULL}, {"STAGGER", STAGGER, NULL}, {"START", START, NULL}, {"STDTR", FUNC_ND, (void *) stdtr}, {"STDTRI", FUNC_ND, (void *) stdtri}, {"STOP", STOP, NULL}, {"STRING", STRING, NULL}, {"STRUVE", FUNC_DD, (void *) struve}, {"SUBTITLE", SUBTITLE, NULL}, {"SUM", SUM, NULL}, {"SWAP", SWAP, NULL}, {"SYMBOL", SYMBOL, NULL}, {"TAN", FUNC_D, (void *) tan}, {"TANH", FUNC_D, (void *) tanh}, {"TARGET", TARGET, NULL}, {"TICK", TICKP, NULL}, {"TICKLABEL", TICKLABEL, NULL}, {"TICKS", TICKSP, NULL}, {"TIMER", TIMER, NULL}, {"TIMESTAMP", TIMESTAMP, NULL}, {"TITLE", TITLE, NULL}, {"TO", TO, NULL}, {"TOP", TOP, NULL}, {"TRIANGULAR", TRIANGULAR, NULL}, {"TRUE", ON, NULL}, {"TYPE", TYPE, NULL}, {"UNIT", KEY_UNIT, NULL}, {"UP", UP, NULL}, {"UPDATEALL", UPDATEALL, NULL}, {"USE", USE, NULL}, {"VERSION", VERSION, NULL}, {"VERTI", VERTI, NULL}, {"VERTICAL", VERTICAL, NULL}, {"VERTO", VERTO, NULL}, {"VGAP", VGAP, NULL}, {"VIEW", VIEW, NULL}, {"VOIGT", FUNC_PPD, (void *) voigt}, {"VX1", VX1, NULL}, {"VX2", VX2, NULL}, {"VXMAX", VXMAX, NULL}, {"VY1", VY1, NULL}, {"VY2", VY2, NULL}, {"VYMAX", VYMAX, NULL}, {"WELCH", WELCH, NULL}, {"WITH", WITH, NULL}, {"WORLD", WORLD, NULL}, {"WRAP", WRAP, NULL}, {"WRITE", WRITE, NULL}, {"WX1", WX1, NULL}, {"WX2", WX2, NULL}, {"WY1", WY1, NULL}, {"WY2", WY2, NULL}, {"X", X_TOK, NULL}, {"X0", X0, NULL}, {"X1", X1, NULL}, {"XAXES", XAXES, NULL}, {"XAXIS", XAXIS, NULL}, {"XCOR", XCOR, NULL}, {"XMAX", XMAX, NULL}, {"XMIN", XMIN, NULL}, {"XY", XY, NULL}, {"XYAXES", XYAXES, NULL}, {"XYBOXPLOT", XYBOXPLOT, NULL}, {"XYCOLOR", XYCOLOR, NULL}, {"XYCOLPAT", XYCOLPAT, NULL}, {"XYDX", XYDX, NULL}, {"XYDXDX", XYDXDX, NULL}, {"XYDXDXDYDY", XYDXDXDYDY, NULL}, {"XYDXDY", XYDXDY, NULL}, {"XYDY", XYDY, NULL}, {"XYDYDY", XYDYDY, NULL}, {"XYHILO", XYHILO, NULL}, {"XYR", XYR, NULL}, {"XYSIZE", XYSIZE, NULL}, {"XYSTRING", XYSTRING, NULL}, {"XYVMAP", XYVMAP, NULL}, {"XYZ", XYZ, NULL}, {"Y", Y_TOK, NULL}, {"Y0", Y0, NULL}, {"Y1", Y1, NULL}, {"Y2", Y2, NULL}, {"Y3", Y3, NULL}, {"Y4", Y4, NULL}, {"YAXES", YAXES, NULL}, {"YAXIS", YAXIS, NULL}, {"YEAR", YEAR, NULL}, {"YMAX", YMAX, NULL}, {"YMIN", YMIN, NULL}, {"YV", FUNC_DD, (void *) yv_wrap}, {"YYMMDD", YYMMDD, NULL}, {"YYMMDDHMS", YYMMDDHMS, NULL}, {"ZERO", ZERO, NULL}, {"ZEROXAXIS", ALTXAXIS, NULL}, {"ZEROYAXIS", ALTYAXIS, NULL}, {"ZETA", FUNC_DD, (void *) zeta}, {"ZETAC", FUNC_D, (void *) zetac}, {"ZNORM", ZNORM, NULL} }; static int maxfunc = sizeof(ikey) / sizeof(symtab_entry); int get_parser_gno(void) { return whichgraph; } int set_parser_gno(int gno) { if (is_valid_gno(gno) == TRUE) { whichgraph = gno; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_parser_setno(void) { return whichset; } int set_parser_setno(int gno, int setno) { if (is_valid_setno(gno, setno) == TRUE) { whichgraph = gno; whichset = setno; /* those will usually be overridden except when evaluating a _standalone_ vexpr */ vasgn_gno = gno; vasgn_setno = setno; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } void realloc_vrbl(grarr *vrbl, int len) { double *a; int i, oldlen; if (vrbl->type != GRARR_VEC) { errmsg("Internal error"); return; } oldlen = vrbl->length; if (oldlen == len) { return; } else { a = xrealloc(vrbl->data, len*SIZEOF_DOUBLE); if (a != NULL || len == 0) { vrbl->data = a; vrbl->length = len; for (i = oldlen; i < len; i++) { vrbl->data[i] = 0.0; } } else { errmsg("Malloc failed in realloc_vrbl()"); } } } #define PARSER_TYPE_VOID 0 #define PARSER_TYPE_EXPR 1 #define PARSER_TYPE_VEXPR 2 static int parser(char *s, int type) { char *seekpos; int i; if (s == NULL || s[0] == '\0') { if (type == PARSER_TYPE_VOID) { /* don't consider an empty string as error for generic parser */ return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } strncpy(f_string, s, MAX_PARS_STRING_LENGTH - 2); f_string[MAX_PARS_STRING_LENGTH - 2] = '\0'; strcat(f_string, " "); seekpos = f_string; while ((seekpos - f_string < MAX_PARS_STRING_LENGTH - 1) && (*seekpos == ' ' || *seekpos == '\t')) { seekpos++; } if (*seekpos == '\n' || *seekpos == '#') { if (type == PARSER_TYPE_VOID) { /* don't consider an empty string as error for generic parser */ return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } lowtoupper(f_string); pos = 0; interr = 0; expr_parsed = FALSE; vexpr_parsed = FALSE; yyparse(); /* free temp. arrays; for a vector expression keep the last one * (which is none but v_result), given there have been no errors * and it's what we've been asked for */ if (vexpr_parsed && !interr && type == PARSER_TYPE_VEXPR) { for (i = 0; i < fcnt - 1; i++) { free_tmpvrbl(&(freelist[i])); } } else { for (i = 0; i < fcnt; i++) { free_tmpvrbl(&(freelist[i])); } } fcnt = 0; tgtn = 0; if ((type == PARSER_TYPE_VEXPR && !vexpr_parsed) || (type == PARSER_TYPE_EXPR && !expr_parsed)) { return RETURN_FAILURE; } else { return (interr ? RETURN_FAILURE:RETURN_SUCCESS); } } int s_scanner(char *s, double *res) { int retval = parser(s, PARSER_TYPE_EXPR); *res = s_result; return retval; } int v_scanner(char *s, int *reslen, double **vres) { int retval = parser(s, PARSER_TYPE_VEXPR); if (retval != RETURN_SUCCESS) { return RETURN_FAILURE; } else { *reslen = v_result->length; if (v_result->type == GRARR_TMP) { *vres = v_result->data; v_result->length = 0; v_result->data = NULL; } else { *vres = copy_data_column(v_result->data, v_result->length); } return RETURN_SUCCESS; } } int scanner(char *s) { int retval = parser(s, PARSER_TYPE_VOID); if (retval != RETURN_SUCCESS) { return RETURN_FAILURE; } if (gotparams) { gotparams = FALSE; getparms(paramfile); } if (gotread) { gotread = FALSE; getdata(whichgraph, readfile, cursource, LOAD_SINGLE); } if (gotnlfit) { gotnlfit = FALSE; do_nonlfit(nlfit_gno, nlfit_setno, nlfit_warray, NULL, nlfit_nsteps); XCFREE(nlfit_warray); } return retval; } static void free_tmpvrbl(grarr *vrbl) { if (vrbl->type == GRARR_TMP) { vrbl->length = 0; XCFREE(vrbl->data); } } static void copy_vrbl(grarr *dest, grarr *src) { dest->type = src->type; dest->data = xmalloc(src->length*SIZEOF_DOUBLE); if (dest->data == NULL) { errmsg("Malloc failed in copy_vrbl()"); } else { memcpy(dest->data, src->data, src->length*SIZEOF_DOUBLE); dest->length = src->length; } } grarr *get_parser_arr_by_name(char * const name) { int position; char *s; s = copy_string(NULL, name); lowtoupper(s); position = findf(key, s); xfree(s); if (position >= 0) { if (key[position].type == KEY_VEC) { return (grarr *) key[position].data; } } return NULL; } grarr *define_parser_arr(char * const name) { if (get_parser_arr_by_name(name) == NULL) { symtab_entry tmpkey; grarr *var; var = xmalloc(sizeof(grarr)); var->type = GRARR_VEC; var->length = 0; var->data = NULL; tmpkey.s = name; tmpkey.type = KEY_VEC; tmpkey.data = (void *) var; if (addto_symtab(tmpkey) == RETURN_SUCCESS) { return var; } else { return NULL; } } else { return NULL; } } int undefine_parser_var(void *ptr) { int i; for (i = 0; i < maxfunc; i++) { if (key[i].data == ptr) { xfree(key[i].s); maxfunc--; if (i != maxfunc) { memmove(&(key[i]), &(key[i + 1]), (maxfunc - i)*sizeof(symtab_entry)); } key = xrealloc(key, maxfunc*sizeof(symtab_entry)); return RETURN_SUCCESS; } } return RETURN_FAILURE; } static int find_set_bydata(double *data, target *tgt) { int gno, setno, ncol; if (data == NULL) { return RETURN_FAILURE; } else { for (gno = 0; gno < number_of_graphs(); gno++) { for (setno = 0; setno < number_of_sets(gno); setno++) { for (ncol = 0; ncol < MAX_SET_COLS; ncol++) { if (getcol(gno, setno, ncol) == data) { tgt->gno = gno; tgt->setno = setno; return RETURN_SUCCESS; } } } } } return RETURN_FAILURE; } static int findf(symtab_entry *keytable, char *s) { int low, high, mid; low = 0; high = maxfunc - 1; while (low <= high) { mid = (low + high) / 2; if (strcmp(s, keytable[mid].s) < 0) { high = mid - 1; } else { if (strcmp(s, keytable[mid].s) > 0) { low = mid + 1; } else { return (mid); } } } return (-1); } static int compare_keys (const void *a, const void *b) { return (int) strcmp (((const symtab_entry*)a)->s, ((const symtab_entry*)b)->s); } /* add new entry to the symbol table */ int addto_symtab(symtab_entry newkey) { int position; char *s; s = copy_string(NULL, newkey.s); lowtoupper(s); if ((position = findf(key, s)) < 0) { if ((key = (symtab_entry *) xrealloc(key, (maxfunc + 1)*sizeof(symtab_entry))) != NULL) { key[maxfunc].type = newkey.type; key[maxfunc].data = newkey.data; key[maxfunc].s = s; maxfunc++; qsort(key, maxfunc, sizeof(symtab_entry), compare_keys); return RETURN_SUCCESS; } else { xfree(s); return RETURN_FAILURE; } } else if (alias_force == TRUE) { /* already exists but alias_force enabled */ key[position].type = newkey.type; key[position].data = newkey.data; return RETURN_SUCCESS; } else { xfree(s); return RETURN_FAILURE; } } /* initialize symbol table */ void init_symtab(void) { int i; if ((key = (symtab_entry *) xmalloc(maxfunc*sizeof(symtab_entry))) != NULL) { memcpy (key, ikey, maxfunc*sizeof(symtab_entry)); for (i = 0; i < maxfunc; i++) { key[i].s = xmalloc(strlen(ikey[i].s) + 1); strcpy(key[i].s, ikey[i].s); } qsort(key, maxfunc, sizeof(symtab_entry), compare_keys); return; } else { key = ikey; return; } } static int getcharstr(void) { if (pos >= strlen(f_string)) return EOF; return (f_string[pos++]); } static void ungetchstr(void) { if (pos > 0) pos--; } static int yylex(void) { int c, i; int found; char sbuf[MAX_PARS_STRING_LENGTH + 40]; while ((c = getcharstr()) == ' ' || c == '\t'); if (c == EOF) { return (0); } if (c == '"') { i = 0; while ((c = getcharstr()) != '"' && c != EOF) { if (c == '\\') { int ctmp; ctmp = getcharstr(); if (ctmp != '"') { ungetchstr(); } else { c = ctmp; } } sbuf[i] = c; i++; } if (c == EOF) { yyerror("Nonterminating string"); return 0; } sbuf[i] = '\0'; yylval.sval = copy_string(NULL, sbuf); return CHRSTR; } if (c == '.' || isdigit(c)) { double d; int i, gotdot = 0; i = 0; while (c == '.' || isdigit(c)) { if (c == '.') { if (gotdot) { yyerror("Reading number, too many dots"); return 0; } else { gotdot = 1; } } sbuf[i++] = c; c = getcharstr(); } if (c == 'E' || c == 'e') { sbuf[i++] = c; c = getcharstr(); if (c == '+' || c == '-') { sbuf[i++] = c; c = getcharstr(); } while (isdigit(c)) { sbuf[i++] = c; c = getcharstr(); } } if (gotdot && i == 1) { ungetchstr(); return '.'; } sbuf[i] = '\0'; ungetchstr(); sscanf(sbuf, "%lf", &d); yylval.dval = d; return NUMBER; } /* graphs, sets, regions resp. */ if (c == 'G' || c == 'S' || c == 'R') { int i = 0, ctmp = c, gn, sn, rn; c = getcharstr(); while (isdigit(c) || c == '$' || c == '_') { sbuf[i++] = c; c = getcharstr(); } if (i == 0) { c = ctmp; ungetchstr(); } else { ungetchstr(); if (ctmp == 'G') { sbuf[i] = '\0'; if (i == 1 && sbuf[0] == '_') { gn = get_recent_gno(); } else if (i == 1 && sbuf[0] == '$') { gn = whichgraph; } else { gn = atoi(sbuf); } if (is_valid_gno(gn) || graph_allocate(gn) == RETURN_SUCCESS) { yylval.ival = gn; return GRAPHNO; } } else if (ctmp == 'S') { sbuf[i] = '\0'; if (i == 1 && sbuf[0] == '_') { sn = get_recent_setno(); } else if (i == 1 && sbuf[0] == '$') { sn = whichset; } else { sn = atoi(sbuf); } yylval.ival = sn; return SETNUM; } else if (ctmp == 'R') { sbuf[i] = '\0'; rn = atoi(sbuf); if (rn >= 0 && rn < MAXREGION) { yylval.ival = rn; return REGNUM; } else { errmsg("Invalid region number"); } } } } if (isalpha(c) || c == '$') { char *p = sbuf; do { *p++ = c; } while ((c = getcharstr()) != EOF && (isalpha(c) || isdigit(c) || c == '_' || c == '$')); ungetchstr(); *p = '\0'; #ifdef DEBUG if (get_debuglevel() == 2) { printf("->%s<-\n", sbuf); } #endif found = -1; if ((found = findf(key, sbuf)) >= 0) { if (key[found].type == FITPARM) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPARM; } else if (key[found].type == FITPMAX) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPMAX; } else if (key[found].type == FITPMIN) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPMIN; } else if (key[found].type == KEY_VAR) { yylval.dptr = (double *) key[found].data; return VAR_D; } else if (key[found].type == KEY_VEC) { yylval.vrbl = (grarr *) key[found].data; return VEC_D; } else if (key[found].type == FUNC_I) { yylval.ival = found; return FUNC_I; } else if (key[found].type == CONSTANT) { yylval.ival = found; return CONSTANT; } else if (key[found].type == UCONSTANT) { yylval.ival = found; return UCONSTANT; } else if (key[found].type == FUNC_D) { yylval.ival = found; return FUNC_D; } else if (key[found].type == FUNC_ND) { yylval.ival = found; return FUNC_ND; } else if (key[found].type == FUNC_DD) { yylval.ival = found; return FUNC_DD; } else if (key[found].type == FUNC_NND) { yylval.ival = found; return FUNC_NND; } else if (key[found].type == FUNC_PPD) { yylval.ival = found; return FUNC_PPD; } else if (key[found].type == FUNC_PPPD) { yylval.ival = found; return FUNC_PPPD; } else if (key[found].type == FUNC_PPPPD) { yylval.ival = found; return FUNC_PPPPD; } else if (key[found].type == FUNC_PPPPPD) { yylval.ival = found; return FUNC_PPPPPD; } else { yylval.ival = key[found].type; return key[found].type; } } else { yylval.sval = copy_string(NULL, sbuf); return NEW_TOKEN; } } switch (c) { case '>': return follow('=', GE, GT); case '<': return follow('=', LE, LT); case '=': return follow('=', EQ, '='); case '!': return follow('=', NE, NOT); case '|': return follow('|', OR, '|'); case '&': return follow('&', AND, '&'); case '\n': return '\n'; default: return c; } } static int follow(int expect, int ifyes, int ifno) { int c = getcharstr(); if (c == expect) { return ifyes; } ungetchstr(); return ifno; } static void yyerror(char *s) { char *buf; buf = copy_string(NULL, s); buf = concat_strings(buf, ": "); buf = concat_strings(buf, f_string); errmsg(buf); xfree(buf); interr = 1; } grace-5.1.23/src/fileswin.c0000644000076500001440000005070710071615561015216 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * read/write data/parameter files * */ #include #include #include #include #include #if defined(HAVE_SYS_PARAM_H) # include #endif #include #include #include #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "graphutils.h" #include "utils.h" #include "files.h" #include "motifinc.h" #include "protos.h" static int open_proc(char *filename, void *data); static int save_proc(char *filename, void *data); static int read_sets_proc(char *filename, void *data); static void set_load_proc(int value, void *data); static void set_src_proc(Widget w, XtPointer client_data, XtPointer call_data); static int write_sets_proc(char *filename, void *data); static int read_params_proc(char *filename, void *data); static int write_params_proc(char *filename, void *data); typedef struct { Widget format_item; /* format */ Widget descr_item; /* description */ } saveGUI; static saveGUI save_gui; static void update_save_gui(saveGUI *gui) { xv_setstr(gui->format_item, sformat); xv_setstr(gui->descr_item, get_project_description()); } void create_saveproject_popup(void) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { Widget fr, rc; fsb = CreateFileSelectionBox(app_shell, "Save project"); fr = CreateFrame(fsb->rc, NULL); rc = XmCreateRowColumn(fr, "rc", NULL, 0); save_gui.descr_item = CreateScrollTextItem2(rc, 5, "Project description:"); save_gui.format_item = CreateTextItem2(rc, 15, "Data format:"); ManageChild(rc); AddFileSelectionBoxCB(fsb, save_proc, &save_gui); ManageChild(fsb->FSB); } update_save_gui(&save_gui); RaiseWindow(fsb->dialog); unset_wait_cursor(); } /* * save project to a file */ static int save_proc(char *filename, void *data) { char *s; saveGUI *gui = (saveGUI *) data; strcpy(sformat, xv_getstr(gui->format_item)); s = XmTextGetString(gui->descr_item); set_project_description(s); XtFree(s); if (save_project(filename) == RETURN_SUCCESS) { return TRUE; } else { return FALSE; } } void create_openproject_popup(void) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Open project"); AddFileSelectionBoxCB(fsb, open_proc, NULL); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } /* * open project from a file */ static int open_proc(char *filename, void *data) { if (load_project(filename) == RETURN_SUCCESS) { update_all(); xdrawgraph(); return TRUE; } else { return FALSE; } } typedef struct { ListStructure *graph_item; /* graph choice item */ OptionStructure *ftype_item; /* set type choice item */ OptionStructure *load_item; /* load as single/nxy/block */ OptionStructure *auto_item; /* autoscale on read */ } rdataGUI; void create_file_popup(void *data) { static FSBStructure *rdata_dialog = NULL; set_wait_cursor(); if (rdata_dialog == NULL) { int i; Widget lab, rc, rc2, fr, rb, w[2]; rdataGUI *gui; OptionItem option_items[3]; gui = xmalloc(sizeof(rdataGUI)); rdata_dialog = CreateFileSelectionBox(app_shell, "Read sets"); AddFileSelectionBoxCB(rdata_dialog, read_sets_proc, (void *) gui); fr = CreateFrame(rdata_dialog->rc, NULL); rc = XmCreateRowColumn(fr, "rc", NULL, 0); gui->graph_item = CreateGraphChoice(rc, "Read to graph:", LIST_TYPE_SINGLE); rc2 = XmCreateRowColumn(rc, "rc2", NULL, 0); XtVaSetValues(rc2, XmNorientation, XmHORIZONTAL, NULL); option_items[0].value = LOAD_SINGLE; option_items[0].label = "Single set"; option_items[1].value = LOAD_NXY; option_items[1].label = "NXY"; option_items[2].value = LOAD_BLOCK; option_items[2].label = "Block data"; gui->load_item = CreateOptionChoice(rc2, "Load as", 1, 3, option_items); AddOptionChoiceCB(gui->load_item, set_load_proc, (void *) gui); gui->ftype_item = CreateSetTypeChoice(rc2, "Set type:"); ManageChild(rc2); rc2 = XmCreateRowColumn(rc, "rc2", NULL, 0); XtVaSetValues(rc2, XmNorientation, XmHORIZONTAL, NULL); lab = CreateLabel(rc2, "Data source:"); rb = XmCreateRadioBox(rc2, "radio_box_2", NULL, 0); XtVaSetValues(rb, XmNorientation, XmHORIZONTAL, NULL); w[0] = CreateToggleButton(rb, "Disk"); w[1] = CreateToggleButton(rb, "Pipe"); for (i = 0; i < 2; i++) { XtAddCallback(w[i], XmNvalueChangedCallback, set_src_proc, (XtPointer) i); } ManageChild(rb); ManageChild(w[0]); ManageChild(w[1]); SetToggleButtonState(w[0], TRUE); ManageChild(rc2); gui->auto_item = CreateASChoice(rc, "Autoscale on read:"); ManageChild(rc); ManageChild(rdata_dialog->FSB); } RaiseWindow(rdata_dialog->dialog); unset_wait_cursor(); } static int read_sets_proc(char *filename, void *data) { int graphno; int load; rdataGUI *gui = (rdataGUI *) data; load = GetOptionChoice(gui->load_item); if (GetSingleListChoice(gui->graph_item, &graphno) != RETURN_SUCCESS) { errmsg("Please select a single graph"); } else { if (load == LOAD_SINGLE) { curtype = GetOptionChoice(gui->ftype_item); } autoscale_onread = GetOptionChoice(gui->auto_item); getdata(graphno, filename, cursource, load); if (load == LOAD_BLOCK) { create_eblock_frame(graphno); } else { update_all(); xdrawgraph(); } } /* never close the popup */ return FALSE; } static void set_src_proc(Widget w, XtPointer client_data, XtPointer call_data) { int which = (int) client_data; XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *) call_data; if (state->set) { cursource = which; } } static void set_load_proc(int value, void *data) { rdataGUI *gui = (rdataGUI *) data; if (value == LOAD_SINGLE) { SetSensitive(gui->ftype_item->menu, True); } else { SetOptionChoice(gui->ftype_item, SET_XY); SetSensitive(gui->ftype_item->menu, False); } } typedef struct { ListStructure *sel; Widget format_item; } wdataGUI; void create_write_popup(void *data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { Widget fr, rc; wdataGUI *gui; gui = xmalloc(sizeof(wdataGUI)); fsb = CreateFileSelectionBox(app_shell, "Write sets"); AddFileSelectionBoxCB(fsb, write_sets_proc, (void *) gui); fr = CreateFrame(fsb->rc, NULL); rc = XmCreateRowColumn(fr, "rc", NULL, 0); gui->sel = CreateSetChoice(rc, "Write set(s):", LIST_TYPE_MULTIPLE, TRUE); gui->format_item = CreateTextItem2(rc, 15, "Format: "); xv_setstr(gui->format_item, sformat); ManageChild(rc); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } /* * write a set or sets to a file */ static int write_sets_proc(char *filename, void *data) { wdataGUI *gui = (wdataGUI *) data; int *selset, cd, i; int gno, setno; char format[32]; FILE *cp; cp = grace_openw(filename); if (cp == NULL) { return FALSE; } cd = GetListChoices(gui->sel, &selset); if (cd < 1) { errmsg("No set selected"); } else { gno = get_cg(); strncpy(format, xv_getstr(gui->format_item), 31); for(i = 0; i < cd; i++) { setno = selset[i]; write_set(gno, setno, cp, format, TRUE); } xfree(selset); } grace_close(cp); /* never close the popup */ return FALSE; } void create_rparams_popup(void *data) { static FSBStructure *rparams_dialog = NULL; set_wait_cursor(); if (rparams_dialog == NULL) { rparams_dialog = CreateFileSelectionBox(app_shell, "Read parameters"); AddFileSelectionBoxCB(rparams_dialog, read_params_proc, NULL); ManageChild(rparams_dialog->FSB); } RaiseWindow(rparams_dialog->dialog); unset_wait_cursor(); } static int read_params_proc(char *filename, void *data) { getparms(filename); update_all(); xdrawgraph(); /* never close the popup */ return FALSE; } /* * Create the wparam Frame and the wparam Panel */ void create_wparam_frame(void *data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { Widget fr, *graph_item; fsb = CreateFileSelectionBox(app_shell, "Write parameters"); fr = CreateFrame(fsb->rc, NULL); graph_item = CreatePanelChoice(fr, "Write parameters from graph:", 3, "Current", "All", NULL); AddFileSelectionBoxCB(fsb, write_params_proc, graph_item); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } static int write_params_proc(char *filename, void *data) { Widget *graph_item = (Widget *) data; int gno; FILE *pp; if (GetChoice(graph_item) == 0) { gno = get_cg(); } else { gno = ALL_GRAPHS; } pp = grace_openw(filename); if (pp != NULL) { putparms(gno, pp, 0); grace_close(pp); } /* never close the popup */ return FALSE; } #ifdef HAVE_NETCDF #include /* * * netcdf reader * */ static Widget netcdf_frame = (Widget) NULL; static Widget netcdf_listx_item; static Widget netcdf_listy_item; static Widget netcdf_file_item; void create_netcdffiles_popup(Widget w, XtPointer client_data, XtPointer call_data); static void do_netcdfquery_proc(Widget w, XtPointer client_data, XtPointer call_data); void update_netcdfs(void); int getnetcdfvars(void); static void do_netcdf_proc(Widget w, XtPointer client_data, XtPointer call_data) { int setno; char fname[256]; char xvar[256], yvar[256]; XmString *s, cs; int *pos_list; int j, pos_cnt, cnt, retval; char *cstr; set_wait_cursor(); /* * setno == -1, then next set */ setno = -1; strcpy(fname, xv_getstr(netcdf_file_item)); if (XmListGetSelectedPos(netcdf_listx_item, &pos_list, &pos_cnt)) { XtVaGetValues(netcdf_listx_item, XmNselectedItemCount, &cnt, XmNselectedItems, &s, NULL); cs = XmStringCopy(*s); if ((cstr = GetStringSimple(cs))) { strcpy(xvar, cstr); XtFree(cstr); } XmStringFree(cs); } else { errmsg("Need to select X, either variable name or INDEX"); unset_wait_cursor(); return; } if (XmListGetSelectedPos(netcdf_listy_item, &pos_list, &pos_cnt)) { j = pos_list[0]; XtVaGetValues(netcdf_listy_item, XmNselectedItemCount, &cnt, XmNselectedItems, &s, NULL); cs = XmStringCopy(*s); if ((cstr = GetStringSimple(cs))) { strcpy(yvar, cstr); XtFree(cstr); } XmStringFree(cs); } else { errmsg("Need to select Y"); unset_wait_cursor(); return; } if (strcmp(xvar, "INDEX") == 0) { retval = readnetcdf(get_cg(), setno, fname, NULL, yvar, -1, -1, 1); } else { retval = readnetcdf(get_cg(), setno, fname, xvar, yvar, -1, -1, 1); } if (retval) { xdrawgraph(); } unset_wait_cursor(); } void update_netcdfs(void) { int i; char buf[256], fname[512]; XmString xms; int cdfid; /* netCDF id */ int ndims, nvars, ngatts, recdim; int var_id; char varname[256]; nc_type datatype = 0; int dim[100], natts; long dimlen[100]; long len; ncopts = 0; /* no crash on error */ if (netcdf_frame != NULL) { strcpy(fname, xv_getstr(netcdf_file_item)); set_wait_cursor(); XmListDeleteAllItems(netcdf_listx_item); XmListDeleteAllItems(netcdf_listy_item); xms = XmStringCreateLocalized("INDEX"); XmListAddItemUnselected(netcdf_listx_item, xms, 0); XmStringFree(xms); if (strlen(fname) < 2) { unset_wait_cursor(); return; } if ((cdfid = ncopen(fname, NC_NOWRITE)) == -1) { errmsg("Can't open file."); unset_wait_cursor(); return; } ncinquire(cdfid, &ndims, &nvars, &ngatts, &recdim); for (i = 0; i < ndims; i++) { ncdiminq(cdfid, i, NULL, &dimlen[i]); } for (i = 0; i < nvars; i++) { ncvarinq(cdfid, i, varname, &datatype, &ndims, dim, &natts); if ((var_id = ncvarid(cdfid, varname)) == -1) { char ebuf[256]; sprintf(ebuf, "update_netcdfs(): No such variable %s", varname); errmsg(ebuf); continue; } if (ndims != 1) { continue; } ncdiminq(cdfid, dim[0], (char *) NULL, &len); sprintf(buf, "%s", varname); xms = XmStringCreateLocalized(buf); XmListAddItemUnselected(netcdf_listx_item, xms, 0); XmListAddItemUnselected(netcdf_listy_item, xms, 0); XmStringFree(xms); } ncclose(cdfid); unset_wait_cursor(); } } static void do_netcdfupdate_proc(Widget w, XtPointer client_data, XtPointer call_data) { set_wait_cursor(); update_netcdfs(); unset_wait_cursor(); } void create_netcdfs_popup(void *data) { static Widget top, dialog; Widget lab; Arg args[3]; set_wait_cursor(); if (top == NULL) { char *label1[5]; Widget but1[5]; label1[0] = "Accept"; label1[1] = "Files..."; label1[2] = "Update"; label1[3] = "Query"; label1[4] = "Close"; top = XmCreateDialogShell(app_shell, "netCDF", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); XtSetArg(args[0], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); XtSetArg(args[1], XmNvisibleItemCount, 5); lab = CreateLabel(dialog, "Select set X:"); netcdf_listx_item = XmCreateScrolledList(dialog, "list", args, 2); ManageChild(netcdf_listx_item); lab = CreateLabel(dialog, "Select set Y:"); netcdf_listy_item = XmCreateScrolledList(dialog, "list", args, 2); ManageChild(netcdf_listy_item); netcdf_file_item = CreateTextItem2(dialog, 30, "netCDF file:"); CreateSeparator(dialog); CreateCommandButtons(dialog, 5, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_netcdf_proc, (XtPointer) NULL); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) create_netcdffiles_popup, (XtPointer) NULL); XtAddCallback(but1[2], XmNactivateCallback, (XtCallbackProc) do_netcdfupdate_proc, (XtPointer) NULL); XtAddCallback(but1[3], XmNactivateCallback, (XtCallbackProc) do_netcdfquery_proc, (XtPointer) NULL); XtAddCallback(but1[4], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); netcdf_frame = top; if (strlen(netcdf_name)) { xv_setstr(netcdf_file_item, netcdf_name); } } update_netcdfs(); RaiseWindow(top); unset_wait_cursor(); } static int do_netcdffile_proc(char *filename, void *data) { xv_setstr(netcdf_file_item, filename); update_netcdfs(); return TRUE; } void create_netcdffiles_popup(Widget w, XtPointer client_data, XtPointer call_data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Select netCDF file"); AddFileSelectionBoxCB(fsb, do_netcdffile_proc, NULL); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } char *getcdf_type(nc_type datatype) { switch (datatype) { case NC_SHORT: return "NC_SHORT"; break; case NC_LONG: return "NC_LONG"; break; case NC_FLOAT: return "NC_FLOAT"; break; case NC_DOUBLE: return "NC_DOUBLE"; break; default: return "UNKNOWN (can't read this)"; break; } } static void do_netcdfquery_proc(Widget w, XtPointer client_data, XtPointer call_data) { char xvar[256], yvar[256]; char buf[256], fname[512]; XmString *s, cs; int *pos_list; int i, pos_cnt, cnt; char *cstr; int cdfid; /* netCDF id */ nc_type datatype = 0; float f; double d; int x_id, y_id; nc_type xdatatype = 0; nc_type ydatatype = 0; int xndims, xdim[10], xnatts; int yndims, ydim[10], ynatts; long nx, ny; int atlen; char attname[256]; char atcharval[256]; ncopts = 0; /* no crash on error */ set_wait_cursor(); strcpy(fname, xv_getstr(netcdf_file_item)); if ((cdfid = ncopen(fname, NC_NOWRITE)) == -1) { errmsg("Can't open file."); unset_wait_cursor(); return; } if (XmListGetSelectedPos(netcdf_listx_item, &pos_list, &pos_cnt)) { XtVaGetValues(netcdf_listx_item, XmNselectedItemCount, &cnt, XmNselectedItems, &s, NULL); cs = XmStringCopy(*s); if ((cstr = GetStringSimple(cs))) { strcpy(xvar, cstr); XtFree(cstr); } XmStringFree(cs); } else { errmsg("Need to select X, either variable name or INDEX"); goto out1; } if (XmListGetSelectedPos(netcdf_listy_item, &pos_list, &pos_cnt)) { XtVaGetValues(netcdf_listy_item, XmNselectedItemCount, &cnt, XmNselectedItems, &s, NULL); cs = XmStringCopy(*s); if ((cstr = GetStringSimple(cs))) { strcpy(yvar, cstr); XtFree(cstr); } XmStringFree(cs); } else { errmsg("Need to select Y"); goto out1; } if (strcmp(xvar, "INDEX") == 0) { stufftext("X is the index of the Y variable\n"); } else { if ((x_id = ncvarid(cdfid, xvar)) == -1) { char ebuf[256]; sprintf(ebuf, "do_query(): No such variable %s for X", xvar); errmsg(ebuf); goto out1; } ncvarinq(cdfid, x_id, NULL, &xdatatype, &xndims, xdim, &xnatts); ncdiminq(cdfid, xdim[0], NULL, &nx); sprintf(buf, "X is %s, data type %s \t length [%ld]\n", xvar, getcdf_type(xdatatype), nx); stufftext(buf); sprintf(buf, "\t%d Attributes:\n", xnatts); stufftext(buf); for (i = 0; i < xnatts; i++) { atcharval[0] = 0; ncattname(cdfid, x_id, i, attname); ncattinq(cdfid, x_id, attname, &datatype, &atlen); switch (datatype) { case NC_CHAR: ncattget(cdfid, x_id, attname, (void *) atcharval); atcharval[atlen] = 0; sprintf(buf, "\t\t%s: %s\n", attname, atcharval); stufftext(buf); break; case NC_FLOAT: ncattget(cdfid, x_id, attname, (void *) &f); sprintf(buf, "\t\t%s: %f\n", attname, f); stufftext(buf); break; case NC_DOUBLE: ncattget(cdfid, x_id, attname, (void *) &d); sprintf(buf, "\t\t%s: %f\n", attname, d); stufftext(buf); break; default: break; } } } if ((y_id = ncvarid(cdfid, yvar)) == -1) { char ebuf[256]; sprintf(ebuf, "do_query(): No such variable %s for Y", yvar); errmsg(ebuf); goto out1; } ncvarinq(cdfid, y_id, NULL, &ydatatype, &yndims, ydim, &ynatts); ncdiminq(cdfid, ydim[0], NULL, &ny); sprintf(buf, "Y is %s, data type %s \t length [%ld]\n", yvar, getcdf_type(ydatatype), ny); stufftext(buf); sprintf(buf, "\t%d Attributes:\n", ynatts); stufftext(buf); for (i = 0; i < ynatts; i++) { atcharval[0] = 0; ncattname(cdfid, y_id, i, attname); ncattinq(cdfid, y_id, attname, &datatype, &atlen); switch (datatype) { case NC_CHAR: ncattget(cdfid, y_id, attname, (void *) atcharval); atcharval[atlen] = 0; sprintf(buf, "\t\t%s: %s\n", attname, atcharval); stufftext(buf); break; case NC_FLOAT: ncattget(cdfid, y_id, attname, (void *) &f); sprintf(buf, "\t\t%s: %f\n", attname, f); stufftext(buf); break; case NC_DOUBLE: ncattget(cdfid, y_id, attname, (void *) &d); sprintf(buf, "\t\t%s: %f\n", attname, d); stufftext(buf); break; default: break; } } out1:; ncclose(cdfid); stufftext("\n"); unset_wait_cursor(); } #endif grace-5.1.23/src/mathstuff.c0000644000076500001440000001111111014400276015352 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Wrappers for some math functions */ #include #include "cmath.h" #include "protos.h" #include "defines.h" #include "utils.h" #include "cephes/cephes.h" #include "mathstuff.h" extern double ai_wrap(double x) { double retval, dummy1, dummy2, dummy3; (void) airy(x, &retval, &dummy1, &dummy2, &dummy3); return retval; } extern double bi_wrap(double x) { double retval, dummy1, dummy2, dummy3; (void) airy(x, &dummy1, &dummy2, &retval, &dummy3); return retval; } extern double ci_wrap(double x) { double retval, dummy1; (void) sici(x, &dummy1, &retval); return retval; } extern double si_wrap(double x) { double retval, dummy1; (void) sici(x, &retval, &dummy1); return retval; } extern double chi_wrap(double x) { double retval, dummy1; (void) shichi(x, &dummy1, &retval); return retval; } extern double shi_wrap(double x) { double retval, dummy1; (void) shichi(x, &retval, &dummy1); return retval; } extern double fresnlc_wrap(double x) { double retval, dummy1; (void) fresnl(x, &dummy1, &retval); return retval; } extern double fresnls_wrap(double x) { double retval, dummy1; (void) fresnl(x, &retval, &dummy1); return retval; } extern double iv_wrap(double v, double x) { double retval; if (v == 0) { retval = i0(x); } else if (v == 1) { retval = i1(x); } else { retval = iv(v, x); } return retval; } extern double jv_wrap(double v, double x) { double retval; if (v == rint(v)) { retval = jn((int) v, x); } else { retval = jv(v, x); } return retval; } extern double kn_wrap(int n, double x) { double retval; if (n == 0) { retval = k0(x); } else if (n == 1) { retval = k1(x); } else { retval = kn(n, x); } return retval; } extern double yv_wrap(double v, double x) { double retval; if (v == rint(v)) { retval = yn((int) v, x); } else { retval = yv(v, x); } return retval; } extern double sqr_wrap(double x) { return x*x; } extern double max_wrap(double x, double y) { return MAX2(x, y); } extern double min_wrap(double x, double y) { return MIN2(x, y); } extern double irand_wrap(int x) { return (double) (lrand48() % x); } extern double pi_const(void) { return M_PI; } extern double deg_uconst(void) { return M_PI / 180.0; } extern double rad_uconst(void) { return 1.0; } #define C1 0.1978977093962766 #define C2 0.1352915131768107 extern double rnorm(double mean, double sdev) { double u = drand48(); return mean + sdev * (pow(u, C2) - pow(1.0 - u, C2)) / C1; } extern double fx(double x) { return 1.0 / sqrt(2.0 * M_PI) * exp(-x * x * 0.5); } /* Wrapper around the cephes ellpe() call which definition is different to the standard definition. See cephes/ellpe.c */ double ellpe_wrap ( double x ) { double y; y = ellpe(1.0 - x); return y; } /* Wrapper around the cephes ellpk() call which definition is different to the standard definition. See cephes/ellpk.c */ double ellpk_wrap ( double x ) { double y; y = ellpk(1.0 - x); return y; } double sign_wrap(double x) { return (double) sign(x); } /* Double-precision wrapper around humlik(), as the rest of funcs in Grace */ double voigt(double gamma, double sigma, double x) { double v, X, Y; if (sigma == 0.0) { v = gamma/M_PI/(gamma*gamma + x*x); } else { X = x/sigma*M_SQRT1_2; Y = gamma/sigma*M_SQRT1_2; v = humlik(X, Y); v /= sigma*sqrt(2*M_PI); } return v; } grace-5.1.23/src/dlmodule.c0000644000076500001440000000721410335470174015200 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * dlmodule.c - DLL stuff for Grace * The following interfaces are supported: * + dlopen() (Linux, SunOS, Solaris, OSF, IRIX, AIX-4, UnixWare, ...) * + shl_load() (HP/UX) * + AIX-3 - there is a free dlopen() emulation library * - VMS ?? */ #include #if defined(HAVE_DLOPEN) # include #endif #if defined(HAVE_SHL_LOAD) # include #endif #include #include "dlmodule.h" #include "defines.h" #include "globals.h" #include "utils.h" #include "parser.h" int dl_load_fast = TRUE; /* controls type of DL module load */ /* TODO: make it tunable through a command */ int load_module(char *fname, char *dl_function, char *dl_key, int dl_type) { #if defined(HAVE_DL) int dlflag; void *handle; const char *error; symtab_entry newkey; int retval; if ((dl_type < 0) || (dl_key == NULL) || (dl_function == NULL)) { errmsg("Improper call to load_module()"); return RETURN_FAILURE; } #if defined(HAVE_DLOPEN) # if defined(HAVE_RTLD_NOW) if (dl_load_fast == TRUE) { dlflag = RTLD_LAZY; } else { dlflag = RTLD_NOW; } # else dlflag = 1; # endif handle = dlopen(fname, dlflag); if (!handle) { errmsg(dlerror()); return RETURN_FAILURE; } newkey.data = dlsym(handle, dl_function); if (!newkey.data && (error = dlerror()) != NULL) { errmsg(error); dlclose(handle); return RETURN_FAILURE; } #endif /* end dlopen interface */ #if defined(HAVE_SHL_LOAD) if (dl_load_fast == TRUE) { dlflag = BIND_DEFERRED; } else { dlflag = BIND_IMMEDIATE; } handle = (void *) shl_load (fname, dlflag, 0L); if (!handle) { #if defined(HAVE_STRERROR) errmsg(strerror(errno)); #else # if defined(HAVE_SYS_ERRLIST_DECL) errmsg(sys_errlist[errno]); # else errmsg("DL module initialization failed"); # endif #endif return RETURN_FAILURE; } if (shl_findsym(handle, dl_function, TYPE_UNDEFINED, &newkey.data) != NULL) { #if defined(HAVE_STRERROR) errmsg(strerror(errno)); #else # if defined(HAVE_SYS_ERRLIST_DECL) errmsg(sys_errlist[errno]); # else errmsg("Error while resolving symbol"); # endif #endif shl_unload(handle); return RETURN_FAILURE; } #endif /* end shl_load interface */ newkey.type = dl_type; newkey.s = copy_string(NULL, dl_key); retval = addto_symtab(newkey); xfree(newkey.s); return retval; #else /* no support for DL */ errmsg("No support for DL modules on your OS"); return RETURN_FAILURE; #endif } grace-5.1.23/src/setutils.c0000644000076500001440000011422510071615562015247 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * routines to allocate, manipulate, and return * information about sets. * */ #include #include #include #include #include #include "globals.h" #include "utils.h" #include "files.h" #include "graphs.h" #include "protos.h" extern graph *g; /* * return the string version of the set type */ char *set_types(int it) { char *s = "xy"; switch (it) { case SET_XY: s = "xy"; break; case SET_BAR: s = "bar"; break; case SET_BARDY: s = "bardy"; break; case SET_BARDYDY: s = "bardydy"; break; case SET_XYZ: s = "xyz"; break; case SET_XYDX: s = "xydx"; break; case SET_XYDY: s = "xydy"; break; case SET_XYDXDX: s = "xydxdx"; break; case SET_XYDYDY: s = "xydydy"; break; case SET_XYDXDY: s = "xydxdy"; break; case SET_XYDXDXDYDY: s = "xydxdxdydy"; break; case SET_XYHILO: s = "xyhilo"; break; case SET_XYR: s = "xyr"; break; case SET_XYCOLOR: s = "xycolor"; break; case SET_XYCOLPAT: s = "xycolpat"; break; case SET_XYVMAP: s = "xyvmap"; break; case SET_BOXPLOT: s = "xyboxplot"; break; case SET_XYSIZE: s = "xysize"; break; } return s; } int get_settype_by_name(char *s) { int i; for (i = 0; i < NUMBER_OF_SETTYPES; i++) { if (strcmp(set_types(i), s) == 0) { return i; } } return SET_BAD; } int settype_cols(int type) { int ncols; switch (type) { case SET_XY: case SET_BAR: ncols = 2; break; case SET_XYDX: case SET_XYDY: case SET_XYZ: case SET_BARDY: case SET_XYR: case SET_XYCOLOR: case SET_XYSIZE: ncols = 3; break; case SET_XYDXDX: case SET_XYDYDY: case SET_XYDXDY: case SET_BARDYDY: case SET_XYCOLPAT: case SET_XYVMAP: ncols = 4; break; case SET_XYHILO: ncols = 5; break; case SET_XYDXDXDYDY: case SET_BOXPLOT: ncols = 6; break; default: ncols = 0; break; } return ncols; } /* * return the string version of the dataset column */ char *dataset_colname(int col) { char *s; switch (col) { case 0: s = "X"; break; case 1: s = "Y"; break; case 2: s = "Y1"; break; case 3: s = "Y2"; break; case 4: s = "Y3"; break; case 5: s = "Y4"; break; default: s = "?"; errmsg("Internal error in dataset_colname()"); break; } return s; } int zero_set_data(Dataset *dsp) { int k; if (dsp) { dsp->len = 0; for (k = 0; k < MAX_SET_COLS; k++) { dsp->ex[k] = NULL; } dsp->s = NULL; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* * free set data */ int free_set_data(Dataset *dsp) { int k; if (dsp) { if (dsp->len) { for (k = 0; k < MAX_SET_COLS; k++) { XCFREE(dsp->ex[k]); } if (dsp->s) { for (k = 0; k < dsp->len; k++) { XCFREE(dsp->s[k]); } XCFREE(dsp->s); } dsp->len = 0; set_dirtystate(); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* * free set data, but preserve the parameter settings */ void killsetdata(int gno, int setno) { if (is_valid_setno(gno, setno)) { free_set_data(&g[gno].p[setno].data); } } /* * (re)allocate data arrays for a set of length len. */ int setlength(int gno, int setno, int len) { plotarr *p; int i, j, ncols, oldlen; if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } p = &g[gno].p[setno]; oldlen = p->data.len; if (len == oldlen) { return RETURN_SUCCESS; } if (len < 0) { return RETURN_FAILURE; } ncols = settype_cols(p->type); if (ncols == 0) { errmsg("Set type not found in setlength()!"); return RETURN_FAILURE; } for (i = 0; i < ncols; i++) { if ((p->data.ex[i] = xrealloc(p->data.ex[i], len*SIZEOF_DOUBLE)) == NULL && len != 0) { return RETURN_FAILURE; } for (j = oldlen; j < len; j++) { p->data.ex[i][j] = 0.0; } } if (p->data.s != NULL) { for (i = len; i < oldlen; i++) { xfree(p->data.s[i]); } p->data.s = xrealloc(p->data.s, len*sizeof(char *)); for (j = oldlen; j < len; j++) { p->data.s[j] = copy_string(NULL, ""); } } p->data.len = len; set_dirtystate(); return RETURN_SUCCESS; } /* * moveset */ int moveset(int gnofrom, int setfrom, int gnoto, int setto) { if (gnoto == gnofrom && setfrom == setto) { return RETURN_FAILURE; } if (is_valid_setno(gnofrom, setfrom) != TRUE) { return RETURN_FAILURE; } if (is_set_active(gnoto, setto)) { killset(gnoto, setto); } activateset(gnoto, setto); memcpy(&g[gnoto].p[setto], &g[gnofrom].p[setfrom], sizeof(plotarr)); zero_set_data(&g[gnofrom].p[setfrom].data); g[gnofrom].p[setfrom].hidden = TRUE; set_dirtystate(); return RETURN_SUCCESS; } /* * copy a set to another set, if the to set doesn't exist allocate it */ int copyset(int gfrom, int setfrom, int gto, int setto) { int i, k, len, ncols; double *savec[MAX_SET_COLS]; char **saves; char buf[256]; if (!is_set_active(gfrom, setfrom)) { return RETURN_FAILURE; } if (!is_valid_gno(gto)) { return RETURN_FAILURE; } if (setfrom == setto && gfrom == gto) { return RETURN_FAILURE; } if (is_set_active(gto, setto)) { killset(gto, setto); } len = getsetlength(gfrom, setfrom); ncols = dataset_cols(gfrom, setfrom); activateset(gto, setto); set_dataset_type(gto, setto, dataset_type(gfrom, setfrom)); if (setlength(gto, setto, len) != RETURN_SUCCESS) { return RETURN_FAILURE; } if (g[gfrom].p[setfrom].data.s != NULL) { if ((g[gto].p[setto].data.s = xmalloc(len*sizeof(char *))) == NULL) { return RETURN_FAILURE; } } for (k = 0; k < MAX_SET_COLS; k++) { savec[k] = getcol(gto, setto, k); } saves = get_set_strings(gto, setto); memcpy(&g[gto].p[setto], &g[gfrom].p[setfrom], sizeof(plotarr)); for (k = 0; k < ncols; k++) { g[gto].p[setto].data.ex[k] = savec[k]; memcpy(g[gto].p[setto].data.ex[k], g[gfrom].p[setfrom].data.ex[k], len*SIZEOF_DOUBLE); } g[gto].p[setto].data.s = saves; if (g[gfrom].p[setfrom].data.s != NULL) { for (i = 0; i < len; i++) { g[gto].p[setto].data.s[i] = copy_string(NULL, g[gfrom].p[setfrom].data.s[i]); } } sprintf(buf, "copy of set G%d.S%d", gfrom, setfrom); setcomment(gto, setto, buf); set_dirtystate(); return RETURN_SUCCESS; } /* * same as copyset(), but doesn't alter the to set appearance */ int copysetdata(int gfrom, int setfrom, int gto, int setto) { int i, k, len, ncols; char buf[256]; if (!is_set_active(gfrom, setfrom)) { return RETURN_FAILURE; } if (!is_valid_gno(gto)) { return RETURN_FAILURE; } if (setfrom == setto && gfrom == gto) { return RETURN_FAILURE; } if (is_set_active(gto, setto)) { killsetdata(gto, setto); } len = getsetlength(gfrom, setfrom); ncols = dataset_cols(gfrom, setfrom); activateset(gto, setto); if (dataset_cols(gto, setto) != ncols) { set_dataset_type(gto, setto, dataset_type(gfrom, setfrom)); } if (setlength(gto, setto, len) != RETURN_SUCCESS) { return RETURN_FAILURE; } if (g[gfrom].p[setfrom].data.s != NULL) { if ((g[gto].p[setto].data.s = xmalloc(len*sizeof(char *))) == NULL) { return RETURN_FAILURE; } } for (k = 0; k < ncols; k++) { memcpy(g[gto].p[setto].data.ex[k], g[gfrom].p[setfrom].data.ex[k], len*SIZEOF_DOUBLE); } if (g[gfrom].p[setfrom].data.s != NULL) { for (i = 0; i < len; i++) { g[gto].p[setto].data.s[i] = copy_string(NULL, g[gfrom].p[setfrom].data.s[i]); } } sprintf(buf, "copy of setdata G%d.S%d", gfrom, setfrom); setcomment(gto, setto, buf); set_dirtystate(); return RETURN_SUCCESS; } /* * swap a set with another set */ int swapset(int gno1, int setno1, int gno2, int setno2) { plotarr p; if (is_valid_setno(gno1, setno1) == FALSE || is_valid_setno(gno2, setno2) == FALSE) { return RETURN_FAILURE; } if (setno1 == setno2 && gno1 == gno2) { return RETURN_FAILURE; } memcpy(&p, &g[gno2].p[setno2], sizeof(plotarr)); memcpy(&g[gno2].p[setno2], &g[gno1].p[setno1], sizeof(plotarr)); memcpy(&g[gno1].p[setno1], &p, sizeof(plotarr)); set_dirtystate(); return RETURN_SUCCESS; } /* * kill a set */ void killset(int gno, int setno) { if (is_valid_setno(gno, setno)) { killsetdata(gno, setno); set_default_plotarr(&g[gno].p[setno]); } } double *getcol(int gno, int setno, int col) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].data.ex[col]; } else { return NULL; } } void setcol(int gno, int setno, int col, double *x, int len) { if (is_valid_setno(gno, setno) != TRUE) { return; } g[gno].p[setno].data.ex[col] = x; g[gno].p[setno].data.len = len; set_dirtystate(); } char **get_set_strings(int gno, int setno) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].data.s; } else { return NULL; } } int set_set_strings(int gno, int setno, int len, char **s) { if (is_valid_setno(gno, setno) && len > 0 && s!= NULL) { g[gno].p[setno].data.s = s; g[gno].p[setno].data.len = len; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int getsetlength(int gno, int setno) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].data.len; } else { return -1; } } int setcomment(int gno, int setno, char *s) { if (is_valid_setno(gno, setno) && s != NULL) { strncpy(g[gno].p[setno].comments, s, MAX_STRING_LENGTH - 1); set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } char *getcomment(int gno, int setno) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].comments; } else { return NULL; } } int set_legend_string(int gno, int setno, char *s) { if (is_valid_setno(gno, setno) && s != NULL) { strncpy(g[gno].p[setno].lstr, s, MAX_STRING_LENGTH - 1); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } char *get_legend_string(int gno, int setno) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].lstr; } else { return NULL; } } int set_dataset_type(int gno, int setno, int type) { int old_type = dataset_type(gno, setno); if (old_type < 0) { /* wrong gno/setno */ return RETURN_FAILURE; } else if (old_type == type) { /* nothing changed */ return RETURN_SUCCESS; } else { int i, len, ncols_old, ncols_new; len = getsetlength(gno, setno); ncols_old = dataset_cols(gno, setno); ncols_new = settype_cols(type); for (i = ncols_old; i < ncols_new; i++) { g[gno].p[setno].data.ex[i] = xcalloc(len, SIZEOF_DOUBLE); } for (i = ncols_new; i < ncols_old; i++) { XCFREE(g[gno].p[setno].data.ex[i]); } g[gno].p[setno].type = type; set_dirtystate(); return RETURN_SUCCESS; } } int dataset_type(int gno, int setno) { if (is_valid_setno(gno, setno)) { return g[gno].p[setno].type; } else { return -1; } } void set_hotlink(int gno, int setno, int onoroff, char *fname, int src) { if (is_valid_setno(gno, setno) != TRUE) { return; } g[gno].p[setno].hotlink = onoroff; if (onoroff && fname != NULL) { strcpy(g[gno].p[setno].hotfile, fname); g[gno].p[setno].hotsrc = src; } set_dirtystate(); } int is_hotlinked(int gno, int setno) { if (is_valid_setno(gno, setno) != TRUE) { return FALSE; } if (g[gno].p[setno].hotlink && strlen(g[gno].p[setno].hotfile)) { return g[gno].p[setno].hotlink; } else { return FALSE; } } char *get_hotlink_file(int gno, int setno) { if (is_valid_setno(gno, setno) != TRUE) { return NULL; } else { return g[gno].p[setno].hotfile; } } int get_hotlink_src(int gno, int setno) { if (is_valid_setno(gno, setno) != TRUE) { return -1; } else { return g[gno].p[setno].hotsrc; } } void do_update_hotlink(int gno, int setno) { if (is_hotlinked(gno, setno) != TRUE) { return; } else { plotarr *p; p = &g[gno].p[setno]; update_set_from_file(gno, setno, p->hotfile, p->hotsrc); } } /* * get the min/max fields of a set */ int getsetminmax(int gno, int setno, double *xmin, double *xmax, double *ymin, double *ymax) { double *x, *y; int len; double x1, x2, y1, y2; int i, first = TRUE; int imin, imax; /* dummy */ if (setno == ALL_SETS) { for (i = 0; i < number_of_sets(gno); i++) { if (is_set_drawable(gno, i)) { x = getcol(gno, i, 0); y = getcol(gno, i, 1); len = getsetlength(gno, i); minmax(x, len, &x1, &x2, &imin, &imax); minmax(y, len, &y1, &y2, &imin, &imax); if (first) { *xmin = x1; *xmax = x2; *ymin = y1; *ymax = y2; first = FALSE; } else { *xmin = (x1 < *xmin) ? x1 : *xmin; *xmax = (x2 > *xmax) ? x2 : *xmax; *ymin = (y1 < *ymin) ? y1 : *ymin; *ymax = (y2 > *ymax) ? y2 : *ymax; } } } } else if (is_valid_setno(gno, setno)) { x = getcol(gno, setno, 0); y = getcol(gno, setno, 1); len = getsetlength(gno, setno); minmax(x, len, xmin, xmax, &imin, &imax); minmax(y, len, ymin, ymax, &imin, &imax); first = FALSE; } if (first == FALSE) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* * get the min/max fields of a set with fixed x/y range */ int getsetminmax_c(int gno, int setno, double *xmin, double *xmax, double *ymin, double *ymax, int ivec) { double vmin_t, vmax_t, *vmin, *vmax, bvmin, bvmax, *vec, *bvec; int i, start, stop, n; int first = TRUE, hits; if (ivec == 1) { bvmin = *xmin; bvmax = *xmax; vmin = ymin; vmax = ymax; } else { bvmin = *ymin; bvmax = *ymax; vmin = xmin; vmax = xmax; } if (setno == ALL_SETS) { start = 0; stop = number_of_sets(gno) - 1; } else if (is_valid_setno(gno, setno)) { start = setno; stop = setno; } else { return RETURN_FAILURE; } for (i = start; i <= stop; i++) { if (is_set_drawable(gno, i)) { if (ivec == 1) { bvec = getx(gno, i); vec = gety(gno, i); } else { bvec = gety(gno, i); vec = getx(gno, i); } n = getsetlength(gno, i); hits = minmaxrange(bvec, vec, n, bvmin, bvmax, &vmin_t, &vmax_t); if (hits == RETURN_SUCCESS) { if (first) { *vmin = vmin_t; *vmax = vmax_t; first = FALSE; } else { *vmin = MIN2(vmin_t, *vmin); *vmax = MAX2(vmax_t, *vmax); } } } } if (first == FALSE) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* * compute the mins and maxes of a vector x */ void minmax(double *x, int n, double *xmin, double *xmax, int *imin, int *imax) { int i; *imin = 0; *imax = 0; if (x == NULL) { *xmin = 0.0; *xmax = 0.0; return; } *xmin = x[0]; *xmax = x[0]; for (i = 1; i < n; i++) { if (x[i] < *xmin) { *xmin = x[i]; *imin = i; } if (x[i] > *xmax) { *xmax = x[i]; *imax = i; } } } /* * compute the min and max of vector vec calculated for indices such that * bvec values lie within [bmin, bmax] range * returns RETURN_FAILURE if none found */ int minmaxrange(double *bvec, double *vec, int n, double bvmin, double bvmax, double *vmin, double *vmax) { int i, first = TRUE; if ((vec == NULL) || (bvec == NULL)) { return RETURN_FAILURE; } for (i = 0; i < n; i++) { if ((bvec[i] >= bvmin) && (bvec[i] <= bvmax)) { if (first == TRUE) { *vmin = vec[i]; *vmax = vec[i]; first = FALSE; } else { if (vec[i] < *vmin) { *vmin = vec[i]; } else if (vec[i] > *vmax) { *vmax = vec[i]; } } } } if (first == FALSE) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* * compute the mins and maxes of a vector x */ double vmin(double *x, int n) { int i; double xmin; if (n <= 0) { return 0.0; } xmin = x[0]; for (i = 1; i < n; i++) { if (x[i] < xmin) { xmin = x[i]; } } return xmin; } double vmax(double *x, int n) { int i; double xmax; if (n <= 0) { return 0.0; } xmax = x[0]; for (i = 1; i < n; i++) { if (x[i] > xmax) { xmax = x[i]; } } return xmax; } int set_point(int gno, int setno, int seti, WPoint wp) { if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } if (seti >= getsetlength(gno, setno) || seti < 0) { return RETURN_FAILURE; } (getcol(gno, setno, DATA_X))[seti] = wp.x; (getcol(gno, setno, DATA_Y))[seti] = wp.y; set_dirtystate(); return RETURN_SUCCESS; } int get_point(int gno, int setno, int seti, WPoint *wp) { if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } if (seti >= getsetlength(gno, setno) || seti < 0) { return RETURN_FAILURE; } wp->x = (getcol(gno, setno, DATA_X))[seti]; wp->y = (getcol(gno, setno, DATA_Y))[seti]; return RETURN_SUCCESS; } void copycol2(int gfrom, int setfrom, int gto, int setto, int col) { int i, n1, n2; double *x1, *x2; if (is_valid_setno(gfrom, setfrom) != TRUE || is_valid_setno(gto, setto) != TRUE) { return; } n1 = getsetlength(gfrom, setfrom); n2 = getsetlength(gto, setto); if (n1 != n2) { return; } x1 = getcol(gfrom, setfrom, col); x2 = getcol(gto, setto, col); for (i = 0; i < n1; i++) { x2[i] = x1[i]; } set_dirtystate(); } int pushset(int gno, int setno, int push_type) { int i, newsetno; if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } else { switch (push_type) { case PUSH_SET_TOFRONT: newsetno = number_of_sets(gno) - 1; for (i = setno; i < newsetno; i++) { if (swapset(gno, i, gno, i + 1) != RETURN_SUCCESS) { return RETURN_FAILURE; } } break; case PUSH_SET_TOBACK: newsetno = 0; for (i = setno; i > newsetno; i--) { if (swapset(gno, i, gno, i - 1) != RETURN_SUCCESS) { return RETURN_FAILURE; } } break; default: return RETURN_FAILURE; break; } return RETURN_SUCCESS; } } /* * pack all sets leaving no gaps in the set structure */ void packsets(int gno) { int i, j; for (i = 0; i < number_of_sets(gno); i++) { if (is_set_active(gno, i)) { for (j = 0; j < i; j++) { if (is_set_active(gno, j) != TRUE) { moveset(gno, i, gno, j); } } } } } int allocate_set(int gno, int setno) { if (is_valid_setno(gno, setno)) { return RETURN_SUCCESS; } else if (setno >= 0) { return realloc_graph_plots(gno, setno + 1); } else { return RETURN_FAILURE; } } int activateset(int gno, int setno) { int retval; if (is_valid_gno(gno) != TRUE) { return RETURN_FAILURE; } else { retval = allocate_set(gno, setno); if (retval == RETURN_SUCCESS) { set_set_hidden(gno, setno, FALSE); } return retval; } } static target recent_target = {-1, -1}; int get_recent_setno(void) { return recent_target.setno; } int get_recent_gno(void) { return recent_target.gno; } /* * return the next available set in graph gno * If target is allocated but with no data, choose it (used for loading sets * from project files when sets aren't packed) */ int nextset(int gno) { int setno; int maxplot; if (is_valid_gno(gno) != TRUE) { return (-1); } if ( (target_set.gno == gno) && is_valid_setno(target_set.gno, target_set.setno) && !is_set_active(gno, target_set.setno)) { setno = target_set.setno; target_set.gno = -1; target_set.setno = -1; } else { maxplot = number_of_sets(gno); for (setno = 0; setno < maxplot; setno++) { if (!is_set_active(gno, setno)) { break; } } /* if no sets found, try allocating new one */ if (setno == maxplot && allocate_set(gno, setno) != RETURN_SUCCESS) { return (-1); } } recent_target.gno = gno; recent_target.setno = setno; return (setno); } int is_set_active(int gno, int setno) { if (is_valid_setno(gno, setno) && getsetlength(gno, setno) > 0) { return TRUE; } else { return FALSE; } } /* * return number of active set(s) in gno */ int number_of_active_sets(int gno) { int setno, na; if (is_valid_gno(gno) != TRUE) { return -1; } na = 0; for (setno = 0; setno < number_of_sets(gno); setno++) { if (is_set_active(gno, setno) == TRUE) { na++; } } return na; } /* * drop points from a set */ void droppoints(int gno, int setno, int startno, int endno) { double *x; char **s; int i, j, len, ncols, dist; if (is_valid_setno(gno, setno) != TRUE) { return; } dist = endno - startno + 1; if (dist <= 0) { return; } len = getsetlength(gno, setno); if (dist == len) { killsetdata(gno, setno); return; } ncols = dataset_cols(gno, setno); for (j = 0; j < ncols; j++) { x = getcol(gno, setno, j); for (i = endno + 1; i < len; i++) { x[i - dist] = x[i]; } } if ((s = get_set_strings(gno, setno)) != NULL) { for (i = endno + 1; i < len; i++) { s[i - dist] = copy_string(s[i - dist], s[i]); } } setlength(gno, setno, len - dist); } /* * join several sets together; all but the first set in the list will be killed */ int join_sets(int gno, int *sets, int nsets) { int i, j, n, setno, setno_final, ncols, old_length, new_length; double *x1, *x2; char **s1, **s2; if (nsets < 2) { errmsg("nsets < 2"); return RETURN_FAILURE; } setno_final = sets[0]; ncols = dataset_cols(gno, setno_final); for (i = 0; i < nsets; i++) { setno = sets[i]; if (is_valid_setno(gno, setno) != TRUE) { errmsg("Invalid setno in the list"); return RETURN_FAILURE; } if (dataset_cols(gno, setno) != ncols) { errmsg("Can't join datasets with different number of cols"); return RETURN_FAILURE; } } new_length = getsetlength(gno, setno_final); for (i = 1; i < nsets; i++) { setno = sets[i]; old_length = new_length; new_length += getsetlength(gno, setno); if (setlength(gno, setno_final, new_length) != RETURN_SUCCESS) { return RETURN_FAILURE; } for (j = 0; j < ncols; j++) { x1 = getcol(gno, setno_final, j); x2 = getcol(gno, setno, j); for (n = old_length; n < new_length; n++) { x1[n] = x2[n - old_length]; } } s1 = get_set_strings(gno, setno_final); s2 = get_set_strings(gno, setno); if (s1 != NULL && s2 != NULL) { for (n = old_length; n < new_length; n++) { s1[n] = copy_string(s1[n], s2[n - old_length]); } } killset(gno, setno); } return RETURN_SUCCESS; } void reverse_set(int gno, int setno) { int n, i, j, k, ncols; double *x; char **s; if (!is_valid_setno(gno, setno)) { return; } n = getsetlength(gno, setno); ncols = dataset_cols(gno, setno); for (k = 0; k < ncols; k++) { x = getcol(gno, setno, k); for (i = 0; i < n / 2; i++) { j = (n - 1) - i; fswap(&x[i], &x[j]); } } if ((s = get_set_strings(gno, setno)) != NULL) { char *stmp; for (i = 0; i < n / 2; i++) { j = (n - 1) - i; stmp = s[i]; s[i] = s[j]; s[j] = stmp; } } set_dirtystate(); } /* * sort a set */ static double *vptr; /* * for ascending and descending sorts */ static int compare_points1(const void *p1, const void *p2) { const int *i1, *i2; double a, b; i1 = (const int *)p1; i2 = (const int *)p2; a = vptr[*i1]; b = vptr[*i2]; if (a < b) { return -1; } if (a > b) { return 1; } return 0; } static int compare_points2(const void *p1, const void *p2) { const int *i1, *i2; double a, b; i1 = (const int *)p1; i2 = (const int *)p2; a = vptr[*i1]; b = vptr[*i2]; if (a > b) { return -1; } if (a < b) { return 1; } return 0; } void sortset(int gno, int setno, int sorton, int stype) { int i, j, nc, len, *ind; double *x, *xtmp; char **s, **stmp; /* get the vector to sort on */ vptr = getcol(gno, setno, sorton); if (vptr == NULL) { errmsg("NULL vector in sort, operation cancelled, check set type"); return; } len = getsetlength(gno, setno); if (len <= 1) { return; } /* allocate memory for permuted indices */ ind = xmalloc(len*SIZEOF_INT); if (ind == NULL) { return; } /* allocate memory for temporary array */ xtmp = xmalloc(len*SIZEOF_DOUBLE); if (xtmp == NULL) { xfree(ind); return; } s = get_set_strings(gno, setno); if (s != NULL) { stmp = xmalloc(len*sizeof(char *)); if (stmp == NULL) { xfree(xtmp); xfree(ind); } } else { stmp = NULL; } /* initialize indices */ for (i = 0; i < len; i++) { ind[i] = i; } /* sort */ qsort(ind, len, SIZEOF_INT, stype ? compare_points2 : compare_points1); /* straighten things out - done one vector at a time for storage */ nc = dataset_cols(gno, setno); /* loop over the number of columns */ for (j = 0; j < nc; j++) { /* get this vector and put into the temporary vector in the right order */ x = getcol(gno, setno, j); for (i = 0; i < len; i++) { xtmp[i] = x[ind[i]]; } /* load it back to the set */ for (i = 0; i < len; i++) { x[i] = xtmp[i]; } } /* same with strings, if any */ if (s != NULL) { for (i = 0; i < len; i++) { stmp[i] = s[ind[i]]; } for (i = 0; i < len; i++) { s[i] = stmp[i]; } } /* free allocated temporary arrays */ xfree(stmp); xfree(xtmp); xfree(ind); set_dirtystate(); } /* * sort two arrays */ void sort_xy(double *tmp1, double *tmp2, int up, int sorton, int stype) { int d, i, j; int lo = 0; double t1, t2; if (sorton == 1) { double *ttmp; ttmp = tmp1; tmp1 = tmp2; tmp2 = ttmp; } up--; for (d = up - lo + 1; d > 1;) { if (d < 5) d = 1; else d = (5 * d - 1) / 11; for (i = up - d; i >= lo; i--) { t1 = tmp1[i]; t2 = tmp2[i]; if (!stype) { for (j = i + d; j <= up && (t1 > tmp1[j]); j += d) { tmp1[j - d] = tmp1[j]; tmp2[j - d] = tmp2[j]; } tmp1[j - d] = t1; tmp2[j - d] = t2; } else { for (j = i + d; j <= up && (t1 < tmp1[j]); j += d) { tmp1[j - d] = tmp1[j]; tmp2[j - d] = tmp2[j]; } tmp1[j - d] = t1; tmp2[j - d] = t2; } } } set_dirtystate(); } /* * delete the point pt in setno */ void del_point(int gno, int setno, int pt) { droppoints(gno, setno, pt, pt); } /* * add a point to setno */ void add_point(int gno, int setno, double px, double py) { int len; double *x, *y; if (is_valid_setno(gno, setno)) { len = getsetlength(gno, setno); setlength(gno, setno, len + 1); x = getx(gno, setno); y = gety(gno, setno); x[len] = px; y[len] = py; } } void zero_datapoint(Datapoint *dpoint) { int k; for (k = 0; k < MAX_SET_COLS; k++) { dpoint->ex[k] = 0.0; } dpoint->s = NULL; } /* * add a point to setno at ind */ int add_point_at(int gno, int setno, int ind, const Datapoint *dpoint) { int len, col, ncols; double *ex; char **s; if (is_valid_setno(gno, setno)) { len = getsetlength(gno, setno); if (ind < 0 || ind > len) { return RETURN_FAILURE; } len++; setlength(gno, setno, len); ncols = dataset_cols(gno, setno); for (col = 0; col < ncols; col++) { ex = getcol(gno, setno, col); if (ind < len - 1) { memmove(ex + ind + 1, ex + ind, (len - ind - 1)*SIZEOF_DOUBLE); } ex[ind] = dpoint->ex[col]; } s = get_set_strings(gno, setno); if (s != NULL) { if (ind < len - 1) { memmove(s + ind + 1, s + ind, (len - ind - 1)*sizeof(char *)); } s[ind] = copy_string(NULL, dpoint->s); } set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_datapoint(int gno, int setno, int ind, int *ncols, Datapoint *dpoint) { int n, col; double *ex; char **s; n = getsetlength(gno, setno); if (ind < 0 || ind >= n) { return RETURN_FAILURE; } else { *ncols = dataset_cols(gno, setno); for (col = 0; col < *ncols; col++) { ex = getcol(gno, setno, col); dpoint->ex[col] = ex[ind]; } s = get_set_strings(gno, setno); if (s != NULL) { dpoint->s = s[ind]; } else { dpoint->s = NULL; } return RETURN_SUCCESS; } } void delete_byindex(int gno, int setno, int *ind) { int i, j, cnt = 0; int ncols = dataset_cols(gno, setno); if (is_valid_setno(gno, setno) != TRUE) { return; } for (i = 0; i < getsetlength(gno, setno); i++) { if (ind[i]) { cnt++; } } if (cnt == getsetlength(gno, setno)) { killset(gno, setno); return; } cnt = 0; for (i = 0; i < getsetlength(gno, setno); i++) { if (ind[i] == 0) { for (j = 0; j < ncols; j++) { (getcol(gno, setno, j))[cnt] = (getcol(gno, setno, j))[i]; } cnt++; } } setlength(gno, setno, cnt); } /* * move a set to another set, in possibly another graph */ int do_moveset(int gfrom, int setfrom, int gto, int setto) { int retval; char buf[64]; retval = moveset(gfrom, setfrom, gto, setto); if (retval != RETURN_SUCCESS) { sprintf(buf, "Error moving G%d.S%d to G%d.S%d", gfrom, setfrom, gto, setto); errmsg(buf); } return retval; } /* * do_copyset */ int do_copyset(int gfrom, int setfrom, int gto, int setto) { int retval; char buf[64]; retval = copyset(gfrom, setfrom, gto, setto); if (retval != RETURN_SUCCESS) { sprintf(buf, "Error copying G%d.S%d to G%d.S%d", gfrom, setfrom, gto, setto); errmsg(buf); } return retval; } /* * do_swapset */ int do_swapset(int gfrom, int setfrom, int gto, int setto) { int retval; char buf[64]; retval = swapset(gfrom, setfrom, gto, setto); if (retval != RETURN_SUCCESS) { sprintf(buf, "Error swapping G%d.S%d with G%d.S%d", gfrom, setfrom, gto, setto); errmsg(buf); } return retval; } /* * split a set into lpart length sets */ void do_splitsets(int gno, int setno, int lpart) { int i, j, k, ncols, len, plen, tmpset, npsets; double *x; char s[256]; plotarr p; Dataset ds, dstmp; if ((len = getsetlength(gno, setno)) < 2) { errmsg("Set length < 2"); return; } if (lpart >= len) { errmsg("Split length >= set length"); return; } if (lpart <= 0) { errmsg("Split length <= 0"); return; } npsets = (len - 1)/lpart + 1; /* get number of columns in this set */ ncols = dataset_cols(gno, setno); p = g[gno].p[setno]; /* save the contents to a temporary buffer */ memcpy(&ds, &p.data, sizeof(Dataset)); /* zero data contents of the original set */ zero_set_data(&g[gno].p[setno].data); /* now load each set */ for (i = 0; i < npsets; i++) { plen = MIN2(lpart, len - i*lpart); tmpset = nextset(gno); if (!is_valid_setno(gno, tmpset)) { errmsg("Can't create new set"); return; } /* set the plot parameters */ dstmp = g[gno].p[tmpset].data; g[gno].p[tmpset] = p; g[gno].p[tmpset].data = dstmp; set_set_hidden(gno, tmpset, FALSE); if (setlength(gno, tmpset, plen) != RETURN_SUCCESS) { /* should not happen */ return; } if (ds.s) { g[gno].p[tmpset].data.s = xmalloc(plen*sizeof(char *)); } /* load the data into each column */ for (k = 0; k < ncols; k++) { x = getcol(gno, tmpset, k); for (j = 0; j < plen; j++) { x[j] = ds.ex[k][i*lpart + j]; } } if (ds.s) { for (j = 0; j < plen; j++) { g[gno].p[tmpset].data.s[j] = copy_string(NULL, ds.s[i*lpart + j]); } } sprintf(s, "partition %d of set G%d.S%d", i + 1, gno, setno); setcomment(gno, tmpset, s); } free_set_data(&ds); } /* * drop points from an active set */ void do_drop_points(int gno, int setno, int startno, int endno) { int setlength; char buf[256]; if (!is_set_active(gno, setno)) { sprintf(buf, "Set %d not active", setno); errmsg(buf); return; } setlength = getsetlength(gno, setno); if (startno < 0) { startno = setlength + 1 + startno; } if (endno < 0) { endno = setlength + 1 + endno; } if (startno > endno) { iswap(&startno, &endno); } if (startno < 0) { errmsg("Start # < 0"); return; } if (endno >= setlength) { errmsg("Ending # >= set length"); return; } droppoints(gno, setno, startno, endno); } /* * sort sets, only works on sets of type XY */ void do_sort(int setno, int sorton, int stype) { int i, gno = get_cg(); char buf[256]; if (setno == -1) { for (i = 0; i < number_of_sets(gno); i++) { if (is_set_active(gno, i)) { sortset(gno, i, sorton, stype); } } } else { if (!is_set_active(gno, setno)) { sprintf(buf, "Set %d not active", setno); errmsg(buf); return; } else { sortset(gno, setno, sorton, stype); } } } double setybase(int gno, int setno) { double dummy, *y, ybase = 0.0; int len; if (is_valid_setno(gno, setno) != TRUE) { return 0.0; } y = getcol(gno, setno, DATA_Y); len = getsetlength(gno, setno); switch (g[gno].p[setno].baseline_type) { case BASELINE_TYPE_0: ybase = 0.0; break; case BASELINE_TYPE_SMIN: ybase = vmin(y, len); break; case BASELINE_TYPE_SAVG: stasum(y, len, &ybase, &dummy); break; case BASELINE_TYPE_SMAX: ybase = vmax(y, len); break; case BASELINE_TYPE_GMIN: ybase = g[gno].w.yg1; break; case BASELINE_TYPE_GMAX: ybase = g[gno].w.yg2; break; default: errmsg("Wrong type of baseline"); } return(ybase); } int dataset_cols(int gno, int setno) { return settype_cols(dataset_type(gno, setno)); } int load_comments_to_legend(int gno, int setno) { return set_legend_string(gno, setno, getcomment(gno, setno)); } int filter_set(int gno, int setno, char *rarray) { int i, ip, j, ncols; Dataset *dsp; if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } if (rarray == NULL) { return RETURN_SUCCESS; } ncols = dataset_cols(gno, setno); dsp = &(g[gno].p[setno].data); ip = 0; for (i = 0; i < dsp->len; i++) { if (rarray[i]) { for (j = 0; j < ncols; j++) { dsp->ex[j][ip] = dsp->ex[j][i]; } if (dsp->s != NULL) { dsp->s[ip] = copy_string(dsp->s[ip], dsp->s[i]); } ip++; } } setlength(gno, setno, ip); return RETURN_SUCCESS; } grace-5.1.23/src/drawticks.c0000644000076500001440000006553010564426001015365 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2007 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Draw axis bars, axis labels, ticks and tick labels */ #include #include #include #include #include #include "globals.h" #include "utils.h" #include "graphs.h" #include "graphutils.h" #include "draw.h" #include "parser.h" #include "protos.h" int is_xaxis(int axis) { return ((axis % 2 == 0)); } int is_yaxis(int axis) { return ((axis % 2 == 1)); } int is_log_axis(int gno, int axis) { if ((is_xaxis(axis) && islogx(gno)) || (is_yaxis(axis) && islogy(gno))) { return TRUE; } else { return FALSE; } } int is_logit_axis(int gno, int axis) { if ((is_xaxis(axis) && islogitx(gno)) || (is_yaxis(axis) && islogity(gno))) { return TRUE; } else { return FALSE; } } void drawgrid(int gno) { int caxis; tickmarks *t; tickprops tprops; int ttype; world w; view v; double wtpos; WPoint wp_grid_start = {0.0, 0.0}, wp_grid_stop = {0.0, 0.0}; VPoint vp_grid_start, vp_grid_stop; VPoint vpc, vp1, vp2; double phi_start, phi_stop, rho; double wc_start, wc_stop; /* world coordinates */ int ittype_loop, itick; setclipping(TRUE); /* TODO: add Pen to ticks and remove the following */ setpattern(1); get_graph_viewport(gno, &v); get_graph_world(gno, &w); /* graph center; for polar plots */ vpc.x = (v.xv1 + v.xv2)/2.0; vpc.y = (v.yv1 + v.yv2)/2.0; for (caxis = 0; caxis < MAXAXES; caxis++) { t = get_graph_tickmarks(gno, caxis); if (!t || t->active != TRUE) { continue; } if (is_xaxis(caxis)) { /* an X-axis */ wc_start = w.xg1; wc_stop = w.xg2; wp_grid_start.y = w.yg1; wp_grid_stop.y = w.yg2; } else { /* a Y-axis */ wc_start = w.yg1; wc_stop = w.yg2; wp_grid_start.x = w.xg1; wp_grid_stop.x = w.xg2; } for (ittype_loop = 0; ittype_loop < 2; ittype_loop++) { if (ittype_loop == 0) { /* minor ticks */ ttype = TICK_TYPE_MINOR; tprops = t->mprops; } else { /* major ticks */ ttype = TICK_TYPE_MAJOR; tprops = t->props; } if (tprops.gridflag == 0) { continue; } setcolor(tprops.color); setlinewidth(tprops.linew); setlinestyle(tprops.lines); for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type != ttype) { continue; } wtpos = t->tloc[itick].wtpos; if ((wtpos < wc_start) || (wtpos > wc_stop)) { continue; } if (is_xaxis(caxis)) { /* an X-axis */ wp_grid_start.x = wtpos; wp_grid_stop.x = wtpos; } else { /* a Y-axis */ wp_grid_start.y = wtpos; wp_grid_stop.y = wtpos; } vp_grid_start = Wpoint2Vpoint(wp_grid_start); vp_grid_stop = Wpoint2Vpoint(wp_grid_stop); if (!is_xaxis(caxis) && get_graph_type(gno) == GRAPH_POLAR) { xy2polar(vp_grid_start.x - vpc.x, vp_grid_start.y - vpc.y, &phi_start, &rho); xy2polar(vp_grid_stop.x - vpc.x, vp_grid_stop.y - vpc.y, &phi_stop, &rho); vp1.x = vpc.x - rho; vp1.y = vpc.y + rho; vp2.x = vpc.x + rho; vp2.y = vpc.y - rho; if (is_graph_xinvert(gno) == TRUE) { fswap(&phi_start, &phi_stop); } if (phi_stop < phi_start) { phi_stop += 2*M_PI; } DrawArc(vp1, vp2, (int) rint(180.0/M_PI*phi_start), (int) rint(180.0/M_PI*phi_stop)); } else { DrawLine(vp_grid_start, vp_grid_stop); } } } } } void drawaxes(int gno) { int caxis; tickmarks *t; tickprops tprops; world w; view v, bb; double vbase1, vbase2, vbase1_start, vbase1_stop, vbase2_start, vbase2_stop; double vbase_tlabel, vbase_tlabel1, vbase_tlabel2; double tsize, tlsize, wtpos, vtpos; double tl_offset, tl_trans; WPoint wp1_start, wp1_stop, wp2_start, wp2_stop; VPoint vp1_start, vp1_stop, vp2_start, vp2_stop; VPoint vp_tick1_start, vp_tick1_stop, vp_tick2_start, vp_tick2_stop; VPoint vp_tlabel, vp_label, vp_label_offset1, vp_label_offset2; VPoint vpc, vp1, vp2; double phi_start, phi_stop, rho; VVector ort_para, ort_perp; double wc_start, wc_stop, wc_start_labels, wc_stop_labels; /* world coordinates */ int ittype_loop, itick, itcur; int ttype; char tlabel[MAX_STRING_LENGTH]; int tlabel1_just, tlabel2_just, label1_just, label2_just; int langle; int tick_dir_sign; double (*coord_conv) (); setclipping(FALSE); /* TODO: add Pen to ticks and remove the following */ setpattern(1); get_graph_viewport(gno, &v); get_graph_world(gno, &w); /* graph center; for polar plots */ vpc.x = (v.xv1 + v.xv2)/2.0; vpc.y = (v.yv1 + v.yv2)/2.0; for (caxis = 0; caxis < MAXAXES; caxis++) { t = get_graph_tickmarks(gno, caxis); if (!t || t->active != TRUE) { continue; } if (t->zero == FALSE) { tick_dir_sign = +1; } else { tick_dir_sign = -1; } if (is_xaxis(caxis)) { /* an X-axis */ ort_para.x = 1.0; ort_para.y = 0.0; ort_perp.x = 0.0; ort_perp.y = 1.0; coord_conv = xy_xconv; wc_start = w.xg1; wc_stop = w.xg2; wp1_start.x = w.xg1; wp1_stop.x = w.xg2; wp2_start.x = w.xg1; wp2_stop.x = w.xg2; if (t->zero == TRUE) { if (w.yg1 <= 0.0 && w.yg2 >= 0.0) { wp1_start.y = 0.0; wp1_stop.y = 0.0; wp2_start.y = 0.0; wp2_stop.y = 0.0; } else { continue; } } else { wp1_start.y = w.yg1; wp1_stop.y = w.yg1; wp2_start.y = w.yg2; wp2_stop.y = w.yg2; } vp1_start = Wpoint2Vpoint(wp1_start); vp1_stop = Wpoint2Vpoint(wp1_stop); vp2_start = Wpoint2Vpoint(wp2_start); vp2_stop = Wpoint2Vpoint(wp2_stop); if (is_graph_yinvert(gno) == TRUE) { vpswap(&vp1_start, &vp2_start); vpswap(&vp1_stop, &vp2_stop); } /* TODO axis offset for polar plots */ if (get_graph_type(gno) != GRAPH_POLAR) { vp1_start.y -= t->offsx; vp1_stop.y -= t->offsx; vp2_start.y += t->offsy; vp2_stop.y += t->offsy; } vbase1 = vp1_start.y; vbase2 = vp2_start.y; tlabel1_just = JUST_CENTER|JUST_TOP; tlabel2_just = JUST_CENTER|JUST_BOTTOM; switch (t->label_layout) { case LAYOUT_PARALLEL: langle = 0; break; case LAYOUT_PERPENDICULAR: langle = 90; break; default: errmsg("Internal error in drawaxes()"); return; } } else { /* a Y-axis */ ort_para.x = 0.0; ort_para.y = 1.0; ort_perp.x = 1.0; ort_perp.y = 0.0; coord_conv = xy_yconv; wc_start = w.yg1; wc_stop = w.yg2; wp1_start.y = w.yg1; wp1_stop.y = w.yg2; wp2_start.y = w.yg1; wp2_stop.y = w.yg2; if (t->zero == TRUE) { if (w.xg1 <= 0.0 && w.xg2 >= 0.0) { wp1_start.x = 0.0; wp1_stop.x = 0.0; wp2_start.x = 0.0; wp2_stop.x = 0.0; } else { continue; } } else { wp1_start.x = w.xg1; wp1_stop.x = w.xg1; wp2_start.x = w.xg2; wp2_stop.x = w.xg2; } vp1_start = Wpoint2Vpoint(wp1_start); vp1_stop = Wpoint2Vpoint(wp1_stop); vp2_start = Wpoint2Vpoint(wp2_start); vp2_stop = Wpoint2Vpoint(wp2_stop); if (is_graph_xinvert(gno) == TRUE) { vpswap(&vp1_start, &vp2_start); vpswap(&vp1_stop, &vp2_stop); } if (get_graph_type(gno) != GRAPH_POLAR) { vp1_start.x -= t->offsx; vp1_stop.x -= t->offsx; vp2_start.x += t->offsy; vp2_stop.x += t->offsy; } vbase1 = vp1_start.x; vbase2 = vp2_start.x; tlabel1_just = JUST_RIGHT|JUST_MIDDLE; tlabel2_just = JUST_LEFT|JUST_MIDDLE; switch (t->label_layout) { case LAYOUT_PARALLEL: langle = 90; break; case LAYOUT_PERPENDICULAR: langle = 0; break; default: errmsg("Internal error in drawaxes()"); return; } } /* Begin axis bar stuff */ if (t->t_drawbar) { setcolor(t->t_drawbarcolor); setlinewidth(t->t_drawbarlinew); setlinestyle(t->t_drawbarlines); if (t->t_op == PLACEMENT_NORMAL || t->t_op == PLACEMENT_BOTH) { if (is_xaxis(caxis) && get_graph_type(gno) == GRAPH_POLAR) { xy2polar(vp1_start.x - vpc.x, vp1_start.y - vpc.y, &phi_start, &rho); xy2polar(vp1_stop.x - vpc.x, vp1_stop.y - vpc.y, &phi_stop, &rho); vp1.x = vpc.x - rho; vp1.y = vpc.y + rho; vp2.x = vpc.x + rho; vp2.y = vpc.y - rho; if (is_graph_xinvert(gno) == TRUE) { fswap(&phi_start, &phi_stop); } if (phi_stop < phi_start) { phi_stop += 2*M_PI; } DrawArc(vp1, vp2, (int) rint(180.0/M_PI*phi_start), (int) rint(180.0/M_PI*phi_stop)); } else { DrawLine(vp1_start, vp1_stop); } } if (t->t_op == PLACEMENT_OPPOSITE || t->t_op == PLACEMENT_BOTH) { if (is_xaxis(caxis) && get_graph_type(gno) == GRAPH_POLAR) { xy2polar(vp2_start.x - vpc.x, vp2_start.y - vpc.y, &phi_start, &rho); xy2polar(vp2_stop.x - vpc.x, vp2_stop.y - vpc.y, &phi_stop, &rho); vp1.x = vpc.x - rho; vp1.y = vpc.y + rho; vp2.x = vpc.x + rho; vp2.y = vpc.y - rho; if (is_graph_xinvert(gno) == TRUE) { fswap(&phi_start, &phi_stop); } if (phi_stop < phi_start) { phi_stop += 2*M_PI; } DrawArc(vp1, vp2, (int) rint(180.0/M_PI*phi_start), (int) rint(180.0/M_PI*phi_stop)); } else { DrawLine(vp2_start, vp2_stop); } } } /* End axis bar stuff*/ /* TODO ticks, labels and axis labels for polar plots */ if (get_graph_type(gno) == GRAPH_POLAR) { continue; } activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); /* Begin axis tick stuff */ if (t->t_flag) { for (ittype_loop = 0; ittype_loop < 2; ittype_loop++) { if (ittype_loop == 0) { /* minor ticks */ ttype = TICK_TYPE_MINOR; tprops = t->mprops; } else { /* major ticks */ ttype = TICK_TYPE_MAJOR; tprops = t->props; } tsize = 0.02 * tprops.size; switch (t->t_inout) { case TICKS_IN: vbase1_start = vbase1; vbase1_stop = vbase1 + tick_dir_sign*tsize; vbase2_start = vbase2; vbase2_stop = vbase2 - tick_dir_sign*tsize; break; case TICKS_OUT: vbase1_start = vbase1; vbase1_stop = vbase1 - tick_dir_sign*tsize; vbase2_start = vbase2; vbase2_stop = vbase2 + tick_dir_sign*tsize; break; case TICKS_BOTH: vbase1_start = vbase1 - tsize; vbase1_stop = vbase1 + tsize; vbase2_start = vbase2 + tsize; vbase2_stop = vbase2 - tsize; break; default: errmsg("Internal error in drawaxes()"); return; } setcolor(tprops.color); setlinewidth(tprops.linew); setlinestyle(tprops.lines); itcur = 0; for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type != ttype) { continue; } wtpos = t->tloc[itick].wtpos; if ((wtpos < wc_start) || (wtpos > wc_stop)) { continue; } vtpos = coord_conv(wtpos); if (t->t_op == PLACEMENT_NORMAL || t->t_op == PLACEMENT_BOTH) { vp_tick1_start.x = vtpos*ort_para.x + vbase1_start*ort_perp.x; vp_tick1_start.y = vtpos*ort_para.y + vbase1_start*ort_perp.y; vp_tick1_stop.x = vtpos*ort_para.x + vbase1_stop*ort_perp.x; vp_tick1_stop.y = vtpos*ort_para.y + vbase1_stop*ort_perp.y; DrawLine(vp_tick1_start, vp_tick1_stop); } if (t->t_op == PLACEMENT_OPPOSITE || t->t_op == PLACEMENT_BOTH) { vp_tick2_start.x = vtpos*ort_para.x + vbase2_start*ort_perp.x; vp_tick2_start.y = vtpos*ort_para.y + vbase2_start*ort_perp.y; vp_tick2_stop.x = vtpos*ort_para.x + vbase2_stop*ort_perp.x; vp_tick2_stop.y = vtpos*ort_para.y + vbase2_stop*ort_perp.y; DrawLine(vp_tick2_start, vp_tick2_stop); } itcur++; } } } /* End axis ticks stuff */ /* Make sure we don't end up with an empty BBox if no ticks have been drawn */ vp1.x = v.xv1; vp1.y = v.yv1; vp2.x = v.xv2; vp2.y = v.yv2; update_bbox(BBOX_TYPE_TEMP, vp1); update_bbox(BBOX_TYPE_TEMP, vp2); /* Begin tick label stuff */ if(t->tl_gaptype==TYPE_AUTO) { /* hard coded offsets for autoplacement of tick labels */ tl_trans=0.0; /* parallel */ tl_offset=0.01; /* perpendicular */ } else{ tl_trans = t->tl_gap.x; tl_offset = t->tl_gap.y; } if (t->tl_flag) { if (t->tl_starttype == TYPE_SPEC) { wc_start_labels = t->tl_start; } else { wc_start_labels = wc_start; } if (t->tl_stoptype == TYPE_SPEC) { wc_stop_labels = t->tl_stop; } else { wc_stop_labels = wc_stop; } tlsize = 0.02 * t->tl_charsize; tsize = 0.02 * t->props.size; switch (t->t_inout) { case TICKS_IN: vbase_tlabel1 = vbase1 - (1 - tick_dir_sign)/2*tsize - tl_offset; vbase_tlabel2 = vbase2 + (1 - tick_dir_sign)/2*tsize + tl_offset; break; case TICKS_OUT: vbase_tlabel1 = vbase1 - (1 + tick_dir_sign)/2*tsize - tl_offset; vbase_tlabel2 = vbase2 + (1 + tick_dir_sign)/2*tsize + tl_offset; break; case TICKS_BOTH: vbase_tlabel1 = vbase1 - tsize - tl_offset; vbase_tlabel2 = vbase2 + tsize + tl_offset; break; default: errmsg("Internal error in drawaxes()"); return; } setfont(t->tl_font); setcharsize(t->tl_charsize); itcur = 0; for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type != TICK_TYPE_MAJOR) { continue; } wtpos = t->tloc[itick].wtpos; if ((wtpos < wc_start_labels) || (wtpos > wc_stop_labels)) { continue; } if (t->tl_prestr[0]) { strcpy(tlabel, t->tl_prestr); } else { tlabel[0] = '\0'; } if (t->tloc[itick].label != NULL) { strcat(tlabel, t->tloc[itick].label); } if (t->tl_appstr[0]) { strcat(tlabel, t->tl_appstr); } vtpos = coord_conv(wtpos); if (itcur % (t->tl_skip + 1) == 0) { /* Set color before each tick label, since pre/app strings may change it */ setcolor(t->tl_color); /* Tick labels on normal side */ if (t->tl_op == PLACEMENT_NORMAL || t->tl_op == PLACEMENT_BOTH) { vbase_tlabel = vbase_tlabel1 - (tl_offset + tlsize)* (itcur % (t->tl_staggered + 1)); vp_tlabel.x = (vtpos + tl_trans)*ort_para.x + vbase_tlabel*ort_perp.x; vp_tlabel.y = (vtpos + tl_trans)*ort_para.y + vbase_tlabel*ort_perp.y; WriteString(vp_tlabel, t->tl_angle, tlabel1_just, tlabel); } /* Tick labels on opposite side */ if (t->tl_op == PLACEMENT_OPPOSITE || t->tl_op == PLACEMENT_BOTH) { vbase_tlabel = vbase_tlabel2 + (tl_offset + tlsize)* (itcur % (t->tl_staggered + 1)); vp_tlabel.x = (vtpos + tl_trans)*ort_para.x + vbase_tlabel*ort_perp.x; vp_tlabel.y = (vtpos + tl_trans)*ort_para.y + vbase_tlabel*ort_perp.y; WriteString(vp_tlabel, t->tl_angle, tlabel2_just, tlabel); } } itcur++; } } /* End tick label stuff */ bb = get_bbox(BBOX_TYPE_TEMP); /* Begin axis label stuff */ if (t->label_place == TYPE_SPEC) { vp_label_offset1.x = t->label.x; vp_label_offset1.y = t->label.y; vp_label_offset2.x = t->label.x; vp_label_offset2.y = t->label.y; /* These settings are for backward compatibility */ label1_just = JUST_CENTER|JUST_MIDDLE; label2_just = JUST_CENTER|JUST_MIDDLE; } else { /* parallel is trivial ;-) */ vp_label_offset1.x = 0.00; vp_label_offset2.x = 0.00; /* perpendicular */ if (is_xaxis(caxis)) { vp_label_offset1.y = vbase1 - bb.yv1; vp_label_offset2.y = bb.yv2 - vbase2; } else { vp_label_offset1.y = vbase1 - bb.xv1; vp_label_offset2.y = bb.xv2 - vbase2; } vp_label_offset1.y += tl_offset; vp_label_offset2.y += tl_offset; label1_just = tlabel1_just; label2_just = tlabel2_just; } if (t->label.s && t->label.s[0]) { setcharsize(t->label.charsize); setfont(t->label.font); setcolor(t->label.color); /* Axis label on normal side */ if (t->label_op == PLACEMENT_NORMAL || t->label_op == PLACEMENT_BOTH) { vp_label.x = (vp1_start.x + vp1_stop.x)/2 + vp_label_offset1.x*ort_para.x - vp_label_offset1.y*ort_perp.x; vp_label.y = (vp1_start.y + vp1_stop.y)/2 + vp_label_offset1.x*ort_para.y - vp_label_offset1.y*ort_perp.y; WriteString(vp_label, langle, label1_just, t->label.s); } /* Axis label on opposite side */ if (t->label_op == PLACEMENT_OPPOSITE || t->label_op == PLACEMENT_BOTH) { vp_label.x = (vp2_start.x + vp2_stop.x)/2 + vp_label_offset2.x*ort_para.x + vp_label_offset2.y*ort_perp.x ; vp_label.y = (vp2_start.y + vp2_stop.y)/2 + vp_label_offset2.x*ort_para.y + vp_label_offset2.y*ort_perp.y ; WriteString(vp_label, langle, label2_just, t->label.s); } } /* End axis label stuff */ } } void calculate_tickgrid(int gno) { int caxis; int itick, imtick, itmaj; int nmajor; double swc_start, swc_stop, stmajor; int scale; double wtmaj; world w; tickmarks *t; int res, len; grarr *tvar; double *tt; reenter: get_graph_world(gno, &w); for (caxis = 0; caxis < MAXAXES; caxis++) { t = get_graph_tickmarks(gno, caxis); if (!t || t->active != TRUE) { continue; } if (t->t_spec == TICKS_SPEC_NONE) { if (is_xaxis(caxis)) { scale = get_graph_xscale(gno); if (scale == SCALE_LOG) { swc_start = fscale(w.xg1, scale); swc_stop = fscale(w.xg2, scale); } else { swc_start = w.xg1; swc_stop = w.xg2; } } else { scale = get_graph_yscale(gno); if (scale == SCALE_LOG) { swc_start = fscale(w.yg1, scale); swc_stop = fscale(w.yg2, scale); } else { swc_start = w.yg1; swc_stop = w.yg2; } } if (scale == SCALE_LOG) { stmajor = fscale(t->tmajor, scale); } else { stmajor = t->tmajor; } if (stmajor <= 0.0) { errmsg("Invalid major tick spacing, autoticking"); autotick_axis(gno, caxis); goto reenter; } if (t->t_round == TRUE) { swc_start = floor(swc_start/stmajor)*stmajor; } nmajor = (int) ceil((swc_stop - swc_start) / stmajor + 1); t->nticks = (nmajor - 1)*(t->nminor + 1) + 1; if (t->nticks > MAX_TICKS) { errmsg("Too many ticks ( > MAX_TICKS ), autoticking"); autotick_axis(gno, caxis); goto reenter; } /* * if (t->nticks > MAX_TICKS) { * t->nticks = MAX_TICKS; * } */ itick = 0; itmaj = 0; while (itick < t->nticks) { if (scale == SCALE_LOG) { wtmaj = ifscale(swc_start + itmaj*stmajor, scale); } else { wtmaj = swc_start + itmaj*stmajor; if (t->t_round == TRUE && fabs(wtmaj) < 1.0e-6*stmajor) { wtmaj = 0.0; } } t->tloc[itick].wtpos = wtmaj; t->tloc[itick].type = TICK_TYPE_MAJOR; itick++; for (imtick = 0; imtick < t->nminor && itick < t->nticks; imtick++) { if (scale == SCALE_LOG) { t->tloc[itick].wtpos = wtmaj * (imtick + 2); } else { t->tloc[itick].wtpos = wtmaj + (imtick + 1)*stmajor/(t->nminor + 1); } t->tloc[itick].type = TICK_TYPE_MINOR; XCFREE(t->tloc[itick].label); itick++; } itmaj++; } } if (t->t_spec != TICKS_SPEC_BOTH) { nmajor = 0; for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type == TICK_TYPE_MAJOR) { nmajor++; } } if (t->tl_formula && t->tl_formula[0] != '\0') { tvar = get_parser_arr_by_name("$t"); if (tvar == NULL) { tvar = define_parser_arr("$t"); if (tvar == NULL) { errmsg("Internal error"); return; } } if (tvar->length != 0) { xfree(tvar->data); tvar->length = 0; } tvar->data = xmalloc(nmajor*SIZEOF_DOUBLE); if (tvar->data == NULL) { return; } tvar->length = nmajor; itmaj = 0; for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type == TICK_TYPE_MAJOR) { tvar->data[itmaj] = t->tloc[itick].wtpos; itmaj++; } } res = v_scanner(t->tl_formula, &len, &tt); XCFREE(tvar->data); tvar->length = 0; if (res != RETURN_SUCCESS || len != nmajor) { errmsg("Error in tick transformation formula"); return; } itmaj = 0; for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type == TICK_TYPE_MAJOR) { t->tloc[itick].label = copy_string(t->tloc[itick].label, create_fstring(t->tl_format, t->tl_prec, tt[itmaj], LFORMAT_TYPE_EXTENDED)); itmaj++; } } xfree(tt); } else { for (itick = 0; itick < t->nticks; itick++) { if (t->tloc[itick].type == TICK_TYPE_MAJOR) { t->tloc[itick].label = copy_string(t->tloc[itick].label, create_fstring(t->tl_format, t->tl_prec, t->tloc[itick].wtpos, LFORMAT_TYPE_EXTENDED)); } } } } } } grace-5.1.23/src/humlik.c0000644000076500001440000001341711014400276014655 0ustar fnevgenyusers/* To calculate the Faddeeva function with relative error less than 10^(-4). (from http://www.atm.ox.ac.uk/user/wells/voigt.html) arguments: x, y - Faddeeva/Voigt function arguments return value -- voigt */ /* Translated to C++ with f2c program and modified by Marcin Wojdyr */ /* Minor adaptations from C++ to C by E. Stambulchik */ #include #include "defines.h" #include "noxprotos.h" float humlik(const float x, const float y) { static const float c[6] = { 1.0117281, -0.75197147, 0.012557727, 0.010022008, -2.4206814e-4, 5.0084806e-7 }; static const float s[6] = { 1.393237, 0.23115241, -0.15535147, 0.0062183662, 9.1908299e-5, -6.2752596e-7 }; static const float t[6] = { 0.31424038, 0.94778839, 1.5976826, 2.2795071, 3.020637, 3.8897249 }; const float rrtpi = 0.56418958; /* 1/SQRT(pi) */ static float a0, d0, d2, e0, e2, e4, h0, h2, h4, h6, p0, p2, p4, p6, p8, z0, z2, z4, z6, z8; static float mf[6], pf[6], mq[6], pq[6], xm[6], ym[6], xp[6], yp[6]; static float old_y = -1.; static int rg1, rg2, rg3; static float xlim0, xlim1, xlim2, xlim3, xlim4; static float yq, yrrtpi; float abx, xq; if (y != old_y) { old_y = y; yq = y * y; yrrtpi = y * rrtpi; rg1 = TRUE, rg2 = TRUE, rg3 = TRUE; if (y < 70.55) { xlim0 = sqrt(y * (40. - y * 3.6) + 15100.); xlim1 = (y >= 8.425 ? 0. : sqrt(164. - y * (y * 1.8 + 4.3))); xlim2 = 6.8 - y; xlim3 = y * 2.4; xlim4 = y * 18.1 + 1.65; if (y <= 1e-6) { xlim2 = xlim1 = xlim0; } } } abx = fabs(x); xq = abx * abx; if (abx >= xlim0 || y >= 70.55) { /* Region 0 algorithm */ return yrrtpi / (xq + yq); } else if (abx >= xlim1) { /* Humlicek W4 Region 1 */ if (rg1) { /* First point in Region 1 */ rg1 = FALSE; a0 = yq + 0.5; /* Region 1 y-dependents */ d0 = a0 * a0; d2 = yq + yq - 1.; } return rrtpi / (d0 + xq * (d2 + xq)) * y * (a0 + xq); } else if (abx > xlim2) { /* Humlicek W4 Region 2 */ if (rg2) { /* First point in Region 2 */ rg2 = FALSE; /* Region 2 y-dependents */ h0 = yq * (yq * (yq * (yq + 6.) + 10.5) + 4.5) + 0.5625; h2 = yq * (yq * (yq * 4. + 6.) + 9.) - 4.5; h4 = 10.5 - yq * (6. - yq * 6.); h6 = yq * 4. - 6.; e0 = yq * (yq * (yq + 5.5) + 8.25) + 1.875; e2 = yq * (yq * 3. + 1.) + 5.25; e4 = h6 * 0.75; } return rrtpi / (h0 + xq * (h2 + xq * (h4 + xq * (h6 + xq)))) * y * (e0 + xq * (e2 + xq * (e4 + xq))); } else if (abx < xlim3) { /* Humlicek W4 Region 3 */ if (rg3) { /* First point in Region 3 */ rg3 = FALSE; /* Region 3 y-dependents */ z0 = y * (y * (y * (y * (y * (y * (y * (y * (y * (y + 13.3988) + 88.26741) + 369.1989) + 1074.409) + 2256.981) + 3447.629) + 3764.966) + 2802.87) + 1280.829) + 272.1014; z2 = y * (y * (y * (y * (y * (y * (y * (y * 5. + 53.59518) + 266.2987) + 793.4273) + 1549.675) + 2037.31) + 1758.336) + 902.3066) + 211.678; z4 = y * (y * (y * (y * (y * (y * 10. + 80.39278) + 269.2916) + 479.2576) + 497.3014) + 308.1852) + 78.86585; z6 = y * (y * (y * (y * 10. + 53.59518) + 92.75679) + 55.02933) + 22.03523; z8 = y * (y * 5. + 13.3988) + 1.49646; p0 = y * (y * (y * (y * (y * (y * (y * (y * (y * 0.3183291 + 4.264678) + 27.93941) + 115.3772) + 328.2151) + 662.8097) + 946.897) + 919.4955) + 549.3954) + 153.5168; p2 = y * (y * (y * (y * (y * (y * (y * 1.2733163 + 12.79458) + 56.81652) + 139.4665) + 189.773) + 124.5975) - 1.322256) - 34.16955; p4 = y * (y * (y * (y * (y * 1.9099744 + 12.79568) + 29.81482) + 24.01655) + 10.46332) + 2.584042; p6 = y * (y * (y * 1.273316 + 4.266322) + 0.9377051) - 0.07272979; p8 = y * .3183291 + 5.480304e-4; } return 1.7724538 / (z0 + xq * (z2 + xq * (z4 + xq * (z6 + xq * (z8 + xq))))) * (p0 + xq * (p2 + xq * (p4 + xq * (p6 + xq * p8)))); } else { /* Humlicek CPF12 algorithm */ float ypy0 = y + 1.5; float ypy0q = ypy0 * ypy0; int j; float k = 0.; for (j = 0; j <= 5; ++j) { float d = x - t[j]; mq[j] = d * d; mf[j] = 1. / (mq[j] + ypy0q); xm[j] = mf[j] * d; ym[j] = mf[j] * ypy0; d = x + t[j]; pq[j] = d * d; pf[j] = 1. / (pq[j] + ypy0q); xp[j] = pf[j] * d; yp[j] = pf[j] * ypy0; } if (abx <= xlim4) { /* Humlicek CPF12 Region I */ for (j = 0; j <= 5; ++j) k += c[j] * (ym[j]+yp[j]) - s[j] * (xm[j]-xp[j]); } else { /* Humlicek CPF12 Region II */ float yf = y + 3.; for (j = 0; j <= 5; ++j) k += (c[j] * (mq[j] * mf[j] - ym[j] * 1.5) + s[j] * yf * xm[j]) / (mq[j] + 2.25) + (c[j] * (pq[j] * pf[j] - yp[j] * 1.5) - s[j] * yf * xp[j]) / (pq[j] + 2.25); k = y * k + exp(-xq); } return k; } } grace-5.1.23/src/x11drv.h0000644000076500001440000000371610071615562014527 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-99 Grace Development Team * Copyright (c) 1991-95 Paul J Turner, Portland, OR * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" #include #define CMAP_INSTALL_NEVER 0 #define CMAP_INSTALL_ALWAYS 1 #define CMAP_INSTALL_AUTO 2 int xlibinit(void); int xlibinitgraphics(void); void drawxlib(int x, int y, int mode); void xlibupdatecmap(void); void xlibinitcmap(void); void xlibdrawpixel(VPoint vp); void xlibdrawpolyline(VPoint *vps, int n, int mode); void xlibfillpolygon(VPoint *vps, int npoints); void xlibdrawarc(VPoint vp1, VPoint vp2, int angle1, int angle2); void xlibfillarc(VPoint vp1, VPoint vp2, int angle1, int angle2, int mode); void xlibredraw(Window window, int x, int y, int widht, int height); void xlibputpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void xlibleavegraphics(void); int xconvxlib(double x); int yconvxlib(double y); void xlibVPoint2dev(VPoint vp, int *x, int *y); VPoint xlibdev2VPoint(int x, int y); grace-5.1.23/src/events.c0000644000076500001440000010707211004677213014677 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * event handler * */ #include #include #include #include #include #include "globals.h" #include "events.h" #include "utils.h" #include "graphs.h" #include "draw.h" #include "graphutils.h" #include "x11drv.h" #include "plotone.h" #include "protos.h" #include #include #include #include #include "motifinc.h" extern Widget loclab; extern Widget arealab; extern Widget perimlab; int cursortype = 0; static VPoint anchor_vp = {0.0, 0.0}; static int x, y; /* pointer coordinates */ static int anchor_x = 0; static int anchor_y = 0; static view bb; static int move_dir; static int action_flag = 0; extern int regiontype; /* * for region, area and perimeter computation */ #define MAX_POLY_POINTS 200 static int region_pts = 0; static int iax[MAX_POLY_POINTS]; static int iay[MAX_POLY_POINTS]; static WPoint region_wps[MAX_POLY_POINTS]; void anchor_point(int curx, int cury, VPoint curvp) { anchor_vp = curvp; anchor_x = curx; anchor_y = cury; } void my_proc(Widget parent, XtPointer data, XEvent *event) { char keybuf; KeySym keys; XComposeStatus compose; static Time lastc = 0; /* time of last mouse click */ Boolean dbl_click; WPoint wp, wp_new; VPoint vp; VVector shift; view v; int cg, newg, loc; int track_setno; static int track_loc; int add_at; static int type, id; /* for objects */ int axisno; Datapoint dpoint; GLocator locator; cg = get_cg(); get_tracking_props(&track_setno, &move_dir, &add_at); switch (event->type) { case MotionNotify: x = event->xmotion.x; y = event->xmotion.y; if (cursortype != 0) { crosshair_motion(x, y); } vp = xlibdev2VPoint(x, y); getpoints(&vp); if (focus_policy == FOCUS_FOLLOWS) { if ((newg = next_graph_containing(-1, vp)) != cg) { switch_current_graph(newg); cg = newg; } } switch (action_flag) { case DO_NOTHING: break; case VIEW_2ND: case ZOOM_2ND: case ZOOMX_2ND: case ZOOMY_2ND: case MAKE_BOX_2ND: case MAKE_ELLIP_2ND: select_region(anchor_x, anchor_y, x, y, 1); break; case MOVE_OBJECT_2ND: case COPY_OBJECT2ND: case PLACE_LEGEND_2ND: case PLACE_TIMESTAMP_2ND: slide_region(bb, x - anchor_x, y - anchor_y, 1); break; case MAKE_LINE_2ND: case DEF_REGION2ND: select_line(anchor_x, anchor_y, x, y, 1); break; case DEF_REGION: if (region_pts > 0) { select_line(anchor_x, anchor_y, x, y, 1); } break; case MOVE_POINT2ND: switch (move_dir) { case MOVE_POINT_XY: select_line(anchor_x, anchor_y, x, y, 1); break; case MOVE_POINT_X: select_line(x, anchor_y, anchor_x, anchor_y, 1); break; case MOVE_POINT_Y: select_line(anchor_x, anchor_y, anchor_x, y, 1); break; } break; default: return; break; } break; case ButtonPress: x = event->xbutton.x; y = event->xbutton.y; vp = xlibdev2VPoint(x, y); getpoints(&vp); switch (event->xbutton.button) { case Button1: /* first, determine if it's double click */ if (((XButtonEvent *) event)->time - lastc < CLICKINT) { dbl_click = True; } else { dbl_click = False; } lastc = ((XButtonEvent *) event)->time; switch (action_flag) { case 0: if (dbl_click == True && allow_dc == TRUE) { track_setno = -1; if (focus_clicked(cg, vp, &anchor_vp) == TRUE) { xlibVPoint2dev(anchor_vp, &anchor_x, &anchor_y); set_action(VIEW_2ND); select_region(anchor_x, anchor_y, x, y, 0); } else if (find_point(cg, vp, &track_setno, &loc) == RETURN_SUCCESS) { define_symbols_popup((void *) track_setno); } else if (axis_clicked(cg, vp, &axisno) == TRUE) { create_axes_dialog(axisno); } else if (title_clicked(cg, vp) == TRUE) { create_graphapp_frame(cg); } else if (legend_clicked(cg, vp, &bb) == TRUE) { create_graphapp_frame(cg); } else if (find_item(cg, vp, &bb, &type, &id) == RETURN_SUCCESS) { object_edit_popup(type, id); } else if (timestamp_clicked(vp, &bb) == TRUE) { create_plot_frame(); } else if (graph_clicked(cg, vp) == TRUE) { define_symbols_popup((void *) -1); } } else { if (focus_policy == FOCUS_CLICK) { if ((newg = next_graph_containing(cg, vp)) != cg) { switch_current_graph(newg); } } } break; case VIEW_2ND: set_action(DO_NOTHING); v.xv1 = MIN2(vp.x, anchor_vp.x); v.yv1 = MIN2(vp.y, anchor_vp.y); v.xv2 = MAX2(vp.x, anchor_vp.x); v.yv2 = MAX2(vp.y, anchor_vp.y); set_graph_viewport(cg, v); update_view(cg); xdrawgraph(); break; case ZOOM_1ST: anchor_point(x, y, vp); set_action(ZOOM_2ND); select_region(anchor_x, anchor_y, x, y, 0); break; case ZOOMX_1ST: anchor_point(x, y, vp); set_action(ZOOMX_2ND); select_region(anchor_x, anchor_y, x, y, 0); break; case ZOOMY_1ST: anchor_point(x, y, vp); set_action(ZOOMY_2ND); select_region(anchor_x, anchor_y, x, y, 0); break; case VIEW_1ST: anchor_point(x, y, vp); set_action(VIEW_2ND); select_region(anchor_x, anchor_y, x, y, 0); break; case ZOOM_2ND: set_action(DO_NOTHING); newworld(cg, ALL_AXES, anchor_vp, vp); break; case ZOOMX_2ND: set_action(DO_NOTHING); newworld(cg, ALL_X_AXES, anchor_vp, vp); break; case ZOOMY_2ND: set_action(DO_NOTHING); newworld(cg, ALL_Y_AXES, anchor_vp, vp); break; case EDIT_OBJECT: if (find_item(cg, vp, &bb, &type, &id) == RETURN_SUCCESS) { object_edit_popup(type, id); } break; case DEL_OBJECT: if (find_item(cg, vp, &bb, &type, &id) == RETURN_SUCCESS) { char message[32]; sprintf(message, "Kill the %s?", object_types(type)); if (yesno(message, NULL, NULL, NULL) == TRUE) { kill_object(type, id); xdrawgraph(); } } break; case MOVE_OBJECT_1ST: if (find_item(cg, vp, &bb, &type, &id) == RETURN_SUCCESS) { anchor_point(x, y, vp); slide_region(bb, x - anchor_x, y - anchor_y, 0); set_action(MOVE_OBJECT_2ND); } break; case MOVE_OBJECT_2ND: shift.x = vp.x - anchor_vp.x; shift.y = vp.y - anchor_vp.y; move_object(type, id, shift); xdrawgraph(); set_action(MOVE_OBJECT_1ST); break; case COPY_OBJECT1ST: if (find_item(cg, vp, &bb, &type, &id) == RETURN_SUCCESS) { anchor_point(x, y, vp); slide_region(bb, x - anchor_x, y - anchor_y, 0); set_action(COPY_OBJECT2ND); } break; case COPY_OBJECT2ND: shift.x = vp.x - anchor_vp.x; shift.y = vp.y - anchor_vp.y; id = duplicate_object(type, id); move_object(type, id, shift); xdrawgraph(); set_action(COPY_OBJECT1ST); break; case STR_LOC: id = next_string(); init_string(id, vp); object_edit_popup(OBJECT_STRING, id); break; case MAKE_LINE_1ST: anchor_point(x, y, vp); select_line(anchor_x, anchor_y, x, y, 0); set_action(MAKE_LINE_2ND); break; case MAKE_LINE_2ND: select_line(anchor_x, anchor_y, x, y, 0); id = next_line(); init_line(id, anchor_vp, vp); xdrawgraph(); set_action(MAKE_LINE_1ST); break; case MAKE_BOX_1ST: anchor_point(x, y, vp); select_region(anchor_x, anchor_y, x, y, 0); set_action(MAKE_BOX_2ND); break; case MAKE_BOX_2ND: select_region(anchor_x, anchor_y, x, y, 0); id = next_box(); init_box(id, anchor_vp, vp); xdrawgraph(); set_action(MAKE_BOX_1ST); break; case MAKE_ELLIP_1ST: anchor_point(x, y, vp); select_region(anchor_x, anchor_y, x, y, 0); set_action(MAKE_ELLIP_2ND); break; case MAKE_ELLIP_2ND: select_region(anchor_x, anchor_y, x, y, 0); id = next_ellipse(); init_ellipse(id, anchor_vp, vp); xdrawgraph(); set_action(MAKE_ELLIP_1ST); break; case AUTO_NEAREST: if (find_point(cg, vp, &track_setno, &loc) == RETURN_SUCCESS) { autoscale_byset(cg, track_setno, AUTOSCALE_XY); update_ticks(cg); xdrawgraph(); set_action(DO_NOTHING); } break; case TRACKER: track_point(cg, track_setno, &track_loc, -1); break; case DEL_POINT: if (find_point(cg, vp, &track_setno, &loc) == RETURN_SUCCESS) { del_point(cg, track_setno, loc); update_set_lists(cg); xdrawgraph(); } break; case MOVE_POINT1ST: if (find_point(cg, vp, &track_setno, &track_loc) == RETURN_SUCCESS) { anchor_point(x, y, vp); get_point(cg, track_setno, track_loc, &wp); select_line(anchor_x, anchor_y, x, y, 0); set_action(MOVE_POINT2ND); } break; case MOVE_POINT2ND: if (is_valid_setno(cg, track_setno)) { get_point(cg, track_setno, track_loc, &wp); view2world(vp.x, vp.y, &wp_new.x, &wp_new.y); switch (move_dir) { case 0: wp = wp_new; break; case 1: wp.x = wp_new.x; break; case 2: wp.y = wp_new.y; break; } set_point(cg, track_setno, track_loc, wp); update_point_locator(cg, track_setno, track_loc); xdrawgraph(); set_action(MOVE_POINT1ST); } break; case ADD_POINT: view2world(vp.x, vp.y, &wp.x, &wp.y); zero_datapoint(&dpoint); dpoint.ex[0] = wp.x; dpoint.ex[1] = wp.y; switch (add_at) { case ADD_POINT_BEGINNING: /* at the beginning */ loc = 0; break; case ADD_POINT_END: /* at the end */ loc = getsetlength(cg, track_setno); break; default: /* between nearest points */ loc = find_insert_location(cg, track_setno, vp); break; } if (add_point_at(cg, track_setno, loc, &dpoint) == RETURN_SUCCESS) { update_set_lists(cg); xdrawgraph(); } break; case PLACE_LEGEND_1ST: if (legend_clicked(cg, vp, &bb) == TRUE) { anchor_point(x, y, vp); slide_region(bb, x - anchor_x, y - anchor_y, 0); set_action(PLACE_LEGEND_2ND); } break; case PLACE_LEGEND_2ND: shift.x = vp.x - anchor_vp.x; shift.y = vp.y - anchor_vp.y; move_legend(cg, shift); updatelegends(cg); xdrawgraph(); set_action(PLACE_LEGEND_1ST); break; case PLACE_TIMESTAMP_1ST: if (timestamp_clicked(vp, &bb) == TRUE) { anchor_point(x, y, vp); slide_region(bb, x - anchor_x, y - anchor_y, 0); set_action(PLACE_TIMESTAMP_2ND); } break; case PLACE_TIMESTAMP_2ND: shift.x = vp.x - anchor_vp.x; shift.y = vp.y - anchor_vp.y; move_timestamp(shift); xdrawgraph(); set_action(PLACE_TIMESTAMP_1ST); break; case SEL_POINT: if (get_graph_locator(cg, &locator) == RETURN_SUCCESS) { view2world(vp.x, vp.y, &locator.dsx, &locator.dsy); locator.pointset = TRUE; set_graph_locator(cg, &locator); update_locator_items(cg); xdrawgraph(); } set_action(DO_NOTHING); break; case DEF_REGION1ST: anchor_point(x, y, vp); select_line(anchor_x, anchor_y, x, y, 0); set_action(DEF_REGION2ND); break; case DEF_REGION2ND: set_action(DO_NOTHING); select_line(anchor_x, anchor_y, x, y, 0); activate_region(nr, regiontype, cg); view2world(anchor_vp.x, anchor_vp.y, &rg[nr].x1, &rg[nr].y1); view2world(vp.x, vp.y, &rg[nr].x2, &rg[nr].y2); xdrawgraph(); break; case DEF_REGION: anchor_point(x, y, vp); iax[region_pts] = x; iay[region_pts] = y; view2world(vp.x, vp.y, ®ion_wps[region_pts].x, ®ion_wps[region_pts].y); if (region_pts < MAX_POLY_POINTS) { region_pts++; } else { errmsg("Too many points in polygon!"); } select_line(anchor_x, anchor_y, x, y, 0); break; default: break; } break; case Button2: switch (action_flag) { case TRACKER: track_setno = -1; if (find_point(cg, vp, &track_setno, &track_loc) == RETURN_SUCCESS) { track_point(cg, track_setno, &track_loc, 0); } else { update_point_locator(cg, track_setno, track_loc); } break; default: break; } break; case Button3: switch (action_flag) { case DO_NOTHING: /* * find_item(cg, vp, &anchor_vp, &type, &id); * sprintf(buf, "type = %d, id = %d", type, id); * set_left_footer(buf); */ break; case TRACKER: track_point(cg, track_setno, &track_loc, +1); break; case DEF_REGION: /* end region definition */ select_line(x, y, iax[0], iay[0], 0); load_poly_region(nr, cg, region_pts, region_wps); set_action(DO_NOTHING); xdrawgraph(); break; default: set_action(DO_NOTHING); break; } return; default: /* TODO: wheel mice */ break; } break; case KeyPress: XLookupString((XKeyEvent *) event, &keybuf, 1, &keys, &compose); if (keybuf == 27) { /* Esc */ set_action(DO_NOTHING); return; } break; default: break; } } /* * action callback */ void set_actioncb(void *data) { int func = (int) data; set_action(DO_NOTHING); set_action(func); } /* * set the action_flag to the desired action (actions are * defined in defines.h), if 0 then cleanup the results * from previous actions. */ void set_action(CanvasAction act) { int i; /* * indicate what's happening with a message in the left footer */ switch (act) { case 0: switch (action_flag) { case ZOOM_2ND: case ZOOMX_2ND: case ZOOMY_2ND: case VIEW_2ND: select_region(anchor_x, anchor_y, x, y, 0); break; case MOVE_OBJECT_2ND: case COPY_OBJECT2ND: case PLACE_LEGEND_2ND: case PLACE_TIMESTAMP_2ND: slide_region(bb, x - anchor_x, y - anchor_y, 0); break; case MAKE_LINE_2ND: case DEF_REGION2ND: select_line(anchor_x, anchor_y, x, y, 0); break; case DEF_REGION: select_line(anchor_x, anchor_y, x, y, 0); for (i = 0; i < region_pts - 1; i++) { select_line(iax[i], iay[i], iax[i + 1], iay[i + 1], 0); } break; case MOVE_POINT2ND: switch (move_dir) { case 0: select_line(anchor_x, anchor_y, x, y, 0); break; case 1: select_line(anchor_x, anchor_y, x, anchor_y, 0); break; case 2: select_line(anchor_x, anchor_y, anchor_x, y, 0); break; } break; default: break; } set_cursor(-1); set_left_footer(NULL); break; case ZOOM_1ST: set_cursor(0); set_left_footer("Pick first corner for zoom"); break; case ZOOM_2ND: set_left_footer("Pick second corner for zoom"); break; case ZOOMX_1ST: set_cursor(0); set_left_footer("Pick first point for zoom along X-axis"); break; case ZOOMX_2ND: set_left_footer("Pick second point for zoom along X-axis"); break; case ZOOMY_1ST: set_cursor(0); set_left_footer("Pick first point for zoom along Y-axis"); break; case ZOOMY_2ND: set_left_footer("Pick second point for zoom along Y-axis"); break; case VIEW_1ST: set_cursor(0); set_left_footer("Pick first corner of viewport"); break; case VIEW_2ND: set_left_footer("Pick second corner of viewport"); break; case EDIT_OBJECT: set_cursor(1); set_left_footer("Pick object to edit"); break; case DEL_OBJECT: set_cursor(3); set_left_footer("Delete object"); break; case MOVE_OBJECT_1ST: set_cursor(1); set_left_footer("Pick object to move"); break; case COPY_OBJECT1ST: set_cursor(1); set_left_footer("Pick object to copy"); break; case MOVE_OBJECT_2ND: case COPY_OBJECT2ND: set_cursor(4); set_left_footer("Place object"); break; case STR_LOC: set_cursor(2); set_left_footer("Pick beginning of text"); break; case MAKE_LINE_1ST: set_cursor(0); set_left_footer("Pick beginning of line"); break; case MAKE_LINE_2ND: set_left_footer("Pick end of line"); break; case MAKE_BOX_1ST: set_cursor(0); set_left_footer("First corner of box"); break; case MAKE_BOX_2ND: set_left_footer("Second corner of box"); break; case MAKE_ELLIP_1ST: set_cursor(0); set_left_footer("Pick beginning of bounding box for ellipse"); break; case MAKE_ELLIP_2ND: set_left_footer("Pick opposite corner"); break; case AUTO_NEAREST: set_cursor(0); set_left_footer("Autoscale on nearest set - click near a point of the set to autoscale"); break; case TRACKER: set_cursor(1); set_left_footer("Tracker"); break; case DEL_POINT: set_cursor(3); set_left_footer("Delete point"); break; case MOVE_POINT1ST: set_cursor(4); set_left_footer("Pick point to move"); break; case MOVE_POINT2ND: set_left_footer("Pick final location"); break; case ADD_POINT: set_cursor(0); set_left_footer("Add point"); break; case PLACE_LEGEND_1ST: set_cursor(1); set_left_footer("Pick legend"); break; case PLACE_LEGEND_2ND: set_cursor(4); set_left_footer("Move legend"); break; case PLACE_TIMESTAMP_1ST: set_cursor(1); set_left_footer("Pick timestamp"); break; case PLACE_TIMESTAMP_2ND: set_cursor(4); set_left_footer("Place timestamp"); break; case SEL_POINT: set_cursor(0); set_left_footer("Pick reference point"); break; case DEF_REGION1ST: set_cursor(0); set_left_footer("Pick first point for region"); break; case DEF_REGION2ND: set_left_footer("Pick second point for region"); break; case DEF_REGION: set_cursor(0); set_left_footer("Define region"); break; case COMP_AREA: set_cursor(0); set_left_footer("Compute area"); break; case COMP_PERIMETER: set_cursor(0); set_left_footer("Compute perimeter"); break; case DISLINE1ST: set_cursor(0); set_left_footer("Pick start of line for distance computation"); break; case DISLINE2ND: set_cursor(0); set_left_footer("Pick ending point"); break; } action_flag = act; } void track_point(int gno, int setno, int *loc, int shift) { int len; double *xtmp, *ytmp; WPoint wp; VPoint vp; world w; if ((len = getsetlength(gno, setno)) > 0) { *loc += shift; if (*loc < 0) { *loc += len; } else { *loc = *loc % len; } xtmp = getx(gno, setno); ytmp = gety(gno, setno); wp.x = xtmp[*loc]; wp.y = ytmp[*loc]; get_graph_world(gno, &w); wp.x = MAX2(wp.x, w.xg1); wp.x = MIN2(wp.x, w.xg2); wp.y = MAX2(wp.y, w.yg1); wp.y = MIN2(wp.y, w.yg2); vp = Wpoint2Vpoint(wp); setpointer(vp); update_point_locator(gno, setno, *loc); } } /* * set format string for locator */ static char *typestr[6] = {"X, Y", "DX, DY", "DIST", "Phi, Rho", "VX, VY", "SX, SY"}; /* * locator on main_panel */ void getpoints(VPoint *vpp) { static VPoint vp = {0.0, 0.0}; int cg = get_cg(); double wx, wy, xtmp, ytmp; int x, y; double dsx = 0.0, dsy = 0.0; char buf[256], bufx[64], bufy[64], *s; GLocator locator; if (vpp != NULL) { vp = *vpp; } view2world(vp.x, vp.y, &wx, &wy); if (get_graph_locator(cg, &locator) != RETURN_SUCCESS) { SetLabel(loclab, "[No graphs]"); return; } if (locator.pointset) { dsx = locator.dsx; dsy = locator.dsy; } switch (locator.pt_type) { case 0: if (get_graph_type(cg) == GRAPH_POLAR) { polar2xy(wx, wy, &xtmp, &ytmp); } else { xtmp = wx; ytmp = wy; } break; case 1: xtmp = wx - dsx; ytmp = wy - dsy; break; case 2: if (get_graph_type(cg) == GRAPH_POLAR) { polar2xy(wx, wy, &xtmp, &ytmp); } else { xtmp = wx; ytmp = wy; } xtmp = hypot(dsx - xtmp, dsy - ytmp); ytmp = 0.0; break; case 3: if (dsx - wx != 0.0 || dsy - wy != 0.0) { xy2polar(wx - dsx, wy - dsy, &xtmp, &ytmp); } else { xtmp = 0.0; ytmp = 0.0; } break; case 4: xtmp = vp.x; ytmp = vp.y; break; case 5: xlibVPoint2dev(vp, &x, &y); xtmp = x; ytmp = y; break; default: return; } s = create_fstring(locator.fx, locator.px, xtmp, LFORMAT_TYPE_PLAIN); strcpy(bufx, s); s = create_fstring(locator.fy, locator.py, ytmp, LFORMAT_TYPE_PLAIN); strcpy(bufy, s); sprintf(buf, "G%1d: %s = [%s, %s]", cg, typestr[locator.pt_type], bufx, bufy); SetLabel(loclab, buf); } /* * switch on the area calculator */ void do_select_area(void) { set_action(DO_NOTHING); set_action(COMP_AREA); } /* * switch on the perimeter calculator */ void do_select_peri(void) { set_action(DO_NOTHING); set_action(COMP_PERIMETER); } void do_dist_proc(void) { set_action(DO_NOTHING); set_action(DISLINE1ST); } /* * define a (polygon) region */ void do_select_region(void) { region_pts = 0; set_action(DO_NOTHING); set_action(DEF_REGION); } /* * Given the graph gno, find the graph that contains * (wx, wy). Used for setting the graph focus. */ int next_graph_containing(int cg, VPoint vp) { int i, j, ng, gno = -1; view v; ng = number_of_graphs(); if (is_valid_gno(cg) == FALSE) { cg = -1; } for (i = 0; i < ng ; i++) { j = (i + cg + 1) % ng; if (is_graph_hidden(j) == FALSE && get_graph_viewport(j, &v) == RETURN_SUCCESS && is_vpoint_inside(v, vp, MAXPICKDIST) == TRUE) { gno = j; break; } } return gno; } int legend_clicked(int gno, VPoint vp, view *bb) { legend l; if (is_graph_hidden(gno) == FALSE) { get_graph_legend(gno, &l); if (l.active && is_vpoint_inside(l.bb, vp, MAXPICKDIST)) { *bb = l.bb; return TRUE; } else { return FALSE; } } else { return FALSE; } } int graph_clicked(int gno, VPoint vp) { view v; if (is_graph_hidden(gno) == FALSE) { get_graph_viewport(gno, &v); if (is_vpoint_inside(v, vp, MAXPICKDIST)) { return TRUE; } else { return FALSE; } } else { return FALSE; } } int timestamp_clicked(VPoint vp, view *bb) { if (timestamp.active && is_vpoint_inside(timestamp.bb, vp, MAXPICKDIST)) { *bb = timestamp.bb; return TRUE; } else { return FALSE; } } int focus_clicked(int cg, VPoint vp, VPoint *avp) { view v; if (is_graph_hidden(cg) == TRUE) { return FALSE; } if (get_graph_viewport(cg, &v) != RETURN_SUCCESS) { return FALSE; } if (fabs(vp.x - v.xv1) < MAXPICKDIST && fabs(vp.y - v.yv1) < MAXPICKDIST) { avp->x = v.xv2; avp->y = v.yv2; return TRUE; } else if (fabs(vp.x - v.xv1) < MAXPICKDIST && fabs(vp.y - v.yv2) < MAXPICKDIST) { avp->x = v.xv2; avp->y = v.yv1; return TRUE; } else if (fabs(vp.x - v.xv2) < MAXPICKDIST && fabs(vp.y - v.yv1) < MAXPICKDIST) { avp->x = v.xv1; avp->y = v.yv2; return TRUE; } else if (fabs(vp.x - v.xv2) < MAXPICKDIST && fabs(vp.y - v.yv2) < MAXPICKDIST) { avp->x = v.xv1; avp->y = v.yv1; return TRUE; } else { return FALSE; } } int axis_clicked(int gno, VPoint vp, int *axisno) { view v; /* TODO: check for offsets, zero axes, polar graphs */ if (is_graph_hidden(gno) == TRUE) { return FALSE; } else { get_graph_viewport(gno, &v); if (vp.x >= v.xv1 && vp.x <= v.xv2 && (fabs(vp.y - v.yv1) < MAXPICKDIST || fabs(vp.y - v.yv2) < MAXPICKDIST)) { *axisno = X_AXIS; return TRUE; } else if (vp.y >= v.yv1 && vp.y <= v.yv2 && (fabs(vp.x - v.xv1) < MAXPICKDIST || fabs(vp.x - v.xv2) < MAXPICKDIST)) { *axisno = Y_AXIS; return TRUE; } else { return FALSE; } } } int title_clicked(int gno, VPoint vp) { view v; /* a rude check; TODO: use right offsets */ if (is_graph_hidden(gno) == TRUE) { return FALSE; } else { get_graph_viewport(gno, &v); if (vp.x >= v.xv1 && vp.x <= v.xv2 && vp.y > v.yv2 && vp.y < v.yv2 + 0.1) { return TRUE; } else { return FALSE; } } } /* * locate a point and the set the point is in */ int find_point(int gno, VPoint vp, int *setno, int *loc) { int i, start, stop, j, found; double *xtmp, *ytmp; WPoint wptmp; VPoint vptmp; double dist, mindist = MAXPICKDIST; if (is_valid_gno(gno) != TRUE) { return RETURN_FAILURE; } if (is_valid_setno(gno, *setno)) { start = *setno; stop = *setno; } else { start = 0; stop = number_of_sets(gno) - 1; } found = FALSE; for (i = start; i <= stop; i++) { if (is_set_hidden(gno, i) == FALSE) { xtmp = getx(gno, i); ytmp = gety(gno, i); for (j = 0; j < getsetlength(gno, i); j++) { wptmp.x = xtmp[j]; wptmp.y = ytmp[j]; vptmp = Wpoint2Vpoint(wptmp); dist = MAX2(fabs(vp.x - vptmp.x), fabs(vp.y - vptmp.y)); if (dist < mindist) { found = TRUE; *setno = i; *loc = j; mindist = dist; } } } } if (found == FALSE) { return RETURN_FAILURE; } else { update_point_locator(gno, *setno, *loc); return RETURN_SUCCESS; } } int find_insert_location(int gno, int setno, VPoint vp) { int j, loc = -1; double *xtmp, *ytmp; WPoint wptmp; VPoint vp1, vp2; double dist, mindist = 1.0; if (is_valid_setno(gno, setno) == TRUE) { if (is_set_hidden(gno, setno) == FALSE) { xtmp = getx(gno, setno); ytmp = gety(gno, setno); for (j = 0; j < getsetlength(gno, setno) - 1; j++) { wptmp.x = xtmp[j]; wptmp.y = ytmp[j]; vp1 = Wpoint2Vpoint(wptmp); wptmp.x = xtmp[j + 1]; wptmp.y = ytmp[j + 1]; vp2 = Wpoint2Vpoint(wptmp); dist = hypot(vp.x - vp1.x, vp.y - vp1.y) + hypot(vp.x - vp2.x, vp.y - vp2.y); if (dist < mindist) { loc = j + 1; mindist = dist; } } } } return loc; } /* * find object containing vp inside its bb */ int find_item(int gno, VPoint vp, view *bb, int *type, int *id) { int i; *type = OBJECT_NONE; for (i = 0; i < number_of_boxes(); i++) { if (isactive_box(i)) { get_object_bb(OBJECT_BOX, i, bb); if (is_vpoint_inside(*bb, vp, MAXPICKDIST)) { *type = OBJECT_BOX; *id = i; } } } for (i = 0; i < number_of_ellipses(); i++) { if (isactive_ellipse(i)) { get_object_bb(OBJECT_ELLIPSE, i, bb); if (is_vpoint_inside(*bb, vp, MAXPICKDIST)) { *type = OBJECT_ELLIPSE; *id = i; } } } for (i = 0; i < number_of_lines(); i++) { if (isactive_line(i)) { get_object_bb(OBJECT_LINE, i, bb); if (is_vpoint_inside(*bb, vp, MAXPICKDIST)) { *type = OBJECT_LINE; *id = i; } } } for (i = 0; i < number_of_strings(); i++) { if (isactive_string(i)) { get_object_bb(OBJECT_STRING, i, bb); if (is_vpoint_inside(*bb, vp, MAXPICKDIST)) { *type = OBJECT_STRING; *id = i; } } } if (*type == OBJECT_NONE) { return RETURN_FAILURE; } else { get_object_bb(*type, *id, bb); return RETURN_SUCCESS; } } /* * for zooms * */ void newworld(int gno, int axes, VPoint vp1, VPoint vp2) { world w, wtmp; if (vp1.x == vp2.x && (axes == ALL_AXES || axes == ALL_X_AXES)) { errmsg("Zoomed rectangle is zero along X, zoom cancelled"); return; } if (vp1.y == vp2.y && (axes == ALL_AXES || axes == ALL_Y_AXES)) { errmsg("Zoomed rectangle is zero along Y, zoom cancelled"); return; } view2world(vp1.x, vp1.y, &w.xg1, &w.yg1); view2world(vp2.x, vp2.y, &w.xg2, &w.yg2); if (w.xg1 > w.xg2) { fswap(&w.xg1, &w.xg2); } if (w.yg1 > w.yg2) { fswap(&w.yg1, &w.yg2); } if (is_graph_active(gno)) { get_graph_world(gno, &wtmp); switch (axes) { case ALL_AXES: wtmp.xg1 = w.xg1; wtmp.xg2 = w.xg2; wtmp.yg1 = w.yg1; wtmp.yg2 = w.yg2; break; case ALL_X_AXES: wtmp.xg1 = w.xg1; wtmp.xg2 = w.xg2; break; case ALL_Y_AXES: wtmp.yg1 = w.yg1; wtmp.yg2 = w.yg2; break; default: return; break; } set_graph_world(gno, wtmp); autotick_axis(gno, axes); xdrawgraph(); } } void switch_current_graph(int gno) { int saveg = get_cg(); if (is_graph_hidden(gno) == FALSE) { select_graph(gno); draw_focus(saveg); draw_focus(gno); update_all(); set_graph_selectors(gno); getpoints(NULL); } } /* -------------------------------------------------------------- */ /* canvas_actions */ void autoscale_action(Widget w, XKeyEvent *e, String *p, Cardinal *c) { int cg = get_cg(); autoscale_graph(cg, AUTOSCALE_XY); update_ticks(cg); xdrawgraph(); } void autoscale_on_near_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(AUTO_NEAREST); } void draw_line_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(MAKE_LINE_1ST); } void draw_box_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(MAKE_BOX_1ST); } void draw_ellipse_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(MAKE_ELLIP_1ST); } void write_string_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(STR_LOC); } void delete_object_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(DEL_OBJECT); } void place_legend_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(PLACE_LEGEND_1ST); } void place_timestamp_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(PLACE_TIMESTAMP_1ST); } void move_object_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(MOVE_OBJECT_1ST); } void refresh_hotlink_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { do_hotupdate_proc(NULL); } void set_viewport_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(VIEW_1ST); } void enable_zoom_action( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { set_action(DO_NOTHING); set_action(ZOOM_1ST); } /* * world stack operations */ void push_and_zoom(void) { push_world(); set_action(DO_NOTHING); set_action(ZOOM_1ST); } grace-5.1.23/src/svgdrv.c0000644000076500001440000005721010071615562014706 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Driver for the Scalable Vector Graphics Format from W3C */ #include #include #include #include #include "defines.h" #include "utils.h" #include "cmath.h" #include "draw.h" #include "graphs.h" #include "device.h" #include "devlist.h" #include "patterns.h" #include "svgdrv.h" extern FILE *prstream; static Device_entry dev_svg = { DEVICE_FILE, "SVG", svginitgraphics, NULL, NULL, "svg", TRUE, FALSE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; typedef struct { double side; int *pattern_defined; int *pattern_empty; int *pattern_full; int *colorfilter_defined; int group_is_open; double line_width; Pen pen; int fillrule; int linecap; int linejoin; int linestyle; int draw; int fill; } Svg_data; static int init_svg_data(void) { Svg_data *data; int i; data = (Svg_data *) get_curdevice_data(); if (data == NULL) { /* we need to perform the allocations */ data = (Svg_data *) xrealloc(NULL, sizeof(Svg_data)); if (data == NULL) { return RETURN_FAILURE; } data->pattern_defined = NULL; data->pattern_empty = NULL; data->pattern_full = NULL; data->colorfilter_defined = NULL; set_curdevice_data((void *) data); } data->side = MIN2(page_width_pp, page_height_pp); data->pattern_defined = xrealloc(data->pattern_defined, number_of_patterns()*SIZEOF_INT); data->pattern_empty = xrealloc(data->pattern_empty, number_of_patterns()*SIZEOF_INT); data->pattern_full = xrealloc(data->pattern_full, number_of_patterns()*SIZEOF_INT); for (i = 0; i < number_of_patterns(); i++) { data->pattern_defined[i] = FALSE; data->pattern_empty[i] = FALSE; data->pattern_full[i] = FALSE; } svg_updatecmap(); data->group_is_open = FALSE; data->line_width = 0.0; data->pen.color = 0; data->pen.pattern = 0; data->fillrule = 0; data->linecap = 0; data->linejoin = 0; data->linestyle = 0; data->draw = FALSE; data->fill = FALSE; return RETURN_SUCCESS; } /* * SVG conventions : * Y coordinates increase downwards * angles increase clockwise */ /* * scale coordinates, using a SVG-viewer to do this gives rounding-problems */ static double scaleval (double val) { Svg_data *data; data = get_curdevice_data(); return val*data->side; } int register_svg_drv(void) { return register_device(dev_svg); } void svg_updatecmap(void) { int i; Svg_data *data; data = (Svg_data *) get_curdevice_data(); if (data == NULL) { return; } else { data->colorfilter_defined = xrealloc(data->colorfilter_defined, number_of_colors()*SIZEOF_INT); for (i = 0; i < number_of_colors(); i++) { data->colorfilter_defined[i] = FALSE; } } } static void define_pattern(int i, int c, Svg_data *data) { int j, k, l; fRGB *frgb; double bg_red, bg_green, bg_blue; if (data->pattern_defined[i] == TRUE && c < number_of_colors() && data->colorfilter_defined[c] == TRUE) { return; } if (data->pattern_defined[i] != TRUE) { /* testing if the pattern is either empty or full */ data->pattern_empty[i] = TRUE; data->pattern_full[i] = TRUE; for (j = 0; j < 32; j++) { if (pat_bits[i][j] != 0x00) { data->pattern_empty[i] = FALSE; } if (pat_bits[i][j] != 0xff) { data->pattern_full[i] = FALSE; } } } if (data->pattern_empty[i] != TRUE && data->pattern_full[i] != TRUE) { fprintf(prstream, " \n"); /* test if the pattern is already defined. */ if (data->pattern_defined[i] != TRUE) { /* this is an horrible hack ! */ /* we define pixels as squares in vector graphics */ /* first fill the whole pattern */ fprintf(prstream, " \n", i, 16, 16); fprintf(prstream," \n"); for (j = 0; j < 256; j++) { k = j/16; l = j%16; if ((pat_bits[i][j/8] >> (j%8)) & 0x01) { /* the bit is set */ fprintf(prstream, " \n", l, 15-k); } } fprintf(prstream, " \n"); data->pattern_defined[i] = TRUE; } /* test if the needed colorfilter is already defined. */ /* color-patterns can be drawn with black patterns and then applying a colorfilter to change white to the background-color and black to the patterncolor. */ if (c < number_of_colors() && data->colorfilter_defined[c] != TRUE) { frgb = get_frgb(getbgcolor()); bg_red=frgb->red; bg_green=frgb->green; bg_blue=frgb->blue; frgb = get_frgb(c); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n", frgb->red, bg_red); fprintf(prstream, " \n", frgb->green, bg_green); fprintf(prstream, " \n", frgb->blue, bg_blue); fprintf(prstream, " \n"); fprintf(prstream, " \n"); data->colorfilter_defined[c] = TRUE; } fprintf(prstream, " \n"); } } /* * escape special characters */ static char *escape_specials(unsigned char *s, int len) { static char *es = NULL; int i, elen = 0; elen = 0; for (i = 0; i < len; i++) { if (s[i] == '&') { elen += 4; } else if (s[i] == '<' || s[i] == '>') { elen += 3; } elen++; } es = xrealloc(es, (elen + 1)*SIZEOF_CHAR); elen = 0; for (i = 0; i < len; i++) { if (s[i] == '&') { es[elen++] = '&'; es[elen++] = 'a'; es[elen++] = 'm'; es[elen++] = 'p'; es[elen++] = ';'; } else if (s[i] == '<') { es[elen++] = '&'; es[elen++] = 'l'; es[elen++] = 't'; es[elen++] = ';'; } else if (s[i] == '>') { es[elen++] = '&'; es[elen++] = 'g'; es[elen++] = 't'; es[elen++] = ';'; } else { es[elen++] = (char) s[i]; } } es[elen] = '\0'; return (es); } int svginitgraphics(void) { /* device-dependent routines */ devupdatecmap = svg_updatecmap; devdrawpixel = svg_drawpixel; devdrawpolyline = svg_drawpolyline; devfillpolygon = svg_fillpolygon; devdrawarc = svg_drawarc; devfillarc = svg_fillarc; devputpixmap = svg_putpixmap; devputtext = svg_puttext; devleavegraphics = svg_leavegraphics; if (init_svg_data() != RETURN_SUCCESS) { return RETURN_FAILURE; } fprintf(prstream, "\n"); fprintf(prstream, "\n"); fprintf(prstream, "\n", bi_version_string()); /* Let do the SVG-Viewer the conversion of coordinates. */ fprintf(prstream, "\n", page_width_in, page_height_in, 0.0, 0.0, page_width_pp, page_height_pp); fprintf(prstream, " \n", page_height_pp); /* project description */ if (get_project_description() != NULL) { fprintf(prstream, " %s\n", get_project_description()); } return RETURN_SUCCESS; } static void svg_group_props (int draw, int fill) { int i, needs_group; double lw; Pen pen; int fillrule, linecap, linejoin, linestyle; RGB *prgb; int red, green, blue; Svg_data *data; data = (Svg_data *) get_curdevice_data(); /* do we need to redefine a group with new properties ? */ needs_group = (data->group_is_open == TRUE) ? FALSE : TRUE; lw = scaleval(getlinewidth()); fillrule = getfillrule(); linecap = getlinecap(); linejoin = getlinejoin(); linestyle = getlinestyle(); if (fabs(lw - data->line_width) >= 1.0e-6*(1.0 + fabs(data->line_width))) { needs_group = TRUE; } pen = getpen(); if ((pen.color != data->pen.color) || (pen.pattern != data->pen.pattern)) { needs_group = TRUE; } if (fillrule != data->fillrule) { needs_group = TRUE; } if (linecap != data->linecap) { needs_group = TRUE; } if (linejoin != data->linejoin) { needs_group = TRUE; } if (linestyle != data->linestyle) { needs_group = TRUE; } if ((draw != data->draw) || (fill != data->fill)) { needs_group = TRUE; } if (needs_group == TRUE) { /* we need to write the characteristics of the group */ if (data->group_is_open == TRUE) { /* first, we should close the preceding group */ fprintf(prstream, " \n"); data->group_is_open = FALSE; } define_pattern(pen.pattern, pen.color, data); prgb = get_rgb(pen.color); if (prgb != NULL) { red = prgb->red >> (GRACE_BPP - 8); green = prgb->green >> (GRACE_BPP - 8); blue = prgb->blue >> (GRACE_BPP - 8); } else { red = 0; green = 0; blue = 0; } if (fill && data->pattern_empty[pen.pattern] != TRUE) { if (data->pattern_full[pen.pattern] == TRUE) { fprintf(prstream, " \n"); data->group_is_open = TRUE; data->line_width = lw; data->pen = pen; data->fillrule = fillrule; data->linecap = linecap; data->linejoin = linejoin; data->linestyle = linestyle; data->draw = draw; data->fill = fill; } } void svg_drawpixel(VPoint vp) { svg_group_props(FALSE, TRUE); fprintf(prstream, " \n", scaleval(vp.x), scaleval(vp.y), scaleval(1.0), scaleval(1.0)); } void svg_drawpolyline(VPoint *vps, int n, int mode) { int i; if (n <= 0) { return; } svg_group_props(TRUE, FALSE); fprintf(prstream, " \n"); } else { fprintf(prstream, "\"/>\n"); } } void svg_fillpolygon(VPoint *vps, int nc) { int i; if (nc <= 0) { return; } svg_group_props(FALSE, TRUE); fprintf(prstream, " \n"); } void svg_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { VPoint center; double rx, ry; if (a1 == a2) { return; } center.x = 0.5*(vp1.x + vp2.x); center.y = 0.5*(vp1.y + vp2.y); rx = 0.5*fabs(vp2.x - vp1.x); ry = 0.5*fabs(vp2.y - vp1.y); svg_group_props(TRUE, FALSE); if ((a1 - a2)%360 == 0) { fprintf(prstream, " \n", scaleval(rx), scaleval(ry), scaleval(center.x), scaleval(center.y)); } else { VPoint start, end; start.x = center.x + rx*cos((M_PI/180.0)*a1); start.y = center.y + ry*sin((M_PI/180.0)*a1); end.x = center.x + rx*cos((M_PI/180.0)*a2); end.y = center.y + ry*sin((M_PI/180.0)*a2); fprintf(prstream, " \n", scaleval(start.x), scaleval(start.y), scaleval(rx), scaleval(ry), 0, (abs(a2 - a1) > 180) ? 1 : 0, (a2 > a1) ? 1 : 0, scaleval(end.x), scaleval(end.y)); } } void svg_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { VPoint center; double rx, ry; if (a1 == a2) { return; } center.x = 0.5*(vp1.x + vp2.x); center.y = 0.5*(vp1.y + vp2.y); rx = 0.5*fabs(vp2.x - vp1.x); ry = 0.5*fabs(vp2.y - vp1.y); svg_group_props(FALSE, TRUE); if ((a1 - a2)%360 == 0) { fprintf(prstream, " \n", scaleval(rx), scaleval(ry), scaleval(center.x), scaleval(center.y)); } else { VPoint start, end; start.x = center.x + rx*cos((M_PI/180.0)*a1); start.y = center.y + ry*sin((M_PI/180.0)*a1); end.x = center.x + rx*cos((M_PI/180.0)*a2); end.y = center.y + ry*sin((M_PI/180.0)*a2); if (mode == ARCFILL_CHORD) { fprintf(prstream, " \n", scaleval(start.x), scaleval(start.y), scaleval(rx), scaleval(ry), 0, (abs(a2 - a1) > 180) ? 1 : 0, (a2 > a1) ? 1 : 0, scaleval(end.x), scaleval(end.y)); } else { fprintf(prstream, " \n", scaleval(center.x), scaleval(center.y), scaleval(start.x), scaleval(start.y), scaleval(rx), scaleval(ry), 0, (abs(a2 - a1) > 180) ? 1 : 0, (a2 > a1) ? 1 : 0, scaleval(end.x), scaleval(end.y)); } } } void svg_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { /* not implemented yet */ } void svg_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning) { char *fontalias, *fontfullname, *fontweight; char *dash, *family, *familyff; double fsize = scaleval(1); svg_group_props(FALSE, TRUE); fprintf(prstream, " ", tm->cxx, tm->cyx, -tm->cxy, -tm->cyy, scaleval(vp.x), scaleval(vp.y)); fprintf(prstream, escape_specials((unsigned char *) s, len)); fprintf(prstream, "\n"); } void svg_leavegraphics(void) { Svg_data *data; data = (Svg_data *) get_curdevice_data(); if (data->group_is_open == TRUE) { fprintf(prstream, " \n"); data->group_is_open = FALSE; } fprintf(prstream, " \n"); fprintf(prstream, "\n"); } grace-5.1.23/src/motifutils.c0000644000076500001440000032743011331377067015603 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * utilities for Motif * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WITH_EDITRES # include #endif #if XmVersion < 2000 # define XmStringConcatAndFree(a, b) XmStringConcat(a, b); XmStringFree(a); XmStringFree(b) #endif #include "Tab.h" #include "motifinc.h" #include "defines.h" #include "globals.h" #include "draw.h" #include "patterns.h" #include "jbitmaps.h" #include "t1fonts.h" #include "graphs.h" #include "utils.h" #include "events.h" #include "parser.h" #include "protos.h" static XmStringCharSet charset = XmFONTLIST_DEFAULT_TAG; /* lookup table to determine if character is a floating point digit * only allowable char's [0-9.eE] */ unsigned char fpdigit[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; extern Display *disp; extern Window root; extern int depth; extern XtAppContext app_con; extern unsigned long xvlibcolors[]; static OptionItem *color_option_items = NULL; static int ncolor_option_items = 0; static OptionStructure **color_selectors = NULL; static int ncolor_selectors = 0; static char *label_to_resname(const char *s, const char *suffix) { char *retval, *rs; int capitalize = FALSE; retval = copy_string(NULL, s); rs = retval; while (*s) { if (isalnum(*s)) { if (capitalize == TRUE) { *rs = toupper(*s); capitalize = FALSE; } else { *rs = tolower(*s); } rs++; } else { capitalize = TRUE; } s++; } *rs = '\0'; if (suffix != NULL) { retval = concat_strings(retval, suffix); } return retval; } void ManageChild(Widget w) { XtManageChild(w); } void UnmanageChild(Widget w) { XtUnmanageChild(w); } void SetSensitive(Widget w, int onoff) { XtSetSensitive(w, onoff ? True : False); } Widget GetParent(Widget w) { if (w) { return (XtParent(w)); } else { errmsg("Internal error: GetParent() called with NULL widget"); return NULL; } } void RegisterEditRes(Widget shell) { #ifdef WITH_EDITRES XtAddEventHandler(shell, (EventMask) 0, True, _XEditResCheckMessages, NULL); #endif } void SetDimensions(Widget w, unsigned int width, unsigned int height) { XtVaSetValues(w, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, NULL); } void GetDimensions(Widget w, unsigned int *width, unsigned int *height) { Dimension ww, wh; XtVaGetValues(w, XmNwidth, &ww, XmNheight, &wh, NULL); *width = (unsigned int) ww; *height = (unsigned int) wh; } #define MAX_PULLDOWN_LENGTH 30 OptionStructure *CreateOptionChoice(Widget parent, char *labelstr, int ncols, int nchoices, OptionItem *items) { Arg args[2]; XmString str; OptionStructure *retval; retval = xmalloc(sizeof(OptionStructure)); XtSetArg(args[0], XmNpacking, XmPACK_COLUMN); retval->pulldown = XmCreatePulldownMenu(parent, "pulldownMenu", args, 1); retval->ncols = ncols; retval->nchoices = 0; retval->options = NULL; UpdateOptionChoice(retval, nchoices, items); str = XmStringCreateLocalized(labelstr); XtSetArg(args[0], XmNlabelString, str); XtSetArg(args[1], XmNsubMenuId, retval->pulldown); retval->menu = XmCreateOptionMenu(parent, "optionMenu", args, 2); XmStringFree(str); XtManageChild(retval->menu); return retval; } void UpdateOptionChoice(OptionStructure *optp, int nchoices, OptionItem *items) { int i, nold, ncols, nw; Widget *wlist; nold = optp->nchoices; if (optp->ncols == 0) { ncols = 1; } else { ncols = optp->ncols; } /* Don't create too tall pulldowns */ if (nchoices > MAX_PULLDOWN_LENGTH*ncols) { ncols = (nchoices + MAX_PULLDOWN_LENGTH - 1)/MAX_PULLDOWN_LENGTH; } XtVaSetValues(optp->pulldown, XmNnumColumns, ncols, NULL); nw = nold - nchoices; if (nw > 0) { /* Unmanage extra items before destroying to speed the things up */ wlist = xmalloc(nw*sizeof(Widget)); for (i = nchoices; i < nold; i++) { wlist[i - nchoices] = optp->options[i].widget; } XtUnmanageChildren(wlist, nw); xfree(wlist); for (i = nchoices; i < nold; i++) { XtDestroyWidget(optp->options[i].widget); } } optp->options = xrealloc(optp->options, nchoices*sizeof(OptionWidgetItem)); optp->nchoices = nchoices; for (i = nold; i < nchoices; i++) { optp->options[i].widget = XmCreatePushButton(optp->pulldown, "button", NULL, 0); } for (i = 0; i < nchoices; i++) { optp->options[i].value = items[i].value; if (items[i].label != NULL) { XmString str, ostr; XtVaGetValues(optp->options[i].widget, XmNlabelString, &ostr, NULL); str = XmStringCreateLocalized(items[i].label); if (XmStringCompare(str, ostr) != True) { XtVaSetValues(optp->options[i].widget, XmNlabelString, str, NULL); } XmStringFree(str); } } nw = nchoices - nold; if (nw > 0) { wlist = xmalloc(nw*sizeof(Widget)); for (i = nold; i < nchoices; i++) { wlist[i - nold] = optp->options[i].widget; } XtManageChildren(wlist, nw); xfree(wlist); } } OptionStructure *CreateBitmapOptionChoice(Widget parent, char *labelstr, int ncols, int nchoices, int width, int height, BitmapOptionItem *items) { int i; XmString str; OptionStructure *retval; Pixel fg, bg; Pixmap ptmp; retval = xmalloc(sizeof(OptionStructure)); if (retval == NULL) { errmsg("Malloc error in CreateBitmapOptionChoice()"); } retval->nchoices = nchoices; retval->options = xmalloc(nchoices*sizeof(OptionWidgetItem)); if (retval->options == NULL) { errmsg("Malloc error in CreateBitmapOptionChoice()"); XCFREE(retval); return retval; } retval->pulldown = XmCreatePulldownMenu(parent, "pulldownMenu", NULL, 0); XtVaSetValues(retval->pulldown, XmNentryAlignment, XmALIGNMENT_CENTER, NULL); if (ncols > 0) { XtVaSetValues(retval->pulldown, XmNpacking, XmPACK_COLUMN, XmNnumColumns, ncols, NULL); } XtVaGetValues(retval->pulldown, XmNforeground, &fg, XmNbackground, &bg, NULL); for (i = 0; i < nchoices; i++) { retval->options[i].value = items[i].value; if (items[i].bitmap != NULL) { ptmp = XCreatePixmapFromBitmapData(disp, root, (char *) items[i].bitmap, width, height, fg, bg, depth); retval->options[i].widget = XtVaCreateWidget("pixButton", xmPushButtonWidgetClass, retval->pulldown, XmNlabelType, XmPIXMAP, XmNlabelPixmap, ptmp, NULL); } else { retval->options[i].widget = XmCreatePushButton(retval->pulldown, "None", NULL, 0); } } for (i = 0; i < nchoices; i++) { XtManageChild(retval->options[i].widget); } retval->menu = XmCreateOptionMenu(parent, "optionMenu", NULL, 0); str = XmStringCreateLocalized(labelstr); XtVaSetValues(retval->menu, XmNlabelString, str, XmNsubMenuId, retval->pulldown, NULL); XmStringFree(str); XtManageChild(retval->menu); return retval; } void SetOptionChoice(OptionStructure *opt, int value) { int i; Arg a; if (opt->options == NULL || opt->nchoices <= 0) { return; } for (i = 0; i < opt->nchoices; i++) { if (opt->options[i].value == value) { XtSetArg(a, XmNmenuHistory, opt->options[i].widget); XtSetValues(opt->menu, &a, 1); return; } } } int GetOptionChoice(OptionStructure *opt) { Arg a; Widget warg; int i; if (opt->options == NULL || opt->nchoices <= 0) { errmsg("Internal error in GetOptionChoice()"); return 0; } XtSetArg(a, XmNmenuHistory, &warg); XtGetValues(opt->menu, &a, 1); for (i = 0; i < opt->nchoices; i++) { if (opt->options[i].widget == warg) { return(opt->options[i].value); } } errmsg("Internal error in GetOptionChoice()"); return 0; } typedef struct { OptionStructure *opt; void (*cbproc)(); void *anydata; } OC_CBdata; static void oc_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { int value; OC_CBdata *cbdata = (OC_CBdata *) client_data; value = GetOptionChoice(cbdata->opt); cbdata->cbproc(value, cbdata->anydata); } void AddOptionChoiceCB(OptionStructure *opt, OC_CBProc cbproc, void *anydata) { OC_CBdata *cbdata; int i; cbdata = xmalloc(sizeof(OC_CBdata)); cbdata->opt = opt; cbdata->cbproc = cbproc; cbdata->anydata = anydata; for (i = 0; i < opt->nchoices; i++) { XtAddCallback(opt->options[i].widget, XmNactivateCallback, oc_int_cb_proc, (XtPointer) cbdata); } } static char list_translation_table[] = "\ CtrlA: list_selectall_action()\n\ CtrlU: list_unselectall_action()\n\ CtrlI: list_invertselection_action()"; ListStructure *CreateListChoice(Widget parent, char *labelstr, int type, int nvisible, int nchoices, OptionItem *items) { Arg args[4]; Widget lab; ListStructure *retval; retval = xmalloc(sizeof(ListStructure)); retval->rc = XmCreateRowColumn(parent, "rcList", NULL, 0); AddHelpCB(retval->rc, "doc/UsersGuide.html#list-selector"); lab = XmCreateLabel(retval->rc, labelstr, NULL, 0); XtManageChild(lab); XtSetArg(args[0], XmNlistSizePolicy, XmCONSTANT); XtSetArg(args[1], XmNscrollBarDisplayPolicy, XmSTATIC); if (type == LIST_TYPE_SINGLE) { XtSetArg(args[2], XmNselectionPolicy, XmSINGLE_SELECT); } else { XtSetArg(args[2], XmNselectionPolicy, XmEXTENDED_SELECT); } XtSetArg(args[3], XmNvisibleItemCount, nvisible); retval->list = XmCreateScrolledList(retval->rc, "listList", args, 4); retval->values = NULL; XtOverrideTranslations(retval->list, XtParseTranslationTable(list_translation_table)); UpdateListChoice(retval, nchoices, items); XtManageChild(retval->list); XtManageChild(retval->rc); return retval; } void UpdateListChoice(ListStructure *listp, int nchoices, OptionItem *items) { int i, nsel; int *selvalues; XmString str; if (listp == NULL) { return; } nsel = GetListChoices(listp, &selvalues); listp->nchoices = nchoices; listp->values = xrealloc(listp->values, nchoices*SIZEOF_INT); for (i = 0; i < nchoices; i++) { listp->values[i] = items[i].value; } XmListDeleteAllItems(listp->list); for (i = 0; i < nchoices; i++) { str = XmStringCreateLocalized(items[i].label); XmListAddItemUnselected(listp->list, str, 0); XmStringFree(str); } SelectListChoices(listp, nsel, selvalues); if (nsel > 0) { xfree(selvalues); } } int SelectListChoice(ListStructure *listp, int choice) { int top, visible; int i = 0; while (i < listp->nchoices && listp->values[i] != choice) { i++; } if (i < listp->nchoices) { i++; XmListDeselectAllItems(listp->list); XmListSelectPos(listp->list, i, True); XtVaGetValues(listp->list, XmNtopItemPosition, &top, XmNvisibleItemCount, &visible, NULL); if (i < top) { XmListSetPos(listp->list, i); } else if (i >= top + visible) { XmListSetBottomPos(listp->list, i); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } void SelectListChoices(ListStructure *listp, int nchoices, int *choices) { int i = 0, j; unsigned char selection_type_save; int bottom, visible; XtVaGetValues(listp->list, XmNselectionPolicy, &selection_type_save, NULL); XtVaSetValues(listp->list, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL); XmListDeselectAllItems(listp->list); for (j = 0; j < nchoices; j++) { i = 0; while (i < listp->nchoices && listp->values[i] != choices[j]) { i++; } if (i < listp->nchoices) { i++; XmListSelectPos(listp->list, i, True); } } if (nchoices > 0) { /* Rewind list so the last choice is always visible */ XtVaGetValues(listp->list, XmNtopItemPosition, &bottom, XmNvisibleItemCount, &visible, NULL); if (i > bottom) { XmListSetBottomPos(listp->list, i); } else if (i <= bottom - visible) { XmListSetPos(listp->list, i); } } XtVaSetValues(listp->list, XmNselectionPolicy, selection_type_save, NULL); } int GetListChoices(ListStructure *listp, int **values) { int i, n; if (XmListGetSelectedPos(listp->list, values, &n) != True) { return 0; } for (i = 0; i < n; i++) { (*values)[i] = listp->values[(*values)[i] - 1]; } return n; } int GetSingleListChoice(ListStructure *listp, int *value) { int n, *values, retval; n = GetListChoices(listp, &values); if (n == 1) { *value = values[0]; retval = RETURN_SUCCESS; } else { retval = RETURN_FAILURE; } if (n > 0) { xfree(values); } return retval; } typedef struct { ListStructure *listp; void (*cbproc)(); void *anydata; } List_CBdata; static void list_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { int n, *values; List_CBdata *cbdata = (List_CBdata *) client_data; n = GetListChoices(cbdata->listp, &values); cbdata->cbproc(n, values, cbdata->anydata); if (n > 0) { xfree(values); } } void AddListChoiceCB(ListStructure *listp, List_CBProc cbproc, void *anydata) { List_CBdata *cbdata; cbdata = xmalloc(sizeof(List_CBdata)); cbdata->listp = listp; cbdata->cbproc = (List_CBProc) cbproc; cbdata->anydata = anydata; XtAddCallback(listp->list, XmNsingleSelectionCallback, list_int_cb_proc, (XtPointer) cbdata); XtAddCallback(listp->list, XmNmultipleSelectionCallback, list_int_cb_proc, (XtPointer) cbdata); XtAddCallback(listp->list, XmNextendedSelectionCallback, list_int_cb_proc, (XtPointer) cbdata); } static void spin_arrow_cb(Widget w, XtPointer client_data, XtPointer call_data) { SpinStructure *spinp; double value, incr; spinp = (SpinStructure *) client_data; value = GetSpinChoice(spinp); incr = spinp->incr; if (w == spinp->arrow_up) { incr = spinp->incr; } else if (w == spinp->arrow_down) { incr = -spinp->incr; } else { errmsg("Wrong call to spin_arrow_cb()"); return; } value += incr; SetSpinChoice(spinp, value); } SpinStructure *CreateSpinChoice(Widget parent, char *s, int len, int type, double min, double max, double incr) { SpinStructure *retval; Widget fr, form; XmString str; if (min >= max) { errmsg("min >= max in CreateSpinChoice()!"); return NULL; } retval = xmalloc(sizeof(SpinStructure)); retval->type = type; retval->min = min; retval->max = max; retval->incr = incr; retval->rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, parent, XmNorientation, XmHORIZONTAL, NULL); str = XmStringCreateLocalized(s); XtVaCreateManagedWidget("label", xmLabelWidgetClass, retval->rc, XmNlabelString, str, NULL); XmStringFree(str); fr = XtVaCreateWidget("fr", xmFrameWidgetClass, retval->rc, XmNshadowType, XmSHADOW_ETCHED_OUT, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, fr, NULL); retval->text = XtVaCreateWidget("text", xmTextWidgetClass, form, XmNtraversalOn, True, XmNcolumns, len, NULL); retval->arrow_up = XtVaCreateWidget("form", xmArrowButtonGadgetClass, form, XmNarrowDirection, XmARROW_UP, NULL); XtAddCallback(retval->arrow_up, XmNactivateCallback, spin_arrow_cb, (XtPointer) retval); retval->arrow_down = XtVaCreateWidget("form", xmArrowButtonGadgetClass, form, XmNarrowDirection, XmARROW_DOWN, NULL); XtAddCallback(retval->arrow_down, XmNactivateCallback, spin_arrow_cb, (XtPointer) retval); XtVaSetValues(retval->text, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(retval->arrow_down, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, retval->text, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(retval->arrow_up, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, retval->arrow_down, NULL); XtManageChild(retval->text); XtManageChild(retval->arrow_up); XtManageChild(retval->arrow_down); XtManageChild(form); XtManageChild(fr); XtManageChild(retval->rc); return retval; } void SetSpinChoice(SpinStructure *spinp, double value) { char buf[64]; if (value < spinp->min) { XBell(disp, 50); value = spinp->min; } else if (value > spinp->max) { XBell(disp, 50); value = spinp->max; } if (spinp->type == SPIN_TYPE_FLOAT) { sprintf(buf, "%g", value); } else { sprintf(buf, "%d", (int) rint(value)); } XmTextSetString(spinp->text, buf); } double GetSpinChoice(SpinStructure *spinp) { double retval; xv_evalexpr(spinp->text, &retval); if (retval < spinp->min) { errmsg("Input value below min limit in GetSpinChoice()"); retval = spinp->min; SetSpinChoice(spinp, retval); } else if (retval > spinp->max) { errmsg("Input value above max limit in GetSpinChoice()"); retval = spinp->max; SetSpinChoice(spinp, retval); } if (spinp->type == SPIN_TYPE_INT) { return rint(retval); } else { return retval; } } TextStructure *CreateTextInput(Widget parent, char *s) { TextStructure *retval; XmString str; retval = xmalloc(sizeof(TextStructure)); retval->form = XtVaCreateWidget("form", xmFormWidgetClass, parent, NULL); str = XmStringCreateLocalized(s); retval->label = XtVaCreateManagedWidget("label", xmLabelWidgetClass, retval->form, XmNlabelString, str, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XmStringFree(str); retval->text = XtVaCreateManagedWidget("cstext", xmTextWidgetClass, retval->form, XmNtraversalOn, True, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, retval->label, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(retval->form); return retval; } void cstext_edit_action(Widget w, XEvent *e, String *par, Cardinal *npar) { create_fonttool(w); } static char cstext_translation_table[] = "\ CtrlE: cstext_edit_action()"; TextStructure *CreateCSText(Widget parent, char *s) { TextStructure *retval; retval = CreateTextInput(parent, s); XtOverrideTranslations(retval->text, XtParseTranslationTable(cstext_translation_table)); return retval; } char *GetTextString(TextStructure *cst) { static char *buf = NULL; char *s; s = XmTextGetString(cst->text); buf = copy_string(buf, s); XtFree(s); return buf; } void SetTextString(TextStructure *cst, char *s) { XmTextSetString(cst->text, s ? s : ""); } typedef struct { void (*cbproc)(); void *anydata; } Text_CBdata; static void text_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { Text_CBdata *cbdata = (Text_CBdata *) client_data; cbdata->cbproc(cbdata->anydata); } void AddTextInputCB(TextStructure *cst, Text_CBProc cbproc, void *data) { Text_CBdata *cbdata; cbdata = xmalloc(sizeof(Text_CBdata)); cbdata->anydata = data; cbdata->cbproc = cbproc; XtAddCallback(cst->text, XmNactivateCallback, text_int_cb_proc, (XtPointer) cbdata); } int GetTextCursorPos(TextStructure *cst) { return XmTextGetInsertionPosition(cst->text); } void TextInsert(TextStructure *cst, int pos, char *s) { XmTextInsert(cst->text, pos, s); } typedef struct { void (*cbproc)(); void *anydata; } Button_CBdata; Widget CreateButton(Widget parent, char *label) { Widget button; XmString xmstr; xmstr = XmStringCreateLocalized(label); button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, parent, XmNalignment, XmALIGNMENT_CENTER, XmNlabelString, xmstr, /* * XmNmarginLeft, 5, * XmNmarginRight, 5, * XmNmarginTop, 3, * XmNmarginBottom, 2, */ NULL); XmStringFree(xmstr); return button; } Widget CreateBitmapButton(Widget parent, int width, int height, const unsigned char *bits) { Widget button; Pixmap pm; Pixel fg, bg; button = XtVaCreateManagedWidget("button", xmPushButtonWidgetClass, parent, XmNlabelType, XmPIXMAP, NULL); /* * We need to get right fore- and background colors for pixmap. */ XtVaGetValues(button, XmNforeground, &fg, XmNbackground, &bg, NULL); pm = XCreatePixmapFromBitmapData(disp, root, (char *) bits, width, height, fg, bg, depth); XtVaSetValues(button, XmNlabelPixmap, pm, NULL); return button; } static void button_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { Button_CBdata *cbdata = (Button_CBdata *) client_data; cbdata->cbproc(cbdata->anydata); } void AddButtonCB(Widget button, Button_CBProc cbproc, void *data) { Button_CBdata *cbdata; cbdata = xmalloc(sizeof(Button_CBdata)); cbdata->anydata = data; cbdata->cbproc = cbproc; XtAddCallback(button, XmNactivateCallback, button_int_cb_proc, (XtPointer) cbdata); } static void fsb_setcwd_cb(void *data) { char *bufp; XmString directory; Widget fsb = (Widget) data; XtVaGetValues(fsb, XmNdirectory, &directory, NULL); bufp = GetStringSimple(directory); XmStringFree(directory); if (bufp != NULL) { set_workingdir(bufp); XtFree(bufp); } } #define FSB_CWD 0 #define FSB_HOME 1 #define FSB_ROOT 2 #define FSB_CYGDRV 3 static void fsb_cd_cb(int value, void *data) { char *bufp; XmString dir, pattern, dirmask; Widget FSB = (Widget) data; switch (value) { case FSB_CWD: bufp = get_workingdir(); break; case FSB_HOME: bufp = get_userhome(); break; case FSB_ROOT: bufp = "/"; break; case FSB_CYGDRV: bufp = "/cygdrive/"; break; default: return; } XtVaGetValues(FSB, XmNpattern, &pattern, NULL); dir = XmStringCreateLocalized(bufp); dirmask = XmStringConcatAndFree(dir, pattern); XmFileSelectionDoSearch(FSB, dirmask); XmStringFree(dirmask); } static OptionItem fsb_items[] = { {FSB_CWD, "Cwd"}, {FSB_HOME, "Home"}, {FSB_ROOT, "/"} #ifdef __CYGWIN__ ,{FSB_CYGDRV, "My Computer"} #endif }; #define FSB_ITEMS_NUM sizeof(fsb_items)/sizeof(OptionItem) #if XmVersion >= 2000 static void show_hidden_cb(int onoff, void *data) { FSBStructure *fsb = (FSBStructure *) data; XtVaSetValues(fsb->FSB, XmNfileFilterStyle, onoff ? XmFILTER_NONE:XmFILTER_HIDDEN_FILES, NULL); } #endif FSBStructure *CreateFileSelectionBox(Widget parent, char *s) { FSBStructure *retval; OptionStructure *opt; Widget fr, form, button; XmString xmstr; char *bufp, *resname; retval = xmalloc(sizeof(FSBStructure)); resname = label_to_resname(s, "FSB"); retval->FSB = XmCreateFileSelectionDialog(parent, resname, NULL, 0); xfree(resname); retval->dialog = XtParent(retval->FSB); handle_close(retval->dialog); bufp = copy_string(NULL, "Grace: "); bufp = concat_strings(bufp, s); XtVaSetValues(retval->dialog, XmNtitle, bufp, NULL); xfree(bufp); xmstr = XmStringCreateLocalized(get_workingdir()); XtVaSetValues(retval->FSB, XmNdirectory, xmstr, NULL); XmStringFree(xmstr); XtAddCallback(retval->FSB, XmNcancelCallback, destroy_dialog, retval->dialog); AddHelpCB(retval->FSB, "doc/UsersGuide.html#FS-dialog"); retval->rc = XmCreateRowColumn(retval->FSB, "rc", NULL, 0); #if XmVersion >= 2000 button = CreateToggleButton(retval->rc, "Show hidden files"); AddToggleButtonCB(button, show_hidden_cb, retval); XtVaSetValues(retval->FSB, XmNfileFilterStyle, XmFILTER_HIDDEN_FILES, NULL); #endif fr = CreateFrame(retval->rc, NULL); form = XtVaCreateWidget("form", xmFormWidgetClass, fr, NULL); opt = CreateOptionChoice(form, "Chdir to:", 1, FSB_ITEMS_NUM, fsb_items); AddOptionChoiceCB(opt, fsb_cd_cb, (void *) retval->FSB); button = CreateButton(form, "Set as cwd"); AddButtonCB(button, fsb_setcwd_cb, (void *) retval->FSB); XtVaSetValues(opt->menu, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, NULL); XtVaSetValues(button, XmNleftAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(form); XtManageChild(retval->rc); return retval; } typedef struct { FSBStructure *fsb; int (*cbproc)(); void *anydata; } FSB_CBdata; static void fsb_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { char *s; int ok; FSB_CBdata *cbdata = (FSB_CBdata *) client_data; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *) call_data; s = GetStringSimple(cbs->value); if (s == NULL) { errmsg("Error converting XmString to char string"); return; } set_wait_cursor(); ok = cbdata->cbproc(s, cbdata->anydata); XtFree(s); if (ok) { XtUnmanageChild(cbdata->fsb->dialog); } unset_wait_cursor(); } void AddFileSelectionBoxCB(FSBStructure *fsb, FSB_CBProc cbproc, void *anydata) { FSB_CBdata *cbdata; cbdata = xmalloc(sizeof(FSB_CBdata)); cbdata->fsb = fsb; cbdata->cbproc = (FSB_CBProc) cbproc; cbdata->anydata = anydata; XtAddCallback(fsb->FSB, XmNokCallback, fsb_int_cb_proc, (XtPointer) cbdata); } void SetFileSelectionBoxPattern(FSBStructure *fsb, char *pattern) { XmString xmstr; if (pattern != NULL) { xmstr = XmStringCreateLocalized(pattern); XtVaSetValues(fsb->FSB, XmNpattern, xmstr, NULL); XmStringFree(xmstr); } } Widget CreateLabel(Widget parent, char *s) { Widget label; label = XtVaCreateManagedWidget(s, xmLabelWidgetClass, parent, XmNalignment, XmALIGNMENT_BEGINNING, XmNrecomputeSize, True, NULL); return label; } void AlignLabel(Widget w, int alignment) { unsigned char xm_alignment; switch(alignment) { case ALIGN_BEGINNING: xm_alignment = XmALIGNMENT_BEGINNING; break; case ALIGN_CENTER: xm_alignment = XmALIGNMENT_CENTER; break; case ALIGN_END: xm_alignment = XmALIGNMENT_END; break; default: errmsg("Internal error in AlignLabel()"); return; break; } XtVaSetValues(w, XmNalignment, xm_alignment, NULL); } static OptionItem *font_option_items; static OptionItem *settype_option_items; static BitmapOptionItem *pattern_option_items; static BitmapOptionItem *lines_option_items; #define LINES_BM_HEIGHT 15 #define LINES_BM_WIDTH 64 int init_option_menus(void) { int i, j, k, l, n; n = number_of_fonts(); font_option_items = xmalloc(n*sizeof(OptionItem)); if (font_option_items == NULL) { errmsg("Malloc error in init_option_menus()"); return RETURN_FAILURE; } for (i = 0; i < n; i++) { font_option_items[i].value = i; font_option_items[i].label = get_fontalias(i); } n = number_of_patterns(); pattern_option_items = xmalloc(n*sizeof(BitmapOptionItem)); if (pattern_option_items == NULL) { errmsg("Malloc error in init_option_menus()"); xfree(font_option_items); return RETURN_FAILURE; } for (i = 0; i < n; i++) { pattern_option_items[i].value = i; if (i == 0) { pattern_option_items[i].bitmap = NULL; } else { pattern_option_items[i].bitmap = pat_bits[i]; } } n = number_of_linestyles(); lines_option_items = xmalloc(n*sizeof(BitmapOptionItem)); if (lines_option_items == NULL) { errmsg("Malloc error in init_option_menus()"); xfree(pattern_option_items); xfree(font_option_items); return RETURN_FAILURE; } for (i = 0; i < n; i++) { lines_option_items[i].value = i; if (i == 0) { lines_option_items[i].bitmap = NULL; continue; } lines_option_items[i].bitmap = xcalloc(LINES_BM_HEIGHT*LINES_BM_WIDTH/8/SIZEOF_CHAR, SIZEOF_CHAR); k = LINES_BM_WIDTH*(LINES_BM_HEIGHT/2); while (k < LINES_BM_WIDTH*(LINES_BM_HEIGHT/2 + 1)) { for (j = 0; j < dash_array_length[i]; j++) { for (l = 0; l < dash_array[i][j]; l++) { if (k < LINES_BM_WIDTH*(LINES_BM_HEIGHT/2 + 1)) { if (j % 2 == 0) { /* black */ lines_option_items[i].bitmap[k/8] |= 1 << k % 8; } k++; } } } } } settype_option_items = xmalloc(NUMBER_OF_SETTYPES*sizeof(OptionItem)); if (settype_option_items == NULL) { errmsg("Malloc error in init_option_menus()"); return RETURN_FAILURE; } for (i = 0; i < NUMBER_OF_SETTYPES; i++) { settype_option_items[i].value = i; settype_option_items[i].label = copy_string(NULL, set_types(i)); lowtoupper(settype_option_items[i].label); } return RETURN_SUCCESS; } OptionStructure *CreateFontChoice(Widget parent, char *s) { return (CreateOptionChoice(parent, s, 0, number_of_fonts(), font_option_items)); } OptionStructure *CreatePatternChoice(Widget parent, char *s) { return (CreateBitmapOptionChoice(parent, s, 4, number_of_patterns(), 16, 16, pattern_option_items)); } OptionStructure *CreateLineStyleChoice(Widget parent, char *s) { return (CreateBitmapOptionChoice(parent, s, 0, number_of_linestyles(), LINES_BM_WIDTH, LINES_BM_HEIGHT, lines_option_items)); } OptionStructure *CreateSetTypeChoice(Widget parent, char *s) { return (CreateOptionChoice(parent, s, 0, NUMBER_OF_SETTYPES, settype_option_items)); } static BitmapOptionItem just_option_items[12] = { {JUST_LEFT |JUST_BLINE , j_lm_o_bits}, {JUST_CENTER|JUST_BLINE , j_cm_o_bits}, {JUST_RIGHT |JUST_BLINE , j_rm_o_bits}, {JUST_LEFT |JUST_BOTTOM, j_lb_b_bits}, {JUST_CENTER|JUST_BOTTOM, j_cb_b_bits}, {JUST_RIGHT |JUST_BOTTOM, j_rb_b_bits}, {JUST_LEFT |JUST_MIDDLE, j_lm_b_bits}, {JUST_CENTER|JUST_MIDDLE, j_cm_b_bits}, {JUST_RIGHT |JUST_MIDDLE, j_rm_b_bits}, {JUST_LEFT |JUST_TOP , j_lt_b_bits}, {JUST_CENTER|JUST_TOP , j_ct_b_bits}, {JUST_RIGHT |JUST_TOP , j_rt_b_bits} }; OptionStructure *CreateJustChoice(Widget parent, char *s) { return (CreateBitmapOptionChoice(parent, s, 4, 12, JBITMAP_WIDTH, JBITMAP_HEIGHT, just_option_items)); } RestrictionStructure *CreateRestrictionChoice(Widget parent, char *s) { RestrictionStructure *retval; Widget rc; OptionItem restr_items[7]; restr_items[0].value = RESTRICT_NONE; restr_items[0].label = "None"; restr_items[1].value = RESTRICT_REG0; restr_items[1].label = "Region 0"; restr_items[2].value = RESTRICT_REG1; restr_items[2].label = "Region 1"; restr_items[3].value = RESTRICT_REG2; restr_items[3].label = "Region 2"; restr_items[4].value = RESTRICT_REG3; restr_items[4].label = "Region 3"; restr_items[5].value = RESTRICT_REG4; restr_items[5].label = "Region 4"; restr_items[6].value = RESTRICT_WORLD; restr_items[6].label = "Inside graph"; retval = xmalloc(sizeof(RestrictionStructure)); retval->frame = CreateFrame(parent, s); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, retval->frame, XmNorientation, XmHORIZONTAL, NULL); retval->r_sel = CreateOptionChoice(rc, "Restriction:", 1, 7, restr_items); retval->negate = CreateToggleButton(rc, "Negated"); XtManageChild(rc); return retval; } static OptionItem *graph_select_items = NULL; static int ngraph_select_items = 0; static ListStructure **graph_selectors = NULL; static int ngraph_selectors = 0; void graph_select_cb(Widget list, XtPointer client_data, XtPointer call_data) { XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data; ListStructure *plist = (ListStructure *) client_data; int gno; gno = plist->values[cbs->item_position - 1]; switch_current_graph(gno); } void update_graph_selectors(void) { int i, new_n = number_of_graphs(); char buf[64]; OptionItem *p; for (i = 0; i < ngraph_select_items; i++) { xfree(graph_select_items[i].label); } p = xrealloc(graph_select_items, new_n*sizeof(OptionItem)); if (p == NULL && new_n != 0) { ngraph_select_items = 0; return; } else { graph_select_items = p; } for (i = 0; i < new_n; i++) { graph_select_items[i].value = i; sprintf(buf, "(%c) G%d (%d sets)", is_graph_hidden(i) ? '-':'+', i, number_of_sets(i)); graph_select_items[i].label = copy_string(NULL, buf); } ngraph_select_items = new_n; for (i = 0; i < ngraph_selectors; i++) { UpdateListChoice(graph_selectors[i], ngraph_select_items, graph_select_items); } } typedef struct { Widget popup; Widget label_item; Widget focus_item; Widget hide_item; Widget show_item; Widget duplicate_item; Widget kill_item; Widget copy12_item; Widget copy21_item; Widget move12_item; Widget move21_item; Widget swap_item; } GraphPopupMenu; typedef enum { GraphMenuFocusCB, GraphMenuHideCB, GraphMenuShowCB, GraphMenuDuplicateCB, GraphMenuKillCB, GraphMenuCopy12CB, GraphMenuCopy21CB, GraphMenuMove12CB, GraphMenuMove21CB, GraphMenuSwapCB, GraphMenuNewCB } GraphMenuCBtype; void graph_menu_cb(ListStructure *listp, GraphMenuCBtype type) { int err = FALSE; int i, n, *values; char buf[32]; n = GetListChoices(listp, &values); switch (type) { case GraphMenuFocusCB: if (n == 1) { switch_current_graph(values[0]); } else { err = TRUE; } break; case GraphMenuHideCB: if (n > 0) { for (i = 0; i < n; i++) { set_graph_hidden(values[i], TRUE); } } else { err = TRUE; } break; case GraphMenuShowCB: if (n > 0) { for (i = 0; i < n; i++) { set_graph_hidden(values[i], FALSE); } } else { err = TRUE; } break; case GraphMenuDuplicateCB: if (n > 0) { for (i = 0; i < n; i++) { duplicate_graph(values[i]); } } else { err = TRUE; } break; case GraphMenuKillCB: if (n > 0) { if (yesno("Kill selected graph(s)?", NULL, NULL, NULL)) { for (i = n - 1; i >= 0; i--) { kill_graph(values[i]); } } } else { err = TRUE; } break; case GraphMenuCopy12CB: if (n == 2) { sprintf(buf, "Overwrite G%d?", values[1]); if (yesno(buf, NULL, NULL, NULL)) { copy_graph(values[0], values[1]); } } else { err = TRUE; } break; case GraphMenuCopy21CB: if (n == 2) { sprintf(buf, "Overwrite G%d?", values[0]); if (yesno(buf, NULL, NULL, NULL)) { copy_graph(values[1], values[0]); } } else { err = TRUE; } break; case GraphMenuMove12CB: if (n == 2) { sprintf(buf, "Replace G%d?", values[1]); if (yesno(buf, NULL, NULL, NULL)) { move_graph(values[0], values[1]); } } else { err = TRUE; } break; case GraphMenuMove21CB: if (n == 2) { sprintf(buf, "Replace G%d?", values[0]); if (yesno(buf, NULL, NULL, NULL)) { move_graph(values[1], values[0]); } } else { err = TRUE; } break; case GraphMenuSwapCB: if (n == 2) { swap_graph(values[0], values[1]); } else { err = TRUE; } break; case GraphMenuNewCB: set_graph_active(number_of_graphs()); break; default: err = TRUE; break; } if (n > 0) { xfree(values); } if (err == FALSE) { update_all(); xdrawgraph(); } } void switch_focus_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuFocusCB); } void hide_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuHideCB); } void show_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuShowCB); } void duplicate_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuDuplicateCB); } void kill_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuKillCB); } void copy12_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuCopy12CB); } void copy21_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuCopy21CB); } void move12_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuMove12CB); } void move21_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuMove21CB); } void swap_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuSwapCB); } void create_new_graph_proc(void *data) { graph_menu_cb((ListStructure *) data, GraphMenuNewCB); } GraphPopupMenu *CreateGraphPopupEntries(ListStructure *listp) { GraphPopupMenu *graph_popup_menu; Widget popup; graph_popup_menu = xmalloc(sizeof(GraphPopupMenu)); popup = XmCreatePopupMenu(listp->list, "graphPopupMenu", NULL, 0); #if XmVersion >= 2000 XtVaSetValues(popup, XmNpopupEnabled, XmPOPUP_DISABLED, NULL); #else XtVaSetValues(popup, XmNpopupEnabled, False, NULL); #endif graph_popup_menu->popup = popup; graph_popup_menu->label_item = CreateMenuLabel(popup, "Selection:"); CreateMenuSeparator(popup); graph_popup_menu->focus_item = CreateMenuButton(popup, "Focus to", 'F', switch_focus_proc, (void *) listp); CreateMenuSeparator(popup); graph_popup_menu->hide_item = CreateMenuButton(popup, "Hide", 'H', hide_graph_proc, (void *) listp); graph_popup_menu->show_item = CreateMenuButton(popup, "Show", 'S', show_graph_proc, (void *) listp); graph_popup_menu->duplicate_item = CreateMenuButton(popup,"Duplicate", 'D', duplicate_graph_proc, (void *) listp); graph_popup_menu->kill_item = CreateMenuButton(popup, "Kill", 'K', kill_graph_proc, (void *) listp); CreateMenuSeparator(popup); graph_popup_menu->copy12_item = CreateMenuButton(popup, "Copy 1 to 2", '\0', copy12_graph_proc, (void *) listp); graph_popup_menu->copy21_item = CreateMenuButton(popup, "Copy 2 to 1", '\0', copy21_graph_proc, (void *) listp); graph_popup_menu->move12_item = CreateMenuButton(popup, "Move 1 to 2", '\0', move12_graph_proc, (void *) listp); graph_popup_menu->move21_item = CreateMenuButton(popup, "Move 2 to 1", '\0', move21_graph_proc, (void *) listp); graph_popup_menu->swap_item = CreateMenuButton(popup, "Swap", 'w', swap_graph_proc, (void *) listp); CreateMenuSeparator(popup); CreateMenuButton(popup, "Create new", 'C', create_new_graph_proc, (void *) listp); return graph_popup_menu; } void graph_popup(Widget parent, ListStructure *listp, XButtonPressedEvent *event) { int i, n; int *values; char buf[64]; Widget popup; GraphPopupMenu* graph_popup_menu; if (event->button != 3) { return; } graph_popup_menu = (GraphPopupMenu*) listp->anydata; popup = graph_popup_menu->popup; n = GetListChoices(listp, &values); if (n > 0) { sprintf(buf, "G%d", values[0]); for (i = 1; i < n; i++) { if (strlen(buf) > 30) { strcat(buf, "..."); break; } sprintf(buf, "%s, G%d", buf, values[i]); } } else { strcpy(buf, "None"); } SetLabel(graph_popup_menu->label_item, buf); if (n == 0) { XtSetSensitive(graph_popup_menu->hide_item, False); XtSetSensitive(graph_popup_menu->show_item, False); XtSetSensitive(graph_popup_menu->duplicate_item, False); XtSetSensitive(graph_popup_menu->kill_item, False); } else { XtSetSensitive(graph_popup_menu->hide_item, True); XtSetSensitive(graph_popup_menu->show_item, True); XtSetSensitive(graph_popup_menu->duplicate_item, True); XtSetSensitive(graph_popup_menu->kill_item, True); } if (n == 1) { XtSetSensitive(graph_popup_menu->focus_item, True); } else { XtSetSensitive(graph_popup_menu->focus_item, False); } if (n == 2) { sprintf(buf, "Copy G%d to G%d", values[0], values[1]); SetLabel(graph_popup_menu->copy12_item, buf); XtManageChild(graph_popup_menu->copy12_item); sprintf(buf, "Copy G%d to G%d", values[1], values[0]); SetLabel(graph_popup_menu->copy21_item, buf); XtManageChild(graph_popup_menu->copy21_item); sprintf(buf, "Move G%d to G%d", values[0], values[1]); SetLabel(graph_popup_menu->move12_item, buf); XtManageChild(graph_popup_menu->move12_item); sprintf(buf, "Move G%d to G%d", values[1], values[0]); SetLabel(graph_popup_menu->move21_item, buf); XtManageChild(graph_popup_menu->move21_item); XtSetSensitive(graph_popup_menu->swap_item, True); } else { XtUnmanageChild(graph_popup_menu->copy12_item); XtUnmanageChild(graph_popup_menu->copy21_item); XtUnmanageChild(graph_popup_menu->move12_item); XtUnmanageChild(graph_popup_menu->move21_item); XtSetSensitive(graph_popup_menu->swap_item, False); } if (n > 0) { xfree(values); } XmMenuPosition(popup, event); XtManageChild(popup); } static void list_selectall(Widget list) { int i, n; unsigned char selection_type_save; XtVaGetValues(list, XmNselectionPolicy, &selection_type_save, XmNitemCount, &n, NULL); if (selection_type_save == XmSINGLE_SELECT) { XBell(disp, 50); return; } XtVaSetValues(list, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL); XmListDeselectAllItems(list); for (i = 1; i <= n; i++) { XmListSelectPos(list, i, False); } XtVaSetValues(list, XmNselectionPolicy, selection_type_save, NULL); } void list_selectall_action(Widget w, XEvent *e, String *par, Cardinal *npar) { list_selectall(w); } static void list_selectall_cb(void *data) { ListStructure *listp = (ListStructure *) data; list_selectall(listp->list); } static void list_unselectall(Widget list) { XmListDeselectAllItems(list); } void list_unselectall_action(Widget w, XEvent *e, String *par, Cardinal *npar) { list_unselectall(w); } static void list_unselectall_cb(void *data) { ListStructure *listp = (ListStructure *) data; list_unselectall(listp->list); } static void list_invertselection(Widget list) { int i, n; unsigned char selection_type_save; XtVaGetValues(list, XmNselectionPolicy, &selection_type_save, XmNitemCount, &n, NULL); if (selection_type_save == XmSINGLE_SELECT) { XBell(disp, 50); return; } XtVaSetValues(list, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL); for (i = 0; i < n; i++) { XmListSelectPos(list, i, False); } XtVaSetValues(list, XmNselectionPolicy, selection_type_save, NULL); } static void list_invertselection_cb(void *data) { ListStructure *listp = (ListStructure *) data; list_invertselection(listp->list); } void list_invertselection_action(Widget w, XEvent *e, String *par, Cardinal *npar) { list_invertselection(w); } void set_graph_selectors(int gno) { int i; for (i = 0; i < ngraph_selectors; i++) { SelectListChoice(graph_selectors[i], gno); } } ListStructure *CreateGraphChoice(Widget parent, char *labelstr, int type) { ListStructure *retvalp; int nvisible; ngraph_selectors++; graph_selectors = xrealloc(graph_selectors, ngraph_selectors*sizeof(ListStructure *)); nvisible = (type == LIST_TYPE_SINGLE) ? 2 : 4; retvalp = CreateListChoice(parent, labelstr, type, nvisible, ngraph_select_items, graph_select_items); if (retvalp == NULL) { return NULL; } AddHelpCB(retvalp->rc, "doc/UsersGuide.html#graph-selector"); graph_selectors[ngraph_selectors - 1] = retvalp; XtAddCallback(retvalp->list, XmNdefaultActionCallback, graph_select_cb, retvalp); retvalp->anydata = CreateGraphPopupEntries(retvalp); XtAddEventHandler(retvalp->list, ButtonPressMask, False, (XtEventHandler) graph_popup, retvalp); if (ngraph_select_items == 0) { update_graph_selectors(); } else { UpdateListChoice(retvalp, ngraph_select_items, graph_select_items); } SelectListChoice(retvalp, get_cg()); return retvalp; } /* Set selectors */ static ListStructure **set_selectors = NULL; static int nset_selectors = 0; void UpdateSetChoice(ListStructure *listp, int gno) { int i, j, n = number_of_sets(gno); char buf[64]; OptionItem *set_select_items; SetChoiceData *sdata; sdata = (SetChoiceData *) listp->anydata; sdata->gno = gno; if (n <= 0) { UpdateListChoice(listp, 0, NULL); return; } set_select_items = xmalloc(n*sizeof(OptionItem)); if (set_select_items == NULL) { return; } for (i = 0, j = 0; i < n; i++) { if ((sdata->show_nodata == TRUE || is_set_active(gno, i) == TRUE) && (sdata->show_hidden == TRUE || is_set_hidden(gno, i) != TRUE )) { set_select_items[j].value = i; sprintf(buf, "(%c) G%d.S%d[%d][%d]", is_set_hidden(gno, i) ? '-':'+', gno, i, dataset_cols(gno, i), getsetlength(gno, i)); set_select_items[j].label = copy_string(NULL, buf); if (sdata->view_comments == TRUE) { set_select_items[j].label = concat_strings(set_select_items[j].label, " \""); set_select_items[j].label = concat_strings(set_select_items[j].label, getcomment(gno, i)); set_select_items[j].label = concat_strings(set_select_items[j].label, "\""); } j++; } } UpdateListChoice(listp, j, set_select_items); xfree(set_select_items); } void update_set_selectors(int gno) { int i, cg; SetChoiceData *sdata; cg = get_cg(); update_graph_selectors(); for (i = 0; i < nset_selectors; i++) { sdata = (SetChoiceData *) set_selectors[i]->anydata; if (sdata->standalone == TRUE && (gno == cg || gno == ALL_GRAPHS)) { UpdateSetChoice(set_selectors[i], cg); } else if (sdata->standalone == FALSE && sdata->gno == gno) { UpdateSetChoice(set_selectors[i], gno); } } } void set_menu_cb(ListStructure *listp, SetMenuCBtype type) { SetChoiceData *sdata; int err = FALSE; int gno; int i, n, setno, *values; char buf[32]; n = GetListChoices(listp, &values); sdata = (SetChoiceData *) listp->anydata; gno = sdata->gno; switch (type) { case SetMenuHideCB: if (n > 0) { for (i = 0; i < n; i++) { set_set_hidden(gno, values[i], TRUE); } } else { err = TRUE; } break; case SetMenuShowCB: if (n > 0) { for (i = 0; i < n; i++) { set_set_hidden(gno, values[i], FALSE); } } else { err = TRUE; } break; case SetMenuBringfCB: if (n == 1) { pushset(gno, values[0], PUSH_SET_TOFRONT); } else { err = TRUE; } break; case SetMenuSendbCB: if (n == 1) { pushset(gno, values[0], PUSH_SET_TOBACK); } else { err = TRUE; } break; case SetMenuDuplicateCB: if (n > 0) { for (i = 0; i < n; i++) { setno = nextset(gno); do_copyset(gno, values[i], gno, setno); } } else { err = TRUE; } break; case SetMenuKillCB: if (n > 0) { if (yesno("Kill selected set(s)?", NULL, NULL, NULL)) { for (i = 0; i < n; i++) { killset(gno, values[i]); } } } else { err = TRUE; } break; case SetMenuKillDCB: if (n > 0) { if (yesno("Kill data in selected set(s)?", NULL, NULL, NULL)) { for (i = 0; i < n; i++) { killsetdata(gno, values[i]); } } } else { err = TRUE; } break; case SetMenuCopy12CB: if (n == 2) { sprintf(buf, "Overwrite S%d?", values[1]); if (yesno(buf, NULL, NULL, NULL)) { do_copyset(gno, values[0], gno, values[1]); } } else { err = TRUE; } break; case SetMenuCopy21CB: if (n == 2) { sprintf(buf, "Overwrite S%d?", values[0]); if (yesno(buf, NULL, NULL, NULL)) { do_copyset(gno, values[1], gno, values[0]); } } else { err = TRUE; } break; case SetMenuMove12CB: if (n == 2) { sprintf(buf, "Replace S%d?", values[1]); if (yesno(buf, NULL, NULL, NULL)) { moveset(gno, values[0], gno, values[1]); } } else { err = TRUE; } break; case SetMenuMove21CB: if (n == 2) { sprintf(buf, "Replace S%d?", values[0]); if (yesno(buf, NULL, NULL, NULL)) { moveset(gno, values[1], gno, values[0]); } } else { err = TRUE; } break; case SetMenuSwapCB: if (n == 2) { swapset(gno, values[0], gno, values[1]); } else { err = TRUE; } break; case SetMenuNewFCB: create_leval_frame((void *) gno); break; case SetMenuNewSCB: if ((setno = nextset(gno)) != -1) { setcomment(gno, setno, "Editor"); set_set_hidden(gno, setno, FALSE); create_ss_frame(gno, setno); } else { err = TRUE; } break; case SetMenuNewECB: if ((setno = nextset(gno)) != -1) { setcomment(gno, setno, "Editor"); set_set_hidden(gno, setno, FALSE); do_ext_editor(gno, setno); } else { err = TRUE; } break; case SetMenuNewBCB: create_eblock_frame(gno); break; case SetMenuEditSCB: if (n == 1) { create_ss_frame(gno, values[0]); } else { err = TRUE; } break; case SetMenuEditECB: if (n == 1) { do_ext_editor(gno, values[0]); } else { err = TRUE; } break; case SetMenuPackCB: packsets(gno); break; default: err = TRUE; break; } if (n > 0) { xfree(values); } if (err == FALSE) { update_all(); xdrawgraph(); } } void hide_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuHideCB); } void show_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuShowCB); } void bringf_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuBringfCB); } void sendb_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuSendbCB); } void duplicate_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuDuplicateCB); } void kill_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuKillCB); } void killd_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuKillDCB); } void copy12_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuCopy12CB); } void copy21_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuCopy21CB); } void move12_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuMove12CB); } void move21_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuMove21CB); } void swap_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuSwapCB); } void newF_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuNewFCB); } void newS_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuNewSCB); } void newE_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuNewECB); } void newB_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuNewBCB); } void editS_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuEditSCB); } void editE_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuEditECB); } void pack_set_proc(void *data) { set_menu_cb((ListStructure *) data, SetMenuPackCB); } void shownd_set_proc(int onoff, void *data) { ListStructure *listp = (ListStructure *) data; SetChoiceData *sdata = (SetChoiceData *) listp->anydata; sdata->show_nodata = onoff; UpdateSetChoice(listp, sdata->gno); } void showh_set_proc(int onoff, void *data) { ListStructure *listp = (ListStructure *) data; SetChoiceData *sdata = (SetChoiceData *) listp->anydata; sdata->show_hidden = onoff; UpdateSetChoice(listp, sdata->gno); } void view_comments_set_proc(int onoff, void *data) { ListStructure *listp = (ListStructure *) data; SetChoiceData *sdata = (SetChoiceData *) listp->anydata; sdata->view_comments = onoff; UpdateSetChoice(listp, sdata->gno); } void update_set_proc(void *data) { ListStructure *listp = (ListStructure *) data; SetChoiceData *sdata = (SetChoiceData *) listp->anydata; UpdateSetChoice(listp, sdata->gno); } SetPopupMenu *CreateSetPopupEntries(ListStructure *listp) { SetPopupMenu *set_popup_menu; Widget popup, submenupane; set_popup_menu = xmalloc(sizeof(SetPopupMenu)); popup = XmCreatePopupMenu(listp->list, "setPopupMenu", NULL, 0); #if XmVersion >= 2000 XtVaSetValues(popup, XmNpopupEnabled, XmPOPUP_DISABLED, NULL); #else XtVaSetValues(popup, XmNpopupEnabled, False, NULL); #endif set_popup_menu->popup = popup; set_popup_menu->label_item = CreateMenuLabel(popup, "Selection:"); CreateMenuSeparator(popup); set_popup_menu->hide_item = CreateMenuButton(popup, "Hide", '\0', hide_set_proc, (void *) listp); set_popup_menu->show_item = CreateMenuButton(popup, "Show", '\0', show_set_proc, (void *) listp); set_popup_menu->bringf_item = CreateMenuButton(popup, "Bring to front", '\0', bringf_set_proc, (void *) listp); set_popup_menu->sendb_item = CreateMenuButton(popup, "Send to back", '\0', sendb_set_proc, (void *) listp); CreateMenuSeparator(popup); set_popup_menu->duplicate_item = CreateMenuButton(popup, "Duplicate", '\0', duplicate_set_proc, (void *) listp); set_popup_menu->kill_item = CreateMenuButton(popup, "Kill", '\0', kill_set_proc, (void *) listp); set_popup_menu->killd_item = CreateMenuButton(popup, "Kill data", '\0', killd_set_proc, (void *) listp); CreateMenuSeparator(popup); set_popup_menu->copy12_item = CreateMenuButton(popup, "Copy 1 to 2", '\0', copy12_set_proc, (void *) listp); set_popup_menu->copy21_item = CreateMenuButton(popup, "Copy 2 to 1", '\0', copy21_set_proc, (void *) listp); set_popup_menu->move12_item = CreateMenuButton(popup, "Move 1 to 2", '\0', move12_set_proc, (void *) listp); set_popup_menu->move21_item = CreateMenuButton(popup, "Move 2 to 1", '\0', move21_set_proc, (void *) listp); set_popup_menu->swap_item = CreateMenuButton(popup, "Swap", '\0', swap_set_proc, (void *) listp); CreateMenuSeparator(popup); set_popup_menu->edit_item = CreateMenu(popup, "Edit", 'E', FALSE); CreateMenuButton(set_popup_menu->edit_item, "In spreadsheet", '\0', editS_set_proc, (void *) listp); CreateMenuButton(set_popup_menu->edit_item, "In text editor", '\0', editE_set_proc, (void *) listp); submenupane = CreateMenu(popup, "Create new", '\0', FALSE); CreateMenuButton(submenupane, "By formula", '\0', newF_set_proc, (void *) listp); CreateMenuButton(submenupane, "In spreadsheet", '\0', newS_set_proc, (void *) listp); CreateMenuButton(submenupane, "In text editor", '\0', newE_set_proc, (void *) listp); CreateMenuButton(submenupane, "From block data", '\0', newB_set_proc, (void *) listp); CreateMenuSeparator(popup); CreateMenuButton(popup, "Pack all sets", '\0', pack_set_proc, (void *) listp); CreateMenuSeparator(popup); submenupane = CreateMenu(popup, "Selector operations", 'o', FALSE); CreateMenuToggle(submenupane, "View set comments", '\0', view_comments_set_proc, (void *) listp); CreateMenuSeparator(submenupane); set_popup_menu->shownd_item = CreateMenuToggle(submenupane, "Show data-less", '\0', shownd_set_proc, (void *) listp); set_popup_menu->showh_item = CreateMenuToggle(submenupane, "Show hidden", '\0', showh_set_proc, (void *) listp); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Select all", '\0', list_selectall_cb, (void *) listp); CreateMenuButton(submenupane, "Unselect all", '\0', list_unselectall_cb, (void *) listp); CreateMenuButton(submenupane, "Invert selection", '\0', list_invertselection_cb, (void *) listp); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Update", '\0', update_set_proc, (void *) listp); return set_popup_menu; } void set_popup(Widget parent, ListStructure *listp, XButtonPressedEvent *event) { SetChoiceData *sdata; int i, n; int *values; char buf[64]; Widget popup; SetPopupMenu* set_popup_menu; if (event->button != 3) { return; } sdata = (SetChoiceData *) listp->anydata; set_popup_menu = sdata->menu; popup = set_popup_menu->popup; n = GetListChoices(listp, &values); if (n > 0) { sprintf(buf, "S%d", values[0]); for (i = 1; i < n; i++) { if (strlen(buf) > 30) { strcat(buf, "..."); break; } sprintf(buf, "%s, S%d", buf, values[i]); } } else { strcpy(buf, "None"); } SetLabel(set_popup_menu->label_item, buf); SetToggleButtonState(set_popup_menu->shownd_item, sdata->show_nodata); SetToggleButtonState(set_popup_menu->showh_item, sdata->show_hidden); if (n == 0) { XtSetSensitive(set_popup_menu->hide_item, False); XtSetSensitive(set_popup_menu->show_item, False); XtSetSensitive(set_popup_menu->duplicate_item, False); XtSetSensitive(set_popup_menu->kill_item, False); XtSetSensitive(set_popup_menu->killd_item, False); } else { XtSetSensitive(set_popup_menu->hide_item, True); XtSetSensitive(set_popup_menu->show_item, True); XtSetSensitive(set_popup_menu->duplicate_item, True); XtSetSensitive(set_popup_menu->kill_item, True); XtSetSensitive(set_popup_menu->killd_item, True); } if (n == 1) { XtSetSensitive(set_popup_menu->bringf_item, True); XtSetSensitive(set_popup_menu->sendb_item, True); XtSetSensitive(set_popup_menu->edit_item, True); } else { XtSetSensitive(set_popup_menu->bringf_item, False); XtSetSensitive(set_popup_menu->sendb_item, False); XtSetSensitive(set_popup_menu->edit_item, False); } if (n == 2) { sprintf(buf, "Copy S%d to S%d", values[0], values[1]); SetLabel(set_popup_menu->copy12_item, buf); XtManageChild(set_popup_menu->copy12_item); sprintf(buf, "Copy S%d to S%d", values[1], values[0]); SetLabel(set_popup_menu->copy21_item, buf); XtManageChild(set_popup_menu->copy21_item); sprintf(buf, "Move S%d to S%d", values[0], values[1]); SetLabel(set_popup_menu->move12_item, buf); XtManageChild(set_popup_menu->move12_item); sprintf(buf, "Move S%d to S%d", values[1], values[0]); SetLabel(set_popup_menu->move21_item, buf); XtManageChild(set_popup_menu->move21_item); XtSetSensitive(set_popup_menu->swap_item, True); } else { XtUnmanageChild(set_popup_menu->copy12_item); XtUnmanageChild(set_popup_menu->copy21_item); XtUnmanageChild(set_popup_menu->move12_item); XtUnmanageChild(set_popup_menu->move21_item); XtSetSensitive(set_popup_menu->swap_item, False); } if (n > 0) { xfree(values); } XmMenuPosition(popup, event); XtManageChild(popup); } static void ss_edit_cb(Widget list, XtPointer client_data, XtPointer call_data) { XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data; ListStructure *plist = (ListStructure *) client_data; SetChoiceData *sdata = (SetChoiceData *) plist->anydata; int gno, setno; gno = sdata->gno; setno = plist->values[cbs->item_position - 1]; create_ss_frame(gno, setno); } ListStructure *CreateSetChoice(Widget parent, char *labelstr, int type, int standalone) { ListStructure *retvalp; SetChoiceData *sdata; int nvisible; nvisible = (type == LIST_TYPE_SINGLE) ? 4 : 8; retvalp = CreateListChoice(parent, labelstr, type, nvisible, 0, NULL); if (retvalp == NULL) { return NULL; } AddHelpCB(retvalp->rc, "doc/UsersGuide.html#set-selector"); sdata = xmalloc(sizeof(SetChoiceData)); if (sdata == NULL) { XCFREE(retvalp); return NULL; } sdata->standalone = standalone; sdata->view_comments = FALSE; sdata->show_hidden = TRUE; sdata->show_nodata = FALSE; sdata->menu = CreateSetPopupEntries(retvalp); XtAddEventHandler(retvalp->list, ButtonPressMask, False, (XtEventHandler) set_popup, retvalp); XtAddCallback(retvalp->list, XmNdefaultActionCallback, ss_edit_cb, retvalp); retvalp->anydata = sdata; if (standalone == TRUE) { UpdateSetChoice(retvalp, get_cg()); } nset_selectors++; set_selectors = xrealloc(set_selectors, nset_selectors*sizeof(ListStructure *)); set_selectors[nset_selectors - 1] = retvalp; return retvalp; } static void update_sets_cb(int n, int *values, void *data) { int gno; ListStructure *set_listp = (ListStructure *) data; if (n == 1) { gno = values[0]; } else { gno = -1; } UpdateSetChoice(set_listp, gno); } GraphSetStructure *CreateGraphSetSelector(Widget parent, char *s, int sel_type) { GraphSetStructure *retval; Widget rc; retval = xmalloc(sizeof(GraphSetStructure)); retval->frame = CreateFrame(parent, s); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, retval->frame, NULL); retval->graph_sel = CreateGraphChoice(rc, "Graph:", LIST_TYPE_SINGLE); retval->set_sel = CreateSetChoice(rc, "Set:", sel_type, FALSE); AddListChoiceCB(retval->graph_sel, update_sets_cb, (void *) retval->set_sel); UpdateSetChoice(retval->set_sel, get_cg()); XtManageChild(rc); return retval; } SrcDestStructure *CreateSrcDestSelector(Widget parent, int sel_type) { SrcDestStructure *retval; retval = xmalloc(sizeof(SrcDestStructure)); retval->form = XtVaCreateWidget("form", xmFormWidgetClass, parent, XmNfractionBase, 2, NULL); retval->src = CreateGraphSetSelector(retval->form, "Source", sel_type); retval->dest = CreateGraphSetSelector(retval->form, "Destination", sel_type); XtVaSetValues(retval->src->frame, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL); XtVaSetValues(retval->dest->frame, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNrightAttachment, XmATTACH_FORM, NULL); XtManageChild(retval->form); return retval; } void paint_color_selector(OptionStructure *optp) { int i, color; long bg, fg; for (i = 0; i < ncolor_option_items; i++) { color = color_option_items[i].value; bg = xvlibcolors[color]; if ((get_colorintensity(color) < 0.5 && is_video_reversed() == FALSE) || (get_colorintensity(color) > 0.5 && is_video_reversed() == TRUE )) { fg = xvlibcolors[0]; } else { fg = xvlibcolors[1]; } XtVaSetValues(optp->options[i].widget, XmNbackground, bg, XmNforeground, fg, NULL); } } void update_color_selectors(void) { int i, j; CMap_entry *pcmap; for (i = 0, j = 0; i < number_of_colors(); i++) { pcmap = get_cmap_entry(i); if (pcmap != NULL && pcmap->ctype == COLOR_MAIN) { j++; } } ncolor_option_items = j; color_option_items = xrealloc(color_option_items, ncolor_option_items*sizeof(OptionItem)); for (i = 0, j = 0; i < number_of_colors(); i++) { pcmap = get_cmap_entry(i); if (pcmap != NULL && pcmap->ctype == COLOR_MAIN) { color_option_items[j].value = i; color_option_items[j].label = get_colorname(i); j++; } } for (i = 0; i < ncolor_selectors; i++) { UpdateOptionChoice(color_selectors[i], ncolor_option_items, color_option_items); paint_color_selector(color_selectors[i]); } } OptionStructure *CreateColorChoice(Widget parent, char *s) { OptionStructure *retvalp = NULL; ncolor_selectors++; color_selectors = xrealloc(color_selectors, ncolor_selectors*sizeof(OptionStructure *)); if (color_selectors == NULL) { errmsg("Malloc failed in CreateColorChoice()"); return retvalp; } retvalp = CreateOptionChoice(parent, s, 4, ncolor_option_items, color_option_items); color_selectors[ncolor_selectors - 1] = retvalp; paint_color_selector(retvalp); return retvalp; } SpinStructure *CreateLineWidthChoice(Widget parent, char *s) { return CreateSpinChoice(parent, s, 3, SPIN_TYPE_FLOAT, 0.0, MAX_LINEWIDTH, 0.5); } Widget *CreatePanelChoice(Widget parent, char *labelstr, int nchoices,...) { va_list var; int i = 0; XmString str; char *s; Widget *retval; nchoices--; retval = (Widget *) XtMalloc((nchoices + 2) * sizeof(Widget)); retval[1] = XmCreatePulldownMenu(parent, "pulldown", NULL, 0); va_start(var, nchoices); i = 0; while ((s = va_arg(var, char *)) != NULL) { retval[i + 2] = XmCreatePushButton(retval[1], s, NULL, 0); i++; } if (i != nchoices) { errmsg("Incorrect number of selections in CreatePanelChoice()"); } va_end(var); XtManageChildren(retval + 2, nchoices); retval[0] = XmCreateOptionMenu(parent, "optionmenu", NULL, 0); str = XmStringCreateLocalized(labelstr); XtVaSetValues(retval[0], XmNlabelString, str, XmNsubMenuId, retval[1], NULL); XmStringFree(str); XtManageChild(retval[0]); return retval; } void SetChoice(Widget * w, int value) { Arg a; Cardinal nchoices; if (w == (Widget *) NULL) { errwin("Internal error, SetChoice: Attempt to set NULL Widget"); return; } XtSetArg(a, XmNnumChildren, &nchoices); XtGetValues(w[1], &a, 1); if (value >= nchoices) { errwin("Value not found in SetChoice()"); return; } XtSetArg(a, XmNmenuHistory, w[value + 2]); XtSetValues(w[0], &a, 1); } int GetChoice(Widget * w) { Arg a; Widget warg; int i; if (w == NULL) { errwin("Internal error, GetChoice called with NULL argument"); return 0; } XtSetArg(a, XmNmenuHistory, &warg); XtGetValues(w[0], &a, 1); i = 0; while (w[i + 2] != warg) { if (w[i + 2] == NULL) { errwin("Internal error, GetChoice: Found NULL in Widget list"); return 0; } i++; } return i; } static OptionItem fmt_option_items[32] = { {FORMAT_DECIMAL, "Decimal" }, {FORMAT_EXPONENTIAL, "Exponential" }, {FORMAT_GENERAL, "General" }, {FORMAT_POWER, "Power" }, {FORMAT_SCIENTIFIC, "Scientific" }, {FORMAT_ENGINEERING, "Engineering" }, {FORMAT_COMPUTING, "Computing (K,M,G,...)"}, {FORMAT_DDMMYY, "DD-MM-YY" }, {FORMAT_MMDDYY, "MM-DD-YY" }, {FORMAT_YYMMDD, "YY-MM-DD" }, {FORMAT_MMYY, "MM-YY" }, {FORMAT_MMDD, "MM-DD" }, {FORMAT_MONTHDAY, "Month-DD" }, {FORMAT_DAYMONTH, "DD-Month" }, {FORMAT_MONTHS, "Month (abrev.)" }, {FORMAT_MONTHSY, "Month (abrev.)-YY" }, {FORMAT_MONTHL, "Month" }, {FORMAT_DAYOFWEEKS, "Day of week (abrev.)"}, {FORMAT_DAYOFWEEKL, "Day of week" }, {FORMAT_DAYOFYEAR, "Day of year" }, {FORMAT_HMS, "HH:MM:SS" }, {FORMAT_MMDDHMS, "MM-DD HH:MM:SS" }, {FORMAT_MMDDYYHMS, "MM-DD-YY HH:MM:SS" }, {FORMAT_YYMMDDHMS, "YY-MM-DD HH:MM:SS" }, {FORMAT_DEGREESLON, "Degrees (lon)" }, {FORMAT_DEGREESMMLON, "DD MM' (lon)" }, {FORMAT_DEGREESMMSSLON, "DD MM' SS.s\" (lon)" }, {FORMAT_MMSSLON, "MM' SS.s\" (lon)" }, {FORMAT_DEGREESLAT, "Degrees (lat)" }, {FORMAT_DEGREESMMLAT, "DD MM' (lat)" }, {FORMAT_DEGREESMMSSLAT, "DD MM' SS.s\" (lat)" }, {FORMAT_MMSSLAT, "MM' SS.s\" (lat)" } }; OptionStructure *CreateFormatChoice(Widget parent, char *s) { OptionStructure *retval; retval = CreateOptionChoice(parent, s, 4, 31, fmt_option_items); return(retval); } static OptionItem as_option_items[4] = { {AUTOSCALE_NONE, "None"}, {AUTOSCALE_X, "X"}, {AUTOSCALE_Y, "Y"}, {AUTOSCALE_XY, "XY"} }; OptionStructure *CreateASChoice(Widget parent, char *s) { OptionStructure *retval; retval = CreateOptionChoice(parent, s, 1, 4, as_option_items); /* As init value, use this */ SetOptionChoice(retval, autoscale_onread); return(retval); } Widget *CreatePrecisionChoice(Widget parent, char *s) { Widget *w; w = CreatePanelChoice(parent, s, 11, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL); return(w); } Widget CreateScale(Widget parent, char *s, int min, int max, int delta) { Widget w; XmString str; str = XmStringCreateLocalized(s); w = XtVaCreateManagedWidget("scroll", xmScaleWidgetClass, parent, XmNtitleString, str, XmNminimum, min, XmNmaximum, max, XmNscaleMultiple, delta, XmNvalue, 0, XmNshowValue, True, XmNprocessingDirection, XmMAX_ON_RIGHT, XmNorientation, XmHORIZONTAL, #if XmVersion >= 2000 XmNsliderMark, XmROUND_MARK, #endif NULL); XmStringFree(str); return w; } void SetScaleValue(Widget w, int value) { XtVaSetValues(w, XmNvalue, value, NULL); } int GetScaleValue(Widget w) { int value; XtVaGetValues(w, XmNvalue, &value, NULL); return value; } void SetScaleWidth(Widget w, int width) { XtVaSetValues(w, XmNscaleWidth, (Dimension) width, NULL); } Widget CreateAngleChoice(Widget parent, char *s) { return CreateScale(parent, s, 0, 360, 10); } int GetAngleChoice(Widget w) { return GetScaleValue(w); } void SetAngleChoice(Widget w, int angle) { SetScaleValue(w, angle); } Widget CreateCharSizeChoice(Widget parent, char *s) { return CreateScale(parent, s, 0, 1000, 25); } double GetCharSizeChoice(Widget w) { return ((double) GetScaleValue(w)/100); } void SetCharSizeChoice(Widget w, double size) { int value = (int) rint(size*100); SetScaleValue(w, value); } Widget CreateToggleButton(Widget parent, char *s) { return (XtVaCreateManagedWidget(s, xmToggleButtonWidgetClass, parent, NULL)); } int GetToggleButtonState(Widget w) { return (XmToggleButtonGetState(w)); } void SetToggleButtonState(Widget w, int value) { if (w == NULL) { return; } XmToggleButtonSetState(w, value ? True:False, False); return; } typedef struct { void (*cbproc)(); void *anydata; } TB_CBdata; static void tb_int_cb_proc(Widget w, XtPointer client_data, XtPointer call_data) { int onoff; TB_CBdata *cbdata = (TB_CBdata *) client_data; onoff = GetToggleButtonState(w); cbdata->cbproc(onoff, cbdata->anydata); } void AddToggleButtonCB(Widget w, TB_CBProc cbproc, void *anydata) { TB_CBdata *cbdata; cbdata = xmalloc(sizeof(TB_CBdata)); cbdata->cbproc = cbproc; cbdata->anydata = anydata; XtAddCallback(w, XmNvalueChangedCallback, tb_int_cb_proc, (XtPointer) cbdata); } Widget CreateDialogForm(Widget parent, char *s) { Widget dialog, w; char *bufp; int standalone; if (parent == NULL) { standalone = TRUE; parent = XtAppCreateShell("XMgrace", "XMgrace", topLevelShellWidgetClass, disp, NULL, 0); } else { standalone = FALSE; } bufp = label_to_resname(s, "Dialog"); dialog = XmCreateDialogShell(parent, bufp, NULL, 0); xfree(bufp); if (standalone) { RegisterEditRes(dialog); } handle_close(dialog); bufp = copy_string(NULL, "Grace: "); bufp = concat_strings(bufp, s); XtVaSetValues(dialog, XmNtitle, bufp, NULL); xfree(bufp); w = XmCreateForm(dialog, "form", NULL, 0); return w; } void SetDialogFormResizable(Widget form, int onoff) { XtVaSetValues(form, XmNresizePolicy, onoff ? XmRESIZE_ANY:XmRESIZE_NONE, NULL); XtVaSetValues(XtParent(form), XmNallowShellResize, onoff ? True:False, NULL); } void AddDialogFormChild(Widget form, Widget child) { Widget last_widget; XtVaGetValues(form, XmNuserData, &last_widget, NULL); if (last_widget) { XtVaSetValues(child, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, last_widget, NULL); XtVaSetValues(last_widget, XmNbottomAttachment, XmATTACH_NONE, NULL); } else { XtVaSetValues(child, XmNtopAttachment, XmATTACH_FORM, NULL); } XtVaSetValues(child, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtVaSetValues(form, XmNuserData, child, NULL); } typedef struct { Widget form; int close; int (*cbproc)(); void *anydata; } AACDialog_CBdata; void aacdialog_int_cb_proc(void *data) { AACDialog_CBdata *cbdata; int retval; set_wait_cursor(); cbdata = (AACDialog_CBdata *) data; retval = cbdata->cbproc(cbdata->anydata); if (cbdata->close && retval == RETURN_SUCCESS) { XtUnmanageChild(XtParent(cbdata->form)); } unset_wait_cursor(); } void CreateAACDialog(Widget form, Widget container, AACDialog_CBProc cbproc, void *data) { Widget fr, aacbut[3]; AACDialog_CBdata *cbdata_accept, *cbdata_apply; char *aaclab[3] = {"Apply", "Accept", "Close"}; fr = CreateFrame(form, NULL); XtVaSetValues(fr, XmNtopAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); CreateCommandButtons(fr, 3, aacbut, aaclab); AddDialogFormChild(form, container); XtVaSetValues(container, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, fr, NULL); XtVaSetValues(form, XmNcancelButton, aacbut[2], NULL); cbdata_accept = xmalloc(sizeof(AACDialog_CBdata)); cbdata_accept->form = form; cbdata_accept->anydata = data; cbdata_accept->cbproc = cbproc; cbdata_accept->close = TRUE; cbdata_apply = xmalloc(sizeof(AACDialog_CBdata)); cbdata_apply->form = form; cbdata_apply->anydata = data; cbdata_apply->cbproc = cbproc; cbdata_apply->close = FALSE; AddButtonCB(aacbut[0], aacdialog_int_cb_proc, cbdata_apply); AddButtonCB(aacbut[1], aacdialog_int_cb_proc, cbdata_accept); AddButtonCB(aacbut[2], destroy_dialog_cb, XtParent(form)); XtManageChild(container); XtManageChild(form); } TransformStructure *CreateTransformDialogForm(Widget parent, char *s, int sel_type) { TransformStructure *retval; retval = xmalloc(sizeof(TransformStructure)); retval->form = CreateDialogForm(parent, s); retval->srcdest = CreateSrcDestSelector(retval->form, sel_type); AddDialogFormChild(retval->form, retval->srcdest->form); /* * retval->restr = CreateRestrictionChoice(retval->form, "Source data filtering"); * AddDialogFormChild(retval->form, retval->restr->frame); */ return retval; } int GetTransformDialogSettings(TransformStructure *tdialog, int exclusive, int *gsrc, int *gdest, int *nssrc, int **svaluessrc, int *nsdest, int **svaluesdest) { int gsrc_ok, gdest_ok; gsrc_ok = GetSingleListChoice(tdialog->srcdest->src->graph_sel, gsrc); gdest_ok = GetSingleListChoice(tdialog->srcdest->dest->graph_sel, gdest); if (gsrc_ok == RETURN_FAILURE || gdest_ok == RETURN_FAILURE) { errmsg("Please select single source and destination graphs"); return RETURN_FAILURE; } *nssrc = GetListChoices(tdialog->srcdest->src->set_sel, svaluessrc); if (*nssrc == 0) { errmsg("No source sets selected"); return RETURN_FAILURE; } *nsdest = GetListChoices(tdialog->srcdest->dest->set_sel, svaluesdest); if (*nsdest != 0 && *nssrc != *nsdest) { errmsg("Different number of source and destination sets"); xfree(*svaluessrc); xfree(*svaluesdest); return RETURN_FAILURE; } /* check for mutually exclusive selections */ if (exclusive && *gsrc == *gdest && *nsdest != 0) { int i; for (i = 0; i < *nssrc; i++) { if ((*svaluessrc)[i] == (*svaluesdest)[i]) { xfree(*svaluessrc); xfree(*svaluesdest); errmsg("Source and destination set(s) are not mutually exclusive"); return RETURN_FAILURE; } } } return RETURN_SUCCESS; } Widget CreateVContainer(Widget parent) { Widget rc; rc = XmCreateRowColumn(parent, "VContainer", NULL, 0); XtManageChild(rc); return rc; } Widget CreateHContainer(Widget parent) { Widget rc; rc = XmCreateRowColumn(parent, "HContainer", NULL, 0); XtVaSetValues(rc, XmNorientation, XmHORIZONTAL, NULL); XtManageChild(rc); return rc; } Widget CreateFrame(Widget parent, char *s) { Widget fr; fr = XtVaCreateManagedWidget("frame", xmFrameWidgetClass, parent, NULL); if (s != NULL) { XtVaCreateManagedWidget(s, xmLabelGadgetClass, fr, XmNchildType, XmFRAME_TITLE_CHILD, NULL); } return (fr); } typedef struct { int ncols; int nrows; } GridData; Widget CreateGrid(Widget parent, int ncols, int nrows) { Widget w; int nfractions; GridData *gd; if (ncols <= 0 || nrows <= 0) { errmsg("Wrong call to CreateGrid()"); ncols = 1; nrows = 1; } nfractions = 0; do { nfractions++; } while (nfractions % ncols || nfractions % nrows); gd = xmalloc(sizeof(GridData)); gd->ncols = ncols; gd->nrows = nrows; w = XmCreateForm(parent, "grid_form", NULL, 0); XtVaSetValues(w, XmNfractionBase, nfractions, XmNuserData, gd, NULL); XtManageChild(w); return w; } void PlaceGridChild(Widget grid, Widget w, int col, int row) { int nfractions, w1, h1; GridData *gd; XtVaGetValues(grid, XmNfractionBase, &nfractions, XmNuserData, &gd, NULL); if (gd == NULL) { errmsg("PlaceGridChild() called with a non-grid widget"); return; } if (col < 0 || col >= gd->ncols) { errmsg("PlaceGridChild() called with wrong `col' argument"); return; } if (row < 0 || row >= gd->nrows) { errmsg("PlaceGridChild() called with wrong `row' argument"); return; } w1 = nfractions/gd->ncols; h1 = nfractions/gd->nrows; XtVaSetValues(w, XmNleftAttachment , XmATTACH_POSITION, XmNleftPosition , col*w1 , XmNrightAttachment , XmATTACH_POSITION, XmNrightPosition , (col + 1)*w1 , XmNtopAttachment , XmATTACH_POSITION, XmNtopPosition , row*h1 , XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition , (row + 1)*h1 , NULL); } Widget CreateTab(Widget parent) { Widget tab; tab = XtVaCreateManagedWidget("tab", xmTabWidgetClass, parent, NULL); return (tab); } Widget CreateTabPage(Widget parent, char *s) { Widget w; XmString str; w = XmCreateRowColumn(parent, "tabPage", NULL, 0); str = XmStringCreateLocalized(s); XtVaSetValues(w, XmNtabLabel, str, NULL); XmStringFree(str); XtManageChild(w); return (w); } void SelectTabPage(Widget tab, Widget w) { XmTabSetTabWidget(tab, w, True); } Widget CreateTextItem2(Widget parent, int len, char *s) { Widget w; Widget rc; XmString str; rc = XmCreateRowColumn(parent, "rc", NULL, 0); XtVaSetValues(rc, XmNorientation, XmHORIZONTAL, NULL); str = XmStringCreateLocalized(s); XtVaCreateManagedWidget("label", xmLabelWidgetClass, rc, XmNlabelString, str, NULL); XmStringFree(str); w = XtVaCreateManagedWidget("text", xmTextWidgetClass, rc, XmNtraversalOn, True, XmNcolumns, len, NULL); XtManageChild(rc); return w; } Widget CreateTextItem4(Widget parent, int len, char *label) { Widget retval; XtVaCreateManagedWidget(label, xmLabelWidgetClass, parent, NULL); retval = XtVaCreateManagedWidget("text", xmTextWidgetClass, parent, XmNcolumns, len, NULL); return retval; } /* * create a multiline editable window * parent = parent widget * hgt = number of lines in edit window * s = label for window * * returns the edit window widget */ Widget CreateScrollTextItem2(Widget parent, int hgt, char *s) { Widget w, form, label; XmString str; Arg args[4]; int ac; form = XmCreateForm(parent, "form", NULL, 0); str = XmStringCreateLocalized(s); label = XtVaCreateManagedWidget("label", xmLabelWidgetClass, form, XmNlabelString, str, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XmStringFree(str); ac = 0; if (hgt > 0) { XtSetArg(args[ac], XmNrows, hgt); ac++; } XtSetArg(args[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++; XtSetArg(args[ac], XmNwordWrap, True); ac++; XtSetArg(args[ac], XmNvisualPolicy, XmVARIABLE); ac++; w = XmCreateScrolledText(form, "text", args, ac); XtVaSetValues(XtParent(w), XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, label, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); XtManageChild(w); XtManageChild(form); return w; } char *xv_getstr(Widget w) /* * return the string from a text widget * * NB - newlines are converted to spaces */ { char *s; int i; static char buf[MAX_STRING_LENGTH]; strncpy(buf, s = XmTextGetString(w), MAX_STRING_LENGTH - 1); XtFree(s); i=strlen(buf); for (i--; i >= 0; i--) { if (buf[i] == '\n') { buf[i] = ' '; } } return buf; } /* * xv_evalexpr - take a text field and pass it to the parser if it needs to * evaluated, else use atof(). * place the double result in answer * if an error, return False, else True */ Boolean xv_evalexpr(Widget w, double *answer ) { char *s; static char *buf = NULL; int i, len, ier = 0; double result; buf = copy_string(buf, s = XmTextGetString(w)); XtFree(s); if (!(len = strlen( buf ) )) { /* check for zero length */ *answer = 0; return RETURN_FAILURE; } /* first character may be a sign */ if (!fpdigit[(int) buf[0]] && buf[0] != '-' && buf[0] != '+') { i = len +1; } else { i = 1; } for (; ireason; keep_grab = False; XtRemoveGrab(XtParent(w)); XtUnmanageChild(w); switch (why) { case XmCR_OK: yesno_retval = 1; /* process ok action */ break; case XmCR_CANCEL: yesno_retval = 0; /* process cancel action */ break; } } static void update_yesno(Widget w, char *msg, char *ha) { Widget hb; XmString str; if (msg != NULL) { str = XmStringCreateLocalized(msg); } else { str = XmStringCreateLocalized("Warning"); } XtVaSetValues(w, XmNmessageString, str, NULL); XmStringFree(str); hb = XtNameToWidget(w, "Help"); if (ha) { AddButtonCB(hb, HelpCB, ha); XtSetSensitive(hb, True); } else { XtSetSensitive(hb, False); } } int yesnowin(char *msg, char *s1, char *s2, char *help_anchor) { static Widget yesno_popup = NULL; XEvent event; keep_grab = True; if (yesno_popup == NULL) { yesno_popup = XmCreateErrorDialog(app_shell, "warndlg", NULL, 0); XtAddCallback(yesno_popup, XmNokCallback, yesnoCB, NULL); XtAddCallback(yesno_popup, XmNcancelCallback, yesnoCB, NULL); } update_yesno(yesno_popup, msg, help_anchor); RaiseWindow(yesno_popup); XtAddGrab(XtParent(yesno_popup), True, False); while (keep_grab || XtAppPending(app_con)) { XtAppNextEvent(app_con, &event); XtDispatchEvent(&event); } return yesno_retval; } Widget CreateAACButtons(Widget parent, Widget form, Button_CBProc aac_cb) { Widget w; Widget aacbut[3]; static char *aaclab[3] = {"Apply", "Accept", "Close"}; w = CreateCommandButtons(parent, 3, aacbut, aaclab); AddButtonCB(aacbut[0], aac_cb, (void *) AAC_APPLY); AddButtonCB(aacbut[1], aac_cb, (void *) AAC_ACCEPT); AddButtonCB(aacbut[2], aac_cb, (void *) AAC_CLOSE); if (form != NULL) { XtVaSetValues(form, XmNcancelButton, aacbut[2], NULL); } return w; } void SetLabel(Widget w, char *s) { XmString str; str = XmStringCreateLocalized(s); XtVaSetValues(w, XmNlabelString, str, NULL); XmStringFree(str); } void SetFixedFont(Widget w) { XFontStruct *f; XmFontList xmf; f = XLoadQueryFont(disp, "fixed"); xmf = XmFontListCreate(f, charset); if (xmf == NULL) { errmsg("Can't load font \"fixed\""); return; } else { XtVaSetValues(w, XmNfontList, xmf, NULL); XmFontListFree(xmf); } } char *GetStringSimple(XmString xms) { char *s; if (XmStringGetLtoR(xms, charset, &s)) { return s; } else { return NULL; } } extern int ReqUpdateColorSel; void update_all(void) { int gno = get_cg(); if (!inwin) { return; } update_set_lists(gno); update_set_selectors(ALL_GRAPHS); update_ss_editors(ALL_GRAPHS); if (ReqUpdateColorSel == TRUE) { update_color_selectors(); ReqUpdateColorSel = FALSE; } update_ticks(gno); update_props_items(); update_hotlinks(); update_prune_frame(); update_locator_items(gno); set_stack_message(); set_left_footer(NULL); } void update_all_cb(void *data) { update_all(); } grace-5.1.23/src/nonlfit.c0000644000076500001440000003177111220232104015030 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * nonlinear curve fitting * */ #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "parser.h" #include "protos.h" /* Needed only for `integer' and `doublereal' definitions */ #include "f2c.h" extern int lmdif_(U_fp, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); static double *xp, *yp, *y_saved; static double *wts; static char *ra; int lmdif_drv(U_fp fcn, integer m, integer n, doublereal *x, doublereal *fvec, doublereal *tol, integer *iwa, doublereal *wa, integer lwa, integer nsteps); void a_to_parms (double *a); void parms_to_a (double *a); void reset_nonl(void) { int i; for (i = 0; i < MAXPARM; i++) { nonl_parms[i].value = 1.0; nonl_parms[i].constr = FALSE; nonl_parms[i].min = 1.0; nonl_parms[i].max = 1.0; } nonl_opts.title = copy_string(nonl_opts.title, "A fit"); nonl_opts.formula = copy_string(nonl_opts.formula, "y = "); nonl_opts.parnum = 0; nonl_opts.tolerance = 0.01; return; } void initialize_nonl(void) { nonl_opts.title = NULL; nonl_opts.formula = NULL; reset_nonl(); } void a_to_parms (double *a) { int i; double t; for (i = 0; i < nonl_opts.parnum; i++) { if (nonl_parms[i].constr) { /* map (-inf, inf) to (-1, 1) */ t = a[i]/(abs(a[i]) + 1.0); /* map (-1, 1) to (nonl_lowb[i], nonl_uppb[i]) */ nonl_parms[i].value = (nonl_parms[i].min + nonl_parms[i].max)/2.0 + (nonl_parms[i].max - nonl_parms[i].min)/2.0 * t; } else { nonl_parms[i].value = a[i]; } } } void parms_to_a (double *a) { int i; double t; double eps = 1.e-6; for (i = 0; i < nonl_opts.parnum; i++) { if (nonl_parms[i].constr) { t = (nonl_parms[i].value - (nonl_parms[i].min + nonl_parms[i].max)/2.0)/ ((nonl_parms[i].max - nonl_parms[i].min)/2.0); if (t < -(1.0 - eps)){ t = -(1.0 - eps); nonl_parms[i].value = (nonl_parms[i].min + nonl_parms[i].max)/2.0 + (nonl_parms[i].max - nonl_parms[i].min)/2.0 * t; } if (t > (1.0 - eps)){ t = (1.0 - eps); nonl_parms[i].value = (nonl_parms[i].min + nonl_parms[i].max)/2.0 + (nonl_parms[i].max - nonl_parms[i].min)/2.0 * t; } a[i] = t/(1.0 - abs(t)); } else { a[i] = nonl_parms[i].value; } } } void fcn(int * m, int * n, double * x, double * fvec, int * iflag) { int errpos; int i; a_to_parms(x); errpos = scanner(nonl_opts.formula); if (errpos) { errmsg("error in fcn"); *iflag = -1; return; } for (i = 0; i < *m; ++i) { fvec[i] = yp[i] - y_saved[i]; } /* apply weigh function, if any */ if (wts != NULL) { for (i = 0; i < *m; ++i) { fvec[i] *= sqrt(fabs(wts[i])); } } /* apply restriction, if any */ if (ra != NULL) { for (i = 0; i < *m; ++i) { fvec[i] *= ra[i]; } } } /* * find correlation coefficient */ int correlation(double *x, double *y, int n, double *cor) { double xbar, xsd; double ybar, ysd; int i; *cor = 0.0; if (n < 2) { return RETURN_FAILURE; } stasum(x, n, &xbar, &xsd); stasum(y, n, &ybar, &ysd); if (xsd == 0.0 || ysd == 0.0) { return RETURN_FAILURE; } for (i = 0; i < n; i++) { *cor += (x[i] - xbar)*(y[i] - ybar); } *cor /= ((n - 1)*xsd*ysd); return RETURN_SUCCESS; } int do_nonlfit(int gno, int setno, double *warray, char *rarray, int nsteps) { int info = -1; double *fvec, *wa; int i, n; integer lwa, iwa[MAXPARM]; double a[MAXPARM]; int parnum = nonl_opts.parnum; char buf[128]; double cor, chisq, rms_pe, ysq, theil; int rms_ok; if (set_parser_setno(gno, setno) != RETURN_SUCCESS) { return RETURN_FAILURE; } n = getsetlength(gno, setno); lwa = (integer) n * parnum + 5 * parnum + n; fvec = xcalloc(n, SIZEOF_DOUBLE); if (fvec == NULL) { return RETURN_FAILURE; } y_saved = xcalloc(n, SIZEOF_DOUBLE); if (y_saved == NULL) { xfree(fvec); return RETURN_FAILURE; } wa = xcalloc(lwa, sizeof(doublereal)); if (wa == NULL) { xfree(y_saved); xfree(fvec); return RETURN_FAILURE; } stufftext("Fitting with formula: "); stufftext(nonl_opts.formula); stufftext("\n"); stufftext("Initial guesses:\n"); for (i = 0; i < nonl_opts.parnum; i++) { sprintf(buf, "\ta%1d = %g\n", i, nonl_parms[i].value); stufftext(buf); } sprintf(buf, "Tolerance = %g\n", nonl_opts.tolerance); stufftext(buf); xp = getx(gno, setno); yp = gety(gno, setno); for (i = 0; i < n; ++i) { y_saved[i] = yp[i]; } ra = rarray; wts = warray; parms_to_a(a); info = lmdif_drv((U_fp) fcn, (integer) n, (integer) parnum, a, fvec, &nonl_opts.tolerance, iwa, wa, lwa, (integer) nsteps); a_to_parms(a); correlation(yp, y_saved, n, &cor); chisq = 0.0; theil = 0.0; ysq = 0.0; rms_ok = TRUE; for (i = 0; i < n; ++i) { chisq += (yp[i] - y_saved[i])*(yp[i] - y_saved[i]); ysq += (y_saved[i]*y_saved[i]); theil += (yp[i] - y_saved[i])*(yp[i] - y_saved[i]); if (y_saved[i] == 0.0) { rms_ok = FALSE; } } theil = sqrt(theil/ysq); rms_pe = 0.0; if (rms_ok) { for (i = 0; i < n; ++i) { rms_pe += (yp[i] - y_saved[i])*(yp[i] - y_saved[i])/ (y_saved[i]*y_saved[i]); } rms_pe = sqrt(rms_pe/n); } for (i = 0; i < n; ++i) { yp[i] = y_saved[i]; } xfree(y_saved); xfree(fvec); xfree(wa); if (info >= 0 && info <= 7) { char *s; switch (info) { case 0: s = "Improper input parameters.\n"; break; case 1: s = "Relative error in the sum of squares is at most tol.\n"; break; case 2: s = "Relative error between A and the solution is at most tol.\n"; break; case 3: s = "Relative error in the sum of squares and A and the solution is at most tol.\n"; break; case 4: s = "Fvec is orthogonal to the columns of the jacobian to machine precision.\n"; break; case 5: s = "\n"; break; case 6: s = "Tol is too small. No further reduction in the sum of squares is possible.\n"; break; case 7: s = "Tol is too small. No further improvement in the approximate solution A is possible.\n"; break; default: s = "\n"; errmsg("Internal error in do_nonlfit()"); break; } stufftext(s); } if ((info > 0 && info < 4) || (info == 5)) { stufftext("Computed values:\n"); for (i = 0; i < nonl_opts.parnum; i++) { sprintf(buf, "\ta%1d = %g\n", i, nonl_parms[i].value); stufftext(buf); } stufftext("\n"); sprintf(buf, "Chi-square: %g\n", chisq); stufftext(buf); sprintf(buf, "Correlation coefficient: %f\n", cor); stufftext(buf); if (rms_ok) { sprintf(buf, "RMS relative error: %g\n", rms_pe); stufftext(buf); } sprintf(buf, "Theil U coefficent: %g\n", theil); stufftext(buf); } return RETURN_SUCCESS; } /* * lmdif1 - modified by E. Stambulchik to suit ACE/gr needs * * argonne national laboratory. minpack project. march 1980. * burton s. garbow, kenneth e. hillstrom, jorge j. more */ int lmdif_drv(U_fp fcn, integer m, integer n, doublereal *x, doublereal *fvec, doublereal *tol, integer *iwa, doublereal *wa, integer lwa, integer nsteps) { /* Initialized data */ static doublereal factor = 100.; static doublereal zero = 0.; static integer mp5n, mode, nfev; static doublereal ftol, gtol, xtol; static doublereal epsfcn; static integer maxfev, nprint; static integer info; /* * fcn is the name of the user-supplied subroutine which * calculates the functions. fcn must be declared * in an external statement in the user calling * program, and should be written as follows. * * subroutine fcn(m,n,x,fvec,iflag) * integer m,n,iflag * double precision x(n),fvec(m) * ---------- * calculate the functions at x and * return this vector in fvec. * ---------- * return * end * * the value of iflag should not be changed by fcn unless * the user wants to terminate execution of lmdif1. * in this case set iflag to a negative integer. * * m is a positive integer input variable set to the number * of functions. * * n is a positive integer input variable set to the number * of variables. n must not exceed m. * * x is an array of length n. on input x must contain * an initial estimate of the solution vector. on output x * contains the final estimate of the solution vector. * * fvec is an output array of length m which contains * the functions evaluated at the output x. * * tol is a nonnegative input variable. termination occurs * when the algorithm estimates either that the relative * error in the sum of squares is at most tol or that * the relative error between x and the solution is at * most tol. * * info is an integer output variable. if the user has * terminated execution, info is set to the (negative) * value of iflag. see description of fcn. otherwise, * info is set as follows. * * info = 0 improper input parameters. * * info = 1 algorithm estimates that the relative error * in the sum of squares is at most tol. * * info = 2 algorithm estimates that the relative error * between x and the solution is at most tol. * * info = 3 conditions for info = 1 and info = 2 both hold. * * info = 4 fvec is orthogonal to the columns of the * jacobian to machine precision. * * info = 5 number of calls to fcn has reached or * exceeded nsteps*(n+1). * * info = 6 tol is too small. no further reduction in * the sum of squares is possible. * * info = 7 tol is too small. no further improvement in * the approximate solution x is possible. * * iwa is an integer work array of length n. * * wa is a work array of length lwa. * * lwa is a positive integer input variable not less than * m*n+5*n+m. * * subprograms called * * user-supplied ...... fcn * * minpack-supplied ... lmdif */ /* Fortran parameter adjustments */ --fvec; --iwa; --x; --wa; info = 0; /* * Check the input parameters for errors. */ if (n <= 0 || m < n || *tol < zero || lwa < m * n + n * 5 + m) { return (int) info; } maxfev = (n + 1) * nsteps; ftol = *tol; xtol = zero; gtol = zero; epsfcn = zero; mode = 1; nprint = 0; mp5n = m + n * 5; lmdif_((U_fp)fcn, &m, &n, &x[1], &fvec[1], &ftol, &xtol, >ol, &maxfev, & epsfcn, &wa[1], &mode, &factor, &nprint, &info, &nfev, &wa[mp5n + 1], &m, &iwa[1], &wa[n + 1], &wa[(n << 1) + 1], &wa[n * 3 + 1], &wa[(n << 2) + 1], &wa[n * 5 + 1]); if (info == 8) { info = 4; } return (int) info; } grace-5.1.23/src/regionwin.c0000644000076500001440000002564710071615562015405 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * define regions and operate on regions */ #include #include #include #include #include #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "events.h" #include "motifinc.h" #include "protos.h" static Widget but1[2]; static Widget but2[2]; static Widget but3[3]; extern int regiontype; /* in regionutils.c */ static void do_define_region(Widget w, XtPointer client_data, XtPointer call_data); static void do_clear_region(Widget w, XtPointer client_data, XtPointer call_data); static Widget *define_region_item; static Widget *define_type_item; static char buf[256]; static Widget status_frame; static Widget status_panel; static Widget status_sw; static Widget header_w; static Widget *labx; static void do_define_region(Widget w, XtPointer client_data, XtPointer call_data) { int rtype = GetChoice(define_type_item); nr = GetChoice(define_region_item); define_region(nr, rtype); } void create_define_frame(void *data) { static Widget top, dialog; set_wait_cursor(); if (top == NULL) { char *label2[2]; label2[0] = "Define"; label2[1] = "Close"; top = XmCreateDialogShell(app_shell, "Define region", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); define_region_item = CreatePanelChoice(dialog, "Define region:", 6, "0", "1", "2", "3", "4", NULL); define_type_item = CreatePanelChoice(dialog, "Region type:", 11, "Inside polygon", "Outside polygon", "Above line", "Below line", "Left of line", "Right of line", "In Horiz. Range", "In Vert. Range", "Out of Horiz. Range", "Out of Vert. Range", NULL); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_define_region, (XtPointer) NULL); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); } RaiseWindow(top); unset_wait_cursor(); } static Widget *clear_region_item; static void do_clear_region(Widget w, XtPointer client_data, XtPointer call_data) { int i; set_wait_cursor(); if (GetChoice(clear_region_item) == MAXREGION) { for (i = 0; i < MAXREGION; i++) { kill_region(i); } } else { kill_region(GetChoice(clear_region_item)); } unset_wait_cursor(); xdrawgraph(); } void create_clear_frame(void *data) { static Widget top, dialog; set_wait_cursor(); if (top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; top = XmCreateDialogShell(app_shell, "Clear region", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); clear_region_item = CreatePanelChoice(dialog, "Clear region:", 7, "0", "1", "2", "3", "4", "All", NULL); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_clear_region, (XtPointer) NULL); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); } RaiseWindow(top); unset_wait_cursor(); } Widget arealab, perimlab; void create_area_frame(void *data) { static Widget top, dialog; XmString str; set_wait_cursor(); if (top == NULL) { char *label3[3]; label3[0] = "Area"; label3[1] = "Perimeter"; label3[2] = "Close"; top = XmCreateDialogShell(app_shell, "Area/perimeter", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); str = XmStringCreateLocalized("[ Area ]"); arealab = XtVaCreateManagedWidget("label Area", xmLabelWidgetClass, dialog, XmNlabelString, str, NULL); XmStringFree(str); str = XmStringCreateLocalized("[ Perim ]"); perimlab = XtVaCreateManagedWidget("label Perim", xmLabelWidgetClass, dialog, XmNlabelString, str, NULL); XmStringFree(str); CreateSeparator(dialog); CreateCommandButtons(dialog, 3, but3, label3); XtAddCallback(but3[0], XmNactivateCallback, (XtCallbackProc) do_select_area, (XtPointer) NULL); XtAddCallback(but3[1], XmNactivateCallback, (XtCallbackProc) do_select_peri, (XtPointer) NULL); XtAddCallback(but3[2], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); } RaiseWindow(top); unset_wait_cursor(); } static Widget *reporton_region_item; static Widget *reporton_type_item; static void do_reporton_region(Widget w, XtPointer client_data, XtPointer call_data) { int regno = (int) GetChoice(reporton_region_item); int type = (int) GetChoice(reporton_type_item); set_wait_cursor(); reporton_region(get_cg(), regno, type); unset_wait_cursor(); } void create_reporton_frame(void *data) { static Widget top, dialog; set_wait_cursor(); if (top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; top = XmCreateDialogShell(app_shell, "Report on sets in region", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); reporton_region_item = CreatePanelChoice(dialog, "Report on sets in region:", 8, "0", "1", "2", "3", "4", "Inside world", "Outside world", NULL); reporton_type_item = CreatePanelChoice(dialog, "Report type:", 3, "Sets", "Points", NULL); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_reporton_region, (XtPointer) NULL); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); } RaiseWindow(top); unset_wait_cursor(); } static void set_status_label(Widget w, char *buf) { Arg al; XmString ls; ls = XmStringCreateLocalized(buf); XtSetArg(al, XmNlabelString, ls); XtSetValues(w, &al, 1); XmStringFree(ls); } void clear_status(void) { int i; for (i = 0; i < MAXREGION; i++) { set_status_label(labx[i], " "); } } void update_status_popup(Widget w, XtPointer client_data, XtPointer call_data) { int rno; if (status_frame) { clear_status(); sprintf(buf, " Region # Active Type"); set_status_label(header_w, buf); for (rno = 0; rno < MAXREGION; rno++) { sprintf(buf, " %2d %3s %6s", rno, on_or_off(rg[rno].active), region_types(rg[rno].type, 0)); set_status_label(labx[rno], buf); } } } void define_status_popup(void *data) { set_wait_cursor(); if (status_frame == NULL) { int i; Widget wbut, rc, rc3, fr2; status_frame = XmCreateDialogShell(app_shell, "Status", NULL, 0); handle_close(status_frame); status_panel = XmCreateForm(status_frame, "form", NULL, 0); status_sw = XtVaCreateManagedWidget("sw", xmScrolledWindowWidgetClass, status_panel, XmNscrollingPolicy, XmAUTOMATIC, XmNheight, 200, XmNwidth, 200, NULL); rc3 = XmCreateRowColumn(status_sw, "rc3", NULL, 0); header_w = XtVaCreateManagedWidget("header", xmLabelWidgetClass, rc3, XmNalignment, XmALIGNMENT_BEGINNING, XmNrecomputeSize, True, NULL); SetFixedFont(header_w); labx = (Widget *)xmalloc( MAXREGION*sizeof(Widget) ); for (i = 0; i < MAXREGION; i++) { labx[i] = XtVaCreateManagedWidget("labx", xmLabelWidgetClass, rc3, XmNalignment, XmALIGNMENT_BEGINNING, XmNrecomputeSize, True, NULL); SetFixedFont(labx[i]); } ManageChild(rc3); XtVaSetValues(status_sw, XmNworkWindow, rc3, NULL); fr2 = CreateFrame(status_panel, NULL); rc = XmCreateRowColumn(fr2, "rc", NULL, 0); XtVaSetValues(rc, XmNorientation, XmHORIZONTAL, NULL); wbut = XtVaCreateManagedWidget("Close", xmPushButtonWidgetClass, rc, NULL); XtAddCallback(wbut, XmNactivateCallback, (XtCallbackProc) destroy_dialog, status_frame); wbut = XtVaCreateManagedWidget("Update", xmPushButtonWidgetClass, rc, NULL); XtAddCallback(wbut, XmNactivateCallback, (XtCallbackProc) update_status_popup, NULL); ManageChild(rc); XtVaSetValues(status_sw, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, fr2, NULL); XtVaSetValues(fr2, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); ManageChild(status_panel); } RaiseWindow(status_frame); update_status_popup(NULL, NULL, NULL); unset_wait_cursor(); } void define_region(int nr, int rtype) { kill_region(nr); xdrawgraph(); switch (rtype) { case 0: regiontype = REGION_POLYI; do_select_region(); break; case 1: regiontype = REGION_POLYO; do_select_region(); break; case 2: regiontype = REGION_ABOVE; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 3: regiontype = REGION_BELOW; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 4: regiontype = REGION_TOLEFT; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 5: regiontype = REGION_TORIGHT; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 6: regiontype= REGION_HORIZI; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 7: regiontype= REGION_VERTI; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 8: regiontype= REGION_HORIZO; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; case 9: regiontype= REGION_VERTO; set_action(DO_NOTHING); set_action(DEF_REGION1ST); break; } } grace-5.1.23/src/pars.c0000644000076500001440000206707012032153131014333 0ustar fnevgenyusers/* A Bison parser, made by GNU Bison 2.5. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Copy the first part of user declarations. */ /* Line 268 of yacc.c */ #line 1 "pars.yacc" /* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * evaluate expressions, commands, parameter files * */ #include #include #include #include #include #include #include #if defined(HAVE_SYS_PARAM_H) # include #endif /* bison not always handles it well itself */ #if defined(HAVE_ALLOCA_H) # include #endif #include "defines.h" #include "globals.h" #include "cephes/cephes.h" #include "device.h" #include "utils.h" #include "files.h" #include "graphs.h" #include "graphutils.h" #include "plotone.h" #include "dlmodule.h" #include "t1fonts.h" #include "ssdata.h" #include "protos.h" #include "parser.h" #include "mathstuff.h" #define MAX_PARS_STRING_LENGTH 4096 #define CAST_DBL_TO_BOOL(x) (fabs(x) < 0.5 ? 0:1) typedef double (*ParserFnc)(); extern graph *g; static double s_result; /* return value if a scalar expression is scanned*/ static grarr *v_result; /* return value if a vector expression is scanned*/ static int expr_parsed, vexpr_parsed; static int interr; static grarr freelist[100]; /* temporary vectors */ static int fcnt = 0; /* number of the temporary vectors allocated */ static target trgt_pool[100]; /* pool of temporary targets */ static int tgtn = 0; /* number of the temporary targets used */ int naxis = 0; /* current axis */ static int curline, curbox, curellipse, curstring; /* these guys attempt to avoid reentrancy problems */ static int gotparams = FALSE, gotread = FALSE, gotnlfit = FALSE; int readxformat; static int nlfit_gno, nlfit_setno, nlfit_nsteps; static double *nlfit_warray = NULL; char batchfile[GR_MAXPATHLEN] = "", paramfile[GR_MAXPATHLEN] = "", readfile[GR_MAXPATHLEN] = ""; static char f_string[MAX_PARS_STRING_LENGTH]; /* buffer for string to parse */ static int pos; /* the graph, set, and its length of the parser's current state */ static int whichgraph; static int whichset; /* the graph and set of the left part of a vector assignment */ static int vasgn_gno; static int vasgn_setno; static int alias_force = FALSE; /* controls whether aliases can override existing keywords */ extern char print_file[]; extern char *close_input; static int filltype_obs; static int index_shift = 0; /* 0 for C, 1 for F77 index notation */ static void free_tmpvrbl(grarr *vrbl); static void copy_vrbl(grarr *dest, grarr *src); static int find_set_bydata(double *data, target *tgt); static int getcharstr(void); static void ungetchstr(void); static int follow(int expect, int ifyes, int ifno); static int yylex(void); static int yyparse(void); static void yyerror(char *s); static int findf(symtab_entry *keytable, char *s); /* Total (intrinsic + user-defined) list of functions and keywords */ symtab_entry *key; /* Line 268 of yacc.c */ #line 213 "y.tab.c" /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 1 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { KEY_VAR = 258, KEY_VEC = 259, KEY_CONST = 260, KEY_UNIT = 261, KEY_FUNC_I = 262, KEY_FUNC_D = 263, KEY_FUNC_NN = 264, KEY_FUNC_ND = 265, KEY_FUNC_DD = 266, KEY_FUNC_NND = 267, KEY_FUNC_PPD = 268, KEY_FUNC_PPPD = 269, KEY_FUNC_PPPPD = 270, KEY_FUNC_PPPPPD = 271, INDEX = 272, DATE = 273, VAR_D = 274, VEC_D = 275, CONSTANT = 276, UCONSTANT = 277, FUNC_I = 278, FUNC_D = 279, FUNC_NN = 280, FUNC_ND = 281, FUNC_DD = 282, FUNC_NND = 283, FUNC_PPD = 284, FUNC_PPPD = 285, FUNC_PPPPD = 286, FUNC_PPPPPD = 287, ABOVE = 288, ABSOLUTE = 289, ALIAS = 290, ALT = 291, ALTXAXIS = 292, ALTYAXIS = 293, ANGLE = 294, ANTIALIASING = 295, APPEND = 296, ARRANGE = 297, ARROW = 298, ASCENDING = 299, ASPLINE = 300, AUTO = 301, AUTOSCALE = 302, AUTOTICKS = 303, AVALUE = 304, AVG = 305, BACKGROUND = 306, BAR = 307, BARDY = 308, BARDYDY = 309, BASELINE = 310, BATCH = 311, BEGIN = 312, BELOW = 313, BETWEEN = 314, BLACKMAN = 315, BLOCK = 316, BOTH = 317, BOTTOM = 318, BOX = 319, CD = 320, CENTER = 321, CHAR = 322, CHART = 323, CHRSTR = 324, CLEAR = 325, CLICK = 326, CLIP = 327, CLOSE = 328, COEFFICIENTS = 329, COLOR = 330, COMMENT = 331, COMPLEX = 332, COMPUTING = 333, CONSTRAINTS = 334, COPY = 335, CYCLE = 336, DAYMONTH = 337, DAYOFWEEKL = 338, DAYOFWEEKS = 339, DAYOFYEAR = 340, DDMMYY = 341, DECIMAL = 342, DEF = 343, DEFAULT = 344, DEFINE = 345, DEGREESLAT = 346, DEGREESLON = 347, DEGREESMMLAT = 348, DEGREESMMLON = 349, DEGREESMMSSLAT = 350, DEGREESMMSSLON = 351, DESCENDING = 352, DESCRIPTION = 353, DEVICE = 354, DFT = 355, DIFFERENCE = 356, DISK = 357, DOWN = 358, DPI = 359, DROP = 360, DROPLINE = 361, ECHO = 362, ELLIPSE = 363, ENGINEERING = 364, ERRORBAR = 365, EXIT = 366, EXPONENTIAL = 367, FFT = 368, FILEP = 369, FILL = 370, FIT = 371, FIXED = 372, FIXEDPOINT = 373, FLUSH = 374, FOCUS = 375, FOLLOWS = 376, FONTP = 377, FORCE = 378, FORMAT = 379, FORMULA = 380, FRAMEP = 381, FREE = 382, FREQUENCY = 383, FROM = 384, GENERAL = 385, GETP = 386, GRAPH = 387, GRAPHNO = 388, GRID = 389, HAMMING = 390, HANNING = 391, HARDCOPY = 392, HBAR = 393, HELP = 394, HGAP = 395, HIDDEN = 396, HISTOGRAM = 397, HMS = 398, HORIZI = 399, HORIZONTAL = 400, HORIZO = 401, ID = 402, IFILTER = 403, IMAX = 404, IMIN = 405, IN = 406, INCREMENT = 407, INOUT = 408, INT = 409, INTEGRATE = 410, INTERPOLATE = 411, INVDFT = 412, INVERT = 413, INVFFT = 414, JUST = 415, KILL = 416, LABEL = 417, LANDSCAPE = 418, LAYOUT = 419, LEFT = 420, LEGEND = 421, LENGTH = 422, LINCONV = 423, LINE = 424, LINEAR = 425, LINESTYLE = 426, LINEWIDTH = 427, LINK = 428, LOAD = 429, LOCTYPE = 430, LOG = 431, LOGARITHMIC = 432, LOGIT = 433, LOGX = 434, LOGXY = 435, LOGY = 436, MAGIC = 437, MAGNITUDE = 438, MAJOR = 439, MAP = 440, MAXP = 441, MESH = 442, MINP = 443, MINOR = 444, MMDD = 445, MMDDHMS = 446, MMDDYY = 447, MMDDYYHMS = 448, MMSSLAT = 449, MMSSLON = 450, MMYY = 451, MONTHDAY = 452, MONTHL = 453, MONTHS = 454, MONTHSY = 455, MOVE = 456, NEGATE = 457, NEW = 458, NONE = 459, NONLFIT = 460, NORMAL = 461, NXY = 462, OFF = 463, OFFSET = 464, OFFSETX = 465, OFFSETY = 466, OFILTER = 467, ON = 468, ONREAD = 469, OP = 470, OPPOSITE = 471, OUT = 472, PAGE = 473, PARA = 474, PARAMETERS = 475, PARZEN = 476, PATTERN = 477, PERIOD = 478, PERP = 479, PHASE = 480, PIE = 481, PIPE = 482, PLACE = 483, POINT = 484, POLAR = 485, POLYI = 486, POLYO = 487, POP = 488, PORTRAIT = 489, POWER = 490, PREC = 491, PREPEND = 492, PRINT = 493, PS = 494, PUSH = 495, PUTP = 496, RAND = 497, READ = 498, REAL = 499, RECIPROCAL = 500, REDRAW = 501, REFERENCE = 502, REGNUM = 503, REGRESS = 504, RESIZE = 505, RESTRICT = 506, REVERSE = 507, RIGHT = 508, RISER = 509, ROT = 510, ROUNDED = 511, RSUM = 512, RULE = 513, RUNAVG = 514, RUNMAX = 515, RUNMED = 516, RUNMIN = 517, RUNSTD = 518, SAVEALL = 519, SCALE = 520, SCIENTIFIC = 521, SCROLL = 522, SD = 523, SET = 524, SETNUM = 525, SFORMAT = 526, SIGN = 527, SIZE = 528, SKIP = 529, SLEEP = 530, SMITH = 531, SORT = 532, SOURCE = 533, SPEC = 534, SPLINE = 535, SPLIT = 536, STACK = 537, STACKED = 538, STACKEDBAR = 539, STACKEDHBAR = 540, STAGGER = 541, START = 542, STOP = 543, STRING = 544, SUM = 545, SUBTITLE = 546, SWAP = 547, SYMBOL = 548, TARGET = 549, TICKLABEL = 550, TICKP = 551, TICKSP = 552, TIMER = 553, TIMESTAMP = 554, TITLE = 555, TO = 556, TOP = 557, TRIANGULAR = 558, TYPE = 559, UP = 560, UPDATEALL = 561, USE = 562, VERSION = 563, VERTI = 564, VERTICAL = 565, VERTO = 566, VGAP = 567, VIEW = 568, VX1 = 569, VX2 = 570, VXMAX = 571, VY1 = 572, VY2 = 573, VYMAX = 574, WELCH = 575, WITH = 576, WORLD = 577, WRAP = 578, WRITE = 579, WX1 = 580, WX2 = 581, WY1 = 582, WY2 = 583, X_TOK = 584, X0 = 585, X1 = 586, XAXES = 587, XAXIS = 588, XCOR = 589, XMAX = 590, XMIN = 591, XY = 592, XYAXES = 593, XYBOXPLOT = 594, XYCOLOR = 595, XYCOLPAT = 596, XYDX = 597, XYDXDX = 598, XYDXDXDYDY = 599, XYDXDY = 600, XYDY = 601, XYDYDY = 602, XYHILO = 603, XYR = 604, XYSIZE = 605, XYSTRING = 606, XYVMAP = 607, XYZ = 608, Y_TOK = 609, Y0 = 610, Y1 = 611, Y2 = 612, Y3 = 613, Y4 = 614, YAXES = 615, YAXIS = 616, YEAR = 617, YMAX = 618, YMIN = 619, YYMMDD = 620, YYMMDDHMS = 621, ZERO = 622, ZNORM = 623, FITPARM = 624, FITPMAX = 625, FITPMIN = 626, NUMBER = 627, NEW_TOKEN = 628, OR = 629, AND = 630, NE = 631, EQ = 632, GE = 633, LE = 634, LT = 635, GT = 636, NOT = 637, UMINUS = 638 }; #endif /* Tokens. */ #define KEY_VAR 258 #define KEY_VEC 259 #define KEY_CONST 260 #define KEY_UNIT 261 #define KEY_FUNC_I 262 #define KEY_FUNC_D 263 #define KEY_FUNC_NN 264 #define KEY_FUNC_ND 265 #define KEY_FUNC_DD 266 #define KEY_FUNC_NND 267 #define KEY_FUNC_PPD 268 #define KEY_FUNC_PPPD 269 #define KEY_FUNC_PPPPD 270 #define KEY_FUNC_PPPPPD 271 #define INDEX 272 #define DATE 273 #define VAR_D 274 #define VEC_D 275 #define CONSTANT 276 #define UCONSTANT 277 #define FUNC_I 278 #define FUNC_D 279 #define FUNC_NN 280 #define FUNC_ND 281 #define FUNC_DD 282 #define FUNC_NND 283 #define FUNC_PPD 284 #define FUNC_PPPD 285 #define FUNC_PPPPD 286 #define FUNC_PPPPPD 287 #define ABOVE 288 #define ABSOLUTE 289 #define ALIAS 290 #define ALT 291 #define ALTXAXIS 292 #define ALTYAXIS 293 #define ANGLE 294 #define ANTIALIASING 295 #define APPEND 296 #define ARRANGE 297 #define ARROW 298 #define ASCENDING 299 #define ASPLINE 300 #define AUTO 301 #define AUTOSCALE 302 #define AUTOTICKS 303 #define AVALUE 304 #define AVG 305 #define BACKGROUND 306 #define BAR 307 #define BARDY 308 #define BARDYDY 309 #define BASELINE 310 #define BATCH 311 #define BEGIN 312 #define BELOW 313 #define BETWEEN 314 #define BLACKMAN 315 #define BLOCK 316 #define BOTH 317 #define BOTTOM 318 #define BOX 319 #define CD 320 #define CENTER 321 #define CHAR 322 #define CHART 323 #define CHRSTR 324 #define CLEAR 325 #define CLICK 326 #define CLIP 327 #define CLOSE 328 #define COEFFICIENTS 329 #define COLOR 330 #define COMMENT 331 #define COMPLEX 332 #define COMPUTING 333 #define CONSTRAINTS 334 #define COPY 335 #define CYCLE 336 #define DAYMONTH 337 #define DAYOFWEEKL 338 #define DAYOFWEEKS 339 #define DAYOFYEAR 340 #define DDMMYY 341 #define DECIMAL 342 #define DEF 343 #define DEFAULT 344 #define DEFINE 345 #define DEGREESLAT 346 #define DEGREESLON 347 #define DEGREESMMLAT 348 #define DEGREESMMLON 349 #define DEGREESMMSSLAT 350 #define DEGREESMMSSLON 351 #define DESCENDING 352 #define DESCRIPTION 353 #define DEVICE 354 #define DFT 355 #define DIFFERENCE 356 #define DISK 357 #define DOWN 358 #define DPI 359 #define DROP 360 #define DROPLINE 361 #define ECHO 362 #define ELLIPSE 363 #define ENGINEERING 364 #define ERRORBAR 365 #define EXIT 366 #define EXPONENTIAL 367 #define FFT 368 #define FILEP 369 #define FILL 370 #define FIT 371 #define FIXED 372 #define FIXEDPOINT 373 #define FLUSH 374 #define FOCUS 375 #define FOLLOWS 376 #define FONTP 377 #define FORCE 378 #define FORMAT 379 #define FORMULA 380 #define FRAMEP 381 #define FREE 382 #define FREQUENCY 383 #define FROM 384 #define GENERAL 385 #define GETP 386 #define GRAPH 387 #define GRAPHNO 388 #define GRID 389 #define HAMMING 390 #define HANNING 391 #define HARDCOPY 392 #define HBAR 393 #define HELP 394 #define HGAP 395 #define HIDDEN 396 #define HISTOGRAM 397 #define HMS 398 #define HORIZI 399 #define HORIZONTAL 400 #define HORIZO 401 #define ID 402 #define IFILTER 403 #define IMAX 404 #define IMIN 405 #define IN 406 #define INCREMENT 407 #define INOUT 408 #define INT 409 #define INTEGRATE 410 #define INTERPOLATE 411 #define INVDFT 412 #define INVERT 413 #define INVFFT 414 #define JUST 415 #define KILL 416 #define LABEL 417 #define LANDSCAPE 418 #define LAYOUT 419 #define LEFT 420 #define LEGEND 421 #define LENGTH 422 #define LINCONV 423 #define LINE 424 #define LINEAR 425 #define LINESTYLE 426 #define LINEWIDTH 427 #define LINK 428 #define LOAD 429 #define LOCTYPE 430 #define LOG 431 #define LOGARITHMIC 432 #define LOGIT 433 #define LOGX 434 #define LOGXY 435 #define LOGY 436 #define MAGIC 437 #define MAGNITUDE 438 #define MAJOR 439 #define MAP 440 #define MAXP 441 #define MESH 442 #define MINP 443 #define MINOR 444 #define MMDD 445 #define MMDDHMS 446 #define MMDDYY 447 #define MMDDYYHMS 448 #define MMSSLAT 449 #define MMSSLON 450 #define MMYY 451 #define MONTHDAY 452 #define MONTHL 453 #define MONTHS 454 #define MONTHSY 455 #define MOVE 456 #define NEGATE 457 #define NEW 458 #define NONE 459 #define NONLFIT 460 #define NORMAL 461 #define NXY 462 #define OFF 463 #define OFFSET 464 #define OFFSETX 465 #define OFFSETY 466 #define OFILTER 467 #define ON 468 #define ONREAD 469 #define OP 470 #define OPPOSITE 471 #define OUT 472 #define PAGE 473 #define PARA 474 #define PARAMETERS 475 #define PARZEN 476 #define PATTERN 477 #define PERIOD 478 #define PERP 479 #define PHASE 480 #define PIE 481 #define PIPE 482 #define PLACE 483 #define POINT 484 #define POLAR 485 #define POLYI 486 #define POLYO 487 #define POP 488 #define PORTRAIT 489 #define POWER 490 #define PREC 491 #define PREPEND 492 #define PRINT 493 #define PS 494 #define PUSH 495 #define PUTP 496 #define RAND 497 #define READ 498 #define REAL 499 #define RECIPROCAL 500 #define REDRAW 501 #define REFERENCE 502 #define REGNUM 503 #define REGRESS 504 #define RESIZE 505 #define RESTRICT 506 #define REVERSE 507 #define RIGHT 508 #define RISER 509 #define ROT 510 #define ROUNDED 511 #define RSUM 512 #define RULE 513 #define RUNAVG 514 #define RUNMAX 515 #define RUNMED 516 #define RUNMIN 517 #define RUNSTD 518 #define SAVEALL 519 #define SCALE 520 #define SCIENTIFIC 521 #define SCROLL 522 #define SD 523 #define SET 524 #define SETNUM 525 #define SFORMAT 526 #define SIGN 527 #define SIZE 528 #define SKIP 529 #define SLEEP 530 #define SMITH 531 #define SORT 532 #define SOURCE 533 #define SPEC 534 #define SPLINE 535 #define SPLIT 536 #define STACK 537 #define STACKED 538 #define STACKEDBAR 539 #define STACKEDHBAR 540 #define STAGGER 541 #define START 542 #define STOP 543 #define STRING 544 #define SUM 545 #define SUBTITLE 546 #define SWAP 547 #define SYMBOL 548 #define TARGET 549 #define TICKLABEL 550 #define TICKP 551 #define TICKSP 552 #define TIMER 553 #define TIMESTAMP 554 #define TITLE 555 #define TO 556 #define TOP 557 #define TRIANGULAR 558 #define TYPE 559 #define UP 560 #define UPDATEALL 561 #define USE 562 #define VERSION 563 #define VERTI 564 #define VERTICAL 565 #define VERTO 566 #define VGAP 567 #define VIEW 568 #define VX1 569 #define VX2 570 #define VXMAX 571 #define VY1 572 #define VY2 573 #define VYMAX 574 #define WELCH 575 #define WITH 576 #define WORLD 577 #define WRAP 578 #define WRITE 579 #define WX1 580 #define WX2 581 #define WY1 582 #define WY2 583 #define X_TOK 584 #define X0 585 #define X1 586 #define XAXES 587 #define XAXIS 588 #define XCOR 589 #define XMAX 590 #define XMIN 591 #define XY 592 #define XYAXES 593 #define XYBOXPLOT 594 #define XYCOLOR 595 #define XYCOLPAT 596 #define XYDX 597 #define XYDXDX 598 #define XYDXDXDYDY 599 #define XYDXDY 600 #define XYDY 601 #define XYDYDY 602 #define XYHILO 603 #define XYR 604 #define XYSIZE 605 #define XYSTRING 606 #define XYVMAP 607 #define XYZ 608 #define Y_TOK 609 #define Y0 610 #define Y1 611 #define Y2 612 #define Y3 613 #define Y4 614 #define YAXES 615 #define YAXIS 616 #define YEAR 617 #define YMAX 618 #define YMIN 619 #define YYMMDD 620 #define YYMMDDHMS 621 #define ZERO 622 #define ZNORM 623 #define FITPARM 624 #define FITPMAX 625 #define FITPMIN 626 #define NUMBER 627 #define NEW_TOKEN 628 #define OR 629 #define AND 630 #define NE 631 #define EQ 632 #define GE 633 #define LE 634 #define LT 635 #define GT 636 #define NOT 637 #define UMINUS 638 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { /* Line 293 of yacc.c */ #line 142 "pars.yacc" int ival; double dval; char *sval; double *dptr; target *trgt; grarr *vrbl; /* Line 293 of yacc.c */ #line 1026 "y.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif /* Copy the second part of user declarations. */ /* Line 343 of yacc.c */ #line 1038 "y.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int yyi) #else static int YYID (yyi) int yyi; #endif { return yyi; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 523 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 11867 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 400 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 77 /* YYNRULES -- Number of rules. */ #define YYNRULES 839 /* YYNRULES -- Number of states. */ #define YYNSTATES 1673 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 638 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint16 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 388, 2, 2, 394, 395, 386, 384, 396, 385, 392, 387, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 375, 393, 2, 399, 2, 374, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 397, 2, 398, 391, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 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, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 376, 377, 378, 379, 380, 381, 382, 383, 389, 390 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 5, 7, 9, 11, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 51, 56, 63, 67, 71, 75, 79, 81, 84, 86, 91, 96, 103, 110, 117, 126, 135, 146, 159, 174, 178, 182, 186, 190, 194, 198, 202, 206, 211, 220, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 259, 263, 267, 270, 273, 277, 281, 285, 289, 295, 299, 303, 307, 311, 315, 319, 323, 327, 330, 332, 336, 340, 342, 344, 348, 350, 352, 354, 356, 358, 360, 364, 366, 373, 378, 387, 392, 397, 402, 407, 412, 419, 426, 433, 440, 449, 458, 469, 482, 497, 501, 505, 509, 513, 517, 521, 525, 529, 533, 537, 541, 545, 549, 553, 557, 561, 565, 569, 572, 578, 584, 590, 596, 600, 604, 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 695, 699, 702, 706, 710, 714, 718, 723, 725, 729, 733, 736, 741, 747, 750, 753, 756, 759, 763, 767, 774, 783, 786, 790, 793, 796, 799, 809, 815, 820, 823, 829, 835, 843, 848, 854, 859, 864, 868, 872, 876, 881, 884, 889, 894, 899, 903, 913, 916, 919, 922, 925, 930, 934, 937, 941, 944, 947, 956, 960, 963, 966, 969, 973, 977, 980, 983, 987, 990, 993, 1002, 1006, 1009, 1012, 1015, 1019, 1023, 1026, 1029, 1033, 1036, 1039, 1048, 1052, 1055, 1058, 1061, 1065, 1070, 1075, 1082, 1085, 1088, 1092, 1095, 1098, 1103, 1107, 1110, 1114, 1117, 1121, 1126, 1130, 1133, 1136, 1141, 1145, 1148, 1153, 1157, 1160, 1163, 1166, 1169, 1174, 1177, 1182, 1186, 1194, 1208, 1217, 1220, 1229, 1232, 1235, 1239, 1242, 1245, 1248, 1252, 1255, 1259, 1263, 1267, 1271, 1275, 1279, 1283, 1287, 1290, 1293, 1296, 1300, 1304, 1308, 1312, 1316, 1321, 1326, 1330, 1334, 1338, 1342, 1347, 1352, 1355, 1358, 1361, 1365, 1368, 1371, 1374, 1377, 1381, 1385, 1388, 1392, 1396, 1400, 1405, 1409, 1415, 1422, 1429, 1434, 1437, 1443, 1446, 1449, 1452, 1455, 1459, 1461, 1463, 1466, 1469, 1472, 1474, 1477, 1479, 1484, 1486, 1490, 1494, 1497, 1500, 1503, 1505, 1508, 1511, 1515, 1519, 1523, 1529, 1535, 1540, 1545, 1550, 1553, 1557, 1562, 1567, 1570, 1574, 1577, 1580, 1582, 1595, 1614, 1635, 1642, 1651, 1658, 1665, 1672, 1685, 1696, 1707, 1714, 1719, 1730, 1737, 1744, 1753, 1755, 1758, 1761, 1764, 1766, 1769, 1772, 1776, 1780, 1785, 1789, 1792, 1796, 1801, 1805, 1810, 1813, 1818, 1823, 1830, 1833, 1836, 1838, 1842, 1844, 1846, 1848, 1851, 1854, 1857, 1860, 1863, 1866, 1870, 1874, 1877, 1880, 1883, 1886, 1888, 1890, 1893, 1897, 1901, 1905, 1909, 1913, 1917, 1922, 1927, 1932, 1937, 1942, 1947, 1952, 1956, 1960, 1964, 1968, 1973, 1978, 1982, 1986, 1990, 1995, 1999, 2003, 2008, 2014, 2018, 2022, 2027, 2032, 2037, 2044, 2049, 2054, 2058, 2062, 2066, 2070, 2075, 2079, 2083, 2088, 2093, 2099, 2106, 2110, 2114, 2116, 2120, 2123, 2126, 2129, 2132, 2135, 2138, 2141, 2146, 2148, 2151, 2155, 2159, 2162, 2165, 2168, 2170, 2174, 2178, 2180, 2183, 2186, 2188, 2191, 2194, 2197, 2200, 2204, 2208, 2210, 2214, 2217, 2222, 2227, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, 2253, 2255, 2258, 2261, 2264, 2268, 2272, 2276, 2280, 2284, 2286, 2288, 2292, 2295, 2298, 2303, 2305, 2308, 2311, 2314, 2317, 2322, 2325, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2346, 2349, 2353, 2356, 2358, 2361, 2365, 2370, 2372, 2375, 2378, 2382, 2384, 2386, 2388, 2390, 2392, 2394, 2396, 2398, 2400, 2402, 2404, 2406, 2408, 2410, 2412, 2414, 2416, 2418, 2420, 2422, 2424, 2426, 2428, 2430, 2432, 2434, 2436, 2438, 2440, 2442, 2444, 2446, 2448, 2450, 2452, 2454, 2456, 2458, 2460, 2462, 2464, 2466, 2468, 2470, 2472, 2474, 2476, 2478, 2480, 2482, 2484, 2486, 2488, 2490, 2492, 2494, 2496, 2498, 2500, 2502, 2504, 2506, 2508, 2510, 2512, 2514, 2516, 2518, 2520, 2522, 2524, 2526, 2528, 2530, 2532, 2534, 2536, 2538, 2540, 2542, 2544, 2546, 2548, 2550, 2552, 2554, 2556, 2558, 2560, 2562, 2564, 2566, 2568, 2570, 2572, 2574, 2576, 2578, 2580, 2582, 2584, 2586, 2588, 2590, 2592, 2594, 2596, 2598, 2600, 2602, 2604, 2606, 2608, 2610, 2612, 2614, 2616, 2618, 2620, 2622, 2624, 2626, 2628, 2630, 2632, 2634, 2636, 2638, 2640, 2642, 2644, 2646, 2648, 2650, 2652, 2654, 2656, 2658, 2660, 2662, 2664, 2666, 2668, 2670, 2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686, 2688, 2690, 2692, 2694, 2696, 2698, 2700, 2702, 2704, 2706, 2708, 2710, 2712, 2715, 2718, 2721, 2724, 2727, 2730, 2739, 2742, 2745, 2747, 2749, 2751, 2755, 2760, 2763, 2767, 2772, 2790, 2794, 2798, 2801, 2804, 2807, 2810, 2814, 2818, 2822, 2827, 2832, 2838, 2841, 2844, 2848, 2852, 2856, 2860, 2864, 2868, 2872, 2876, 2880, 2884, 2888, 2892, 2896, 2900, 2904, 2908, 2912, 2916, 2921, 2926, 2931, 2935, 2940, 2945, 2948, 2950, 2952, 2957, 2961, 2965, 2970, 2975, 2978, 2981, 2984, 2989, 2995, 3000, 3005, 3008, 3011, 3014, 3017, 3020, 3023, 3026, 3029, 3032, 3035, 3039, 3041, 3043, 3046, 3049, 3052, 3055, 3058, 3062, 3066, 3068, 3071, 3073, 3075, 3077, 3080, 3082, 3084, 3086, 3088 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 401, 0, -1, 402, -1, 404, -1, 412, -1, 403, -1, 402, 393, 403, -1, -1, 418, -1, 469, -1, 417, -1, 431, -1, 421, -1, 419, -1, 420, -1, 413, -1, 415, -1, 416, -1, 1, -1, 372, -1, 19, -1, 369, -1, 370, -1, 371, -1, 411, 408, -1, 461, 394, 412, 395, -1, 154, 394, 412, 396, 412, 395, -1, 411, 392, 167, -1, 430, 392, 167, -1, 430, 392, 147, -1, 429, 392, 147, -1, 21, -1, 404, 22, -1, 242, -1, 23, 394, 406, 395, -1, 24, 394, 404, 395, -1, 26, 394, 406, 396, 404, 395, -1, 25, 394, 406, 396, 406, 395, -1, 27, 394, 404, 396, 404, 395, -1, 28, 394, 406, 396, 406, 396, 404, 395, -1, 29, 394, 404, 396, 404, 396, 404, 395, -1, 30, 394, 404, 396, 404, 396, 404, 396, 404, 395, -1, 31, 394, 404, 396, 404, 396, 404, 396, 404, 396, 404, 395, -1, 32, 394, 404, 396, 404, 396, 404, 396, 404, 396, 404, 396, 404, 395, -1, 429, 392, 314, -1, 429, 392, 315, -1, 429, 392, 317, -1, 429, 392, 318, -1, 429, 392, 325, -1, 429, 392, 326, -1, 429, 392, 327, -1, 429, 392, 328, -1, 18, 394, 409, 395, -1, 18, 394, 406, 396, 407, 396, 407, 395, -1, 18, 394, 406, 396, 407, 396, 407, 396, 407, 396, 407, 396, 404, 395, -1, 314, -1, 315, -1, 317, -1, 318, -1, 325, -1, 326, -1, 327, -1, 328, -1, 316, -1, 319, -1, 394, 404, 395, -1, 404, 384, 404, -1, 404, 385, 404, -1, 385, 404, -1, 384, 404, -1, 404, 386, 404, -1, 404, 387, 404, -1, 404, 388, 404, -1, 404, 391, 404, -1, 404, 374, 404, 375, 404, -1, 404, 383, 404, -1, 404, 382, 404, -1, 404, 381, 404, -1, 404, 380, 404, -1, 404, 379, 404, -1, 404, 378, 404, -1, 404, 377, 404, -1, 404, 376, 404, -1, 389, 404, -1, 69, -1, 405, 392, 405, -1, 405, 392, 404, -1, 404, -1, 406, -1, 397, 406, 398, -1, 404, -1, 405, -1, 404, -1, 405, -1, 20, -1, 452, -1, 430, 392, 452, -1, 411, -1, 411, 397, 406, 375, 406, 398, -1, 187, 394, 407, 395, -1, 187, 394, 404, 396, 404, 396, 407, 395, -1, 242, 394, 407, 395, -1, 248, 394, 430, 395, -1, 257, 394, 412, 395, -1, 23, 394, 412, 395, -1, 24, 394, 412, 395, -1, 27, 394, 412, 396, 412, 395, -1, 27, 394, 404, 396, 412, 395, -1, 27, 394, 412, 396, 404, 395, -1, 26, 394, 406, 396, 412, 395, -1, 28, 394, 406, 396, 406, 396, 412, 395, -1, 29, 394, 404, 396, 404, 396, 412, 395, -1, 30, 394, 404, 396, 404, 396, 404, 396, 412, 395, -1, 31, 394, 404, 396, 404, 396, 404, 396, 404, 396, 412, 395, -1, 32, 394, 404, 396, 404, 396, 404, 396, 404, 396, 404, 396, 412, 395, -1, 412, 384, 412, -1, 412, 384, 404, -1, 404, 384, 412, -1, 412, 385, 412, -1, 412, 385, 404, -1, 404, 385, 412, -1, 412, 386, 412, -1, 412, 386, 404, -1, 404, 386, 412, -1, 412, 387, 412, -1, 412, 387, 404, -1, 404, 387, 412, -1, 412, 388, 412, -1, 412, 388, 404, -1, 404, 388, 412, -1, 412, 391, 412, -1, 412, 391, 404, -1, 404, 391, 412, -1, 412, 22, -1, 412, 374, 404, 375, 404, -1, 412, 374, 404, 375, 412, -1, 412, 374, 412, 375, 404, -1, 412, 374, 412, 375, 412, -1, 412, 376, 412, -1, 412, 376, 404, -1, 404, 376, 412, -1, 412, 377, 412, -1, 412, 377, 404, -1, 404, 377, 412, -1, 412, 383, 412, -1, 412, 383, 404, -1, 404, 383, 412, -1, 412, 382, 412, -1, 412, 382, 404, -1, 404, 382, 412, -1, 412, 380, 412, -1, 412, 380, 404, -1, 404, 380, 412, -1, 412, 381, 412, -1, 412, 381, 404, -1, 404, 381, 412, -1, 412, 379, 412, -1, 412, 379, 404, -1, 404, 379, 412, -1, 412, 378, 412, -1, 412, 378, 404, -1, 404, 378, 412, -1, 389, 412, -1, 394, 412, 395, -1, 385, 412, -1, 19, 399, 404, -1, 369, 399, 404, -1, 370, 399, 404, -1, 371, 399, 404, -1, 411, 408, 399, 404, -1, 411, -1, 414, 399, 412, -1, 414, 399, 404, -1, 90, 373, -1, 90, 373, 397, 398, -1, 90, 373, 397, 407, 398, -1, 90, 19, -1, 90, 20, -1, 70, 19, -1, 70, 20, -1, 35, 405, 405, -1, 35, 123, 443, -1, 307, 405, 304, 433, 129, 405, -1, 307, 405, 304, 433, 129, 405, 35, 405, -1, 248, 443, -1, 248, 304, 441, -1, 248, 465, -1, 248, 463, -1, 248, 466, -1, 248, 169, 404, 396, 404, 396, 404, 396, 404, -1, 248, 337, 404, 396, 404, -1, 173, 248, 301, 429, -1, 308, 407, -1, 218, 250, 407, 396, 407, -1, 218, 273, 407, 396, 407, -1, 99, 405, 218, 273, 407, 396, 407, -1, 99, 405, 104, 404, -1, 99, 405, 122, 40, 443, -1, 99, 405, 122, 443, -1, 99, 405, 215, 405, -1, 137, 99, 405, -1, 247, 18, 410, -1, 18, 323, 443, -1, 18, 323, 362, 406, -1, 51, 465, -1, 218, 51, 115, 443, -1, 218, 267, 404, 388, -1, 218, 153, 404, 388, -1, 173, 218, 443, -1, 282, 322, 404, 396, 404, 396, 404, 396, 404, -1, 298, 407, -1, 294, 430, -1, 321, 429, -1, 321, 430, -1, 430, 173, 445, 405, -1, 430, 173, 443, -1, 321, 64, -1, 321, 64, 407, -1, 64, 443, -1, 64, 429, -1, 64, 404, 396, 404, 396, 404, 396, 404, -1, 64, 175, 451, -1, 64, 463, -1, 64, 466, -1, 64, 465, -1, 64, 115, 465, -1, 64, 115, 464, -1, 64, 88, -1, 321, 108, -1, 321, 108, 407, -1, 108, 443, -1, 108, 429, -1, 108, 404, 396, 404, 396, 404, 396, 404, -1, 108, 175, 451, -1, 108, 463, -1, 108, 466, -1, 108, 465, -1, 108, 115, 465, -1, 108, 115, 464, -1, 108, 88, -1, 321, 169, -1, 321, 169, 407, -1, 169, 443, -1, 169, 429, -1, 169, 404, 396, 404, 396, 404, 396, 404, -1, 169, 175, 451, -1, 169, 466, -1, 169, 463, -1, 169, 465, -1, 169, 43, 407, -1, 169, 43, 167, 404, -1, 169, 43, 304, 407, -1, 169, 43, 164, 404, 396, 404, -1, 169, 88, -1, 321, 289, -1, 321, 289, 407, -1, 289, 443, -1, 289, 429, -1, 289, 404, 396, 404, -1, 289, 175, 451, -1, 289, 465, -1, 289, 255, 407, -1, 289, 462, -1, 289, 160, 407, -1, 289, 67, 273, 404, -1, 289, 88, 405, -1, 299, 443, -1, 299, 462, -1, 299, 67, 273, 404, -1, 299, 255, 407, -1, 299, 465, -1, 299, 404, 396, 404, -1, 299, 88, 405, -1, 89, 463, -1, 89, 466, -1, 89, 465, -1, 89, 464, -1, 89, 67, 273, 404, -1, 89, 462, -1, 89, 293, 273, 404, -1, 89, 271, 405, -1, 185, 122, 407, 301, 405, 396, 405, -1, 185, 75, 407, 301, 394, 407, 396, 407, 396, 407, 395, 396, 405, -1, 322, 404, 396, 404, 396, 404, 396, 404, -1, 368, 404, -1, 313, 404, 396, 404, 396, 404, 396, 404, -1, 300, 405, -1, 300, 462, -1, 300, 273, 404, -1, 300, 465, -1, 291, 405, -1, 291, 462, -1, 291, 273, 404, -1, 291, 465, -1, 332, 265, 442, -1, 360, 265, 442, -1, 332, 158, 443, -1, 360, 158, 443, -1, 47, 214, 204, -1, 47, 214, 332, -1, 47, 214, 360, -1, 47, 214, 338, -1, 98, 405, -1, 70, 98, -1, 166, 443, -1, 166, 175, 451, -1, 166, 312, 407, -1, 166, 140, 407, -1, 166, 167, 407, -1, 166, 158, 443, -1, 166, 64, 115, 465, -1, 166, 64, 115, 464, -1, 166, 64, 465, -1, 166, 64, 464, -1, 166, 64, 463, -1, 166, 64, 466, -1, 166, 404, 396, 404, -1, 166, 67, 273, 404, -1, 166, 462, -1, 166, 465, -1, 126, 443, -1, 126, 304, 407, -1, 126, 463, -1, 126, 466, -1, 126, 465, -1, 126, 464, -1, 126, 51, 465, -1, 126, 51, 464, -1, 429, 443, -1, 429, 141, 443, -1, 429, 304, 438, -1, 429, 283, 443, -1, 429, 52, 140, 404, -1, 429, 118, 443, -1, 429, 118, 124, 448, 448, -1, 429, 118, 236, 404, 396, 404, -1, 429, 118, 337, 404, 396, 404, -1, 429, 118, 304, 407, -1, 304, 437, -1, 90, 435, 405, 436, 405, -1, 70, 435, -1, 278, 445, -1, 124, 448, -1, 116, 428, -1, 369, 79, 443, -1, 246, -1, 306, -1, 65, 405, -1, 107, 405, -1, 107, 404, -1, 73, -1, 73, 405, -1, 111, -1, 111, 394, 406, 395, -1, 238, -1, 238, 301, 99, -1, 238, 301, 405, -1, 218, 450, -1, 275, 404, -1, 139, 405, -1, 139, -1, 131, 405, -1, 241, 405, -1, 430, 141, 443, -1, 430, 167, 407, -1, 20, 167, 407, -1, 430, 229, 404, 396, 404, -1, 430, 105, 407, 396, 407, -1, 277, 430, 454, 453, -1, 80, 430, 301, 430, -1, 41, 430, 301, 430, -1, 252, 430, -1, 281, 430, 407, -1, 201, 430, 301, 430, -1, 292, 430, 377, 430, -1, 161, 430, -1, 161, 430, 264, -1, 161, 429, -1, 161, 248, -1, 119, -1, 42, 394, 407, 396, 407, 396, 404, 396, 404, 396, 404, 395, -1, 42, 394, 407, 396, 407, 396, 404, 396, 404, 396, 404, 396, 443, 396, 443, 396, 443, 395, -1, 42, 394, 407, 396, 407, 396, 404, 396, 404, 396, 404, 396, 443, 396, 443, 396, 443, 396, 443, 395, -1, 205, 394, 430, 396, 407, 395, -1, 205, 394, 430, 396, 412, 396, 407, 395, -1, 249, 394, 430, 396, 407, 395, -1, 444, 394, 430, 396, 407, 395, -1, 455, 394, 430, 396, 407, 395, -1, 455, 394, 430, 396, 456, 396, 459, 396, 457, 396, 458, 395, -1, 156, 394, 430, 396, 412, 396, 460, 396, 443, 395, -1, 142, 394, 430, 396, 412, 396, 443, 396, 443, 395, -1, 101, 394, 430, 396, 407, 395, -1, 155, 394, 430, 395, -1, 334, 394, 430, 396, 430, 396, 407, 396, 443, 395, -1, 168, 394, 430, 396, 430, 395, -1, 251, 394, 430, 396, 412, 395, -1, 251, 394, 430, 396, 248, 396, 443, 395, -1, 47, -1, 47, 332, -1, 47, 360, -1, 47, 430, -1, 48, -1, 120, 429, -1, 243, 405, -1, 243, 56, 405, -1, 243, 61, 405, -1, 243, 61, 445, 405, -1, 61, 437, 405, -1, 161, 61, -1, 243, 437, 405, -1, 243, 437, 445, 405, -1, 243, 207, 405, -1, 243, 207, 445, 405, -1, 324, 430, -1, 324, 430, 124, 405, -1, 324, 430, 114, 405, -1, 324, 430, 114, 405, 124, 405, -1, 264, 405, -1, 174, 405, -1, 203, -1, 203, 129, 405, -1, 240, -1, 233, -1, 81, -1, 282, 407, -1, 70, 282, -1, 70, 64, -1, 70, 108, -1, 70, 169, -1, 70, 289, -1, 218, 164, 439, -1, 46, 246, 443, -1, 120, 443, -1, 120, 269, -1, 120, 121, -1, 120, 71, -1, 422, -1, 471, -1, 430, 443, -1, 430, 304, 437, -1, 430, 293, 407, -1, 430, 293, 465, -1, 430, 293, 464, -1, 430, 293, 466, -1, 430, 293, 463, -1, 430, 293, 115, 465, -1, 430, 293, 115, 464, -1, 430, 293, 273, 404, -1, 430, 293, 67, 407, -1, 430, 293, 67, 462, -1, 430, 293, 274, 407, -1, 430, 169, 304, 407, -1, 430, 169, 463, -1, 430, 169, 466, -1, 430, 169, 465, -1, 430, 169, 464, -1, 430, 115, 304, 407, -1, 430, 115, 258, 407, -1, 430, 115, 465, -1, 430, 115, 464, -1, 430, 55, 443, -1, 430, 55, 304, 407, -1, 430, 106, 443, -1, 430, 49, 443, -1, 430, 49, 304, 407, -1, 430, 49, 67, 273, 404, -1, 430, 49, 462, -1, 430, 49, 465, -1, 430, 49, 255, 407, -1, 430, 49, 124, 448, -1, 430, 49, 236, 407, -1, 430, 49, 209, 404, 396, 404, -1, 430, 49, 237, 405, -1, 430, 49, 41, 405, -1, 430, 110, 443, -1, 430, 110, 467, -1, 430, 110, 465, -1, 430, 110, 464, -1, 430, 110, 273, 404, -1, 430, 110, 466, -1, 430, 110, 463, -1, 430, 110, 254, 466, -1, 430, 110, 254, 463, -1, 430, 110, 254, 72, 443, -1, 430, 110, 254, 72, 167, 404, -1, 430, 76, 405, -1, 430, 166, 405, -1, 443, -1, 304, 367, 443, -1, 296, 424, -1, 296, 472, -1, 295, 425, -1, 295, 473, -1, 162, 426, -1, 162, 470, -1, 52, 427, -1, 209, 404, 396, 404, -1, 443, -1, 184, 404, -1, 189, 297, 407, -1, 228, 256, 443, -1, 210, 404, -1, 211, 404, -1, 89, 407, -1, 447, -1, 184, 273, 404, -1, 189, 273, 404, -1, 465, -1, 184, 465, -1, 189, 465, -1, 466, -1, 184, 466, -1, 189, 466, -1, 184, 463, -1, 189, 463, -1, 184, 134, 443, -1, 189, 134, 443, -1, 467, -1, 279, 304, 434, -1, 279, 407, -1, 184, 407, 396, 404, -1, 189, 407, 396, 404, -1, 443, -1, 236, 407, -1, 124, 448, -1, 124, 404, -1, 41, 405, -1, 237, 405, -1, 39, 407, -1, 274, 407, -1, 286, 407, -1, 467, -1, 125, 405, -1, 287, 404, -1, 288, 404, -1, 287, 304, 279, -1, 287, 304, 46, -1, 288, 304, 279, -1, 288, 304, 46, -1, 67, 273, 404, -1, 462, -1, 465, -1, 407, 396, 405, -1, 209, 46, -1, 209, 279, -1, 209, 404, 396, 404, -1, 405, -1, 164, 224, -1, 164, 219, -1, 228, 46, -1, 228, 279, -1, 228, 404, 396, 404, -1, 160, 446, -1, 67, 273, 404, -1, 462, -1, 465, -1, 467, -1, 443, -1, 465, -1, 463, -1, 466, -1, 300, 405, -1, 125, 405, -1, 321, 407, 220, -1, 236, 404, -1, 133, -1, 132, 408, -1, 429, 392, 270, -1, 429, 392, 269, 408, -1, 270, -1, 269, 408, -1, 432, 423, -1, 429, 432, 423, -1, 333, -1, 361, -1, 37, -1, 38, -1, 5, -1, 6, -1, 7, -1, 8, -1, 10, -1, 9, -1, 11, -1, 12, -1, 13, -1, 14, -1, 15, -1, 16, -1, 204, -1, 297, -1, 62, -1, 148, -1, 212, -1, 182, -1, 222, -1, 337, -1, 52, -1, 53, -1, 54, -1, 353, -1, 342, -1, 346, -1, 343, -1, 347, -1, 345, -1, 344, -1, 348, -1, 349, -1, 350, -1, 340, -1, 341, -1, 352, -1, 339, -1, 351, -1, 337, -1, 68, -1, 230, -1, 276, -1, 117, -1, 226, -1, 127, -1, 117, -1, 163, -1, 234, -1, 33, -1, 58, -1, 165, -1, 253, -1, 231, -1, 232, -1, 144, -1, 309, -1, 146, -1, 311, -1, 206, -1, 177, -1, 245, -1, 178, -1, 213, -1, 208, -1, 259, -1, 263, -1, 261, -1, 260, -1, 262, -1, 102, -1, 227, -1, 253, -1, 165, -1, 66, -1, 151, -1, 217, -1, 62, -1, 87, -1, 112, -1, 130, -1, 266, -1, 109, -1, 78, -1, 235, -1, 86, -1, 192, -1, 365, -1, 196, -1, 190, -1, 197, -1, 82, -1, 199, -1, 200, -1, 198, -1, 84, -1, 83, -1, 85, -1, 143, -1, 191, -1, 193, -1, 366, -1, 92, -1, 94, -1, 96, -1, 195, -1, 91, -1, 93, -1, 95, -1, 194, -1, 206, -1, 34, -1, 202, -1, 305, -1, 103, -1, 253, -1, 165, -1, 151, -1, 217, -1, 322, -1, 313, -1, 329, -1, 354, -1, 330, -1, 355, -1, 356, -1, 357, -1, 358, -1, 359, -1, 44, -1, 97, -1, 329, -1, 354, -1, 100, -1, 113, -1, 157, -1, 159, -1, 244, -1, 77, -1, 17, -1, 128, -1, 223, -1, 183, -1, 225, -1, 74, -1, 204, -1, 303, -1, 136, -1, 320, -1, 135, -1, 60, -1, 221, -1, 170, -1, 280, -1, 45, -1, 188, -1, 186, -1, 50, -1, 268, -1, 290, -1, 150, -1, 149, -1, 122, 407, -1, 122, 405, -1, 171, 407, -1, 222, 407, -1, 75, 407, -1, 75, 405, -1, 75, 394, 407, 396, 407, 396, 407, 395, -1, 172, 404, -1, 228, 468, -1, 206, -1, 216, -1, 62, -1, 218, 164, 440, -1, 218, 273, 372, 372, -1, 218, 407, -1, 218, 153, 407, -1, 89, 122, 278, 404, -1, 282, 322, 404, 396, 404, 396, 404, 396, 404, 296, 404, 396, 404, 396, 404, 396, 404, -1, 64, 115, 474, -1, 108, 115, 474, -1, 289, 466, -1, 299, 466, -1, 300, 466, -1, 291, 466, -1, 166, 64, 443, -1, 166, 331, 404, -1, 166, 356, 404, -1, 166, 289, 407, 405, -1, 166, 64, 115, 443, -1, 166, 64, 115, 321, 474, -1, 166, 463, -1, 166, 466, -1, 429, 162, 443, -1, 429, 304, 179, -1, 429, 304, 181, -1, 429, 304, 180, -1, 429, 304, 52, -1, 429, 304, 138, -1, 429, 304, 284, -1, 429, 304, 285, -1, 322, 336, 404, -1, 322, 335, 404, -1, 322, 364, 404, -1, 322, 363, 404, -1, 313, 336, 404, -1, 313, 335, 404, -1, 313, 364, 404, -1, 313, 363, 404, -1, 166, 164, 404, -1, 126, 115, 443, -1, 429, 47, 304, 46, -1, 429, 47, 304, 279, -1, 169, 43, 273, 404, -1, 137, 99, 404, -1, 239, 172, 57, 404, -1, 239, 172, 152, 404, -1, 239, 466, -1, 466, -1, 475, -1, 430, 293, 115, 407, -1, 430, 274, 407, -1, 430, 115, 407, -1, 430, 110, 304, 476, -1, 430, 293, 66, 443, -1, 430, 463, -1, 430, 466, -1, 430, 465, -1, 430, 115, 321, 474, -1, 430, 353, 404, 396, 404, -1, 430, 110, 167, 404, -1, 430, 110, 254, 443, -1, 184, 443, -1, 189, 443, -1, 36, 443, -1, 188, 372, -1, 186, 372, -1, 176, 443, -1, 304, 46, -1, 304, 279, -1, 189, 404, -1, 273, 404, -1, 407, 396, 404, -1, 475, -1, 466, -1, 304, 46, -1, 304, 279, -1, 164, 279, -1, 164, 145, -1, 164, 310, -1, 228, 213, 297, -1, 228, 59, 297, -1, 475, -1, 272, 449, -1, 204, -1, 75, -1, 222, -1, 215, 476, -1, 302, -1, 63, -1, 165, -1, 253, -1, 62, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 623, 623, 624, 628, 635, 636, 639, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 658, 661, 664, 667, 670, 673, 680, 714, 722, 725, 728, 731, 734, 738, 742, 746, 750, 754, 758, 762, 766, 770, 774, 778, 782, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 820, 827, 834, 841, 848, 855, 862, 869, 876, 881, 886, 889, 892, 895, 898, 901, 904, 913, 921, 932, 935, 938, 941, 944, 947, 950, 953, 956, 959, 964, 967, 971, 980, 990, 999, 1009, 1012, 1027, 1030, 1046, 1050, 1063, 1079, 1083, 1105, 1123, 1141, 1157, 1186, 1196, 1206, 1216, 1231, 1242, 1253, 1264, 1275, 1286, 1297, 1308, 1319, 1334, 1345, 1356, 1371, 1382, 1393, 1408, 1419, 1430, 1449, 1464, 1479, 1499, 1514, 1530, 1553, 1572, 1591, 1601, 1610, 1623, 1636, 1649, 1664, 1675, 1686, 1701, 1712, 1723, 1738, 1749, 1760, 1775, 1786, 1797, 1812, 1823, 1834, 1849, 1860, 1871, 1886, 1897, 1908, 1923, 1934, 1945, 1955, 1965, 1978, 1982, 1986, 1990, 1994, 2005, 2032, 2043, 2053, 2070, 2078, 2089, 2093, 2097, 2102, 2108, 2126, 2129, 2136, 2147, 2150, 2153, 2156, 2159, 2162, 2169, 2177, 2184, 2194, 2197, 2200, 2215, 2229, 2243, 2257, 2272, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2301, 2306, 2310, 2314, 2317, 2322, 2326, 2331, 2334, 2341, 2348, 2355, 2365, 2368, 2371, 2374, 2377, 2380, 2383, 2414, 2417, 2424, 2431, 2438, 2448, 2451, 2454, 2457, 2460, 2463, 2466, 2497, 2500, 2507, 2514, 2521, 2531, 2534, 2537, 2540, 2543, 2546, 2549, 2552, 2556, 2573, 2576, 2583, 2590, 2597, 2605, 2608, 2611, 2614, 2617, 2620, 2623, 2639, 2642, 2645, 2648, 2651, 2654, 2658, 2664, 2668, 2672, 2676, 2679, 2683, 2687, 2690, 2694, 2702, 2715, 2725, 2728, 2738, 2746, 2753, 2760, 2767, 2775, 2782, 2789, 2797, 2804, 2811, 2818, 2825, 2828, 2831, 2834, 2838, 2847, 2851, 2858, 2865, 2872, 2879, 2886, 2893, 2900, 2907, 2914, 2921, 2928, 2935, 2943, 2950, 2957, 2965, 2972, 2979, 2986, 2993, 3000, 3007, 3015, 3024, 3027, 3030, 3033, 3037, 3041, 3044, 3048, 3052, 3056, 3060, 3065, 3072, 3076, 3079, 3082, 3083, 3089, 3092, 3099, 3103, 3107, 3114, 3117, 3120, 3123, 3126, 3133, 3136, 3141, 3163, 3168, 3176, 3183, 3188, 3200, 3203, 3206, 3209, 3213, 3218, 3223, 3226, 3236, 3239, 3242, 3245, 3248, 3251, 3254, 3257, 3260, 3263, 3266, 3272, 3278, 3285, 3297, 3300, 3303, 3306, 3326, 3330, 3334, 3337, 3340, 3343, 3346, 3363, 3378, 3383, 3388, 3393, 3396, 3399, 3407, 3412, 3416, 3420, 3424, 3437, 3440, 3446, 3453, 3457, 3461, 3468, 3476, 3484, 3493, 3501, 3505, 3508, 3512, 3515, 3518, 3521, 3525, 3528, 3531, 3534, 3537, 3544, 3549, 3552, 3555, 3558, 3561, 3568, 3569, 3573, 3576, 3580, 3583, 3586, 3589, 3592, 3595, 3598, 3601, 3604, 3607, 3610, 3614, 3618, 3622, 3626, 3630, 3635, 3639, 3643, 3661, 3681, 3685, 3690, 3695, 3699, 3703, 3707, 3711, 3715, 3719, 3723, 3727, 3731, 3736, 3742, 3745, 3748, 3751, 3754, 3757, 3760, 3763, 3766, 3769, 3772, 3776, 3781, 3789, 3796, 3803, 3804, 3805, 3806, 3807, 3808, 3809, 3810, 3821, 3828, 3835, 3842, 3850, 3857, 3864, 3871, 3878, 3885, 3892, 3899, 3906, 3913, 3920, 3927, 3934, 3941, 3948, 3955, 3962, 3969, 3976, 3983, 3991, 4002, 4009, 4016, 4023, 4030, 4038, 4046, 4053, 4060, 4067, 4074, 4083, 4090, 4097, 4104, 4111, 4118, 4125, 4132, 4139, 4146, 4161, 4168, 4175, 4186, 4194, 4201, 4208, 4215, 4222, 4230, 4237, 4244, 4251, 4258, 4268, 4275, 4282, 4289, 4299, 4303, 4307, 4310, 4316, 4320, 4327, 4340, 4353, 4366, 4382, 4383, 4387, 4388, 4389, 4390, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4409, 4410, 4411, 4415, 4416, 4420, 4421, 4425, 4426, 4427, 4428, 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 4447, 4448, 4449, 4450, 4451, 4452, 4456, 4457, 4461, 4462, 4466, 4467, 4468, 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4478, 4479, 4480, 4481, 4484, 4485, 4488, 4489, 4490, 4491, 4492, 4496, 4497, 4507, 4508, 4509, 4512, 4513, 4514, 4517, 4518, 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, 4536, 4537, 4538, 4539, 4540, 4541, 4542, 4543, 4544, 4545, 4546, 4547, 4548, 4551, 4552, 4553, 4556, 4557, 4558, 4559, 4560, 4561, 4564, 4565, 4568, 4569, 4570, 4571, 4572, 4573, 4574, 4575, 4578, 4579, 4582, 4583, 4586, 4587, 4588, 4589, 4593, 4594, 4598, 4599, 4600, 4604, 4605, 4606, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4620, 4621, 4622, 4625, 4626, 4627, 4628, 4629, 4630, 4631, 4635, 4639, 4647, 4660, 4673, 4683, 4693, 4712, 4727, 4733, 4734, 4735, 4740, 4752, 4755, 4758, 4762, 4765, 4770, 4772, 4774, 4776, 4778, 4779, 4781, 4790, 4797, 4804, 4812, 4813, 4814, 4815, 4817, 4819, 4823, 4827, 4833, 4839, 4844, 4849, 4856, 4863, 4870, 4877, 4885, 4892, 4899, 4906, 4914, 4917, 4925, 4927, 4930, 4934, 4935, 4936, 4937, 4942, 4943, 4953, 4967, 4971, 4994, 5002, 5003, 5006, 5009, 5012, 5013, 5014, 5017, 5022, 5030, 5031, 5032, 5033, 5034, 5035, 5042, 5051, 5063, 5070, 5078, 5088, 5089, 5098, 5105, 5107, 5114, 5121, 5122, 5123, 5130, 5152, 5153, 5154, 5157, 5163, 5164, 5165, 5166, 5167 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "KEY_VAR", "KEY_VEC", "KEY_CONST", "KEY_UNIT", "KEY_FUNC_I", "KEY_FUNC_D", "KEY_FUNC_NN", "KEY_FUNC_ND", "KEY_FUNC_DD", "KEY_FUNC_NND", "KEY_FUNC_PPD", "KEY_FUNC_PPPD", "KEY_FUNC_PPPPD", "KEY_FUNC_PPPPPD", "INDEX", "DATE", "VAR_D", "VEC_D", "CONSTANT", "UCONSTANT", "FUNC_I", "FUNC_D", "FUNC_NN", "FUNC_ND", "FUNC_DD", "FUNC_NND", "FUNC_PPD", "FUNC_PPPD", "FUNC_PPPPD", "FUNC_PPPPPD", "ABOVE", "ABSOLUTE", "ALIAS", "ALT", "ALTXAXIS", "ALTYAXIS", "ANGLE", "ANTIALIASING", "APPEND", "ARRANGE", "ARROW", "ASCENDING", "ASPLINE", "AUTO", "AUTOSCALE", "AUTOTICKS", "AVALUE", "AVG", "BACKGROUND", "BAR", "BARDY", "BARDYDY", "BASELINE", "BATCH", "BEGIN", "BELOW", "BETWEEN", "BLACKMAN", "BLOCK", "BOTH", "BOTTOM", "BOX", "CD", "CENTER", "CHAR", "CHART", "CHRSTR", "CLEAR", "CLICK", "CLIP", "CLOSE", "COEFFICIENTS", "COLOR", "COMMENT", "COMPLEX", "COMPUTING", "CONSTRAINTS", "COPY", "CYCLE", "DAYMONTH", "DAYOFWEEKL", "DAYOFWEEKS", "DAYOFYEAR", "DDMMYY", "DECIMAL", "DEF", "DEFAULT", "DEFINE", "DEGREESLAT", "DEGREESLON", "DEGREESMMLAT", "DEGREESMMLON", "DEGREESMMSSLAT", "DEGREESMMSSLON", "DESCENDING", "DESCRIPTION", "DEVICE", "DFT", "DIFFERENCE", "DISK", "DOWN", "DPI", "DROP", "DROPLINE", "ECHO", "ELLIPSE", "ENGINEERING", "ERRORBAR", "EXIT", "EXPONENTIAL", "FFT", "FILEP", "FILL", "FIT", "FIXED", "FIXEDPOINT", "FLUSH", "FOCUS", "FOLLOWS", "FONTP", "FORCE", "FORMAT", "FORMULA", "FRAMEP", "FREE", "FREQUENCY", "FROM", "GENERAL", "GETP", "GRAPH", "GRAPHNO", "GRID", "HAMMING", "HANNING", "HARDCOPY", "HBAR", "HELP", "HGAP", "HIDDEN", "HISTOGRAM", "HMS", "HORIZI", "HORIZONTAL", "HORIZO", "ID", "IFILTER", "IMAX", "IMIN", "IN", "INCREMENT", "INOUT", "INT", "INTEGRATE", "INTERPOLATE", "INVDFT", "INVERT", "INVFFT", "JUST", "KILL", "LABEL", "LANDSCAPE", "LAYOUT", "LEFT", "LEGEND", "LENGTH", "LINCONV", "LINE", "LINEAR", "LINESTYLE", "LINEWIDTH", "LINK", "LOAD", "LOCTYPE", "LOG", "LOGARITHMIC", "LOGIT", "LOGX", "LOGXY", "LOGY", "MAGIC", "MAGNITUDE", "MAJOR", "MAP", "MAXP", "MESH", "MINP", "MINOR", "MMDD", "MMDDHMS", "MMDDYY", "MMDDYYHMS", "MMSSLAT", "MMSSLON", "MMYY", "MONTHDAY", "MONTHL", "MONTHS", "MONTHSY", "MOVE", "NEGATE", "NEW", "NONE", "NONLFIT", "NORMAL", "NXY", "OFF", "OFFSET", "OFFSETX", "OFFSETY", "OFILTER", "ON", "ONREAD", "OP", "OPPOSITE", "OUT", "PAGE", "PARA", "PARAMETERS", "PARZEN", "PATTERN", "PERIOD", "PERP", "PHASE", "PIE", "PIPE", "PLACE", "POINT", "POLAR", "POLYI", "POLYO", "POP", "PORTRAIT", "POWER", "PREC", "PREPEND", "PRINT", "PS", "PUSH", "PUTP", "RAND", "READ", "REAL", "RECIPROCAL", "REDRAW", "REFERENCE", "REGNUM", "REGRESS", "RESIZE", "RESTRICT", "REVERSE", "RIGHT", "RISER", "ROT", "ROUNDED", "RSUM", "RULE", "RUNAVG", "RUNMAX", "RUNMED", "RUNMIN", "RUNSTD", "SAVEALL", "SCALE", "SCIENTIFIC", "SCROLL", "SD", "SET", "SETNUM", "SFORMAT", "SIGN", "SIZE", "SKIP", "SLEEP", "SMITH", "SORT", "SOURCE", "SPEC", "SPLINE", "SPLIT", "STACK", "STACKED", "STACKEDBAR", "STACKEDHBAR", "STAGGER", "START", "STOP", "STRING", "SUM", "SUBTITLE", "SWAP", "SYMBOL", "TARGET", "TICKLABEL", "TICKP", "TICKSP", "TIMER", "TIMESTAMP", "TITLE", "TO", "TOP", "TRIANGULAR", "TYPE", "UP", "UPDATEALL", "USE", "VERSION", "VERTI", "VERTICAL", "VERTO", "VGAP", "VIEW", "VX1", "VX2", "VXMAX", "VY1", "VY2", "VYMAX", "WELCH", "WITH", "WORLD", "WRAP", "WRITE", "WX1", "WX2", "WY1", "WY2", "X_TOK", "X0", "X1", "XAXES", "XAXIS", "XCOR", "XMAX", "XMIN", "XY", "XYAXES", "XYBOXPLOT", "XYCOLOR", "XYCOLPAT", "XYDX", "XYDXDX", "XYDXDXDYDY", "XYDXDY", "XYDY", "XYDYDY", "XYHILO", "XYR", "XYSIZE", "XYSTRING", "XYVMAP", "XYZ", "Y_TOK", "Y0", "Y1", "Y2", "Y3", "Y4", "YAXES", "YAXIS", "YEAR", "YMAX", "YMIN", "YYMMDD", "YYMMDDHMS", "ZERO", "ZNORM", "FITPARM", "FITPMAX", "FITPMIN", "NUMBER", "NEW_TOKEN", "'?'", "':'", "OR", "AND", "NE", "EQ", "GE", "LE", "LT", "GT", "'+'", "'-'", "'*'", "'/'", "'%'", "NOT", "UMINUS", "'^'", "'.'", "';'", "'('", "')'", "','", "'['", "']'", "'='", "$accept", "full_list", "multi_list", "list", "expr", "sexpr", "iexpr", "nexpr", "indx", "jdate", "jrawdate", "array", "vexpr", "asgn", "lside_array", "vasgn", "defines", "regionset", "parmset", "actions", "options", "set_setprop", "setprop", "axisfeature", "tickattr", "ticklabelattr", "axislabeldesc", "axisbardesc", "nonlfitopts", "selectgraph", "selectset", "setaxis", "axis", "proctype", "tickspectype", "filtertype", "filtermethod", "xytype", "graphtype", "pagelayout", "pageorient", "regiontype", "scaletype", "onoff", "runtype", "sourcetype", "justchoice", "inoutchoice", "formatchoice", "signchoice", "direction", "worldview", "datacolumn", "sortdir", "sorton", "ffttype", "fourierdata", "fourierloadx", "fourierloady", "windowtype", "interpmethod", "stattype", "font_select", "lines_select", "pattern_select", "color_select", "linew_select", "opchoice_sel", "opchoice", "parmset_obs", "axislabeldesc_obs", "setprop_obs", "tickattr_obs", "ticklabelattr_obs", "colpat_obs", "opchoice_sel_obs", "opchoice_obs", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 63, 58, 629, 630, 631, 632, 633, 634, 635, 636, 43, 45, 42, 47, 37, 637, 638, 94, 46, 59, 40, 41, 44, 91, 93, 61 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { 0, 400, 401, 401, 401, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 405, 405, 405, 406, 407, 408, 409, 409, 410, 410, 411, 411, 411, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 413, 413, 413, 413, 413, 414, 415, 415, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 417, 417, 417, 417, 417, 417, 417, 417, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 420, 420, 420, 420, 420, 420, 421, 421, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 427, 427, 427, 427, 428, 428, 428, 428, 429, 429, 430, 430, 430, 430, 431, 431, 432, 432, 432, 432, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 434, 434, 434, 435, 435, 436, 436, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 439, 439, 440, 440, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 442, 442, 442, 442, 443, 443, 444, 444, 444, 444, 444, 445, 445, 446, 446, 446, 447, 447, 447, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 449, 449, 449, 450, 450, 450, 450, 450, 450, 451, 451, 452, 452, 452, 452, 452, 452, 452, 452, 453, 453, 454, 454, 455, 455, 455, 455, 456, 456, 457, 457, 457, 458, 458, 458, 459, 459, 459, 459, 459, 459, 459, 460, 460, 460, 461, 461, 461, 461, 461, 461, 461, 462, 462, 463, 464, 465, 465, 465, 466, 467, 468, 468, 468, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 470, 470, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 474, 474, 474, 475, 476, 476, 476, 476, 476 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 6, 3, 3, 3, 3, 1, 2, 1, 4, 4, 6, 6, 6, 8, 8, 10, 12, 14, 3, 3, 3, 3, 3, 3, 3, 3, 4, 8, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 2, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 6, 4, 8, 4, 4, 4, 4, 4, 6, 6, 6, 6, 8, 8, 10, 12, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 4, 1, 3, 3, 2, 4, 5, 2, 2, 2, 2, 3, 3, 6, 8, 2, 3, 2, 2, 2, 9, 5, 4, 2, 5, 5, 7, 4, 5, 4, 4, 3, 3, 3, 4, 2, 4, 4, 4, 3, 9, 2, 2, 2, 2, 4, 3, 2, 3, 2, 2, 8, 3, 2, 2, 2, 3, 3, 2, 2, 3, 2, 2, 8, 3, 2, 2, 2, 3, 3, 2, 2, 3, 2, 2, 8, 3, 2, 2, 2, 3, 4, 4, 6, 2, 2, 3, 2, 2, 4, 3, 2, 3, 2, 3, 4, 3, 2, 2, 4, 3, 2, 4, 3, 2, 2, 2, 2, 4, 2, 4, 3, 7, 13, 8, 2, 8, 2, 2, 3, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 4, 4, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 2, 3, 3, 3, 4, 3, 5, 6, 6, 4, 2, 5, 2, 2, 2, 2, 3, 1, 1, 2, 2, 2, 1, 2, 1, 4, 1, 3, 3, 2, 2, 2, 1, 2, 2, 3, 3, 3, 5, 5, 4, 4, 4, 2, 3, 4, 4, 2, 3, 2, 2, 1, 12, 18, 20, 6, 8, 6, 6, 6, 12, 10, 10, 6, 4, 10, 6, 6, 8, 1, 2, 2, 2, 1, 2, 2, 3, 3, 4, 3, 2, 3, 4, 3, 4, 2, 4, 4, 6, 2, 2, 1, 3, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 3, 3, 3, 4, 3, 3, 4, 5, 3, 3, 4, 4, 4, 6, 4, 4, 3, 3, 3, 3, 4, 3, 3, 4, 4, 5, 6, 3, 3, 1, 3, 2, 2, 2, 2, 2, 2, 2, 4, 1, 2, 3, 3, 2, 2, 2, 1, 3, 3, 1, 2, 2, 1, 2, 2, 2, 2, 3, 3, 1, 3, 2, 4, 4, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 3, 1, 1, 3, 2, 2, 4, 1, 2, 2, 2, 2, 4, 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 1, 2, 3, 4, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 8, 2, 2, 1, 1, 1, 3, 4, 2, 3, 4, 17, 3, 3, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 2, 1, 1, 4, 3, 3, 4, 4, 2, 2, 2, 4, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, 2, 2, 2, 2, 2, 3, 3, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 0, 18, 0, 20, 94, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, 576, 0, 0, 0, 397, 401, 733, 0, 0, 0, 0, 0, 350, 0, 423, 0, 0, 0, 0, 709, 0, 0, 0, 352, 710, 0, 379, 0, 0, 0, 0, 0, 565, 0, 360, 0, 737, 736, 0, 0, 0, 711, 712, 0, 0, 0, 0, 0, 0, 0, 732, 0, 731, 0, 419, 0, 0, 422, 354, 0, 421, 0, 33, 0, 345, 0, 0, 0, 0, 0, 0, 641, 644, 643, 645, 642, 0, 734, 0, 569, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 55, 56, 63, 57, 58, 64, 0, 0, 0, 59, 60, 61, 62, 697, 699, 0, 573, 0, 698, 700, 701, 702, 703, 704, 0, 574, 0, 21, 22, 23, 19, 0, 0, 0, 0, 0, 2, 5, 3, 97, 4, 15, 0, 16, 17, 10, 8, 13, 14, 12, 436, 0, 0, 11, 0, 0, 95, 0, 0, 9, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 398, 399, 400, 0, 204, 597, 598, 599, 596, 613, 610, 611, 601, 603, 606, 605, 602, 604, 607, 608, 609, 614, 612, 600, 0, 0, 20, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 640, 639, 33, 21, 22, 23, 0, 0, 0, 0, 0, 219, 0, 218, 222, 224, 223, 347, 178, 179, 426, 303, 427, 592, 428, 593, 425, 429, 340, 351, 0, 0, 0, 0, 0, 0, 278, 273, 276, 275, 274, 176, 177, 173, 0, 302, 0, 0, 349, 348, 0, 239, 0, 0, 0, 231, 230, 234, 236, 235, 0, 0, 0, 0, 0, 343, 435, 434, 433, 402, 432, 659, 667, 672, 671, 673, 661, 654, 682, 678, 683, 679, 684, 680, 658, 655, 656, 674, 665, 675, 662, 676, 685, 681, 664, 666, 670, 668, 669, 660, 657, 663, 677, 342, 0, 0, 0, 320, 322, 325, 324, 323, 361, 0, 566, 0, 359, 0, 0, 0, 0, 408, 378, 377, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 701, 0, 304, 318, 768, 319, 769, 0, 0, 253, 0, 0, 243, 242, 247, 248, 246, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 690, 693, 0, 0, 692, 694, 0, 691, 0, 0, 689, 87, 88, 752, 357, 0, 0, 794, 362, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 184, 187, 186, 188, 0, 0, 371, 0, 417, 570, 358, 0, 646, 647, 341, 0, 0, 424, 0, 0, 0, 0, 0, 0, 257, 256, 262, 260, 758, 0, 290, 291, 293, 761, 0, 211, 210, 0, 0, 0, 0, 266, 267, 270, 759, 0, 286, 287, 289, 760, 338, 0, 192, 0, 0, 0, 0, 0, 216, 228, 240, 254, 212, 213, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 69, 0, 68, 97, 164, 83, 162, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 802, 804, 803, 0, 0, 0, 0, 0, 0, 571, 487, 0, 0, 0, 0, 202, 87, 91, 0, 0, 165, 365, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 0, 180, 0, 0, 0, 431, 298, 299, 301, 300, 0, 743, 742, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, 831, 833, 226, 225, 756, 740, 745, 696, 695, 221, 68, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 739, 738, 741, 280, 0, 0, 0, 0, 0, 0, 0, 0, 238, 237, 757, 233, 0, 0, 562, 564, 561, 0, 327, 326, 787, 321, 0, 791, 200, 0, 0, 0, 0, 0, 376, 0, 762, 314, 313, 312, 315, 0, 307, 309, 786, 308, 305, 0, 306, 763, 764, 0, 0, 0, 0, 0, 0, 249, 245, 0, 208, 0, 0, 0, 87, 0, 0, 420, 0, 0, 87, 753, 622, 621, 623, 624, 430, 750, 0, 0, 19, 0, 355, 356, 0, 0, 0, 404, 405, 0, 411, 0, 409, 0, 92, 93, 201, 0, 625, 626, 631, 633, 627, 629, 630, 628, 632, 634, 185, 0, 0, 0, 0, 0, 707, 708, 0, 372, 0, 0, 265, 263, 259, 261, 0, 292, 0, 0, 272, 269, 0, 288, 0, 783, 782, 785, 784, 0, 217, 229, 241, 255, 779, 778, 781, 780, 0, 0, 0, 296, 636, 638, 635, 637, 294, 0, 297, 295, 344, 166, 167, 168, 65, 163, 0, 0, 0, 0, 0, 0, 6, 170, 0, 0, 0, 82, 140, 81, 143, 80, 161, 79, 158, 78, 152, 77, 155, 76, 149, 75, 146, 66, 117, 67, 120, 70, 123, 71, 126, 72, 129, 73, 132, 27, 0, 0, 0, 0, 139, 138, 142, 141, 160, 159, 157, 156, 151, 150, 154, 153, 148, 147, 145, 144, 116, 115, 119, 118, 122, 121, 125, 124, 128, 127, 131, 130, 172, 171, 0, 0, 0, 0, 0, 0, 333, 329, 770, 331, 774, 616, 619, 775, 771, 773, 772, 620, 617, 618, 776, 777, 615, 330, 30, 0, 567, 44, 45, 46, 47, 48, 49, 50, 51, 572, 0, 0, 0, 0, 0, 0, 0, 0, 463, 466, 467, 0, 460, 485, 0, 462, 0, 0, 0, 0, 0, 474, 480, 477, 476, 479, 475, 0, 0, 0, 799, 459, 458, 363, 486, 364, 0, 452, 455, 454, 453, 215, 0, 0, 798, 0, 0, 0, 0, 0, 440, 444, 442, 441, 443, 439, 0, 29, 28, 96, 495, 557, 559, 558, 560, 0, 0, 0, 0, 0, 546, 493, 554, 555, 795, 556, 494, 796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 522, 540, 541, 821, 531, 492, 829, 0, 653, 0, 651, 0, 0, 732, 731, 0, 0, 0, 652, 0, 0, 0, 0, 0, 489, 497, 504, 507, 510, 517, 490, 820, 0, 0, 0, 0, 203, 0, 52, 34, 104, 35, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 85, 370, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 81, 80, 79, 78, 77, 76, 75, 66, 67, 70, 71, 72, 73, 0, 369, 277, 754, 279, 174, 0, 594, 595, 0, 196, 0, 198, 199, 0, 0, 0, 353, 563, 89, 0, 0, 392, 0, 0, 766, 311, 310, 317, 765, 316, 0, 0, 250, 790, 251, 0, 191, 0, 0, 0, 99, 373, 0, 205, 207, 0, 206, 751, 0, 792, 793, 101, 406, 412, 410, 0, 0, 102, 0, 0, 103, 705, 706, 368, 0, 264, 258, 374, 268, 271, 577, 578, 579, 580, 582, 581, 583, 584, 585, 586, 587, 588, 0, 0, 0, 415, 414, 0, 0, 0, 0, 0, 169, 0, 0, 788, 789, 332, 0, 0, 337, 0, 568, 473, 0, 469, 0, 470, 472, 468, 464, 461, 0, 807, 749, 747, 748, 746, 0, 808, 482, 481, 478, 839, 836, 837, 838, 835, 800, 457, 456, 832, 833, 805, 451, 214, 0, 801, 448, 449, 797, 446, 445, 447, 450, 0, 0, 650, 649, 648, 552, 548, 547, 834, 549, 550, 0, 0, 528, 526, 0, 525, 524, 532, 825, 824, 826, 543, 544, 0, 0, 0, 523, 527, 687, 688, 686, 830, 529, 530, 0, 533, 0, 534, 822, 823, 0, 811, 503, 814, 0, 0, 498, 0, 809, 513, 508, 511, 813, 812, 0, 0, 0, 817, 0, 810, 514, 509, 512, 501, 502, 0, 818, 0, 519, 815, 816, 0, 488, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 339, 197, 0, 0, 0, 0, 0, 0, 767, 0, 0, 0, 0, 0, 0, 0, 0, 193, 194, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 134, 135, 136, 137, 334, 0, 0, 465, 0, 367, 0, 483, 366, 806, 553, 0, 496, 539, 0, 828, 827, 536, 535, 538, 537, 542, 515, 505, 0, 516, 506, 499, 0, 500, 591, 589, 590, 518, 819, 0, 714, 713, 0, 0, 0, 37, 36, 109, 38, 107, 108, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 26, 0, 394, 252, 0, 0, 0, 0, 383, 0, 0, 385, 0, 395, 0, 182, 0, 0, 416, 0, 98, 335, 336, 471, 484, 551, 545, 520, 521, 386, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 730, 728, 729, 0, 0, 0, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 726, 725, 723, 721, 727, 722, 724, 0, 53, 0, 39, 110, 40, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 232, 0, 0, 244, 0, 100, 384, 0, 396, 0, 183, 285, 283, 0, 0, 0, 0, 0, 0, 0, 0, 744, 0, 0, 0, 0, 0, 0, 189, 209, 0, 715, 716, 717, 0, 0, 41, 112, 0, 0, 0, 0, 0, 0, 390, 389, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, 718, 719, 0, 0, 42, 113, 0, 380, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 282, 0, 54, 43, 114, 0, 0, 0, 0, 0, 0, 0, 0, 755, 381, 0, 0, 382 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 151, 152, 153, 415, 638, 416, 639, 679, 609, 779, 251, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 599, 1078, 1053, 1028, 1017, 306, 291, 253, 169, 170, 1217, 1450, 269, 1143, 223, 944, 759, 760, 791, 837, 434, 171, 448, 1285, 1080, 344, 1312, 418, 660, 172, 1198, 799, 173, 1456, 1610, 1638, 1558, 1538, 174, 277, 435, 279, 436, 437, 983, 1252, 175, 1033, 176, 1084, 1059, 655, 1034, 1263 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -900 static const yytype_int16 yypact[] = { 3356, -900, -289, -319, -53, -900, -274, -264, -256, -248, -241, -234, -197, -160, -124, -87, 20, -900, -900, 315, -80, 92, 79, -900, -900, 271, 4134, 6059, 289, 97, 289, 315, -900, 295, -13, 289, 289, -900, -30, 9653, 6250, -19, -900, -71, -900, 493, 11501, 202, 289, -16, -900, 270, 289, -11, -900, -900, -3, 3, 14, -900, -900, -39, 5093, 19, 6441, -144, 289, -32, -900, 25, -900, 315, 259, 31, 5366, -900, 93, 254, -900, 289, 34, 7219, -900, 413, -50, 39, 43, 315, 44, -900, -900, -900, -900, -900, 289, -900, -16, -900, 11038, 315, -58, 315, 9885, 5679, -900, 111, 315, 315, 11038, 6632, 169, 4134, -900, 289, 11038, 7694, -900, -900, -900, -900, -900, -900, 679, 7975, 315, -900, -900, -900, -900, -900, -900, -93, -900, 46, -900, -900, -900, -900, -900, -900, -89, -900, 11038, -64, 47, 50, -900, 11038, 8352, 8352, 8352, 444, 71, -900, 3199, 4, 4365, -900, 69, -900, -900, -900, -900, -900, -900, -900, -900, 7120, 11172, -900, -7, 78, -900, 80, 82, -900, -900, -166, 9653, 11038, 11038, 8352, 8352, 11038, 11038, 8352, 11038, 11038, 11038, 11038, 11038, -900, 60, -60, 86, 180, 11038, 60, -48, -900, -900, -900, 10030, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 289, 88, -900, -900, 89, 91, 109, 110, 114, 120, 121, 122, 124, -900, 194, 11038, 11038, -27, -900, -900, -900, -900, -900, -900, 11038, 11038, 11038, 370, -291, 149, 151, -900, -900, -900, -900, 176, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 176, 275, 304, 8751, 11038, 289, 305, -900, -900, -900, -900, -900, -900, -900, 183, 289, 176, -81, 315, 4967, 176, 149, -900, 194, -27, 458, 149, -900, -900, -900, -900, 11038, 289, 11038, 289, 11038, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -4, 60, 11038, -900, -900, -900, -900, -900, 176, 11038, -900, 9653, 176, 315, 8352, 315, 315, -900, -900, 86, 322, 685, 316, 9653, 11038, 60, 11038, 11038, -27, 11038, 11038, 11038, 11038, 633, -900, -900, -900, -900, -900, 315, 8120, -900, -27, 742, 149, -900, -900, -900, -900, 60, 296, 176, 11038, 11038, 11038, 297, 289, 315, 475, -900, -900, 11038, 273, -900, -900, 11038, -900, 11038, 11183, -900, 4967, -900, -900, -900, 9, 8899, -900, 176, 11038, 289, 75, 75, 176, 75, 9653, 11038, 134, 11038, 315, -900, -900, -900, -900, 315, 315, -900, 8352, 176, -900, 4967, -262, -900, -900, -900, 11038, 11038, -900, 328, 289, 11038, -27, 11038, 831, 149, -900, -900, -900, -900, 11038, 176, -900, -900, -900, 225, -900, -900, 334, 289, 11038, 864, -900, -900, -900, -900, 11038, 176, -900, -900, -900, -900, -285, -900, 11038, 11038, 11038, 11038, 920, 11038, 11038, 11038, 11038, 86, -900, 11038, 11038, 11038, 11038, 1126, -41, 60, 148, 315, 60, 148, 4967, 60, 11038, 11038, 11038, 218, 219, 227, -82, 230, 227, 230, 4138, 6168, -900, 3718, -900, 11038, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 445, 11038, 229, -900, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 8352, 326, 491, -72, 60, 60, 60, 45, 556, -7, -900, 828, -129, 289, 11038, 60, 1949, 7284, 60, 289, 11038, 36, 278, 11038, 11038, 5870, 4134, 11038, 166, -900, -900, -900, -900, 402, 730, 11038, 4552, 4865, 265, -900, -900, 315, 315, 8352, 11038, -900, 6358, 176, 247, 245, 4967, -900, 3199, 250, 6550, 7303, 7377, 255, 256, 1327, 1372, 257, 1398, 1436, 1463, 1519, -900, 9653, 176, 54, 315, 260, -900, -900, -900, -900, -900, 11038, 176, -900, 176, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 10030, -900, 11038, -900, -900, -900, -900, 4967, -900, -900, -900, 218, 218, 7414, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, -900, 315, 11038, 11038, 176, -900, -900, 176, 11038, 4035, -156, 11038, 6, 289, 377, 261, -900, -900, -900, -900, 11038, 263, 176, 4967, 176, 441, -900, -900, -900, -900, 264, 4967, 176, 267, 3199, 1580, 284, 287, -900, -54, -900, -900, -900, -900, -900, 11038, -900, -900, 4967, -900, -900, 289, -900, 4967, 4967, 11038, 288, 11038, 11038, 11038, 11038, -900, -900, 11038, -900, -33, 379, 384, 1604, 291, 315, 176, 292, 60, 5492, -900, -900, -900, -900, -900, -900, -900, 293, 8082, 320, 299, -900, 176, 11038, 11038, 298, 176, 176, 289, 176, 289, 176, 289, 4967, 176, -900, 1625, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 1659, 301, 302, 306, 7513, -900, -900, -6, -900, 1694, 11038, 176, -900, -900, -900, 11038, 4967, 315, 11038, 176, -900, 11038, 4967, 987, 4967, 4967, 4967, 4967, 11038, -900, -900, -900, -900, 4967, 4967, 4967, 4967, 11038, 289, 289, -900, -900, -900, -900, -900, -900, 309, -900, -900, -900, 4967, 4967, 4967, -900, -900, 374, -319, 2, -64, 47, 50, -900, -16, 8370, 11362, 3318, 74, 600, 1068, 1503, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 106, 205, 106, 205, 227, 230, 227, 230, 227, 230, 227, 230, -900, -326, 11038, 4990, 5052, 74, 600, 1068, 1503, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 2039, 2066, 106, 205, 106, 205, 227, 230, 227, 230, 227, 230, 227, 230, 3199, 4365, -28, 11038, 11501, 11038, 11038, 11038, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -16, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 289, 427, 11501, 11038, 11038, 289, 11038, 11038, -900, -900, -900, 11038, -900, 176, 311, -900, 11038, 179, 398, 11038, -26, -900, -900, -900, -900, -900, -900, 11038, 11038, 280, -900, -900, -900, -900, 176, -900, 11038, -900, -900, -900, -900, -900, 289, 1814, -900, 60, 10284, 9128, 11038, 11038, -900, -900, -900, -900, -900, -900, 1890, -900, -900, -900, -900, -900, -900, -900, -900, 435, -36, 118, -26, 7598, 176, -900, -900, -900, -900, -900, -900, -900, 1925, 11038, 289, 437, 4180, 289, 68, 9276, 359, 11038, 289, -2, 11038, 11038, 10429, 10661, -17, 329, -900, -900, -900, -900, -900, -900, -900, -900, 60, -900, 11038, -900, 60, 7093, 356, 357, 6865, 11038, 11038, -900, 40, 11038, 10806, -15, 336, -900, -900, -900, -900, -900, -900, -900, -900, 60, 337, 339, 7715, -900, 11038, -900, -900, -900, -900, -900, 11038, 8352, 8352, 8352, 11038, 11038, 11038, 11038, 11038, 4967, -900, -900, 11038, 7414, 343, 7795, 344, 1998, 363, 2122, 2196, 2233, 2257, 1018, 2453, 3526, 3526, 3526, 3526, 3526, 3526, 248, 248, 218, 218, 218, 218, 2305, -900, 4967, 4967, 4967, -900, 365, -900, -900, 289, 4967, 60, -900, 176, 11038, 11038, 2475, -900, -900, -900, 8352, 8352, -900, 8352, 280, -900, -900, -900, 4967, 176, 4967, 315, 2502, 4967, 4967, -900, 2540, -900, 371, 289, 11038, -900, -900, 8352, -900, 11038, 11038, 11038, -900, 11038, 4967, 4967, -900, 176, 176, 176, 11038, 11038, -900, 11038, 8497, -900, -900, -900, -900, 11038, 4967, 4967, -900, 4967, 4967, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 640, 2573, 2600, -107, 176, 315, 229, 562, 11038, 11038, 4967, 8352, 8352, -900, -900, 4967, 11501, 2639, -900, 2676, -900, 176, 11038, -900, 2699, -900, 176, -900, -900, -900, 11038, 4967, -900, -900, -900, -900, -10, -900, -900, -900, 4967, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 176, 11038, -900, -900, -900, -900, -900, -900, 4967, -900, 11038, 11038, -900, -900, -900, -900, -900, -900, -900, -900, -900, 2753, 11038, -900, 176, 11038, 4967, -900, 176, -900, -900, -900, -900, -900, 2805, 473, 476, -900, 176, -900, -900, -900, -900, -900, -900, 15, 4967, 22, 4967, -900, -900, 289, -900, -900, -900, 60, 11038, 2883, 376, -900, -900, -900, -900, -900, -900, 60, 11038, 11038, 2883, 378, -900, -900, -900, -900, 4967, 4967, 60, 4967, -34, -900, -900, -900, 11038, -900, 11038, 9508, -900, 381, 380, 7815, 7842, 8182, 8581, 8601, 8621, 382, 2920, 2943, 3717, 3740, 383, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, 11038, -900, 176, -900, 385, 387, 11038, 3763, 8814, 3858, -900, 388, 11038, 11038, 11038, -310, 4229, 389, 4256, -900, -900, 4277, 4967, 390, 13, 8856, 4419, 289, 11038, 11038, 289, 394, 8313, 395, 8712, 9089, 8712, 9089, -900, 11038, 11038, 4967, 11038, -900, 11038, -900, 4967, 4967, 4967, 11038, 4967, 4967, 11038, -900, -900, -900, -900, -900, -900, 176, -900, 4967, 11038, -900, 4967, -900, 11038, -900, -900, -900, -900, -900, 4967, 391, -900, -900, 399, 405, 11038, -900, -900, -900, -900, -900, -900, -900, 8352, 8352, 11038, 11038, 11038, 11038, 407, 8951, 8995, 408, 4467, 4579, 4600, 4644, 4681, 11038, -900, 4906, 60, -900, -25, -900, 4967, 4946, 410, 289, 11038, -900, 11038, 11038, -900, 60, -900, 11038, -31, 5179, 5208, 176, 11038, -900, 4967, 4967, 4967, 4967, 4967, 4967, 4967, 4967, -900, -900, 16, -202, 9330, 9377, 9466, 9705, 5281, 5392, 5439, 5576, 11038, 11038, 11038, 11038, 11038, 11038, 11038, -900, 11038, 412, -900, -900, -900, 419, 11038, 11038, 176, 400, 403, 5719, 423, 5740, 289, 11038, 11038, 425, -900, -900, -900, -900, -900, -900, -900, 428, -900, 11038, -900, -900, -900, -900, 8352, 11038, 11038, 11038, 424, 9727, 9752, 5785, 5911, 6119, 4967, 4967, 60, 60, 4967, 431, -900, -900, 11038, -900, 11038, 176, 4967, 4967, 60, 38, 432, 9906, 10119, 6293, 6472, 6589, -900, 11038, 11038, 11038, 452, 455, 11038, 4967, 1348, 460, -900, -900, -900, 434, 11038, -900, -900, 8352, 11038, 11038, 10151, 6678, 6703, -900, -900, 463, 11038, -900, 244, 464, 10242, 10344, 6822, 335, 11038, 11038, 465, 6962, -900, -900, -900, 467, 11038, -900, -900, 8352, -900, 60, 10386, 6991, 289, 11038, -900, 10486, 10528, 10858, 468, 11038, 176, 7114, -900, -900, -900, 60, 10878, 11038, 469, 7137, 60, 11038, -45, 4967, -900, 60, 472, -900 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -900, -900, -900, 351, 0, 1524, -170, 1755, -37, -900, -900, 1140, 2000, -900, -900, -900, -900, -900, -900, -900, -900, -900, -900, 290, -900, -900, -900, -900, -900, 2371, 221, -900, -164, -900, -900, 829, -900, -76, -900, -900, -900, -900, 360, 769, -900, -301, -900, -900, -899, -900, -900, -20, -586, -900, -900, -900, -900, -900, -900, -900, -900, -900, -52, 48, -14, 23, 195, -192, -900, -900, -900, -900, -900, -900, -292, -174, -149 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -171 static const yytype_int16 yytable[] = { 154, 697, 1016, 569, 1547, 428, 282, 283, 608, 191, 380, 613, 355, 617, 618, 510, 621, 1409, 1230, 815, 1535, 202, 362, 690, 1233, 202, 1141, 250, 1447, 1319, 1282, 1350, 1309, 350, 177, 484, 1258, 1259, 1196, 289, 295, 691, 241, 397, 446, 593, 1145, 242, 203, 1226, 256, 460, 923, 465, 302, 1607, 280, 476, 481, 443, 1240, 1434, 378, 299, 388, 504, 1142, 797, 1436, 507, 351, 202, 1153, 830, 394, 255, 1551, 202, 191, 241, 179, 278, 627, 831, 242, 382, 1490, 392, 298, 191, 398, 1197, 798, 49, 50, 349, 525, 931, 444, 49, 50, 541, 1249, 457, 395, 178, 354, 627, 765, 474, 381, 202, 391, 932, 180, 491, 259, 260, 543, 430, 181, 238, 239, 502, 772, 774, 461, 776, 466, 1283, 182, 700, 477, 482, 692, 264, 241, 693, 183, 1260, 1297, 242, 509, 192, 191, 1536, 184, 514, 516, 519, 521, 1552, 1553, 185, 241, 594, 633, 1423, 241, 242, 186, 261, 933, 242, 924, 303, 1608, 781, 274, 447, 1448, 430, 505, 238, 239, 968, 508, 446, 606, 610, 191, 612, 615, 934, 709, 619, 202, 622, 623, 624, 625, 591, 782, 1559, 1560, 262, 604, 187, 241, 266, 1310, 241, 595, 242, 1311, 263, 242, 238, 239, 363, 241, 49, 50, 1299, 241, 242, 590, 1284, 274, 242, 1554, 168, 257, 653, 935, 936, 937, 1261, 281, 304, 96, 97, 925, 368, 188, 300, 627, 1555, 191, 657, 195, 1249, 352, 201, 202, 264, 1250, 661, 662, 663, 305, 1231, 271, 345, 431, 1537, 1251, 383, 274, 393, 654, 1609, 1320, 1449, 1351, 926, 265, 1158, 241, 650, 189, 938, 421, 242, 698, 939, 1262, 202, 783, 695, 784, 999, 365, 239, 634, 627, 658, 432, 596, 597, 635, 368, 400, 198, 1435, 659, 1346, 598, 462, 785, 467, 1437, 447, 702, 478, 483, 431, 190, 440, 266, 541, 627, 636, 1014, 196, 542, 696, 346, 1635, 1556, 445, 940, 449, 946, 947, 833, 834, 468, 469, 941, 942, 705, 627, 1015, 1417, 511, 1557, 1286, 197, 432, 993, 239, 1287, 497, 433, 503, 202, 1300, 96, 97, 1669, 1670, 721, 729, 835, 1266, 710, 525, 191, 713, 284, 627, 272, 592, 288, 786, 787, 741, 706, 356, 202, 727, 887, 238, 239, 301, 732, 733, 1301, 267, 446, 354, 943, 358, 463, 1250, 268, 788, 401, 722, 755, 359, 525, 836, 419, 1251, 541, 360, 651, 747, 756, 542, 1032, -170, 1058, 1083, 753, 433, 361, 1496, 241, 199, 762, 384, 720, 242, 652, 273, 1305, 399, 657, 1249, 1060, 1085, 274, 402, 420, 1636, 423, 777, 780, 429, 792, 438, 1090, 805, 757, 439, 441, 200, 506, 713, 479, 789, 523, 790, 512, 49, 50, 513, 801, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 808, 524, 540, 238, 239, 560, 1637, 1253, 613, 601, 1113, 602, 1115, 603, 202, 629, 814, 525, 630, 178, 641, 651, 642, 241, 816, 817, 818, 819, 242, 537, 538, 539, 129, 130, 540, 825, 826, 827, 828, 1267, 643, 644, 447, 347, 758, 645, 694, 1012, 842, 843, 844, 646, 647, 648, 274, 649, 966, 134, 135, 136, 137, 138, 139, 857, 858, 860, 862, 864, 866, 868, 870, 872, 874, 876, 878, 880, 882, 884, 568, 1029, 588, 1055, 889, 891, 893, 895, 897, 899, 901, 903, 905, 907, 909, 911, 913, 915, 917, 919, 723, 980, 988, 307, 1250, 275, 995, 627, 238, 239, 1009, 1306, 238, 239, 1251, 680, 681, 687, 712, 688, 715, 716, 1000, 96, 97, 717, 1013, 276, 724, 752, 556, 557, 558, 967, 1035, 559, 744, 749, 981, 989, 802, 809, 713, 996, 735, 241, 810, 1010, 677, 241, 242, 886, 433, 308, 242, 1020, 1030, 540, 1056, 1081, 559, 544, 751, 979, 49, 50, 1106, 888, 994, 921, 922, 1086, 1008, 674, 675, 676, 1110, 1016, 677, 1092, 1019, 1112, 1091, 1114, 1093, 1116, 1117, 1118, 1119, 1148, 1097, 1098, 1101, 793, 525, 1109, 1149, 1151, 794, 795, 1152, 1153, 1154, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1156, 1172, 1136, 1137, 1157, 1165, 1173, 1175, 1138, 1177, 1180, 1144, 569, 1182, 1186, 1268, 1183, 1192, 177, 1193, 1150, 1239, 241, 1194, 945, 1160, 1222, 242, 1247, 1281, 526, 1295, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1162, 1321, 677, 838, 1333, 1334, 1643, 1644, 1352, 1354, 1164, 1355, 1166, 1167, 1168, 1371, 1372, 1161, 1170, 492, 526, 856, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1374, 202, 677, 309, 1380, 525, 1393, 678, 1184, 1185, 1406, 1432, 982, 1441, 1433, 1445, 1458, 997, 1457, 1465, 1470, 1011, 1480, 1481, 1486, 1492, 1495, 1513, 493, 1021, 1031, 1503, 1057, 1082, 1504, 1514, 1581, 254, 1022, 1582, 191, 718, 1515, 1200, 1525, 1526, 202, 1540, 1201, 1577, 297, 1203, 49, 50, 1204, 311, 1578, 348, 1223, 1584, 1597, 1218, 1589, 1087, 1088, 1590, 946, 947, 1603, 1611, 1219, 1625, 379, 526, 390, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1620, 494, 677, 1621, 1108, 368, 525, 699, 1624, 238, 239, 1633, 956, 1639, 1647, 1649, 285, 1660, 1665, 1389, 1672, 840, 957, 948, 949, 459, 950, 951, 853, 1288, 0, 475, 591, 0, 952, 953, 954, 955, 0, 525, 0, 1227, 0, 1023, 129, 130, 241, 1024, 958, 0, 0, 242, 0, 0, 1135, 239, 202, 590, 0, 0, 274, 0, 1237, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 1232, 0, 1234, 0, 1236, 1358, 0, 0, 0, 1365, 0, 0, 0, 0, 570, 589, 0, 600, 0, 0, 525, 0, 0, 1025, 605, 0, 96, 97, 368, 1274, 959, 0, 0, 0, 0, 0, 1026, 0, 1241, 626, 0, 0, 0, 0, 632, 0, 495, 0, 1176, 0, 0, 1248, 0, 0, 1257, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 1276, 559, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 0, 1278, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 1255, 677, 0, 1291, 1277, 0, 734, 1202, 0, 0, 0, 0, 0, 241, 960, 0, 1296, 525, 242, 1304, 0, 0, 0, 0, 0, 0, 1316, 1318, 592, 0, 0, 0, 0, 1412, 0, 0, 0, 0, 0, 0, 0, 961, 962, 1327, 0, 0, 1338, 1344, 1345, 0, 0, 1347, 0, 0, 0, 0, 0, 0, 0, 0, 963, 0, 0, 0, 0, 0, 1331, 525, 0, 1342, 0, 0, 0, 0, 0, 1359, 1361, 1363, 0, 1366, 1367, 1368, 1369, 0, 0, 0, 0, 0, 0, 0, 0, 1330, 707, 526, 1341, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 964, 677, 0, 719, 0, 0, 742, 726, 155, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 713, 713, 0, 713, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 1256, 0, 0, 0, 1395, 0, 0, 612, 0, 1132, 0, 1132, 0, 0, 0, 0, 0, 0, 0, 0, 1400, 1401, 0, 0, 713, 0, 0, 0, 0, 1405, 0, 0, 0, 0, 1474, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 1411, 0, 807, 1413, 1415, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1420, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 813, 1332, 0, 0, 1343, 0, 0, 0, 0, 0, 0, 1425, 0, 832, 0, 0, 839, 0, 0, 841, 1426, 1427, 0, 0, 0, 0, 0, 0, 517, 517, 517, 0, 1429, 0, 526, 1430, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 820, 0, 0, 0, 0, 517, 517, 0, 0, 517, 1440, 0, 0, 0, 0, 0, 927, 928, 929, 930, 1443, 0, 600, 0, 965, 969, 0, 0, 972, 978, 0, 990, 0, 525, 0, 998, 1451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1018, 0, 0, 1054, 1079, 0, 0, 0, 525, 0, 1472, 1473, 0, 1475, 1476, 1477, 1478, 1479, 0, 0, 0, 0, 0, 1482, 1390, 0, 0, 0, 0, 1487, 1488, 0, 544, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1500, 1501, 677, 0, 0, 0, 0, 0, 0, 0, 0, 1505, 1506, 525, 1507, 0, 1508, 0, 0, 0, 0, 1509, 0, 0, 1510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1511, 0, 1410, 0, 1512, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 525, 540, 1146, 0, 0, 0, 0, 1517, 1519, 1521, 1522, 1523, 1524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 1159, 0, 0, 0, 0, 0, 0, 1544, 0, 0, 0, 1546, 517, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1178, 829, 0, 0, 544, 1570, 1571, 1572, 1573, 1574, 1575, 0, 1576, 0, 0, 0, 0, 0, 1579, 193, 525, 0, 0, 0, 0, 0, 0, 1587, 1588, 0, 0, 258, 0, 270, 0, 0, 0, 0, 286, 287, 0, 0, 290, 0, 1592, 1594, 1595, 1596, 0, 0, 0, 353, 0, 0, 0, 357, 0, 0, 0, 0, 517, 0, 1604, 0, 1605, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 0, 0, 1617, 1618, 1619, 0, 544, 422, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 1627, 1629, 1630, 0, 442, 0, 0, 0, 0, 1634, 570, 589, 525, 0, 0, 464, 0, 1645, 1646, 0, 480, 0, 0, 485, 0, 1650, 0, 0, 1651, 0, 1623, 0, 0, 525, 1656, 0, 0, 0, 0, 0, 1661, 0, 0, 0, 0, 0, 0, 0, 1664, 0, 854, 0, 1668, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 525, 0, 0, 0, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 526, 607, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 525, 628, 540, 0, 0, 0, 526, 1099, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 517, 1254, 0, 545, 640, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 0, 1100, 0, 0, 1272, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1102, 0, 0, 683, 0, 686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 689, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 701, 677, 703, 417, 1322, 0, 1103, 0, 1324, 1329, 525, 526, 1340, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 1353, 0, 451, 0, 1104, 0, 0, 0, 470, 0, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 711, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 683, 526, 559, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 525, 0, 1382, 1105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 766, 0, 0, 0, 525, 770, 771, 773, 631, 775, 778, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 0, 1155, 803, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 656, 0, 677, 811, 0, 0, 526, 1174, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 525, 1190, 1424, 0, 202, 0, 0, 0, 684, 685, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1191, 0, 0, 0, 0, 704, 525, 0, 0, 0, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 544, 0, 1199, 0, 0, 0, 1439, 0, 0, 970, 0, 0, 0, 0, 708, 991, 1442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1446, 973, 0, 1027, 0, 238, 239, 0, 684, 725, 0, 0, 728, 0, 730, 731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 740, 0, 0, 0, 525, 0, 0, 0, 518, 520, 522, 1107, 745, 746, 748, 0, 0, 241, 0, 0, 0, 754, 242, 0, 0, 761, 0, 0, 764, 0, 0, 274, 0, 0, 0, 0, 0, 974, 769, 0, 0, 614, 616, 0, 0, 620, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 975, 800, 677, 0, 0, 0, 804, 1271, 806, 0, 0, 0, 0, 1147, 0, 525, 0, 0, 0, 976, 0, 0, 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 517, 517, 0, 0, 0, 0, 0, 0, 821, 822, 823, 824, 0, 1534, 977, 1163, 525, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1545, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 525, 0, 677, 0, 0, 0, 0, 1280, 0, 0, 0, 0, 0, 0, 0, 517, 517, 1187, 517, 1188, 526, 1189, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 517, 0, 0, 0, 1292, 0, 0, 0, 0, 0, 525, 0, 971, 0, 0, 987, 0, 517, 992, 0, 0, 0, 1001, 1007, 0, 0, 0, 0, 0, 1601, 1602, 0, 0, 0, 1052, 1077, 0, 1220, 1221, 0, 0, 1606, 714, 0, 0, 0, 0, 0, 0, 0, 0, 517, 517, 0, 167, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 194, 0, 1111, 194, 1373, 0, 0, 0, 252, 0, 0, 0, 194, 0, 0, 0, 0, 685, 0, 0, 0, 296, 0, 1653, 0, 0, 310, -171, -171, -171, -171, -171, -171, 535, 536, 537, 538, 539, 0, 1663, 540, 0, 364, 0, 1667, 389, 0, 0, 0, 1671, 0, 796, 194, 1140, -171, -171, -171, -171, -171, -171, 554, 555, 556, 557, 558, 0, 0, 559, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 194, 0, 458, 525, 0, 194, 194, 0, 0, 1238, 0, 0, 0, 0, 1243, 0, 0, 0, 0, 0, 0, 496, 1169, 194, 526, 525, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1375, 0, 0, 0, 0, 1270, 525, 0, 0, 859, 861, 863, 865, 867, 869, 871, 873, 875, 877, 879, 881, 883, 885, 0, 0, 0, 0, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 1294, 525, 0, 1298, 0, 0, 0, 0, 1308, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1376, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 1089, 0, 517, 517, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 525, 0, 677, 0, 0, 0, 0, 1377, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1378, 0, 0, 0, 0, 0, 194, 0, 525, 0, 0, 0, 0, 0, 1381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1235, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 1394, 525, 0, 0, 1379, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 0, 1244, 1245, 0, 525, 0, 1246, 0, 0, 0, 0, 0, 194, 0, 194, 194, 0, 0, 0, 0, 0, 0, 1264, 1265, 0, 0, 0, 0, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 517, 194, 0, 0, 1273, 1275, 0, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 0, 525, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 1293, 0, 0, 0, 0, 0, 0, 0, 1307, 0, 0, 1313, 1314, 194, 0, 0, 0, 0, 194, 194, 0, 0, 0, 0, 0, 0, 0, 1323, 0, 0, 1328, 0, 0, 1339, 0, 0, 525, 0, 0, 1349, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 1438, 1357, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1370, 0, 677, 0, 0, 0, 0, 1385, 0, 0, 0, 0, 526, 194, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 855, 0, 0, 1391, 0, 0, 0, 0, 1383, 1384, 525, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 1499, 677, 1396, 1502, 0, 1398, 1392, 0, 1399, 0, 0, 0, 525, 0, 0, 0, 0, 526, 1402, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 525, 0, 0, 0, 1407, 0, 0, 194, 194, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1408, 0, 0, 0, 0, 194, 1422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1541, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 194, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1586, 1419, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 1444, 0, 0, 1421, 0, 0, 1360, 1362, 1364, 0, 0, 0, 0, 0, 0, 0, 0, 1452, 1455, 0, 0, 0, 0, 1171, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 1471, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1489, 1428, 0, 0, 0, 0, 1386, 1387, 0, 1388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1655, 0, 0, 0, 0, 0, 1397, 0, 526, 194, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1404, 0, 677, 0, 0, 0, 0, 1431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1516, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 1414, 1416, 0, 0, 0, 0, 0, 1532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1542, 0, 1543, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1550, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, -87, 1569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 1580, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1591, 1466, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1467, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7, 1, 1622, 0, 0, 0, 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 16, 0, 17, 18, 0, 0, 19, 20, 0, 0, 0, 21, 22, 23, 0, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 27, 28, 0, 0, 0, 0, 29, 0, 0, 30, 0, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 38, 0, 0, 0, 0, 0, 39, 40, 1518, 1520, 41, 0, 42, 0, 0, 43, 0, 0, 44, 45, 0, 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, 49, 50, 0, 0, 0, 51, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 57, 58, 59, 0, 60, 0, 61, 0, 0, 0, 0, 62, 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 67, 68, 69, 70, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 72, 0, 73, 0, 0, 0, 1593, 0, 0, 0, 0, 0, 0, 0, 526, 74, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 75, 540, 0, 0, 194, 76, 77, 78, 79, 80, 81, 0, 0, 82, 83, 84, 85, 0, 86, 87, 0, 0, 0, 0, 88, 1628, 89, 90, 91, 92, 93, 94, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 98, 0, 99, 100, 0, 0, 101, 102, 0, 0, 0, 1652, 0, 0, 103, 104, 105, 106, 0, 107, 0, 0, 0, 108, 109, 110, 0, 0, 0, 111, 0, 112, 113, 114, 0, 0, 0, 0, 115, 116, 117, 118, 119, 120, 121, 0, 122, 123, 0, 124, 125, 126, 127, 128, 129, 130, 0, 131, 132, 133, 0, 526, 1225, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 134, 135, 136, 137, 138, 139, 140, 141, -7, 1, 0, 0, 0, 0, 142, 143, 144, 145, 146, 0, 0, 0, 0, 0, 0, 0, 847, 848, 4, 525, 147, 148, 0, 0, 0, 149, 0, 0, 0, -7, 150, 0, 0, 16, 0, 17, 18, 0, 0, 19, 20, 0, 525, 0, 21, 22, 23, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 27, 28, 0, 544, 0, 0, 29, 0, 0, 30, 0, 0, 0, 0, 0, 0, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 0, 35, 36, 37, 38, 0, 0, 0, 0, 0, 39, 40, 0, 0, 41, 0, 42, 0, 0, 43, 0, 0, 44, 45, 0, 0, 0, 46, 0, 47, 0, 0, 0, 0, 48, 49, 50, 0, 0, 0, 51, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, 60, 0, 61, 544, 0, 0, 0, 62, 0, 63, 64, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, -171, -171, -171, -171, -171, -171, 672, 673, 674, 675, 676, 0, 0, 677, 0, 71, 0, 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 76, 77, 78, 79, 0, 81, 0, 0, 82, 83, 849, 85, 0, 86, 87, 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, 93, 94, 0, 0, 0, 0, 96, 97, 0, 0, 0, 0, 98, 0, 99, 100, 0, 0, 101, 102, 0, 0, 0, 0, 0, 0, 103, 0, 105, 106, 0, 107, 0, 0, 0, 108, 109, 110, 0, 0, 0, 111, 0, 112, 113, 114, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 122, 123, 0, 124, 0, 0, 0, 0, 129, 130, 0, 131, 132, 133, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 140, 141, 0, 0, 0, 0, 0, 24, 142, 850, 851, 852, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, -7, 0, 1468, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1469, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 0, 1483, 525, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 204, 205, 206, 56, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 24, 0, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 525, 0, 0, 1485, 0, 0, 0, 312, 0, 0, 0, 313, 314, 315, 316, 317, 318, 0, 0, 0, 319, 320, 321, 322, 323, 324, 243, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 326, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 327, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 0, 70, 0, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 0, 0, 0, 0, 0, 0, 544, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 1139, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 341, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 207, 0, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 0, 525, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 526, 0, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 845, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 342, 343, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 224, 225, 226, 5, 249, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 1036, 0, 1037, 0, 0, 0, 0, 0, 0, 0, 525, 24, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 1038, 677, 0, 525, 0, 0, 1491, 0, 202, 0, 0, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 526, 1493, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 525, 0, 677, 0, 0, 0, 0, 1494, 368, 0, 1039, 1040, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 525, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 545, 70, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 241, 1042, 0, 0, 0, 242, 0, 1025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1043, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, 0, 0, 0, 526, 243, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1498, 0, 0, 0, 0, 95, 96, 97, 0, 1046, 0, 1047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1048, 1049, 1050, 526, 104, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 1051, 0, 677, 0, 0, 0, 0, 1527, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 1061, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 24, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 1062, 525, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 202, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 526, 1063, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 525, 0, 677, 0, 0, 0, 526, 1528, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 525, 0, 677, 0, 0, 0, 0, 1529, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 54, 55, 1064, 0, 526, 56, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 239, 0, 0, 1530, 1065, 0, 0, 0, 0, 0, 0, 0, 1066, 0, 1067, 0, 1068, 1069, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 241, 544, 1070, 1071, 1531, 242, 0, 1025, 0, 1072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 1074, 0, 0, 0, 0, 24, 1075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 366, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 202, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 134, 135, 136, 137, 138, 139, 49, 50, 0, 0, 0, 525, 0, 0, 369, 244, 245, 246, 146, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 147, 247, 370, 0, 0, 248, 0, 0, 371, 0, 249, 372, 0, 0, 0, 238, 239, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 526, 70, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 241, 1533, 525, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 243, 0, 677, 0, 0, 0, 526, 1539, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 95, 96, 97, 526, 1228, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 374, 104, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 375, 0, 116, 117, 118, 119, 120, 121, 0, 525, 0, 24, 403, 125, 126, 127, 128, 129, 130, 376, 0, 545, 1229, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 134, 135, 377, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 525, 244, 245, 246, 146, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 54, 55, 405, 0, 406, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 526, 70, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1548, 0, 0, 0, 0, 0, 0, 526, 409, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 525, 677, 0, 0, 0, 0, 1549, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 95, 96, 97, 0, 0, 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 104, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 414, 677, 0, 0, 0, 0, 1565, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 24, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 525, 0, 0, 0, 0, 452, 0, 0, 0, 147, 247, 0, 0, 202, 248, 0, 0, 0, 0, 249, 0, 525, 0, 0, 0, 526, 453, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 0, 0, 525, 0, 0, 0, 49, 50, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 54, 55, 677, 0, 0, 56, 0, 1567, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 526, 70, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 1179, 0, 0, 677, 0, 0, 0, 241, 224, 225, 226, 5, 242, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 456, 0, 1002, 1003, 0, 0, 0, 0, 0, 0, 0, 202, 0, 95, 96, 97, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 104, 0, 0, 1568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 49, 50, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 238, 239, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 274, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 24, 677, 0, 243, 0, 526, 1583, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 202, 0, 1585, 0, 95, 96, 97, 525, 0, 1005, 1006, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 104, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 237, 0, 677, 0, 0, 0, 0, 1598, 0, 0, 116, 117, 118, 119, 120, 121, 544, 49, 50, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 238, 239, 0, 0, 240, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 241, 224, 225, 226, 5, 242, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 24, 243, 677, 0, 0, 0, 0, 1599, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 525, 0, 49, 50, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 238, 239, 0, 0, 294, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 241, 224, 225, 226, 5, 242, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 24, 243, 526, 525, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1600, 202, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 846, 116, 117, 118, 119, 120, 121, 0, 0, 544, 49, 50, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 525, 238, 239, 0, 0, 387, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 241, 224, 225, 226, 5, 242, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 24, 243, 677, 0, 0, 0, 0, 1614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 525, 0, 0, 0, 0, 0, 0, 202, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 104, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, -90, 368, 116, 117, 118, 119, 120, 121, 0, 0, 0, 49, 50, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 239, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 241, 0, 0, 0, 525, 242, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1615, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 473, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 104, 0, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 202, 559, 0, 0, 0, 1094, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 525, 1616, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 49, 50, 1335, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 525, 54, 55, 147, 247, 0, 56, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 526, 70, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 241, 1631, 0, 0, 526, 242, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 525, 0, 1336, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 17, 18, 525, 0, 0, 1337, 0, 0, 0, 0, 561, 202, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1642, 134, 135, 136, 137, 138, 139, 49, 50, 1325, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 563, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 0, 564, 0, 0, 238, 239, 0, 0, 0, 0, 0, 204, 205, 206, 0, 424, 0, 0, 0, 68, 425, 70, 565, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 224, 225, 226, 5, 242, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 241, 0, 0, 0, 0, 242, 24, 243, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 0, 1648, 202, 0, 95, 96, 97, 0, 526, 1326, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 104, 0, 0, 0, 1654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 566, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 49, 50, 125, 126, 127, 128, 129, 130, 567, 0, 426, 0, 0, 0, 0, 0, 0, 54, 55, 0, 525, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 132, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 147, 247, 0, 0, 141, 248, 0, 0, 0, 0, 249, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 274, 0, 0, 0, 1662, 526, 568, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 243, 0, 677, 0, 0, 0, 0, 1666, 0, 544, 0, 0, 0, 0, 0, 0, 984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 207, 0, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 986, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 1289, 0, 0, 0, 24, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 1249, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 526, 249, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 24, 0, 0, 54, 55, 0, 0, 545, 56, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 1250, 677, 0, 0, 0, 845, 0, 0, 0, 0, 1251, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 243, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1290, 0, 0, 68, 0, 70, 0, 0, 0, 0, 545, 104, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1195, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 95, 96, 97, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 104, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 24, 0, 0, 0, 487, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 489, 490, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 525, 0, 559, 49, 50, 0, 1356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 526, 24, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 526, 1095, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 525, 0, 540, 0, 0, 0, 1459, 0, 0, 0, 0, 0, 545, 243, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1460, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, 737, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 0, 70, 0, 498, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 525, 0, 0, 500, 501, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 95, 96, 97, 0, 0, 738, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 17, 18, 0, 104, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 562, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 1181, 0, 0, 677, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 49, 50, 0, 0, 563, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 147, 247, 56, 0, 0, 248, 0, 564, 0, 0, 249, 224, 225, 226, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 565, 0, 0, 0, 0, 0, 68, 69, 70, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 1461, 241, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 515, 0, 0, 544, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 525, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 544, 0, 0, 54, 55, 0, 0, 0, 56, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 567, 0, 0, 125, 126, 127, 128, 129, 130, 68, 69, 70, 0, -171, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 132, 677, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 141, 0, 0, 525, 0, 147, 148, 0, 80, 0, 149, 0, 0, 0, 1403, 150, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 95, 96, 97, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 191, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 147, 148, 49, 50, 0, 149, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 545, 767, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 525, 0, 526, 1462, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 243, 0, 545, 1463, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1464, 525, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 682, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 54, 55, 0, 768, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 68, -171, 70, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 134, 135, 136, 137, 138, 139, 544, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 243, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 104, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 202, 0, 559, 0, 0, 0, 1484, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1497, 0, 134, 135, 136, 137, 138, 139, 0, 49, 50, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 147, 247, 0, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 1302, 0, 0, 526, 24, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1459, 0, 0, 0, 274, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 243, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1461, 0, 0, 0, 0, 0, 95, 96, 97, 544, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 68, -171, 70, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 134, 135, 136, 137, 138, 139, 525, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 0, 0, 248, 243, 0, 0, 0, 249, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 1303, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1453, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 49, 50, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 147, 247, 56, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 24, 526, 0, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 191, 0, 0, 1561, 0, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 243, 545, 1454, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 0, 1562, 0, 525, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 526, 70, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 1563, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 49, 50, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 147, 247, 56, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 545, 24, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 0, 0, 559, 0, 0, 191, 1564, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1561, 0, 0, 0, 526, 243, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 544, 0, 677, 0, 0, 0, 1563, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 450, 0, 0, 125, 126, 127, 128, 129, 130, 68, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 526, 0, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 95, 96, 97, 1612, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 368, 0, 525, 0, 0, 0, 0, 0, 147, 247, 49, 50, 0, 248, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 525, 0, 559, 0, 0, 0, 1613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 243, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1612, 0, 0, 0, 525, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 526, 70, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 1640, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 545, 104, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 1315, 0, 559, 0, 0, 0, 1641, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1640, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 49, 50, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 147, 247, 56, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 70, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 526, 0, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 544, 1657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 526, 243, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 0, 0, 540, 0, 0, 0, 1658, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 0, 0, 0, 0, 1317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 49, 50, 0, 0, 0, 244, 245, 246, 146, 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, 147, 247, 56, 0, 0, 248, 0, 0, 0, 0, 249, 224, 225, 226, 5, 0, 227, 228, 8, 229, 230, 231, 232, 233, 234, 235, 0, 0, 0, 0, 0, 571, 0, 0, 68, 0, 70, 572, 0, 0, 0, 0, 545, 24, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 202, 573, 559, 0, 0, 526, 1659, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 0, 0, 677, 0, 0, 0, 1658, 0, 0, 0, 574, 575, 0, 243, 0, 576, 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 578, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 54, 55, 0, 0, 0, 56, 579, 580, 0, 581, 0, 238, 239, 582, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 0, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 68, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 583, 0, 0, 0, 0, 0, 244, 245, 246, 146, 571, 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, 147, 247, 0, 243, 0, 248, 0, 0, 0, 0, 249, 0, 0, 0, 0, 202, 573, 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 574, 575, 0, 0, 0, 576, 104, 0, 0, 586, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, 578, 0, 0, 0, 0, 125, 126, 127, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 579, 580, 0, 581, 0, 238, 239, 582, 0, 134, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, 763, 0, 0, 0, 0, 0, 0, 0, 0, 588, 0, 0, 147, 247, 0, 241, 0, 248, 0, 0, 242, 0, 249, 0, 312, 0, 0, 0, 313, 314, 315, 316, 317, 318, 0, 0, 583, 319, 320, 321, 322, 323, 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342, 343 }; #define yypact_value_is_default(yystate) \ ((yystate) == (-900)) #define yytable_value_is_error(yytable_value) \ ((yytable_value) == (-171)) static const yytype_int16 yycheck[] = { 0, 293, 588, 167, 35, 81, 19, 20, 178, 69, 62, 181, 49, 183, 184, 79, 186, 124, 46, 304, 45, 75, 61, 104, 923, 75, 182, 27, 62, 46, 66, 46, 34, 47, 323, 111, 62, 63, 44, 39, 40, 122, 208, 75, 102, 52, 40, 213, 25, 375, 27, 103, 124, 105, 125, 17, 33, 109, 110, 96, 959, 46, 62, 40, 64, 158, 222, 329, 46, 158, 47, 75, 398, 114, 218, 27, 60, 75, 69, 208, 399, 33, 392, 124, 213, 62, 396, 64, 40, 69, 122, 97, 354, 132, 133, 47, 22, 52, 98, 132, 133, 392, 62, 103, 248, 394, 397, 392, 99, 109, 62, 75, 64, 68, 167, 115, 19, 20, 155, 169, 394, 171, 172, 123, 425, 426, 103, 428, 105, 165, 394, 301, 109, 110, 215, 148, 208, 218, 394, 165, 1039, 213, 142, 123, 69, 170, 394, 147, 148, 149, 150, 135, 136, 394, 208, 162, 204, 167, 208, 213, 394, 64, 117, 213, 236, 236, 128, 33, 222, 227, 204, 169, 265, 171, 172, 304, 265, 102, 178, 179, 69, 181, 182, 138, 354, 185, 75, 187, 188, 189, 190, 168, 58, 395, 396, 98, 362, 394, 208, 212, 202, 208, 209, 213, 206, 108, 213, 171, 172, 248, 208, 132, 133, 145, 208, 213, 168, 253, 222, 213, 204, 0, 27, 237, 179, 180, 181, 253, 33, 300, 269, 270, 304, 122, 394, 40, 392, 221, 69, 239, 19, 62, 47, 22, 75, 148, 206, 247, 248, 249, 321, 279, 31, 51, 304, 280, 216, 62, 222, 64, 237, 223, 279, 297, 279, 337, 169, 321, 208, 75, 394, 226, 77, 213, 294, 230, 302, 75, 144, 293, 146, 582, 61, 172, 332, 392, 313, 337, 295, 296, 338, 122, 71, 214, 279, 322, 256, 304, 103, 165, 105, 279, 227, 303, 109, 110, 304, 394, 87, 212, 392, 392, 360, 147, 394, 397, 293, 115, 74, 303, 99, 276, 101, 269, 270, 177, 178, 106, 107, 284, 285, 345, 392, 167, 1233, 399, 320, 219, 246, 337, 304, 172, 224, 122, 394, 124, 75, 279, 269, 270, 395, 396, 366, 373, 206, 75, 356, 22, 69, 359, 373, 392, 67, 168, 394, 231, 232, 387, 345, 99, 75, 371, 542, 171, 172, 394, 376, 377, 310, 282, 102, 397, 337, 394, 273, 206, 289, 253, 129, 366, 117, 394, 22, 245, 301, 216, 392, 394, 204, 399, 127, 397, 594, 399, 596, 597, 406, 394, 394, 396, 208, 332, 412, 394, 366, 213, 222, 122, 59, 394, 420, 62, 596, 597, 222, 394, 172, 183, 394, 429, 430, 18, 432, 394, 604, 455, 163, 394, 394, 360, 394, 441, 273, 309, 0, 311, 399, 132, 133, 399, 450, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 463, 393, 391, 171, 172, 399, 225, 72, 641, 394, 643, 394, 645, 394, 75, 392, 479, 22, 301, 394, 394, 204, 394, 208, 487, 488, 489, 490, 213, 386, 387, 388, 329, 330, 391, 498, 499, 500, 501, 222, 394, 394, 227, 304, 234, 394, 288, 586, 511, 512, 513, 394, 394, 394, 222, 394, 571, 354, 355, 356, 357, 358, 359, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 392, 594, 392, 596, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 366, 576, 577, 71, 206, 271, 581, 392, 171, 172, 585, 213, 171, 172, 216, 301, 273, 273, 358, 397, 360, 361, 583, 269, 270, 264, 587, 293, 273, 115, 386, 387, 388, 571, 595, 391, 301, 301, 576, 577, 273, 377, 603, 581, 384, 208, 273, 585, 391, 208, 213, 167, 394, 121, 213, 593, 594, 391, 596, 597, 391, 22, 402, 576, 132, 133, 627, 399, 581, 304, 140, 367, 585, 386, 387, 388, 637, 1224, 391, 395, 593, 642, 396, 644, 395, 646, 647, 648, 649, 273, 396, 396, 396, 433, 22, 396, 396, 395, 438, 439, 220, 398, 396, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 395, 301, 681, 682, 396, 396, 301, 395, 687, 396, 396, 690, 855, 372, 395, 986, 396, 395, 323, 396, 699, 273, 208, 396, 147, 718, 396, 213, 396, 273, 374, 273, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 724, 396, 391, 506, 372, 372, 395, 396, 396, 396, 734, 396, 736, 737, 738, 396, 396, 718, 742, 64, 374, 524, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 396, 75, 391, 269, 398, 22, 394, 396, 767, 768, 129, 297, 576, 396, 297, 396, 395, 581, 396, 396, 396, 585, 396, 395, 395, 395, 395, 395, 108, 593, 594, 396, 596, 597, 398, 395, 395, 27, 67, 395, 69, 115, 396, 802, 396, 396, 75, 396, 807, 396, 40, 810, 132, 133, 813, 45, 396, 47, 854, 395, 395, 820, 396, 601, 602, 396, 269, 270, 396, 396, 829, 396, 62, 374, 64, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 395, 169, 391, 395, 630, 122, 22, 396, 395, 171, 172, 395, 569, 396, 396, 395, 34, 396, 396, 1158, 395, 508, 41, 314, 315, 103, 317, 318, 524, 1025, -1, 109, 856, -1, 325, 326, 327, 328, -1, 22, -1, 888, -1, 160, 329, 330, 208, 164, 67, -1, -1, 213, -1, -1, 680, 172, 75, 856, -1, -1, 222, -1, 946, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 922, -1, 924, -1, 926, 1097, -1, -1, -1, 1101, -1, -1, -1, -1, 167, 168, -1, 170, -1, -1, 22, -1, -1, 215, 177, -1, 269, 270, 122, 1003, 124, -1, -1, -1, -1, -1, 228, -1, 960, 192, -1, -1, -1, -1, 197, -1, 289, -1, 749, -1, -1, 973, -1, -1, 976, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 1004, 391, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, 1005, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 975, 391, -1, 1026, 1004, -1, 396, 809, -1, -1, -1, -1, -1, 208, 209, -1, 1039, 22, 213, 1042, -1, -1, -1, -1, -1, -1, 1049, 1050, 856, -1, -1, -1, -1, 1226, -1, -1, -1, -1, -1, -1, -1, 236, 237, 1066, -1, -1, 1069, 1070, 1071, -1, -1, 1074, -1, -1, -1, -1, -1, -1, -1, -1, 255, -1, -1, -1, -1, -1, 1066, 22, -1, 1069, -1, -1, -1, -1, -1, 1098, 1099, 1100, -1, 1102, 1103, 1104, 1105, -1, -1, -1, -1, -1, -1, -1, -1, 1066, 346, 374, 1069, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 304, 391, -1, 366, -1, -1, 396, 370, 0, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1154, 1155, -1, 1157, -1, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, 975, -1, -1, -1, 1174, -1, -1, 1177, -1, 1179, -1, 1181, -1, -1, -1, -1, -1, -1, -1, -1, 1190, 1191, -1, -1, 1194, -1, -1, -1, -1, 1199, -1, -1, -1, -1, 1374, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 1225, -1, 396, 1228, 1229, -1, -1, -1, -1, -1, -1, -1, -1, 374, 1239, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 1066, -1, -1, 1069, -1, -1, -1, -1, -1, -1, 1271, -1, 504, -1, -1, 507, -1, -1, 510, 1280, 1281, -1, -1, -1, -1, -1, -1, 148, 149, 150, -1, 1292, -1, 374, 1295, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 181, 182, -1, -1, 185, 1326, -1, -1, -1, -1, -1, 563, 564, 565, 566, 1336, -1, 569, -1, 571, 572, -1, -1, 575, 576, -1, 578, -1, 22, -1, 582, 1352, -1, -1, -1, -1, -1, -1, -1, -1, -1, 593, -1, -1, 596, 597, -1, -1, -1, 22, -1, 1372, 1373, -1, 1375, 1376, 1377, 1378, 1379, -1, -1, -1, -1, -1, 1385, 1165, -1, -1, -1, -1, 1391, 1392, -1, 22, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 1407, 1408, 391, -1, -1, -1, -1, -1, -1, -1, -1, 1418, 1419, 22, 1421, -1, 1423, -1, -1, -1, -1, 1428, -1, -1, 1431, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1441, -1, 1222, -1, 1445, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 22, 391, 691, -1, -1, -1, -1, 1465, 1466, 1467, 1468, 1469, 1470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 718, -1, -1, -1, -1, -1, -1, 1494, -1, -1, -1, 1498, 359, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 752, 396, -1, -1, 22, 1526, 1527, 1528, 1529, 1530, 1531, -1, 1533, -1, -1, -1, -1, -1, 1539, 16, 22, -1, -1, -1, -1, -1, -1, 1548, 1549, -1, -1, 28, -1, 30, -1, -1, -1, -1, 35, 36, -1, -1, 39, -1, 1565, 1566, 1567, 1568, -1, -1, -1, 48, -1, -1, -1, 52, -1, -1, -1, -1, 441, -1, 1583, -1, 1585, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, 1598, 1599, 1600, -1, 22, 79, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, 1614, 1615, 1616, -1, 94, -1, -1, -1, -1, 1623, 855, 856, 22, -1, -1, 105, -1, 1631, 1632, -1, 110, -1, -1, 113, -1, 1639, -1, -1, 1642, -1, 296, -1, -1, 22, 1648, -1, -1, -1, -1, -1, 1654, -1, -1, -1, -1, -1, -1, -1, 1662, -1, 524, -1, 1666, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 22, -1, -1, -1, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 374, 178, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, 193, 391, -1, -1, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 603, 975, -1, 374, 223, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, 1002, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, 273, -1, 275, -1, -1, -1, -1, -1, -1, -1, -1, -1, 285, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 302, 391, 304, 74, 1061, -1, 396, -1, 1065, 1066, 22, 374, 1069, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 1086, -1, 102, -1, 396, -1, -1, -1, 108, -1, -1, -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 356, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 368, 374, 391, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 22, -1, 1145, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, 401, -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, -1, -1, -1, -1, -1, -1, -1, 419, -1, -1, -1, 22, 424, 425, 426, 196, 428, 429, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 453, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 238, -1, 391, 472, -1, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 22, 396, 1253, -1, 75, -1, -1, -1, 273, 274, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 305, 22, -1, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 22, -1, 396, -1, -1, -1, 1325, -1, -1, 573, -1, -1, -1, -1, 347, 579, 1335, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1346, 167, -1, 594, -1, 171, 172, -1, 368, 369, -1, -1, 372, -1, 374, 375, -1, -1, -1, -1, -1, -1, -1, -1, -1, 385, -1, -1, -1, 22, -1, -1, -1, 148, 149, 150, 627, 397, 398, 399, -1, -1, 208, -1, -1, -1, 406, 213, -1, -1, 410, -1, -1, 413, -1, -1, 222, -1, -1, -1, -1, -1, 228, 423, -1, -1, 181, 182, -1, -1, 185, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 254, 449, 391, -1, -1, -1, 454, 396, 456, -1, -1, -1, -1, 692, -1, 22, -1, -1, -1, 273, -1, -1, -1, -1, -1, 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1098, 1099, 1100, -1, -1, -1, -1, -1, -1, 492, 493, 494, 495, -1, 1483, 304, 730, 22, -1, -1, -1, -1, -1, -1, -1, -1, 374, 1496, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, 1154, 1155, 772, 1157, 774, 374, 776, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 1177, -1, -1, -1, 396, -1, -1, -1, -1, -1, 22, -1, 574, -1, -1, 577, -1, 1194, 580, -1, -1, -1, 584, 585, -1, -1, -1, -1, -1, 1577, 1578, -1, -1, -1, 596, 597, -1, 830, 831, -1, -1, 1589, 359, -1, -1, -1, -1, -1, -1, -1, -1, 1228, 1229, -1, 0, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 19, -1, 637, 22, 396, -1, -1, -1, 27, -1, -1, -1, 31, -1, -1, -1, -1, 652, -1, -1, -1, 40, -1, 1644, -1, -1, 45, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 1660, 391, -1, 61, -1, 1665, 64, -1, -1, -1, 1670, -1, 441, 71, 688, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, 101, -1, 103, 22, -1, 106, 107, -1, -1, 957, -1, -1, -1, -1, 962, -1, -1, -1, -1, -1, -1, 122, 739, 124, 374, 22, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 999, 22, -1, -1, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, -1, -1, -1, -1, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 1037, 22, -1, 1040, -1, -1, -1, -1, 1045, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, 603, -1, 1465, 1466, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, -1, 396, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, 288, -1, 22, -1, -1, -1, -1, -1, 1143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 925, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 1173, 22, -1, -1, 396, -1, -1, -1, 1565, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 961, -1, 963, 964, -1, 22, -1, 968, -1, -1, -1, -1, -1, 358, -1, 360, 361, -1, -1, -1, -1, -1, -1, 984, 985, -1, -1, -1, -1, -1, -1, -1, 993, -1, -1, -1, -1, -1, 1614, 384, -1, -1, 1003, 1004, -1, 1006, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 402, -1, 22, -1, -1, -1, -1, -1, -1, 1642, -1, -1, -1, -1, -1, -1, -1, -1, 1036, -1, -1, -1, -1, -1, -1, -1, 1044, -1, -1, 1047, 1048, 433, -1, -1, -1, -1, 438, 439, -1, -1, -1, -1, -1, -1, -1, 1063, -1, -1, 1066, -1, -1, 1069, -1, -1, 22, -1, -1, 1075, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 1321, 1091, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 1109, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 374, 506, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 524, -1, -1, 396, -1, -1, -1, -1, 1148, 1149, 22, -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 1406, 391, 1177, 1409, -1, 1180, 396, -1, 1183, -1, -1, -1, 22, -1, -1, -1, -1, 374, 1193, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 22, -1, -1, -1, 396, -1, -1, 601, 602, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 630, 1247, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 1490, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 680, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 1547, 396, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 1337, -1, -1, 396, -1, -1, 1098, 1099, 1100, -1, -1, -1, -1, -1, -1, -1, -1, 1354, 1355, -1, -1, -1, -1, 744, -1, -1, -1, -1, 749, -1, -1, -1, -1, -1, 1371, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 1393, 396, -1, -1, -1, -1, 1154, 1155, -1, 1157, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1647, -1, -1, -1, -1, -1, 1177, -1, 374, 809, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 1194, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1457, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 1228, 1229, -1, -1, -1, -1, -1, 1480, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1491, -1, 1493, -1, -1, -1, -1, -1, -1, -1, -1, 374, 1503, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 1525, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 1540, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 1560, 396, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1603, -1, -1, -1, -1, -1, -1, -1, 1611, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 35, -1, 37, 38, -1, -1, 41, 42, -1, -1, -1, 46, 47, 48, -1, 50, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, 64, 65, -1, -1, -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, 80, 81, -1, -1, -1, -1, -1, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, -1, 98, 99, 100, 101, -1, -1, -1, -1, -1, 107, 108, 1465, 1466, 111, -1, 113, -1, -1, 116, -1, -1, 119, 120, -1, -1, -1, 124, -1, 126, -1, -1, -1, -1, 131, 132, 133, -1, -1, -1, 137, -1, 139, -1, -1, 142, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, 155, 156, 157, -1, 159, -1, 161, -1, -1, -1, -1, 166, -1, 168, 169, -1, -1, -1, 173, 174, -1, -1, -1, -1, -1, 1165, -1, -1, -1, -1, 185, 186, 187, 188, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, 201, -1, 203, -1, 205, -1, -1, -1, 1565, -1, -1, -1, -1, -1, -1, -1, 374, 218, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 233, 391, -1, -1, 1222, 238, 239, 240, 241, 242, 243, -1, -1, 246, 247, 248, 249, -1, 251, 252, -1, -1, -1, -1, 257, 1614, 259, 260, 261, 262, 263, 264, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, 275, -1, 277, 278, -1, -1, 281, 282, -1, -1, -1, 1642, -1, -1, 289, 290, 291, 292, -1, 294, -1, -1, -1, 298, 299, 300, -1, -1, -1, 304, -1, 306, 307, 308, -1, -1, -1, -1, 313, 314, 315, 316, 317, 318, 319, -1, 321, 322, -1, 324, 325, 326, 327, 328, 329, 330, -1, 332, 333, 334, -1, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 354, 355, 356, 357, 358, 359, 360, 361, 0, 1, -1, -1, -1, -1, 368, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 22, 384, 385, -1, -1, -1, 389, -1, -1, -1, 393, 394, -1, -1, 35, -1, 37, 38, -1, -1, 41, 42, -1, 22, -1, 46, 47, 48, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, 64, 65, -1, 22, -1, -1, 70, -1, -1, 73, -1, -1, -1, -1, -1, -1, 80, 81, -1, -1, -1, -1, -1, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, -1, 98, 99, 100, 101, -1, -1, -1, -1, -1, 107, 108, -1, -1, 111, -1, 113, -1, -1, 116, -1, -1, 119, 120, -1, -1, -1, 124, -1, 126, -1, -1, -1, -1, 131, 132, 133, -1, -1, -1, 137, -1, 139, -1, -1, 142, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, 156, 157, -1, 159, -1, 161, 22, -1, -1, -1, 166, -1, 168, 169, -1, -1, -1, 173, 174, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 185, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 201, -1, 203, -1, 205, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 233, -1, -1, -1, -1, 238, 239, 240, 241, -1, 243, -1, -1, 246, 247, 248, 249, -1, 251, 252, -1, -1, -1, -1, -1, -1, 259, 260, 261, 262, 263, 264, -1, -1, -1, -1, 269, 270, -1, -1, -1, -1, 275, -1, 277, 278, -1, -1, 281, 282, -1, -1, -1, -1, -1, -1, 289, -1, 291, 292, -1, 294, -1, -1, -1, 298, 299, 300, -1, -1, -1, 304, -1, 306, 307, 308, -1, -1, -1, -1, 313, -1, -1, -1, -1, -1, -1, -1, 321, 322, -1, 324, -1, -1, -1, -1, 329, 330, -1, 332, 333, 334, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 360, 361, -1, -1, -1, -1, -1, 50, 368, 369, 370, 371, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 393, -1, 396, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 22, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, 52, 53, 54, 154, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, 50, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 22, -1, -1, 396, -1, -1, -1, 78, -1, -1, -1, 82, 83, 84, 85, 86, 87, -1, -1, -1, 91, 92, 93, 94, 95, 96, 242, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, 112, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, 130, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, 143, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, -1, 188, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, -1, -1, -1, -1, -1, 22, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, 235, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, 398, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, 266, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, 337, -1, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, -1, 22, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, 365, 366, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, 18, 19, 20, 21, 394, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, 39, -1, 41, -1, -1, -1, -1, -1, -1, -1, 22, 50, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 67, 391, -1, 22, -1, -1, 396, -1, 75, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, -1, 396, 122, -1, 124, 125, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, 22, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, 164, -1, -1, -1, -1, -1, -1, -1, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 208, 209, -1, -1, -1, 213, -1, 215, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 228, -1, -1, -1, -1, -1, -1, -1, 236, 237, -1, -1, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, 268, 269, 270, -1, 272, -1, 274, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 286, 287, 288, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 304, -1, 391, -1, -1, -1, -1, 396, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 36, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, 50, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, 62, 22, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, 75, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, 374, 89, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, -1, 396, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 149, 150, 151, -1, 374, 154, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 172, -1, -1, 396, 176, -1, -1, -1, -1, -1, -1, -1, 184, -1, 186, -1, 188, 189, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 208, 22, 210, 211, 396, 213, -1, 215, -1, 217, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 228, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 242, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, 273, -1, -1, -1, -1, 50, 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, 64, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, 75, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 122, -1, -1, -1, 354, 355, 356, 357, 358, 359, 132, 133, -1, -1, -1, 22, -1, -1, 140, 369, 370, 371, 372, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, 384, 385, 158, -1, -1, 389, -1, -1, 164, -1, 394, 167, -1, -1, -1, 171, 172, -1, -1, 175, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 208, 396, 22, -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 242, -1, 391, -1, -1, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 268, 269, 270, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 289, 290, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, 312, -1, 314, 315, 316, 317, 318, 319, -1, 22, -1, 50, 51, 325, 326, 327, 328, 329, 330, 331, -1, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, 22, 369, 370, 371, 372, -1, -1, -1, 103, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 149, 150, 151, -1, 153, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, 164, 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, 374, 217, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 22, 391, -1, -1, -1, -1, 396, -1, -1, -1, 242, -1, -1, -1, -1, -1, -1, -1, 250, -1, -1, 253, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 267, 268, 269, 270, -1, -1, 273, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 305, 391, -1, -1, -1, -1, 396, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, 50, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, 22, -1, -1, -1, -1, 67, -1, -1, -1, 384, 385, -1, -1, 75, 389, -1, -1, -1, -1, 394, -1, 22, -1, -1, -1, 374, 88, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, 22, -1, -1, -1, 132, 133, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 149, 150, 391, -1, -1, 154, -1, 396, -1, -1, -1, 160, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 172, -1, -1, 175, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 208, 18, 19, 20, 21, 213, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, 242, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 255, -1, 66, 67, -1, -1, -1, -1, -1, -1, -1, 75, -1, 268, 269, 270, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 290, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, 132, 133, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, 171, 172, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 222, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 50, 391, -1, 242, -1, 374, 396, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 75, -1, 396, -1, 268, 269, 270, 22, -1, 273, 274, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 115, -1, 391, -1, -1, -1, -1, 396, -1, -1, 314, 315, 316, 317, 318, 319, 22, 132, 133, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 171, 172, -1, -1, 175, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, 208, 18, 19, 20, 21, 213, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 50, 242, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, 22, -1, 132, 133, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, 171, 172, -1, -1, 175, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, 208, 18, 19, 20, 21, 213, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, -1, -1, -1, -1, -1, 50, 242, 374, 22, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 75, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 314, 315, 316, 317, 318, 319, -1, -1, 22, 132, 133, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, 22, 171, 172, -1, -1, 175, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, 208, 18, 19, 20, 21, 213, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 50, 242, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 22, -1, -1, -1, -1, -1, -1, 75, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 290, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 122, 314, 315, 316, 317, 318, 319, -1, -1, -1, 132, 133, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, 172, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, 208, -1, -1, -1, 22, 213, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, 242, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, 255, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, 290, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 75, 391, -1, -1, -1, 395, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 22, 396, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, 132, 133, 134, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 22, 149, 150, 384, 385, -1, 154, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, -1, -1, -1, 171, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 208, 396, -1, -1, 374, 213, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, 242, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, 22, -1, 273, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, 37, 38, 22, -1, -1, 297, -1, -1, -1, -1, 47, 75, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 354, 355, 356, 357, 358, 359, 132, 133, 134, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, 118, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, -1, 141, -1, -1, 171, 172, -1, -1, -1, -1, -1, 52, 53, 54, -1, 56, -1, -1, -1, 186, 61, 188, 162, -1, -1, -1, -1, -1, 69, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 208, 18, 19, 20, 21, 213, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 208, -1, -1, -1, -1, 213, 50, 242, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, -1, 396, 75, -1, 268, 269, 270, -1, 374, 273, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 290, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, 283, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, 132, 133, 325, 326, 327, 328, 329, 330, 304, -1, 207, -1, -1, -1, -1, -1, -1, 149, 150, -1, 22, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 333, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, 384, 385, -1, -1, 361, 389, -1, -1, -1, -1, 394, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 222, -1, -1, -1, 396, 374, 392, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 242, -1, 391, -1, -1, -1, -1, 396, -1, 22, -1, -1, -1, -1, -1, -1, 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, -1, 337, -1, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, 321, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 46, -1, -1, -1, 50, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, 374, 394, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 50, -1, -1, 149, 150, -1, -1, 374, 154, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 206, 391, -1, -1, -1, 395, -1, -1, -1, -1, 216, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 242, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, 186, -1, 188, -1, -1, -1, -1, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, 242, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 268, 269, 270, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, 290, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 50, -1, -1, -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, 363, 364, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, 132, 133, -1, 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, 374, 50, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 374, 395, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, 164, -1, -1, 167, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, -1, 188, -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, 22, -1, -1, 363, 364, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 268, 269, 270, -1, -1, 273, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 37, 38, -1, 290, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, 52, -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 132, 133, -1, -1, 118, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, 384, 385, 154, -1, -1, 389, -1, 141, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, 162, -1, -1, -1, -1, -1, 186, 187, 188, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 208, -1, -1, -1, -1, 213, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 242, -1, -1, -1, -1, -1, 248, -1, -1, 22, -1, -1, -1, -1, -1, 257, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, 22, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, 22, -1, -1, 149, 150, -1, -1, -1, 154, -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, 304, -1, -1, 325, 326, 327, 328, 329, 330, 186, 187, 188, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 333, 391, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, 361, -1, -1, 22, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, 248, 394, -1, -1, -1, -1, -1, -1, -1, 257, -1, -1, -1, -1, -1, -1, -1, 392, -1, -1, 268, 269, 270, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, 69, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, 384, 385, 132, 133, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, 374, 57, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 22, -1, 374, 395, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 242, -1, 374, 395, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 22, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, 278, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, 149, 150, -1, 152, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 354, 355, 356, 357, 358, 359, 22, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, 242, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 75, -1, 391, -1, -1, -1, 395, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, 354, 355, 356, 357, 358, 359, -1, 132, 133, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, 384, 385, -1, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, 46, -1, -1, 374, 50, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, 222, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, 268, 269, 270, 22, -1, -1, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, 354, 355, 356, 357, 358, 359, 22, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, -1, -1, 389, 242, -1, -1, -1, 394, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 132, 133, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, 384, 385, 154, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, 50, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 69, -1, -1, 395, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 242, 374, 244, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, 22, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 132, 133, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, 384, 385, 154, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, 374, 50, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 69, 395, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, 322, -1, -1, 325, 326, 327, 328, 329, 330, 186, -1, 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, 268, 269, 270, 395, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, 122, -1, 22, -1, -1, -1, -1, -1, 384, 385, 132, 133, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 22, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, 22, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, 374, 188, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, 374, 290, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 304, -1, 391, -1, -1, -1, 395, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 132, 133, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, 384, 385, 154, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, 186, -1, 188, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, 22, 395, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 374, 242, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, -1, -1, -1, -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, -1, 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, 132, 133, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 149, 150, -1, 384, 385, 154, -1, -1, 389, -1, -1, -1, -1, 394, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, 49, -1, -1, 186, -1, 188, 55, -1, -1, -1, -1, 374, 50, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 75, 76, 391, -1, -1, 374, 395, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, -1, 391, -1, -1, -1, 395, -1, -1, -1, 105, 106, -1, 242, -1, 110, -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, 141, -1, 132, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, 149, 150, -1, -1, -1, 154, 166, 167, -1, 169, -1, 171, 172, 173, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, -1, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 186, -1, 188, -1, -1, -1, -1, -1, -1, -1, -1, 208, -1, -1, -1, -1, 213, -1, -1, -1, -1, -1, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, 229, -1, -1, -1, -1, -1, 369, 370, 371, 372, 49, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, 384, 385, -1, 242, -1, 389, -1, -1, -1, -1, 394, -1, -1, -1, -1, 75, 76, -1, -1, -1, -1, -1, -1, -1, 274, -1, -1, -1, -1, 268, 269, 270, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 293, -1, 105, 106, -1, -1, -1, 110, 290, -1, -1, 304, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 314, 315, 316, 317, 318, 319, 141, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 353, -1, -1, 166, 167, -1, 169, -1, 171, 172, 173, -1, 354, 355, 356, 357, 358, 359, -1, -1, -1, -1, -1, -1, -1, -1, -1, 369, 370, 371, 372, -1, -1, -1, -1, -1, -1, -1, -1, 392, -1, -1, 384, 385, -1, 208, -1, 389, -1, -1, 213, -1, 394, -1, 78, -1, -1, -1, 82, 83, 84, 85, 86, 87, -1, -1, 229, 91, 92, 93, 94, 95, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 130, -1, -1, -1, -1, 274, -1, -1, -1, -1, -1, -1, -1, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 293, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 353, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 235, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 392, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 365, 366 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { 0, 1, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 37, 38, 41, 42, 46, 47, 48, 50, 51, 61, 64, 65, 70, 73, 80, 81, 89, 90, 98, 99, 100, 101, 107, 108, 111, 113, 116, 119, 120, 124, 126, 131, 132, 133, 137, 139, 142, 149, 150, 154, 155, 156, 157, 159, 161, 166, 168, 169, 173, 174, 185, 186, 187, 188, 201, 203, 205, 218, 233, 238, 239, 240, 241, 242, 243, 246, 247, 248, 249, 251, 252, 257, 259, 260, 261, 262, 263, 264, 268, 269, 270, 275, 277, 278, 281, 282, 289, 290, 291, 292, 294, 298, 299, 300, 304, 306, 307, 308, 313, 314, 315, 316, 317, 318, 319, 321, 322, 324, 325, 326, 327, 328, 329, 330, 332, 333, 334, 354, 355, 356, 357, 358, 359, 360, 361, 368, 369, 370, 371, 372, 384, 385, 389, 394, 401, 402, 403, 404, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 429, 430, 431, 432, 444, 452, 455, 461, 469, 471, 323, 394, 399, 167, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 69, 123, 405, 429, 430, 394, 246, 214, 332, 360, 430, 75, 465, 52, 53, 54, 337, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 437, 18, 19, 20, 23, 24, 26, 27, 28, 29, 30, 31, 32, 88, 115, 171, 172, 175, 208, 213, 242, 369, 370, 371, 385, 389, 394, 404, 411, 429, 430, 443, 463, 465, 466, 405, 19, 20, 64, 98, 108, 148, 169, 212, 282, 289, 435, 405, 430, 67, 122, 222, 271, 293, 462, 463, 464, 465, 466, 19, 20, 373, 435, 405, 405, 394, 404, 405, 429, 88, 115, 175, 404, 429, 443, 463, 465, 466, 394, 125, 236, 300, 321, 428, 71, 121, 269, 429, 443, 78, 82, 83, 84, 85, 86, 87, 91, 92, 93, 94, 95, 96, 109, 112, 130, 143, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 235, 266, 365, 366, 448, 51, 115, 304, 443, 463, 464, 465, 466, 405, 397, 408, 99, 405, 394, 394, 394, 394, 61, 248, 429, 430, 64, 67, 122, 140, 158, 164, 167, 175, 289, 312, 331, 356, 404, 443, 462, 463, 465, 466, 394, 43, 88, 175, 404, 429, 443, 463, 465, 466, 218, 248, 405, 75, 122, 394, 430, 129, 394, 51, 103, 151, 153, 164, 165, 217, 250, 253, 267, 273, 305, 404, 406, 407, 450, 301, 172, 466, 405, 394, 56, 61, 207, 405, 437, 18, 169, 304, 337, 394, 443, 463, 465, 466, 394, 394, 430, 394, 405, 408, 404, 430, 102, 227, 445, 430, 322, 407, 67, 88, 160, 175, 255, 404, 429, 443, 462, 465, 466, 273, 405, 462, 465, 466, 430, 430, 407, 67, 88, 255, 404, 443, 462, 465, 466, 273, 405, 462, 465, 466, 437, 405, 407, 335, 336, 363, 364, 404, 64, 108, 169, 289, 429, 430, 335, 336, 363, 364, 404, 430, 158, 265, 394, 158, 265, 404, 79, 399, 399, 399, 404, 248, 404, 411, 412, 404, 412, 404, 412, 0, 393, 22, 374, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 391, 392, 397, 408, 22, 374, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 391, 399, 47, 52, 118, 141, 162, 283, 304, 392, 432, 443, 49, 55, 76, 105, 106, 110, 115, 141, 166, 167, 169, 173, 229, 274, 293, 304, 353, 392, 443, 463, 465, 466, 52, 162, 209, 295, 296, 304, 423, 443, 394, 394, 394, 362, 443, 404, 405, 406, 409, 404, 407, 404, 406, 412, 404, 412, 406, 406, 404, 412, 406, 404, 404, 404, 404, 443, 392, 405, 392, 301, 407, 443, 204, 332, 338, 360, 394, 405, 407, 405, 394, 394, 394, 394, 394, 394, 394, 394, 394, 75, 204, 222, 464, 465, 474, 407, 404, 313, 322, 451, 404, 404, 404, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 391, 396, 408, 301, 273, 278, 405, 407, 407, 405, 273, 397, 405, 104, 122, 215, 218, 430, 464, 465, 474, 451, 396, 406, 405, 404, 405, 407, 464, 465, 443, 407, 406, 404, 405, 430, 404, 412, 430, 430, 264, 115, 443, 463, 464, 465, 466, 273, 407, 443, 404, 407, 451, 407, 407, 404, 404, 396, 430, 164, 167, 273, 304, 407, 451, 396, 443, 301, 407, 407, 404, 407, 301, 405, 430, 115, 404, 407, 117, 127, 163, 234, 439, 440, 407, 404, 372, 407, 99, 405, 57, 152, 407, 405, 405, 445, 405, 445, 405, 445, 404, 405, 410, 404, 33, 58, 144, 146, 165, 231, 232, 253, 309, 311, 441, 404, 430, 430, 430, 412, 329, 354, 454, 407, 404, 273, 405, 407, 451, 407, 396, 404, 377, 273, 405, 407, 396, 404, 304, 404, 404, 404, 404, 396, 407, 407, 407, 407, 404, 404, 404, 404, 396, 114, 124, 443, 177, 178, 206, 245, 442, 430, 443, 442, 443, 404, 404, 404, 395, 395, 18, 19, 248, 369, 370, 371, 403, 411, 429, 430, 404, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 167, 406, 399, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 404, 412, 304, 140, 124, 236, 304, 337, 443, 443, 443, 443, 52, 68, 117, 138, 179, 180, 181, 226, 230, 276, 284, 285, 337, 438, 147, 269, 270, 314, 315, 317, 318, 325, 326, 327, 328, 423, 41, 67, 124, 209, 236, 237, 255, 304, 443, 462, 465, 304, 443, 405, 407, 443, 167, 228, 254, 273, 304, 443, 463, 464, 465, 466, 467, 258, 304, 321, 407, 464, 465, 443, 405, 407, 304, 463, 464, 465, 466, 443, 445, 404, 407, 66, 67, 115, 273, 274, 407, 463, 464, 465, 466, 437, 404, 147, 167, 452, 427, 443, 463, 465, 466, 67, 160, 164, 215, 228, 405, 426, 462, 465, 466, 467, 470, 475, 404, 39, 41, 67, 124, 125, 164, 209, 228, 236, 237, 272, 274, 286, 287, 288, 304, 407, 425, 443, 462, 465, 466, 467, 473, 475, 36, 62, 89, 151, 176, 184, 186, 188, 189, 210, 211, 217, 228, 273, 279, 304, 407, 424, 443, 447, 465, 466, 467, 472, 475, 367, 430, 430, 412, 406, 396, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396, 396, 404, 405, 430, 396, 404, 407, 404, 406, 404, 406, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 430, 404, 404, 404, 398, 407, 182, 222, 436, 404, 40, 443, 405, 273, 396, 404, 395, 220, 398, 396, 396, 395, 396, 321, 443, 464, 465, 404, 405, 404, 396, 404, 404, 404, 407, 404, 429, 301, 301, 396, 395, 430, 396, 443, 388, 396, 388, 372, 396, 404, 404, 395, 405, 405, 405, 396, 396, 395, 396, 396, 395, 44, 97, 453, 396, 404, 404, 430, 404, 404, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 433, 404, 404, 405, 405, 396, 408, 392, 375, 375, 404, 375, 375, 46, 279, 404, 448, 404, 407, 404, 408, 405, 273, 448, 404, 407, 405, 407, 407, 407, 396, 404, 62, 206, 216, 468, 72, 443, 463, 466, 404, 62, 63, 165, 253, 302, 476, 407, 407, 75, 222, 474, 407, 405, 396, 443, 407, 462, 407, 464, 465, 404, 407, 396, 273, 66, 165, 253, 446, 219, 224, 476, 46, 279, 404, 396, 407, 405, 273, 404, 448, 405, 145, 279, 310, 46, 279, 404, 59, 213, 407, 405, 34, 202, 206, 449, 407, 407, 304, 404, 304, 404, 46, 279, 396, 443, 407, 443, 134, 273, 404, 407, 443, 463, 465, 466, 372, 372, 134, 273, 297, 404, 407, 443, 463, 465, 466, 404, 404, 256, 404, 304, 407, 46, 279, 396, 443, 396, 396, 395, 407, 406, 404, 412, 404, 412, 404, 412, 406, 404, 404, 404, 404, 407, 396, 396, 396, 396, 396, 396, 396, 396, 396, 398, 405, 443, 407, 407, 396, 412, 412, 412, 474, 430, 396, 396, 394, 405, 404, 407, 412, 407, 407, 404, 404, 407, 248, 412, 404, 129, 396, 396, 124, 430, 404, 406, 404, 412, 404, 412, 448, 396, 396, 404, 396, 407, 167, 443, 404, 404, 404, 396, 404, 404, 396, 297, 297, 46, 279, 46, 279, 405, 443, 404, 396, 443, 404, 407, 396, 443, 62, 204, 297, 434, 404, 407, 77, 244, 407, 456, 396, 395, 395, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 407, 404, 404, 406, 404, 404, 404, 404, 404, 396, 395, 404, 396, 395, 396, 395, 404, 404, 407, 396, 396, 395, 396, 396, 395, 396, 395, 396, 405, 404, 404, 405, 396, 398, 404, 404, 404, 404, 404, 404, 404, 404, 395, 395, 396, 407, 404, 412, 404, 412, 404, 404, 404, 404, 396, 396, 396, 396, 396, 396, 396, 407, 396, 443, 45, 170, 280, 460, 396, 396, 405, 407, 407, 404, 443, 404, 35, 396, 396, 407, 60, 135, 136, 204, 221, 303, 320, 459, 395, 396, 395, 395, 395, 395, 396, 396, 396, 396, 407, 404, 404, 404, 404, 404, 404, 404, 396, 396, 404, 407, 395, 395, 396, 395, 396, 405, 404, 404, 396, 396, 407, 404, 412, 404, 404, 404, 395, 396, 396, 396, 443, 443, 396, 404, 404, 443, 17, 128, 223, 457, 396, 395, 395, 396, 396, 396, 404, 404, 404, 395, 395, 407, 296, 395, 396, 407, 404, 412, 404, 404, 396, 396, 395, 404, 74, 183, 225, 458, 396, 395, 395, 396, 395, 396, 404, 404, 396, 396, 395, 404, 404, 412, 443, 396, 405, 404, 395, 395, 395, 396, 404, 396, 443, 404, 396, 396, 443, 404, 395, 396, 443, 395 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto yyerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) #else static void yy_stack_print (yybottom, yytop) yytype_int16 *yybottom; yytype_int16 *yytop; #endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule) #else static void yy_reduce_print (yyvsp, yyrule) YYSTYPE *yyvsp; int yyrule; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = 0; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) #else static void yydestruct (yymsg, yytype, yyvaluep) const char *yymsg; int yytype; YYSTYPE *yyvaluep; #endif { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (void); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void) #else int yyparse () #endif #endif { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: `yyss': related to states. `yyvs': related to semantic values. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yytoken = 0; yyss = yyssa; yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 3: /* Line 1806 of yacc.c */ #line 624 "pars.yacc" { expr_parsed = TRUE; s_result = (yyvsp[(1) - (1)].dval); } break; case 4: /* Line 1806 of yacc.c */ #line 628 "pars.yacc" { vexpr_parsed = TRUE; v_result = (yyvsp[(1) - (1)].vrbl); } break; case 8: /* Line 1806 of yacc.c */ #line 641 "pars.yacc" {} break; case 9: /* Line 1806 of yacc.c */ #line 642 "pars.yacc" {} break; case 10: /* Line 1806 of yacc.c */ #line 643 "pars.yacc" {} break; case 11: /* Line 1806 of yacc.c */ #line 644 "pars.yacc" {} break; case 12: /* Line 1806 of yacc.c */ #line 645 "pars.yacc" {} break; case 13: /* Line 1806 of yacc.c */ #line 646 "pars.yacc" {} break; case 14: /* Line 1806 of yacc.c */ #line 647 "pars.yacc" {} break; case 15: /* Line 1806 of yacc.c */ #line 648 "pars.yacc" {} break; case 16: /* Line 1806 of yacc.c */ #line 649 "pars.yacc" {} break; case 17: /* Line 1806 of yacc.c */ #line 650 "pars.yacc" {} break; case 18: /* Line 1806 of yacc.c */ #line 651 "pars.yacc" { return 1; } break; case 19: /* Line 1806 of yacc.c */ #line 658 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (1)].dval); } break; case 20: /* Line 1806 of yacc.c */ #line 661 "pars.yacc" { (yyval.dval) = *((yyvsp[(1) - (1)].dptr)); } break; case 21: /* Line 1806 of yacc.c */ #line 664 "pars.yacc" { (yyval.dval) = nonl_parms[(yyvsp[(1) - (1)].ival)].value; } break; case 22: /* Line 1806 of yacc.c */ #line 667 "pars.yacc" { (yyval.dval) = nonl_parms[(yyvsp[(1) - (1)].ival)].max; } break; case 23: /* Line 1806 of yacc.c */ #line 670 "pars.yacc" { (yyval.dval) = nonl_parms[(yyvsp[(1) - (1)].ival)].min; } break; case 24: /* Line 1806 of yacc.c */ #line 673 "pars.yacc" { if ((yyvsp[(2) - (2)].ival) >= (yyvsp[(1) - (2)].vrbl)->length) { errmsg("Access beyond array bounds"); return 1; } (yyval.dval) = (yyvsp[(1) - (2)].vrbl)->data[(yyvsp[(2) - (2)].ival)]; } break; case 25: /* Line 1806 of yacc.c */ #line 680 "pars.yacc" { double dummy, dummy2; int idummy, ind, length = (yyvsp[(3) - (4)].vrbl)->length; if ((yyvsp[(3) - (4)].vrbl)->data == NULL) { yyerror("NULL variable, check set type"); return 1; } switch ((yyvsp[(1) - (4)].ival)) { case MINP: (yyval.dval) = vmin((yyvsp[(3) - (4)].vrbl)->data, length); break; case MAXP: (yyval.dval) = vmax((yyvsp[(3) - (4)].vrbl)->data, length); break; case AVG: stasum((yyvsp[(3) - (4)].vrbl)->data, length, &(yyval.dval), &dummy); break; case SD: stasum((yyvsp[(3) - (4)].vrbl)->data, length, &dummy, &(yyval.dval)); break; case SUM: stasum((yyvsp[(3) - (4)].vrbl)->data, length, &(yyval.dval), &dummy); (yyval.dval) *= length; break; case IMIN: minmax((yyvsp[(3) - (4)].vrbl)->data, length, &dummy, &dummy2, &ind, &idummy); (yyval.dval) = (double) ind; break; case IMAX: minmax((yyvsp[(3) - (4)].vrbl)->data, length, &dummy, &dummy2, &idummy, &ind); (yyval.dval) = (double) ind; break; } } break; case 26: /* Line 1806 of yacc.c */ #line 714 "pars.yacc" { if ((yyvsp[(3) - (6)].vrbl)->length != (yyvsp[(5) - (6)].vrbl)->length) { yyerror("X and Y are of different length"); return 1; } else { (yyval.dval) = trapint((yyvsp[(3) - (6)].vrbl)->data, (yyvsp[(5) - (6)].vrbl)->data, NULL, NULL, (yyvsp[(3) - (6)].vrbl)->length); } } break; case 27: /* Line 1806 of yacc.c */ #line 722 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].vrbl)->length; } break; case 28: /* Line 1806 of yacc.c */ #line 725 "pars.yacc" { (yyval.dval) = getsetlength((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno); } break; case 29: /* Line 1806 of yacc.c */ #line 728 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].trgt)->setno; } break; case 30: /* Line 1806 of yacc.c */ #line 731 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].ival); } break; case 31: /* Line 1806 of yacc.c */ #line 735 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (1)].ival)].data)) (); } break; case 32: /* Line 1806 of yacc.c */ #line 739 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (2)].dval) * ((ParserFnc) (key[(yyvsp[(2) - (2)].ival)].data)) (); } break; case 33: /* Line 1806 of yacc.c */ #line 743 "pars.yacc" { (yyval.dval) = drand48(); } break; case 34: /* Line 1806 of yacc.c */ #line 747 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (4)].ival)].data)) ((yyvsp[(3) - (4)].ival)); } break; case 35: /* Line 1806 of yacc.c */ #line 751 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (4)].ival)].data)) ((yyvsp[(3) - (4)].dval)); } break; case 36: /* Line 1806 of yacc.c */ #line 755 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].ival), (yyvsp[(5) - (6)].dval)); } break; case 37: /* Line 1806 of yacc.c */ #line 759 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].ival), (yyvsp[(5) - (6)].ival)); } break; case 38: /* Line 1806 of yacc.c */ #line 763 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].dval), (yyvsp[(5) - (6)].dval)); } break; case 39: /* Line 1806 of yacc.c */ #line 767 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (8)].ival)].data)) ((yyvsp[(3) - (8)].ival), (yyvsp[(5) - (8)].ival), (yyvsp[(7) - (8)].dval)); } break; case 40: /* Line 1806 of yacc.c */ #line 771 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (8)].ival)].data)) ((yyvsp[(3) - (8)].dval), (yyvsp[(5) - (8)].dval), (yyvsp[(7) - (8)].dval)); } break; case 41: /* Line 1806 of yacc.c */ #line 775 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (10)].ival)].data)) ((yyvsp[(3) - (10)].dval), (yyvsp[(5) - (10)].dval), (yyvsp[(7) - (10)].dval), (yyvsp[(9) - (10)].dval)); } break; case 42: /* Line 1806 of yacc.c */ #line 779 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (12)].ival)].data)) ((yyvsp[(3) - (12)].dval), (yyvsp[(5) - (12)].dval), (yyvsp[(7) - (12)].dval), (yyvsp[(9) - (12)].dval), (yyvsp[(11) - (12)].dval)); } break; case 43: /* Line 1806 of yacc.c */ #line 783 "pars.yacc" { (yyval.dval) = ((ParserFnc) (key[(yyvsp[(1) - (14)].ival)].data)) ((yyvsp[(3) - (14)].dval), (yyvsp[(5) - (14)].dval), (yyvsp[(7) - (14)].dval), (yyvsp[(9) - (14)].dval), (yyvsp[(11) - (14)].dval), (yyvsp[(13) - (14)].dval)); } break; case 44: /* Line 1806 of yacc.c */ #line 786 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].v.xv1; } break; case 45: /* Line 1806 of yacc.c */ #line 789 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].v.xv2; } break; case 46: /* Line 1806 of yacc.c */ #line 792 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].v.yv1; } break; case 47: /* Line 1806 of yacc.c */ #line 795 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].v.yv2; } break; case 48: /* Line 1806 of yacc.c */ #line 798 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].w.xg1; } break; case 49: /* Line 1806 of yacc.c */ #line 801 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].w.xg2; } break; case 50: /* Line 1806 of yacc.c */ #line 804 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].w.yg1; } break; case 51: /* Line 1806 of yacc.c */ #line 807 "pars.yacc" { (yyval.dval) = g[(yyvsp[(1) - (3)].ival)].w.yg2; } break; case 52: /* Line 1806 of yacc.c */ #line 810 "pars.yacc" { (yyval.dval) = (yyvsp[(3) - (4)].dval); } break; case 53: /* Line 1806 of yacc.c */ #line 813 "pars.yacc" { /* yr, mo, day */ (yyval.dval) = cal_and_time_to_jul((yyvsp[(3) - (8)].ival), (yyvsp[(5) - (8)].ival), (yyvsp[(7) - (8)].ival), 12, 0, 0.0); } break; case 54: /* Line 1806 of yacc.c */ #line 817 "pars.yacc" { /* yr, mo, day, hr, min, sec */ (yyval.dval) = cal_and_time_to_jul((yyvsp[(3) - (14)].ival), (yyvsp[(5) - (14)].ival), (yyvsp[(7) - (14)].ival), (yyvsp[(9) - (14)].ival), (yyvsp[(11) - (14)].ival), (yyvsp[(13) - (14)].dval)); } break; case 55: /* Line 1806 of yacc.c */ #line 820 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].v.xv1; } break; case 56: /* Line 1806 of yacc.c */ #line 827 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].v.xv2; } break; case 57: /* Line 1806 of yacc.c */ #line 834 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].v.yv1; } break; case 58: /* Line 1806 of yacc.c */ #line 841 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].v.yv2; } break; case 59: /* Line 1806 of yacc.c */ #line 848 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].w.xg1; } break; case 60: /* Line 1806 of yacc.c */ #line 855 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].w.xg2; } break; case 61: /* Line 1806 of yacc.c */ #line 862 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].w.yg1; } break; case 62: /* Line 1806 of yacc.c */ #line 869 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } (yyval.dval) = g[whichgraph].w.yg2; } break; case 63: /* Line 1806 of yacc.c */ #line 876 "pars.yacc" { double vx, vy; get_page_viewport(&vx, &vy); (yyval.dval) = vx; } break; case 64: /* Line 1806 of yacc.c */ #line 881 "pars.yacc" { double vx, vy; get_page_viewport(&vx, &vy); (yyval.dval) = vy; } break; case 65: /* Line 1806 of yacc.c */ #line 886 "pars.yacc" { (yyval.dval) = (yyvsp[(2) - (3)].dval); } break; case 66: /* Line 1806 of yacc.c */ #line 889 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].dval) + (yyvsp[(3) - (3)].dval); } break; case 67: /* Line 1806 of yacc.c */ #line 892 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].dval) - (yyvsp[(3) - (3)].dval); } break; case 68: /* Line 1806 of yacc.c */ #line 895 "pars.yacc" { (yyval.dval) = -(yyvsp[(2) - (2)].dval); } break; case 69: /* Line 1806 of yacc.c */ #line 898 "pars.yacc" { (yyval.dval) = (yyvsp[(2) - (2)].dval); } break; case 70: /* Line 1806 of yacc.c */ #line 901 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].dval) * (yyvsp[(3) - (3)].dval); } break; case 71: /* Line 1806 of yacc.c */ #line 905 "pars.yacc" { if ((yyvsp[(3) - (3)].dval) != 0.0) { (yyval.dval) = (yyvsp[(1) - (3)].dval) / (yyvsp[(3) - (3)].dval); } else { yyerror("Divide by zero"); return 1; } } break; case 72: /* Line 1806 of yacc.c */ #line 913 "pars.yacc" { if ((yyvsp[(3) - (3)].dval) != 0.0) { (yyval.dval) = fmod((yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].dval)); } else { yyerror("Divide by zero"); return 1; } } break; case 73: /* Line 1806 of yacc.c */ #line 921 "pars.yacc" { if ((yyvsp[(1) - (3)].dval) < 0 && rint((yyvsp[(3) - (3)].dval)) != (yyvsp[(3) - (3)].dval)) { yyerror("Negative value raised to non-integer power"); return 1; } else if ((yyvsp[(1) - (3)].dval) == 0.0 && (yyvsp[(3) - (3)].dval) <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { (yyval.dval) = pow((yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].dval)); } } break; case 74: /* Line 1806 of yacc.c */ #line 932 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (5)].dval) ? (yyvsp[(3) - (5)].dval) : (yyvsp[(5) - (5)].dval); } break; case 75: /* Line 1806 of yacc.c */ #line 935 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) > (yyvsp[(3) - (3)].dval)); } break; case 76: /* Line 1806 of yacc.c */ #line 938 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) < (yyvsp[(3) - (3)].dval)); } break; case 77: /* Line 1806 of yacc.c */ #line 941 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) <= (yyvsp[(3) - (3)].dval)); } break; case 78: /* Line 1806 of yacc.c */ #line 944 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) >= (yyvsp[(3) - (3)].dval)); } break; case 79: /* Line 1806 of yacc.c */ #line 947 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) == (yyvsp[(3) - (3)].dval)); } break; case 80: /* Line 1806 of yacc.c */ #line 950 "pars.yacc" { (yyval.dval) = ((yyvsp[(1) - (3)].dval) != (yyvsp[(3) - (3)].dval)); } break; case 81: /* Line 1806 of yacc.c */ #line 953 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].dval) && (yyvsp[(3) - (3)].dval); } break; case 82: /* Line 1806 of yacc.c */ #line 956 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (3)].dval) || (yyvsp[(3) - (3)].dval); } break; case 83: /* Line 1806 of yacc.c */ #line 959 "pars.yacc" { (yyval.dval) = !((yyvsp[(2) - (2)].dval)); } break; case 84: /* Line 1806 of yacc.c */ #line 964 "pars.yacc" { (yyval.sval) = (yyvsp[(1) - (1)].sval); } break; case 85: /* Line 1806 of yacc.c */ #line 967 "pars.yacc" { (yyval.sval) = concat_strings((yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 86: /* Line 1806 of yacc.c */ #line 971 "pars.yacc" { char buf[32]; set_locale_num(TRUE); sprintf(buf, "%g", (yyvsp[(3) - (3)].dval)); set_locale_num(FALSE); (yyval.sval) = concat_strings((yyvsp[(1) - (3)].sval), buf); } break; case 87: /* Line 1806 of yacc.c */ #line 980 "pars.yacc" { int itmp = rint((yyvsp[(1) - (1)].dval)); if (fabs(itmp - (yyvsp[(1) - (1)].dval)) > 1.e-6) { yyerror("Non-integer value supplied for integer"); return 1; } (yyval.ival) = itmp; } break; case 88: /* Line 1806 of yacc.c */ #line 990 "pars.yacc" { if ((yyvsp[(1) - (1)].ival) < 0) { yyerror("Negative value supplied for non-negative"); return 1; } (yyval.ival) = (yyvsp[(1) - (1)].ival); } break; case 89: /* Line 1806 of yacc.c */ #line 999 "pars.yacc" { int itmp = (yyvsp[(2) - (3)].ival) - index_shift; if (itmp < 0) { yyerror("Negative index"); return 1; } (yyval.ival) = itmp; } break; case 90: /* Line 1806 of yacc.c */ #line 1009 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (1)].dval); } break; case 91: /* Line 1806 of yacc.c */ #line 1012 "pars.yacc" { double jul; Dates_format dummy; if (parse_date((yyvsp[(1) - (1)].sval), get_date_hint(), FALSE, &jul, &dummy) == RETURN_SUCCESS) { xfree((yyvsp[(1) - (1)].sval)); (yyval.dval) = jul; } else { xfree((yyvsp[(1) - (1)].sval)); yyerror("Invalid date"); return 1; } } break; case 92: /* Line 1806 of yacc.c */ #line 1027 "pars.yacc" { (yyval.dval) = (yyvsp[(1) - (1)].dval); } break; case 93: /* Line 1806 of yacc.c */ #line 1030 "pars.yacc" { double jul; Dates_format dummy; if (parse_date((yyvsp[(1) - (1)].sval), get_date_hint(), TRUE, &jul, &dummy) == RETURN_SUCCESS) { xfree((yyvsp[(1) - (1)].sval)); (yyval.dval) = jul; } else { xfree((yyvsp[(1) - (1)].sval)); yyerror("Invalid date"); return 1; } } break; case 94: /* Line 1806 of yacc.c */ #line 1047 "pars.yacc" { (yyval.vrbl) = (yyvsp[(1) - (1)].vrbl); } break; case 95: /* Line 1806 of yacc.c */ #line 1051 "pars.yacc" { double *ptr = getcol(vasgn_gno, vasgn_setno, (yyvsp[(1) - (1)].ival)); (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->type = GRARR_SET; (yyval.vrbl)->data = ptr; if (ptr == NULL) { errmsg("NULL variable - check set type"); return 1; } else { (yyval.vrbl)->length = getsetlength(vasgn_gno, vasgn_setno); } } break; case 96: /* Line 1806 of yacc.c */ #line 1064 "pars.yacc" { double *ptr = getcol((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival)); (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->type = GRARR_SET; (yyval.vrbl)->data = ptr; if (ptr == NULL) { errmsg("NULL variable - check set type"); return 1; } else { (yyval.vrbl)->length = getsetlength((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno); } } break; case 97: /* Line 1806 of yacc.c */ #line 1080 "pars.yacc" { (yyval.vrbl) = (yyvsp[(1) - (1)].vrbl); } break; case 98: /* Line 1806 of yacc.c */ #line 1084 "pars.yacc" { int start = (yyvsp[(3) - (6)].ival) - index_shift, stop = (yyvsp[(5) - (6)].ival) - index_shift; if (start < 0 || stop < start || stop >= (yyvsp[(1) - (6)].vrbl)->length) { yyerror("Invalid index range"); } else { int len = stop - start + 1; double *ptr = xmalloc(len*SIZEOF_DOUBLE); if ((yyval.vrbl)->data == NULL) { yyerror("Not enough memory"); } else { int i; (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->data = ptr; (yyval.vrbl)->length = len; (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < len; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (6)].vrbl)->data[i + (yyvsp[(3) - (6)].ival)]; } } } } break; case 99: /* Line 1806 of yacc.c */ #line 1106 "pars.yacc" { int len = (yyvsp[(3) - (4)].ival); if (len < 1) { yyerror("npoints must be > 0"); } else { double *ptr = allocate_index_data(len); if (ptr == NULL) { errmsg("Malloc failed"); return 1; } else { (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->type = GRARR_TMP; (yyval.vrbl)->data = ptr; (yyval.vrbl)->length = len; } } } break; case 100: /* Line 1806 of yacc.c */ #line 1124 "pars.yacc" { int len = (yyvsp[(7) - (8)].ival); if (len < 2) { yyerror("npoints must be > 1"); } else { double *ptr = allocate_mesh((yyvsp[(3) - (8)].dval), (yyvsp[(5) - (8)].dval), len); if (ptr == NULL) { errmsg("Malloc failed"); return 1; } else { (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->type = GRARR_TMP; (yyval.vrbl)->data = ptr; (yyval.vrbl)->length = len; } } } break; case 101: /* Line 1806 of yacc.c */ #line 1142 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->data = xmalloc((yyvsp[(3) - (4)].ival)*SIZEOF_DOUBLE); if ((yyval.vrbl)->data == NULL) { errmsg("Not enough memory"); return 1; } else { (yyval.vrbl)->length = (yyvsp[(3) - (4)].ival); (yyval.vrbl)->type = GRARR_TMP; } for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = drand48(); } } break; case 102: /* Line 1806 of yacc.c */ #line 1158 "pars.yacc" { int rtype, i, len; char *rarray; rtype = RESTRICT_REG0 + (yyvsp[(1) - (4)].ival); if (get_restriction_array((yyvsp[(3) - (4)].trgt)->gno, (yyvsp[(3) - (4)].trgt)->setno, rtype, FALSE, &rarray) != RETURN_SUCCESS) { errmsg("Error in region evaluation"); return 1; } len = getsetlength((yyvsp[(3) - (4)].trgt)->gno, (yyvsp[(3) - (4)].trgt)->setno); (yyval.vrbl) = &freelist[fcnt++]; (yyval.vrbl)->data = xmalloc(len*SIZEOF_DOUBLE); if ((yyval.vrbl)->data == NULL) { errmsg("Not enough memory"); return 1; } else { (yyval.vrbl)->length = len; (yyval.vrbl)->type = GRARR_TMP; } for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = rarray[i]; } xfree(rarray); } break; case 103: /* Line 1806 of yacc.c */ #line 1187 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (4)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 1; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] += (yyval.vrbl)->data[i - 1]; } } break; case 104: /* Line 1806 of yacc.c */ #line 1197 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (4)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (4)].ival)].data)) ((int) ((yyvsp[(3) - (4)].vrbl)->data[i])); } } break; case 105: /* Line 1806 of yacc.c */ #line 1207 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (4)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (4)].ival)].data)) (((yyvsp[(3) - (4)].vrbl)->data[i])); } } break; case 106: /* Line 1806 of yacc.c */ #line 1217 "pars.yacc" { int i; if ((yyvsp[(3) - (6)].vrbl)->length != (yyvsp[(5) - (6)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (6)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].vrbl)->data[i], (yyvsp[(5) - (6)].vrbl)->data[i]); } } break; case 107: /* Line 1806 of yacc.c */ #line 1232 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(5) - (6)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].dval), (yyvsp[(5) - (6)].vrbl)->data[i]); } } break; case 108: /* Line 1806 of yacc.c */ #line 1243 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (6)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].vrbl)->data[i], (yyvsp[(5) - (6)].dval)); } } break; case 109: /* Line 1806 of yacc.c */ #line 1254 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(5) - (6)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (6)].ival)].data)) ((yyvsp[(3) - (6)].ival), (yyvsp[(5) - (6)].vrbl)->data[i]); } } break; case 110: /* Line 1806 of yacc.c */ #line 1265 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(7) - (8)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (8)].ival)].data)) ((yyvsp[(3) - (8)].ival), (yyvsp[(5) - (8)].ival), (yyvsp[(7) - (8)].vrbl)->data[i]); } } break; case 111: /* Line 1806 of yacc.c */ #line 1276 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(7) - (8)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (8)].ival)].data)) ((yyvsp[(3) - (8)].dval), (yyvsp[(5) - (8)].dval), (yyvsp[(7) - (8)].vrbl)->data[i]); } } break; case 112: /* Line 1806 of yacc.c */ #line 1287 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(9) - (10)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (10)].ival)].data)) ((yyvsp[(3) - (10)].dval), (yyvsp[(5) - (10)].dval), (yyvsp[(7) - (10)].dval), (yyvsp[(9) - (10)].vrbl)->data[i]); } } break; case 113: /* Line 1806 of yacc.c */ #line 1298 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(11) - (12)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (12)].ival)].data)) ((yyvsp[(3) - (12)].dval), (yyvsp[(5) - (12)].dval), (yyvsp[(7) - (12)].dval), (yyvsp[(9) - (12)].dval), (yyvsp[(11) - (12)].vrbl)->data[i]); } } break; case 114: /* Line 1806 of yacc.c */ #line 1309 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(13) - (14)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((ParserFnc) (key[(yyvsp[(1) - (14)].ival)].data)) ((yyvsp[(3) - (14)].dval), (yyvsp[(5) - (14)].dval), (yyvsp[(7) - (14)].dval), (yyvsp[(9) - (14)].dval), (yyvsp[(11) - (14)].dval), (yyvsp[(13) - (14)].vrbl)->data[i]); } } break; case 115: /* Line 1806 of yacc.c */ #line 1320 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] + (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 116: /* Line 1806 of yacc.c */ #line 1335 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] + (yyvsp[(3) - (3)].dval); } } break; case 117: /* Line 1806 of yacc.c */ #line 1346 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) + (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 118: /* Line 1806 of yacc.c */ #line 1357 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] - (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 119: /* Line 1806 of yacc.c */ #line 1372 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] - (yyvsp[(3) - (3)].dval); } } break; case 120: /* Line 1806 of yacc.c */ #line 1383 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) - (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 121: /* Line 1806 of yacc.c */ #line 1394 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] * (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 122: /* Line 1806 of yacc.c */ #line 1409 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] * (yyvsp[(3) - (3)].dval); } } break; case 123: /* Line 1806 of yacc.c */ #line 1420 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) * (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 124: /* Line 1806 of yacc.c */ #line 1431 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(3) - (3)].vrbl)->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] / (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 125: /* Line 1806 of yacc.c */ #line 1450 "pars.yacc" { int i; if ((yyvsp[(3) - (3)].dval) == 0.0) { errmsg("Divide by zero"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] / (yyvsp[(3) - (3)].dval); } } break; case 126: /* Line 1806 of yacc.c */ #line 1465 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(3) - (3)].vrbl)->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) / (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 127: /* Line 1806 of yacc.c */ #line 1480 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(3) - (3)].vrbl)->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } else { (yyval.vrbl)->data[i] = fmod((yyvsp[(1) - (3)].vrbl)->data[i], (yyvsp[(3) - (3)].vrbl)->data[i]); } } } break; case 128: /* Line 1806 of yacc.c */ #line 1500 "pars.yacc" { int i; if ((yyvsp[(3) - (3)].dval) == 0.0) { errmsg("Divide by zero"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = fmod((yyvsp[(1) - (3)].vrbl)->data[i], (yyvsp[(3) - (3)].dval)); } } break; case 129: /* Line 1806 of yacc.c */ #line 1515 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(3) - (3)].vrbl)->data[i] == 0.0) { errmsg("Divide by zero"); return 1; } else { (yyval.vrbl)->data[i] = fmod((yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].vrbl)->data[i]); } } } break; case 130: /* Line 1806 of yacc.c */ #line 1531 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(1) - (3)].vrbl)->data[i] < 0 && rint((yyvsp[(3) - (3)].vrbl)->data[i]) != (yyvsp[(3) - (3)].vrbl)->data[i]) { yyerror("Negative value raised to non-integer power"); return 1; } else if ((yyvsp[(1) - (3)].vrbl)->data[i] == 0.0 && (yyvsp[(3) - (3)].vrbl)->data[i] <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { (yyval.vrbl)->data[i] = pow((yyvsp[(1) - (3)].vrbl)->data[i], (yyvsp[(3) - (3)].vrbl)->data[i]); } } } break; case 131: /* Line 1806 of yacc.c */ #line 1554 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(1) - (3)].vrbl)->data[i] < 0 && rint((yyvsp[(3) - (3)].dval)) != (yyvsp[(3) - (3)].dval)) { yyerror("Negative value raised to non-integer power"); return 1; } else if ((yyvsp[(1) - (3)].vrbl)->data[i] == 0.0 && (yyvsp[(3) - (3)].dval) <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { (yyval.vrbl)->data[i] = pow((yyvsp[(1) - (3)].vrbl)->data[i], (yyvsp[(3) - (3)].dval)); } } } break; case 132: /* Line 1806 of yacc.c */ #line 1573 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { if ((yyvsp[(1) - (3)].dval) < 0 && rint((yyvsp[(3) - (3)].vrbl)->data[i]) != (yyvsp[(3) - (3)].vrbl)->data[i]) { yyerror("Negative value raised to non-integer power"); return 1; } else if ((yyvsp[(1) - (3)].dval) == 0.0 && (yyvsp[(3) - (3)].vrbl)->data[i] <= 0.0) { yyerror("Zero raised to non-positive power"); return 1; } else { (yyval.vrbl)->data[i] = pow((yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].vrbl)->data[i]); } } } break; case 133: /* Line 1806 of yacc.c */ #line 1592 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (2)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (2)].vrbl)->data[i] * ((ParserFnc) (key[(yyvsp[(2) - (2)].ival)].data)) (); } } break; case 134: /* Line 1806 of yacc.c */ #line 1601 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (5)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = CAST_DBL_TO_BOOL((yyvsp[(1) - (5)].vrbl)->data[i]) ? (yyvsp[(3) - (5)].dval) : (yyvsp[(5) - (5)].dval); } } break; case 135: /* Line 1806 of yacc.c */ #line 1610 "pars.yacc" { int i; if ((yyvsp[(1) - (5)].vrbl)->length != (yyvsp[(5) - (5)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (5)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = CAST_DBL_TO_BOOL((yyvsp[(1) - (5)].vrbl)->data[i]) ? (yyvsp[(3) - (5)].dval) : (yyvsp[(5) - (5)].vrbl)->data[i]; } } break; case 136: /* Line 1806 of yacc.c */ #line 1623 "pars.yacc" { int i; if ((yyvsp[(1) - (5)].vrbl)->length != (yyvsp[(3) - (5)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (5)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = CAST_DBL_TO_BOOL((yyvsp[(1) - (5)].vrbl)->data[i]) ? (yyvsp[(3) - (5)].vrbl)->data[i] : (yyvsp[(5) - (5)].dval); } } break; case 137: /* Line 1806 of yacc.c */ #line 1636 "pars.yacc" { int i; if ((yyvsp[(1) - (5)].vrbl)->length != (yyvsp[(5) - (5)].vrbl)->length || (yyvsp[(1) - (5)].vrbl)->length != (yyvsp[(3) - (5)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (5)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = CAST_DBL_TO_BOOL((yyvsp[(1) - (5)].vrbl)->data[i]) ? (yyvsp[(3) - (5)].vrbl)->data[i] : (yyvsp[(5) - (5)].vrbl)->data[i]; } } break; case 138: /* Line 1806 of yacc.c */ #line 1650 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] || (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 139: /* Line 1806 of yacc.c */ #line 1665 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] || (yyvsp[(3) - (3)].dval); } } break; case 140: /* Line 1806 of yacc.c */ #line 1676 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) || (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 141: /* Line 1806 of yacc.c */ #line 1687 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] && (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 142: /* Line 1806 of yacc.c */ #line 1702 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].vrbl)->data[i] && (yyvsp[(3) - (3)].dval); } } break; case 143: /* Line 1806 of yacc.c */ #line 1713 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(1) - (3)].dval) && (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 144: /* Line 1806 of yacc.c */ #line 1724 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] > (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 145: /* Line 1806 of yacc.c */ #line 1739 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] > (yyvsp[(3) - (3)].dval)); } } break; case 146: /* Line 1806 of yacc.c */ #line 1750 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) > (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 147: /* Line 1806 of yacc.c */ #line 1761 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] < (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 148: /* Line 1806 of yacc.c */ #line 1776 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] < (yyvsp[(3) - (3)].dval)); } } break; case 149: /* Line 1806 of yacc.c */ #line 1787 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) < (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 150: /* Line 1806 of yacc.c */ #line 1798 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] >= (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 151: /* Line 1806 of yacc.c */ #line 1813 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] >= (yyvsp[(3) - (3)].dval)); } } break; case 152: /* Line 1806 of yacc.c */ #line 1824 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) >= (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 153: /* Line 1806 of yacc.c */ #line 1835 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] <= (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 154: /* Line 1806 of yacc.c */ #line 1850 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] <= (yyvsp[(3) - (3)].dval)); } } break; case 155: /* Line 1806 of yacc.c */ #line 1861 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) <= (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 156: /* Line 1806 of yacc.c */ #line 1872 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] == (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 157: /* Line 1806 of yacc.c */ #line 1887 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] == (yyvsp[(3) - (3)].dval)); } } break; case 158: /* Line 1806 of yacc.c */ #line 1898 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) == (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 159: /* Line 1806 of yacc.c */ #line 1909 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Can't operate on vectors of different lengths"); return 1; } (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] != (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 160: /* Line 1806 of yacc.c */ #line 1924 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(1) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].vrbl)->data[i] != (yyvsp[(3) - (3)].dval)); } } break; case 161: /* Line 1806 of yacc.c */ #line 1935 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(3) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = ((yyvsp[(1) - (3)].dval) != (yyvsp[(3) - (3)].vrbl)->data[i]); } } break; case 162: /* Line 1806 of yacc.c */ #line 1946 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(2) - (2)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = !(yyvsp[(2) - (2)].vrbl)->data[i]; } } break; case 163: /* Line 1806 of yacc.c */ #line 1956 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(2) - (3)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = (yyvsp[(2) - (3)].vrbl)->data[i]; } } break; case 164: /* Line 1806 of yacc.c */ #line 1965 "pars.yacc" { int i; (yyval.vrbl) = &freelist[fcnt++]; copy_vrbl((yyval.vrbl), (yyvsp[(2) - (2)].vrbl)); (yyval.vrbl)->type = GRARR_TMP; for (i = 0; i < (yyval.vrbl)->length; i++) { (yyval.vrbl)->data[i] = - (yyvsp[(2) - (2)].vrbl)->data[i]; } } break; case 165: /* Line 1806 of yacc.c */ #line 1979 "pars.yacc" { *((yyvsp[(1) - (3)].dptr)) = (yyvsp[(3) - (3)].dval); } break; case 166: /* Line 1806 of yacc.c */ #line 1983 "pars.yacc" { nonl_parms[(yyvsp[(1) - (3)].ival)].value = (yyvsp[(3) - (3)].dval); } break; case 167: /* Line 1806 of yacc.c */ #line 1987 "pars.yacc" { nonl_parms[(yyvsp[(1) - (3)].ival)].max = (yyvsp[(3) - (3)].dval); } break; case 168: /* Line 1806 of yacc.c */ #line 1991 "pars.yacc" { nonl_parms[(yyvsp[(1) - (3)].ival)].min = (yyvsp[(3) - (3)].dval); } break; case 169: /* Line 1806 of yacc.c */ #line 1995 "pars.yacc" { if ((yyvsp[(2) - (4)].ival) >= (yyvsp[(1) - (4)].vrbl)->length) { yyerror("Access beyond array bounds"); return 1; } (yyvsp[(1) - (4)].vrbl)->data[(yyvsp[(2) - (4)].ival)] = (yyvsp[(4) - (4)].dval); } break; case 170: /* Line 1806 of yacc.c */ #line 2006 "pars.yacc" { target tgt; switch ((yyvsp[(1) - (1)].vrbl)->type) { case GRARR_SET: if (find_set_bydata((yyvsp[(1) - (1)].vrbl)->data, &tgt) == RETURN_SUCCESS) { vasgn_gno = tgt.gno; vasgn_setno = tgt.setno; } else { errmsg("Internal error"); return 1; } break; case GRARR_VEC: vasgn_gno = -1; vasgn_setno = -1; break; default: /* It can NOT be a tmp array on the left side! */ errmsg("Internal error"); return 1; } (yyval.vrbl) = (yyvsp[(1) - (1)].vrbl); } break; case 171: /* Line 1806 of yacc.c */ #line 2033 "pars.yacc" { int i; if ((yyvsp[(1) - (3)].vrbl)->length != (yyvsp[(3) - (3)].vrbl)->length) { errmsg("Left and right vectors are of different lengths"); return 1; } for (i = 0; i < (yyvsp[(1) - (3)].vrbl)->length; i++) { (yyvsp[(1) - (3)].vrbl)->data[i] = (yyvsp[(3) - (3)].vrbl)->data[i]; } } break; case 172: /* Line 1806 of yacc.c */ #line 2044 "pars.yacc" { int i; for (i = 0; i < (yyvsp[(1) - (3)].vrbl)->length; i++) { (yyvsp[(1) - (3)].vrbl)->data[i] = (yyvsp[(3) - (3)].dval); } } break; case 173: /* Line 1806 of yacc.c */ #line 2054 "pars.yacc" { symtab_entry tmpkey; double *var; var = xmalloc(SIZEOF_DOUBLE); *var = 0.0; tmpkey.s = (yyvsp[(2) - (2)].sval); tmpkey.type = KEY_VAR; tmpkey.data = (void *) var; if (addto_symtab(tmpkey) != RETURN_SUCCESS) { yyerror("Adding new symbol failed"); } xfree((yyvsp[(2) - (2)].sval)); } break; case 174: /* Line 1806 of yacc.c */ #line 2071 "pars.yacc" { if (define_parser_arr((yyvsp[(2) - (4)].sval)) == NULL) { yyerror("Adding new symbol failed"); } xfree((yyvsp[(2) - (4)].sval)); } break; case 175: /* Line 1806 of yacc.c */ #line 2079 "pars.yacc" { grarr *var; if ((var = define_parser_arr((yyvsp[(2) - (5)].sval))) == NULL) { yyerror("Adding new symbol failed"); } else { realloc_vrbl(var, (yyvsp[(4) - (5)].ival)); } xfree((yyvsp[(2) - (5)].sval)); } break; case 176: /* Line 1806 of yacc.c */ #line 2090 "pars.yacc" { yyerror("Keyword already exists"); } break; case 177: /* Line 1806 of yacc.c */ #line 2094 "pars.yacc" { yyerror("Keyword already exists"); } break; case 178: /* Line 1806 of yacc.c */ #line 2098 "pars.yacc" { undefine_parser_var((void *) (yyvsp[(2) - (2)].dptr)); xfree((yyvsp[(2) - (2)].dptr)); } break; case 179: /* Line 1806 of yacc.c */ #line 2103 "pars.yacc" { realloc_vrbl((yyvsp[(2) - (2)].vrbl), 0); undefine_parser_var((void *) (yyvsp[(2) - (2)].vrbl)); xfree((yyvsp[(2) - (2)].vrbl)); } break; case 180: /* Line 1806 of yacc.c */ #line 2108 "pars.yacc" { int position; lowtoupper((yyvsp[(3) - (3)].sval)); if ((position = findf(key, (yyvsp[(3) - (3)].sval))) >= 0) { symtab_entry tmpkey; tmpkey.s = (yyvsp[(2) - (3)].sval); tmpkey.type = key[position].type; tmpkey.data = key[position].data; if (addto_symtab(tmpkey) != RETURN_SUCCESS) { yyerror("Keyword already exists"); } } else { yyerror("Aliased keyword not found"); } xfree((yyvsp[(2) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 181: /* Line 1806 of yacc.c */ #line 2126 "pars.yacc" { alias_force = (yyvsp[(3) - (3)].ival); } break; case 182: /* Line 1806 of yacc.c */ #line 2129 "pars.yacc" { if (load_module((yyvsp[(6) - (6)].sval), (yyvsp[(2) - (6)].sval), (yyvsp[(2) - (6)].sval), (yyvsp[(4) - (6)].ival)) != 0) { yyerror("DL module load failed"); } xfree((yyvsp[(2) - (6)].sval)); xfree((yyvsp[(6) - (6)].sval)); } break; case 183: /* Line 1806 of yacc.c */ #line 2136 "pars.yacc" { if (load_module((yyvsp[(6) - (8)].sval), (yyvsp[(2) - (8)].sval), (yyvsp[(8) - (8)].sval), (yyvsp[(4) - (8)].ival)) != 0) { yyerror("DL module load failed"); } xfree((yyvsp[(2) - (8)].sval)); xfree((yyvsp[(6) - (8)].sval)); xfree((yyvsp[(8) - (8)].sval)); } break; case 184: /* Line 1806 of yacc.c */ #line 2147 "pars.yacc" { rg[(yyvsp[(1) - (2)].ival)].active = (yyvsp[(2) - (2)].ival); } break; case 185: /* Line 1806 of yacc.c */ #line 2150 "pars.yacc" { rg[(yyvsp[(1) - (3)].ival)].type = (yyvsp[(3) - (3)].ival); } break; case 186: /* Line 1806 of yacc.c */ #line 2153 "pars.yacc" { rg[(yyvsp[(1) - (2)].ival)].color = (yyvsp[(2) - (2)].ival); } break; case 187: /* Line 1806 of yacc.c */ #line 2156 "pars.yacc" { rg[(yyvsp[(1) - (2)].ival)].lines = (yyvsp[(2) - (2)].ival); } break; case 188: /* Line 1806 of yacc.c */ #line 2159 "pars.yacc" { rg[(yyvsp[(1) - (2)].ival)].linew = (yyvsp[(2) - (2)].dval); } break; case 189: /* Line 1806 of yacc.c */ #line 2163 "pars.yacc" { rg[(yyvsp[(1) - (9)].ival)].x1 = (yyvsp[(3) - (9)].dval); rg[(yyvsp[(1) - (9)].ival)].y1 = (yyvsp[(5) - (9)].dval); rg[(yyvsp[(1) - (9)].ival)].x2 = (yyvsp[(7) - (9)].dval); rg[(yyvsp[(1) - (9)].ival)].y2 = (yyvsp[(9) - (9)].dval); } break; case 190: /* Line 1806 of yacc.c */ #line 2170 "pars.yacc" { rg[(yyvsp[(1) - (5)].ival)].x = xrealloc(rg[(yyvsp[(1) - (5)].ival)].x, (rg[(yyvsp[(1) - (5)].ival)].n + 1) * SIZEOF_DOUBLE); rg[(yyvsp[(1) - (5)].ival)].y = xrealloc(rg[(yyvsp[(1) - (5)].ival)].y, (rg[(yyvsp[(1) - (5)].ival)].n + 1) * SIZEOF_DOUBLE); rg[(yyvsp[(1) - (5)].ival)].x[rg[(yyvsp[(1) - (5)].ival)].n] = (yyvsp[(3) - (5)].dval); rg[(yyvsp[(1) - (5)].ival)].y[rg[(yyvsp[(1) - (5)].ival)].n] = (yyvsp[(5) - (5)].dval); rg[(yyvsp[(1) - (5)].ival)].n++; } break; case 191: /* Line 1806 of yacc.c */ #line 2177 "pars.yacc" { rg[(yyvsp[(2) - (4)].ival)].linkto = (yyvsp[(4) - (4)].ival); } break; case 192: /* Line 1806 of yacc.c */ #line 2184 "pars.yacc" { if (set_project_version((yyvsp[(2) - (2)].ival)) != RETURN_SUCCESS) { errmsg("Project version is newer than software!"); } if (get_project_version() < 50001) { map_fonts(FONT_MAP_ACEGR); } else { map_fonts(FONT_MAP_DEFAULT); } } break; case 193: /* Line 1806 of yacc.c */ #line 2194 "pars.yacc" { set_page_dimensions((yyvsp[(3) - (5)].ival), (yyvsp[(5) - (5)].ival), TRUE); } break; case 194: /* Line 1806 of yacc.c */ #line 2197 "pars.yacc" { set_page_dimensions((yyvsp[(3) - (5)].ival), (yyvsp[(5) - (5)].ival), FALSE); } break; case 195: /* Line 1806 of yacc.c */ #line 2200 "pars.yacc" { int device_id; Device_entry dev; device_id = get_device_by_name((yyvsp[(2) - (7)].sval)); xfree((yyvsp[(2) - (7)].sval)); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.pg.width = (long) ((yyvsp[(5) - (7)].ival)*dev.pg.dpi/72); dev.pg.height = (long) ((yyvsp[(7) - (7)].ival)*dev.pg.dpi/72); set_device_props(device_id, dev); } } break; case 196: /* Line 1806 of yacc.c */ #line 2215 "pars.yacc" { int device_id; Device_entry dev; device_id = get_device_by_name((yyvsp[(2) - (4)].sval)); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.pg.dpi = (yyvsp[(4) - (4)].dval); set_device_props(device_id, dev); } xfree((yyvsp[(2) - (4)].sval)); } break; case 197: /* Line 1806 of yacc.c */ #line 2229 "pars.yacc" { int device_id; Device_entry dev; device_id = get_device_by_name((yyvsp[(2) - (5)].sval)); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.fontaa = (yyvsp[(5) - (5)].ival); set_device_props(device_id, dev); } xfree((yyvsp[(2) - (5)].sval)); } break; case 198: /* Line 1806 of yacc.c */ #line 2243 "pars.yacc" { int device_id; Device_entry dev; device_id = get_device_by_name((yyvsp[(2) - (4)].sval)); if (device_id < 0) { yyerror("Unknown device"); } else { dev = get_device_props(device_id); dev.devfonts = (yyvsp[(4) - (4)].ival); set_device_props(device_id, dev); } xfree((yyvsp[(2) - (4)].sval)); } break; case 199: /* Line 1806 of yacc.c */ #line 2257 "pars.yacc" { int device_id; device_id = get_device_by_name((yyvsp[(2) - (4)].sval)); if (device_id < 0) { yyerror("Unknown device"); } else { if (parse_device_options(device_id, (yyvsp[(4) - (4)].sval)) != RETURN_SUCCESS) { yyerror("Incorrect device option string"); } } xfree((yyvsp[(2) - (4)].sval)); xfree((yyvsp[(4) - (4)].sval)); } break; case 200: /* Line 1806 of yacc.c */ #line 2272 "pars.yacc" { set_printer_by_name((yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 201: /* Line 1806 of yacc.c */ #line 2276 "pars.yacc" { set_ref_date((yyvsp[(3) - (3)].dval)); } break; case 202: /* Line 1806 of yacc.c */ #line 2279 "pars.yacc" { allow_two_digits_years((yyvsp[(3) - (3)].ival)); } break; case 203: /* Line 1806 of yacc.c */ #line 2282 "pars.yacc" { set_wrap_year((yyvsp[(4) - (4)].ival)); } break; case 204: /* Line 1806 of yacc.c */ #line 2285 "pars.yacc" { setbgcolor((yyvsp[(2) - (2)].ival)); } break; case 205: /* Line 1806 of yacc.c */ #line 2288 "pars.yacc" { setbgfill((yyvsp[(4) - (4)].ival)); } break; case 206: /* Line 1806 of yacc.c */ #line 2291 "pars.yacc" { scroll_proc((int) (yyvsp[(3) - (4)].dval)); } break; case 207: /* Line 1806 of yacc.c */ #line 2294 "pars.yacc" { scrollinout_proc((int) (yyvsp[(3) - (4)].dval)); } break; case 208: /* Line 1806 of yacc.c */ #line 2297 "pars.yacc" { scrolling_islinked = (yyvsp[(3) - (3)].ival); } break; case 209: /* Line 1806 of yacc.c */ #line 2302 "pars.yacc" { add_world(whichgraph, (yyvsp[(3) - (9)].dval), (yyvsp[(5) - (9)].dval), (yyvsp[(7) - (9)].dval), (yyvsp[(9) - (9)].dval)); } break; case 210: /* Line 1806 of yacc.c */ #line 2306 "pars.yacc" { timer_delay = (yyvsp[(2) - (2)].ival); } break; case 211: /* Line 1806 of yacc.c */ #line 2310 "pars.yacc" { target_set = *((yyvsp[(2) - (2)].trgt)); set_parser_setno(target_set.gno, target_set.setno); } break; case 212: /* Line 1806 of yacc.c */ #line 2314 "pars.yacc" { set_parser_gno((yyvsp[(2) - (2)].ival)); } break; case 213: /* Line 1806 of yacc.c */ #line 2317 "pars.yacc" { set_parser_setno((yyvsp[(2) - (2)].trgt)->gno, (yyvsp[(2) - (2)].trgt)->setno); } break; case 214: /* Line 1806 of yacc.c */ #line 2322 "pars.yacc" { set_hotlink((yyvsp[(1) - (4)].trgt)->gno, (yyvsp[(1) - (4)].trgt)->setno, 1, (yyvsp[(4) - (4)].sval), (yyvsp[(3) - (4)].ival)); xfree((yyvsp[(4) - (4)].sval)); } break; case 215: /* Line 1806 of yacc.c */ #line 2326 "pars.yacc" { set_hotlink((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival), NULL, 0); } break; case 216: /* Line 1806 of yacc.c */ #line 2331 "pars.yacc" { curbox = next_box(); } break; case 217: /* Line 1806 of yacc.c */ #line 2334 "pars.yacc" { int no = (yyvsp[(3) - (3)].ival); if (is_valid_box(no) || realloc_boxes(no + 1) == RETURN_SUCCESS) { curbox = no; } } break; case 218: /* Line 1806 of yacc.c */ #line 2341 "pars.yacc" { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].active = (yyvsp[(2) - (2)].ival); } } break; case 219: /* Line 1806 of yacc.c */ #line 2348 "pars.yacc" { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].gno = (yyvsp[(2) - (2)].ival); } } break; case 220: /* Line 1806 of yacc.c */ #line 2355 "pars.yacc" { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].x1 = (yyvsp[(2) - (8)].dval); boxes[curbox].y1 = (yyvsp[(4) - (8)].dval); boxes[curbox].x2 = (yyvsp[(6) - (8)].dval); boxes[curbox].y2 = (yyvsp[(8) - (8)].dval); } } break; case 221: /* Line 1806 of yacc.c */ #line 2365 "pars.yacc" { box_loctype = (yyvsp[(3) - (3)].ival); } break; case 222: /* Line 1806 of yacc.c */ #line 2368 "pars.yacc" { box_lines = (yyvsp[(2) - (2)].ival); } break; case 223: /* Line 1806 of yacc.c */ #line 2371 "pars.yacc" { box_linew = (yyvsp[(2) - (2)].dval); } break; case 224: /* Line 1806 of yacc.c */ #line 2374 "pars.yacc" { box_color = (yyvsp[(2) - (2)].ival); } break; case 225: /* Line 1806 of yacc.c */ #line 2377 "pars.yacc" { box_fillcolor = (yyvsp[(3) - (3)].ival); } break; case 226: /* Line 1806 of yacc.c */ #line 2380 "pars.yacc" { box_fillpat = (yyvsp[(3) - (3)].ival); } break; case 227: /* Line 1806 of yacc.c */ #line 2383 "pars.yacc" { if (!is_valid_box(curbox)) { yyerror("Box not active"); } else { boxes[curbox].lines = box_lines; boxes[curbox].linew = box_linew; boxes[curbox].color = box_color; if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = 1; break; case PATTERN: boxes[curbox].fillcolor = 1; boxes[curbox].fillpattern = box_fillpat; break; default: /* NONE */ boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = 0; break; } } else { boxes[curbox].fillcolor = box_fillcolor; boxes[curbox].fillpattern = box_fillpat; } boxes[curbox].loctype = box_loctype; } } break; case 228: /* Line 1806 of yacc.c */ #line 2414 "pars.yacc" { curellipse = next_ellipse(); } break; case 229: /* Line 1806 of yacc.c */ #line 2417 "pars.yacc" { int no = (yyvsp[(3) - (3)].ival); if (is_valid_ellipse(no) || realloc_ellipses(no + 1) == RETURN_SUCCESS) { curellipse = no; } } break; case 230: /* Line 1806 of yacc.c */ #line 2424 "pars.yacc" { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].active = (yyvsp[(2) - (2)].ival); } } break; case 231: /* Line 1806 of yacc.c */ #line 2431 "pars.yacc" { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].gno = (yyvsp[(2) - (2)].ival); } } break; case 232: /* Line 1806 of yacc.c */ #line 2438 "pars.yacc" { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].x1 = (yyvsp[(2) - (8)].dval); ellip[curellipse].y1 = (yyvsp[(4) - (8)].dval); ellip[curellipse].x2 = (yyvsp[(6) - (8)].dval); ellip[curellipse].y2 = (yyvsp[(8) - (8)].dval); } } break; case 233: /* Line 1806 of yacc.c */ #line 2448 "pars.yacc" { ellipse_loctype = (yyvsp[(3) - (3)].ival); } break; case 234: /* Line 1806 of yacc.c */ #line 2451 "pars.yacc" { ellipse_lines = (yyvsp[(2) - (2)].ival); } break; case 235: /* Line 1806 of yacc.c */ #line 2454 "pars.yacc" { ellipse_linew = (yyvsp[(2) - (2)].dval); } break; case 236: /* Line 1806 of yacc.c */ #line 2457 "pars.yacc" { ellipse_color = (yyvsp[(2) - (2)].ival); } break; case 237: /* Line 1806 of yacc.c */ #line 2460 "pars.yacc" { ellipse_fillcolor = (yyvsp[(3) - (3)].ival); } break; case 238: /* Line 1806 of yacc.c */ #line 2463 "pars.yacc" { ellipse_fillpat = (yyvsp[(3) - (3)].ival); } break; case 239: /* Line 1806 of yacc.c */ #line 2466 "pars.yacc" { if (!is_valid_ellipse(curellipse)) { yyerror("Ellipse not active"); } else { ellip[curellipse].lines = ellipse_lines; ellip[curellipse].linew = ellipse_linew; ellip[curellipse].color = ellipse_color; if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = 1; break; case PATTERN: ellip[curellipse].fillcolor = 1; ellip[curellipse].fillpattern = ellipse_fillpat; break; default: /* NONE */ ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = 0; break; } } else { ellip[curellipse].fillcolor = ellipse_fillcolor; ellip[curellipse].fillpattern = ellipse_fillpat; } ellip[curellipse].loctype = ellipse_loctype; } } break; case 240: /* Line 1806 of yacc.c */ #line 2497 "pars.yacc" { curline = next_line(); } break; case 241: /* Line 1806 of yacc.c */ #line 2500 "pars.yacc" { int no = (yyvsp[(3) - (3)].ival); if (is_valid_line(no) || realloc_lines(no + 1) == RETURN_SUCCESS) { curline = no; } } break; case 242: /* Line 1806 of yacc.c */ #line 2507 "pars.yacc" { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].active = (yyvsp[(2) - (2)].ival); } } break; case 243: /* Line 1806 of yacc.c */ #line 2514 "pars.yacc" { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].gno = (yyvsp[(2) - (2)].ival); } } break; case 244: /* Line 1806 of yacc.c */ #line 2521 "pars.yacc" { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].x1 = (yyvsp[(2) - (8)].dval); lines[curline].y1 = (yyvsp[(4) - (8)].dval); lines[curline].x2 = (yyvsp[(6) - (8)].dval); lines[curline].y2 = (yyvsp[(8) - (8)].dval); } } break; case 245: /* Line 1806 of yacc.c */ #line 2531 "pars.yacc" { line_loctype = (yyvsp[(3) - (3)].ival); } break; case 246: /* Line 1806 of yacc.c */ #line 2534 "pars.yacc" { line_linew = (yyvsp[(2) - (2)].dval); } break; case 247: /* Line 1806 of yacc.c */ #line 2537 "pars.yacc" { line_lines = (yyvsp[(2) - (2)].ival); } break; case 248: /* Line 1806 of yacc.c */ #line 2540 "pars.yacc" { line_color = (yyvsp[(2) - (2)].ival); } break; case 249: /* Line 1806 of yacc.c */ #line 2543 "pars.yacc" { line_arrow_end = (yyvsp[(3) - (3)].ival); } break; case 250: /* Line 1806 of yacc.c */ #line 2546 "pars.yacc" { line_asize = (yyvsp[(4) - (4)].dval); } break; case 251: /* Line 1806 of yacc.c */ #line 2549 "pars.yacc" { line_atype = (yyvsp[(4) - (4)].ival); } break; case 252: /* Line 1806 of yacc.c */ #line 2552 "pars.yacc" { line_a_dL_ff = (yyvsp[(4) - (6)].dval); line_a_lL_ff = (yyvsp[(6) - (6)].dval); } break; case 253: /* Line 1806 of yacc.c */ #line 2556 "pars.yacc" { if (!is_valid_line(curline)) { yyerror("Line not active"); } else { lines[curline].lines = line_lines; lines[curline].linew = line_linew; lines[curline].color = line_color; lines[curline].arrow_end = line_arrow_end; lines[curline].arrow.length = line_asize; lines[curline].arrow.type = line_atype; lines[curline].arrow.dL_ff = line_a_dL_ff; lines[curline].arrow.lL_ff = line_a_lL_ff; lines[curline].loctype = line_loctype; } } break; case 254: /* Line 1806 of yacc.c */ #line 2573 "pars.yacc" { curstring = next_string(); } break; case 255: /* Line 1806 of yacc.c */ #line 2576 "pars.yacc" { int no = (yyvsp[(3) - (3)].ival); if (is_valid_string(no) || realloc_strings(no + 1) == RETURN_SUCCESS) { curstring = no; } } break; case 256: /* Line 1806 of yacc.c */ #line 2583 "pars.yacc" { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].active = (yyvsp[(2) - (2)].ival); } } break; case 257: /* Line 1806 of yacc.c */ #line 2590 "pars.yacc" { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].gno = (yyvsp[(2) - (2)].ival); } } break; case 258: /* Line 1806 of yacc.c */ #line 2597 "pars.yacc" { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { pstr[curstring].x = (yyvsp[(2) - (4)].dval); pstr[curstring].y = (yyvsp[(4) - (4)].dval); } } break; case 259: /* Line 1806 of yacc.c */ #line 2605 "pars.yacc" { string_loctype = (yyvsp[(3) - (3)].ival); } break; case 260: /* Line 1806 of yacc.c */ #line 2608 "pars.yacc" { string_color = (yyvsp[(2) - (2)].ival); } break; case 261: /* Line 1806 of yacc.c */ #line 2611 "pars.yacc" { string_rot = (yyvsp[(3) - (3)].ival); } break; case 262: /* Line 1806 of yacc.c */ #line 2614 "pars.yacc" { string_font = (yyvsp[(2) - (2)].ival); } break; case 263: /* Line 1806 of yacc.c */ #line 2617 "pars.yacc" { string_just = (yyvsp[(3) - (3)].ival); } break; case 264: /* Line 1806 of yacc.c */ #line 2620 "pars.yacc" { string_size = (yyvsp[(4) - (4)].dval); } break; case 265: /* Line 1806 of yacc.c */ #line 2623 "pars.yacc" { if (!is_valid_string(curstring)) { yyerror("String not active"); } else { set_plotstr_string(&pstr[curstring], (yyvsp[(3) - (3)].sval)); pstr[curstring].color = string_color; pstr[curstring].font = string_font; pstr[curstring].just = string_just; pstr[curstring].loctype = string_loctype; pstr[curstring].rot = string_rot; pstr[curstring].charsize = string_size; } xfree((yyvsp[(3) - (3)].sval)); } break; case 266: /* Line 1806 of yacc.c */ #line 2639 "pars.yacc" { timestamp.active = (yyvsp[(2) - (2)].ival); } break; case 267: /* Line 1806 of yacc.c */ #line 2642 "pars.yacc" { timestamp.font = (yyvsp[(2) - (2)].ival); } break; case 268: /* Line 1806 of yacc.c */ #line 2645 "pars.yacc" { timestamp.charsize = (yyvsp[(4) - (4)].dval); } break; case 269: /* Line 1806 of yacc.c */ #line 2648 "pars.yacc" { timestamp.rot = (yyvsp[(3) - (3)].ival); } break; case 270: /* Line 1806 of yacc.c */ #line 2651 "pars.yacc" { timestamp.color = (yyvsp[(2) - (2)].ival); } break; case 271: /* Line 1806 of yacc.c */ #line 2654 "pars.yacc" { timestamp.x = (yyvsp[(2) - (4)].dval); timestamp.y = (yyvsp[(4) - (4)].dval); } break; case 272: /* Line 1806 of yacc.c */ #line 2658 "pars.yacc" { set_plotstr_string(×tamp, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 273: /* Line 1806 of yacc.c */ #line 2664 "pars.yacc" { grdefaults.lines = (yyvsp[(2) - (2)].ival); box_lines = ellipse_lines = line_lines = (yyvsp[(2) - (2)].ival); } break; case 274: /* Line 1806 of yacc.c */ #line 2668 "pars.yacc" { grdefaults.linew = (yyvsp[(2) - (2)].dval); box_linew = ellipse_linew = line_linew = (yyvsp[(2) - (2)].dval); } break; case 275: /* Line 1806 of yacc.c */ #line 2672 "pars.yacc" { grdefaults.color = (yyvsp[(2) - (2)].ival); box_color = ellipse_color = line_color = string_color = (yyvsp[(2) - (2)].ival); } break; case 276: /* Line 1806 of yacc.c */ #line 2676 "pars.yacc" { grdefaults.pattern = (yyvsp[(2) - (2)].ival); } break; case 277: /* Line 1806 of yacc.c */ #line 2679 "pars.yacc" { grdefaults.charsize = (yyvsp[(4) - (4)].dval); string_size = (yyvsp[(4) - (4)].dval); } break; case 278: /* Line 1806 of yacc.c */ #line 2683 "pars.yacc" { grdefaults.font = (yyvsp[(2) - (2)].ival); string_font = (yyvsp[(2) - (2)].ival); } break; case 279: /* Line 1806 of yacc.c */ #line 2687 "pars.yacc" { grdefaults.symsize = (yyvsp[(4) - (4)].dval); } break; case 280: /* Line 1806 of yacc.c */ #line 2690 "pars.yacc" { strcpy(sformat, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 281: /* Line 1806 of yacc.c */ #line 2694 "pars.yacc" { if ((map_font_by_name((yyvsp[(5) - (7)].sval), (yyvsp[(3) - (7)].ival)) != RETURN_SUCCESS) && (map_font_by_name((yyvsp[(7) - (7)].sval), (yyvsp[(3) - (7)].ival)) != RETURN_SUCCESS)) { errmsg("Failed mapping a font"); } xfree((yyvsp[(5) - (7)].sval)); xfree((yyvsp[(7) - (7)].sval)); } break; case 282: /* Line 1806 of yacc.c */ #line 2702 "pars.yacc" { CMap_entry cmap; cmap.rgb.red = (yyvsp[(6) - (13)].ival); cmap.rgb.green = (yyvsp[(8) - (13)].ival); cmap.rgb.blue = (yyvsp[(10) - (13)].ival); cmap.ctype = COLOR_MAIN; cmap.cname = (yyvsp[(13) - (13)].sval); if (store_color((yyvsp[(3) - (13)].ival), cmap) == RETURN_FAILURE) { errmsg("Failed mapping a color"); } xfree((yyvsp[(13) - (13)].sval)); } break; case 283: /* Line 1806 of yacc.c */ #line 2715 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg1 = (yyvsp[(2) - (8)].dval); g[whichgraph].w.yg1 = (yyvsp[(4) - (8)].dval); g[whichgraph].w.xg2 = (yyvsp[(6) - (8)].dval); g[whichgraph].w.yg2 = (yyvsp[(8) - (8)].dval); } break; case 284: /* Line 1806 of yacc.c */ #line 2725 "pars.yacc" { set_graph_znorm(whichgraph, (yyvsp[(2) - (2)].dval)); } break; case 285: /* Line 1806 of yacc.c */ #line 2728 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv1 = (yyvsp[(2) - (8)].dval); g[whichgraph].v.yv1 = (yyvsp[(4) - (8)].dval); g[whichgraph].v.xv2 = (yyvsp[(6) - (8)].dval); g[whichgraph].v.yv2 = (yyvsp[(8) - (8)].dval); } break; case 286: /* Line 1806 of yacc.c */ #line 2738 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } set_plotstr_string(&g[whichgraph].labs.title, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 287: /* Line 1806 of yacc.c */ #line 2746 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.font = (yyvsp[(2) - (2)].ival); } break; case 288: /* Line 1806 of yacc.c */ #line 2753 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.charsize = (yyvsp[(3) - (3)].dval); } break; case 289: /* Line 1806 of yacc.c */ #line 2760 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.title.color = (yyvsp[(2) - (2)].ival); } break; case 290: /* Line 1806 of yacc.c */ #line 2767 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } set_plotstr_string(&g[whichgraph].labs.stitle, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 291: /* Line 1806 of yacc.c */ #line 2775 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.font = (yyvsp[(2) - (2)].ival); } break; case 292: /* Line 1806 of yacc.c */ #line 2782 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.charsize = (yyvsp[(3) - (3)].dval); } break; case 293: /* Line 1806 of yacc.c */ #line 2789 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].labs.stitle.color = (yyvsp[(2) - (2)].ival); } break; case 294: /* Line 1806 of yacc.c */ #line 2797 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].xscale = (yyvsp[(3) - (3)].ival); } break; case 295: /* Line 1806 of yacc.c */ #line 2804 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].yscale = (yyvsp[(3) - (3)].ival); } break; case 296: /* Line 1806 of yacc.c */ #line 2811 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].xinvert = (yyvsp[(3) - (3)].ival); } break; case 297: /* Line 1806 of yacc.c */ #line 2818 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].yinvert = (yyvsp[(3) - (3)].ival); } break; case 298: /* Line 1806 of yacc.c */ #line 2825 "pars.yacc" { autoscale_onread = AUTOSCALE_NONE; } break; case 299: /* Line 1806 of yacc.c */ #line 2828 "pars.yacc" { autoscale_onread = AUTOSCALE_X; } break; case 300: /* Line 1806 of yacc.c */ #line 2831 "pars.yacc" { autoscale_onread = AUTOSCALE_Y; } break; case 301: /* Line 1806 of yacc.c */ #line 2834 "pars.yacc" { autoscale_onread = AUTOSCALE_XY; } break; case 302: /* Line 1806 of yacc.c */ #line 2838 "pars.yacc" { char *s; s = copy_string(NULL, get_project_description()); s = concat_strings(s, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); s = concat_strings(s, "\n"); set_project_description(s); xfree(s); } break; case 303: /* Line 1806 of yacc.c */ #line 2847 "pars.yacc" { set_project_description(NULL); } break; case 304: /* Line 1806 of yacc.c */ #line 2851 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.active = (yyvsp[(2) - (2)].ival); } break; case 305: /* Line 1806 of yacc.c */ #line 2858 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.loctype = (yyvsp[(3) - (3)].ival); } break; case 306: /* Line 1806 of yacc.c */ #line 2865 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.vgap = (yyvsp[(3) - (3)].ival); } break; case 307: /* Line 1806 of yacc.c */ #line 2872 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.hgap = (yyvsp[(3) - (3)].ival); } break; case 308: /* Line 1806 of yacc.c */ #line 2879 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.len = (yyvsp[(3) - (3)].ival); } break; case 309: /* Line 1806 of yacc.c */ #line 2886 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.invert = (yyvsp[(3) - (3)].ival); } break; case 310: /* Line 1806 of yacc.c */ #line 2893 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxfillpen.color = (yyvsp[(4) - (4)].ival); } break; case 311: /* Line 1806 of yacc.c */ #line 2900 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxfillpen.pattern = (yyvsp[(4) - (4)].ival); } break; case 312: /* Line 1806 of yacc.c */ #line 2907 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxpen.color = (yyvsp[(3) - (3)].ival); } break; case 313: /* Line 1806 of yacc.c */ #line 2914 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxpen.pattern = (yyvsp[(3) - (3)].ival); } break; case 314: /* Line 1806 of yacc.c */ #line 2921 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxlines = (yyvsp[(3) - (3)].ival); } break; case 315: /* Line 1806 of yacc.c */ #line 2928 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.boxlinew = (yyvsp[(3) - (3)].dval); } break; case 316: /* Line 1806 of yacc.c */ #line 2935 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legx = (yyvsp[(2) - (4)].dval); g[whichgraph].l.legy = (yyvsp[(4) - (4)].dval); } break; case 317: /* Line 1806 of yacc.c */ #line 2943 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.charsize = (yyvsp[(4) - (4)].dval); } break; case 318: /* Line 1806 of yacc.c */ #line 2950 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.font = (yyvsp[(2) - (2)].ival); } break; case 319: /* Line 1806 of yacc.c */ #line 2957 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.color = (yyvsp[(2) - (2)].ival); } break; case 320: /* Line 1806 of yacc.c */ #line 2965 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.pattern = (yyvsp[(2) - (2)].ival); } break; case 321: /* Line 1806 of yacc.c */ #line 2972 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.type = (yyvsp[(3) - (3)].ival); } break; case 322: /* Line 1806 of yacc.c */ #line 2979 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.lines = (yyvsp[(2) - (2)].ival); } break; case 323: /* Line 1806 of yacc.c */ #line 2986 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.linew = (yyvsp[(2) - (2)].dval); } break; case 324: /* Line 1806 of yacc.c */ #line 2993 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.color = (yyvsp[(2) - (2)].ival); } break; case 325: /* Line 1806 of yacc.c */ #line 3000 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.pen.pattern = (yyvsp[(2) - (2)].ival); } break; case 326: /* Line 1806 of yacc.c */ #line 3008 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.color = (yyvsp[(3) - (3)].ival); } break; case 327: /* Line 1806 of yacc.c */ #line 3016 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.pattern = (yyvsp[(3) - (3)].ival); } break; case 328: /* Line 1806 of yacc.c */ #line 3024 "pars.yacc" { set_graph_hidden((yyvsp[(1) - (2)].ival), !(yyvsp[(2) - (2)].ival)); } break; case 329: /* Line 1806 of yacc.c */ #line 3027 "pars.yacc" { set_graph_hidden((yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].ival)); } break; case 330: /* Line 1806 of yacc.c */ #line 3030 "pars.yacc" { set_graph_type((yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].ival)); } break; case 331: /* Line 1806 of yacc.c */ #line 3033 "pars.yacc" { set_graph_stacked((yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].ival)); } break; case 332: /* Line 1806 of yacc.c */ #line 3037 "pars.yacc" { set_graph_bargap((yyvsp[(1) - (4)].ival), (yyvsp[(4) - (4)].dval)); } break; case 333: /* Line 1806 of yacc.c */ #line 3041 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].locator.pointset = (yyvsp[(3) - (3)].ival); } break; case 334: /* Line 1806 of yacc.c */ #line 3044 "pars.yacc" { g[(yyvsp[(1) - (5)].ival)].locator.fx = (yyvsp[(4) - (5)].ival); g[(yyvsp[(1) - (5)].ival)].locator.fy = (yyvsp[(5) - (5)].ival); } break; case 335: /* Line 1806 of yacc.c */ #line 3048 "pars.yacc" { g[(yyvsp[(1) - (6)].ival)].locator.px = (yyvsp[(4) - (6)].dval); g[(yyvsp[(1) - (6)].ival)].locator.py = (yyvsp[(6) - (6)].dval); } break; case 336: /* Line 1806 of yacc.c */ #line 3052 "pars.yacc" { g[(yyvsp[(1) - (6)].ival)].locator.dsx = (yyvsp[(4) - (6)].dval); g[(yyvsp[(1) - (6)].ival)].locator.dsy = (yyvsp[(6) - (6)].dval); } break; case 337: /* Line 1806 of yacc.c */ #line 3056 "pars.yacc" { g[(yyvsp[(1) - (4)].ival)].locator.pt_type = (yyvsp[(4) - (4)].ival); } break; case 338: /* Line 1806 of yacc.c */ #line 3060 "pars.yacc" { curtype = (yyvsp[(2) - (2)].ival); } break; case 339: /* Line 1806 of yacc.c */ #line 3065 "pars.yacc" { if (add_io_filter((yyvsp[(2) - (5)].ival), (yyvsp[(4) - (5)].ival), (yyvsp[(5) - (5)].sval), (yyvsp[(3) - (5)].sval)) != 0) { yyerror("Failed adding i/o filter"); } xfree((yyvsp[(3) - (5)].sval)); xfree((yyvsp[(5) - (5)].sval)); } break; case 340: /* Line 1806 of yacc.c */ #line 3072 "pars.yacc" { clear_io_filters((yyvsp[(2) - (2)].ival)); } break; case 341: /* Line 1806 of yacc.c */ #line 3076 "pars.yacc" { cursource = (yyvsp[(2) - (2)].ival); } break; case 342: /* Line 1806 of yacc.c */ #line 3079 "pars.yacc" { readxformat = (yyvsp[(2) - (2)].ival); } break; case 343: /* Line 1806 of yacc.c */ #line 3082 "pars.yacc" { } break; case 344: /* Line 1806 of yacc.c */ #line 3083 "pars.yacc" { nonl_parms[(yyvsp[(1) - (3)].ival)].constr = (yyvsp[(3) - (3)].ival); } break; case 345: /* Line 1806 of yacc.c */ #line 3089 "pars.yacc" { drawgraph(); } break; case 346: /* Line 1806 of yacc.c */ #line 3092 "pars.yacc" { #ifndef NONE_GUI if (inwin) { update_all(); } #endif } break; case 347: /* Line 1806 of yacc.c */ #line 3099 "pars.yacc" { set_workingdir((yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 348: /* Line 1806 of yacc.c */ #line 3103 "pars.yacc" { echomsg((yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 349: /* Line 1806 of yacc.c */ #line 3107 "pars.yacc" { char buf[32]; set_locale_num(TRUE); sprintf(buf, "%g", (yyvsp[(2) - (2)].dval)); set_locale_num(FALSE); echomsg(buf); } break; case 350: /* Line 1806 of yacc.c */ #line 3114 "pars.yacc" { close_input = copy_string(close_input, ""); } break; case 351: /* Line 1806 of yacc.c */ #line 3117 "pars.yacc" { close_input = copy_string(close_input, (yyvsp[(2) - (2)].sval)); } break; case 352: /* Line 1806 of yacc.c */ #line 3120 "pars.yacc" { exit(0); } break; case 353: /* Line 1806 of yacc.c */ #line 3123 "pars.yacc" { exit((yyvsp[(3) - (4)].ival)); } break; case 354: /* Line 1806 of yacc.c */ #line 3126 "pars.yacc" { if (!safe_mode) { do_hardcopy(); } else { yyerror("File modifications are disabled in safe mode"); } } break; case 355: /* Line 1806 of yacc.c */ #line 3133 "pars.yacc" { set_ptofile(FALSE); } break; case 356: /* Line 1806 of yacc.c */ #line 3136 "pars.yacc" { set_ptofile(TRUE); strcpy(print_file, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 357: /* Line 1806 of yacc.c */ #line 3141 "pars.yacc" { switch ((yyvsp[(2) - (2)].ival)) { case UP: graph_scroll(GSCROLL_UP); break; case DOWN: graph_scroll(GSCROLL_DOWN); break; case RIGHT: graph_scroll(GSCROLL_RIGHT); break; case LEFT: graph_scroll(GSCROLL_LEFT); break; case IN: graph_zoom(GZOOM_SHRINK); break; case OUT: graph_zoom(GZOOM_EXPAND); break; } } break; case 358: /* Line 1806 of yacc.c */ #line 3163 "pars.yacc" { if ((yyvsp[(2) - (2)].dval) > 0) { msleep_wrap((unsigned int) (1000 * (yyvsp[(2) - (2)].dval))); } } break; case 359: /* Line 1806 of yacc.c */ #line 3168 "pars.yacc" { #ifndef NONE_GUI if (inwin) { HelpCB((yyvsp[(2) - (2)].sval)); } xfree((yyvsp[(2) - (2)].sval)); #endif } break; case 360: /* Line 1806 of yacc.c */ #line 3176 "pars.yacc" { #ifndef NONE_GUI if (inwin) { HelpCB("doc/UsersGuide.html"); } #endif } break; case 361: /* Line 1806 of yacc.c */ #line 3183 "pars.yacc" { gotparams = TRUE; strcpy(paramfile, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 362: /* Line 1806 of yacc.c */ #line 3188 "pars.yacc" { if (!safe_mode) { FILE *pp = grace_openw((yyvsp[(2) - (2)].sval)); if (pp != NULL) { putparms(whichgraph, pp, 0); grace_close(pp); } } else { yyerror("File modifications are disabled in safe mode"); } xfree((yyvsp[(2) - (2)].sval)); } break; case 363: /* Line 1806 of yacc.c */ #line 3200 "pars.yacc" { set_set_hidden((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival)); } break; case 364: /* Line 1806 of yacc.c */ #line 3203 "pars.yacc" { setlength((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival)); } break; case 365: /* Line 1806 of yacc.c */ #line 3206 "pars.yacc" { realloc_vrbl((yyvsp[(1) - (3)].vrbl), (yyvsp[(3) - (3)].ival)); } break; case 366: /* Line 1806 of yacc.c */ #line 3209 "pars.yacc" { add_point((yyvsp[(1) - (5)].trgt)->gno, (yyvsp[(1) - (5)].trgt)->setno, (yyvsp[(3) - (5)].dval), (yyvsp[(5) - (5)].dval)); } break; case 367: /* Line 1806 of yacc.c */ #line 3213 "pars.yacc" { int start = (yyvsp[(3) - (5)].ival) - index_shift; int stop = (yyvsp[(5) - (5)].ival) - index_shift; droppoints((yyvsp[(1) - (5)].trgt)->gno, (yyvsp[(1) - (5)].trgt)->setno, start, stop); } break; case 368: /* Line 1806 of yacc.c */ #line 3218 "pars.yacc" { if (is_set_active((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno)) { sortset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, (yyvsp[(3) - (4)].ival), (yyvsp[(4) - (4)].ival) == ASCENDING ? 0 : 1); } } break; case 369: /* Line 1806 of yacc.c */ #line 3223 "pars.yacc" { do_copyset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, (yyvsp[(4) - (4)].trgt)->gno, (yyvsp[(4) - (4)].trgt)->setno); } break; case 370: /* Line 1806 of yacc.c */ #line 3226 "pars.yacc" { if ((yyvsp[(2) - (4)].trgt)->gno != (yyvsp[(4) - (4)].trgt)->gno) { errmsg("Can't append sets from different graphs"); } else { int sets[2]; sets[0] = (yyvsp[(4) - (4)].trgt)->setno; sets[1] = (yyvsp[(2) - (4)].trgt)->setno; join_sets((yyvsp[(2) - (4)].trgt)->gno, sets, 2); } } break; case 371: /* Line 1806 of yacc.c */ #line 3236 "pars.yacc" { reverse_set((yyvsp[(2) - (2)].trgt)->gno, (yyvsp[(2) - (2)].trgt)->setno); } break; case 372: /* Line 1806 of yacc.c */ #line 3239 "pars.yacc" { do_splitsets((yyvsp[(2) - (3)].trgt)->gno, (yyvsp[(2) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival)); } break; case 373: /* Line 1806 of yacc.c */ #line 3242 "pars.yacc" { do_moveset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, (yyvsp[(4) - (4)].trgt)->gno, (yyvsp[(4) - (4)].trgt)->setno); } break; case 374: /* Line 1806 of yacc.c */ #line 3245 "pars.yacc" { do_swapset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, (yyvsp[(4) - (4)].trgt)->gno, (yyvsp[(4) - (4)].trgt)->setno); } break; case 375: /* Line 1806 of yacc.c */ #line 3248 "pars.yacc" { killset((yyvsp[(2) - (2)].trgt)->gno, (yyvsp[(2) - (2)].trgt)->setno); } break; case 376: /* Line 1806 of yacc.c */ #line 3251 "pars.yacc" { killsetdata((yyvsp[(2) - (3)].trgt)->gno, (yyvsp[(2) - (3)].trgt)->setno); } break; case 377: /* Line 1806 of yacc.c */ #line 3254 "pars.yacc" { kill_graph((yyvsp[(2) - (2)].ival)); } break; case 378: /* Line 1806 of yacc.c */ #line 3257 "pars.yacc" { kill_region((yyvsp[(2) - (2)].ival)); } break; case 379: /* Line 1806 of yacc.c */ #line 3260 "pars.yacc" { wipeout(); } break; case 380: /* Line 1806 of yacc.c */ #line 3263 "pars.yacc" { arrange_graphs_simple((yyvsp[(3) - (12)].ival), (yyvsp[(5) - (12)].ival), 0, FALSE, (yyvsp[(7) - (12)].dval), (yyvsp[(9) - (12)].dval), (yyvsp[(11) - (12)].dval)); } break; case 381: /* Line 1806 of yacc.c */ #line 3266 "pars.yacc" { int order = ((yyvsp[(13) - (18)].ival) * GA_ORDER_HV_INV) | ((yyvsp[(15) - (18)].ival) * GA_ORDER_H_INV ) | ((yyvsp[(17) - (18)].ival) * GA_ORDER_V_INV ); arrange_graphs_simple((yyvsp[(3) - (18)].ival), (yyvsp[(5) - (18)].ival), order, FALSE, (yyvsp[(7) - (18)].dval), (yyvsp[(9) - (18)].dval), (yyvsp[(11) - (18)].dval)); } break; case 382: /* Line 1806 of yacc.c */ #line 3272 "pars.yacc" { int order = ((yyvsp[(13) - (20)].ival) * GA_ORDER_HV_INV) | ((yyvsp[(15) - (20)].ival) * GA_ORDER_H_INV ) | ((yyvsp[(17) - (20)].ival) * GA_ORDER_V_INV ); arrange_graphs_simple((yyvsp[(3) - (20)].ival), (yyvsp[(5) - (20)].ival), order, (yyvsp[(19) - (20)].ival), (yyvsp[(7) - (20)].dval), (yyvsp[(9) - (20)].dval), (yyvsp[(11) - (20)].dval)); } break; case 383: /* Line 1806 of yacc.c */ #line 3278 "pars.yacc" { gotnlfit = TRUE; nlfit_gno = (yyvsp[(3) - (6)].trgt)->gno; nlfit_setno = (yyvsp[(3) - (6)].trgt)->setno; nlfit_nsteps = (yyvsp[(5) - (6)].ival); nlfit_warray = NULL; } break; case 384: /* Line 1806 of yacc.c */ #line 3285 "pars.yacc" { if (getsetlength((yyvsp[(3) - (8)].trgt)->gno, (yyvsp[(3) - (8)].trgt)->setno) != (yyvsp[(5) - (8)].vrbl)->length) { errmsg("Data and weight arrays are of different lengths"); return 1; } else { gotnlfit = TRUE; nlfit_gno = (yyvsp[(3) - (8)].trgt)->gno; nlfit_setno = (yyvsp[(3) - (8)].trgt)->setno; nlfit_nsteps = (yyvsp[(7) - (8)].ival); nlfit_warray = copy_data_column((yyvsp[(5) - (8)].vrbl)->data, (yyvsp[(5) - (8)].vrbl)->length); } } break; case 385: /* Line 1806 of yacc.c */ #line 3297 "pars.yacc" { do_regress((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, (yyvsp[(5) - (6)].ival), 0, -1, 0, -1); } break; case 386: /* Line 1806 of yacc.c */ #line 3300 "pars.yacc" { do_runavg((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, (yyvsp[(5) - (6)].ival), (yyvsp[(1) - (6)].ival), -1, 0); } break; case 387: /* Line 1806 of yacc.c */ #line 3303 "pars.yacc" { do_fourier_command((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, (yyvsp[(1) - (6)].ival), (yyvsp[(5) - (6)].ival)); } break; case 388: /* Line 1806 of yacc.c */ #line 3307 "pars.yacc" { switch ((yyvsp[(1) - (12)].ival)) { case FFT_DFT: do_fourier((yyvsp[(3) - (12)].trgt)->gno, (yyvsp[(3) - (12)].trgt)->setno, 0, (yyvsp[(11) - (12)].ival), (yyvsp[(9) - (12)].ival), 0, (yyvsp[(5) - (12)].ival), (yyvsp[(7) - (12)].ival)); break; case FFT_INVDFT : do_fourier((yyvsp[(3) - (12)].trgt)->gno, (yyvsp[(3) - (12)].trgt)->setno, 0, (yyvsp[(11) - (12)].ival), (yyvsp[(9) - (12)].ival), 1, (yyvsp[(5) - (12)].ival), (yyvsp[(7) - (12)].ival)); break; case FFT_FFT: do_fourier((yyvsp[(3) - (12)].trgt)->gno, (yyvsp[(3) - (12)].trgt)->setno, 1, (yyvsp[(11) - (12)].ival), (yyvsp[(9) - (12)].ival), 0, (yyvsp[(5) - (12)].ival), (yyvsp[(7) - (12)].ival)); break; case FFT_INVFFT : do_fourier((yyvsp[(3) - (12)].trgt)->gno, (yyvsp[(3) - (12)].trgt)->setno, 1, (yyvsp[(11) - (12)].ival), (yyvsp[(9) - (12)].ival), 1, (yyvsp[(5) - (12)].ival), (yyvsp[(7) - (12)].ival)); break; default: errmsg("Internal error"); break; } } break; case 389: /* Line 1806 of yacc.c */ #line 3326 "pars.yacc" { do_interp((yyvsp[(3) - (10)].trgt)->gno, (yyvsp[(3) - (10)].trgt)->setno, get_cg(), SET_SELECT_NEXT, (yyvsp[(5) - (10)].vrbl)->data, (yyvsp[(5) - (10)].vrbl)->length, (yyvsp[(7) - (10)].ival), (yyvsp[(9) - (10)].ival)); } break; case 390: /* Line 1806 of yacc.c */ #line 3330 "pars.yacc" { do_histo((yyvsp[(3) - (10)].trgt)->gno, (yyvsp[(3) - (10)].trgt)->setno, get_cg(), SET_SELECT_NEXT, (yyvsp[(5) - (10)].vrbl)->data, (yyvsp[(5) - (10)].vrbl)->length - 1, (yyvsp[(7) - (10)].ival), (yyvsp[(9) - (10)].ival)); } break; case 391: /* Line 1806 of yacc.c */ #line 3334 "pars.yacc" { do_differ((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, (yyvsp[(5) - (6)].ival)); } break; case 392: /* Line 1806 of yacc.c */ #line 3337 "pars.yacc" { do_int((yyvsp[(3) - (4)].trgt)->gno, (yyvsp[(3) - (4)].trgt)->setno, 0); } break; case 393: /* Line 1806 of yacc.c */ #line 3340 "pars.yacc" { do_xcor((yyvsp[(3) - (10)].trgt)->gno, (yyvsp[(3) - (10)].trgt)->setno, (yyvsp[(5) - (10)].trgt)->gno, (yyvsp[(5) - (10)].trgt)->setno, (yyvsp[(7) - (10)].ival), (yyvsp[(9) - (10)].ival)); } break; case 394: /* Line 1806 of yacc.c */ #line 3343 "pars.yacc" { do_linearc((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, (yyvsp[(5) - (6)].trgt)->gno, (yyvsp[(5) - (6)].trgt)->setno); } break; case 395: /* Line 1806 of yacc.c */ #line 3346 "pars.yacc" { int len = getsetlength((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno); if (len != (yyvsp[(5) - (6)].vrbl)->length) { errmsg("Filter expression is of a wrong length"); } else { char *rarray; rarray = xmalloc(len*SIZEOF_CHAR); if (rarray) { int i; for (i = 0; i < len; i++) { rarray[i] = CAST_DBL_TO_BOOL((yyvsp[(5) - (6)].vrbl)->data[i]); } filter_set((yyvsp[(3) - (6)].trgt)->gno, (yyvsp[(3) - (6)].trgt)->setno, rarray); xfree(rarray); } } } break; case 396: /* Line 1806 of yacc.c */ #line 3363 "pars.yacc" { int rtype; char *rarray; rtype = RESTRICT_REG0 + (yyvsp[(5) - (8)].ival); if (get_restriction_array((yyvsp[(3) - (8)].trgt)->gno, (yyvsp[(3) - (8)].trgt)->setno, rtype, (yyvsp[(7) - (8)].ival), &rarray) != RETURN_SUCCESS) { errmsg("Error in region evaluation"); return 1; } else { filter_set((yyvsp[(3) - (8)].trgt)->gno, (yyvsp[(3) - (8)].trgt)->setno, rarray); xfree(rarray); } } break; case 397: /* Line 1806 of yacc.c */ #line 3378 "pars.yacc" { if (autoscale_graph(whichgraph, AUTOSCALE_XY) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } break; case 398: /* Line 1806 of yacc.c */ #line 3383 "pars.yacc" { if (autoscale_graph(whichgraph, AUTOSCALE_X) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } break; case 399: /* Line 1806 of yacc.c */ #line 3388 "pars.yacc" { if (autoscale_graph(whichgraph, AUTOSCALE_Y) != RETURN_SUCCESS) { errmsg("Can't autoscale (no active sets?)"); } } break; case 400: /* Line 1806 of yacc.c */ #line 3393 "pars.yacc" { autoscale_byset((yyvsp[(2) - (2)].trgt)->gno, (yyvsp[(2) - (2)].trgt)->setno, AUTOSCALE_XY); } break; case 401: /* Line 1806 of yacc.c */ #line 3396 "pars.yacc" { autotick_axis(whichgraph, ALL_AXES); } break; case 402: /* Line 1806 of yacc.c */ #line 3399 "pars.yacc" { int gno = (yyvsp[(2) - (2)].ival); if (is_graph_hidden(gno) == FALSE) { select_graph(gno); } else { errmsg("Graph is not active"); } } break; case 403: /* Line 1806 of yacc.c */ #line 3407 "pars.yacc" { gotread = TRUE; strcpy(readfile, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 404: /* Line 1806 of yacc.c */ #line 3412 "pars.yacc" { strcpy(batchfile, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 405: /* Line 1806 of yacc.c */ #line 3416 "pars.yacc" { getdata(whichgraph, (yyvsp[(3) - (3)].sval), SOURCE_DISK, LOAD_BLOCK); xfree((yyvsp[(3) - (3)].sval)); } break; case 406: /* Line 1806 of yacc.c */ #line 3420 "pars.yacc" { getdata(whichgraph, (yyvsp[(4) - (4)].sval), (yyvsp[(3) - (4)].ival), LOAD_BLOCK); xfree((yyvsp[(4) - (4)].sval)); } break; case 407: /* Line 1806 of yacc.c */ #line 3424 "pars.yacc" { int nc, *cols, scol; if (field_string_to_cols((yyvsp[(3) - (3)].sval), &nc, &cols, &scol) != RETURN_SUCCESS) { errmsg("Erroneous field specifications"); xfree((yyvsp[(3) - (3)].sval)); return 1; } else { xfree((yyvsp[(3) - (3)].sval)); create_set_fromblock(whichgraph, NEW_SET, (yyvsp[(2) - (3)].ival), nc, cols, scol, autoscale_onread); xfree(cols); } } break; case 408: /* Line 1806 of yacc.c */ #line 3437 "pars.yacc" { set_blockdata(NULL); } break; case 409: /* Line 1806 of yacc.c */ #line 3440 "pars.yacc" { gotread = TRUE; curtype = (yyvsp[(2) - (3)].ival); strcpy(readfile, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 410: /* Line 1806 of yacc.c */ #line 3446 "pars.yacc" { gotread = TRUE; strcpy(readfile, (yyvsp[(4) - (4)].sval)); curtype = (yyvsp[(2) - (4)].ival); cursource = (yyvsp[(3) - (4)].ival); xfree((yyvsp[(4) - (4)].sval)); } break; case 411: /* Line 1806 of yacc.c */ #line 3453 "pars.yacc" { getdata(whichgraph, (yyvsp[(3) - (3)].sval), SOURCE_DISK, LOAD_NXY); xfree((yyvsp[(3) - (3)].sval)); } break; case 412: /* Line 1806 of yacc.c */ #line 3457 "pars.yacc" { getdata(whichgraph, (yyvsp[(4) - (4)].sval), (yyvsp[(3) - (4)].ival), LOAD_NXY); xfree((yyvsp[(4) - (4)].sval)); } break; case 413: /* Line 1806 of yacc.c */ #line 3461 "pars.yacc" { if (!safe_mode) { outputset((yyvsp[(2) - (2)].trgt)->gno, (yyvsp[(2) - (2)].trgt)->setno, "stdout", NULL); } else { yyerror("File modifications are disabled in safe mode"); } } break; case 414: /* Line 1806 of yacc.c */ #line 3468 "pars.yacc" { if (!safe_mode) { outputset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, "stdout", (yyvsp[(4) - (4)].sval)); } else { yyerror("File modifications are disabled in safe mode"); } xfree((yyvsp[(4) - (4)].sval)); } break; case 415: /* Line 1806 of yacc.c */ #line 3476 "pars.yacc" { if (!safe_mode) { outputset((yyvsp[(2) - (4)].trgt)->gno, (yyvsp[(2) - (4)].trgt)->setno, (yyvsp[(4) - (4)].sval), NULL); } else { yyerror("File modifications are disabled in safe mode"); } xfree((yyvsp[(4) - (4)].sval)); } break; case 416: /* Line 1806 of yacc.c */ #line 3484 "pars.yacc" { if (!safe_mode) { outputset((yyvsp[(2) - (6)].trgt)->gno, (yyvsp[(2) - (6)].trgt)->setno, (yyvsp[(4) - (6)].sval), (yyvsp[(6) - (6)].sval)); } else { yyerror("File modifications are disabled in safe mode"); } xfree((yyvsp[(4) - (6)].sval)); xfree((yyvsp[(6) - (6)].sval)); } break; case 417: /* Line 1806 of yacc.c */ #line 3493 "pars.yacc" { if (!safe_mode) { save_project((yyvsp[(2) - (2)].sval)); } else { yyerror("File modifications are disabled in safe mode"); } xfree((yyvsp[(2) - (2)].sval)); } break; case 418: /* Line 1806 of yacc.c */ #line 3501 "pars.yacc" { load_project((yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 419: /* Line 1806 of yacc.c */ #line 3505 "pars.yacc" { new_project(NULL); } break; case 420: /* Line 1806 of yacc.c */ #line 3508 "pars.yacc" { new_project((yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 421: /* Line 1806 of yacc.c */ #line 3512 "pars.yacc" { push_world(); } break; case 422: /* Line 1806 of yacc.c */ #line 3515 "pars.yacc" { pop_world(); } break; case 423: /* Line 1806 of yacc.c */ #line 3518 "pars.yacc" { cycle_world_stack(); } break; case 424: /* Line 1806 of yacc.c */ #line 3521 "pars.yacc" { if ((yyvsp[(2) - (2)].ival) > 0) show_world_stack((yyvsp[(2) - (2)].ival) - 1); } break; case 425: /* Line 1806 of yacc.c */ #line 3525 "pars.yacc" { clear_world_stack(); } break; case 426: /* Line 1806 of yacc.c */ #line 3528 "pars.yacc" { do_clear_boxes(); } break; case 427: /* Line 1806 of yacc.c */ #line 3531 "pars.yacc" { do_clear_ellipses(); } break; case 428: /* Line 1806 of yacc.c */ #line 3534 "pars.yacc" { do_clear_lines(); } break; case 429: /* Line 1806 of yacc.c */ #line 3537 "pars.yacc" { do_clear_text(); } break; case 430: /* Line 1806 of yacc.c */ #line 3544 "pars.yacc" { #ifndef NONE_GUI set_pagelayout((yyvsp[(3) - (3)].ival)); #endif } break; case 431: /* Line 1806 of yacc.c */ #line 3549 "pars.yacc" { auto_redraw = (yyvsp[(3) - (3)].ival); } break; case 432: /* Line 1806 of yacc.c */ #line 3552 "pars.yacc" { draw_focus_flag = (yyvsp[(2) - (2)].ival); } break; case 433: /* Line 1806 of yacc.c */ #line 3555 "pars.yacc" { focus_policy = FOCUS_SET; } break; case 434: /* Line 1806 of yacc.c */ #line 3558 "pars.yacc" { focus_policy = FOCUS_FOLLOWS; } break; case 435: /* Line 1806 of yacc.c */ #line 3561 "pars.yacc" { focus_policy = FOCUS_CLICK; } break; case 436: /* Line 1806 of yacc.c */ #line 3568 "pars.yacc" {} break; case 437: /* Line 1806 of yacc.c */ #line 3569 "pars.yacc" {} break; case 438: /* Line 1806 of yacc.c */ #line 3573 "pars.yacc" { set_set_hidden((yyvsp[(1) - (2)].trgt)->gno, (yyvsp[(1) - (2)].trgt)->setno, !(yyvsp[(2) - (2)].ival)); } break; case 439: /* Line 1806 of yacc.c */ #line 3576 "pars.yacc" { set_dataset_type((yyvsp[(1) - (3)].trgt)->gno, (yyvsp[(1) - (3)].trgt)->setno, (yyvsp[(3) - (3)].ival)); } break; case 440: /* Line 1806 of yacc.c */ #line 3580 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].sym = (yyvsp[(3) - (3)].ival); } break; case 441: /* Line 1806 of yacc.c */ #line 3583 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].sympen.color = (yyvsp[(3) - (3)].ival); } break; case 442: /* Line 1806 of yacc.c */ #line 3586 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].sympen.pattern = (yyvsp[(3) - (3)].ival); } break; case 443: /* Line 1806 of yacc.c */ #line 3589 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].symlinew = (yyvsp[(3) - (3)].dval); } break; case 444: /* Line 1806 of yacc.c */ #line 3592 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].symlines = (yyvsp[(3) - (3)].ival); } break; case 445: /* Line 1806 of yacc.c */ #line 3595 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.color = (yyvsp[(4) - (4)].ival); } break; case 446: /* Line 1806 of yacc.c */ #line 3598 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.pattern = (yyvsp[(4) - (4)].ival); } break; case 447: /* Line 1806 of yacc.c */ #line 3601 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symsize = (yyvsp[(4) - (4)].dval); } break; case 448: /* Line 1806 of yacc.c */ #line 3604 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symchar = (yyvsp[(4) - (4)].ival); } break; case 449: /* Line 1806 of yacc.c */ #line 3607 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].charfont = (yyvsp[(4) - (4)].ival); } break; case 450: /* Line 1806 of yacc.c */ #line 3610 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symskip = (yyvsp[(4) - (4)].ival); } break; case 451: /* Line 1806 of yacc.c */ #line 3615 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].linet = (yyvsp[(4) - (4)].ival); } break; case 452: /* Line 1806 of yacc.c */ #line 3619 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].lines = (yyvsp[(3) - (3)].ival); } break; case 453: /* Line 1806 of yacc.c */ #line 3623 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].linew = (yyvsp[(3) - (3)].dval); } break; case 454: /* Line 1806 of yacc.c */ #line 3627 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].linepen.color = (yyvsp[(3) - (3)].ival); } break; case 455: /* Line 1806 of yacc.c */ #line 3631 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].linepen.pattern = (yyvsp[(3) - (3)].ival); } break; case 456: /* Line 1806 of yacc.c */ #line 3636 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].filltype = (yyvsp[(4) - (4)].ival); } break; case 457: /* Line 1806 of yacc.c */ #line 3640 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].fillrule = (yyvsp[(4) - (4)].ival); } break; case 458: /* Line 1806 of yacc.c */ #line 3644 "pars.yacc" { int prop = (yyvsp[(3) - (3)].ival); if (get_project_version() <= 40102 && get_project_version() >= 30000) { switch (filltype_obs) { case COLOR: break; case PATTERN: prop = 1; break; default: /* NONE */ prop = 0; break; } } g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].setfillpen.color = prop; } break; case 459: /* Line 1806 of yacc.c */ #line 3662 "pars.yacc" { int prop = (yyvsp[(3) - (3)].ival); if (get_project_version() <= 40102) { switch (filltype_obs) { case COLOR: prop = 1; break; case PATTERN: break; default: /* NONE */ prop = 0; break; } } g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].setfillpen.pattern = prop; } break; case 460: /* Line 1806 of yacc.c */ #line 3682 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].baseline = (yyvsp[(3) - (3)].ival); } break; case 461: /* Line 1806 of yacc.c */ #line 3686 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].baseline_type = (yyvsp[(4) - (4)].ival); } break; case 462: /* Line 1806 of yacc.c */ #line 3691 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].dropline = (yyvsp[(3) - (3)].ival); } break; case 463: /* Line 1806 of yacc.c */ #line 3696 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].avalue.active = (yyvsp[(3) - (3)].ival); } break; case 464: /* Line 1806 of yacc.c */ #line 3700 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.type = (yyvsp[(4) - (4)].ival); } break; case 465: /* Line 1806 of yacc.c */ #line 3704 "pars.yacc" { g[(yyvsp[(1) - (5)].trgt)->gno].p[(yyvsp[(1) - (5)].trgt)->setno].avalue.size = (yyvsp[(5) - (5)].dval); } break; case 466: /* Line 1806 of yacc.c */ #line 3708 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].avalue.font = (yyvsp[(3) - (3)].ival); } break; case 467: /* Line 1806 of yacc.c */ #line 3712 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].avalue.color = (yyvsp[(3) - (3)].ival); } break; case 468: /* Line 1806 of yacc.c */ #line 3716 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.angle = (yyvsp[(4) - (4)].ival); } break; case 469: /* Line 1806 of yacc.c */ #line 3720 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.format = (yyvsp[(4) - (4)].ival); } break; case 470: /* Line 1806 of yacc.c */ #line 3724 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.prec = (yyvsp[(4) - (4)].ival); } break; case 471: /* Line 1806 of yacc.c */ #line 3727 "pars.yacc" { g[(yyvsp[(1) - (6)].trgt)->gno].p[(yyvsp[(1) - (6)].trgt)->setno].avalue.offset.x = (yyvsp[(4) - (6)].dval); g[(yyvsp[(1) - (6)].trgt)->gno].p[(yyvsp[(1) - (6)].trgt)->setno].avalue.offset.y = (yyvsp[(6) - (6)].dval); } break; case 472: /* Line 1806 of yacc.c */ #line 3732 "pars.yacc" { strcpy(g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.prestr, (yyvsp[(4) - (4)].sval)); xfree((yyvsp[(4) - (4)].sval)); } break; case 473: /* Line 1806 of yacc.c */ #line 3737 "pars.yacc" { strcpy(g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].avalue.appstr, (yyvsp[(4) - (4)].sval)); xfree((yyvsp[(4) - (4)].sval)); } break; case 474: /* Line 1806 of yacc.c */ #line 3742 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.active = (yyvsp[(3) - (3)].ival); } break; case 475: /* Line 1806 of yacc.c */ #line 3745 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.ptype = (yyvsp[(3) - (3)].ival); } break; case 476: /* Line 1806 of yacc.c */ #line 3748 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.pen.color = (yyvsp[(3) - (3)].ival); } break; case 477: /* Line 1806 of yacc.c */ #line 3751 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.pen.pattern = (yyvsp[(3) - (3)].ival); } break; case 478: /* Line 1806 of yacc.c */ #line 3754 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].errbar.barsize = (yyvsp[(4) - (4)].dval); } break; case 479: /* Line 1806 of yacc.c */ #line 3757 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.linew = (yyvsp[(3) - (3)].dval); } break; case 480: /* Line 1806 of yacc.c */ #line 3760 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].errbar.lines = (yyvsp[(3) - (3)].ival); } break; case 481: /* Line 1806 of yacc.c */ #line 3763 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].errbar.riser_linew = (yyvsp[(4) - (4)].dval); } break; case 482: /* Line 1806 of yacc.c */ #line 3766 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].errbar.riser_lines = (yyvsp[(4) - (4)].ival); } break; case 483: /* Line 1806 of yacc.c */ #line 3769 "pars.yacc" { g[(yyvsp[(1) - (5)].trgt)->gno].p[(yyvsp[(1) - (5)].trgt)->setno].errbar.arrow_clip = (yyvsp[(5) - (5)].ival); } break; case 484: /* Line 1806 of yacc.c */ #line 3772 "pars.yacc" { g[(yyvsp[(1) - (6)].trgt)->gno].p[(yyvsp[(1) - (6)].trgt)->setno].errbar.cliplen = (yyvsp[(6) - (6)].dval); } break; case 485: /* Line 1806 of yacc.c */ #line 3776 "pars.yacc" { strncpy(g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].comments, (yyvsp[(3) - (3)].sval), MAX_STRING_LENGTH - 1); xfree((yyvsp[(3) - (3)].sval)); } break; case 486: /* Line 1806 of yacc.c */ #line 3781 "pars.yacc" { strncpy(g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].lstr, (yyvsp[(3) - (3)].sval), MAX_STRING_LENGTH - 1); xfree((yyvsp[(3) - (3)].sval)); } break; case 487: /* Line 1806 of yacc.c */ #line 3789 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->active = (yyvsp[(1) - (1)].ival); } break; case 488: /* Line 1806 of yacc.c */ #line 3796 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->zero = (yyvsp[(3) - (3)].ival); } break; case 489: /* Line 1806 of yacc.c */ #line 3803 "pars.yacc" {} break; case 490: /* Line 1806 of yacc.c */ #line 3804 "pars.yacc" {} break; case 491: /* Line 1806 of yacc.c */ #line 3805 "pars.yacc" {} break; case 492: /* Line 1806 of yacc.c */ #line 3806 "pars.yacc" {} break; case 493: /* Line 1806 of yacc.c */ #line 3807 "pars.yacc" {} break; case 494: /* Line 1806 of yacc.c */ #line 3808 "pars.yacc" {} break; case 495: /* Line 1806 of yacc.c */ #line 3809 "pars.yacc" {} break; case 496: /* Line 1806 of yacc.c */ #line 3810 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsx = (yyvsp[(2) - (4)].dval); g[whichgraph].t[naxis]->offsy = (yyvsp[(4) - (4)].dval); } break; case 497: /* Line 1806 of yacc.c */ #line 3821 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_flag = (yyvsp[(1) - (1)].ival); } break; case 498: /* Line 1806 of yacc.c */ #line 3828 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tmajor = (yyvsp[(2) - (2)].dval); } break; case 499: /* Line 1806 of yacc.c */ #line 3835 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->nminor = (yyvsp[(3) - (3)].ival); } break; case 500: /* Line 1806 of yacc.c */ #line 3842 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_round = (yyvsp[(3) - (3)].ival); } break; case 501: /* Line 1806 of yacc.c */ #line 3850 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsx = (yyvsp[(2) - (2)].dval); } break; case 502: /* Line 1806 of yacc.c */ #line 3857 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->offsy = (yyvsp[(2) - (2)].dval); } break; case 503: /* Line 1806 of yacc.c */ #line 3864 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_autonum = (yyvsp[(2) - (2)].ival); } break; case 504: /* Line 1806 of yacc.c */ #line 3871 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_inout = (yyvsp[(1) - (1)].ival); } break; case 505: /* Line 1806 of yacc.c */ #line 3878 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.size = (yyvsp[(3) - (3)].dval); } break; case 506: /* Line 1806 of yacc.c */ #line 3885 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.size = (yyvsp[(3) - (3)].dval); } break; case 507: /* Line 1806 of yacc.c */ #line 3892 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.color = g[whichgraph].t[naxis]->mprops.color = (yyvsp[(1) - (1)].ival); } break; case 508: /* Line 1806 of yacc.c */ #line 3899 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.color = (yyvsp[(2) - (2)].ival); } break; case 509: /* Line 1806 of yacc.c */ #line 3906 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.color = (yyvsp[(2) - (2)].ival); } break; case 510: /* Line 1806 of yacc.c */ #line 3913 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.linew = g[whichgraph].t[naxis]->mprops.linew = (yyvsp[(1) - (1)].dval); } break; case 511: /* Line 1806 of yacc.c */ #line 3920 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.linew = (yyvsp[(2) - (2)].dval); } break; case 512: /* Line 1806 of yacc.c */ #line 3927 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.linew = (yyvsp[(2) - (2)].dval); } break; case 513: /* Line 1806 of yacc.c */ #line 3934 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.lines = (yyvsp[(2) - (2)].ival); } break; case 514: /* Line 1806 of yacc.c */ #line 3941 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.lines = (yyvsp[(2) - (2)].ival); } break; case 515: /* Line 1806 of yacc.c */ #line 3948 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.gridflag = (yyvsp[(3) - (3)].ival); } break; case 516: /* Line 1806 of yacc.c */ #line 3955 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->mprops.gridflag = (yyvsp[(3) - (3)].ival); } break; case 517: /* Line 1806 of yacc.c */ #line 3962 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_op = (yyvsp[(1) - (1)].ival); } break; case 518: /* Line 1806 of yacc.c */ #line 3969 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = (yyvsp[(3) - (3)].ival); } break; case 519: /* Line 1806 of yacc.c */ #line 3976 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->nticks = (yyvsp[(2) - (2)].ival); } break; case 520: /* Line 1806 of yacc.c */ #line 3983 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[(yyvsp[(2) - (4)].ival)].wtpos = (yyvsp[(4) - (4)].dval); g[whichgraph].t[naxis]->tloc[(yyvsp[(2) - (4)].ival)].type = TICK_TYPE_MAJOR; } break; case 521: /* Line 1806 of yacc.c */ #line 3991 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[(yyvsp[(2) - (4)].ival)].wtpos = (yyvsp[(4) - (4)].dval); g[whichgraph].t[naxis]->tloc[(yyvsp[(2) - (4)].ival)].type = TICK_TYPE_MINOR; } break; case 522: /* Line 1806 of yacc.c */ #line 4002 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_flag = (yyvsp[(1) - (1)].ival); } break; case 523: /* Line 1806 of yacc.c */ #line 4009 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_prec = (yyvsp[(2) - (2)].ival); } break; case 524: /* Line 1806 of yacc.c */ #line 4016 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_format = (yyvsp[(2) - (2)].ival); } break; case 525: /* Line 1806 of yacc.c */ #line 4023 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_format = (yyvsp[(2) - (2)].dval); } break; case 526: /* Line 1806 of yacc.c */ #line 4030 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } strcpy(g[whichgraph].t[naxis]->tl_appstr, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 527: /* Line 1806 of yacc.c */ #line 4038 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } strcpy(g[whichgraph].t[naxis]->tl_prestr, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 528: /* Line 1806 of yacc.c */ #line 4046 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = (yyvsp[(2) - (2)].ival); } break; case 529: /* Line 1806 of yacc.c */ #line 4053 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_skip = (yyvsp[(2) - (2)].ival); } break; case 530: /* Line 1806 of yacc.c */ #line 4060 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_staggered = (yyvsp[(2) - (2)].ival); } break; case 531: /* Line 1806 of yacc.c */ #line 4067 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_op = (yyvsp[(1) - (1)].ival); } break; case 532: /* Line 1806 of yacc.c */ #line 4074 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 533: /* Line 1806 of yacc.c */ #line 4083 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_start = (yyvsp[(2) - (2)].dval); } break; case 534: /* Line 1806 of yacc.c */ #line 4090 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stop = (yyvsp[(2) - (2)].dval); } break; case 535: /* Line 1806 of yacc.c */ #line 4097 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_starttype = TYPE_SPEC; } break; case 536: /* Line 1806 of yacc.c */ #line 4104 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_starttype = TYPE_AUTO; } break; case 537: /* Line 1806 of yacc.c */ #line 4111 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stoptype = TYPE_SPEC; } break; case 538: /* Line 1806 of yacc.c */ #line 4118 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_stoptype = TYPE_AUTO; } break; case 539: /* Line 1806 of yacc.c */ #line 4125 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_charsize = (yyvsp[(3) - (3)].dval); } break; case 540: /* Line 1806 of yacc.c */ #line 4132 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_font = (yyvsp[(1) - (1)].ival); } break; case 541: /* Line 1806 of yacc.c */ #line 4139 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_color = (yyvsp[(1) - (1)].ival); } break; case 542: /* Line 1806 of yacc.c */ #line 4146 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); xfree((yyvsp[(3) - (3)].sval)); return 1; } if ((yyvsp[(1) - (3)].ival) >= MAX_TICKS) { yyerror("Number of ticks exceeds maximum"); xfree((yyvsp[(3) - (3)].sval)); return 1; } g[whichgraph].t[naxis]->tloc[(yyvsp[(1) - (3)].ival)].label = copy_string(g[whichgraph].t[naxis]->tloc[(yyvsp[(1) - (3)].ival)].label, (yyvsp[(3) - (3)].sval)); xfree((yyvsp[(3) - (3)].sval)); } break; case 543: /* Line 1806 of yacc.c */ #line 4161 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gaptype = TYPE_AUTO; } break; case 544: /* Line 1806 of yacc.c */ #line 4168 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gaptype = TYPE_SPEC; } break; case 545: /* Line 1806 of yacc.c */ #line 4175 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_gap.x = (yyvsp[(2) - (4)].dval); g[whichgraph].t[naxis]->tl_gap.y = (yyvsp[(4) - (4)].dval); } break; case 546: /* Line 1806 of yacc.c */ #line 4186 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } set_plotstr_string(&g[whichgraph].t[naxis]->label, (yyvsp[(1) - (1)].sval)); xfree((yyvsp[(1) - (1)].sval)); } break; case 547: /* Line 1806 of yacc.c */ #line 4194 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_layout = LAYOUT_PERPENDICULAR; } break; case 548: /* Line 1806 of yacc.c */ #line 4201 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_layout = LAYOUT_PARALLEL; } break; case 549: /* Line 1806 of yacc.c */ #line 4208 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_place = TYPE_AUTO; } break; case 550: /* Line 1806 of yacc.c */ #line 4215 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_place = TYPE_SPEC; } break; case 551: /* Line 1806 of yacc.c */ #line 4222 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.x = (yyvsp[(2) - (4)].dval); g[whichgraph].t[naxis]->label.y = (yyvsp[(4) - (4)].dval); } break; case 552: /* Line 1806 of yacc.c */ #line 4230 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.just = (yyvsp[(2) - (2)].ival); } break; case 553: /* Line 1806 of yacc.c */ #line 4237 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.charsize = (yyvsp[(3) - (3)].dval); } break; case 554: /* Line 1806 of yacc.c */ #line 4244 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.font = (yyvsp[(1) - (1)].ival); } break; case 555: /* Line 1806 of yacc.c */ #line 4251 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label.color = (yyvsp[(1) - (1)].ival); } break; case 556: /* Line 1806 of yacc.c */ #line 4258 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_op = (yyvsp[(1) - (1)].ival); } break; case 557: /* Line 1806 of yacc.c */ #line 4268 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbar = (yyvsp[(1) - (1)].ival); } break; case 558: /* Line 1806 of yacc.c */ #line 4275 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarcolor = (yyvsp[(1) - (1)].ival); } break; case 559: /* Line 1806 of yacc.c */ #line 4282 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarlines = (yyvsp[(1) - (1)].ival); } break; case 560: /* Line 1806 of yacc.c */ #line 4289 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_drawbarlinew = (yyvsp[(1) - (1)].dval); } break; case 561: /* Line 1806 of yacc.c */ #line 4299 "pars.yacc" { nonl_opts.title = copy_string(nonl_opts.title, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 562: /* Line 1806 of yacc.c */ #line 4303 "pars.yacc" { nonl_opts.formula = copy_string(nonl_opts.formula, (yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 563: /* Line 1806 of yacc.c */ #line 4307 "pars.yacc" { nonl_opts.parnum = (yyvsp[(2) - (3)].ival); } break; case 564: /* Line 1806 of yacc.c */ #line 4310 "pars.yacc" { nonl_opts.tolerance = (yyvsp[(2) - (2)].dval); } break; case 565: /* Line 1806 of yacc.c */ #line 4317 "pars.yacc" { (yyval.ival) = (yyvsp[(1) - (1)].ival); } break; case 566: /* Line 1806 of yacc.c */ #line 4321 "pars.yacc" { (yyval.ival) = (yyvsp[(2) - (2)].ival); } break; case 567: /* Line 1806 of yacc.c */ #line 4328 "pars.yacc" { int gno = (yyvsp[(1) - (3)].ival), setno = (yyvsp[(3) - (3)].ival); if (allocate_set(gno, setno) == RETURN_SUCCESS) { (yyval.trgt) = &trgt_pool[tgtn]; (yyval.trgt)->gno = gno; (yyval.trgt)->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } break; case 568: /* Line 1806 of yacc.c */ #line 4341 "pars.yacc" { int gno = (yyvsp[(1) - (4)].ival), setno = (yyvsp[(4) - (4)].ival); if (allocate_set(gno, setno) == RETURN_SUCCESS) { (yyval.trgt) = &trgt_pool[tgtn]; (yyval.trgt)->gno = gno; (yyval.trgt)->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } break; case 569: /* Line 1806 of yacc.c */ #line 4354 "pars.yacc" { int gno = whichgraph, setno = (yyvsp[(1) - (1)].ival); if (allocate_set(gno, setno) == RETURN_SUCCESS) { (yyval.trgt) = &trgt_pool[tgtn]; (yyval.trgt)->gno = gno; (yyval.trgt)->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } break; case 570: /* Line 1806 of yacc.c */ #line 4367 "pars.yacc" { int gno = whichgraph, setno = (yyvsp[(2) - (2)].ival); if (allocate_set(gno, setno) == RETURN_SUCCESS) { (yyval.trgt) = &trgt_pool[tgtn]; (yyval.trgt)->gno = gno; (yyval.trgt)->setno = setno; tgtn++; } else { errmsg("Can't allocate referred set"); return 1; } } break; case 571: /* Line 1806 of yacc.c */ #line 4382 "pars.yacc" {} break; case 572: /* Line 1806 of yacc.c */ #line 4383 "pars.yacc" {} break; case 573: /* Line 1806 of yacc.c */ #line 4387 "pars.yacc" { naxis = X_AXIS; } break; case 574: /* Line 1806 of yacc.c */ #line 4388 "pars.yacc" { naxis = Y_AXIS; } break; case 575: /* Line 1806 of yacc.c */ #line 4389 "pars.yacc" { naxis = ZX_AXIS; } break; case 576: /* Line 1806 of yacc.c */ #line 4390 "pars.yacc" { naxis = ZY_AXIS; } break; case 577: /* Line 1806 of yacc.c */ #line 4394 "pars.yacc" { (yyval.ival) = CONSTANT; } break; case 578: /* Line 1806 of yacc.c */ #line 4395 "pars.yacc" { (yyval.ival) = UCONSTANT; } break; case 579: /* Line 1806 of yacc.c */ #line 4396 "pars.yacc" { (yyval.ival) = FUNC_I; } break; case 580: /* Line 1806 of yacc.c */ #line 4397 "pars.yacc" { (yyval.ival) = FUNC_D; } break; case 581: /* Line 1806 of yacc.c */ #line 4398 "pars.yacc" { (yyval.ival) = FUNC_ND; } break; case 582: /* Line 1806 of yacc.c */ #line 4399 "pars.yacc" { (yyval.ival) = FUNC_NN; } break; case 583: /* Line 1806 of yacc.c */ #line 4400 "pars.yacc" { (yyval.ival) = FUNC_DD; } break; case 584: /* Line 1806 of yacc.c */ #line 4401 "pars.yacc" { (yyval.ival) = FUNC_NND; } break; case 585: /* Line 1806 of yacc.c */ #line 4402 "pars.yacc" { (yyval.ival) = FUNC_PPD; } break; case 586: /* Line 1806 of yacc.c */ #line 4403 "pars.yacc" { (yyval.ival) = FUNC_PPPD; } break; case 587: /* Line 1806 of yacc.c */ #line 4404 "pars.yacc" { (yyval.ival) = FUNC_PPPPD; } break; case 588: /* Line 1806 of yacc.c */ #line 4405 "pars.yacc" { (yyval.ival) = FUNC_PPPPPD; } break; case 589: /* Line 1806 of yacc.c */ #line 4409 "pars.yacc" { (yyval.ival) = TICKS_SPEC_NONE; } break; case 590: /* Line 1806 of yacc.c */ #line 4410 "pars.yacc" { (yyval.ival) = TICKS_SPEC_MARKS; } break; case 591: /* Line 1806 of yacc.c */ #line 4411 "pars.yacc" { (yyval.ival) = TICKS_SPEC_BOTH; } break; case 592: /* Line 1806 of yacc.c */ #line 4415 "pars.yacc" { (yyval.ival) = FILTER_INPUT; } break; case 593: /* Line 1806 of yacc.c */ #line 4416 "pars.yacc" { (yyval.ival) = FILTER_OUTPUT; } break; case 594: /* Line 1806 of yacc.c */ #line 4420 "pars.yacc" { (yyval.ival) = FILTER_MAGIC; } break; case 595: /* Line 1806 of yacc.c */ #line 4421 "pars.yacc" { (yyval.ival) = FILTER_PATTERN; } break; case 596: /* Line 1806 of yacc.c */ #line 4425 "pars.yacc" { (yyval.ival) = SET_XY; } break; case 597: /* Line 1806 of yacc.c */ #line 4426 "pars.yacc" { (yyval.ival) = SET_BAR; } break; case 598: /* Line 1806 of yacc.c */ #line 4427 "pars.yacc" { (yyval.ival) = SET_BARDY; } break; case 599: /* Line 1806 of yacc.c */ #line 4428 "pars.yacc" { (yyval.ival) = SET_BARDYDY; } break; case 600: /* Line 1806 of yacc.c */ #line 4429 "pars.yacc" { (yyval.ival) = SET_XYZ; } break; case 601: /* Line 1806 of yacc.c */ #line 4430 "pars.yacc" { (yyval.ival) = SET_XYDX; } break; case 602: /* Line 1806 of yacc.c */ #line 4431 "pars.yacc" { (yyval.ival) = SET_XYDY; } break; case 603: /* Line 1806 of yacc.c */ #line 4432 "pars.yacc" { (yyval.ival) = SET_XYDXDX; } break; case 604: /* Line 1806 of yacc.c */ #line 4433 "pars.yacc" { (yyval.ival) = SET_XYDYDY; } break; case 605: /* Line 1806 of yacc.c */ #line 4434 "pars.yacc" { (yyval.ival) = SET_XYDXDY; } break; case 606: /* Line 1806 of yacc.c */ #line 4435 "pars.yacc" { (yyval.ival) = SET_XYDXDXDYDY; } break; case 607: /* Line 1806 of yacc.c */ #line 4436 "pars.yacc" { (yyval.ival) = SET_XYHILO; } break; case 608: /* Line 1806 of yacc.c */ #line 4437 "pars.yacc" { (yyval.ival) = SET_XYR; } break; case 609: /* Line 1806 of yacc.c */ #line 4438 "pars.yacc" { (yyval.ival) = SET_XYSIZE; } break; case 610: /* Line 1806 of yacc.c */ #line 4439 "pars.yacc" { (yyval.ival) = SET_XYCOLOR; } break; case 611: /* Line 1806 of yacc.c */ #line 4440 "pars.yacc" { (yyval.ival) = SET_XYCOLPAT; } break; case 612: /* Line 1806 of yacc.c */ #line 4441 "pars.yacc" { (yyval.ival) = SET_XYVMAP; } break; case 613: /* Line 1806 of yacc.c */ #line 4442 "pars.yacc" { (yyval.ival) = SET_BOXPLOT; } break; case 614: /* Line 1806 of yacc.c */ #line 4443 "pars.yacc" { (yyval.ival) = SET_XY; } break; case 615: /* Line 1806 of yacc.c */ #line 4447 "pars.yacc" { (yyval.ival) = GRAPH_XY; } break; case 616: /* Line 1806 of yacc.c */ #line 4448 "pars.yacc" { (yyval.ival) = GRAPH_CHART; } break; case 617: /* Line 1806 of yacc.c */ #line 4449 "pars.yacc" { (yyval.ival) = GRAPH_POLAR; } break; case 618: /* Line 1806 of yacc.c */ #line 4450 "pars.yacc" { (yyval.ival) = GRAPH_SMITH; } break; case 619: /* Line 1806 of yacc.c */ #line 4451 "pars.yacc" { (yyval.ival) = GRAPH_FIXED; } break; case 620: /* Line 1806 of yacc.c */ #line 4452 "pars.yacc" { (yyval.ival) = GRAPH_PIE; } break; case 621: /* Line 1806 of yacc.c */ #line 4456 "pars.yacc" { (yyval.ival) = PAGE_FREE; } break; case 622: /* Line 1806 of yacc.c */ #line 4457 "pars.yacc" { (yyval.ival) = PAGE_FIXED; } break; case 623: /* Line 1806 of yacc.c */ #line 4461 "pars.yacc" { (yyval.ival) = PAGE_ORIENT_LANDSCAPE; } break; case 624: /* Line 1806 of yacc.c */ #line 4462 "pars.yacc" { (yyval.ival) = PAGE_ORIENT_PORTRAIT; } break; case 625: /* Line 1806 of yacc.c */ #line 4466 "pars.yacc" { (yyval.ival) = REGION_ABOVE; } break; case 626: /* Line 1806 of yacc.c */ #line 4467 "pars.yacc" { (yyval.ival) = REGION_BELOW; } break; case 627: /* Line 1806 of yacc.c */ #line 4468 "pars.yacc" { (yyval.ival) = REGION_TOLEFT; } break; case 628: /* Line 1806 of yacc.c */ #line 4469 "pars.yacc" { (yyval.ival) = REGION_TORIGHT; } break; case 629: /* Line 1806 of yacc.c */ #line 4470 "pars.yacc" { (yyval.ival) = REGION_POLYI; } break; case 630: /* Line 1806 of yacc.c */ #line 4471 "pars.yacc" { (yyval.ival) = REGION_POLYO; } break; case 631: /* Line 1806 of yacc.c */ #line 4472 "pars.yacc" { (yyval.ival) = REGION_HORIZI; } break; case 632: /* Line 1806 of yacc.c */ #line 4473 "pars.yacc" { (yyval.ival) = REGION_VERTI; } break; case 633: /* Line 1806 of yacc.c */ #line 4474 "pars.yacc" { (yyval.ival) = REGION_HORIZO; } break; case 634: /* Line 1806 of yacc.c */ #line 4475 "pars.yacc" { (yyval.ival) = REGION_VERTO; } break; case 635: /* Line 1806 of yacc.c */ #line 4478 "pars.yacc" { (yyval.ival) = SCALE_NORMAL; } break; case 636: /* Line 1806 of yacc.c */ #line 4479 "pars.yacc" { (yyval.ival) = SCALE_LOG; } break; case 637: /* Line 1806 of yacc.c */ #line 4480 "pars.yacc" { (yyval.ival) = SCALE_REC; } break; case 638: /* Line 1806 of yacc.c */ #line 4481 "pars.yacc" { (yyval.ival) = SCALE_LOGIT; } break; case 639: /* Line 1806 of yacc.c */ #line 4484 "pars.yacc" { (yyval.ival) = TRUE; } break; case 640: /* Line 1806 of yacc.c */ #line 4485 "pars.yacc" { (yyval.ival) = FALSE; } break; case 641: /* Line 1806 of yacc.c */ #line 4488 "pars.yacc" { (yyval.ival) = RUN_AVG; } break; case 642: /* Line 1806 of yacc.c */ #line 4489 "pars.yacc" { (yyval.ival) = RUN_STD; } break; case 643: /* Line 1806 of yacc.c */ #line 4490 "pars.yacc" { (yyval.ival) = RUN_MED; } break; case 644: /* Line 1806 of yacc.c */ #line 4491 "pars.yacc" { (yyval.ival) = RUN_MAX; } break; case 645: /* Line 1806 of yacc.c */ #line 4492 "pars.yacc" { (yyval.ival) = RUN_MIN; } break; case 646: /* Line 1806 of yacc.c */ #line 4496 "pars.yacc" { (yyval.ival) = SOURCE_DISK; } break; case 647: /* Line 1806 of yacc.c */ #line 4497 "pars.yacc" { if (!safe_mode) { (yyval.ival) = SOURCE_PIPE; } else { yyerror("Pipe inputs are disabled in safe mode"); (yyval.ival) = SOURCE_DISK; } } break; case 648: /* Line 1806 of yacc.c */ #line 4507 "pars.yacc" { (yyval.ival) = JUST_RIGHT; } break; case 649: /* Line 1806 of yacc.c */ #line 4508 "pars.yacc" { (yyval.ival) = JUST_LEFT; } break; case 650: /* Line 1806 of yacc.c */ #line 4509 "pars.yacc" { (yyval.ival) = JUST_CENTER; } break; case 651: /* Line 1806 of yacc.c */ #line 4512 "pars.yacc" { (yyval.ival) = TICKS_IN; } break; case 652: /* Line 1806 of yacc.c */ #line 4513 "pars.yacc" { (yyval.ival) = TICKS_OUT; } break; case 653: /* Line 1806 of yacc.c */ #line 4514 "pars.yacc" { (yyval.ival) = TICKS_BOTH; } break; case 654: /* Line 1806 of yacc.c */ #line 4517 "pars.yacc" { (yyval.ival) = FORMAT_DECIMAL; } break; case 655: /* Line 1806 of yacc.c */ #line 4518 "pars.yacc" { (yyval.ival) = FORMAT_EXPONENTIAL; } break; case 656: /* Line 1806 of yacc.c */ #line 4519 "pars.yacc" { (yyval.ival) = FORMAT_GENERAL; } break; case 657: /* Line 1806 of yacc.c */ #line 4520 "pars.yacc" { (yyval.ival) = FORMAT_SCIENTIFIC; } break; case 658: /* Line 1806 of yacc.c */ #line 4521 "pars.yacc" { (yyval.ival) = FORMAT_ENGINEERING; } break; case 659: /* Line 1806 of yacc.c */ #line 4522 "pars.yacc" { (yyval.ival) = FORMAT_COMPUTING; } break; case 660: /* Line 1806 of yacc.c */ #line 4523 "pars.yacc" { (yyval.ival) = FORMAT_POWER; } break; case 661: /* Line 1806 of yacc.c */ #line 4524 "pars.yacc" { (yyval.ival) = FORMAT_DDMMYY; } break; case 662: /* Line 1806 of yacc.c */ #line 4525 "pars.yacc" { (yyval.ival) = FORMAT_MMDDYY; } break; case 663: /* Line 1806 of yacc.c */ #line 4526 "pars.yacc" { (yyval.ival) = FORMAT_YYMMDD; } break; case 664: /* Line 1806 of yacc.c */ #line 4527 "pars.yacc" { (yyval.ival) = FORMAT_MMYY; } break; case 665: /* Line 1806 of yacc.c */ #line 4528 "pars.yacc" { (yyval.ival) = FORMAT_MMDD; } break; case 666: /* Line 1806 of yacc.c */ #line 4529 "pars.yacc" { (yyval.ival) = FORMAT_MONTHDAY; } break; case 667: /* Line 1806 of yacc.c */ #line 4530 "pars.yacc" { (yyval.ival) = FORMAT_DAYMONTH; } break; case 668: /* Line 1806 of yacc.c */ #line 4531 "pars.yacc" { (yyval.ival) = FORMAT_MONTHS; } break; case 669: /* Line 1806 of yacc.c */ #line 4532 "pars.yacc" { (yyval.ival) = FORMAT_MONTHSY; } break; case 670: /* Line 1806 of yacc.c */ #line 4533 "pars.yacc" { (yyval.ival) = FORMAT_MONTHL; } break; case 671: /* Line 1806 of yacc.c */ #line 4534 "pars.yacc" { (yyval.ival) = FORMAT_DAYOFWEEKS; } break; case 672: /* Line 1806 of yacc.c */ #line 4535 "pars.yacc" { (yyval.ival) = FORMAT_DAYOFWEEKL; } break; case 673: /* Line 1806 of yacc.c */ #line 4536 "pars.yacc" { (yyval.ival) = FORMAT_DAYOFYEAR; } break; case 674: /* Line 1806 of yacc.c */ #line 4537 "pars.yacc" { (yyval.ival) = FORMAT_HMS; } break; case 675: /* Line 1806 of yacc.c */ #line 4538 "pars.yacc" { (yyval.ival) = FORMAT_MMDDHMS; } break; case 676: /* Line 1806 of yacc.c */ #line 4539 "pars.yacc" { (yyval.ival) = FORMAT_MMDDYYHMS; } break; case 677: /* Line 1806 of yacc.c */ #line 4540 "pars.yacc" { (yyval.ival) = FORMAT_YYMMDDHMS; } break; case 678: /* Line 1806 of yacc.c */ #line 4541 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESLON; } break; case 679: /* Line 1806 of yacc.c */ #line 4542 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESMMLON; } break; case 680: /* Line 1806 of yacc.c */ #line 4543 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESMMSSLON; } break; case 681: /* Line 1806 of yacc.c */ #line 4544 "pars.yacc" { (yyval.ival) = FORMAT_MMSSLON; } break; case 682: /* Line 1806 of yacc.c */ #line 4545 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESLAT; } break; case 683: /* Line 1806 of yacc.c */ #line 4546 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESMMLAT; } break; case 684: /* Line 1806 of yacc.c */ #line 4547 "pars.yacc" { (yyval.ival) = FORMAT_DEGREESMMSSLAT; } break; case 685: /* Line 1806 of yacc.c */ #line 4548 "pars.yacc" { (yyval.ival) = FORMAT_MMSSLAT; } break; case 686: /* Line 1806 of yacc.c */ #line 4551 "pars.yacc" { (yyval.ival) = SIGN_NORMAL; } break; case 687: /* Line 1806 of yacc.c */ #line 4552 "pars.yacc" { (yyval.ival) = SIGN_ABSOLUTE; } break; case 688: /* Line 1806 of yacc.c */ #line 4553 "pars.yacc" { (yyval.ival) = SIGN_NEGATE; } break; case 689: /* Line 1806 of yacc.c */ #line 4556 "pars.yacc" { (yyval.ival) = UP; } break; case 690: /* Line 1806 of yacc.c */ #line 4557 "pars.yacc" { (yyval.ival) = DOWN; } break; case 691: /* Line 1806 of yacc.c */ #line 4558 "pars.yacc" { (yyval.ival) = RIGHT; } break; case 692: /* Line 1806 of yacc.c */ #line 4559 "pars.yacc" { (yyval.ival) = LEFT; } break; case 693: /* Line 1806 of yacc.c */ #line 4560 "pars.yacc" { (yyval.ival) = IN; } break; case 694: /* Line 1806 of yacc.c */ #line 4561 "pars.yacc" { (yyval.ival) = OUT; } break; case 695: /* Line 1806 of yacc.c */ #line 4564 "pars.yacc" { (yyval.ival) = COORD_WORLD; } break; case 696: /* Line 1806 of yacc.c */ #line 4565 "pars.yacc" { (yyval.ival) = COORD_VIEW; } break; case 697: /* Line 1806 of yacc.c */ #line 4568 "pars.yacc" { (yyval.ival) = DATA_X; } break; case 698: /* Line 1806 of yacc.c */ #line 4569 "pars.yacc" { (yyval.ival) = DATA_Y; } break; case 699: /* Line 1806 of yacc.c */ #line 4570 "pars.yacc" { (yyval.ival) = DATA_X; } break; case 700: /* Line 1806 of yacc.c */ #line 4571 "pars.yacc" { (yyval.ival) = DATA_Y; } break; case 701: /* Line 1806 of yacc.c */ #line 4572 "pars.yacc" { (yyval.ival) = DATA_Y1; } break; case 702: /* Line 1806 of yacc.c */ #line 4573 "pars.yacc" { (yyval.ival) = DATA_Y2; } break; case 703: /* Line 1806 of yacc.c */ #line 4574 "pars.yacc" { (yyval.ival) = DATA_Y3; } break; case 704: /* Line 1806 of yacc.c */ #line 4575 "pars.yacc" { (yyval.ival) = DATA_Y4; } break; case 705: /* Line 1806 of yacc.c */ #line 4578 "pars.yacc" { (yyval.ival) = ASCENDING; } break; case 706: /* Line 1806 of yacc.c */ #line 4579 "pars.yacc" { (yyval.ival) = DESCENDING; } break; case 707: /* Line 1806 of yacc.c */ #line 4582 "pars.yacc" { (yyval.ival) = DATA_X; } break; case 708: /* Line 1806 of yacc.c */ #line 4583 "pars.yacc" { (yyval.ival) = DATA_Y; } break; case 709: /* Line 1806 of yacc.c */ #line 4586 "pars.yacc" { (yyval.ival) = FFT_DFT; } break; case 710: /* Line 1806 of yacc.c */ #line 4587 "pars.yacc" { (yyval.ival) = FFT_FFT; } break; case 711: /* Line 1806 of yacc.c */ #line 4588 "pars.yacc" { (yyval.ival) = FFT_INVDFT; } break; case 712: /* Line 1806 of yacc.c */ #line 4589 "pars.yacc" { (yyval.ival) = FFT_INVFFT; } break; case 713: /* Line 1806 of yacc.c */ #line 4593 "pars.yacc" {(yyval.ival)=0;} break; case 714: /* Line 1806 of yacc.c */ #line 4594 "pars.yacc" {(yyval.ival)=1;} break; case 715: /* Line 1806 of yacc.c */ #line 4598 "pars.yacc" {(yyval.ival)=0;} break; case 716: /* Line 1806 of yacc.c */ #line 4599 "pars.yacc" {(yyval.ival)=1;} break; case 717: /* Line 1806 of yacc.c */ #line 4600 "pars.yacc" {(yyval.ival)=2;} break; case 718: /* Line 1806 of yacc.c */ #line 4604 "pars.yacc" {(yyval.ival)=0;} break; case 719: /* Line 1806 of yacc.c */ #line 4605 "pars.yacc" {(yyval.ival)=1;} break; case 720: /* Line 1806 of yacc.c */ #line 4606 "pars.yacc" {(yyval.ival)=2;} break; case 721: /* Line 1806 of yacc.c */ #line 4610 "pars.yacc" {(yyval.ival)=0;} break; case 722: /* Line 1806 of yacc.c */ #line 4611 "pars.yacc" {(yyval.ival)=1;} break; case 723: /* Line 1806 of yacc.c */ #line 4612 "pars.yacc" {(yyval.ival)=2;} break; case 724: /* Line 1806 of yacc.c */ #line 4613 "pars.yacc" {(yyval.ival)=3;} break; case 725: /* Line 1806 of yacc.c */ #line 4614 "pars.yacc" {(yyval.ival)=4;} break; case 726: /* Line 1806 of yacc.c */ #line 4615 "pars.yacc" {(yyval.ival)=5;} break; case 727: /* Line 1806 of yacc.c */ #line 4616 "pars.yacc" {(yyval.ival)=6;} break; case 728: /* Line 1806 of yacc.c */ #line 4620 "pars.yacc" { (yyval.ival) = INTERP_LINEAR; } break; case 729: /* Line 1806 of yacc.c */ #line 4621 "pars.yacc" { (yyval.ival) = INTERP_SPLINE; } break; case 730: /* Line 1806 of yacc.c */ #line 4622 "pars.yacc" { (yyval.ival) = INTERP_ASPLINE; } break; case 731: /* Line 1806 of yacc.c */ #line 4625 "pars.yacc" { (yyval.ival) = MINP; } break; case 732: /* Line 1806 of yacc.c */ #line 4626 "pars.yacc" { (yyval.ival) = MAXP; } break; case 733: /* Line 1806 of yacc.c */ #line 4627 "pars.yacc" { (yyval.ival) = AVG; } break; case 734: /* Line 1806 of yacc.c */ #line 4628 "pars.yacc" { (yyval.ival) = SD; } break; case 735: /* Line 1806 of yacc.c */ #line 4629 "pars.yacc" { (yyval.ival) = SUM; } break; case 736: /* Line 1806 of yacc.c */ #line 4630 "pars.yacc" { (yyval.ival) = IMIN; } break; case 737: /* Line 1806 of yacc.c */ #line 4631 "pars.yacc" { (yyval.ival) = IMAX; } break; case 738: /* Line 1806 of yacc.c */ #line 4636 "pars.yacc" { (yyval.ival) = get_mapped_font((yyvsp[(2) - (2)].ival)); } break; case 739: /* Line 1806 of yacc.c */ #line 4640 "pars.yacc" { (yyval.ival) = get_font_by_name((yyvsp[(2) - (2)].sval)); xfree((yyvsp[(2) - (2)].sval)); } break; case 740: /* Line 1806 of yacc.c */ #line 4648 "pars.yacc" { int lines = (yyvsp[(2) - (2)].ival); if (lines >= 0 && lines < number_of_linestyles()) { (yyval.ival) = lines; } else { errmsg("invalid linestyle"); (yyval.ival) = 1; } } break; case 741: /* Line 1806 of yacc.c */ #line 4661 "pars.yacc" { int patno = (yyvsp[(2) - (2)].ival); if (patno >= 0 && patno < number_of_patterns()) { (yyval.ival) = patno; } else { errmsg("invalid pattern number"); (yyval.ival) = 1; } } break; case 742: /* Line 1806 of yacc.c */ #line 4674 "pars.yacc" { int c = (yyvsp[(2) - (2)].ival); if (c >= 0 && c < number_of_colors()) { (yyval.ival) = c; } else { errmsg("Invalid color ID"); (yyval.ival) = 1; } } break; case 743: /* Line 1806 of yacc.c */ #line 4684 "pars.yacc" { int c = get_color_by_name((yyvsp[(2) - (2)].sval)); if (c == BAD_COLOR) { errmsg("Invalid color name"); c = 1; } xfree((yyvsp[(2) - (2)].sval)); (yyval.ival) = c; } break; case 744: /* Line 1806 of yacc.c */ #line 4694 "pars.yacc" { int c; CMap_entry cmap; cmap.rgb.red = (yyvsp[(3) - (8)].ival); cmap.rgb.green = (yyvsp[(5) - (8)].ival); cmap.rgb.blue = (yyvsp[(7) - (8)].ival); cmap.ctype = COLOR_MAIN; cmap.cname = NULL; c = add_color(cmap); if (c == BAD_COLOR) { errmsg("Can't allocate requested color"); c = 1; } (yyval.ival) = c; } break; case 745: /* Line 1806 of yacc.c */ #line 4713 "pars.yacc" { double linew; linew = (yyvsp[(2) - (2)].dval); if (linew < 0.0) { yyerror("Negative linewidth"); linew = 0.0; } else if (linew > MAX_LINEWIDTH) { yyerror("Linewidth too large"); linew = MAX_LINEWIDTH; } (yyval.dval) = linew; } break; case 746: /* Line 1806 of yacc.c */ #line 4728 "pars.yacc" { (yyval.ival) = (yyvsp[(2) - (2)].ival); } break; case 747: /* Line 1806 of yacc.c */ #line 4733 "pars.yacc" { (yyval.ival) = PLACEMENT_NORMAL; } break; case 748: /* Line 1806 of yacc.c */ #line 4734 "pars.yacc" { (yyval.ival) = PLACEMENT_OPPOSITE; } break; case 749: /* Line 1806 of yacc.c */ #line 4735 "pars.yacc" { (yyval.ival) = PLACEMENT_BOTH; } break; case 750: /* Line 1806 of yacc.c */ #line 4741 "pars.yacc" { int wpp, hpp; if ((yyvsp[(3) - (3)].ival) == PAGE_ORIENT_LANDSCAPE) { wpp = 792; hpp = 612; } else { wpp = 612; hpp = 792; } set_page_dimensions(wpp, hpp, FALSE); } break; case 751: /* Line 1806 of yacc.c */ #line 4752 "pars.yacc" { set_page_dimensions((int) (yyvsp[(3) - (4)].dval), (int) (yyvsp[(4) - (4)].dval), FALSE); } break; case 752: /* Line 1806 of yacc.c */ #line 4755 "pars.yacc" { scroll_proc((yyvsp[(2) - (2)].ival)); } break; case 753: /* Line 1806 of yacc.c */ #line 4758 "pars.yacc" { scrollinout_proc((yyvsp[(3) - (3)].ival)); } break; case 754: /* Line 1806 of yacc.c */ #line 4762 "pars.yacc" { } break; case 755: /* Line 1806 of yacc.c */ #line 4766 "pars.yacc" { add_world(whichgraph, (yyvsp[(3) - (17)].dval), (yyvsp[(5) - (17)].dval), (yyvsp[(7) - (17)].dval), (yyvsp[(9) - (17)].dval)); } break; case 756: /* Line 1806 of yacc.c */ #line 4770 "pars.yacc" {filltype_obs = (yyvsp[(3) - (3)].ival);} break; case 757: /* Line 1806 of yacc.c */ #line 4772 "pars.yacc" {filltype_obs = (yyvsp[(3) - (3)].ival);} break; case 758: /* Line 1806 of yacc.c */ #line 4774 "pars.yacc" { } break; case 759: /* Line 1806 of yacc.c */ #line 4776 "pars.yacc" { } break; case 760: /* Line 1806 of yacc.c */ #line 4778 "pars.yacc" { } break; case 761: /* Line 1806 of yacc.c */ #line 4779 "pars.yacc" { } break; case 762: /* Line 1806 of yacc.c */ #line 4781 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } if ((yyvsp[(3) - (3)].ival) == FALSE && get_project_version() <= 40102) { g[whichgraph].l.boxpen.pattern = 0; } } break; case 763: /* Line 1806 of yacc.c */ #line 4790 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legx = (yyvsp[(3) - (3)].dval); } break; case 764: /* Line 1806 of yacc.c */ #line 4797 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].l.legy = (yyvsp[(3) - (3)].dval); } break; case 765: /* Line 1806 of yacc.c */ #line 4804 "pars.yacc" { if (is_valid_setno(whichgraph, (yyvsp[(3) - (4)].ival))) { strncpy(g[whichgraph].p[(yyvsp[(3) - (4)].ival)].lstr, (yyvsp[(4) - (4)].sval), MAX_STRING_LENGTH - 1); } else { yyerror("Unallocated set"); } xfree((yyvsp[(4) - (4)].sval)); } break; case 766: /* Line 1806 of yacc.c */ #line 4812 "pars.yacc" { } break; case 767: /* Line 1806 of yacc.c */ #line 4813 "pars.yacc" {filltype_obs = (yyvsp[(5) - (5)].ival);} break; case 768: /* Line 1806 of yacc.c */ #line 4814 "pars.yacc" { } break; case 769: /* Line 1806 of yacc.c */ #line 4815 "pars.yacc" { } break; case 770: /* Line 1806 of yacc.c */ #line 4817 "pars.yacc" { } break; case 771: /* Line 1806 of yacc.c */ #line 4819 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_XY; g[(yyvsp[(1) - (3)].ival)].xscale = SCALE_LOG; } break; case 772: /* Line 1806 of yacc.c */ #line 4823 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_XY; g[(yyvsp[(1) - (3)].ival)].yscale = SCALE_LOG; } break; case 773: /* Line 1806 of yacc.c */ #line 4828 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_XY; g[(yyvsp[(1) - (3)].ival)].xscale = SCALE_LOG; g[(yyvsp[(1) - (3)].ival)].yscale = SCALE_LOG; } break; case 774: /* Line 1806 of yacc.c */ #line 4834 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_CHART; g[(yyvsp[(1) - (3)].ival)].xyflip = FALSE; g[(yyvsp[(1) - (3)].ival)].stacked = FALSE; } break; case 775: /* Line 1806 of yacc.c */ #line 4840 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_CHART; g[(yyvsp[(1) - (3)].ival)].xyflip = TRUE; } break; case 776: /* Line 1806 of yacc.c */ #line 4845 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_CHART; g[(yyvsp[(1) - (3)].ival)].stacked = TRUE; } break; case 777: /* Line 1806 of yacc.c */ #line 4850 "pars.yacc" { g[(yyvsp[(1) - (3)].ival)].type = GRAPH_CHART; g[(yyvsp[(1) - (3)].ival)].stacked = TRUE; g[(yyvsp[(1) - (3)].ival)].xyflip = TRUE; } break; case 778: /* Line 1806 of yacc.c */ #line 4856 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg1 = (yyvsp[(3) - (3)].dval); } break; case 779: /* Line 1806 of yacc.c */ #line 4863 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.xg2 = (yyvsp[(3) - (3)].dval); } break; case 780: /* Line 1806 of yacc.c */ #line 4870 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.yg1 = (yyvsp[(3) - (3)].dval); } break; case 781: /* Line 1806 of yacc.c */ #line 4877 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].w.yg2 = (yyvsp[(3) - (3)].dval); } break; case 782: /* Line 1806 of yacc.c */ #line 4885 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv1 = (yyvsp[(3) - (3)].dval); } break; case 783: /* Line 1806 of yacc.c */ #line 4892 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.xv2 = (yyvsp[(3) - (3)].dval); } break; case 784: /* Line 1806 of yacc.c */ #line 4899 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.yv1 = (yyvsp[(3) - (3)].dval); } break; case 785: /* Line 1806 of yacc.c */ #line 4906 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].v.yv2 = (yyvsp[(3) - (3)].dval); } break; case 786: /* Line 1806 of yacc.c */ #line 4914 "pars.yacc" { } break; case 787: /* Line 1806 of yacc.c */ #line 4917 "pars.yacc" { if (!is_valid_gno(whichgraph)) { yyerror("No valid graph selected"); return 1; } g[whichgraph].f.fillpen.pattern = (yyvsp[(3) - (3)].ival); } break; case 788: /* Line 1806 of yacc.c */ #line 4925 "pars.yacc" { } break; case 789: /* Line 1806 of yacc.c */ #line 4927 "pars.yacc" { } break; case 790: /* Line 1806 of yacc.c */ #line 4930 "pars.yacc" { line_asize = 2.0*(yyvsp[(4) - (4)].dval); } break; case 791: /* Line 1806 of yacc.c */ #line 4934 "pars.yacc" { } break; case 792: /* Line 1806 of yacc.c */ #line 4935 "pars.yacc" { } break; case 793: /* Line 1806 of yacc.c */ #line 4936 "pars.yacc" { } break; case 794: /* Line 1806 of yacc.c */ #line 4937 "pars.yacc" { } break; case 795: /* Line 1806 of yacc.c */ #line 4942 "pars.yacc" { } break; case 796: /* Line 1806 of yacc.c */ #line 4943 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->label_op = (yyvsp[(1) - (1)].ival); } break; case 797: /* Line 1806 of yacc.c */ #line 4953 "pars.yacc" { switch ((yyvsp[(4) - (4)].ival)){ case 0: g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.pattern = 0; break; case 1: g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.pattern = 1; break; case 2: g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.pattern = 1; g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].symfillpen.color = getbgcolor(); break; } } break; case 798: /* Line 1806 of yacc.c */ #line 4968 "pars.yacc" { g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].symskip = (yyvsp[(3) - (3)].ival); } break; case 799: /* Line 1806 of yacc.c */ #line 4972 "pars.yacc" { switch ((yyvsp[(3) - (3)].ival)) { case 0: g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].filltype = SETFILL_NONE; break; case 1: g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].filltype = SETFILL_POLYGON; break; case 2: g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].filltype = SETFILL_BASELINE; g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].baseline_type = BASELINE_TYPE_0; break; case 6: g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].filltype = SETFILL_BASELINE; g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].baseline_type = BASELINE_TYPE_GMIN; break; case 7: g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].filltype = SETFILL_BASELINE; g[(yyvsp[(1) - (3)].trgt)->gno].p[(yyvsp[(1) - (3)].trgt)->setno].baseline_type = BASELINE_TYPE_GMAX; break; } } break; case 800: /* Line 1806 of yacc.c */ #line 4994 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].errbar.ptype = (yyvsp[(4) - (4)].ival); } break; case 801: /* Line 1806 of yacc.c */ #line 5002 "pars.yacc" { } break; case 802: /* Line 1806 of yacc.c */ #line 5003 "pars.yacc" { g[(yyvsp[(1) - (2)].trgt)->gno].p[(yyvsp[(1) - (2)].trgt)->setno].lines = (yyvsp[(2) - (2)].ival); } break; case 803: /* Line 1806 of yacc.c */ #line 5006 "pars.yacc" { g[(yyvsp[(1) - (2)].trgt)->gno].p[(yyvsp[(1) - (2)].trgt)->setno].linew = (yyvsp[(2) - (2)].dval); } break; case 804: /* Line 1806 of yacc.c */ #line 5009 "pars.yacc" { g[(yyvsp[(1) - (2)].trgt)->gno].p[(yyvsp[(1) - (2)].trgt)->setno].linepen.color = (yyvsp[(2) - (2)].ival); } break; case 805: /* Line 1806 of yacc.c */ #line 5012 "pars.yacc" {filltype_obs = (yyvsp[(4) - (4)].ival);} break; case 806: /* Line 1806 of yacc.c */ #line 5013 "pars.yacc" { } break; case 807: /* Line 1806 of yacc.c */ #line 5014 "pars.yacc" { g[(yyvsp[(1) - (4)].trgt)->gno].p[(yyvsp[(1) - (4)].trgt)->setno].errbar.barsize = (yyvsp[(4) - (4)].dval); } break; case 808: /* Line 1806 of yacc.c */ #line 5017 "pars.yacc" { } break; case 809: /* Line 1806 of yacc.c */ #line 5022 "pars.yacc" { /* <= xmgr-4.1 */ if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->active = (yyvsp[(2) - (2)].ival); } break; case 810: /* Line 1806 of yacc.c */ #line 5030 "pars.yacc" { } break; case 811: /* Line 1806 of yacc.c */ #line 5031 "pars.yacc" { } break; case 812: /* Line 1806 of yacc.c */ #line 5032 "pars.yacc" { } break; case 813: /* Line 1806 of yacc.c */ #line 5033 "pars.yacc" { } break; case 814: /* Line 1806 of yacc.c */ #line 5034 "pars.yacc" { } break; case 815: /* Line 1806 of yacc.c */ #line 5035 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_NONE; } break; case 816: /* Line 1806 of yacc.c */ #line 5042 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if (g[whichgraph].t[naxis]->t_spec != TICKS_SPEC_BOTH) { g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS; } } break; case 817: /* Line 1806 of yacc.c */ #line 5051 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if ((yyvsp[(2) - (2)].dval) != 0.0) { g[whichgraph].t[naxis]->nminor = (int) rint(g[whichgraph].t[naxis]->tmajor / (yyvsp[(2) - (2)].dval) - 1); } else { g[whichgraph].t[naxis]->nminor = 0; } } break; case 818: /* Line 1806 of yacc.c */ #line 5063 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->props.size = (yyvsp[(2) - (2)].dval); } break; case 819: /* Line 1806 of yacc.c */ #line 5070 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tloc[(yyvsp[(1) - (3)].ival)].wtpos = (yyvsp[(3) - (3)].dval); g[whichgraph].t[naxis]->tloc[(yyvsp[(1) - (3)].ival)].type = TICK_TYPE_MAJOR; } break; case 820: /* Line 1806 of yacc.c */ #line 5078 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_op = (yyvsp[(1) - (1)].ival); } break; case 821: /* Line 1806 of yacc.c */ #line 5088 "pars.yacc" { } break; case 822: /* Line 1806 of yacc.c */ #line 5089 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } if (g[whichgraph].t[naxis]->t_spec == TICKS_SPEC_BOTH) { g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_MARKS; } } break; case 823: /* Line 1806 of yacc.c */ #line 5098 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->t_spec = TICKS_SPEC_BOTH; } break; case 824: /* Line 1806 of yacc.c */ #line 5105 "pars.yacc" { } break; case 825: /* Line 1806 of yacc.c */ #line 5107 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = 0; } break; case 826: /* Line 1806 of yacc.c */ #line 5114 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_angle = 90; } break; case 827: /* Line 1806 of yacc.c */ #line 5121 "pars.yacc" { } break; case 828: /* Line 1806 of yacc.c */ #line 5122 "pars.yacc" { } break; case 829: /* Line 1806 of yacc.c */ #line 5123 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } g[whichgraph].t[naxis]->tl_op = (yyvsp[(1) - (1)].ival); } break; case 830: /* Line 1806 of yacc.c */ #line 5130 "pars.yacc" { if (!is_valid_axis(whichgraph, naxis)) { yyerror("No valid axis selected"); return 1; } switch((yyvsp[(2) - (2)].ival)) { case SIGN_NEGATE: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, "-$t"); break; case SIGN_ABSOLUTE: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, "abs($t)"); break; default: g[whichgraph].t[naxis]->tl_formula = copy_string(g[whichgraph].t[naxis]->tl_formula, NULL); break; } } break; case 834: /* Line 1806 of yacc.c */ #line 5158 "pars.yacc" { (yyval.ival) = (yyvsp[(2) - (2)].ival); } break; case 835: /* Line 1806 of yacc.c */ #line 5163 "pars.yacc" { (yyval.ival) = PLACEMENT_OPPOSITE; } break; case 836: /* Line 1806 of yacc.c */ #line 5164 "pars.yacc" { (yyval.ival) = PLACEMENT_NORMAL; } break; case 837: /* Line 1806 of yacc.c */ #line 5165 "pars.yacc" { (yyval.ival) = PLACEMENT_NORMAL; } break; case 838: /* Line 1806 of yacc.c */ #line 5166 "pars.yacc" { (yyval.ival) = PLACEMENT_OPPOSITE; } break; case 839: /* Line 1806 of yacc.c */ #line 5167 "pars.yacc" { (yyval.ival) = PLACEMENT_BOTH; } break; /* Line 1806 of yacc.c */ #line 15024 "y.tab.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined(yyoverflow) || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } /* Line 2067 of yacc.c */ #line 5170 "pars.yacc" /* list of intrinsic functions and keywords */ symtab_entry ikey[] = { {"A0", FITPARM, NULL}, {"A0MAX", FITPMAX, NULL}, {"A0MIN", FITPMIN, NULL}, {"A1", FITPARM, NULL}, {"A1MAX", FITPMAX, NULL}, {"A1MIN", FITPMIN, NULL}, {"A2", FITPARM, NULL}, {"A2MAX", FITPMAX, NULL}, {"A2MIN", FITPMIN, NULL}, {"A3", FITPARM, NULL}, {"A3MAX", FITPMAX, NULL}, {"A3MIN", FITPMIN, NULL}, {"A4", FITPARM, NULL}, {"A4MAX", FITPMAX, NULL}, {"A4MIN", FITPMIN, NULL}, {"A5", FITPARM, NULL}, {"A5MAX", FITPMAX, NULL}, {"A5MIN", FITPMIN, NULL}, {"A6", FITPARM, NULL}, {"A6MAX", FITPMAX, NULL}, {"A6MIN", FITPMIN, NULL}, {"A7", FITPARM, NULL}, {"A7MAX", FITPMAX, NULL}, {"A7MIN", FITPMIN, NULL}, {"A8", FITPARM, NULL}, {"A8MAX", FITPMAX, NULL}, {"A8MIN", FITPMIN, NULL}, {"A9", FITPARM, NULL}, {"A9MAX", FITPMAX, NULL}, {"A9MIN", FITPMIN, NULL}, {"ABOVE", ABOVE, NULL}, {"ABS", FUNC_D, (void *) fabs}, {"ABSOLUTE", ABSOLUTE, NULL}, {"ACOS", FUNC_D, (void *) acos}, {"ACOSH", FUNC_D, (void *) acosh}, {"AI", FUNC_D, (void *) ai_wrap}, {"ALIAS", ALIAS, NULL}, {"ALT", ALT, NULL}, {"ALTXAXIS", ALTXAXIS, NULL}, {"ALTYAXIS", ALTYAXIS, NULL}, {"AND", AND, NULL}, {"ANGLE", ANGLE, NULL}, {"ANTIALIASING", ANTIALIASING, NULL}, {"APPEND", APPEND, NULL}, {"ARRANGE", ARRANGE, NULL}, {"ARROW", ARROW, NULL}, {"ASCENDING", ASCENDING, NULL}, {"ASIN", FUNC_D, (void *) asin}, {"ASINH", FUNC_D, (void *) asinh}, {"ASPLINE", ASPLINE, NULL}, {"ATAN", FUNC_D, (void *) atan}, {"ATAN2", FUNC_DD, (void *) atan2}, {"ATANH", FUNC_D, (void *) atanh}, {"AUTO", AUTO, NULL}, {"AUTOSCALE", AUTOSCALE, NULL}, {"AUTOTICKS", AUTOTICKS, NULL}, {"AVALUE", AVALUE, NULL}, {"AVG", AVG, NULL}, {"BACKGROUND", BACKGROUND, NULL}, {"BAR", BAR, NULL}, {"BARDY", BARDY, NULL}, {"BARDYDY", BARDYDY, NULL}, {"BASELINE", BASELINE, NULL}, {"BATCH", BATCH, NULL}, {"BEGIN", BEGIN, NULL}, {"BELOW", BELOW, NULL}, {"BETA", FUNC_DD, (void *) beta}, {"BETWEEN", BETWEEN, NULL}, {"BI", FUNC_D, (void *) bi_wrap}, {"BLACKMAN", BLACKMAN, NULL}, {"BLOCK", BLOCK, NULL}, {"BOTH", BOTH, NULL}, {"BOTTOM", BOTTOM, NULL}, {"BOX", BOX, NULL}, {"CD", CD, NULL}, {"CEIL", FUNC_D, (void *) ceil}, {"CENTER", CENTER, NULL}, {"CHAR", CHAR, NULL}, {"CHART", CHART, NULL}, {"CHDTR", FUNC_DD, (void *) chdtr}, {"CHDTRC", FUNC_DD, (void *) chdtrc}, {"CHDTRI", FUNC_DD, (void *) chdtri}, {"CHI", FUNC_D, (void *) chi_wrap}, {"CI", FUNC_D, (void *) ci_wrap}, {"CLEAR", CLEAR, NULL}, {"CLICK", CLICK, NULL}, {"CLIP", CLIP, NULL}, {"CLOSE", CLOSE, NULL}, {"COEFFICIENTS", COEFFICIENTS, NULL}, {"COLOR", COLOR, NULL}, {"COMMENT", COMMENT, NULL}, {"COMPLEX", COMPLEX, NULL}, {"COMPUTING", COMPUTING, NULL}, {"CONST", KEY_CONST, NULL}, {"CONSTRAINTS", CONSTRAINTS, NULL}, {"COPY", COPY, NULL}, {"COS", FUNC_D, (void *) cos}, {"COSH", FUNC_D, (void *) cosh}, {"CYCLE", CYCLE, NULL}, {"DATE", DATE, NULL}, {"DAWSN", FUNC_D, (void *) dawsn}, {"DAYMONTH", DAYMONTH, NULL}, {"DAYOFWEEKL", DAYOFWEEKL, NULL}, {"DAYOFWEEKS", DAYOFWEEKS, NULL}, {"DAYOFYEAR", DAYOFYEAR, NULL}, {"DDMMYY", DDMMYY, NULL}, {"DECIMAL", DECIMAL, NULL}, {"DEF", DEF, NULL}, {"DEFAULT", DEFAULT, NULL}, {"DEFINE", DEFINE, NULL}, {"DEG", UCONSTANT, (void *) deg_uconst}, {"DEGREESLAT", DEGREESLAT, NULL}, {"DEGREESLON", DEGREESLON, NULL}, {"DEGREESMMLAT", DEGREESMMLAT, NULL}, {"DEGREESMMLON", DEGREESMMLON, NULL}, {"DEGREESMMSSLAT", DEGREESMMSSLAT, NULL}, {"DEGREESMMSSLON", DEGREESMMSSLON, NULL}, {"DESCENDING", DESCENDING, NULL}, {"DESCRIPTION", DESCRIPTION, NULL}, {"DEVICE", DEVICE, NULL}, {"DFT", DFT, NULL}, {"DIFF", DIFFERENCE, NULL}, {"DIFFERENCE", DIFFERENCE, NULL}, {"DISK", DISK, NULL}, {"DOWN", DOWN, NULL}, {"DPI", DPI, NULL}, {"DROP", DROP, NULL}, {"DROPLINE", DROPLINE, NULL}, {"ECHO", ECHO, NULL}, {"ELLIE", FUNC_DD, (void *) ellie}, {"ELLIK", FUNC_DD, (void *) ellik}, {"ELLIPSE", ELLIPSE, NULL}, {"ELLPE", FUNC_D, (void *) ellpe_wrap}, {"ELLPK", FUNC_D, (void *) ellpk_wrap}, {"ENGINEERING", ENGINEERING, NULL}, {"EQ", EQ, NULL}, {"ER", ERRORBAR, NULL}, {"ERF", FUNC_D, (void *) erf}, {"ERFC", FUNC_D, (void *) erfc}, {"ERRORBAR", ERRORBAR, NULL}, {"EXIT", EXIT, NULL}, {"EXP", FUNC_D, (void *) exp}, {"EXPN", FUNC_ND, (void *) expn}, {"EXPONENTIAL", EXPONENTIAL, NULL}, {"FAC", FUNC_I, (void *) fac}, {"FALSE", OFF, NULL}, {"FDTR", FUNC_NND, (void *) fdtr}, {"FDTRC", FUNC_NND, (void *) fdtrc}, {"FDTRI", FUNC_NND, (void *) fdtri}, {"FFT", FFT, NULL}, {"FILE", FILEP, NULL}, {"FILL", FILL, NULL}, {"FIT", FIT, NULL}, {"FIXED", FIXED, NULL}, {"FIXEDPOINT", FIXEDPOINT, NULL}, {"FLOOR", FUNC_D, (void *) floor}, {"FLUSH", FLUSH, NULL}, {"FOCUS", FOCUS, NULL}, {"FOLLOWS", FOLLOWS, NULL}, {"FONT", FONTP, NULL}, {"FORCE", FORCE, NULL}, {"FORMAT", FORMAT, NULL}, {"FORMULA", FORMULA, NULL}, {"FRAME", FRAMEP, NULL}, {"FREE", FREE, NULL}, {"FREQUENCY", FREQUENCY, NULL}, {"FRESNLC", FUNC_D, (void *) fresnlc_wrap}, {"FRESNLS", FUNC_D, (void *) fresnls_wrap}, {"FROM", FROM, NULL}, {"F_OF_D", KEY_FUNC_D, NULL}, {"F_OF_DD", KEY_FUNC_DD, NULL}, {"F_OF_I", KEY_FUNC_I, NULL}, {"F_OF_ND", KEY_FUNC_ND, NULL}, {"F_OF_NN", KEY_FUNC_NN, NULL}, {"F_OF_NND", KEY_FUNC_NND, NULL}, {"F_OF_PPD", KEY_FUNC_PPD, NULL}, {"F_OF_PPPD", KEY_FUNC_PPPD, NULL}, {"F_OF_PPPPD", KEY_FUNC_PPPPD, NULL}, {"F_OF_PPPPPD", KEY_FUNC_PPPPPD, NULL}, {"GAMMA", FUNC_D, (void *) true_gamma}, {"GDTR", FUNC_PPD, (void *) gdtr}, {"GDTRC", FUNC_PPD, (void *) gdtrc}, {"GE", GE, NULL}, {"GENERAL", GENERAL, NULL}, {"GETP", GETP, NULL}, {"GRAPH", GRAPH, NULL}, {"GRID", GRID, NULL}, {"GT", GT, NULL}, {"HAMMING", HAMMING, NULL}, {"HANNING", HANNING, NULL}, {"HARDCOPY", HARDCOPY, NULL}, {"HBAR", HBAR, NULL}, {"HELP", HELP, NULL}, {"HGAP", HGAP, NULL}, {"HIDDEN", HIDDEN, NULL}, {"HISTOGRAM", HISTOGRAM, NULL}, {"HMS", HMS, NULL}, {"HORIZI", HORIZI, NULL}, {"HORIZO", HORIZO, NULL}, {"HORIZONTAL", HORIZONTAL, NULL}, {"HYP2F1", FUNC_PPPD, (void *) hyp2f1}, {"HYPERG", FUNC_PPD, (void *) hyperg}, {"HYPOT", FUNC_DD, (void *) hypot}, {"I0E", FUNC_D, (void *) i0e}, {"I1E", FUNC_D, (void *) i1e}, {"ID", ID, NULL}, {"IFILTER", IFILTER, NULL}, {"IGAM", FUNC_DD, (void *) igam}, {"IGAMC", FUNC_DD, (void *) igamc}, {"IGAMI", FUNC_DD, (void *) igami}, {"IMAX", IMAX, NULL}, {"IMIN", IMIN, NULL}, {"IN", IN, NULL}, {"INCBET", FUNC_PPD, (void *) incbet}, {"INCBI", FUNC_PPD, (void *) incbi}, {"INCREMENT", INCREMENT, NULL}, {"INDEX", INDEX, NULL}, {"INOUT", INOUT, NULL}, {"INT", INT, NULL}, {"INTEGRATE", INTEGRATE, NULL}, {"INTERPOLATE", INTERPOLATE, NULL}, {"INVDFT", INVDFT, NULL}, {"INVERT", INVERT, NULL}, {"INVFFT", INVFFT, NULL}, {"IRAND", FUNC_I, (void *) irand_wrap}, {"IV", FUNC_DD, (void *) iv_wrap}, {"JUST", JUST, NULL}, {"JV", FUNC_DD, (void *) jv_wrap}, {"K0E", FUNC_D, (void *) k0e}, {"K1E", FUNC_D, (void *) k1e}, {"KILL", KILL, NULL}, {"KN", FUNC_ND, (void *) kn_wrap}, {"LABEL", LABEL, NULL}, {"LANDSCAPE", LANDSCAPE, NULL}, {"LAYOUT", LAYOUT, NULL}, {"LBETA", FUNC_DD, (void *) lbeta}, {"LE", LE, NULL}, {"LEFT", LEFT, NULL}, {"LEGEND", LEGEND, NULL}, {"LENGTH", LENGTH, NULL}, {"LGAMMA", FUNC_D, (void *) lgamma}, {"LINCONV", LINCONV, NULL}, {"LINE", LINE, NULL}, {"LINEAR", LINEAR, NULL}, {"LINESTYLE", LINESTYLE, NULL}, {"LINEWIDTH", LINEWIDTH, NULL}, {"LINK", LINK, NULL}, {"LN", FUNC_D, (void *) log}, {"LOAD", LOAD, NULL}, {"LOCTYPE", LOCTYPE, NULL}, {"LOG", LOG, NULL}, {"LOG10", FUNC_D, (void *) log10}, {"LOG2", FUNC_D, (void *) log2}, {"LOGARITHMIC", LOGARITHMIC, NULL}, {"LOGX", LOGX, NULL}, {"LOGXY", LOGXY, NULL}, {"LOGY", LOGY, NULL}, {"LOGIT", LOGIT, NULL}, {"LT", LT, NULL}, {"MAGIC", MAGIC, NULL}, {"MAGNITUDE", MAGNITUDE, NULL}, {"MAJOR", MAJOR, NULL}, {"MAP", MAP, NULL}, {"MAX", MAXP, NULL}, {"MAXOF", FUNC_DD, (void *) max_wrap}, {"MESH", MESH, NULL}, {"MIN", MINP, NULL}, {"MINOF", FUNC_DD, (void *) min_wrap}, {"MINOR", MINOR, NULL}, {"MMDD", MMDD, NULL}, {"MMDDHMS", MMDDHMS, NULL}, {"MMDDYY", MMDDYY, NULL}, {"MMDDYYHMS", MMDDYYHMS, NULL}, {"MMSSLAT", MMSSLAT, NULL}, {"MMSSLON", MMSSLON, NULL}, {"MMYY", MMYY, NULL}, {"MOD", FUNC_DD, (void *) fmod}, {"MONTHDAY", MONTHDAY, NULL}, {"MONTHL", MONTHL, NULL}, {"MONTHS", MONTHS, NULL}, {"MONTHSY", MONTHSY, NULL}, {"MOVE", MOVE, NULL}, {"NDTR", FUNC_D, (void *) ndtr}, {"NDTRI", FUNC_D, (void *) ndtri}, {"NE", NE, NULL}, {"NEGATE", NEGATE, NULL}, {"NEW", NEW, NULL}, {"NONE", NONE, NULL}, {"NONLFIT", NONLFIT, NULL}, {"NORM", FUNC_D, (void *) fx}, {"NORMAL", NORMAL, NULL}, {"NOT", NOT, NULL}, {"NXY", NXY, NULL}, {"OFF", OFF, NULL}, {"OFFSET", OFFSET, NULL}, {"OFFSETX", OFFSETX, NULL}, {"OFFSETY", OFFSETY, NULL}, {"OFILTER", OFILTER, NULL}, {"ON", ON, NULL}, {"ONREAD", ONREAD, NULL}, {"OP", OP, NULL}, {"OPPOSITE", OPPOSITE, NULL}, {"OR", OR, NULL}, {"OUT", OUT, NULL}, {"PAGE", PAGE, NULL}, {"PARA", PARA, NULL}, {"PARAMETERS", PARAMETERS, NULL}, {"PARZEN", PARZEN, NULL}, {"PATTERN", PATTERN, NULL}, {"PDTR", FUNC_ND, (void *) pdtr}, {"PDTRC", FUNC_ND, (void *) pdtrc}, {"PDTRI", FUNC_ND, (void *) pdtri}, {"PERIOD", PERIOD, NULL}, {"PERP", PERP, NULL}, {"PHASE", PHASE, NULL}, {"PI", CONSTANT, (void *) pi_const}, {"PIE", PIE, NULL}, {"PIPE", PIPE, NULL}, {"PLACE", PLACE, NULL}, {"POINT", POINT, NULL}, {"POLAR", POLAR, NULL}, {"POLYI", POLYI, NULL}, {"POLYO", POLYO, NULL}, {"POP", POP, NULL}, {"PORTRAIT", PORTRAIT, NULL}, {"POWER", POWER, NULL}, {"PREC", PREC, NULL}, {"PREPEND", PREPEND, NULL}, {"PRINT", PRINT, NULL}, {"PS", PS, NULL}, {"PSI", FUNC_D, (void *) psi}, {"PUSH", PUSH, NULL}, {"PUTP", PUTP, NULL}, {"RAD", UCONSTANT, (void *) rad_uconst}, {"RAND", RAND, NULL}, {"READ", READ, NULL}, {"REAL", REAL, NULL}, {"RECIPROCAL", RECIPROCAL, NULL}, {"REDRAW", REDRAW, NULL}, {"REFERENCE", REFERENCE, NULL}, {"REGRESS", REGRESS, NULL}, {"RESIZE", RESIZE, NULL}, {"RESTRICT", RESTRICT, NULL}, {"REVERSE", REVERSE, NULL}, {"RGAMMA", FUNC_D, (void *) rgamma}, {"RIGHT", RIGHT, NULL}, {"RINT", FUNC_D, (void *) rint}, {"RISER", RISER, NULL}, {"RNORM", FUNC_DD, (void *) rnorm}, {"ROT", ROT, NULL}, {"ROUNDED", ROUNDED, NULL}, {"RSUM", RSUM, NULL}, {"RULE", RULE, NULL}, {"RUNAVG", RUNAVG, NULL}, {"RUNMAX", RUNMAX, NULL}, {"RUNMED", RUNMED, NULL}, {"RUNMIN", RUNMIN, NULL}, {"RUNSTD", RUNSTD, NULL}, {"SAVEALL", SAVEALL, NULL}, {"SCALE", SCALE, NULL}, {"SCIENTIFIC", SCIENTIFIC, NULL}, {"SCROLL", SCROLL, NULL}, {"SD", SD, NULL}, {"SET", SET, NULL}, {"SFORMAT", SFORMAT, NULL}, {"SGN", FUNC_D, (void *) sign_wrap}, {"SHI", FUNC_D, (void *) shi_wrap}, {"SI", FUNC_D, (void *) si_wrap}, {"SIGN", SIGN, NULL}, {"SIN", FUNC_D, (void *) sin}, {"SINH", FUNC_D, (void *) sinh}, {"SIZE", SIZE, NULL}, {"SKIP", SKIP, NULL}, {"SLEEP", SLEEP, NULL}, {"SMITH", SMITH, NULL}, {"SORT", SORT, NULL}, {"SOURCE", SOURCE, NULL}, {"SPEC", SPEC, NULL}, {"SPENCE", FUNC_D, (void *) spence}, {"SPLINE", SPLINE, NULL}, {"SPLIT", SPLIT, NULL}, {"SQR", FUNC_D, (void *) sqr_wrap}, {"SQRT", FUNC_D, (void *) sqrt}, {"STACK", STACK, NULL}, {"STACKED", STACKED, NULL}, {"STACKEDBAR", STACKEDBAR, NULL}, {"STACKEDHBAR", STACKEDHBAR, NULL}, {"STAGGER", STAGGER, NULL}, {"START", START, NULL}, {"STDTR", FUNC_ND, (void *) stdtr}, {"STDTRI", FUNC_ND, (void *) stdtri}, {"STOP", STOP, NULL}, {"STRING", STRING, NULL}, {"STRUVE", FUNC_DD, (void *) struve}, {"SUBTITLE", SUBTITLE, NULL}, {"SUM", SUM, NULL}, {"SWAP", SWAP, NULL}, {"SYMBOL", SYMBOL, NULL}, {"TAN", FUNC_D, (void *) tan}, {"TANH", FUNC_D, (void *) tanh}, {"TARGET", TARGET, NULL}, {"TICK", TICKP, NULL}, {"TICKLABEL", TICKLABEL, NULL}, {"TICKS", TICKSP, NULL}, {"TIMER", TIMER, NULL}, {"TIMESTAMP", TIMESTAMP, NULL}, {"TITLE", TITLE, NULL}, {"TO", TO, NULL}, {"TOP", TOP, NULL}, {"TRIANGULAR", TRIANGULAR, NULL}, {"TRUE", ON, NULL}, {"TYPE", TYPE, NULL}, {"UNIT", KEY_UNIT, NULL}, {"UP", UP, NULL}, {"UPDATEALL", UPDATEALL, NULL}, {"USE", USE, NULL}, {"VERSION", VERSION, NULL}, {"VERTI", VERTI, NULL}, {"VERTICAL", VERTICAL, NULL}, {"VERTO", VERTO, NULL}, {"VGAP", VGAP, NULL}, {"VIEW", VIEW, NULL}, {"VOIGT", FUNC_PPD, (void *) voigt}, {"VX1", VX1, NULL}, {"VX2", VX2, NULL}, {"VXMAX", VXMAX, NULL}, {"VY1", VY1, NULL}, {"VY2", VY2, NULL}, {"VYMAX", VYMAX, NULL}, {"WELCH", WELCH, NULL}, {"WITH", WITH, NULL}, {"WORLD", WORLD, NULL}, {"WRAP", WRAP, NULL}, {"WRITE", WRITE, NULL}, {"WX1", WX1, NULL}, {"WX2", WX2, NULL}, {"WY1", WY1, NULL}, {"WY2", WY2, NULL}, {"X", X_TOK, NULL}, {"X0", X0, NULL}, {"X1", X1, NULL}, {"XAXES", XAXES, NULL}, {"XAXIS", XAXIS, NULL}, {"XCOR", XCOR, NULL}, {"XMAX", XMAX, NULL}, {"XMIN", XMIN, NULL}, {"XY", XY, NULL}, {"XYAXES", XYAXES, NULL}, {"XYBOXPLOT", XYBOXPLOT, NULL}, {"XYCOLOR", XYCOLOR, NULL}, {"XYCOLPAT", XYCOLPAT, NULL}, {"XYDX", XYDX, NULL}, {"XYDXDX", XYDXDX, NULL}, {"XYDXDXDYDY", XYDXDXDYDY, NULL}, {"XYDXDY", XYDXDY, NULL}, {"XYDY", XYDY, NULL}, {"XYDYDY", XYDYDY, NULL}, {"XYHILO", XYHILO, NULL}, {"XYR", XYR, NULL}, {"XYSIZE", XYSIZE, NULL}, {"XYSTRING", XYSTRING, NULL}, {"XYVMAP", XYVMAP, NULL}, {"XYZ", XYZ, NULL}, {"Y", Y_TOK, NULL}, {"Y0", Y0, NULL}, {"Y1", Y1, NULL}, {"Y2", Y2, NULL}, {"Y3", Y3, NULL}, {"Y4", Y4, NULL}, {"YAXES", YAXES, NULL}, {"YAXIS", YAXIS, NULL}, {"YEAR", YEAR, NULL}, {"YMAX", YMAX, NULL}, {"YMIN", YMIN, NULL}, {"YV", FUNC_DD, (void *) yv_wrap}, {"YYMMDD", YYMMDD, NULL}, {"YYMMDDHMS", YYMMDDHMS, NULL}, {"ZERO", ZERO, NULL}, {"ZEROXAXIS", ALTXAXIS, NULL}, {"ZEROYAXIS", ALTYAXIS, NULL}, {"ZETA", FUNC_DD, (void *) zeta}, {"ZETAC", FUNC_D, (void *) zetac}, {"ZNORM", ZNORM, NULL} }; static int maxfunc = sizeof(ikey) / sizeof(symtab_entry); int get_parser_gno(void) { return whichgraph; } int set_parser_gno(int gno) { if (is_valid_gno(gno) == TRUE) { whichgraph = gno; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_parser_setno(void) { return whichset; } int set_parser_setno(int gno, int setno) { if (is_valid_setno(gno, setno) == TRUE) { whichgraph = gno; whichset = setno; /* those will usually be overridden except when evaluating a _standalone_ vexpr */ vasgn_gno = gno; vasgn_setno = setno; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } void realloc_vrbl(grarr *vrbl, int len) { double *a; int i, oldlen; if (vrbl->type != GRARR_VEC) { errmsg("Internal error"); return; } oldlen = vrbl->length; if (oldlen == len) { return; } else { a = xrealloc(vrbl->data, len*SIZEOF_DOUBLE); if (a != NULL || len == 0) { vrbl->data = a; vrbl->length = len; for (i = oldlen; i < len; i++) { vrbl->data[i] = 0.0; } } else { errmsg("Malloc failed in realloc_vrbl()"); } } } #define PARSER_TYPE_VOID 0 #define PARSER_TYPE_EXPR 1 #define PARSER_TYPE_VEXPR 2 static int parser(char *s, int type) { char *seekpos; int i; if (s == NULL || s[0] == '\0') { if (type == PARSER_TYPE_VOID) { /* don't consider an empty string as error for generic parser */ return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } strncpy(f_string, s, MAX_PARS_STRING_LENGTH - 2); f_string[MAX_PARS_STRING_LENGTH - 2] = '\0'; strcat(f_string, " "); seekpos = f_string; while ((seekpos - f_string < MAX_PARS_STRING_LENGTH - 1) && (*seekpos == ' ' || *seekpos == '\t')) { seekpos++; } if (*seekpos == '\n' || *seekpos == '#') { if (type == PARSER_TYPE_VOID) { /* don't consider an empty string as error for generic parser */ return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } lowtoupper(f_string); pos = 0; interr = 0; expr_parsed = FALSE; vexpr_parsed = FALSE; yyparse(); /* free temp. arrays; for a vector expression keep the last one * (which is none but v_result), given there have been no errors * and it's what we've been asked for */ if (vexpr_parsed && !interr && type == PARSER_TYPE_VEXPR) { for (i = 0; i < fcnt - 1; i++) { free_tmpvrbl(&(freelist[i])); } } else { for (i = 0; i < fcnt; i++) { free_tmpvrbl(&(freelist[i])); } } fcnt = 0; tgtn = 0; if ((type == PARSER_TYPE_VEXPR && !vexpr_parsed) || (type == PARSER_TYPE_EXPR && !expr_parsed)) { return RETURN_FAILURE; } else { return (interr ? RETURN_FAILURE:RETURN_SUCCESS); } } int s_scanner(char *s, double *res) { int retval = parser(s, PARSER_TYPE_EXPR); *res = s_result; return retval; } int v_scanner(char *s, int *reslen, double **vres) { int retval = parser(s, PARSER_TYPE_VEXPR); if (retval != RETURN_SUCCESS) { return RETURN_FAILURE; } else { *reslen = v_result->length; if (v_result->type == GRARR_TMP) { *vres = v_result->data; v_result->length = 0; v_result->data = NULL; } else { *vres = copy_data_column(v_result->data, v_result->length); } return RETURN_SUCCESS; } } int scanner(char *s) { int retval = parser(s, PARSER_TYPE_VOID); if (retval != RETURN_SUCCESS) { return RETURN_FAILURE; } if (gotparams) { gotparams = FALSE; getparms(paramfile); } if (gotread) { gotread = FALSE; getdata(whichgraph, readfile, cursource, LOAD_SINGLE); } if (gotnlfit) { gotnlfit = FALSE; do_nonlfit(nlfit_gno, nlfit_setno, nlfit_warray, NULL, nlfit_nsteps); XCFREE(nlfit_warray); } return retval; } static void free_tmpvrbl(grarr *vrbl) { if (vrbl->type == GRARR_TMP) { vrbl->length = 0; XCFREE(vrbl->data); } } static void copy_vrbl(grarr *dest, grarr *src) { dest->type = src->type; dest->data = xmalloc(src->length*SIZEOF_DOUBLE); if (dest->data == NULL) { errmsg("Malloc failed in copy_vrbl()"); } else { memcpy(dest->data, src->data, src->length*SIZEOF_DOUBLE); dest->length = src->length; } } grarr *get_parser_arr_by_name(char * const name) { int position; char *s; s = copy_string(NULL, name); lowtoupper(s); position = findf(key, s); xfree(s); if (position >= 0) { if (key[position].type == KEY_VEC) { return (grarr *) key[position].data; } } return NULL; } grarr *define_parser_arr(char * const name) { if (get_parser_arr_by_name(name) == NULL) { symtab_entry tmpkey; grarr *var; var = xmalloc(sizeof(grarr)); var->type = GRARR_VEC; var->length = 0; var->data = NULL; tmpkey.s = name; tmpkey.type = KEY_VEC; tmpkey.data = (void *) var; if (addto_symtab(tmpkey) == RETURN_SUCCESS) { return var; } else { return NULL; } } else { return NULL; } } int undefine_parser_var(void *ptr) { int i; for (i = 0; i < maxfunc; i++) { if (key[i].data == ptr) { xfree(key[i].s); maxfunc--; if (i != maxfunc) { memmove(&(key[i]), &(key[i + 1]), (maxfunc - i)*sizeof(symtab_entry)); } key = xrealloc(key, maxfunc*sizeof(symtab_entry)); return RETURN_SUCCESS; } } return RETURN_FAILURE; } static int find_set_bydata(double *data, target *tgt) { int gno, setno, ncol; if (data == NULL) { return RETURN_FAILURE; } else { for (gno = 0; gno < number_of_graphs(); gno++) { for (setno = 0; setno < number_of_sets(gno); setno++) { for (ncol = 0; ncol < MAX_SET_COLS; ncol++) { if (getcol(gno, setno, ncol) == data) { tgt->gno = gno; tgt->setno = setno; return RETURN_SUCCESS; } } } } } return RETURN_FAILURE; } static int findf(symtab_entry *keytable, char *s) { int low, high, mid; low = 0; high = maxfunc - 1; while (low <= high) { mid = (low + high) / 2; if (strcmp(s, keytable[mid].s) < 0) { high = mid - 1; } else { if (strcmp(s, keytable[mid].s) > 0) { low = mid + 1; } else { return (mid); } } } return (-1); } static int compare_keys (const void *a, const void *b) { return (int) strcmp (((const symtab_entry*)a)->s, ((const symtab_entry*)b)->s); } /* add new entry to the symbol table */ int addto_symtab(symtab_entry newkey) { int position; char *s; s = copy_string(NULL, newkey.s); lowtoupper(s); if ((position = findf(key, s)) < 0) { if ((key = (symtab_entry *) xrealloc(key, (maxfunc + 1)*sizeof(symtab_entry))) != NULL) { key[maxfunc].type = newkey.type; key[maxfunc].data = newkey.data; key[maxfunc].s = s; maxfunc++; qsort(key, maxfunc, sizeof(symtab_entry), compare_keys); return RETURN_SUCCESS; } else { xfree(s); return RETURN_FAILURE; } } else if (alias_force == TRUE) { /* already exists but alias_force enabled */ key[position].type = newkey.type; key[position].data = newkey.data; return RETURN_SUCCESS; } else { xfree(s); return RETURN_FAILURE; } } /* initialize symbol table */ void init_symtab(void) { int i; if ((key = (symtab_entry *) xmalloc(maxfunc*sizeof(symtab_entry))) != NULL) { memcpy (key, ikey, maxfunc*sizeof(symtab_entry)); for (i = 0; i < maxfunc; i++) { key[i].s = xmalloc(strlen(ikey[i].s) + 1); strcpy(key[i].s, ikey[i].s); } qsort(key, maxfunc, sizeof(symtab_entry), compare_keys); return; } else { key = ikey; return; } } static int getcharstr(void) { if (pos >= strlen(f_string)) return EOF; return (f_string[pos++]); } static void ungetchstr(void) { if (pos > 0) pos--; } static int yylex(void) { int c, i; int found; char sbuf[MAX_PARS_STRING_LENGTH + 40]; while ((c = getcharstr()) == ' ' || c == '\t'); if (c == EOF) { return (0); } if (c == '"') { i = 0; while ((c = getcharstr()) != '"' && c != EOF) { if (c == '\\') { int ctmp; ctmp = getcharstr(); if (ctmp != '"') { ungetchstr(); } else { c = ctmp; } } sbuf[i] = c; i++; } if (c == EOF) { yyerror("Nonterminating string"); return 0; } sbuf[i] = '\0'; yylval.sval = copy_string(NULL, sbuf); return CHRSTR; } if (c == '.' || isdigit(c)) { double d; int i, gotdot = 0; i = 0; while (c == '.' || isdigit(c)) { if (c == '.') { if (gotdot) { yyerror("Reading number, too many dots"); return 0; } else { gotdot = 1; } } sbuf[i++] = c; c = getcharstr(); } if (c == 'E' || c == 'e') { sbuf[i++] = c; c = getcharstr(); if (c == '+' || c == '-') { sbuf[i++] = c; c = getcharstr(); } while (isdigit(c)) { sbuf[i++] = c; c = getcharstr(); } } if (gotdot && i == 1) { ungetchstr(); return '.'; } sbuf[i] = '\0'; ungetchstr(); sscanf(sbuf, "%lf", &d); yylval.dval = d; return NUMBER; } /* graphs, sets, regions resp. */ if (c == 'G' || c == 'S' || c == 'R') { int i = 0, ctmp = c, gn, sn, rn; c = getcharstr(); while (isdigit(c) || c == '$' || c == '_') { sbuf[i++] = c; c = getcharstr(); } if (i == 0) { c = ctmp; ungetchstr(); } else { ungetchstr(); if (ctmp == 'G') { sbuf[i] = '\0'; if (i == 1 && sbuf[0] == '_') { gn = get_recent_gno(); } else if (i == 1 && sbuf[0] == '$') { gn = whichgraph; } else { gn = atoi(sbuf); } if (is_valid_gno(gn) || graph_allocate(gn) == RETURN_SUCCESS) { yylval.ival = gn; return GRAPHNO; } } else if (ctmp == 'S') { sbuf[i] = '\0'; if (i == 1 && sbuf[0] == '_') { sn = get_recent_setno(); } else if (i == 1 && sbuf[0] == '$') { sn = whichset; } else { sn = atoi(sbuf); } yylval.ival = sn; return SETNUM; } else if (ctmp == 'R') { sbuf[i] = '\0'; rn = atoi(sbuf); if (rn >= 0 && rn < MAXREGION) { yylval.ival = rn; return REGNUM; } else { errmsg("Invalid region number"); } } } } if (isalpha(c) || c == '$') { char *p = sbuf; do { *p++ = c; } while ((c = getcharstr()) != EOF && (isalpha(c) || isdigit(c) || c == '_' || c == '$')); ungetchstr(); *p = '\0'; #ifdef DEBUG if (get_debuglevel() == 2) { printf("->%s<-\n", sbuf); } #endif found = -1; if ((found = findf(key, sbuf)) >= 0) { if (key[found].type == FITPARM) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPARM; } else if (key[found].type == FITPMAX) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPMAX; } else if (key[found].type == FITPMIN) { int index = sbuf[1] - '0'; yylval.ival = index; return FITPMIN; } else if (key[found].type == KEY_VAR) { yylval.dptr = (double *) key[found].data; return VAR_D; } else if (key[found].type == KEY_VEC) { yylval.vrbl = (grarr *) key[found].data; return VEC_D; } else if (key[found].type == FUNC_I) { yylval.ival = found; return FUNC_I; } else if (key[found].type == CONSTANT) { yylval.ival = found; return CONSTANT; } else if (key[found].type == UCONSTANT) { yylval.ival = found; return UCONSTANT; } else if (key[found].type == FUNC_D) { yylval.ival = found; return FUNC_D; } else if (key[found].type == FUNC_ND) { yylval.ival = found; return FUNC_ND; } else if (key[found].type == FUNC_DD) { yylval.ival = found; return FUNC_DD; } else if (key[found].type == FUNC_NND) { yylval.ival = found; return FUNC_NND; } else if (key[found].type == FUNC_PPD) { yylval.ival = found; return FUNC_PPD; } else if (key[found].type == FUNC_PPPD) { yylval.ival = found; return FUNC_PPPD; } else if (key[found].type == FUNC_PPPPD) { yylval.ival = found; return FUNC_PPPPD; } else if (key[found].type == FUNC_PPPPPD) { yylval.ival = found; return FUNC_PPPPPD; } else { yylval.ival = key[found].type; return key[found].type; } } else { yylval.sval = copy_string(NULL, sbuf); return NEW_TOKEN; } } switch (c) { case '>': return follow('=', GE, GT); case '<': return follow('=', LE, LT); case '=': return follow('=', EQ, '='); case '!': return follow('=', NE, NOT); case '|': return follow('|', OR, '|'); case '&': return follow('&', AND, '&'); case '\n': return '\n'; default: return c; } } static int follow(int expect, int ifyes, int ifno) { int c = getcharstr(); if (c == expect) { return ifyes; } ungetchstr(); return ifno; } static void yyerror(char *s) { char *buf; buf = copy_string(NULL, s); buf = concat_strings(buf, ": "); buf = concat_strings(buf, f_string); errmsg(buf); xfree(buf); interr = 1; } grace-5.1.23/src/setappwin.c0000644000076500001440000006466210071615562015416 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Set appearance * */ #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "motifinc.h" #include "protos.h" #define cg get_cg() #define SETAPP_STRIP_LEGENDS 0 #define SETAPP_LOAD_COMMENTS 1 #define SETAPP_ALL_COLORS 2 #define SETAPP_ALL_SYMBOLS 3 #define SETAPP_ALL_LINEW 4 #define SETAPP_ALL_LINES 5 #define SETAPP_ALL_BW 6 #define CSYNC_LINE 0 #define CSYNC_SYM 1 static int cset = 0; /* the current set from the symbols panel */ static Widget setapp_dialog = NULL; static Widget duplegs_item; static OptionStructure *type_item; static Widget *toggle_symbols_item; static Widget symsize_item; static SpinStructure *symskip_item; static OptionStructure *symcolor_item; static OptionStructure *sympattern_item; static OptionStructure *symfillcolor_item; static OptionStructure *symfillpattern_item; static SpinStructure *symlinew_item; static OptionStructure *symlines_item; static Widget symchar_item; static OptionStructure *char_font_item; static OptionStructure *toggle_color_item; static OptionStructure *toggle_pattern_item; static SpinStructure *toggle_width_item; static Widget dropline_item; static OptionStructure *toggle_lines_item; static Widget *toggle_linet_item; static Widget *toggle_filltype_item; static Widget *toggle_fillrule_item; static OptionStructure *toggle_fillpat_item; static OptionStructure *toggle_fillcol_item; static ListStructure *toggle_symset_item; static Widget baseline_item; static Widget *baselinetype_item; static TextStructure *legend_str_item; static Widget errbar_active_item; static Widget *errbar_ptype_item; static OptionStructure *errbar_color_item; static OptionStructure *errbar_pattern_item; static Widget errbar_size_item; static SpinStructure *errbar_width_item; static OptionStructure *errbar_lines_item; static SpinStructure *errbar_riserlinew_item; static OptionStructure *errbar_riserlines_item; static Widget errbar_aclip_item; static SpinStructure *errbar_cliplen_item; static Widget avalue_active_item; static Widget *avalue_type_item; static OptionStructure *avalue_font_item; static OptionStructure *avalue_color_item; static Widget avalue_charsize_item ; static Widget avalue_angle_item; static OptionStructure *avalue_format_item; static Widget *avalue_precision_item; static Widget avalue_offsetx; static Widget avalue_offsety; static Widget avalue_prestr; static Widget avalue_appstr; static Widget csync_item; static void UpdateSymbols(int gno, int value); static void set_cset_proc(int n, int *values, void *data); static int setapp_aac_cb(void *data); static void setapp_data_proc(void *data); static void csync_cb(int value, void *data); /* * create the symbols popup */ void define_symbols_popup(void *data) { int setno; set_wait_cursor(); setno = (int) data; if (is_valid_setno(cg, setno) == TRUE) { cset = setno; } if (setapp_dialog == NULL) { Widget setapp_tab, setapp_main, setapp_symbols, setapp_line, setapp_errbar, setapp_avalue, fr, rc, rc1, rc2; Widget menubar, menupane; setapp_dialog = CreateDialogForm(app_shell, "Set Appearance"); menubar = CreateMenuBar(setapp_dialog); AddDialogFormChild(setapp_dialog, menubar); ManageChild(menubar); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuCloseButton(menupane, setapp_dialog); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Set different colors", 'c', setapp_data_proc, (void *) SETAPP_ALL_COLORS); CreateMenuButton(menupane, "Set different symbols", 's', setapp_data_proc, (void *) SETAPP_ALL_SYMBOLS); CreateMenuButton(menupane, "Set different line widths", 'w', setapp_data_proc, (void *) SETAPP_ALL_LINEW); CreateMenuButton(menupane, "Set different line styles", 'y', setapp_data_proc, (void *) SETAPP_ALL_LINES); CreateMenuButton(menupane, "Set black & white", 'B', setapp_data_proc, (void *) SETAPP_ALL_BW); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Load comments", 'm', setapp_data_proc, (void *) SETAPP_LOAD_COMMENTS); CreateMenuButton(menupane, "Strip legends", 'l', setapp_data_proc, (void *) SETAPP_STRIP_LEGENDS); menupane = CreateMenu(menubar, "Options", 'O', FALSE); duplegs_item = CreateMenuToggle(menupane, "Duplicate legends", 'D', NULL, NULL); csync_item = CreateMenuToggle(menupane, "Color sync", 's', NULL, NULL); SetToggleButtonState(csync_item, TRUE); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On set appearance", 's', setapp_dialog, "doc/UsersGuide.html#set-appearance"); toggle_symset_item = CreateSetChoice(setapp_dialog, "Select set:", LIST_TYPE_MULTIPLE, TRUE); AddDialogFormChild(setapp_dialog, toggle_symset_item->rc); AddListChoiceCB(toggle_symset_item, set_cset_proc, NULL); /* ------------ Tabs -------------- */ setapp_tab = CreateTab(setapp_dialog); /* ------------ Main tab -------------- */ setapp_main = CreateTabPage(setapp_tab, "Main"); fr = CreateFrame(setapp_main, "Set presentation"); type_item = CreateSetTypeChoice(fr, "Type:"); rc2 = CreateHContainer(setapp_main); fr = CreateFrame(rc2, "Symbol properties"); rc = CreateVContainer(fr); toggle_symbols_item = CreatePanelChoice(rc, "Type:", 13, "None", /* 0 */ "Circle", /* 1 */ "Square", /* 2 */ "Diamond", /* 3 */ "Triangle up", /* 4 */ "Triangle left", /* 5 */ "Triangle down", /* 6 */ "Triangle right", /* 7 */ "Plus", /* 8 */ "X", /* 9 */ "Star", /* 10 */ "Char", /* 11 */ NULL); symsize_item = CreateCharSizeChoice(rc, "Size"); symcolor_item = CreateColorChoice(rc, "Color:"); AddOptionChoiceCB(symcolor_item, csync_cb, (void *) CSYNC_SYM); symchar_item = CreateTextItem2(rc, 3, "Symbol char:"); fr = CreateFrame(rc2, "Line properties"); rc = CreateVContainer(fr); toggle_linet_item = CreatePanelChoice(rc, "Type:", 7, "None", "Straight", "Left stairs", "Right stairs", "Segments", "3-Segments", NULL); toggle_lines_item = CreateLineStyleChoice(rc, "Style:"); toggle_width_item = CreateLineWidthChoice(rc, "Width:"); toggle_color_item = CreateColorChoice(rc, "Color:"); AddOptionChoiceCB(toggle_color_item, csync_cb, (void *) CSYNC_LINE); fr = CreateFrame(setapp_main, "Legend"); legend_str_item = CreateCSText(fr, "String:"); fr = CreateFrame(setapp_main, "Display options"); rc2 = CreateHContainer(fr); avalue_active_item = CreateToggleButton(rc2, "Annotate values"); errbar_active_item = CreateToggleButton(rc2, "Display error bars"); /* ------------ Symbols tab -------------- */ setapp_symbols = CreateTabPage(setapp_tab, "Symbols"); fr = CreateFrame(setapp_symbols, "Symbol outline"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); symlines_item = CreateLineStyleChoice(rc2, "Style:"); symlinew_item = CreateLineWidthChoice(rc2, "Width:"); sympattern_item = CreatePatternChoice(rc, "Pattern:"); fr = CreateFrame(setapp_symbols, "Symbol fill"); rc = CreateHContainer(fr); symfillcolor_item = CreateColorChoice(rc, "Color:"); symfillpattern_item = CreatePatternChoice(rc, "Pattern:"); fr = CreateFrame(setapp_symbols, "Extra"); rc = CreateVContainer(fr); symskip_item = CreateSpinChoice(rc, "Symbol skip:", 5, SPIN_TYPE_INT, (double) 0, (double) 100000, (double) 1); char_font_item = CreateFontChoice(rc, "Font for char symbol:"); /* ------------ Line tab -------------- */ setapp_line = CreateTabPage(setapp_tab, "Line"); fr = CreateFrame(setapp_line, "Line properties"); rc = CreateHContainer(fr); toggle_pattern_item = CreatePatternChoice(rc, "Pattern:"); dropline_item = CreateToggleButton(rc, "Draw drop lines"); fr = CreateFrame(setapp_line, "Fill properties"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); toggle_filltype_item = CreatePanelChoice(rc2, "Type:", 4, "None", "As polygon", "To baseline", NULL); toggle_fillrule_item = CreatePanelChoice(rc2, "Rule:", 3, "Winding", "Even-Odd", NULL); rc2 = CreateHContainer(rc); toggle_fillpat_item = CreatePatternChoice(rc2, "Pattern:"); toggle_fillcol_item = CreateColorChoice(rc2, "Color:"); fr = CreateFrame(setapp_line, "Base line"); rc = CreateHContainer(fr); baselinetype_item = CreatePanelChoice(rc, "Type:", 7, "Zero", "Set min", "Set max", "Graph min", "Graph max", "Set average", NULL); baseline_item = CreateToggleButton(rc, "Draw line"); /* ------------ AValue tab -------------- */ setapp_avalue = CreateTabPage(setapp_tab, "Ann. values"); fr = CreateFrame(setapp_avalue, "Text properties"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); avalue_font_item = CreateFontChoice(rc2, "Font:"); avalue_charsize_item = CreateCharSizeChoice(rc2, "Char size"); SetScaleWidth(avalue_charsize_item, 120); rc2 = CreateHContainer(rc); avalue_color_item = CreateColorChoice(rc2, "Color:"); avalue_angle_item = CreateAngleChoice(rc2, "Angle"); SetScaleWidth(avalue_angle_item, 180); rc2 = CreateHContainer(rc); avalue_prestr = CreateTextItem2(rc2, 10, "Prepend:"); avalue_appstr = CreateTextItem2(rc2, 10, "Append:"); fr = CreateFrame(setapp_avalue, "Format options"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); avalue_format_item = CreateFormatChoice(rc, "Format:"); avalue_type_item = CreatePanelChoice(rc2, "Type:", 7, "None", "X", "Y", "X, Y", "String", "Z", NULL); avalue_precision_item = CreatePrecisionChoice(rc2, "Precision:"); fr = CreateFrame(setapp_avalue, "Placement"); rc2 = CreateHContainer(fr); avalue_offsetx = CreateTextItem2(rc2, 10, "X offset:"); avalue_offsety = CreateTextItem2(rc2, 10, "Y offset:"); /* ------------ Errbar tab -------------- */ setapp_errbar = CreateTabPage(setapp_tab, "Error bars"); rc2 = CreateHContainer(setapp_errbar); rc1 = CreateVContainer(rc2); fr = CreateFrame(rc1, "Common"); rc = CreateVContainer(fr); errbar_ptype_item = CreatePanelChoice(rc, "Placement:", 4, "Normal", "Opposite", "Both", NULL); errbar_color_item = CreateColorChoice(rc, "Color:"); errbar_pattern_item = CreatePatternChoice(rc, "Pattern:"); fr = CreateFrame(rc1, "Clipping"); rc = CreateVContainer(fr); errbar_aclip_item = CreateToggleButton(rc, "Arrow clip"); errbar_cliplen_item = CreateSpinChoice(rc, "Max length:", 3, SPIN_TYPE_FLOAT, 0.0, 10.0, 0.1); rc1 = CreateVContainer(rc2); fr = CreateFrame(rc1, "Bar line"); rc = CreateVContainer(fr); errbar_size_item = CreateCharSizeChoice(rc, "Size"); errbar_width_item = CreateLineWidthChoice(rc, "Width:"); errbar_lines_item = CreateLineStyleChoice(rc, "Style:"); fr = CreateFrame(rc1, "Riser line"); rc = CreateVContainer(fr); errbar_riserlinew_item = CreateLineWidthChoice(rc, "Width:"); errbar_riserlines_item = CreateLineStyleChoice(rc, "Style:"); SelectTabPage(setapp_tab, setapp_main); CreateAACDialog(setapp_dialog, setapp_tab, setapp_aac_cb, NULL); } updatesymbols(cg, cset); RaiseWindow(GetParent(setapp_dialog)); unset_wait_cursor(); } /* * define symbols for the current set */ static int setapp_aac_cb(void *data) { int i; int duplegs; int type; int sym, symskip, symlines; double symlinew; int line, linet, color, pattern; double wid; int dropline, filltype, fillrule, fillpat, fillcol; int symcolor, sympattern, symfillcolor, symfillpattern; double symsize; int baseline, baselinetype; Errbar errbar; AValue avalue; char symchar; int charfont; plotarr p; int setno; int *selset, cd; duplegs = GetToggleButtonState(duplegs_item); type = GetOptionChoice(type_item); symsize = GetCharSizeChoice(symsize_item); sym = GetChoice(toggle_symbols_item); color = GetOptionChoice(toggle_color_item); pattern = GetOptionChoice(toggle_pattern_item); wid = GetSpinChoice(toggle_width_item); baseline = GetToggleButtonState(baseline_item); baselinetype = GetChoice(baselinetype_item); dropline = GetToggleButtonState(dropline_item); line = GetOptionChoice(toggle_lines_item); linet = GetChoice(toggle_linet_item); filltype = GetChoice(toggle_filltype_item); fillrule = GetChoice(toggle_fillrule_item); fillpat = GetOptionChoice(toggle_fillpat_item); fillcol = GetOptionChoice(toggle_fillcol_item); symskip = GetSpinChoice(symskip_item); symcolor = GetOptionChoice(symcolor_item); sympattern = GetOptionChoice(sympattern_item); symfillcolor = GetOptionChoice(symfillcolor_item); symfillpattern = GetOptionChoice(symfillpattern_item); symlinew = GetSpinChoice(symlinew_item); symlines = GetOptionChoice(symlines_item); symchar = atoi(xv_getstr(symchar_item)); charfont = GetOptionChoice(char_font_item); errbar.active = GetToggleButtonState(errbar_active_item); errbar.barsize = GetCharSizeChoice(errbar_size_item); errbar.linew = GetSpinChoice(errbar_width_item); errbar.lines = GetOptionChoice(errbar_lines_item); errbar.riser_linew = GetSpinChoice(errbar_riserlinew_item); errbar.riser_lines = GetOptionChoice(errbar_riserlines_item); avalue.active = GetToggleButtonState(avalue_active_item); avalue.type = GetChoice(avalue_type_item); avalue.size = GetCharSizeChoice(avalue_charsize_item); avalue.font = GetOptionChoice(avalue_font_item); avalue.color = GetOptionChoice(avalue_color_item); avalue.angle = GetAngleChoice(avalue_angle_item); avalue.format = GetOptionChoice(avalue_format_item); avalue.prec = GetChoice(avalue_precision_item); strcpy(avalue.prestr, xv_getstr(avalue_prestr)); strcpy(avalue.appstr, xv_getstr(avalue_appstr)); xv_evalexpr(avalue_offsetx, &avalue.offset.x ); xv_evalexpr(avalue_offsety, &avalue.offset.y); cd = GetListChoices(toggle_symset_item, &selset); if (cd < 1) { errwin("No set selected"); return RETURN_FAILURE; } else { for(i = 0; i < cd; i++) { setno = selset[i]; get_graph_plotarr(get_cg(), setno, &p); p.symskip = symskip; p.symsize = symsize; p.symlinew = symlinew; p.symlines = symlines; p.symchar = symchar; p.charfont = charfont; p.filltype = filltype; p.fillrule = fillrule; p.setfillpen.pattern = fillpat; p.setfillpen.color = fillcol; if (cd == 1 || duplegs) { strcpy(p.lstr, GetTextString(legend_str_item)); } p.sym = sym; p.linet = linet; p.lines = line; p.linew = wid; p.linepen.color = color; p.linepen.pattern = pattern; p.sympen.color = symcolor; p.sympen.pattern = sympattern; p.symfillpen.color = symfillcolor; p.symfillpen.pattern = symfillpattern; p.dropline = dropline; p.baseline = baseline; p.baseline_type = baselinetype; errbar.ptype = GetChoice(errbar_ptype_item); errbar.pen.color = GetOptionChoice(errbar_color_item); errbar.pen.pattern = GetOptionChoice(errbar_pattern_item); errbar.arrow_clip = GetToggleButtonState(errbar_aclip_item); errbar.cliplen = GetSpinChoice(errbar_cliplen_item); p.errbar = errbar; p.avalue = avalue; set_graph_plotarr(get_cg(), setno, &p); set_dataset_type(get_cg(), setno, type); } xfree(selset); } xdrawgraph(); return RETURN_SUCCESS; } /* * freshen up symbol items, generally after a parameter * file has been read */ static void UpdateSymbols(int gno, int value) { int i; char val[24]; plotarr p; if ((cset == value) && (value != -1)) { get_graph_plotarr(gno, cset, &p); SetOptionChoice(type_item, p.type); for (i = 0; i < type_item->nchoices; i++) { if (settype_cols(type_item->options[i].value) == settype_cols(p.type)) { SetSensitive(type_item->options[i].widget, True); } else { SetSensitive(type_item->options[i].widget, False); } } SetCharSizeChoice(symsize_item, p.symsize); SetSpinChoice(symskip_item, p.symskip); sprintf(val, "%d", p.symchar); xv_setstr(symchar_item, val); SetChoice(toggle_symbols_item, p.sym); SetOptionChoice(symcolor_item, p.sympen.color); SetOptionChoice(sympattern_item, p.sympen.pattern); SetOptionChoice(symfillcolor_item, p.symfillpen.color); SetOptionChoice(symfillpattern_item, p.symfillpen.pattern); SetSpinChoice(symlinew_item, p.symlinew); SetOptionChoice(symlines_item, p.symlines); SetOptionChoice(char_font_item, p.charfont); SetOptionChoice(toggle_color_item, p.linepen.color); SetOptionChoice(toggle_pattern_item, p.linepen.pattern); SetSpinChoice(toggle_width_item, p.linew); SetToggleButtonState(dropline_item, p.dropline); SetOptionChoice(toggle_lines_item, p.lines); SetChoice(toggle_linet_item, p.linet); SetChoice(toggle_filltype_item, p.filltype); SetChoice(toggle_fillrule_item, p.fillrule); SetOptionChoice(toggle_fillcol_item, p.setfillpen.color); SetOptionChoice(toggle_fillpat_item, p.setfillpen.pattern); SetToggleButtonState(baseline_item, p.baseline); SetChoice(baselinetype_item, p.baseline_type); SetTextString(legend_str_item, p.lstr); SetToggleButtonState(errbar_active_item, p.errbar.active); switch (p.type) { case SET_XYDXDX: case SET_XYDYDY: case SET_XYDXDXDYDY: SetSensitive(errbar_ptype_item[4], False); break; default: SetSensitive(errbar_ptype_item[4], True); break; } SetChoice(errbar_ptype_item, p.errbar.ptype); SetOptionChoice(errbar_color_item, p.errbar.pen.color); SetOptionChoice(errbar_pattern_item, p.errbar.pen.pattern); SetToggleButtonState(errbar_aclip_item, p.errbar.arrow_clip); SetSpinChoice(errbar_cliplen_item, p.errbar.cliplen); SetSpinChoice(errbar_width_item, p.errbar.linew); SetOptionChoice(errbar_lines_item, p.errbar.lines); SetSpinChoice(errbar_riserlinew_item, p.errbar.riser_linew); SetOptionChoice(errbar_riserlines_item, p.errbar.riser_lines); SetCharSizeChoice(errbar_size_item, p.errbar.barsize); SetToggleButtonState(avalue_active_item, p.avalue.active); SetChoice(avalue_type_item, p.avalue.type); SetCharSizeChoice(avalue_charsize_item, p.avalue.size); SetOptionChoice(avalue_font_item, p.avalue.font); SetOptionChoice(avalue_color_item, p.avalue.color); SetAngleChoice(avalue_angle_item, p.avalue.angle); SetOptionChoice(avalue_format_item, p.avalue.format); SetChoice(avalue_precision_item, p.avalue.prec); xv_setstr(avalue_prestr, p.avalue.prestr); xv_setstr(avalue_appstr, p.avalue.appstr); sprintf(val, "%f", p.avalue.offset.x); xv_setstr(avalue_offsetx, val); sprintf(val, "%f", p.avalue.offset.y); xv_setstr(avalue_offsety, val); /* * set_graph_plotarr(gno, cset, &p); */ } } static void set_cset_proc(int n, int *values, void *data) { if (n == 1) { cset = values[0]; UpdateSymbols(cg, cset); } } void updatesymbols(int gno, int setno) { if (gno != cg) { return; } if (setapp_dialog != NULL) { if (SelectListChoice(toggle_symset_item, setno) == RETURN_SUCCESS) { cset = setno; } } } static void setapp_data_proc(void *data) { int proc_type; int *selset, cd; int i, setno; plotarr p; int c = 0, bg = getbgcolor(); proc_type = (int) data; cd = GetListChoices(toggle_symset_item, &selset); if (cd < 1) { errmsg("No set selected"); return; } else { for(i = 0; i < cd; i++) { setno = selset[i]; switch (proc_type) { case SETAPP_STRIP_LEGENDS: set_legend_string(cg, setno, mybasename(get_legend_string(cg, setno))); break; case SETAPP_LOAD_COMMENTS: load_comments_to_legend(cg, setno); break; case SETAPP_ALL_COLORS: while (c == bg || get_colortype(c) != COLOR_MAIN) { c++; c %= number_of_colors(); } set_set_colors(cg, setno, c); c++; break; case SETAPP_ALL_SYMBOLS: get_graph_plotarr(cg, setno, &p); p.sym = (i % (MAXSYM - 2)) + 1; set_graph_plotarr(cg, setno, &p); break; case SETAPP_ALL_LINEW: get_graph_plotarr(cg, setno, &p); p.linew = ((i % (2*((int) MAX_LINEWIDTH) - 1)) + 1)/2.0; set_graph_plotarr(cg, setno, &p); break; case SETAPP_ALL_LINES: get_graph_plotarr(cg, setno, &p); p.lines = (i % (number_of_linestyles() - 1)) + 1; set_graph_plotarr(cg, setno, &p); break; case SETAPP_ALL_BW: set_set_colors(cg, setno, 1); break; } } xfree(selset); UpdateSymbols(cg, cset); set_dirtystate(); xdrawgraph(); } } static void csync_cb(int value, void *data) { int mask = (int) data; if (GetToggleButtonState(csync_item) != TRUE) { return; } if (mask == CSYNC_LINE) { SetOptionChoice(symcolor_item, value); mask++; } if (mask == CSYNC_SYM) { SetOptionChoice(symfillcolor_item, value); SetOptionChoice(errbar_color_item, value); mask++; } } grace-5.1.23/src/defaults.c0000644000076500001440000002350610426220124015171 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * set defaults - changes to the types in defines.h * will require changes in here also * */ #include #include #include #include #include #include "defines.h" #include "globals.h" #include "graphs.h" #include "utils.h" #include "protos.h" static defaults d_d = {1, 0, 1, 1, 1, 1.0, 0, 1.0}; /* defaults layout int color; int bgcolor; int pattern; int lines; double linew; double charsize; int font; double symsize; */ static world d_w = {0.0, 1.0, 0.0, 1.0}; static view d_v = {0.15, 0.85, 0.15, 0.85}; void set_program_defaults(void) { int i; grdefaults = d_d; for (i = 0; i < MAXREGION; i++) { set_region_defaults(i); } set_default_string(×tamp); timestamp.x = 0.03; timestamp.y = 0.03; target_set.gno = -1; target_set.setno = -1; } void set_region_defaults(int rno) { rg[rno].active = FALSE; rg[rno].type = 0; rg[rno].color = grdefaults.color; rg[rno].lines = grdefaults.lines; rg[rno].linew = grdefaults.linew; rg[rno].n = 0; rg[rno].x = rg[rno].y = NULL; rg[rno].x1 = rg[rno].y1 = rg[rno].x2 = rg[rno].y2 = 0.0; rg[rno].linkto = 0; } void set_default_framep(framep * f) { f->type = 0; /* frame type */ f->lines = grdefaults.lines; f->linew = grdefaults.linew; f->pen.color = grdefaults.color; f->pen.pattern = grdefaults.pattern; f->fillpen.color = grdefaults.bgcolor; /* fill background */ f->fillpen.pattern = 0; } void set_default_world(world * w) { memcpy(w, &d_w, sizeof(world)); } void set_default_view(view * v) { memcpy(v, &d_v, sizeof(view)); } void set_default_string(plotstr * s) { s->active = FALSE; s->loctype = COORD_VIEW; s->gno = -1; s->x = s->y = 0.0; s->color = grdefaults.color; s->rot = 0; s->font = grdefaults.font; s->just = JUST_LEFT|JUST_BLINE; s->charsize = grdefaults.charsize; s->s = NULL; } void set_default_arrow(Arrow *arrowp) { arrowp->type = line_atype; arrowp->length = line_asize; arrowp->dL_ff = line_a_dL_ff; arrowp->lL_ff = line_a_lL_ff; } void set_default_line(linetype * l) { l->active = FALSE; l->loctype = COORD_VIEW; l->gno = -1; l->x1 = l->y1 = l->x2 = l->y2 = 0.0; l->lines = grdefaults.lines; l->linew = grdefaults.linew; l->color = grdefaults.color; l->arrow_end = 0; set_default_arrow(&l->arrow); } void set_default_box(boxtype * b) { b->active = FALSE; b->loctype = COORD_VIEW; b->gno = -1; b->x1 = b->y1 = b->x2 = b->y2 = 0.0; b->lines = grdefaults.lines; b->linew = grdefaults.linew; b->color = grdefaults.color; b->fillcolor = grdefaults.color; b->fillpattern = grdefaults.pattern; } void set_default_ellipse(ellipsetype * e) { e->active = FALSE; e->loctype = COORD_VIEW; e->gno = -1; e->x1 = e->y1 = e->x2 = e->y2 = 0.0; e->lines = grdefaults.lines; e->linew = grdefaults.linew; e->color = grdefaults.color; e->fillcolor = grdefaults.color; e->fillpattern = grdefaults.pattern; } void set_default_legend(int gno, legend * l) { l->active = TRUE; l->loctype = COORD_VIEW; l->vgap = 1; l->hgap = 1; l->len = 4; l->invert = FALSE; l->legx = 0.5; l->legy = 0.8; l->font = grdefaults.font; l->charsize = grdefaults.charsize; l->color = grdefaults.color; l->boxpen.color = grdefaults.color; l->boxpen.pattern = grdefaults.pattern; l->boxfillpen.color = 0; l->boxfillpen.pattern = grdefaults.pattern; l->boxlinew = grdefaults.linew; l->boxlines = grdefaults.lines; l->bb.xv1 = l->bb.xv2 = l->bb.yv1 = l->bb.yv2 = 0.0; } void set_default_plotarr(plotarr * p) { int i; p->hidden = FALSE; /* hidden set */ p->type = SET_XY; /* dataset type */ p->hotlink = FALSE; /* hot linked set */ p->hotfile[0] = '\0'; /* hot linked file name */ p->sym = 0; /* set plot symbol */ p->symlines = grdefaults.lines; /* set plot sym line style */ p->symsize = grdefaults.symsize; /* size of symbols */ p->symlinew = grdefaults.linew; /* set plot sym line width */ p->sympen.color = grdefaults.color; /* color for symbol line */ p->sympen.pattern = grdefaults.pattern; /* pattern */ p->symfillpen.color = grdefaults.color; /* color for symbol fill */ p->symfillpen.pattern = 0; /* pattern for symbol fill */ p->symchar = 'A'; p->charfont = grdefaults.font; p->symskip = 0; /* How many symbols to skip */ p->avalue.active = FALSE; /* active or not */ p->avalue.type = AVALUE_TYPE_Y; /* type */ p->avalue.size = 1.0; /* char size */ p->avalue.font = grdefaults.font; /* font */ p->avalue.color = grdefaults.color; /* color */ p->avalue.angle = 0; /* rotation angle */ p->avalue.format = FORMAT_GENERAL; /* format */ p->avalue.prec = 3; /* precision */ p->avalue.prestr[0] = '\0'; p->avalue.appstr[0] = '\0'; p->avalue.offset.x = 0.0; p->avalue.offset.y = 0.0; p->linet = LINE_TYPE_STRAIGHT; p->lines = grdefaults.lines; p->linew = grdefaults.linew; p->linepen.color = grdefaults.color; p->linepen.pattern = grdefaults.pattern; p->baseline_type = BASELINE_TYPE_0; p->baseline = FALSE; p->dropline = FALSE; p->filltype = SETFILL_NONE; /* fill type */ p->fillrule = FILLRULE_WINDING; /* fill type */ p->setfillpen.color = grdefaults.color; /* fill color */ p->setfillpen.pattern = grdefaults.pattern; /* fill pattern */ p->errbar.active = TRUE; /* on by default */ p->errbar.ptype = PLACEMENT_BOTH; /* error bar placement */ p->errbar.pen.color = grdefaults.color; /* color */ p->errbar.pen.pattern = grdefaults.pattern; /* pattern */ p->errbar.lines = grdefaults.lines; /* error bar line width */ p->errbar.linew = grdefaults.linew; /* error bar line style */ p->errbar.riser_linew = grdefaults.linew; /* riser line width */ p->errbar.riser_lines = grdefaults.lines; /* riser line style */ p->errbar.barsize = 1.0; /* size of error bar */ p->errbar.arrow_clip = FALSE; /* draw arrows if clipped */ p->errbar.cliplen = 0.1; /* max v.p. riser length */ p->comments[0] = 0; /* how did this set originate */ p->lstr[0] = 0; /* legend string */ p->data.len = 0; /* dataset length */ for (i = 0; i < MAX_SET_COLS; i++) { p->data.ex[i] = NULL; } p->data.s = NULL; /* pointer to strings */ } void set_default_ticks(tickmarks *t) { int i; if (t == NULL) { return; } t->active = TRUE; t->zero = FALSE; t->tl_flag = TRUE; t->t_flag = TRUE; set_default_string(&t->label); t->label.x = 0.0; t->label.y = 0.08; t->tmajor = 0.2; t->nminor = 1; t->t_round = TRUE; t->offsx = 0.0; t->offsy = 0.0; t->label_layout = LAYOUT_PARALLEL; t->label_place = TYPE_AUTO; t->label_op = PLACEMENT_NORMAL; t->tl_format = FORMAT_GENERAL; t->tl_prec = 5; t->tl_formula = NULL; t->tl_angle = 0; t->tl_skip = 0; t->tl_staggered = 0; t->tl_starttype = TYPE_AUTO; t->tl_stoptype = TYPE_AUTO; t->tl_start = 0.0; t->tl_stop = 0.0; t->tl_op = PLACEMENT_NORMAL; t->tl_gaptype = TYPE_AUTO; t->tl_gap.x = 0.0; t->tl_gap.y = 0.01; t->tl_font = grdefaults.font; t->tl_charsize = grdefaults.charsize; t->tl_color = grdefaults.color; t->tl_appstr[0] = 0; t->tl_prestr[0] = 0; t->t_spec = TICKS_SPEC_NONE; t->t_autonum = 6; t->t_inout = TICKS_IN; t->t_op = PLACEMENT_BOTH; t->props.size = grdefaults.charsize; t->mprops.size = grdefaults.charsize / 2; t->t_drawbar = TRUE; t->t_drawbarcolor = grdefaults.color; t->t_drawbarlines = grdefaults.lines; t->t_drawbarlinew = grdefaults.linew; t->props.gridflag = FALSE; t->mprops.gridflag = FALSE; t->props.color = grdefaults.color; t->props.lines = grdefaults.lines; t->props.linew = grdefaults.linew; t->mprops.color = grdefaults.color; t->mprops.lines = grdefaults.lines; t->mprops.linew = grdefaults.linew; t->nticks = 0; for (i = 0; i < MAX_TICKS; i++) { t->tloc[i].wtpos = 0.0; t->tloc[i].label = NULL; } } grace-5.1.23/src/files.c0000644000076500001440000010724611004671665014505 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * read data files * */ #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_NETCDF # include #endif #include "globals.h" #include "utils.h" #include "files.h" #include "ssdata.h" #include "graphs.h" #include "graphutils.h" #include "parser.h" #include "protos.h" #define MAXERR 5 /* * number of rows to allocate for each call to realloc */ #define BUFSIZE 512 /* * number of bytes in each line chunk * (should be related to system pipe size, typically 4K) */ #ifndef PIPE_BUF # define PIPE_BUF 4096 #endif #define CHUNKSIZE 2*PIPE_BUF char *close_input; /* name of real-time input to close */ struct timeval read_begin = {0l, 0l}; /* used to check too long inputs */ static Input_buffer dummy_ib = {-1, 0, 0, 0, 0, NULL, 0, 0, NULL, 0l}; int nb_rt = 0; /* number of real time file descriptors */ Input_buffer *ib_tbl = 0; /* table for each open input */ int ib_tblsize = 0; /* number of elements in ib_tbl */ static int time_spent(void); static int expand_ib_tbl(void); static int expand_line_buffer(char **adrBuf, int *ptrSize, char **adrPtr); static int reopen_real_time_input(Input_buffer *ib); static int read_real_time_lines(Input_buffer *ib); static int process_complete_lines(Input_buffer *ib); static int read_long_line(FILE *fp, char **linebuf, int *buflen); static int uniread(FILE *fp, int load_type, char *label); /* * part of the time sliced already spent in milliseconds */ static int time_spent(void) { struct timeval now; gettimeofday(&now, NULL); return 1000 * (now.tv_sec - read_begin.tv_sec) + (now.tv_usec - read_begin.tv_usec) / 1000; } /* * expand the table of monitored real time inputs */ static int expand_ib_tbl(void) { int i, new_size; Input_buffer *new_tbl; new_size = (ib_tblsize > 0) ? 2*ib_tblsize : 5; new_tbl = xcalloc(new_size, sizeof(Input_buffer)); if (new_tbl == NULL) { return RETURN_FAILURE; } for (i = 0; i < new_size; i++) { new_tbl[i] = (i < ib_tblsize) ? ib_tbl[i] : dummy_ib; } if (ib_tblsize > 0) { xfree((void *) ib_tbl); } ib_tbl = new_tbl; ib_tblsize = new_size; return RETURN_SUCCESS; } /* * expand a line buffer */ static int expand_line_buffer(char **adrBuf, int *ptrSize, char **adrPtr) { char *newbuf; int newsize; newsize = *ptrSize + CHUNKSIZE; newbuf = xmalloc(newsize); if (newbuf == 0) { return RETURN_FAILURE; } if (*ptrSize == 0) { /* this is the first time through */ if (adrPtr) { *adrPtr = newbuf; } } else { /* we are expanding an existing line */ strncpy(newbuf, *adrBuf, *ptrSize); if (adrPtr) { *adrPtr += newbuf - *adrBuf; } xfree(*adrBuf); } *adrBuf = newbuf; *ptrSize = newsize; return RETURN_SUCCESS; } /* * reopen an Input_buffer (surely a fifo) */ static int reopen_real_time_input(Input_buffer *ib) { int fd; char buf[256]; /* in order to avoid race conditions (broken pipe on the write side), we open a new file descriptor before closing the existing one */ fd = open(ib->name, O_RDONLY | O_NONBLOCK); if (fd < 0) { sprintf(buf, "Can't reopen real time input %s", ib->name); errmsg(buf); unregister_real_time_input(ib->name); return RETURN_FAILURE; } #ifndef NONE_GUI xunregister_rti((XtInputId) ib->id); #endif /* swapping the file descriptors */ close(ib->fd); ib->fd = fd; #ifndef NONE_GUI xregister_rti(ib); #endif return RETURN_SUCCESS; } /* * unregister a file descriptor no longer monitored * (since Input_buffer structures dedicated to static inputs * are not kept in the table, it is not an error to unregister * an input not already registered) */ void unregister_real_time_input(const char *name) { Input_buffer *ib; int l1, l2; l1 = strlen(name); nb_rt = 0; for (ib = ib_tbl; ib < ib_tbl + ib_tblsize; ib++) { l2 = (ib->name == NULL) ? -1 : strlen(ib->name); if (l1 == l2 && strcmp (name, ib->name) == 0) { /* name is usually the same pointer as ib->name so we cannot */ /* free the string and output the message using name afterwards */ #ifndef NONE_GUI xunregister_rti((XtInputId) ib->id); #endif close(ib->fd); ib->fd = -1; xfree(ib->name); ib->name = NULL; } else if (l2 > 0) { /* this descriptor (if not dummy!) is still in use */ nb_rt++; } } } /* * register a file descriptor for monitoring */ int register_real_time_input(int fd, const char *name, int reopen) { Input_buffer *ib; char buf[256]; /* some safety checks */ if (fd < 0) { sprintf(buf, "%s : internal error, wrong file descriptor", name); errmsg(buf); return RETURN_FAILURE; } #ifdef HAVE_FCNTL if (fcntl(fd, F_GETFL) & O_WRONLY) { fprintf(stderr, "Descriptor %d not open for reading\n", fd); return RETURN_FAILURE; } #endif /* remove previous entry for the same set if any */ unregister_real_time_input(name); /* find an empty slot in the table */ for (ib = ib_tbl; ib < ib_tbl + ib_tblsize; ib++) { if (ib->fd == fd) { sprintf(buf, "%s : internal error, file descriptor already in use", name); errmsg(buf); return RETURN_FAILURE; } else if (ib->fd < 0) { break; } } if (ib == ib_tbl + ib_tblsize) { /* the table was full, we expand it */ int old_size = ib_tblsize; if (expand_ib_tbl() != RETURN_SUCCESS) { return RETURN_FAILURE; } ib = ib_tbl + old_size; } /* we keep the current buffer (even if 0), and only say everything is available */ ib->fd = fd; ib->errors = 0; ib->lineno = 0; ib->zeros = 0; ib->reopen = reopen; ib->name = copy_string(ib->name, name); ib->used = 0; #ifndef NONE_GUI xregister_rti (ib); #endif nb_rt++; return RETURN_SUCCESS; } /* * read a real-time line (but do not process it) */ static int read_real_time_lines(Input_buffer *ib) { char *cursor; int available, nbread; char buf[256]; cursor = ib->buf + ib->used; available = ib->size - ib->used; /* have we enough space to store the characters ? */ if (available < 2) { if (expand_line_buffer(&(ib->buf), &(ib->size), &cursor) != RETURN_SUCCESS) { return RETURN_FAILURE; } available = ib->buf + ib->size - cursor; } /* read as much as possible */ nbread = read(ib->fd, (void *) cursor, available - 1); if (nbread < 0) { sprintf(buf, "%s : read error on real time input", ib->name); errmsg(buf); return RETURN_FAILURE; } else { if (nbread == 0) { ib->zeros++; } else { ib->zeros = 0; ib->used += nbread; ib->buf[ib->used] = '\0'; } } return RETURN_SUCCESS; } /* * process complete lines that have already been read */ static int process_complete_lines(Input_buffer *ib) { int line_corrupted; char *begin_of_line, *end_of_line; char buf[256]; if (ib->used <= 0) { return RETURN_SUCCESS; } end_of_line = NULL; do { /* loop over the embedded lines */ begin_of_line = (end_of_line == NULL) ? ib->buf : (end_of_line + 1); end_of_line = begin_of_line; line_corrupted = 0; while (end_of_line != NULL && *end_of_line != '\n') { /* trying to find a complete line */ if (end_of_line == ib->buf + ib->used) { end_of_line = NULL; } else { if (*end_of_line == '\0') { line_corrupted = 1; } ++end_of_line; } } if (end_of_line != NULL) { /* we have a whole line */ ++(ib->lineno); *end_of_line = '\0'; close_input = NULL; if (line_corrupted || scanner(begin_of_line)) { sprintf(buf, "Error at line %d", ib->lineno); errmsg(buf); ++(ib->errors); if (ib->errors > MAXERR) { #ifndef NONE_GUI /* this prevents from being called recursively by the inner X loop of yesno */ xunregister_rti((XtInputId) ib->id); #endif if (yesno("Lots of errors, abort?", NULL, NULL, NULL)) { close_input = copy_string(close_input, ""); } #ifndef NONE_GUI xregister_rti(ib); #endif ib->errors = 0; } } if (close_input != NULL) { /* something should be closed */ if (close_input[0] == '\0') { unregister_real_time_input(ib->name); } else { unregister_real_time_input(close_input); } xfree(close_input); close_input = NULL; if (ib->fd < 0) { /* we have closed ourselves */ return RETURN_SUCCESS; } } } } while (end_of_line != NULL); if (end_of_line != NULL) { /* the line has just been processed */ begin_of_line = end_of_line + 1; } if (begin_of_line > ib->buf) { /* move the remaining data to the beginning */ ib->used -= begin_of_line - ib->buf; memmove(ib->buf, begin_of_line, ib->used); ib->buf[ib->used] = '\0'; } return RETURN_SUCCESS; } int real_time_under_monitoring(void) { return nb_rt > 0; } /* * monitor the set of registered file descriptors for pending input */ int monitor_input(Input_buffer *tbl, int tblsize, int no_wait) { Input_buffer *ib; fd_set rfds; int remaining; struct timeval timeout; int highest, first_time, retsel; /* we don't want to get stuck here, we memorize the start date and will check we do not exceed our allowed time slice */ gettimeofday(&read_begin, NULL); first_time = 1; retsel = 1; while (((time_spent() < timer_delay) || first_time) && retsel > 0) { /* register all the monitored descriptors */ highest = -1; FD_ZERO(&rfds); for (ib = tbl; ib < tbl + tblsize; ib++) { if (ib->fd >= 0) { FD_SET(ib->fd, &rfds); if (ib->fd > highest) { highest = ib->fd; } } } if (highest < 0) { /* there's nothing to do */ return RETURN_SUCCESS; } if (no_wait) { /* just check for available data without waiting */ remaining = 0; } else { /* wait until data or end of time slice arrive */ remaining = timer_delay - time_spent(); if (remaining < 0) { remaining = 0; } } timeout.tv_sec = remaining / 1000; timeout.tv_usec = 1000l * (remaining % 1000); retsel = select(highest + 1, &rfds, NULL, NULL, &timeout); for (ib = tbl; ((time_spent() < timer_delay) || first_time) && ib < tbl + tblsize; ib++) { if (ib->fd >= 0 && FD_ISSET(ib->fd, &rfds)) { /* there is pending input */ if (read_real_time_lines(ib) != RETURN_SUCCESS || process_complete_lines(ib) != RETURN_SUCCESS) { return RETURN_FAILURE; } if (ib->zeros >= 5) { /* we were told five times something happened, but never got any byte : we assume the pipe (or whatever) has been closed by the peer */ if (ib->reopen) { /* we should reset the input buffer, in case the peer also reopens it */ if (reopen_real_time_input(ib) != RETURN_SUCCESS) { return RETURN_FAILURE; } } else { unregister_real_time_input(ib->name); } /* we have changed the table, we should end the loop */ break; } } } /* after one pass, we obey timeout */ first_time = 0; } return RETURN_SUCCESS; } /* replacement for fgets() to fix up reading DOS text files */ char *grace_fgets(char *s, int size, FILE *stream) { int slen; char *endptr; s = fgets(s, size, stream); if (!s) { return NULL; } slen = strlen(s); if (slen >= 2) { endptr = s + slen - 2; /* check for DOS ending "\r\n" */ if (*endptr == '\r') { /* 'move' un*x string tail "\n\0" one char forward */ *endptr = '\n'; *(endptr+1) = '\0'; } } return s; } /* * read a line increasing buffer as necessary */ static int read_long_line(FILE * fp, char **linebuf, int *buflen) { char *cursor; int available; int nbread, retval; cursor = *linebuf; available = *buflen; retval = RETURN_FAILURE; do { /* do we have enough space to store the characters ? */ if (available < 2) { if (expand_line_buffer(linebuf, buflen, &cursor) != RETURN_SUCCESS) { return RETURN_FAILURE; } } available = (int)(*linebuf-cursor) + *buflen; /* read as much as possible */ if (grace_fgets(cursor, available, fp) == NULL) { return retval; } nbread = strlen(cursor); if (nbread < 1) { return retval; } else { retval = RETURN_SUCCESS; } /* prepare next read */ cursor += nbread; available -= nbread; } while (*(cursor - 1) != '\n'); return retval; } /* open a file for write */ FILE *grace_openw(char *fn) { struct stat statb; char buf[GR_MAXPATHLEN + 50]; FILE *retval; if (!fn || !fn[0]) { errmsg("No file name given"); return NULL; } else if (strcmp(fn, "-") == 0 || strcmp(fn, "stdout") == 0) { return stdout; } else { if (stat(fn, &statb) == 0) { /* check to make sure this is a file and not a dir */ if (S_ISREG(statb.st_mode)) { sprintf(buf, "Overwrite %s?", fn); if (!yesno(buf, NULL, NULL, NULL)) { return NULL; } } else { sprintf(buf, "%s is not a regular file!", fn); errmsg(buf); return NULL; } } retval = filter_write(fn); if (!retval) { sprintf(buf, "Can't write to file %s, check permissions!", fn); errmsg(buf); } return retval; } } char *grace_path(char *fn) { static char buf[GR_MAXPATHLEN]; struct stat statb; if (fn == NULL) { return NULL; } else { strcpy(buf, fn); switch (fn[0]) { case '/': case '\0': return buf; break; case '~': expand_tilde(buf); return buf; break; case '.': switch (fn[1]) { case '/': return buf; break; case '.': if (fn[2] == '/') { return buf; } break; } } /* if we arrived here, the path is relative */ if (stat(buf, &statb) == 0) { /* ok, we found it */ return buf; } /* second try: in .grace/ in the current dir */ strcpy(buf, ".grace/"); strcat(buf, fn); if (stat(buf, &statb) == 0) { return buf; } /* third try: in .grace/ in the $HOME dir */ strcpy(buf, get_userhome()); strcat(buf, ".grace/"); strcat(buf, fn); if (stat(buf, &statb) == 0) { return buf; } /* the last attempt: in $GRACE_HOME */ strcpy(buf, get_grace_home()); strcat(buf, "/"); strcat(buf, fn); if (stat(buf, &statb) == 0) { return buf; } /* giving up... */ strcpy(buf, fn); return buf; } } char *grace_exe_path(char *fn) { static char buf[GR_MAXPATHLEN]; char *cp; if (fn == NULL) { return NULL; } else { cp = strchr(fn, ' '); if (cp == NULL) { return exe_path_translate(grace_path(fn)); } else { strcpy(buf, fn); buf[cp - fn] = '\0'; strcpy(buf, grace_path(buf)); strcat(buf, " "); strcat(buf, cp); return exe_path_translate(buf); } } } /* open a file for read */ FILE *grace_openr(char *fn, int src) { struct stat statb; char *tfn; char buf[GR_MAXPATHLEN + 50]; if (!fn || !fn[0]) { errmsg("No file name given"); return NULL; } switch (src) { case SOURCE_DISK: tfn = grace_path(fn); if (strcmp(tfn, "-") == 0 || strcmp(tfn, "stdin") == 0) { return stdin; } else if (stat(tfn, &statb)) { sprintf(buf, "Can't stat file %s", tfn); errmsg(buf); return NULL; /* check to make sure this is a file and not a dir */ } else if (!S_ISREG(statb.st_mode)) { sprintf(buf, "%s is not a regular file", tfn); errmsg(buf); return NULL; } else { return filter_read(tfn); } break; case SOURCE_PIPE: tfn = grace_exe_path(fn); return popen(tfn, "r"); break; default: errmsg("Wrong call to grace_openr()"); return NULL; } } /* * close either a pipe or a file pointer * */ void grace_close(FILE *fp) { if (fp == stdin || fp == stderr || fp == stdout) { return; } if (pclose(fp) == -1) { fclose(fp); } } int getparms(char *plfile) { int linecount = 0, errcnt = 0; char *linebuf=NULL; int linelen=0; FILE *pp; if ((pp = grace_openr(plfile, SOURCE_DISK)) == NULL) { return 0; } else { errcnt = 0; while (read_long_line(pp, &linebuf, &linelen) == RETURN_SUCCESS) { linecount++; if (scanner(linebuf)) { sprintf(linebuf, "Error at line %d", linecount); errmsg(linebuf); errcnt++; if (errcnt > MAXERR) { if (yesno("Lots of errors, abort?", NULL, NULL, NULL)) { grace_close(pp); xfree(linebuf); return 0; } else { errcnt = 0; } } } } if (pp != stdin) { grace_close(pp); } } xfree(linebuf); return 1; } static int uniread(FILE *fp, int load_type, char *label) { int nrows, ncols, nncols, nscols, nncols_req; int *formats = NULL; int breakon, readerror; ss_data ssd; char *s, tbuf[128]; char *linebuf=NULL; int linelen=0; /* a misleading name ... */ int linecount; linecount = 0; readerror = 0; nrows = 0; breakon = TRUE; memset(&ssd, 0, sizeof(ssd)); while (read_long_line(fp, &linebuf, &linelen) == RETURN_SUCCESS) { linecount++; s = linebuf; while (*s == ' ' || *s == '\t' || *s == '\n') { s++; } /* skip comments */ if (*s == '#') { continue; } /* command end-of-set EOL */ if (*s == '@' || *s == '&' || *s == '\0') { /* a data break line */ if (breakon != TRUE) { /* free excessive storage */ realloc_ss_data(&ssd, nrows); /* store accumulated data in set(s) */ if (store_data(&ssd, load_type, label) != RETURN_SUCCESS) { xfree(linebuf); return RETURN_FAILURE; } /* reset state registers */ nrows = 0; readerror = 0; breakon = TRUE; } if (*s == '@') { scanner(s + 1); continue; } } else { if (breakon) { /* parse the data line */ XCFREE(formats); if (parse_ss_row(s, &nncols, &nscols, &formats) != RETURN_SUCCESS) { errmsg("Can't parse data"); xfree(linebuf); return RETURN_FAILURE; } if (load_type == LOAD_SINGLE) { nncols_req = settype_cols(curtype); if (nncols_req <= nncols) { nncols = nncols_req; } else if (nncols_req == nncols + 1) { /* X from index, OK */ ; } else { errmsg("Column count incorrect"); xfree(linebuf); return RETURN_FAILURE; } } ncols = nncols + nscols; /* init the data storage */ if (init_ss_data(&ssd, ncols, formats) != RETURN_SUCCESS) { errmsg("Malloc failed in uniread()"); xfree(linebuf); return RETURN_FAILURE; } breakon = FALSE; } if (nrows % BUFSIZE == 0) { if (realloc_ss_data(&ssd, nrows + BUFSIZE) != RETURN_SUCCESS) { errmsg("Malloc failed in uniread()"); free_ss_data(&ssd); xfree(linebuf); return RETURN_FAILURE; } } if (insert_data_row(&ssd, nrows, s) != RETURN_SUCCESS) { sprintf(tbuf, "Error parsing line %d, skipped", linecount); errmsg(tbuf); readerror++; if (readerror > MAXERR) { if (yesno("Lots of errors, abort?", NULL, NULL, NULL)) { free_ss_data(&ssd); xfree(linebuf); return RETURN_FAILURE; } else { readerror = 0; } } } else { nrows++; } } } if (nrows > 0) { /* free excessive storage */ realloc_ss_data(&ssd, nrows); /* store accumulated data in set(s) */ if (store_data(&ssd, load_type, label) != RETURN_SUCCESS) { xfree(linebuf); return RETURN_FAILURE; } } xfree(linebuf); xfree(formats); return RETURN_SUCCESS; } int getdata(int gno, char *fn, int src, int load_type) { FILE *fp; int retval; int save_version, cur_version; fp = grace_openr(fn, src); if (fp == NULL) { return RETURN_FAILURE; } save_version = get_project_version(); set_project_version(0); set_parser_gno(gno); retval = uniread(fp, load_type, fn); grace_close(fp); cur_version = get_project_version(); if (cur_version != 0) { /* a complete project */ postprocess_project(cur_version); } else if (load_type != LOAD_BLOCK) { /* just a few sets */ autoscale_graph(gno, autoscale_onread); } set_project_version(save_version); return retval; } /* * read data to the set from a file overriding the current contents */ int update_set_from_file(int gno, int setno, char *fn, int src) { int retval; if (set_parser_setno(gno, setno) != RETURN_SUCCESS) { retval = RETURN_FAILURE; } else { FILE *fp; fp = grace_openr(fn, src); killsetdata(gno, setno); curtype = dataset_type(gno, setno); retval = uniread(fp, LOAD_SINGLE, fn); grace_close(fp); } return retval; } void outputset(int gno, int setno, char *fname, char *dformat) { FILE *cp; if ((cp = grace_openw(fname)) == NULL) { return; } else { write_set(gno, setno, cp, dformat, TRUE); grace_close(cp); } } int load_project_file(char *fn, int as_template) { int gno; int retval; if (wipeout()) { return RETURN_FAILURE; } else { if (getdata(0, fn, SOURCE_DISK, LOAD_SINGLE) == RETURN_SUCCESS) { if (as_template == FALSE) { set_docname(fn); } clear_dirtystate(); retval = RETURN_SUCCESS; } else { retval = RETURN_FAILURE; } /* try to switch to the first active graph */ for (gno = 0; gno < number_of_graphs(); gno++) { if (is_graph_hidden(gno) == FALSE) { select_graph(gno); break; } } #ifndef NONE_GUI update_all(); #endif return retval; } } int load_project(char *fn) { return load_project_file(fn, FALSE); } int new_project(char *template) { int retval; char *s; if (template == NULL || template[0] == '\0') { retval = load_project_file("templates/Default.agr", TRUE); } else if (template[0] == '/') { retval = load_project_file(template, TRUE); } else { s = xmalloc(strlen("templates/") + strlen(template) + 1); if (s == NULL) { retval = RETURN_FAILURE; } else { sprintf(s, "templates/%s", template); retval = load_project_file(s, TRUE); xfree(s); } } return retval; } int save_project(char *fn) { FILE *cp; int gno, setno; char *old_fn; int noask_save = noask; old_fn = get_docname(); if (compare_strings(old_fn, fn)) { /* If saving under the same name, don't warn about overwriting */ noask = TRUE; } if ((cp = grace_openw(fn)) == NULL) { noask = noask_save; return RETURN_FAILURE; } putparms(-1, cp, TRUE); for (gno = 0; gno < number_of_graphs(); gno++) { for (setno = 0; setno < number_of_sets(gno); setno++) { write_set(gno, setno, cp, sformat, FALSE); } } grace_close(cp); set_docname(fn); clear_dirtystate(); noask = noask_save; return RETURN_SUCCESS; } /* * write out a set */ int write_set(int gno, int setno, FILE *cp, char *format, int rawdata) { int i, n, col, ncols; double *x[MAX_SET_COLS]; char **s; if (cp == NULL) { return RETURN_FAILURE; } if (is_set_active(gno, setno) == TRUE) { n = getsetlength(gno, setno); ncols = dataset_cols(gno, setno); for (col = 0; col < ncols; col++) { x[col] = getcol(gno, setno, col); } s = get_set_strings(gno, setno); if (format == NULL) { format = sformat; } if (!rawdata) { fprintf(cp, "@target G%d.S%d\n", gno, setno); fprintf(cp, "@type %s\n", set_types(dataset_type(gno, setno))); } for (i = 0; i < n; i++) { for (col = 0; col < ncols; col++) { if (col != 0) { fputs(" ", cp); } fprintf(cp, format, x[col][i]); } if (s != NULL) { fprintf(cp, " \"%s\"", PSTRING(s[i])); } fputs("\n", cp); } if (rawdata) { fprintf(cp, "\n"); } else { fprintf(cp, "&\n"); } } return RETURN_SUCCESS; } #ifdef HAVE_NETCDF /* * read a variable from netcdf file into a set in graph gno * xvar and yvar are the names for x, y in the netcdf file resp. * return 0 on fail, return 1 if success. * * if xvar == NULL, then load the index of the point to x * */ int readnetcdf(int gno, int setno, char *netcdfname, char *xvar, char *yvar, int nstart, int nstop, int nstride) { int cdfid; /* netCDF id */ int i, n; double *x, *y; float *xf, *yf; short *xs, *ys; long *xl, *yl; char buf[256]; /* variable ids */ int x_id = -1, y_id; /* variable shapes */ long start[2]; long count[2]; nc_type xdatatype = 0; nc_type ydatatype = 0; int xndims, xdim[10], xnatts; int yndims, ydim[10], ynatts; long nx, ny; ncopts = 0; /* no crash on error */ /* * get a set if on entry setno == -1, if setno=-1, then fail */ if (setno == -1) { if ((setno = nextset(gno)) == -1) { return 0; } } else { if (is_set_active(gno, setno)) { killset(gno, setno); } } /* * open the netcdf file and locate the variable to read */ if ((cdfid = ncopen(netcdfname, NC_NOWRITE)) == -1) { errmsg("Can't open file."); return 0; } if (xvar != NULL) { if ((x_id = ncvarid(cdfid, xvar)) == -1) { char ebuf[256]; sprintf(ebuf, "readnetcdf(): No such variable %s for X", xvar); errmsg(ebuf); return 0; } ncvarinq(cdfid, x_id, NULL, &xdatatype, &xndims, xdim, &xnatts); ncdiminq(cdfid, xdim[0], NULL, &nx); if (xndims != 1) { errmsg("Number of dimensions for X must be 1."); return 0; } } if ((y_id = ncvarid(cdfid, yvar)) == -1) { char ebuf[256]; sprintf(ebuf, "readnetcdf(): No such variable %s for Y", yvar); errmsg(ebuf); return 0; } ncvarinq(cdfid, y_id, NULL, &ydatatype, &yndims, ydim, &ynatts); ncdiminq(cdfid, ydim[0], NULL, &ny); if (yndims != 1) { errmsg("Number of dimensions for Y must be 1."); return 0; } if (xvar != NULL) { n = nx < ny ? nx : ny; } else { n = ny; } if (n <= 0) { errmsg("Length of dimension == 0."); return 0; } /* * allocate for this set */ x = xcalloc(n, SIZEOF_DOUBLE); y = xcalloc(n, SIZEOF_DOUBLE); if (x == NULL || y == NULL) { XCFREE(x); XCFREE(y); ncclose(cdfid); return 0; } start[0] = 0; count[0] = n; /* This will retrieve whole file, modify * these values to get subset. This will only * work for single-dimension vars. You need * to add dims to start & count for * multi-dimensional. */ /* * read the variables from the netcdf file */ if (xvar != NULL) { /* TODO should check for other data types here */ /* TODO should check for NULL on the xcallocs() */ /* TODO making assumptions about the sizes of shorts and longs */ switch (xdatatype) { case NC_SHORT: xs = xcalloc(n, SIZEOF_SHORT); ncvarget(cdfid, x_id, start, count, (void *) xs); for (i = 0; i < n; i++) { x[i] = xs[i]; } xfree(xs); break; case NC_LONG: xl = xcalloc(n, SIZEOF_LONG); ncvarget(cdfid, x_id, start, count, (void *) xl); for (i = 0; i < n; i++) { x[i] = xl[i]; } xfree(xl); break; case NC_FLOAT: xf = xcalloc(n, SIZEOF_FLOAT); ncvarget(cdfid, x_id, start, count, (void *) xf); for (i = 0; i < n; i++) { x[i] = xf[i]; } xfree(xf); break; case NC_DOUBLE: ncvarget(cdfid, x_id, start, count, (void *) x); break; default: errmsg("Data type not supported"); XCFREE(x); XCFREE(y); ncclose(cdfid); return 0; break; } } else { /* just load index */ for (i = 0; i < n; i++) { x[i] = i + 1; } } switch (ydatatype) { case NC_SHORT: ys = xcalloc(n, SIZEOF_SHORT); ncvarget(cdfid, y_id, start, count, (void *) ys); for (i = 0; i < n; i++) { y[i] = ys[i]; } break; case NC_LONG: yl = xcalloc(n, SIZEOF_LONG); ncvarget(cdfid, y_id, start, count, (void *) yl); for (i = 0; i < n; i++) { y[i] = yl[i]; } break; case NC_FLOAT: /* TODO should check for NULL here */ yf = xcalloc(n, SIZEOF_FLOAT); ncvarget(cdfid, y_id, start, count, (void *) yf); for (i = 0; i < n; i++) { y[i] = yf[i]; } xfree(yf); break; case NC_DOUBLE: ncvarget(cdfid, y_id, start, count, (void *) y); break; default: errmsg("Data type not supported"); XCFREE(x); XCFREE(y); ncclose(cdfid); return 0; break; } ncclose(cdfid); /* * initialize stuff for the newly created set */ activateset(gno, setno); set_dataset_type(gno, setno, SET_XY); setcol(gno, setno, 0, x, n); setcol(gno, setno, 1, y, n); sprintf(buf, "File %s x = %s y = %s", netcdfname, xvar == NULL ? "Index" : xvar, yvar); setcomment(gno, setno, buf); autoscale_graph(gno, autoscale_onread); return 1; } int write_netcdf(char *fname) { char buf[512]; int ncid; /* netCDF id */ int i, j; /* dimension ids */ int n_dim; /* variable ids */ int x_id, y_id; int dims[1]; long len[1]; long it = 0; double *x, *y, x1, x2, y1, y2; ncid = nccreate(fname, NC_CLOBBER); ncattput(ncid, NC_GLOBAL, "Contents", NC_CHAR, 11, (void *) "grace sets"); for (i = 0; i < number_of_graphs(); i++) { if (is_graph_active(i)) { for (j = 0; j < number_of_sets(i); j++) { if (is_set_active(i, j)) { char s[64]; sprintf(buf, "g%d_s%d_comment", i, j); ncattput(ncid, NC_GLOBAL, buf, NC_CHAR, strlen(getcomment(i, j)), (void *) getcomment(i, j)); sprintf(buf, "g%d_s%d_type", i, j); strcpy(s, set_types(dataset_type(i, j))); ncattput(ncid, NC_GLOBAL, buf, NC_CHAR, strlen(s), (void *) s); sprintf(buf, "g%d_s%d_n", i, j); n_dim = ncdimdef(ncid, buf, getsetlength(i, j)); dims[0] = n_dim; getsetminmax(i, j, &x1, &x2, &y1, &y2); sprintf(buf, "g%d_s%d_x", i, j); x_id = ncvardef(ncid, buf, NC_DOUBLE, 1, dims); ncattput(ncid, x_id, "min", NC_DOUBLE, 1, (void *) &x1); ncattput(ncid, x_id, "max", NC_DOUBLE, 1, (void *) &x2); dims[0] = n_dim; sprintf(buf, "g%d_s%d_y", i, j); y_id = ncvardef(ncid, buf, NC_DOUBLE, 1, dims); ncattput(ncid, y_id, "min", NC_DOUBLE, 1, (void *) &y1); ncattput(ncid, y_id, "max", NC_DOUBLE, 1, (void *) &y2); } } } } ncendef(ncid); ncclose(ncid); if ((ncid = ncopen(fname, NC_WRITE)) == -1) { errmsg("Can't open file."); return 1; } for (i = 0; i < number_of_graphs(); i++) { if (is_graph_active(i)) { for (j = 0; j < number_of_sets(i); j++) { if (is_set_active(i, j)) { len[0] = getsetlength(i, j); x = getx(i, j); y = gety(i, j); sprintf(buf, "g%d_s%d_x", i, j); x_id = ncvarid(ncid, buf); sprintf(buf, "g%d_s%d_y", i, j); y_id = ncvarid(ncid, buf); ncvarput(ncid, x_id, &it, len, (void *) x); ncvarput(ncid, y_id, &it, len, (void *) y); } } } } ncclose(ncid); return 0; } #endif /* HAVE_NETCDF */ grace-5.1.23/src/dummydrv.c0000644000076500001440000000504110071615561015234 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Dummy (Null) driver for Grace */ #include #include #include "defines.h" #include "draw.h" #include "device.h" #include "devlist.h" #include "dummydrv.h" static Device_entry dev_dummy = {DEVICE_TERM, "Dummy", dummyinitgraphics, NULL, NULL, "", TRUE, FALSE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; int register_dummy_drv(void) { return register_device(dev_dummy); } int dummyinitgraphics(void) { /* device-dependent routines */ devupdatecmap = NULL; devdrawpixel = dummy_drawpixel; devdrawpolyline = dummy_drawpolyline; devfillpolygon = dummy_fillpolygon; devdrawarc = dummy_drawarc; devfillarc = dummy_fillarc; devputpixmap = dummy_putpixmap; devputtext = dummy_puttext; devleavegraphics = dummy_leavegraphics; return RETURN_SUCCESS; } void dummy_drawpixel(VPoint vp){} void dummy_drawpolyline(VPoint *vps, int n, int mode){} void dummy_fillpolygon(VPoint *vps, int nc){} void dummy_drawarc(VPoint vp1, VPoint vp2, int a1, int a2){} void dummy_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode){} void dummy_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type){} void dummy_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning){} void dummy_leavegraphics(void){} grace-5.1.23/src/bitmaps.h0000644000076500001440000002227710071615561015043 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __BITMAPS_H_ #define __BITMAPS_H_ #if defined(HAVE_XPM) static char * grace_icon_xpm[] = { "48 39 6 1", " c #000000000000", ". c #FFFFFFFFFFFF", "X c #BEFBBEFBBEFB", "o c #51445144FFFF", "O c #FFFF14514103", "+ c #0000AAAA1861", " ", " .............................................. ", " .............................................. ", " ............... ............. ", " .............................................. ", " ................. ............... ", " .............................................. ", " ....... ...... ", " ....... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ...... ", " ....... XXXXXXXXXXXXXXXXXXXXXXXXXXoXXXX ...... ", " ..... . XXoooXX XXXXXXXXXXXoooXXXX ...... ", " .. .... XXXXXXXXXXXXXXXXXXXXXXXXoXooOXX ...... ", " .. .... XXOOOXX XXXXXXXXXXXXoXOoXXX ...... ", " .. .... XXXXXXXXXXXXXXXXXXXXXXXoOOXooXX ...... ", " .. .... XX+++XX XXXXooXXXXOoXXXXoXX ...... ", " .. .. . XXXXXXXXXXXXXXXoXoXXXOoXXXXXXXX ...... ", " .. .... XXXXXXXXXXXXXXXoXoXOOooXXXXXXXX ...... ", " .. .... XXXXXXXXXXXXXXoXXooXXoXXXXXXXXX ...... ", " .. .... XXXXXXXoXXXXXooXOOoXoXXXXXXXXXX ...... ", " .. .... XXXXXXooXXXXXoOOXXooXXXXXXXXXXX ...... ", " .. .. . XXXXXXoXoXXXoOXXXXXXXXXXXXXXXXX ...... ", " .. .... XXXXXooXoXXOoXXXXXXXXXXXXXXXXXX ...... ", " .. .... XXXXooXXooOooXXXXXXXXXXXXXXXXXX ...... ", " .. .... XXXXoXXOOoXoXXXXXXXXXX+++++XXXX ...... ", " .. .... XXXXoXOXXoXoXXXXXXXXXX+++++XXXX ...... ", " .. .. . XXXooOXXXXoXXXX+++++XX+++++XXXX ...... ", " .. .... XXOoXXXXXXXXXXX+++++XX+++++XXXX ...... ", " .. .... XOoXXXXX+++++XX+++++XX+++++XXXX ...... ", " .. .... XXoXXXXX+++++XX+++++XX+++++XXXX ...... ", " ....... XooXXXXX+++++XX+++++XX+++++XXXX ...... ", " ..... . XXXXXXXX+++++XX+++++XX+++++XXXX ...... ", " ....... ...... ", " .............................................. ", " ........ .... .... .... .... .... .... ....... ", " .............................................. ", " .............. ............ ", " .............................................. ", " .............................................. ", " "}; #else #define grace_icon_width 48 #define grace_icon_height 48 static unsigned char grace_icon_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x02, 0x20, 0x02, 0x00, 0x00, 0x98, 0x02, 0x20, 0x02, 0x00, 0x00, 0x78, 0x02, 0x20, 0x02, 0x00, 0x00, 0x3c, 0x02, 0x20, 0x02, 0x00, 0x00, 0x66, 0x02, 0x20, 0x02, 0x00, 0x0c, 0x43, 0x02, 0x20, 0x02, 0x00, 0xce, 0x81, 0x02, 0x20, 0x02, 0x00, 0xaa, 0x01, 0x02, 0x20, 0x02, 0x00, 0xdb, 0x00, 0x02, 0x20, 0x02, 0x82, 0x57, 0x00, 0x02, 0x20, 0x02, 0x83, 0x71, 0x00, 0x02, 0x20, 0x02, 0xc7, 0x20, 0x00, 0x02, 0x20, 0x82, 0x65, 0x00, 0x00, 0x02, 0x20, 0xc2, 0x7c, 0x00, 0x00, 0x02, 0x20, 0x42, 0x2e, 0x00, 0x00, 0x02, 0x20, 0x42, 0x29, 0x00, 0x0e, 0x02, 0x20, 0xe2, 0x38, 0x00, 0x0e, 0x02, 0x20, 0x32, 0x10, 0x1c, 0x0e, 0x02, 0x20, 0x1a, 0x00, 0x1c, 0x0e, 0x02, 0x00, 0x12, 0x38, 0x1c, 0x0e, 0x02, 0x00, 0x1a, 0x38, 0x1c, 0x0e, 0x02, 0x00, 0x02, 0x38, 0x1c, 0x0e, 0x02, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char grace_mask_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; #endif #define auto_width 16 #define auto_height 16 static unsigned char auto_bits[] = { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3c, 0x00, 0x3c, 0x06, 0x66, 0x1e, 0x7e, 0x76, 0xc3, 0x76, 0xc3, 0x06, 0x00, 0x1c, 0x00, 0x78, 0x00, 0x60, 0x00, 0x66, 0x00, 0x7e, 0x00, 0x78, 0x00, 0x00}; #define down_width 16 #define down_height 16 static unsigned char down_bits[] = { 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00}; #define expand_width 16 #define expand_height 16 static unsigned char expand_bits[] = { 0x00, 0x00, 0xfe, 0x7f, 0xfe, 0x3f, 0x02, 0x18, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0c, 0x40, 0xfe, 0x7f, 0xfe, 0x7f, 0x00, 0x00}; #define left_width 16 #define left_height 16 static unsigned char left_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0xfc, 0x3f, 0xfe, 0x3f, 0xfc, 0x3f, 0x38, 0x00, 0x30, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define right_width 16 #define right_height 16 static unsigned char right_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x1c, 0xfc, 0x3f, 0xfc, 0x7f, 0xfc, 0x3f, 0x00, 0x1c, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #define shrink_width 16 #define shrink_height 16 static unsigned char shrink_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0xf0, 0x1f, 0x10, 0x0c, 0x00, 0x06, 0x00, 0x03, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x10, 0xf0, 0x1f, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00}; #define up_width 16 #define up_height 16 static unsigned char up_bits[] = { 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00}; #define zoom_width 16 #define zoom_height 16 static unsigned char zoom_bits[] = { 0x00, 0x00, 0x70, 0x00, 0xd8, 0x00, 0x8c, 0x01, 0x06, 0x03, 0x02, 0x02, 0x06, 0x03, 0x8c, 0x01, 0xd8, 0x03, 0x70, 0x07, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0x40}; #endif /* __BITMAPS_H_ */ grace-5.1.23/src/miscwin.c0000644000076500001440000002113610071615562015042 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Misc properties * */ #include #include #include #include #include "globals.h" #include "utils.h" #include "graphs.h" #include "motifinc.h" #include "protos.h" extern int cursortype; #if defined WITH_XMHTML || defined WITH_LIBHELP extern int force_external_viewer; #endif static Widget props_frame; /* * Panel item declarations */ #ifdef DEBUG static SpinStructure *debug_item; #endif static Widget noask_item; static Widget dc_item; static Widget *graph_focus_choice_item; static Widget graph_drawfocus_choice_item; static Widget autoredraw_type_item; static Widget cursor_type_item; static SpinStructure *max_path_item; static Widget safe_mode_item; static Widget scrollper_item; static Widget shexper_item; static Widget linkscroll_item; static Widget *hint_item; static Widget date_item; static Widget wrap_year_item; static Widget two_digits_years_item; #if defined WITH_XMHTML || defined WITH_LIBHELP static Widget force_external_viewer_item; #endif /* * Event and Notify proc declarations */ static int props_define_notify_proc(void *data); static void wrap_year_cb(int onoff, void *data) { Widget wrap_year = (Widget) data; SetSensitive(wrap_year, onoff); } void create_props_frame(void *data) { set_wait_cursor(); if (props_frame == NULL) { Widget fr, rc, rc1; props_frame = CreateDialogForm(app_shell, "Preferences"); fr = CreateFrame(props_frame, "Responsiveness"); AddDialogFormChild(props_frame, fr); rc1 = CreateVContainer(fr); #ifdef DEBUG debug_item = CreateSpinChoice(rc1, "Debug level:", 1, SPIN_TYPE_INT, 0.0, 8.0, 1.0); #endif noask_item = CreateToggleButton(rc1, "Don't ask questions"); dc_item = CreateToggleButton(rc1, "Allow double clicks on canvas"); graph_focus_choice_item = CreatePanelChoice(rc1, "Graph focus switch", 4, "Button press", "As set", "Follows mouse", NULL); graph_drawfocus_choice_item = CreateToggleButton(rc1, "Display focus markers"); autoredraw_type_item = CreateToggleButton(rc1, "Auto redraw"); cursor_type_item = CreateToggleButton(rc1, "Crosshair cursor"); #if defined WITH_XMHTML || defined WITH_LIBHELP force_external_viewer_item = CreateToggleButton(rc1, "Use external help viewer for local documents"); #endif fr = CreateFrame(props_frame, "Restrictions"); AddDialogFormChild(props_frame, fr); rc1 = CreateVContainer(fr); max_path_item = CreateSpinChoice(rc1, "Max drawing path length:", 6, SPIN_TYPE_INT, 0.0, 1.0e6, 1000); safe_mode_item = CreateToggleButton(rc1, "Run in safe mode"); fr = CreateFrame(props_frame, "Scroll/zoom"); AddDialogFormChild(props_frame, fr); rc1 = CreateVContainer(fr); scrollper_item = CreateScale(rc1, "Scroll %", 0, 200, 20); shexper_item = CreateScale(rc1, "Zoom %", 0, 200, 20); linkscroll_item = CreateToggleButton(rc1, "Linked scrolling"); fr = CreateFrame(props_frame, "Dates"); rc1 = CreateVContainer(fr); hint_item = CreatePanelChoice(rc1, "Date hint", 5, "ISO", "European", "US", "None", NULL); date_item = CreateTextItem2(rc1, 20, "Reference date:"); rc = CreateHContainer(rc1); two_digits_years_item = CreateToggleButton(rc, "Two-digit year span"); wrap_year_item = CreateTextItem2(rc, 4, "Wrap year:"); AddToggleButtonCB(two_digits_years_item, wrap_year_cb, (void *) wrap_year_item); CreateAACDialog(props_frame, fr, props_define_notify_proc, NULL); } update_props_items(); RaiseWindow(GetParent(props_frame)); unset_wait_cursor(); } void update_props_items(void) { int itest = 0; int iv; int y, m, d, h, mm, sec; char date_string[64], wrap_year_string[64]; if (props_frame) { #ifdef DEBUG if (get_debuglevel() > 8) { errwin("Debug level > 8, resetting to 0"); set_debuglevel(0); } SetSpinChoice(debug_item, (double) get_debuglevel()); #endif SetToggleButtonState(noask_item, noask); SetToggleButtonState(dc_item, allow_dc); if (focus_policy == FOCUS_SET) { itest = 1; } else if (focus_policy == FOCUS_CLICK) { itest = 0; } else if (focus_policy == FOCUS_FOLLOWS) { itest = 2; } SetChoice(graph_focus_choice_item, itest); SetToggleButtonState(graph_drawfocus_choice_item, draw_focus_flag); SetToggleButtonState(linkscroll_item, scrolling_islinked); SetToggleButtonState(autoredraw_type_item, auto_redraw); SetToggleButtonState(cursor_type_item, cursortype); #if defined WITH_XMHTML || defined WITH_LIBHELP SetToggleButtonState(force_external_viewer_item, force_external_viewer); #endif SetSpinChoice(max_path_item, (double) get_max_path_limit()); SetToggleButtonState(safe_mode_item, safe_mode); iv = (int) rint(100*scrollper); SetScaleValue(scrollper_item, iv); iv = (int) rint(100*shexper); SetScaleValue(shexper_item, iv); switch (get_date_hint()) { case FMT_iso : itest = 0; break; case FMT_european : itest = 1; break; case FMT_us : itest = 2; break; default : itest = FMT_nohint; break; } SetChoice(hint_item, itest); jul_to_cal_and_time(0.0, ROUND_SECOND, &y, &m, &d, &h, &mm, &sec); sprintf(date_string, "%d-%02d-%02d %02d:%02d:%02d", y, m, d, h, mm, sec); xv_setstr(date_item, date_string); SetToggleButtonState(two_digits_years_item, two_digits_years_allowed()); sprintf(wrap_year_string, "%04d", get_wrap_year()); xv_setstr(wrap_year_item, wrap_year_string); SetSensitive(wrap_year_item, two_digits_years_allowed() ? True:False); } } static int props_define_notify_proc(void *data) { double jul; #ifdef DEBUG set_debuglevel((int) GetSpinChoice(debug_item)); #endif noask = GetToggleButtonState(noask_item); allow_dc = GetToggleButtonState(dc_item); switch (GetChoice(graph_focus_choice_item)) { case 0: focus_policy = FOCUS_CLICK; break; case 1: focus_policy = FOCUS_SET; break; case 2: focus_policy = FOCUS_FOLLOWS; break; } draw_focus_flag = GetToggleButtonState(graph_drawfocus_choice_item); scrolling_islinked = GetToggleButtonState(linkscroll_item); auto_redraw = GetToggleButtonState(autoredraw_type_item); cursortype = GetToggleButtonState(cursor_type_item); #if defined WITH_XMHTML || defined WITH_LIBHELP force_external_viewer = GetToggleButtonState(force_external_viewer_item); #endif set_max_path_limit((int) GetSpinChoice(max_path_item)); safe_mode = GetToggleButtonState(safe_mode_item); scrollper = (double) GetScaleValue(scrollper_item)/100.0; shexper = (double) GetScaleValue(shexper_item)/100.0; switch (GetChoice(hint_item)) { case 0 : set_date_hint(FMT_iso); break; case 1 : set_date_hint(FMT_european); break; case 2 : set_date_hint(FMT_us); break; default : set_date_hint(FMT_nohint); break; } if (parse_date_or_number(xv_getstr(date_item), TRUE, &jul) == RETURN_SUCCESS) { set_ref_date(jul); } else { errmsg("Invalid date"); } allow_two_digits_years(GetToggleButtonState(two_digits_years_item)); set_wrap_year(atoi(xv_getstr(wrap_year_item))); xdrawgraph(); return RETURN_SUCCESS; } grace-5.1.23/src/editpwin.c0000644000076500001440000005052010440376370015214 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * spreadsheet-like editing of data points * */ #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "files.h" #include "protos.h" #include #include #include "motifinc.h" typedef struct _EditPoints { struct _EditPoints *next; int gno; int setno; int cformat[MAX_SET_COLS]; int cprec[MAX_SET_COLS]; int update; Widget top; Widget mw; Widget label; OptionStructure *stype; TextStructure *comment; } EditPoints; static void update_cells(EditPoints *ep); /* default cell value precision */ #define CELL_PREC 8 /* default cell value format */ #define CELL_FORMAT FORMAT_GENERAL /* default cell width */ #define CELL_WIDTH 12 /* string cell width */ #define STRING_CELL_WIDTH 128 /* minimum size of the spreadseet matrix */ #define MIN_SS_ROWS 100 #define MIN_SS_COLS 1 #define VISIBLE_SS_ROWS 10 static void get_ep_dims(EditPoints *ep, int *nr, int *nc) { XtVaGetValues(ep->mw, XmNrows, nr, XmNcolumns, nc, NULL); } static int get_ep_set_dims(EditPoints *ep, int *nrows, int *ncols, int *scols) { if (!ep || !is_valid_setno(ep->gno, ep->setno)) { return RETURN_FAILURE; } *nrows = getsetlength(ep->gno, ep->setno); *ncols = dataset_cols(ep->gno, ep->setno); if (get_set_strings(ep->gno, ep->setno) != NULL) { *scols = 1; } else { *scols = 0; } return RETURN_SUCCESS; } /* * delete the selected row(s) */ static void del_rows_cb(void *data) { int i; int nrows, ncols, scols, nc, nr; int nscells, row_start, nsrows, nsrows_max, *srows; EditPoints *ep = (EditPoints *) data; char buf[64]; if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { return; } get_ep_dims(ep, &nr, &nc); if (nr == 0 || nc == 0) { return; } row_start = XbaeMatrixFirstSelectedRow(ep->mw); if (row_start < 0 || row_start >= nrows) { errmsg("Nothing to delete"); return; } nscells = XbaeMatrixGetNumSelected(ep->mw); nsrows_max = nscells/nc; srows = xmalloc(nsrows_max*SIZEOF_INT); if (!srows) { errmsg("Not enough memory"); return; } for (nsrows = 0, i = row_start; i < nrows && nscells > 0; i++) { if (XbaeMatrixIsRowSelected(ep->mw, i)) { srows[nsrows] = i; nsrows++; nscells -= nc; } } sprintf(buf, "Delete %d selected row(s)?", nsrows); if (yesno(buf, NULL, NULL, NULL)) { for (i = nsrows - 1; i >= 0; i--) { del_point(ep->gno, ep->setno, srows[i]); } XbaeMatrixDeselectAll(ep->mw); update_set_lists(ep->gno); update_cells(ep); xdrawgraph(); } xfree(srows); } /* * add a point to a set by copying the row containing the selected cell * and placing it after it */ void add_row_cb(void *data) { int i, j, k; int nrows, ncols, scols; char **s; Datapoint dpoint; EditPoints *ep = (EditPoints *) data; int gno = ep->gno, setno = ep->setno; XbaeMatrixGetCurrentCell(ep->mw, &i, &j); if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { return; } if (i > nrows || i < 0){ errmsg("Selected row out of range"); return; } zero_datapoint(&dpoint); if (i < nrows) { for (k = 0; k < ncols; k++) { dpoint.ex[k] = *(getcol(gno, setno, k) + i); } if ((s = get_set_strings(gno, setno)) != NULL) { dpoint.s = s[i]; } add_point_at(gno, setno, i + 1, &dpoint); } else { add_point_at(gno, setno, i, &dpoint); } update_set_lists(gno); update_cells(ep); xdrawgraph(); } static OptionStructure *editp_col_item; static OptionStructure *editp_format_item; static SpinStructure *editp_precision_item; static void update_props(EditPoints *ep, int col) { if (col >= 0 && col < MAX_SET_COLS) { SetOptionChoice(editp_col_item, col); } else { col = GetOptionChoice(editp_col_item); } SetOptionChoice(editp_format_item, ep->cformat[col]); SetSpinChoice(editp_precision_item, (double) ep->cprec[col]); } static int do_accept_props(void *data) { int col, cformat, cprec; EditPoints *ep = *((EditPoints **) data); col = GetOptionChoice(editp_col_item); cformat = GetOptionChoice(editp_format_item); cprec = (int) GetSpinChoice(editp_precision_item); if (col >= 0 && col < MAX_SET_COLS) { ep->cformat[col] = cformat; ep->cprec[col] = cprec; update_cells(ep); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } void do_props(EditPoints *ep, int column) { static Widget top; static EditPoints *sep; sep = ep; set_wait_cursor(); if (top == NULL) { int i; Widget dialog; OptionItem opitems[MAX_SET_COLS]; top = CreateDialogForm(app_shell, "Edit set properties"); dialog = CreateVContainer(top); for (i = 0; i < MAX_SET_COLS; i++) { opitems[i].label = copy_string(NULL, dataset_colname(i)); opitems[i].value = i; } editp_col_item = CreateOptionChoice(dialog, "Column:", 1, MAX_SET_COLS, opitems); for (i = 0; i < MAX_SET_COLS; i++) { xfree(opitems[i].label); } opitems[0].label = "Decimal"; opitems[0].value = FORMAT_DECIMAL; opitems[1].label = "General"; opitems[1].value = FORMAT_GENERAL; opitems[2].label = "Exponential"; opitems[2].value = FORMAT_EXPONENTIAL; opitems[3].label = "Date/time"; opitems[3].value = FORMAT_YYMMDDHMS; editp_format_item = CreateOptionChoice(dialog, "Format:", 1, 4, opitems); editp_precision_item = CreateSpinChoice(dialog, "Precision:", 2, SPIN_TYPE_INT, (double) 0, (double) 20, (double) 1); CreateAACDialog(top, dialog, do_accept_props, &sep); } update_props(sep, column); RaiseWindow(GetParent(top)); unset_wait_cursor(); } static void do_props_cb(void *data) { EditPoints *ep = (EditPoints *) data; do_props(ep, -1); } static void leaveCB(Widget w, XtPointer client_data, XtPointer calld) { int nrows, ncols, scols; int changed = FALSE; EditPoints *ep = (EditPoints *) client_data; XbaeMatrixLeaveCellCallbackStruct *cs = (XbaeMatrixLeaveCellCallbackStruct *) calld; if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { return; } if (cs->column >= ncols + scols) { /* should never happen */ return; } if (cs->row >= nrows) { if (cs->value && cs->value[0] != '\0') { setlength(ep->gno, ep->setno, cs->row + 1); update_set_lists(ep->gno); } else { /* empty cell */ return; } } /* TODO: add edit_point() function to setutils.c */ if (cs->column < ncols) { char *s; double *datap = getcol(ep->gno, ep->setno, cs->column); s = create_fstring(ep->cformat[cs->column], ep->cprec[cs->column], datap[cs->row], LFORMAT_TYPE_PLAIN); if (strcmp(s, cs->value) != 0) { double value; if (parse_date_or_number(cs->value, FALSE, &value) == RETURN_SUCCESS) { datap[cs->row] = value; changed = TRUE; } else { errmsg("Can't parse input value"); } } } else if (cs->column < ncols + scols) { char **datap = get_set_strings(ep->gno, ep->setno); if (compare_strings(datap[cs->row], cs->value) == 0) { datap[cs->row] = copy_string(datap[cs->row], cs->value); changed = TRUE; } } if (changed) { set_dirtystate(); /* don't refresh this editor */ ep->update = FALSE; update_set_lists(ep->gno); ep->update = TRUE; xdrawgraph(); } } /* * We use a stack of static buffers to work around asynchronous * refresh/redraw events */ #define STACKLEN 30 static char *get_cell_content(EditPoints *ep, int row, int column) { static char buf[STACKLEN][32]; static int stackp = 0; int ncols, nrows, scols; char *s; if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { s = ""; } else if (column >= ncols + scols || row >= nrows) { s = ""; } else if (column < ncols) { double *datap; datap = getcol(ep->gno, ep->setno, column); strcpy(buf[stackp], create_fstring(ep->cformat[column], ep->cprec[column], datap[row], LFORMAT_TYPE_PLAIN)); s = buf[stackp]; stackp++; stackp %= STACKLEN; } else { char **datap; datap = get_set_strings(ep->gno, ep->setno); s = datap[row]; } return s; } static void drawcellCB(Widget w, XtPointer client_data, XtPointer calld) { EditPoints *ep = (EditPoints *) client_data; XbaeMatrixDrawCellCallbackStruct *cs = (XbaeMatrixDrawCellCallbackStruct *) calld; cs->type = XbaeString; cs->string = get_cell_content(ep, cs->row, cs->column); } static void labelCB(Widget w, XtPointer client_data, XtPointer call_data) { EditPoints *ep = (EditPoints *) client_data; XbaeMatrixLabelActivateCallbackStruct *cbs = (XbaeMatrixLabelActivateCallbackStruct *) call_data; if (cbs->row_label) { if (XbaeMatrixIsRowSelected(ep->mw, cbs->row)) { XbaeMatrixDeselectRow(ep->mw, cbs->row); } else { XbaeMatrixSelectRow(ep->mw, cbs->row); } } else { int ncols, nrows, scols; if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { return; } else if (cbs->column < ncols) { do_props(ep, cbs->column); } } } static EditPoints *ep_start = NULL; void delete_ep(EditPoints *ep) { EditPoints *ep_tmp = ep_start; if (ep == NULL) { return; } if (ep == ep_start) { ep_start = ep_start->next; XCFREE(ep); return; } while (ep_tmp != NULL) { if (ep_tmp->next == ep) { ep_tmp->next = ep->next; XCFREE(ep); return; } ep_tmp = ep_tmp->next; } } EditPoints *get_ep(int gno, int setno) { EditPoints *ep_tmp = ep_start; while (ep_tmp != NULL) { if (ep_tmp->gno == gno && ep_tmp->setno == setno) { break; } ep_tmp = ep_tmp->next; } return ep_tmp; } EditPoints *get_unused_ep() { EditPoints *ep_tmp = ep_start; while (ep_tmp != NULL) { if (XtIsManaged(GetParent(ep_tmp->top)) == False) { break; } ep_tmp = ep_tmp->next; } return ep_tmp; } void update_ss_editors(int gno) { EditPoints *ep = ep_start; while (ep != NULL) { if (ep->gno == gno || gno == ALL_GRAPHS) { /* don't spend time on unmanaged SS editors */ if (XtIsManaged(GetParent(ep->top))) { update_cells(ep); } } else if (!is_valid_gno(ep->gno)) { destroy_dialog_cb(GetParent(ep->top)); } ep = ep->next; } } /* * redo frame since number of data points or set type, etc., may change */ static void update_cells(EditPoints *ep) { int i, nr, nc, new_nr, new_nc, delta_nr, delta_nc; int c_row, c_column; int ncols, nrows, scols; short widths[MAX_SET_COLS + 1]; int maxlengths[MAX_SET_COLS + 1]; char *collabels[MAX_SET_COLS + 1]; unsigned char column_label_alignments[MAX_SET_COLS + 1]; short width; char buf[32]; char **rowlabels; if (ep->update == FALSE) { return; } if (get_ep_set_dims(ep, &nrows, &ncols, &scols) != RETURN_SUCCESS) { destroy_dialog_cb(GetParent(ep->top)); return; } sprintf(buf, "Dataset G%d.S%d", ep->gno, ep->setno); SetLabel(ep->label, buf); SetOptionChoice(ep->stype, dataset_type(ep->gno, ep->setno)); SetTextString(ep->comment, getcomment(ep->gno, ep->setno)); /* get current size of widget and update rows/columns as needed */ get_ep_dims(ep, &nr, &nc); new_nc = MAX2(ncols + scols, MIN_SS_COLS); new_nr = MAX2(nrows, MIN_SS_ROWS); delta_nr = new_nr - nr; delta_nc = new_nc - nc; #if XbaeVersion < 45101 /* A bug in Xbae - the cell with focus on is NOT updated, so we do it */ /* Fixed in 4.51.01 */ XbaeMatrixGetCurrentCell(ep->mw, &c_row, &c_column); XbaeMatrixSetCell(ep->mw, c_row, c_column, get_cell_content(ep, c_row, c_column)); #endif if (delta_nr == 0 && delta_nc == 0) { XbaeMatrixRefresh(ep->mw); return; } for (i = 0; i < ncols; i++) { widths[i] = CELL_WIDTH; maxlengths[i] = 2*CELL_WIDTH; collabels[i] = copy_string(NULL, dataset_colname(i)); column_label_alignments[i] = XmALIGNMENT_CENTER; } if (scols) { widths[i] = CELL_WIDTH; maxlengths[i] = STRING_CELL_WIDTH; collabels[i] = copy_string(NULL, "String"); column_label_alignments[i] = XmALIGNMENT_CENTER; } if (delta_nr > 0) { rowlabels = xmalloc(delta_nr*sizeof(char *)); for (i = 0; i < delta_nr; i++) { sprintf(buf, "%d", nr + i); rowlabels[i] = copy_string(NULL, buf); } XbaeMatrixAddRows(ep->mw, nr, NULL, rowlabels, NULL, delta_nr); for (i = 0; i < delta_nr; i++) { xfree(rowlabels[i]); } xfree(rowlabels); } else if (delta_nr < 0) { XbaeMatrixDeleteRows(ep->mw, nrows, -delta_nr); if (nrows < MIN_SS_ROWS) { rowlabels = xmalloc(MIN_SS_ROWS*sizeof(char *)); for (i = 0; i < MIN_SS_ROWS; i++) { sprintf(buf, "%d", i); rowlabels[i] = copy_string(NULL, buf); } XtVaSetValues(ep->mw, XmNrowLabels, rowlabels, NULL); for (i = 0; i < delta_nr; i++) { xfree(rowlabels[i]); } xfree(rowlabels); } } if (delta_nc > 0) { XbaeMatrixAddColumns(ep->mw, nc, NULL, NULL, widths, maxlengths, NULL, NULL, NULL, delta_nc); } else if (delta_nc < 0) { XbaeMatrixDeleteColumns(ep->mw, ncols, -delta_nc); } /* Adjust row label width */ width = (short) ceil(log10(new_nr)) + 1; XtVaSetValues(ep->mw, XmNrowLabelWidth, width, XmNvisibleColumns, ncols + scols, XmNcolumnMaxLengths, maxlengths, XmNcolumnLabels, collabels, XmNcolumnLabelAlignments, column_label_alignments, NULL); if (delta_nc != 0) { XtVaSetValues(ep->mw, XmNcolumnWidths, widths, NULL); } /* free memory used to hold strings */ for (i = 0; i < ncols + scols; i++) { xfree(collabels[i]); } } int ep_aac_proc(void *data) { EditPoints *ep = (EditPoints *) data; int stype; char *comment; stype = GetOptionChoice(ep->stype); comment = GetTextString(ep->comment); /* commit the last entered cell changes */ XbaeMatrixCommitEdit(ep->mw, False); set_dataset_type(ep->gno, ep->setno, stype); setcomment(ep->gno, ep->setno, comment); update_set_lists(ep->gno); xdrawgraph(); return RETURN_SUCCESS; } static EditPoints *new_ep(void) { int i; short widths[MIN_SS_COLS]; char *rowlabels[MIN_SS_ROWS]; EditPoints *ep; Widget fr, rc, menubar, menupane; ep = xmalloc(sizeof(EditPoints)); ep->next = ep_start; ep_start = ep; ep->update = TRUE; for (i = 0; i < MAX_SET_COLS; i++) { ep->cprec[i] = CELL_PREC; ep->cformat[i] = CELL_FORMAT; } ep->top = CreateDialogForm(NULL, "Spreadsheet dataset editor"); SetDialogFormResizable(ep->top, TRUE); menubar = CreateMenuBar(ep->top); ManageChild(menubar); AddDialogFormChild(ep->top, menubar); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuCloseButton(menupane, ep->top); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Add row", 'A', add_row_cb, ep); CreateMenuButton(menupane, "Delete selected rows", 'D', del_rows_cb, ep); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Column format...", 'f', do_props_cb, ep); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On dataset editor", 'e', ep->top, "doc/UsersGuide.html#SSEditor"); fr = CreateFrame(ep->top, NULL); AddDialogFormChild(ep->top, fr); ep->label = CreateLabel(fr, "Dataset G*.S*"); fr = CreateFrame(ep->top, NULL); AddDialogFormChild(ep->top, fr); rc = CreateVContainer(fr); ep->stype = CreateSetTypeChoice(rc, "Type:"); ep->comment = CreateTextInput(rc, "Comment:"); for (i = 0; i < MIN_SS_ROWS; i++) { char buf[32]; sprintf(buf, "%d", i); rowlabels[i] = copy_string(NULL, buf); } for (i = 0; i < MIN_SS_COLS; i++) { widths[i] = CELL_WIDTH; } ep->mw = XtVaCreateManagedWidget("mw", xbaeMatrixWidgetClass, ep->top, XmNrows, MIN_SS_ROWS, XmNvisibleRows, VISIBLE_SS_ROWS, XmNbuttonLabels, True, XmNrowLabels, rowlabels, XmNcolumns, MIN_SS_COLS, XmNvisibleColumns, MIN_SS_COLS, XmNcolumnWidths, widths, XmNallowColumnResize, True, XmNgridType, XmGRID_CELL_SHADOW, XmNcellShadowType, XmSHADOW_ETCHED_OUT, XmNcellShadowThickness, 2, XmNaltRowCount, 0, XmNcalcCursorPosition, True, NULL); for (i = 0; i < MIN_SS_ROWS; i++) { xfree(rowlabels[i]); } XtAddCallback(ep->mw, XmNdrawCellCallback, drawcellCB, ep); XtAddCallback(ep->mw, XmNleaveCellCallback, leaveCB, ep); XtAddCallback(ep->mw, XmNlabelActivateCallback, labelCB, ep); CreateAACDialog(ep->top, ep->mw, ep_aac_proc, ep); return ep; } void create_ss_frame(int gno, int setno) { EditPoints *ep; set_wait_cursor(); /* first, try a previously opened editor with the same set */ ep = get_ep(gno, setno); if (ep == NULL) { /* if failed, a first unmanaged one */ ep = get_unused_ep(); /* if none available, create a new one */ if (ep == NULL) { ep = new_ep(); } } if (ep == NULL) { errmsg("Internal error in create_ss_frame()"); unset_wait_cursor(); return; } ep->gno = gno; ep->setno = setno; update_cells(ep); RaiseWindow(GetParent(ep->top)); unset_wait_cursor(); return; } /* * Start up external editor */ void do_ext_editor(int gno, int setno) { char *fname, ebuf[256]; FILE *cp; int save_autos; fname = tmpnam(NULL); cp = grace_openw(fname); if (cp == NULL) { return; } write_set(gno, setno, cp, sformat, FALSE); grace_close(cp); sprintf(ebuf, "%s %s", get_editor(), fname); system_wrap(ebuf); /* temporarily disable autoscale */ save_autos = autoscale_onread; autoscale_onread = AUTOSCALE_NONE; if (is_set_active(gno, setno)) { curtype = dataset_type(gno, setno); killsetdata(gno, setno); } getdata(gno, fname, SOURCE_DISK, LOAD_SINGLE); autoscale_onread = save_autos; unlink(fname); update_all(); xdrawgraph(); } grace-5.1.23/src/buildinfo.c0000644000076500001440000000652012032152766015345 0ustar fnevgenyusers/* buildinfo.c */ #include #include #include #include #include #include #include #ifndef NONE_GUI # include # include #endif #include #ifdef HAVE_LIBPNG #include #endif #ifdef HAVE_LIBJPEG #include #endif #ifdef HAVE_LIBPDF #include #endif #define MAJOR_REV 5 #define MINOR_REV 1 #define PATCHLEVEL 23 /* #define BETA_VER "dev" */ #ifndef GRACE_HOME # define GRACE_HOME "/usr/local/grace" #endif #ifndef GRACE_PRINT_CMD # define GRACE_PRINT_CMD "" #endif #ifndef GRACE_EDITOR # define GRACE_EDITOR "xterm -e vi" #endif #ifndef GRACE_HELPVIEWER # define GRACE_HELPVIEWER "mozilla -remote openURL\\\\(%s,new-window\\\\) >>/dev/null 2>&1 || mozilla %s" #endif static void VersionInfo(FILE *outfile) { struct utsname u_info; time_t time_info; char *ctime_string; fprintf(outfile, "#define BI_VERSION_ID %d\n", MAJOR_REV*10000 + MINOR_REV*100 + PATCHLEVEL); #ifdef BETA_VER fprintf(outfile, "#define BI_VERSION \"Grace-%d.%d.%d %s\"\n", MAJOR_REV, MINOR_REV, PATCHLEVEL, BETA_VER); #else fprintf(outfile, "#define BI_VERSION \"Grace-%d.%d.%d\"\n", MAJOR_REV, MINOR_REV, PATCHLEVEL); #endif /* We don't want to reproduce the complete config.h, but those settings which may be related to problems at runtime */ #ifdef NONE_GUI fprintf(outfile, "#define BI_GUI \"none\"\n"); #else fprintf(outfile, "#define BI_GUI \"%s\"\n", XmVERSION_STRING); fprintf(outfile, "#define BI_GUI_XBAE \"%i\"\n", XbaeVersion); #endif fprintf(outfile, "#define BI_T1LIB \"%s\"\n", T1_GetLibIdent()); #ifdef HAVE_LIBPNG fprintf(outfile, "#define BI_PNGLIB \"%s\"\n", PNG_LIBPNG_VER_STRING); #else fprintf(outfile, "#define BI_PNGLIB \"\"\n"); #endif #ifdef HAVE_LIBJPEG fprintf(outfile, "#define BI_LIBJPEG \"%i\"\n", JPEG_LIB_VERSION); #else fprintf(outfile, "#define BI_LIBJPEG \"\"\n"); #endif #ifdef HAVE_LIBPDF fprintf(outfile, "#define BI_LIBPDF \"%s\"\n", PDFLIB_VERSIONSTRING); #else fprintf(outfile, "#define BI_LIBPDF \"\"\n"); #endif fprintf(outfile, "#define BI_CCOMPILER \"%s\"\n", CCOMPILER); uname(&u_info); fprintf(outfile, "#define BI_SYSTEM \"%s %s %s %s\"\n", u_info.sysname, u_info.version, u_info.release, u_info.machine); time_info = time(NULL); ctime_string = ctime(&time_info); if (ctime_string[strlen(ctime_string) - 1] == '\n') { ctime_string[strlen(ctime_string) - 1] = '\0'; } fprintf(outfile, "#define BI_DATE \"%s\"\n", ctime_string); fprintf(outfile, "\n"); fprintf(outfile, "#define GRACE_HOME \"%s\"\n", GRACE_HOME); fprintf(outfile, "#define GRACE_EDITOR \"%s\"\n", GRACE_EDITOR); fprintf(outfile, "#define GRACE_PRINT_CMD \"%s\"\n", GRACE_PRINT_CMD); fprintf(outfile, "#define GRACE_HELPVIEWER \"%s\"\n", GRACE_HELPVIEWER); return; } int main(int argc, char *argv[]) { FILE *outfile; if (argc == 1) { outfile = stdout; } else { if (!(outfile = fopen(argv[1], "w"))) { fprintf(stderr, "Failed to open %s for writing!\a\n", argv[1]); exit(1); } } VersionInfo(outfile); if (outfile != stdout) { fclose(outfile); } exit(0); } grace-5.1.23/src/utils.h0000644000076500001440000001005010335446017014527 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __UTILS_H_ #define __UTILS_H_ /* for size_t */ #include #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) #define MIN2(a, b) (((a) < (b)) ? a : b) #define MAX2(a, b) (((a) > (b)) ? a : b) #define MIN3(a, b, c) (((a) < (b)) ? MIN2(a, c) : MIN2(b, c)) #define MAX3(a, b, c) (((a) > (b)) ? MAX2(a, c) : MAX2(b, c)) #define yes_or_no(x) ((x)?"yes":"no") #define on_or_off(x) ((x)?"on":"off") #define true_or_false(x) ((x)?"true":"false") #define w_or_v(x) ((x == COORD_WORLD)?"world":"view") #define LFORMAT_TYPE_PLAIN 0 #define LFORMAT_TYPE_EXTENDED 1 #define XCFREE(ptr) xfree(ptr); ptr = NULL #define PSTRING(s) ((s == NULL) ? "" : escapequotes(s)) void *xmalloc(size_t size); void *xcalloc(size_t nmemb, size_t size); void *xrealloc(void *ptr, size_t size); void xfree(void *ptr); void fswap(double *x, double *y); void iswap(int *x, int *y); int isoneof(int c, char *s); int argmatch(char *s1, char *s2, int atleast); void lowtoupper(char *s); void convertchar(char *s); int ilog2(int n); double comp_area(int n, double *x, double *y); double comp_perimeter(int n, double *x, double *y); char *create_fstring(int form, int prec, double loc, int type); char *escapequotes (char *s); int sign(double a); double mytrunc(double a); void bailout(void); void installSignal(void); int bin_dump(char *value, int i, int pad); unsigned char reversebits(unsigned char inword); char *copy_string(char *dest, const char *src); char *concat_strings(char *dest, const char *src); int compare_strings(const char *s1, const char *s2); char *get_grace_home(void); void set_grace_home(const char *dir); char *get_help_viewer(void); void set_help_viewer(const char *dir); char *get_print_cmd(void); void set_print_cmd(const char *cmd); char *get_editor(void); void set_editor(const char *cmd); void set_docname(const char *s); char *get_docname(void); char *get_docbname(void); void errmsg(const char *msg); void echomsg(char *msg); void stufftext(char *msg); int yesnoterm(char *msg); int yesno(char *msg, char *s1, char *s2, char *help_anchor); char *mybasename(const char *s); void expand_tilde(char *buf); int set_workingdir(const char *wd); char *get_workingdir(void); void init_username(void); char *get_username(void); void init_userhome(void); char *get_userhome(void); void update_app_title(void); void set_dirtystate(void); void clear_dirtystate(void); void lock_dirtystate(int flag); int is_dirtystate(void); int system_wrap(const char *string); void msleep_wrap(unsigned int msec); int init_locale(void); void set_locale_num(int flag); long bi_version_id(void); char *bi_version_string(void); char *bi_system(void); char *bi_date(void); char *bi_gui(void); #ifdef MOTIF_GUI char *bi_gui_xbae(void); #endif char *bi_ccompiler(void); char *bi_t1lib(void); #ifdef HAVE_LIBPNG char *bi_pnglib(void); #endif #ifdef HAVE_LIBJPEG char *bi_libjpeg(void); #endif #ifdef HAVE_LIBPDF char *bi_libpdf(void); #endif #ifdef DEBUG void set_debuglevel(int level); int get_debuglevel(void); #endif #endif /* __UTILS_H_*/ grace-5.1.23/src/device.h0000644000076500001440000001147510071615561014641 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * declarations for devices * */ #ifndef __DEVICE_H_ #define __DEVICE_H_ #include "t1fonts.h" /* default dimensions of the canvas */ #define DEFAULT_PAGE_WIDTH 600 #define DEFAULT_PAGE_HEIGHT 600 #define MM_PER_INCH 25.4 #define CM_PER_INCH (MM_PER_INCH/10) /* hardcopy or terminal device */ /* device output can be redirected to file/printer(both) */ #define DEVICE_TERM 0 #define DEVICE_FILE 1 #define DEVICE_PRINT 2 /* Page orientation */ #define PAGE_ORIENT_LANDSCAPE 0 #define PAGE_ORIENT_PORTRAIT 1 /* Standard formats */ typedef enum { PAGE_FORMAT_CUSTOM, PAGE_FORMAT_USLETTER, PAGE_FORMAT_A4 } PageFormat; typedef struct { unsigned long width; unsigned long height; float dpi; } Page_geometry; typedef struct { int type; char *name; /* name of device */ int (*init)(void); /* function to initialize device */ int (*parser)(char *); /* function to parse device-specific commands */ void (*setup)(void); /* function (GUI interface) to setup device */ char *fext; /* filename extension */ int devfonts; /* device has its own fonts */ int fontaa; /* font antialiasing */ Page_geometry pg; /* device defaults */ void *data; /* device private data */ } Device_entry; /* device exit */ extern void (*devleavegraphics) (void); /* device pixel routine */ extern void (*devdrawpixel) (VPoint vp); /* device polyline routine */ extern void (*devdrawpolyline) (VPoint *vps, int n, int mode); /* device polygon routine */ extern void (*devfillpolygon) (VPoint *vps, int nc); /* device arc routine */ extern void (*devdrawarc) (VPoint vp1, VPoint vp2, int a1, int a2); /* device fill arc routine */ extern void (*devfillarc) (VPoint vp1, VPoint vp2, int a1, int a2, int mode); /* device pixmap drawing */ extern void (*devputpixmap) (VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); /* device text typesetting */ extern void (*devputtext) (VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); /* update color map */ extern void (*devupdatecmap)(void); int register_device(Device_entry device); int select_device(int dindex); int initgraphics (void); Device_entry get_device_props(int device); Device_entry get_curdevice_props(void); char *get_device_name(int device); void *get_curdevice_data(void); void set_curdevice_data(void *data); int set_device_props(int device, Device_entry dev); void set_curdevice_props(Device_entry dev); int is_valid_page_geometry(Page_geometry pg); int set_page_geometry(Page_geometry pg); Page_geometry get_page_geometry(void); int set_page_dimensions(int wpp, int hpp, int rescale); int get_device_page_dimensions(int dindex, int *wpp, int *hpp); int get_device_by_name(char *dname); int parse_device_options(int dindex, char *options); int set_printer(int device); int set_printer_by_name(char *dname); void set_ptofile(int flag); int get_ptofile(void); int number_of_devices(void); void get_page_viewport(double *vx, double *vy); int terminal_device(void); PageFormat get_page_format(int device); /* some useful macros */ #define page_dpi ((get_page_geometry()).dpi) #define page_width ((get_page_geometry()).width) #define page_height ((get_page_geometry()).height) #define page_width_in ((double) page_width/page_dpi) #define page_height_in ((double) page_height/page_dpi) #define page_width_mm (MM_PER_INCH*page_width_in) #define page_height_mm (MM_PER_INCH*page_height_in) #define page_width_cm (CM_PER_INCH*page_width_in) #define page_height_cm (CM_PER_INCH*page_height_in) #define page_width_pp (72*page_width_in) #define page_height_pp (72*page_height_in) #endif /* __DEVICE_H_ */ grace-5.1.23/src/draw.h0000644000076500001440000001530210071615561014330 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __DRAW_H_ #define __DRAW_H_ #include "defines.h" /* bpp that Grace uses internally ( = 256 colors) */ #define GRACE_BPP 8 #define MAXCOLORS (0x01 << GRACE_BPP) #define MAXPATTERNS 32 #define MAXLINESTYLES 9 #define MAX_LINEWIDTH 20.0 /* max width of drawn lines */ /* polyline drawing modes */ #define POLYLINE_OPEN 0 #define POLYLINE_CLOSED 1 /* polygon fill type */ #define FILLRULE_WINDING 0 #define FILLRULE_EVENODD 1 /* arc fill modes */ #define ARCFILL_CHORD 0 #define ARCFILL_PIESLICE 1 /* pixmap transparency types */ #define PIXMAP_TRANSPARENT 0 #define PIXMAP_OPAQUE 1 /* line cap parameter */ #define LINECAP_BUTT 0 #define LINECAP_ROUND 1 #define LINECAP_PROJ 2 /* line join type */ #define LINEJOIN_MITER 0 #define LINEJOIN_ROUND 1 #define LINEJOIN_BEVEL 2 /* Text string justifications */ /* Horizontal */ #define JUST_LEFT 0 #define JUST_RIGHT 1 #define JUST_CENTER 2 /* Vertical */ #define JUST_BLINE 0 #define JUST_BOTTOM 4 #define JUST_TOP 8 #define JUST_MIDDLE 12 /* Drawing properties */ typedef struct { Pen pen; int bgcolor; int bgfilled; int lines; double linew; int linecap; int linejoin; double charsize; int font; int fillrule; } DrawProps; typedef struct { int red; int green; int blue; } RGB; typedef struct { double red; double green; double blue; } fRGB; typedef struct { double y; double i; double q; } YIQ; #define BAD_COLOR -1 #define COLOR_NONE 0 #define COLOR_AUX 1 #define COLOR_MAIN 2 typedef struct { RGB rgb; char *cname; int ctype; int tstamp; } CMap_entry; #define BBOX_TYPE_GLOB 0 #define BBOX_TYPE_TEMP 1 typedef struct { int active; view v; view fv; } BBox_type; /* The default max drawing path limit */ #define MAX_DRAWING_PATH 20000 void setpen(Pen pen); Pen getpen(void); void setcolor(int color); int getcolor(void); void setbgcolor(int bgcolor); int getbgcolor(void); void setbgfill(int flag); int getbgfill(void); void setlinestyle(int lines); int getlinestyle(void); void setlinewidth(double linew); double getlinewidth(void); void setpattern(int pattern); int getpattern(void); void setcharsize(double charsize); double getcharsize(void); void setfont(int font); int getfont(void); void setfillrule(int rule); int getfillrule(void); void setlinecap(int type); int getlinecap(void); void setlinejoin(int type); int getlinejoin(void); void symplus(VPoint vp, double s); void symx(VPoint vp, double s); void symsplat(VPoint vp, double s); void leavegraphics(void); void DrawRect(VPoint vp1, VPoint vp2); void FillRect(VPoint vp1, VPoint vp2); void DrawLine(VPoint vp1, VPoint vp2); void DrawPolyline(VPoint *vps, int n, int mode); void DrawPolygon(VPoint *vps, int n); void DrawArc(VPoint vp1, VPoint vp2, int angle1, int angle2); void DrawFilledArc(VPoint vp1, VPoint vp2, int angle1, int angle2, int mode); void DrawEllipse(VPoint vp1, VPoint vp2); void DrawFilledEllipse(VPoint vp1, VPoint vp2); void DrawCircle(VPoint vp, double radius); void DrawFilledCircle(VPoint vp, double radius); void WriteString(VPoint vp, int rot, int just, char *theString); int is_wpoint_inside(WPoint *wp, world *w); int is_vpoint_inside(view v, VPoint vp, double epsilon); void setclipping(int fl); int doclipping(void); int is_validVPoint(VPoint vp); int is_validWPoint(WPoint wp); VPoint *line_intersect(VPoint vp1, VPoint vp2, VPoint vp1p, VPoint vp2p, int mode); int clip_line(VPoint vp1, VPoint vp2, VPoint *vp1c, VPoint *vp2c); int intersect_polygon(VPoint *vps, int n, VPoint vp1p, VPoint vp2p); int clip_polygon(VPoint *vps, int n); int is_valid_color(RGB rgb); int find_color(RGB rgb); int get_color_by_name(char *cname); int realloc_color(int n); int store_color(int n, CMap_entry cmap); int add_color(CMap_entry cmap); RGB *get_rgb(unsigned int cindex); RGB *get_srgb(unsigned int cindex); fRGB *get_frgb(unsigned int cindex); fRGB *get_fsrgb(unsigned int cindex); CMap_entry *get_cmap_entry(unsigned int cindex); char *get_colorname(unsigned int cindex); int get_colortype(unsigned int cindex); YIQ RGB2YIQ(RGB rgb); double get_colorintensity(int cindex); void initialize_cmap(void); void reverse_video(void); int is_video_reversed(void); char *scale_types(int it); int isvalid_viewport(view v); double fscale(double wc, int scale); double ifscale(double vc, int scale); int polar2xy(double phi, double rho, double *x, double *y); void xy2polar(double x, double y, double *phi, double *rho); double xy_xconv(double wx); double xy_yconv(double wy); VPoint Wpoint2Vpoint(WPoint wp); int world2view(double x, double y, double *xv, double *yv); void view2world(double xv, double yv, double *xw, double *yw); int definewindow(world w, view v, int gtype, int xscale, int yscale, int xinv, int yinv); void reset_bbox(int type); void reset_bboxes(void); void freeze_bbox(int type); view get_bbox(int type); int is_valid_bbox(view v); view merge_bboxes(view v1, view v2); void update_bbox(int type, VPoint vp); void update_bboxes(VPoint vp); void melt_bbox(int type); void activate_bbox(int type, int status); int view_extend(view *v, double w); int update_bboxes_with_view(view *v); int update_bboxes_with_vpoints(VPoint *vps, int n, double lw); int VPoints2bbox(VPoint *vp1, VPoint *vp2, view *bb); void set_draw_mode(int mode); int get_draw_mode(void); int number_of_colors(void); int number_of_patterns(void); int number_of_linestyles(void); void vpswap(VPoint *vp1, VPoint *vp2); int points_overlap(VPoint vp1, VPoint vp2); void set_max_path_limit(int limit); int get_max_path_limit(void); #endif /* __DRAW_H_ */ grace-5.1.23/src/t1fonts.h0000644000076500001440000000700010071615562014766 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * t1fonts.h * Type1 fonts for Grace */ #ifndef __T1_FONTS_H_ #define __T1_FONTS_H_ #include #include #include /* A hack - until there are T1_MAJORVERSION etc defined */ #ifndef T1ERR_SCAN_ENCODING # define T1_CheckForFontID CheckForFontID # define T1_GetNoFonts T1_Get_no_fonts #endif #include "defines.h" #if defined(DEBUG_T1LIB) # define T1LOGFILE LOGFILE #else # define T1LOGFILE NO_LOGFILE #endif #define T1_DEFAULT_BITMAP_PAD 8 #define T1_DEFAULT_ENCODING_FILE "Default.enc" #define T1_FALLBACK_ENCODING_FILE "IsoLatin1.enc" #define T1_AALEVELS 5 #define BAD_FONT_ID -1 /* Font mappings */ #define FONT_MAP_DEFAULT 0 #define FONT_MAP_ACEGR 1 /* TODO */ #define MAGIC_FONT_SCALE 0.028 #define SSCRIPT_SCALE M_SQRT1_2 #define SUBSCRIPT_SHIFT 0.4 #define SUPSCRIPT_SHIFT 0.6 #define ENLARGE_SCALE sqrt(M_SQRT2) #define OBLIQUE_FACTOR 0.25 #define TEXT_ADVANCING_LR 0 #define TEXT_ADVANCING_RL 1 #define STRING_DIRECTION_LR 0 #define STRING_DIRECTION_RL 1 #define MARK_NONE -1 #define MAX_MARKS 32 #define MARK_CR MAX_MARKS #define UNIT_TM {1.0, 0.0, 0.0, 1.0} typedef struct { double cxx, cxy; double cyx, cyy; } TextMatrix; typedef struct { char *s; int len; int font; int color; TextMatrix tm; double hshift; double vshift; int underline; int overline; int setmark; int gotomark; int direction; int advancing; int ligatures; int kerning; VPoint start; VPoint stop; GLYPH *glyph; } CompositeString; typedef struct { int mapped_id; char *alias; char *fallback; } FontDB; int init_t1(void); int number_of_fonts(void); char *get_fontname(int font); char *get_fontfullname(int font); char *get_fontfamilyname(int font); char *get_fontweight(int font); char *get_fontfilename(int font, int abspath); char *get_afmfilename(int font, int abspath); char *get_fontalias(int font); char *get_fontfallback(int font); char *get_encodingscheme(int font); char **get_default_encoding(void); double get_textline_width(int font); double get_underline_pos(int font); double get_overline_pos(int font); double get_italic_angle(int font); double *get_kerning_vector(char *str, int len, int font); int get_font_by_name(char *fname); int get_font_mapped_id(int font); int get_mapped_font(int mapped_id); int map_font(int font, int mapped_id); int map_font_by_name(char *fname, int mapped_id); void map_fonts(int map); #endif /* __T1_FONTS_H_ */ grace-5.1.23/src/t1fonts.c0000644000076500001440000010123010071615562014761 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "defines.h" #include "draw.h" #include "utils.h" #include "files.h" #include "device.h" #include "t1fonts.h" #include "protos.h" extern int AAGrayLevelsOK; static int nfonts = 0; static FontDB *FontDBtable = NULL; static char **DefEncoding = NULL; void (*devputpixmap) (VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void (*devputtext) (VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); int init_t1(void) { int i; char buf[GR_MAXPATHLEN], abuf[GR_MAXPATHLEN], fbuf[GR_MAXPATHLEN], *bufp; FILE *fd; /* Set search paths: */ bufp = grace_path("fonts/type1"); if (bufp == NULL) { return (RETURN_FAILURE); } T1_SetFileSearchPath(T1_PFAB_PATH, bufp); T1_SetFileSearchPath(T1_AFM_PATH, bufp); bufp = grace_path("fonts/enc"); if (bufp == NULL) { return (RETURN_FAILURE); } T1_SetFileSearchPath(T1_ENC_PATH, bufp); /* Set font database: */ bufp = grace_path("fonts/FontDataBase"); if (bufp == NULL) { return (RETURN_FAILURE); } T1_SetFontDataBase(bufp); /* Set log-level: */ T1_SetLogLevel(T1LOG_DEBUG); /* Initialize t1-library */ if (T1_InitLib(T1LOGFILE|IGNORE_CONFIGFILE) == NULL) { return (RETURN_FAILURE); } nfonts = T1_GetNoFonts(); if (nfonts < 1) { return (RETURN_FAILURE); } fd = grace_openr("fonts/FontDataBase", SOURCE_DISK); if (fd == NULL) { return (RETURN_FAILURE); } FontDBtable = xmalloc(nfonts*sizeof(FontDB)); /* skip the first line */ grace_fgets(buf, GR_MAXPATHLEN - 1, fd); for (i = 0; i < nfonts; i++) { grace_fgets(buf, GR_MAXPATHLEN - 1, fd); if (sscanf(buf, "%s %s %*s", abuf, fbuf) != 2) { fclose(fd); return (RETURN_FAILURE); } FontDBtable[i].mapped_id = i; FontDBtable[i].alias = copy_string(NULL, abuf); FontDBtable[i].fallback = copy_string(NULL, fbuf); } fclose(fd); T1_SetDeviceResolutions(72.0, 72.0); DefEncoding = T1_LoadEncoding(T1_DEFAULT_ENCODING_FILE); if (DefEncoding == NULL) { DefEncoding = T1_LoadEncoding(T1_FALLBACK_ENCODING_FILE); } if (DefEncoding != NULL) { T1_SetDefaultEncoding(DefEncoding); } else { return (RETURN_FAILURE); } T1_AASetBitsPerPixel(GRACE_BPP); T1_SetBitmapPad(T1_DEFAULT_BITMAP_PAD); return (RETURN_SUCCESS); } void map_fonts(int map) { int i; if (map == FONT_MAP_ACEGR) { for (i = 0; i < nfonts; i++) { FontDBtable[i].mapped_id = BAD_FONT_ID; } map_font_by_name("Times-Roman", 0); map_font_by_name("Times-Bold", 1); map_font_by_name("Times-Italic", 2); map_font_by_name("Times-BoldItalic", 3); map_font_by_name("Helvetica", 4); map_font_by_name("Helvetica-Bold", 5); map_font_by_name("Helvetica-Oblique", 6); map_font_by_name("Helvetica-BoldOblique", 7); map_font_by_name("Symbol", 8); map_font_by_name("ZapfDingbats", 9); } else { for (i = 0; i < nfonts; i++) { FontDBtable[i].mapped_id = i; } } } int get_font_mapped_id(int font) { if (font >= nfonts || font < 0) { return(BAD_FONT_ID); } else { return(FontDBtable[font].mapped_id); } } int get_mapped_font(int mapped_id) { int i; for (i = 0; i < nfonts; i++) { if (FontDBtable[i].mapped_id == mapped_id) { return(i); } } return(BAD_FONT_ID); } int map_font(int font, int mapped_id) { int i; if (font >= nfonts || font < 0) { return RETURN_FAILURE; } /* make sure the mapping is unique */ for (i = 0; i < nfonts; i++) { if (FontDBtable[i].mapped_id == mapped_id) { FontDBtable[i].mapped_id = BAD_FONT_ID; } } FontDBtable[font].mapped_id = mapped_id; return RETURN_SUCCESS; } int map_font_by_name(char *fname, int mapped_id) { return(map_font(get_font_by_name(fname), mapped_id)); } int number_of_fonts(void) { return (nfonts); } int get_font_by_name(char *fname) { int i; if (fname == NULL) { return(BAD_FONT_ID); } for (i = 0; i < nfonts; i++) { if (strcmp(get_fontalias(i), fname) == 0) { return(i); } } for (i = 0; i < nfonts; i++) { if (strcmp(get_fontfallback(i), fname) == 0) { return(i); } } return(BAD_FONT_ID); } char *get_fontfilename(int font, int abspath) { if (abspath) { return (T1_GetFontFilePath(font)); } else { return (T1_GetFontFileName(font)); } } char *get_afmfilename(int font, int abspath) { char *s; if (abspath) { s = T1_GetAfmFilePath(font); } else { s = T1_GetAfmFileName(font); } if (s == NULL) { char *s1; static char buf[256]; int len; s = get_fontfilename(font, abspath); len = strlen(s); s1 = s + (len - 1); while(s1 && *s1 != '.') { len--; s1--; } strncpy(buf, s, len); buf[len] = '\0'; strcat(buf, "afm"); return buf; } else { return s; } } char *get_fontname(int font) { return (T1_GetFontName(font)); } char *get_fontfullname(int font) { return (T1_GetFullName(font)); } char *get_fontfamilyname(int font) { return (T1_GetFamilyName(font)); } char *get_fontweight(int font) { return (T1_GetWeight(font)); } char *get_fontalias(int font) { return (FontDBtable[font].alias); } char *get_fontfallback(int font) { return (FontDBtable[font].fallback); } char *get_encodingscheme(int font) { return (T1_GetEncodingScheme(font)); } char **get_default_encoding(void) { return (DefEncoding); } double get_textline_width(int font) { return (double) T1_GetUnderlineThickness(font)/1000.0; } double get_underline_pos(int font) { return (double) T1_GetLinePosition(font, T1_UNDERLINE)/1000.0; } double get_overline_pos(int font) { return (double) T1_GetLinePosition(font, T1_OVERLINE)/1000.0; } double get_italic_angle(int font) { return (double) T1_GetItalicAngle(font); } double *get_kerning_vector(char *str, int len, int font) { if (len < 2 || T1_GetNoKernPairs(font) <= 0) { return NULL; } else { int i, k, ktot; double *kvector; kvector = xmalloc(len*SIZEOF_DOUBLE); for (i = 0, ktot = 0; i < len - 1; i++) { k = T1_GetKerning(font, str[i], str[i + 1]); ktot += k; kvector[i] = (double) k/1000; } if (ktot) { kvector[len - 1] = (double) ktot/1000; } else { XCFREE(kvector); } return kvector; } } static int tm_scale(TextMatrix *tm, double s) { if (s != 0.0) { tm->cxx *= s; tm->cxy *= s; tm->cyx *= s; tm->cyy *= s; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* determinant */ static double tm_det(TextMatrix *tm) { return tm->cxx*tm->cyy - tm->cxy*tm->cyx; } /* vertical size */ static double tm_size(TextMatrix *tm) { return tm_det(tm)/sqrt(tm->cxx*tm->cxx + tm->cyx*tm->cyx); } static int tm_product(TextMatrix *tm, TextMatrix *p) { TextMatrix tmp; if (tm_det(p) != 0.0) { tmp.cxx = p->cxx*tm->cxx + p->cxy*tm->cyx; tmp.cxy = p->cxx*tm->cxy + p->cxy*tm->cyy; tmp.cyx = p->cyx*tm->cxx + p->cyy*tm->cyx; tmp.cyy = p->cyx*tm->cxy + p->cyy*tm->cyy; *tm = tmp; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } static void tm_rotate(TextMatrix *tm, double angle) { if (angle != 0.0) { double co, si; TextMatrix tmp; si = sin(M_PI/180.0*angle); co = cos(M_PI/180.0*angle); tmp.cxx = co; tmp.cyy = co; tmp.cxy = -si; tmp.cyx = si; tm_product(tm, &tmp); } } static void tm_slant(TextMatrix *tm, double slant) { if (slant != 0.0) { TextMatrix tmp; tmp.cxx = 1.0; tmp.cyy = 1.0; tmp.cxy = slant; tmp.cyx = 0.0; tm_product(tm, &tmp); } } GLYPH *GetGlyphString(CompositeString *cs, double dpv, int fontaa) { int i; int len = cs->len; int FontID = cs->font; float Size; long Space = 0; GLYPH *glyph; static int aacolors[T1_AALEVELS]; unsigned int fg, bg; static unsigned long last_bg = 0, last_fg = 0; int modflag; T1_TMATRIX matrix, *matrixP; RGB fg_rgb, bg_rgb, delta_rgb, *prgb; CMap_entry cmap; if (cs->len == 0) { return NULL; } /* T1lib doesn't like negative sizes */ Size = (float) fabs(tm_size(&cs->tm)); if (Size == 0.0) { return NULL; } /* NB: T1lib uses counter-intuitive names for off-diagonal terms */ matrix.cxx = (float) cs->tm.cxx/Size; matrix.cxy = (float) cs->tm.cyx/Size; matrix.cyx = (float) cs->tm.cxy/Size; matrix.cyy = (float) cs->tm.cyy/Size; Size *= dpv; modflag = T1_UNDERLINE * cs->underline | T1_OVERLINE * cs->overline | T1_KERNING * cs->kerning; if (fabs(matrix.cxx - 1) < 0.01 && fabs(matrix.cyy - 1) < 0.01 && fabs(matrix.cxy) < 0.01 && fabs(matrix.cyx) < 0.01) { matrixP = NULL; } else { matrixP = &matrix; } if (fontaa == TRUE) { fg = cs->color; bg = getbgcolor(); aacolors[0] = bg; aacolors[T1_AALEVELS - 1] = fg; if (!AAGrayLevelsOK || (fg != last_fg) || (bg != last_bg)) { /* Get RGB values for fore- and background */ prgb = get_rgb(fg); if (prgb == NULL) { return NULL; } fg_rgb = *prgb; prgb = get_rgb(bg); if (prgb == NULL) { return NULL; } bg_rgb = *prgb; delta_rgb.red = (fg_rgb.red - bg_rgb.red) / (T1_AALEVELS - 1); delta_rgb.green = (fg_rgb.green - bg_rgb.green) / (T1_AALEVELS - 1); delta_rgb.blue = (fg_rgb.blue - bg_rgb.blue) / (T1_AALEVELS - 1); for (i = 1; i < T1_AALEVELS - 1; i++) { cmap.rgb.red = bg_rgb.red + i*delta_rgb.red; cmap.rgb.green = bg_rgb.green + i*delta_rgb.green; cmap.rgb.blue = bg_rgb.blue + i*delta_rgb.blue; cmap.cname = ""; cmap.ctype = COLOR_AUX; aacolors[i] = add_color(cmap); } last_fg = fg; last_bg = bg; AAGrayLevelsOK = TRUE; } /* Set the colors for Anti-Aliasing */ T1_AASetGrayValues(aacolors[0], aacolors[1], aacolors[2], aacolors[3], aacolors[4]); glyph = T1_AASetString(FontID, cs->s, len, Space, modflag, Size, matrixP); } else { glyph = T1_SetString(FontID, cs->s, len, Space, modflag, Size, matrixP); } return glyph; } static void FreeCompositeString(CompositeString *cs, int nss) { int i = 0; for (i = 0; i < nss; i++) { xfree(cs[i].s); if (cs[i].glyph != NULL) { T1_FreeGlyph(cs[i].glyph); } } xfree(cs); } static int get_escape_args(char *s, char *buf) { int i = 0; if (*s == '{') { s++; while (*s != '\0') { if (*s == '}') { *buf = '\0'; return i; } else { *buf = *s; buf++; s++; i++; } } } return -1; } static const TextMatrix unit_tm = UNIT_TM; static CompositeString *String2Composite(char *string, int *nss) { CompositeString *csbuf; char *ss, *buf, *acc_buf; int inside_escape = FALSE; int i, isub, j; int acc_len; int slen; char ccode; int upperset = FALSE; double scale; TextMatrix tm_buf; int font = BAD_FONT_ID, new_font = font; int color = BAD_COLOR, new_color = color; TextMatrix tm = unit_tm, tm_new = tm; double hshift = 0.0, new_hshift = hshift; double baseline = 0.0, baseline_old; double vshift = baseline, new_vshift = vshift; int underline = FALSE, overline = FALSE; int new_underline = underline, new_overline = overline; int kerning = FALSE, new_kerning = kerning; int direction = STRING_DIRECTION_LR, new_direction = direction; int advancing = TEXT_ADVANCING_LR, new_advancing = advancing; int ligatures = FALSE, new_ligatures = ligatures; int setmark = MARK_NONE; int gotomark = MARK_NONE, new_gotomark = gotomark; double val; csbuf = NULL; *nss = 0; if (string == NULL) { return NULL; } slen = strlen(string); if (slen == 0) { return NULL; } ss = xmalloc(slen + 1); buf = xmalloc(slen + 1); acc_buf = xmalloc(slen + 1); if (ss == NULL || buf == NULL || acc_buf == NULL) { xfree(acc_buf); xfree(buf); xfree(ss); return NULL; } isub = 0; ss[isub] = 0; for (i = 0; i <= slen; i++) { ccode = string[i]; acc_len = 0; if (ccode < 32 && ccode > 0) { /* skip control codes */ continue; } if (inside_escape) { inside_escape = FALSE; if (isdigit(ccode)) { new_font = get_mapped_font(ccode - '0'); continue; } else if (ccode == 'd') { i++; switch (string[i]) { case 'l': new_direction = STRING_DIRECTION_LR; break; case 'r': new_direction = STRING_DIRECTION_RL; break; case 'L': new_advancing = TEXT_ADVANCING_LR; break; case 'R': new_advancing = TEXT_ADVANCING_RL; break; default: /* undo advancing */ i--; break; } continue; } else if (ccode == 'F') { i++; switch (string[i]) { case 'k': new_kerning = TRUE; break; case 'K': new_kerning = FALSE; break; case 'l': new_ligatures = TRUE; break; case 'L': new_ligatures = FALSE; break; default: /* undo advancing */ i--; break; } continue; } else if (isoneof(ccode, "cCsSNBxuUoO+-qQn")) { switch (ccode) { case 's': new_vshift -= tm_size(&tm_new)*SUBSCRIPT_SHIFT; tm_scale(&tm_new, SSCRIPT_SCALE); break; case 'S': new_vshift += tm_size(&tm_new)*SUPSCRIPT_SHIFT; tm_scale(&tm_new, SSCRIPT_SCALE); break; case 'N': scale = 1.0/tm_size(&tm_new); tm_scale(&tm_new, scale); new_vshift = baseline; break; case 'B': new_font = BAD_FONT_ID; break; case 'x': new_font = get_font_by_name("Symbol"); break; case 'c': upperset = TRUE; break; case 'C': upperset = FALSE; break; case 'u': new_underline = TRUE; break; case 'U': new_underline = FALSE; break; case 'o': new_overline = TRUE; break; case 'O': new_overline = FALSE; break; case '-': tm_scale(&tm_new, 1.0/ENLARGE_SCALE); break; case '+': tm_scale(&tm_new, ENLARGE_SCALE); break; case 'q': tm_slant(&tm_new, OBLIQUE_FACTOR); break; case 'Q': tm_slant(&tm_new, -OBLIQUE_FACTOR); break; case 'n': new_gotomark = MARK_CR; baseline -= 1.0; new_vshift = baseline; new_hshift = 0.0; break; } continue; } else if (isoneof(ccode, "fhvVzZmM#rltTR") && (j = get_escape_args(&(string[i + 1]), buf)) >= 0) { i += (j + 2); switch (ccode) { case 'f': if (j == 0) { new_font = BAD_FONT_ID; } else if (isdigit(buf[0])) { new_font = get_mapped_font(atoi(buf)); } else { new_font = get_font_by_name(buf); } break; case 'v': if (j == 0) { new_vshift = baseline; } else { val = atof(buf); new_vshift += tm_size(&tm_new)*val; } break; case 'V': baseline_old = baseline; if (j == 0) { baseline = 0.0; } else { val = atof(buf); baseline += tm_size(&tm_new)*val; } new_vshift = baseline; break; case 'h': val = atof(buf); new_hshift = tm_size(&tm_new)*val; break; case 'z': if (j == 0) { scale = 1.0/tm_size(&tm_new); tm_scale(&tm_new, scale); } else { scale = atof(buf); tm_scale(&tm_new, scale); } break; case 'Z': scale = atof(buf)/tm_size(&tm_new); tm_scale(&tm_new, scale); break; case 'r': tm_rotate(&tm_new, atof(buf)); break; case 'l': tm_slant(&tm_new, atof(buf)); break; case 't': if (j == 0) { tm_new = unit_tm; } else { if (sscanf(buf, "%lf %lf %lf %lf", &tm_buf.cxx, &tm_buf.cxy, &tm_buf.cyx, &tm_buf.cyy) == 4) { tm_product(&tm_new, &tm_buf); } } break; case 'T': if (sscanf(buf, "%lf %lf %lf %lf", &tm_buf.cxx, &tm_buf.cxy, &tm_buf.cyx, &tm_buf.cyy) == 4) { tm_new = tm_buf; } break; case 'm': setmark = atoi(buf); break; case 'M': new_gotomark = atoi(buf); new_vshift = baseline; new_hshift = 0.0; break; case 'R': if (j == 0) { new_color = BAD_COLOR; } else if (isdigit(buf[0])) { new_color = atof(buf); } else { new_color = get_color_by_name(buf); } break; case '#': if (j % 2 == 0) { int k; char hex[3]; hex[2] = '\0'; for (k = 0; k < j; k += 2) { hex[0] = buf[k]; hex[1] = buf[k + 1]; acc_buf[acc_len] = strtol(hex, NULL, 16); acc_len++; } } break; } if (ccode != '#') { continue; } } else { /* store the char */ acc_buf[0] = (ccode + (upperset*0x80)) & 0xff; acc_len = 1; } } else { if (ccode == '\\') { inside_escape = TRUE; continue; } else { /* store the char */ acc_buf[0] = (ccode + (upperset*0x80)) & 0xff; acc_len = 1; } } if ((new_font != font ) || (new_color != color ) || (tm_new.cxx != tm.cxx ) || (tm_new.cxy != tm.cxy ) || (tm_new.cyx != tm.cyx ) || (tm_new.cyy != tm.cyy ) || (new_hshift != 0.0 ) || (new_vshift != vshift ) || (new_underline != underline ) || (new_overline != overline ) || (new_kerning != kerning ) || (new_direction != direction ) || (new_advancing != advancing ) || (new_ligatures != ligatures ) || (setmark >= 0 ) || (new_gotomark >= 0 ) || (ccode == 0 )) { if (isub != 0 || setmark >= 0) { /* non-empty substring */ csbuf = xrealloc(csbuf, (*nss + 1)*sizeof(CompositeString)); csbuf[*nss].font = font; csbuf[*nss].color = color; csbuf[*nss].tm = tm; csbuf[*nss].hshift = hshift; csbuf[*nss].vshift = vshift; csbuf[*nss].underline = underline; csbuf[*nss].overline = overline; csbuf[*nss].kerning = kerning; csbuf[*nss].direction = direction; csbuf[*nss].advancing = advancing; csbuf[*nss].ligatures = ligatures; csbuf[*nss].setmark = setmark; setmark = MARK_NONE; csbuf[*nss].gotomark = gotomark; csbuf[*nss].s = xmalloc(isub*SIZEOF_CHAR); memcpy(csbuf[*nss].s, ss, isub); csbuf[*nss].len = isub; isub = 0; (*nss)++; } font = new_font; color = new_color; tm = tm_new; hshift = new_hshift; if (hshift != 0.0) { /* once a substring is manually advanced, all the following * substrings will be advanced as well! */ new_hshift = 0.0; } vshift = new_vshift; underline = new_underline; overline = new_overline; kerning = new_kerning; direction = new_direction; advancing = new_advancing; ligatures = new_ligatures; gotomark = new_gotomark; if (gotomark >= 0) { /* once a substring is manually advanced, all the following * substrings will be advanced as well! */ new_gotomark = MARK_NONE; } } memcpy(&ss[isub], acc_buf, acc_len*SIZEOF_CHAR); isub += acc_len; } xfree(acc_buf); xfree(buf); xfree(ss); return (csbuf); } static void reverse_string(char *s, int len) { char cbuf; int i; if (s == NULL) { return; } for (i = 0; i < len/2; i++) { cbuf = s[i]; s[i] = s[len - i - 1]; s[len - i - 1] = cbuf; } } static void process_ligatures(CompositeString *cs) { int j, k, l, m, none_found; char *ligtheString; char *succs, *ligs; char buf_char; ligtheString = xmalloc((cs->len + 1)*SIZEOF_CHAR); /* Loop through the characters */ for (j = 0, m = 0; j < cs->len; j++, m++) { if ((k = T1_QueryLigs(cs->font, cs->s[j], &succs, &ligs)) > 0) { buf_char = cs->s[j]; while (k > 0){ none_found = 1; for (l = 0; l < k; l++) { /* Loop through the ligatures */ if (succs[l] == cs->s[j + 1]) { buf_char = ligs[l]; j++; none_found = 0; break; } } if (none_found) { break; } k = T1_QueryLigs(cs->font, buf_char, &succs, &ligs); } ligtheString[m] = buf_char; } else { /* There are no ligatures */ ligtheString[m] = cs->s[j]; } } ligtheString[m] = 0; xfree(cs->s); cs->s = ligtheString; cs->len = m; } void WriteString(VPoint vp, int rot, int just, char *theString) { VPoint vptmp; double page_ipv, page_dpv; int def_font = getfont(); int def_color = getcolor(); double Angle = (double) rot; /* charsize (in VP units) */ double charsize = MAGIC_FONT_SCALE*getcharsize(); int text_advancing; int iss, nss; GLYPH *glyph; CompositeString *cstring; int pheight, pwidth; int hjust, vjust; double hfudge, vfudge; int setmark, gotomark; VPoint cs_marks[MAX_MARKS]; VPoint rpoint, baseline_start, baseline_stop, bbox_ll, bbox_ur, offset; Device_entry dev; if (theString == NULL || strlen(theString) == 0) { return; } if (charsize <= 0.0) { return; } dev = get_curdevice_props(); /* inches per 1 unit of viewport */ page_ipv = MIN2(page_width_in, page_height_in); /* dots per 1 unit of viewport */ page_dpv = page_ipv*page_dpi; hjust = just & 03; switch (hjust) { case JUST_LEFT: hfudge = 0.0; break; case JUST_RIGHT: hfudge = 1.0; break; case JUST_CENTER: hfudge = 0.5; break; default: errmsg("Wrong justification type of string"); return; } vjust = just & 014; switch (vjust) { case JUST_BOTTOM: vfudge = 0.0; break; case JUST_TOP: vfudge = 1.0; break; case JUST_MIDDLE: vfudge = 0.5; break; case JUST_BLINE: /* Not used; to make compiler happy */ vfudge = 0.0; break; default: /* This can't happen; to make compiler happy */ errmsg("Internal error"); return; } cstring = String2Composite(theString, &nss); if (cstring == NULL) { return; } /* zero marks */ for (gotomark = 0; gotomark < MAX_MARKS; gotomark++) { cs_marks[gotomark] = vp; } rpoint = vp; baseline_start = rpoint; bbox_ll = rpoint; bbox_ur = rpoint; for (iss = 0; iss < nss; iss++) { CompositeString *cs = &cstring[iss]; /* Post-process the CS */ if (cs->font == BAD_FONT_ID) { cs->font = def_font; } if (cs->color == BAD_COLOR) { cs->color = def_color; } if (cs->ligatures == TRUE) { process_ligatures(cs); } if (cs->direction == STRING_DIRECTION_RL) { reverse_string(cs->s, cs->len); } tm_rotate(&cs->tm, Angle); tm_scale(&cs->tm, charsize); cs->vshift *= charsize; cs->hshift *= charsize; text_advancing = cs->advancing; gotomark = cs->gotomark; setmark = cs->setmark; glyph = GetGlyphString(cs, page_dpv, dev.fontaa); if (glyph != NULL) { VPoint hvpshift, vvpshift; if (text_advancing == TEXT_ADVANCING_RL) { glyph->metrics.leftSideBearing -= glyph->metrics.advanceX; glyph->metrics.rightSideBearing -= glyph->metrics.advanceX; glyph->metrics.advanceX *= -1; glyph->metrics.ascent -= glyph->metrics.advanceY; glyph->metrics.descent -= glyph->metrics.advanceY; glyph->metrics.advanceY *= -1; } vvpshift.x = cs->tm.cxy*cs->vshift/tm_size(&cs->tm); vvpshift.y = cs->tm.cyy*cs->vshift/tm_size(&cs->tm); hvpshift.x = cs->tm.cxx*cs->hshift/tm_size(&cs->tm); hvpshift.y = cs->tm.cyx*cs->hshift/tm_size(&cs->tm); if (gotomark >= 0 && gotomark < MAX_MARKS) { rpoint = cs_marks[gotomark]; } else if (gotomark == MARK_CR) { /* carriage return */ rpoint = vp; } rpoint.x += hvpshift.x; rpoint.y += hvpshift.y; cs->start = rpoint; cs->start.x += vvpshift.x; cs->start.y += vvpshift.y; /* update bbox */ vptmp.x = cs->start.x + (double) glyph->metrics.leftSideBearing/page_dpv; vptmp.y = cs->start.y + (double) glyph->metrics.descent/page_dpv; bbox_ll.x = MIN2(bbox_ll.x, vptmp.x); bbox_ll.y = MIN2(bbox_ll.y, vptmp.y); vptmp.x = cs->start.x + (double) glyph->metrics.rightSideBearing/page_dpv; vptmp.y = cs->start.y + (double) glyph->metrics.ascent/page_dpv; bbox_ur.x = MAX2(bbox_ur.x, vptmp.x); bbox_ur.y = MAX2(bbox_ur.y, vptmp.y); rpoint.x += (double) glyph->metrics.advanceX/page_dpv; rpoint.y += (double) glyph->metrics.advanceY/page_dpv; if (setmark >= 0 && setmark < MAX_MARKS) { cs_marks[setmark].x = rpoint.x; cs_marks[setmark].y = rpoint.y; } cs->stop = rpoint; cs->stop.x += vvpshift.x; cs->stop.y += vvpshift.y; cs->glyph = T1_CopyGlyph(glyph); } else { cs->glyph = NULL; } } baseline_stop = rpoint; if (vjust == JUST_BLINE) { offset.x = baseline_start.x + hfudge*(baseline_stop.x - baseline_start.x) - vp.x; offset.y = baseline_start.y + hfudge*(baseline_stop.y - baseline_start.y) - vp.y; } else { offset.x = bbox_ll.x + hfudge*(bbox_ur.x - bbox_ll.x) - vp.x; offset.y = bbox_ll.y + vfudge*(bbox_ur.y - bbox_ll.y) - vp.y; } /* justification corrections */ for (iss = 0; iss < nss; iss++) { glyph = cstring[iss].glyph; if (glyph == NULL) { continue; } cstring[iss].start.x -= offset.x; cstring[iss].start.y -= offset.y; cstring[iss].stop.x -= offset.x; cstring[iss].stop.y -= offset.y; } /* update BB */ bbox_ll.x -= offset.x; bbox_ll.y -= offset.y; bbox_ur.x -= offset.x; bbox_ur.y -= offset.y; update_bboxes(bbox_ll); update_bboxes(bbox_ur); for (iss = 0; iss < nss; iss++) { CompositeString *cs = &cstring[iss]; glyph = cs->glyph; if (glyph == NULL) { continue; } pheight = glyph->metrics.ascent - glyph->metrics.descent; pwidth = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; if (pheight <= 0 || pwidth <= 0) { continue; } if (get_draw_mode() == TRUE) { /* No patterned texts yet */ setpattern(1); setcolor(cs->color); if (dev.devfonts == TRUE) { if (cs->advancing == TEXT_ADVANCING_RL) { vptmp = cs->stop; } else { vptmp = cs->start; } if (devputtext == NULL) { errmsg("Device has no built-in fonts"); } else { (*devputtext) (vptmp, cs->s, cs->len, cs->font, &cs->tm, cs->underline, cs->overline, cs->kerning); } } else { /* upper left corner of bitmap */ vptmp = cs->start; vptmp.x += (double) glyph->metrics.leftSideBearing/page_dpv; vptmp.y += (double) glyph->metrics.ascent/page_dpv; (*devputpixmap) (vptmp, pwidth, pheight, glyph->bits, glyph->bpp, T1_DEFAULT_BITMAP_PAD, PIXMAP_TRANSPARENT); } } } FreeCompositeString(cstring, nss); } grace-5.1.23/src/fourier.c0000644000076500001440000002001210071615561015033 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * DFT by definition and FFT */ /* This module completely rewritten February 1998 by Marcus H. Mendenhall, Vanderbilt University Physics Department Nashville, Tennessee, USA email: marcus.h.mendenhall@vanderbilt.edu The conventional DFT and FFT are reimplemented to avoid massive gratuitous recalculation of trig functions. Also, the signs and magnitudes are rationalized so that a forward DFT and a forward FFT give the same result. Also, if the variable HAVE_FFTW is defined (probably from ./configure), it uses the FFTW libraries to do all transforms, making the DFT and FFT entirely equivalent. See the FFTW home site http://theory.lcs.mit.edu/~fftw/ for copyright and usage information and documentation on the FFTW libraries. I strongly recommend using them... they work very well. */ #include #include #include #include #include "defines.h" #include "utils.h" #include "protos.h" #ifndef HAVE_FFTW static int bit_swap(int i, int nu); /* DFT by definition */ void dft(double *jr, double *ji, int n, int iflag) { int i, j, sgn; double sumr, sumi, tpi, w, *xr, *xi, on = 1.0 / n; double *cov, *siv, co, si; int iwrap; sgn = iflag ? -1 : 1; tpi = 2.0 * M_PI; xr = xcalloc(n, SIZEOF_DOUBLE); xi = xcalloc(n, SIZEOF_DOUBLE); cov = xcalloc(n, SIZEOF_DOUBLE); siv = xcalloc(n, SIZEOF_DOUBLE); if (xr == NULL || xi == NULL || cov == NULL || siv == NULL) { XCFREE(xr); XCFREE(xi); XCFREE(cov); XCFREE(siv); return; } for (i = 0; i < n; i++) { w = tpi * i * on; cov[i] = cos(w); siv[i] = sin(w)*sgn; xr[i] = jr[i]; xi[i] = ji[i]; } for (j = 0; j < n; j++) { sumr = 0.0; sumi = 0.0; for (i = 0, iwrap=0; i < n; i++, iwrap += j) { if(iwrap >= n) iwrap -= n; co = cov[iwrap]; si = siv[iwrap]; sumr = sumr + xr[i] * co + sgn * xi[i] * si; sumi = sumi + xi[i] * co - sgn * xr[i] * si; } jr[j] = sumr; ji[j] = sumi; } if (sgn == 1) { on = 1.0 * on; } else { on = 1.0; } for (i = 0; i < n; i++) { jr[i] = jr[i] * on; ji[i] = ji[i] * on; } XCFREE(xr); XCFREE(xi); XCFREE(cov); XCFREE(siv); } /* real_data ... ptr. to real part of data to be transformed imag_data ... ptr. to imag " " " " " " inv ..... Switch to flag normal or inverse transform n_pts ... Number of real data points nu ...... logarithm in base 2 of n_pts e.g. nu = 5 if n_pts = 32. */ void fft(double *real_data, double *imag_data, int n_pts, int nu, int inv) { int n2, i, ib ,mm, k; int sgn, tstep; double tr, ti, arg; /* intermediate values in calcs. */ double c, s; /* cosine & sine components of Fourier trans. */ static double *sintab = NULL; static int last_n = 0; n2 = n_pts / 2; if(n_pts==0) { if(sintab) XCFREE(sintab); sintab=NULL; last_n=0; return; /* just deallocate memory if called with zero points */ } else if (n_pts != last_n) { /* allocate new sin table */ arg=2*M_PI/n_pts; last_n=0; if(sintab) XCFREE(sintab); sintab=(double *) xcalloc(n_pts,SIZEOF_DOUBLE); if(sintab == NULL) return; /* out of memory! */ for(i=0; i k) { fswap((real_data + k), (real_data + ib)); fswap((imag_data + k), (imag_data + ib)); } } /* * Calculate the componets of the Fourier series of the function */ tstep=n2; for (mm = 1; mm < n_pts; mm*=2) { int sinidx=0, cosidx=n_pts/4; for(k=0; k= n_pts) sinidx -= n_pts; if(cosidx >= n_pts) cosidx -= n_pts; for (i = k; i < n_pts; i+=mm*2) { double re1, re2, im1, im2; re1=real_data[i]; re2=real_data[i+mm]; im1=imag_data[i]; im2=imag_data[i+mm]; tr = re2 * c + im2 * s; ti = im2 * c - re2 * s; real_data[i+mm] = re1 - tr; imag_data[i+mm] = im1 - ti; real_data[i] = re1 + tr; imag_data[i] = im1 + ti; } } tstep /= 2; } /* * If calculating the inverse transform, must divide the data by the number of * data points. */ if (inv) { double fac = 1.0 / n_pts; for (k = 0; k != n_pts; k++) { *(real_data + k) *= fac; *(imag_data + k) *= fac; } } } /* * Bit swapping routine in which the bit pattern of the integer i is reordered. * See Brigham's book for details */ static int bit_swap(int i, int nu) { int ib, i1, i2; ib = 0; for (i1 = 0; i1 != nu; i1++) { i2 = i / 2; ib = ib * 2 + i - 2 * i2; i = i2; } return (ib); } #else /* Start of new FFTW-based transforms by Marcus H. Mendenhall */ #include #include static char *wisdom_file=0; static char *initial_wisdom=0; static int using_wisdom=0; static void save_wisdom(void){ FILE *wf; char *final_wisdom; final_wisdom=fftw_export_wisdom_to_string(); if(!initial_wisdom || strcmp(initial_wisdom, final_wisdom)) { wf=fopen(wisdom_file,"w"); if(wf) { fftw_export_wisdom_to_file(wf); fclose(wf); } } fftw_free(final_wisdom); if(initial_wisdom) fftw_free(initial_wisdom); } void dft(double *jr, double *ji, int n, int iflag) { fftw_plan plan; int i; double ninv; FFTW_COMPLEX *cbuf; static int wisdom_inited=0; char *ram_cache_wisdom; int plan_flags; if(!wisdom_inited) { wisdom_inited=1; wisdom_file=getenv("GRACE_FFTW_WISDOM_FILE"); ram_cache_wisdom=getenv("GRACE_FFTW_RAM_WISDOM"); if(ram_cache_wisdom) sscanf(ram_cache_wisdom, "%d", &using_wisdom); /* turn on wisdom if it is requested even without persistent storage */ if(wisdom_file && wisdom_file[0] ) { /* if a file was specified in GRACE_FFTW_WISDOM_FILE, try to read it */ FILE *wf; fftw_status fstat; wf=fopen(wisdom_file,"r"); if(wf) { fstat=fftw_import_wisdom_from_file(wf); fclose(wf); initial_wisdom=fftw_export_wisdom_to_string(); } else initial_wisdom=0; atexit(save_wisdom); using_wisdom=1; /* if a file is specified, always use wisdom */ } } plan_flags=using_wisdom? (FFTW_USE_WISDOM | FFTW_MEASURE) : FFTW_ESTIMATE; plan=fftw_create_plan(n, iflag?FFTW_BACKWARD:FFTW_FORWARD, plan_flags | FFTW_IN_PLACE); cbuf=xcalloc(n, sizeof(*cbuf)); if(!cbuf) return; for(i=0; i #include #include #include #include "globals.h" #include "utils.h" #include "graphs.h" #include "graphutils.h" #include "device.h" #include "protos.h" static void put_regions(FILE * pp, int embed); static void put_objects(int gno, FILE * pp, int embed); static char buf[256]; void putparms(int gno, FILE *pp, int embed) { int i, j, k, ming, maxg; int ps, pt, gh, gt, fx, fy, px, py; double dsx, dsy; char embedstr[2], tmpstr1[64], tmpstr2[64]; framep f; legend leg; labels lab; plotarr p; tickmarks *t; world_stack ws; world w; view v; CMap_entry *cmap; GLocator locator; char *p1, *p2, *tmpbuf; int wpp, hpp; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } fprintf(pp, "# Grace project file\n"); fprintf(pp, "#\n"); /* Print some global variables */ fprintf(pp, "%sversion %ld\n", embedstr, bi_version_id()); get_device_page_dimensions(tdevice, &wpp, &hpp); fprintf(pp, "%spage size %d, %d\n", embedstr, wpp, hpp); tmpbuf = copy_string(NULL, get_project_description()); if (tmpbuf != NULL) { p1 = tmpbuf; while ((p2 = strchr (p1, '\n')) != NULL) { *p2 = 0; fprintf (pp, "%sdescription \"%s\"\n", embedstr, PSTRING(p1)); *p2 = '\n'; p1 = p2; p1++; } if (*p1) { fprintf (pp, "%sdescription \"%s\"\n", embedstr, PSTRING(p1)); } xfree(tmpbuf); } fprintf(pp, "%spage scroll %d%%\n", embedstr, (int) rint(scrollper * 100)); fprintf(pp, "%spage inout %d%%\n", embedstr, (int) rint(shexper * 100)); fprintf(pp, "%slink page %s\n", embedstr, scrolling_islinked ? "on" : "off"); for (i = 0; i < number_of_fonts(); i++) { if (get_font_mapped_id(i) != BAD_FONT_ID) { fprintf(pp, "%smap font %d to \"%s\", \"%s\"\n", embedstr, get_font_mapped_id(i), get_fontalias(i), get_fontfallback(i)); } } for (i = 0; i < number_of_colors(); i++) { cmap = get_cmap_entry(i); if (cmap != NULL && cmap->ctype == COLOR_MAIN) { fprintf(pp, "%smap color %d to (%d, %d, %d), \"%s\"\n", embedstr, i, cmap->rgb.red, cmap->rgb.green, cmap->rgb.blue, PSTRING(cmap->cname)); } } fprintf(pp, "%sreference date %.12g\n", embedstr, get_ref_date()); fprintf(pp, "%sdate wrap %s\n", embedstr, on_or_off(two_digits_years_allowed())); fprintf(pp, "%sdate wrap year %d\n", embedstr, get_wrap_year()); fprintf(pp, "%sdefault linewidth %.1f\n", embedstr, grdefaults.linew); fprintf(pp, "%sdefault linestyle %d\n", embedstr, grdefaults.lines); fprintf(pp, "%sdefault color %d\n", embedstr, grdefaults.color); fprintf(pp, "%sdefault pattern %d\n", embedstr, grdefaults.pattern); fprintf(pp, "%sdefault font %d\n", embedstr, get_font_mapped_id(grdefaults.font)); fprintf(pp, "%sdefault char size %f\n", embedstr, grdefaults.charsize); fprintf(pp, "%sdefault symbol size %f\n", embedstr, grdefaults.symsize); fprintf(pp, "%sdefault sformat \"%s\"\n", embedstr, PSTRING(sformat)); fprintf(pp, "%sbackground color %d\n", embedstr, getbgcolor()); fprintf(pp, "%spage background fill %s\n", embedstr, on_or_off(getbgfill())); fprintf(pp, "%stimestamp %s\n", embedstr, on_or_off(timestamp.active)); fprintf(pp, "%stimestamp %.12g, %.12g\n", embedstr, timestamp.x, timestamp.y); fprintf(pp, "%stimestamp color %d\n", embedstr, timestamp.color); fprintf(pp, "%stimestamp rot %d\n", embedstr, timestamp.rot); fprintf(pp, "%stimestamp font %d\n", embedstr, get_font_mapped_id(timestamp.font)); fprintf(pp, "%stimestamp char size %f\n", embedstr, timestamp.charsize); fprintf(pp, "%stimestamp def \"%s\"\n", embedstr, PSTRING(timestamp.s)); put_objects(gno, pp, embed); put_regions(pp, embed); if (gno == ALL_GRAPHS) { maxg = number_of_graphs() - 1; ming = 0; } else { maxg = gno; ming = gno; } for (k = ming; k <= maxg; k++) { if (is_graph_active(k)) { gno = k; gh = is_graph_hidden(gno); gt = get_graph_type(gno); get_graph_locator(gno, &locator); ps = locator.pointset; pt = locator.pt_type; dsx = locator.dsx; dsy = locator.dsy; fx = locator.fx; fy = locator.fy; px = locator.px; py = locator.py; fprintf(pp, "%sg%1d %s\n", embedstr, gno, on_or_off(is_graph_active(gno))); fprintf(pp, "%sg%1d hidden %s\n", embedstr, gno, true_or_false(gh)); fprintf(pp, "%sg%1d type %s\n", embedstr, gno, graph_types(gt)); fprintf(pp, "%sg%1d stacked %s\n", embedstr, gno, true_or_false(is_graph_stacked(gno))); fprintf(pp, "%sg%1d bar hgap %f\n", embedstr, gno, get_graph_bargap(gno)); fprintf(pp, "%sg%1d fixedpoint %s\n", embedstr, gno, on_or_off(ps)); fprintf(pp, "%sg%1d fixedpoint type %d\n", embedstr, gno, pt); fprintf(pp, "%sg%1d fixedpoint xy %f, %f\n", embedstr, gno, dsx, dsy); strcpy(tmpstr1, get_format_types(fx)); strcpy(tmpstr2, get_format_types(fy)); fprintf(pp, "%sg%1d fixedpoint format %s %s\n", embedstr, gno, tmpstr1, tmpstr2); fprintf(pp, "%sg%1d fixedpoint prec %d, %d\n", embedstr, gno, px, py); fprintf(pp, "%swith g%1d\n", embedstr, gno); get_graph_world(gno, &w); fprintf(pp, "%s world %.12g, %.12g, %.12g, %.12g\n", embedstr, w.xg1, w.yg1, w.xg2, w.yg2); for (i = 0; i < graph_world_stack_size(gno); i++) { get_world_stack_entry(gno, i, &ws); fprintf(pp, "%s stack world %.9g, %.9g, %.9g, %.9g\n", embedstr, ws.w.xg1, ws.w.xg2, ws.w.yg1, ws.w.yg2); } fprintf(pp, "%s znorm %g\n", embedstr, get_graph_znorm(gno)); get_graph_viewport(gno, &v); fprintf(pp, "%s view %f, %f, %f, %f\n", embedstr, v.xv1, v.yv1, v.xv2, v.yv2); get_graph_labels(gno, &lab); fprintf(pp, "%s title \"%s\"\n", embedstr, PSTRING(lab.title.s)); fprintf(pp, "%s title font %d\n", embedstr, get_font_mapped_id(lab.title.font)); fprintf(pp, "%s title size %f\n", embedstr, lab.title.charsize); fprintf(pp, "%s title color %d\n", embedstr, lab.title.color); fprintf(pp, "%s subtitle \"%s\"\n", embedstr, PSTRING(lab.stitle.s)); fprintf(pp, "%s subtitle font %d\n", embedstr, get_font_mapped_id(lab.stitle.font)); fprintf(pp, "%s subtitle size %f\n", embedstr, lab.stitle.charsize); fprintf(pp, "%s subtitle color %d\n", embedstr, lab.stitle.color); fprintf(pp, "%s xaxes scale %s\n", embedstr, scale_types(get_graph_xscale(gno))); fprintf(pp, "%s yaxes scale %s\n", embedstr, scale_types(get_graph_yscale(gno))); fprintf(pp, "%s xaxes invert %s\n", embedstr, on_or_off(is_graph_xinvert(gno))); fprintf(pp, "%s yaxes invert %s\n", embedstr, on_or_off(is_graph_yinvert(gno))); for (i = 0; i < MAXAXES; i++) { t = get_graph_tickmarks(gno, i); switch (i) { case 0: sprintf(buf, "%s xaxis ", embedstr); break; case 1: sprintf(buf, "%s yaxis ", embedstr); break; case 2: sprintf(buf, "%s altxaxis ", embedstr); break; case 3: sprintf(buf, "%s altyaxis ", embedstr); break; } fprintf(pp, "%s %s\n", buf, on_or_off(t && t->active)); if (!t || t->active == FALSE) { continue; } fprintf(pp, "%s type zero %s\n", buf, true_or_false(t->zero)); fprintf(pp, "%s offset %f , %f\n", buf, t->offsx, t->offsy); fprintf(pp, "%s bar %s\n", buf, on_or_off(t->t_drawbar)); fprintf(pp, "%s bar color %d\n", buf, t->t_drawbarcolor); fprintf(pp, "%s bar linestyle %d\n", buf, t->t_drawbarlines); fprintf(pp, "%s bar linewidth %.1f\n", buf, t->t_drawbarlinew); fprintf(pp, "%s label \"%s\"\n", buf, PSTRING(t->label.s)); if (t->label_layout == LAYOUT_PERPENDICULAR) { fprintf(pp, "%s label layout perp\n", buf); } else { fprintf(pp, "%s label layout para\n", buf); } if (t->label_place == TYPE_AUTO) { fprintf(pp, "%s label place auto\n", buf); } else { fprintf(pp, "%s label place spec\n", buf); fprintf(pp, "%s label place %f, %f\n", buf, t->label.x, t->label.y); } fprintf(pp, "%s label char size %f\n", buf, t->label.charsize); fprintf(pp, "%s label font %d\n", buf, get_font_mapped_id(t->label.font)); fprintf(pp, "%s label color %d\n", buf, t->label.color); switch (t->label_op) { case PLACEMENT_NORMAL: fprintf(pp, "%s label place normal\n", buf); break; case PLACEMENT_OPPOSITE: fprintf(pp, "%s label place opposite\n", buf); break; case PLACEMENT_BOTH: fprintf(pp, "%s label place both\n", buf); break; } fprintf(pp, "%s tick %s\n", buf, on_or_off(t->t_flag)); fprintf(pp, "%s tick major %.12g\n", buf, t->tmajor); fprintf(pp, "%s tick minor ticks %d\n", buf, t->nminor); fprintf(pp, "%s tick default %d\n", buf, t->t_autonum); fprintf(pp, "%s tick place rounded %s\n", buf, true_or_false(t->t_round)); switch (t->t_inout) { case TICKS_IN: fprintf(pp, "%s tick in\n", buf); break; case TICKS_OUT: fprintf(pp, "%s tick out\n", buf); break; case TICKS_BOTH: fprintf(pp, "%s tick both\n", buf); break; } fprintf(pp, "%s tick major size %f\n", buf, t->props.size); fprintf(pp, "%s tick major color %d\n", buf, t->props.color); fprintf(pp, "%s tick major linewidth %.1f\n", buf, t->props.linew); fprintf(pp, "%s tick major linestyle %d\n", buf, t->props.lines); fprintf(pp, "%s tick major grid %s\n", buf, on_or_off(t->props.gridflag)); fprintf(pp, "%s tick minor color %d\n", buf, t->mprops.color); fprintf(pp, "%s tick minor linewidth %.1f\n", buf, t->mprops.linew); fprintf(pp, "%s tick minor linestyle %d\n", buf, t->mprops.lines); fprintf(pp, "%s tick minor grid %s\n", buf, on_or_off(t->mprops.gridflag)); fprintf(pp, "%s tick minor size %f\n", buf, t->mprops.size); fprintf(pp, "%s ticklabel %s\n", buf, on_or_off(t->tl_flag)); fprintf(pp, "%s ticklabel format %s\n", buf, get_format_types(t->tl_format)); fprintf(pp, "%s ticklabel prec %d\n", buf, t->tl_prec); fprintf(pp, "%s ticklabel formula \"%s\"\n", buf, PSTRING(t->tl_formula)); fprintf(pp, "%s ticklabel append \"%s\"\n", buf, PSTRING(t->tl_appstr)); fprintf(pp, "%s ticklabel prepend \"%s\"\n", buf, PSTRING(t->tl_prestr)); fprintf(pp, "%s ticklabel angle %d\n", buf, t->tl_angle); fprintf(pp, "%s ticklabel skip %d\n", buf, t->tl_skip); fprintf(pp, "%s ticklabel stagger %d\n", buf, t->tl_staggered); switch (t->tl_op) { case PLACEMENT_NORMAL: fprintf(pp, "%s ticklabel place normal\n", buf); break; case PLACEMENT_OPPOSITE: fprintf(pp, "%s ticklabel place opposite\n", buf); break; case PLACEMENT_BOTH: fprintf(pp, "%s ticklabel place both\n", buf); break; } fprintf(pp, "%s ticklabel offset %s\n", buf, t->tl_gaptype == TYPE_AUTO ? "auto" : "spec"); fprintf(pp, "%s ticklabel offset %f , %f\n", buf, t->tl_gap.x, t->tl_gap.y); fprintf(pp, "%s ticklabel start type %s\n", buf, t->tl_starttype == TYPE_AUTO ? "auto" : "spec"); fprintf(pp, "%s ticklabel start %f\n", buf, t->tl_start); fprintf(pp, "%s ticklabel stop type %s\n", buf, t->tl_stoptype == TYPE_AUTO ? "auto" : "spec"); fprintf(pp, "%s ticklabel stop %f\n", buf, t->tl_stop); fprintf(pp, "%s ticklabel char size %f\n", buf, t->tl_charsize); fprintf(pp, "%s ticklabel font %d\n", buf, get_font_mapped_id(t->tl_font)); fprintf(pp, "%s ticklabel color %d\n", buf, t->tl_color); switch (t->t_op) { case PLACEMENT_NORMAL: fprintf(pp, "%s tick place normal\n", buf); break; case PLACEMENT_OPPOSITE: fprintf(pp, "%s tick place opposite\n", buf); break; case PLACEMENT_BOTH: fprintf(pp, "%s tick place both\n", buf); break; } switch (t->t_spec) { case TICKS_SPEC_NONE: fprintf(pp, "%s tick spec type none\n", buf); break; case TICKS_SPEC_MARKS: fprintf(pp, "%s tick spec type ticks\n", buf); break; case TICKS_SPEC_BOTH: fprintf(pp, "%s tick spec type both\n", buf); break; } if (t->t_spec != TICKS_SPEC_NONE) { fprintf(pp, "%s tick spec %d\n", buf, t->nticks); for (j = 0; j < t->nticks; j++) { sprintf(tmpstr1, sformat, t->tloc[j].wtpos); if (t->tloc[j].type == TICK_TYPE_MAJOR) { fprintf(pp, "%s tick major %d, %s\n", buf, j, tmpstr1); if (t->t_spec == TICKS_SPEC_BOTH) { fprintf(pp, "%s ticklabel %d, \"%s\"\n", buf, j, PSTRING(t->tloc[j].label)); } } else { fprintf(pp, "%s tick minor %d, %s\n", buf, j, tmpstr1); } } } } get_graph_legend(gno, &leg); fprintf(pp, "%s legend %s\n", embedstr, on_or_off(leg.active)); fprintf(pp, "%s legend loctype %s\n", embedstr, w_or_v(leg.loctype)); fprintf(pp, "%s legend %.12g, %.12g\n", embedstr, leg.legx, leg.legy); fprintf(pp, "%s legend box color %d\n", embedstr, leg.boxpen.color); fprintf(pp, "%s legend box pattern %d\n", embedstr, leg.boxpen.pattern); fprintf(pp, "%s legend box linewidth %.1f\n", embedstr, leg.boxlinew); fprintf(pp, "%s legend box linestyle %d\n", embedstr, leg.boxlines); fprintf(pp, "%s legend box fill color %d\n", embedstr, leg.boxfillpen.color); fprintf(pp, "%s legend box fill pattern %d\n", embedstr, leg.boxfillpen.pattern); fprintf(pp, "%s legend font %d\n", embedstr, get_font_mapped_id(leg.font)); fprintf(pp, "%s legend char size %f\n", embedstr, leg.charsize); fprintf(pp, "%s legend color %d\n", embedstr, leg.color); fprintf(pp, "%s legend length %d\n", embedstr, leg.len); fprintf(pp, "%s legend vgap %d\n", embedstr, leg.vgap); fprintf(pp, "%s legend hgap %d\n", embedstr, leg.hgap); fprintf(pp, "%s legend invert %s\n", embedstr, true_or_false(leg.invert)); get_graph_framep(gno, &f); fprintf(pp, "%s frame type %d\n", embedstr, f.type); fprintf(pp, "%s frame linestyle %d\n", embedstr, f.lines); fprintf(pp, "%s frame linewidth %.1f\n", embedstr, f.linew); fprintf(pp, "%s frame color %d\n", embedstr, f.pen.color); fprintf(pp, "%s frame pattern %d\n", embedstr, f.pen.pattern); fprintf(pp, "%s frame background color %d\n", embedstr, f.fillpen.color); fprintf(pp, "%s frame background pattern %d\n", embedstr, f.fillpen.pattern); for (i = 0; i < number_of_sets(gno); i++) { get_graph_plotarr(gno, i, &p); if (is_set_active(gno, i) == TRUE) { fprintf(pp, "%s s%1d hidden %s\n", embedstr, i, true_or_false(p.hidden)); fprintf(pp, "%s s%1d type %s\n", embedstr, i, set_types(p.type)); fprintf(pp, "%s s%1d symbol %d\n", embedstr, i, p.sym); fprintf(pp, "%s s%1d symbol size %f\n", embedstr, i, p.symsize); fprintf(pp, "%s s%1d symbol color %d\n", embedstr, i, p.sympen.color); fprintf(pp, "%s s%1d symbol pattern %d\n", embedstr, i, p.sympen.pattern); fprintf(pp, "%s s%1d symbol fill color %d\n", embedstr, i, p.symfillpen.color); fprintf(pp, "%s s%1d symbol fill pattern %d\n", embedstr, i, p.symfillpen.pattern); fprintf(pp, "%s s%1d symbol linewidth %.1f\n", embedstr, i, p.symlinew); fprintf(pp, "%s s%1d symbol linestyle %d\n", embedstr, i, p.symlines); fprintf(pp, "%s s%1d symbol char %d\n", embedstr, i, p.symchar); fprintf(pp, "%s s%1d symbol char font %d\n", embedstr, i, get_font_mapped_id(p.charfont)); fprintf(pp, "%s s%1d symbol skip %d\n", embedstr, i, p.symskip); fprintf(pp, "%s s%1d line type %d\n", embedstr, i, p.linet); fprintf(pp, "%s s%1d line linestyle %d\n", embedstr, i, p.lines); fprintf(pp, "%s s%1d line linewidth %.1f\n", embedstr, i, p.linew); fprintf(pp, "%s s%1d line color %d\n", embedstr, i, p.linepen.color); fprintf(pp, "%s s%1d line pattern %d\n", embedstr, i, p.linepen.pattern); fprintf(pp, "%s s%1d baseline type %d\n", embedstr, i, p.baseline_type); fprintf(pp, "%s s%1d baseline %s\n", embedstr, i, on_or_off(p.baseline)); fprintf(pp, "%s s%1d dropline %s\n", embedstr, i, on_or_off(p.dropline)); fprintf(pp, "%s s%1d fill type %d\n", embedstr, i, p.filltype); fprintf(pp, "%s s%1d fill rule %d\n", embedstr, i, p.fillrule); fprintf(pp, "%s s%1d fill color %d\n", embedstr, i, p.setfillpen.color); fprintf(pp, "%s s%1d fill pattern %d\n", embedstr, i, p.setfillpen.pattern); fprintf(pp, "%s s%1d avalue %s\n", embedstr, i, on_or_off(p.avalue.active)); fprintf(pp, "%s s%1d avalue type %d\n", embedstr, i, p.avalue.type); fprintf(pp, "%s s%1d avalue char size %f\n", embedstr, i, p.avalue.size); fprintf(pp, "%s s%1d avalue font %d\n", embedstr, i, get_font_mapped_id(p.avalue.font)); fprintf(pp, "%s s%1d avalue color %d\n", embedstr, i, p.avalue.color); fprintf(pp, "%s s%1d avalue rot %d\n", embedstr, i, p.avalue.angle); fprintf(pp, "%s s%1d avalue format %s\n", embedstr, i, get_format_types(p.avalue.format)); fprintf(pp, "%s s%1d avalue prec %d\n", embedstr, i, p.avalue.prec); fprintf(pp, "%s s%1d avalue prepend \"%s\"\n", embedstr, i, PSTRING(p.avalue.prestr)); fprintf(pp, "%s s%1d avalue append \"%s\"\n", embedstr, i, PSTRING(p.avalue.appstr)); fprintf(pp, "%s s%1d avalue offset %f , %f\n", embedstr, i, p.avalue.offset.x, p.avalue.offset.y); fprintf(pp, "%s s%1d errorbar %s\n", embedstr, i, on_or_off(p.errbar.active)); switch (p.errbar.ptype) { case PLACEMENT_NORMAL: fprintf(pp, "%s s%1d errorbar place normal\n", embedstr, i); break; case PLACEMENT_OPPOSITE: fprintf(pp, "%s s%1d errorbar place opposite\n", embedstr, i); break; case PLACEMENT_BOTH: fprintf(pp, "%s s%1d errorbar place both\n", embedstr, i); break; } fprintf(pp, "%s s%1d errorbar color %d\n", embedstr, i, p.errbar.pen.color); fprintf(pp, "%s s%1d errorbar pattern %d\n", embedstr, i, p.errbar.pen.pattern); fprintf(pp, "%s s%1d errorbar size %f\n", embedstr, i, p.errbar.barsize); fprintf(pp, "%s s%1d errorbar linewidth %.1f\n", embedstr, i, p.errbar.linew); fprintf(pp, "%s s%1d errorbar linestyle %d\n", embedstr, i, p.errbar.lines); fprintf(pp, "%s s%1d errorbar riser linewidth %.1f\n", embedstr, i, p.errbar.riser_linew); fprintf(pp, "%s s%1d errorbar riser linestyle %d\n", embedstr, i, p.errbar.riser_lines); fprintf(pp, "%s s%1d errorbar riser clip %s\n", embedstr, i, on_or_off(p.errbar.arrow_clip)); fprintf(pp, "%s s%1d errorbar riser clip length %f\n", embedstr, i, p.errbar.cliplen); if (is_hotlinked(gno, i)) { fprintf(pp, "%s s%1d link %s \"%s\"\n", embedstr, i, p.hotsrc == SOURCE_DISK ? "disk" : "pipe", p.hotfile); } fprintf(pp, "%s s%1d comment \"%s\"\n", embedstr, i, PSTRING(p.comments)); fprintf(pp, "%s s%1d legend \"%s\"\n", embedstr, i, PSTRING(p.lstr)); } } } } } static void put_objects(int gno, FILE * pp, int embed) { int i; boxtype b; linetype l; ellipsetype e; plotstr s; char embedstr[2]; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } for (i = 0; i < number_of_boxes(); i++) { get_graph_box(i, &b); if (b.active == TRUE) { fprintf(pp, "%swith box\n", embedstr); fprintf(pp, "%s box on\n", embedstr); fprintf(pp, "%s box loctype %s\n", embedstr, w_or_v(b.loctype)); if (b.loctype == COORD_WORLD) { fprintf(pp, "%s box g%1d\n", embedstr, b.gno); } fprintf(pp, "%s box %.12g, %.12g, %.12g, %.12g\n", embedstr, b.x1, b.y1, b.x2, b.y2); fprintf(pp, "%s box linestyle %d\n", embedstr, b.lines); fprintf(pp, "%s box linewidth %.1f\n", embedstr, b.linew); fprintf(pp, "%s box color %d\n", embedstr, b.color); fprintf(pp, "%s box fill color %d\n", embedstr, b.fillcolor); fprintf(pp, "%s box fill pattern %d\n", embedstr, b.fillpattern); fprintf(pp, "%sbox def\n", embedstr); } } for (i = 0; i < number_of_ellipses(); i++) { get_graph_ellipse(i, &e); if (e.active == TRUE) { fprintf(pp, "%swith ellipse\n", embedstr); fprintf(pp, "%s ellipse on\n", embedstr); fprintf(pp, "%s ellipse loctype %s\n", embedstr, w_or_v(e.loctype)); if (e.loctype == COORD_WORLD) { fprintf(pp, "%s ellipse g%1d\n", embedstr, e.gno); } fprintf(pp, "%s ellipse %.12g, %.12g, %.12g, %.12g\n", embedstr, e.x1, e.y1, e.x2, e.y2); fprintf(pp, "%s ellipse linestyle %d\n", embedstr, e.lines); fprintf(pp, "%s ellipse linewidth %.1f\n", embedstr, e.linew); fprintf(pp, "%s ellipse color %d\n", embedstr, e.color); fprintf(pp, "%s ellipse fill color %d\n", embedstr, e.fillcolor); fprintf(pp, "%s ellipse fill pattern %d\n", embedstr, e.fillpattern); fprintf(pp, "%sellipse def\n", embedstr); } } for (i = 0; i < number_of_lines(); i++) { get_graph_line(i, &l); if (l.active == TRUE) { fprintf(pp, "%swith line\n", embedstr); fprintf(pp, "%s line on\n", embedstr); fprintf(pp, "%s line loctype %s\n", embedstr, w_or_v(l.loctype)); if (l.loctype == COORD_WORLD) { fprintf(pp, "%s line g%1d\n", embedstr, l.gno); } fprintf(pp, "%s line %.12g, %.12g, %.12g, %.12g\n", embedstr, l.x1, l.y1, l.x2, l.y2); fprintf(pp, "%s line linewidth %.1f\n", embedstr, l.linew); fprintf(pp, "%s line linestyle %d\n", embedstr, l.lines); fprintf(pp, "%s line color %d\n", embedstr, l.color); fprintf(pp, "%s line arrow %d\n", embedstr, l.arrow_end); fprintf(pp, "%s line arrow type %d\n", embedstr, l.arrow.type); fprintf(pp, "%s line arrow length %f\n", embedstr, l.arrow.length); fprintf(pp, "%s line arrow layout %f, %f\n", embedstr, l.arrow.dL_ff, l.arrow.lL_ff); fprintf(pp, "%sline def\n", embedstr); } } for (i = 0; i < number_of_strings(); i++) { get_graph_string(i, &s); if (s.active == TRUE && s.s[0]) { fprintf(pp, "%swith string\n", embedstr); fprintf(pp, "%s string on\n", embedstr); fprintf(pp, "%s string loctype %s\n", embedstr, w_or_v(s.loctype)); if (s.loctype == COORD_WORLD) { fprintf(pp, "%s string g%1d\n", embedstr, s.gno); } fprintf(pp, "%s string %.12g, %.12g\n", embedstr, s.x, s.y); fprintf(pp, "%s string color %d\n", embedstr, s.color); fprintf(pp, "%s string rot %d\n", embedstr, s.rot); fprintf(pp, "%s string font %d\n", embedstr, get_font_mapped_id(s.font)); fprintf(pp, "%s string just %d\n", embedstr, s.just); fprintf(pp, "%s string char size %f\n", embedstr, s.charsize); fprintf(pp, "%s string def \"%s\"\n", embedstr, PSTRING(s.s)); } } } static void put_regions(FILE * pp, int embed) { int i, j; char embedstr[2]; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } for (i = 0; i < MAXREGION; i++) { fprintf(pp, "%sr%1d %s\n", embedstr, i, on_or_off(rg[i].active)); fprintf(pp, "%slink r%1d to g%1d\n", embedstr, i, rg[i].linkto); switch (rg[i].type) { case REGION_ABOVE: fprintf(pp, "%sr%1d type above\n", embedstr, i); break; case REGION_BELOW: fprintf(pp, "%sr%1d type below\n", embedstr, i); break; case REGION_TOLEFT: fprintf(pp, "%sr%1d type left\n", embedstr, i); break; case REGION_TORIGHT: fprintf(pp, "%sr%1d type right\n", embedstr, i); break; case REGION_POLYI: fprintf(pp, "%sr%1d type polyi\n", embedstr, i); break; case REGION_POLYO: fprintf(pp, "%sr%1d type polyo\n", embedstr, i); break; case REGION_HORIZI: fprintf(pp, "%sr%1d type horizi\n", embedstr, i); break; case REGION_VERTI: fprintf(pp,"%sr%1d type verti\n", embedstr, i); break; case REGION_HORIZO: fprintf(pp, "%sr%1d type horizo\n", embedstr, i); break; case REGION_VERTO: fprintf(pp,"%sr%1d type verto\n", embedstr, i); break; } fprintf(pp, "%sr%1d linestyle %d\n", embedstr, i, rg[i].lines); fprintf(pp, "%sr%1d linewidth %.1f\n", embedstr, i, rg[i].linew); fprintf(pp, "%sr%1d color %d\n", embedstr, i, rg[i].color); if (rg[i].type != REGION_POLYI && rg[i].type != REGION_POLYO) { fprintf(pp, "%sr%1d line %.12g, %.12g, %.12g, %.12g\n", embedstr, i, rg[i].x1, rg[i].y1, rg[i].x2, rg[i].y2); } else { if (rg[i].x != NULL) { for (j = 0; j < rg[i].n; j++) { fprintf(pp, "%sr%1d xy %.12g, %.12g\n", embedstr, i, rg[i].x[j], rg[i].y[j]); } } } } } void put_fitparms(FILE * pp, int embed) { int i; char embedstr[2]; if (embed) { strcpy(embedstr, "@"); } else { embedstr[0] = 0; } fprintf(pp, "# Grace fit description file\n"); fprintf(pp, "#\n"); fprintf(pp, "%sfit title \"%s\"\n", embedstr, PSTRING(nonl_opts.title)); fprintf(pp, "%sfit formula \"%s\"\n", embedstr, PSTRING(nonl_opts.formula)); fprintf(pp, "%sfit with %1d parameters\n", embedstr, nonl_opts.parnum); fprintf(pp, "%sfit prec %g\n", embedstr, nonl_opts.tolerance); for (i = 0; i < nonl_opts.parnum; i++) { fprintf(pp, "%sa%1d = %g\n", embedstr, i, nonl_parms[i].value); if (nonl_parms[i].constr) { fprintf(pp, "%sa%1d constraints on\n", embedstr, i); } else { fprintf(pp, "%sa%1d constraints off\n", embedstr, i); } fprintf(pp, "%sa%1dmin = %g\n", embedstr, i, nonl_parms[i].min); fprintf(pp, "%sa%1dmax = %g\n", embedstr, i, nonl_parms[i].max); } } grace-5.1.23/src/iofilters.c0000644000076500001440000001304010071615561015363 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * filter files before they are input and output * */ #include #include #include #include #if defined(HAVE_FNMATCH) # include #endif #include "defines.h" #include "utils.h" #include "files.h" #include "protos.h" typedef struct filter { char *command; int method; char *id; int idlen; } Filter; Filter *ifilt, *ofilt; int numIfilt=0; int numOfilt=0; int add_input_filter( int method, char *id, char *comm ); int add_output_filter( int method, char *id, char *comm ); static void hex2char( Filter *, char * ); static int test_magic( int len, char *magic, FILE *in ); static int test_pattern( char *ext, char *fn ); int add_io_filter( int type, int method, char *id, char *comm ) { if( type == FILTER_INPUT ) return add_input_filter( method, id, comm ); else if( type == FILTER_OUTPUT ) return add_output_filter( method, id, comm ); else return 1; } /* * if method == 0 -> PATTERN MATCHING else method = the number of bytes to * match in MAGIC NUMBER */ int add_input_filter( int method, char *id, char *comm ) { ifilt = xrealloc( ifilt, ++numIfilt*sizeof(Filter) ); ifilt[numIfilt-1].command = copy_string(NULL, comm); strcpy( ifilt[numIfilt-1].command, comm ); ifilt[numIfilt-1].method = method; if( method == FILTER_PATTERN ) { ifilt[numIfilt-1].id = xmalloc( strlen(id)+1 ); strcpy( ifilt[numIfilt-1].id, id ); ifilt[numIfilt-1].idlen = strlen( ifilt[numIfilt-1].id ); } else { ifilt[numIfilt-1].id = xmalloc(strlen(id)/2+1); hex2char( &ifilt[numIfilt-1], id ); } if( ifilt[numIfilt-1].idlen == 0 ) { numIfilt--; return 1; } else return 0; } int add_output_filter( int method, char *id, char *comm ) { ofilt = xrealloc( ofilt, ++numOfilt*sizeof(Filter) ); ofilt[numOfilt-1].command = copy_string(NULL, comm); strcpy( ofilt[numOfilt-1].command, comm ); ofilt[numOfilt-1].id = xmalloc( strlen(id)+1 ); strcpy( ofilt[numOfilt-1].id, id ); ofilt[numOfilt-1].method = FILTER_PATTERN; return 0; } /* * eliminate filters: * f = 0->output filters, f=1->input filters */ void clear_io_filters( int f ) { Filter *filt; int *i; if( f==FILTER_OUTPUT ){ i = &numOfilt; filt = ofilt; } else { i = &numIfilt; filt = ifilt; } for( ; *i>0; (*i)-- ) { xfree( filt[*i-1].command ); xfree( filt[*i-1].id ); } xfree(filt); } /* * filter input file and return pointer to a pipe */ FILE *filter_read( char *fn ) { char buf[1024]; int i; FILE *in; /* check if file name o.k. */ if( (in=fopen( fn, "rb")) == NULL ) return NULL; for( i=0; iidlen = 0; for( i=0; iid[i] = strtol( tmp, &ptr, 16 ); if( f->id[i]==0 && ptr==NULL ){ f->id[0] = '\0'; f->idlen = 0; break; } else f->idlen++; } f->id[i] = '\0'; } grace-5.1.23/src/missing.h0000644000076500001440000000565410071615562015056 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* replacements for some functions */ #ifndef __MISSING_H_ #define __MISSING_H_ #include #include #if defined(__VMS) # ifndef __CRTL_VER # define __CRTL_VER __VMS_VER # endif int system_spawn(const char *command); # if __ALPHA || __DECC_VER >= 60000000 # include # endif # if __CRTL_VER < 70000000 # define O_NONBLOCK O_NDELAY struct passwd { char *pw_name; char *pw_passwd; int pw_uid; int pw_gid; short pw_salt; int pw_encrypt; char *pw_age; char *pw_comment; char *pw_gecos; char *pw_dir; char *pw_shell; }; char *getlogin(); struct passwd *getpwnam(char *name); # endif /* __CRTL_VER */ #endif /* __VMS */ #ifndef HAVE_MEMMOVE # define memmove(a, b, c) bcopy((b), (a), (c)) #endif #ifndef HAVE_MEMCPY # define memcpy(a, b, c) bcopy ((b), (a), (c)) #endif #ifndef HAVE_GETHOSTNAME # define gethostname(a, n) (strncpy((a), "localhost", n)?0:1) #endif #ifndef HAVE_DRAND48 # define srand48 srand # define lrand48 rand double drand48(void); #else # ifndef HAVE_DRAND48_DECL extern double drand48(void); # endif #endif #ifndef HAVE_GETCWD # ifdef OS2 # define getcwd _getcwd2 # define chdir _chdir2 # endif #endif #ifndef HAVE_UNLINK # ifdef VMS # include # define unlink delete # endif #endif #ifndef HAVE_POPEN FILE *popen(char *cmd, char *mode); int pclose(FILE *fp); #endif #ifndef HAVE_GETTIMEOFDAY # include int gettimeofday (struct timeval *tp, void *tzp); #endif #ifndef HAVE_ALLOCA void *alloca(unsigned int); #endif #if defined(__VMS) && (__ALPHA || __DECC_VER >= 60000000) # define alloca __ALLOCA #endif #ifdef __EMX__ char *exe_path_translate(char *path); #else # define exe_path_translate(p) (p) #endif #ifdef __VMS char *path_translate(const char *path); #else # define path_translate(p) (p) #endif #endif /* __MISSING_H_ */ grace-5.1.23/src/Make.dep0000644000076500001440000002035507413437551014604 0ustar fnevgenyusers# Generated automatically by `make depend' main$(O) : main.c globals.h defines.h graphs.h draw.h utils.h files.h \ ssdata.h graphutils.h plotone.h device.h t1fonts.h devlist.h x11drv.h \ parser.h protos.h missing.h noxprotos.h xprotos.h plotone$(O) : plotone.c globals.h defines.h graphs.h draw.h utils.h files.h \ device.h t1fonts.h plotone.h protos.h missing.h noxprotos.h xprotos.h files$(O) : files.c globals.h defines.h graphs.h draw.h utils.h files.h \ ssdata.h graphutils.h parser.h protos.h missing.h noxprotos.h xprotos.h ssdata$(O) : ssdata.c defines.h globals.h graphs.h draw.h utils.h \ graphutils.h files.h ssdata.h parser.h protos.h missing.h noxprotos.h \ xprotos.h utils$(O) : utils.c buildinfo.h globals.h defines.h graphs.h draw.h utils.h \ files.h protos.h missing.h noxprotos.h xprotos.h drawticks$(O) : drawticks.c globals.h defines.h graphs.h draw.h utils.h \ graphutils.h parser.h protos.h missing.h noxprotos.h xprotos.h nonlfit$(O) : nonlfit.c globals.h defines.h graphs.h draw.h utils.h parser.h \ protos.h missing.h noxprotos.h xprotos.h f2c.h lmdif$(O) : lmdif.c f2c.h as274c$(O) : as274c.c as274c.h utils.h protos.h missing.h noxprotos.h \ defines.h graphs.h xprotos.h fit$(O) : fit.c defines.h utils.h protos.h missing.h noxprotos.h graphs.h \ xprotos.h as274c.h fourier$(O) : fourier.c defines.h utils.h protos.h missing.h noxprotos.h \ graphs.h xprotos.h graphs$(O) : graphs.c defines.h utils.h device.h t1fonts.h draw.h graphs.h \ graphutils.h parser.h protos.h missing.h noxprotos.h xprotos.h graphutils$(O) : graphutils.c globals.h defines.h graphs.h draw.h utils.h \ device.h t1fonts.h graphutils.h protos.h missing.h noxprotos.h \ xprotos.h setutils$(O) : setutils.c globals.h defines.h graphs.h draw.h utils.h \ files.h protos.h missing.h noxprotos.h xprotos.h regionutils$(O) : regionutils.c globals.h defines.h graphs.h draw.h utils.h \ protos.h missing.h noxprotos.h xprotos.h objutils$(O) : objutils.c globals.h defines.h graphs.h draw.h utils.h \ protos.h missing.h noxprotos.h xprotos.h computils$(O) : computils.c globals.h defines.h graphs.h draw.h utils.h \ ssdata.h parser.h protos.h missing.h noxprotos.h xprotos.h defaults$(O) : defaults.c defines.h globals.h graphs.h draw.h utils.h \ protos.h missing.h noxprotos.h xprotos.h params$(O) : params.c globals.h defines.h graphs.h draw.h utils.h \ graphutils.h device.h t1fonts.h protos.h missing.h noxprotos.h \ xprotos.h draw$(O) : draw.c defines.h device.h t1fonts.h graphs.h utils.h draw.h dlmodule$(O) : dlmodule.c dlmodule.h defines.h globals.h graphs.h draw.h \ utils.h parser.h missing$(O) : missing.c defines.h missing.h alloca$(O) : alloca.c iofilters$(O) : iofilters.c defines.h utils.h files.h protos.h missing.h \ noxprotos.h graphs.h xprotos.h dates$(O) : dates.c defines.h utils.h protos.h missing.h noxprotos.h \ graphs.h xprotos.h t1fonts$(O) : t1fonts.c defines.h draw.h utils.h files.h device.h t1fonts.h \ protos.h missing.h noxprotos.h graphs.h xprotos.h device$(O) : device.c defines.h globals.h graphs.h draw.h graphutils.h \ utils.h device.h t1fonts.h mfdrv$(O) : mfdrv.c defines.h utils.h draw.h patterns.h device.h t1fonts.h \ devlist.h mfdrv.h mifdrv$(O) : mifdrv.c defines.h utils.h ../cmath.h draw.h device.h t1fonts.h \ devlist.h patterns.h mifdrv.h psdrv$(O) : psdrv.c defines.h utils.h draw.h device.h t1fonts.h devlist.h \ patterns.h psdrv.h protos.h missing.h noxprotos.h graphs.h xprotos.h \ motifinc.h pdfdrv$(O) : pdfdrv.c defines.h utils.h draw.h device.h t1fonts.h devlist.h \ patterns.h pdfdrv.h protos.h missing.h noxprotos.h graphs.h xprotos.h \ motifinc.h svgdrv$(O) : svgdrv.c defines.h utils.h ../cmath.h draw.h graphs.h device.h \ t1fonts.h devlist.h patterns.h svgdrv.h gd$(O) : gd.c gd.h rstdrv$(O) : rstdrv.c defines.h utils.h draw.h device.h t1fonts.h devlist.h \ patterns.h rstdrv.h protos.h missing.h noxprotos.h graphs.h xprotos.h \ gd.h motifinc.h dummydrv$(O) : dummydrv.c defines.h draw.h device.h t1fonts.h devlist.h \ dummydrv.h mathstuff$(O) : mathstuff.c ../cmath.h protos.h missing.h noxprotos.h \ defines.h graphs.h xprotos.h utils.h ../cephes/cephes.h mathstuff.h Tab$(O) : Tab.c TabP.h Tab.h motifutils$(O) : motifutils.c Tab.h motifinc.h defines.h globals.h graphs.h \ draw.h patterns.h jbitmaps.h t1fonts.h utils.h events.h parser.h \ protos.h missing.h noxprotos.h xprotos.h compwin$(O) : compwin.c globals.h defines.h graphs.h draw.h utils.h ssdata.h \ motifinc.h protos.h missing.h noxprotos.h xprotos.h comwin$(O) : comwin.c globals.h defines.h graphs.h draw.h utils.h files.h \ motifinc.h parser.h protos.h missing.h noxprotos.h xprotos.h eblockwin$(O) : eblockwin.c graphs.h defines.h utils.h ssdata.h protos.h \ missing.h noxprotos.h xprotos.h motifinc.h editpwin$(O) : editpwin.c globals.h defines.h graphs.h draw.h utils.h \ files.h protos.h missing.h noxprotos.h xprotos.h motifinc.h events$(O) : events.c globals.h defines.h graphs.h draw.h events.h utils.h \ graphutils.h x11drv.h plotone.h protos.h missing.h noxprotos.h \ xprotos.h motifinc.h featext$(O) : featext.c globals.h defines.h graphs.h draw.h utils.h protos.h \ missing.h noxprotos.h xprotos.h motifinc.h fileswin$(O) : fileswin.c globals.h defines.h graphs.h draw.h graphutils.h \ utils.h files.h motifinc.h protos.h missing.h noxprotos.h xprotos.h plotwin$(O) : plotwin.c globals.h defines.h graphs.h draw.h utils.h protos.h \ missing.h noxprotos.h xprotos.h motifinc.h graphappwin$(O) : graphappwin.c graphs.h defines.h graphutils.h utils.h \ draw.h protos.h missing.h noxprotos.h xprotos.h motifinc.h helpwin$(O) : helpwin.c utils.h files.h protos.h missing.h noxprotos.h \ defines.h graphs.h xprotos.h motifinc.h hotwin$(O) : hotwin.c globals.h defines.h graphs.h draw.h parser.h \ motifinc.h protos.h missing.h noxprotos.h xprotos.h locatewin$(O) : locatewin.c graphs.h defines.h protos.h missing.h \ noxprotos.h xprotos.h motifinc.h miscwin$(O) : miscwin.c globals.h defines.h graphs.h draw.h utils.h \ motifinc.h protos.h missing.h noxprotos.h xprotos.h monwin$(O) : monwin.c utils.h files.h motifinc.h protos.h missing.h \ noxprotos.h defines.h graphs.h xprotos.h nonlwin$(O) : nonlwin.c globals.h defines.h graphs.h draw.h utils.h files.h \ parser.h motifinc.h protos.h missing.h noxprotos.h xprotos.h printwin$(O) : printwin.c ../cmath.h globals.h defines.h graphs.h draw.h \ device.h t1fonts.h utils.h graphutils.h plotone.h motifinc.h protos.h \ missing.h noxprotos.h xprotos.h ptswin$(O) : ptswin.c utils.h draw.h defines.h graphs.h events.h protos.h \ missing.h noxprotos.h xprotos.h motifinc.h regionwin$(O) : regionwin.c globals.h defines.h graphs.h draw.h utils.h \ events.h motifinc.h protos.h missing.h noxprotos.h xprotos.h setwin$(O) : setwin.c globals.h defines.h graphs.h draw.h utils.h plotone.h \ ssdata.h parser.h motifinc.h protos.h missing.h noxprotos.h xprotos.h strwin$(O) : strwin.c globals.h defines.h graphs.h draw.h utils.h events.h \ protos.h missing.h noxprotos.h xprotos.h motifinc.h setappwin$(O) : setappwin.c globals.h defines.h graphs.h draw.h utils.h \ motifinc.h protos.h missing.h noxprotos.h xprotos.h tickwin$(O) : tickwin.c globals.h defines.h graphs.h draw.h protos.h \ missing.h noxprotos.h xprotos.h utils.h graphutils.h motifinc.h worldwin$(O) : worldwin.c mbitmaps.h globals.h defines.h graphs.h draw.h \ graphutils.h device.h t1fonts.h utils.h motifinc.h protos.h missing.h \ noxprotos.h xprotos.h fontwin$(O) : fontwin.c t1fonts.h defines.h utils.h motifinc.h protos.h \ missing.h noxprotos.h graphs.h xprotos.h xutil$(O) : xutil.c defines.h globals.h graphs.h draw.h utils.h files.h \ graphutils.h plotone.h device.h t1fonts.h x11drv.h protos.h missing.h \ noxprotos.h xprotos.h x11drv$(O) : x11drv.c defines.h globals.h graphs.h draw.h utils.h device.h \ t1fonts.h devlist.h patterns.h x11drv.h protos.h missing.h noxprotos.h \ xprotos.h xmgrace$(O) : xmgrace.c globals.h defines.h graphs.h draw.h bitmaps.h \ utils.h files.h device.h t1fonts.h x11drv.h graphutils.h plotone.h \ events.h protos.h missing.h noxprotos.h xprotos.h motifinc.h pars$(O) : pars.c defines.h globals.h graphs.h draw.h ../cephes/cephes.h \ device.h t1fonts.h utils.h files.h graphutils.h plotone.h dlmodule.h \ ssdata.h protos.h missing.h noxprotos.h xprotos.h parser.h mathstuff.h buildinfo$(O) : buildinfo.c grace-5.1.23/src/motifinc.h0000644000076500001440000003273410071615562015214 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * for Motif specific items */ #ifndef __MOTIFINC_H_ #define __MOTIFINC_H_ /* for Widget */ #include /* for XmString; TODO: remove! */ #include /* * Accept/Apply/Close for aac_cb callbacks */ #define AAC_ACCEPT 0 #define AAC_APPLY 1 #define AAC_CLOSE 2 #define LIST_TYPE_SINGLE 0 #define LIST_TYPE_MULTIPLE 1 #define SPIN_TYPE_INT 0 #define SPIN_TYPE_FLOAT 1 #define ALIGN_BEGINNING 0 #define ALIGN_CENTER 1 #define ALIGN_END 2 #define CreateMenuSeparator(w) CreateSeparator(w) extern Widget app_shell; /* defined in xmgrace.c */ /* set selection gadget */ typedef struct _SetChoiceItem { int type; int display; int gno; int spolicy; int indx; Widget list; } SetChoiceItem; typedef struct { int value; char *label; } OptionItem; typedef struct { int value; unsigned char *bitmap; } BitmapOptionItem; typedef struct { int value; Widget widget; } OptionWidgetItem; typedef struct { int nchoices; int ncols; /* preferred number of columns */ Widget menu; Widget pulldown; OptionWidgetItem *options; } OptionStructure; typedef struct { int nchoices; int *values; void *anydata; Widget rc; Widget list; } ListStructure; typedef struct { int type; double min; double max; double incr; Widget rc; Widget text; Widget arrow_up; Widget arrow_down; } SpinStructure; typedef struct { Widget label; Widget form; Widget text; } TextStructure; typedef struct { Widget popup; Widget label_item; Widget shownd_item; Widget showh_item; Widget hide_item; Widget show_item; Widget bringf_item; Widget sendb_item; Widget duplicate_item; Widget kill_item; Widget killd_item; Widget copy12_item; Widget copy21_item; Widget move12_item; Widget move21_item; Widget swap_item; Widget edit_item; } SetPopupMenu; typedef enum { SetMenuHideCB, SetMenuShowCB, SetMenuBringfCB, SetMenuSendbCB, SetMenuDuplicateCB, SetMenuKillCB, SetMenuKillDCB, SetMenuCopy12CB, SetMenuCopy21CB, SetMenuMove12CB, SetMenuMove21CB, SetMenuSwapCB, SetMenuNewFCB, SetMenuNewSCB, SetMenuNewECB, SetMenuNewBCB, SetMenuEditSCB, SetMenuEditECB, SetMenuPackCB } SetMenuCBtype; typedef struct { int standalone; int gno; int view_comments; int show_hidden; int show_nodata; SetPopupMenu *menu; } SetChoiceData; typedef struct { Widget frame; ListStructure *graph_sel; ListStructure *set_sel; } GraphSetStructure; typedef struct { Widget form; GraphSetStructure *src; GraphSetStructure *dest; } SrcDestStructure; typedef struct { Widget dialog; Widget FSB; Widget rc; } FSBStructure; typedef struct { Widget frame; OptionStructure *r_sel; Widget negate; } RestrictionStructure; typedef struct { Widget form; SrcDestStructure *srcdest; } TransformStructure; /* OptionChoice CB procedure */ typedef void (*OC_CBProc)( int value, /* value */ void * /* data the application registered */ ); /* ToggleButton CB procedure */ typedef void (*TB_CBProc)( int onoff, /* True/False */ void * /* data the application registered */ ); /* FileSelectionBox CB procedure */ typedef int (*FSB_CBProc)( char *, /* filename */ void * /* data the application registered */ ); /* Button CB procedure */ typedef void (*Button_CBProc)( void * /* data the application registered */ ); /* List CB procedure */ typedef void (*List_CBProc)( int n, /* # of items selected */ int *values, /* list of values of the selected items */ void * /* data the application registered */ ); /* Text input CB procedure */ typedef void (*Text_CBProc)( void * /* data the application registered */ ); /* AAC Dialog CB procedure */ typedef int (*AACDialog_CBProc)( void * /* data the application registered */ ); void ManageChild(Widget w); void UnmanageChild(Widget w); void SetSensitive(Widget w, int onoff); Widget GetParent(Widget w); void RegisterEditRes(Widget shell); void SetDimensions(Widget w, unsigned int width, unsigned int height); void GetDimensions(Widget w, unsigned int *width, unsigned int *height); Widget CreateDialogForm(Widget parent, char *s); void SetDialogFormResizable(Widget form, int onoff); void AddDialogFormChild(Widget form, Widget child); Widget CreateFrame(Widget parent, char *s); Widget CreateSeparator(Widget parent); Widget CreateVContainer(Widget parent); Widget CreateHContainer(Widget parent); Widget CreateGrid(Widget parent, int ncols, int nrows); void PlaceGridChild(Widget grid, Widget w, int col, int row); Widget CreateTab(Widget parent); Widget CreateTabPage(Widget parent, char *s); void SelectTabPage(Widget tab, Widget w); Widget CreateScale(Widget parent, char *s, int min, int max, int delta); void SetScaleValue(Widget w, int value); int GetScaleValue(Widget w); void SetScaleWidth(Widget w, int width); Widget CreateCharSizeChoice(Widget parent, char *s); double GetCharSizeChoice(Widget w); void SetCharSizeChoice(Widget w, double size); Widget CreateAngleChoice(Widget parent, char *s); int GetAngleChoice(Widget w); void SetAngleChoice(Widget w, int angle); Widget CreateToggleButton(Widget parent, char *s); int GetToggleButtonState(Widget w); void SetToggleButtonState(Widget w, int value); void AddToggleButtonCB(Widget w, TB_CBProc cbproc, void *anydata); Widget CreateButton(Widget parent, char *label); Widget CreateBitmapButton(Widget parent, int width, int height, const unsigned char *bits); void AddButtonCB(Widget button, Button_CBProc cbproc, void *data); void CreateAACDialog(Widget form, Widget container, AACDialog_CBProc cbproc, void *data); Widget CreateAACButtons(Widget parent, Widget form, Button_CBProc aac_cb); OptionStructure *CreateOptionChoice(Widget parent, char *labelstr, int ncols, int nchoices, OptionItem *items); OptionStructure *CreateBitmapOptionChoice(Widget parent, char *labelstr, int ncols, int nchoices, int width, int height, BitmapOptionItem *items); void SetOptionChoice(OptionStructure *opt, int value); int GetOptionChoice(OptionStructure *opt); void UpdateOptionChoice(OptionStructure *optp, int nchoices, OptionItem *items); void AddOptionChoiceCB(OptionStructure *opt, TB_CBProc cbproc, void *anydata); ListStructure *CreateListChoice(Widget parent, char *labelstr, int type, int nvisible, int nchoices, OptionItem *items); int SelectListChoice(ListStructure *listp, int choice); void SelectListChoices(ListStructure *listp, int nchoices, int *choices); void UpdateListChoice(ListStructure *listp, int nchoices, OptionItem *items); int GetListChoices(ListStructure *listp, int **values); int GetSingleListChoice(ListStructure *listp, int *value); void AddListChoiceCB(ListStructure *listp, List_CBProc cbproc, void *anydata); void list_selectall_action(Widget w, XEvent *e, String *par, Cardinal *npar); void list_unselectall_action(Widget w, XEvent *e, String *par, Cardinal *npar); void list_invertselection_action(Widget w, XEvent *e, String *par, Cardinal *npar); SpinStructure *CreateSpinChoice(Widget parent, char *s, int len, int type, double min, double max, double incr); double GetSpinChoice(SpinStructure *spinp); void SetSpinChoice(SpinStructure *spinp, double value); TextStructure *CreateTextInput(Widget parent, char *s); TextStructure *CreateCSText(Widget parent, char *s); char *GetTextString(TextStructure *cst); void SetTextString(TextStructure *cst, char *s); void AddTextInputCB(TextStructure *cst, Text_CBProc cbproc, void *data); int GetTextCursorPos(TextStructure *cst); void TextInsert(TextStructure *cst, int pos, char *s); void cstext_edit_action(Widget w, XEvent *e, String *par, Cardinal *npar); FSBStructure *CreateFileSelectionBox(Widget parent, char *s); void AddFileSelectionBoxCB(FSBStructure *fsbp, FSB_CBProc cbproc, void *anydata); void SetFileSelectionBoxPattern(FSBStructure *fsb, char *pattern); Widget CreateLabel(Widget parent, char *s); OptionStructure *CreateFontChoice(Widget parent, char *s); OptionStructure *CreatePatternChoice(Widget parent, char *s); OptionStructure *CreateLineStyleChoice(Widget parent, char *s); OptionStructure *CreateSetTypeChoice(Widget parent, char *s); OptionStructure *CreateColorChoice(Widget parent, char *s); OptionStructure *CreateFormatChoice(Widget parent, char *s); OptionStructure *CreateASChoice(Widget parent, char *s); OptionStructure *CreateJustChoice(Widget parent, char *s); RestrictionStructure *CreateRestrictionChoice(Widget parent, char *s); ListStructure *CreateGraphChoice(Widget parent, char *labelstr, int type); ListStructure *CreateSetChoice(Widget parent, char *labelstr, int type, int standalone); void UpdateSetChoice(ListStructure *listp, int gno); GraphSetStructure *CreateGraphSetSelector(Widget parent, char *s, int sel_type); SrcDestStructure *CreateSrcDestSelector(Widget parent, int sel_type); void switch_focus_proc(void *data); void hide_graph_proc(void *data); void show_graph_proc(void *data); void duplicate_graph_proc(void *data); void kill_graph_proc(void *data); void copy12_graph_proc(void *data); void copy21_graph_proc(void *data); void move12_graph_proc(void *data); void move21_graph_proc(void *data); void swap_graph_proc(void *data); void create_new_graph_proc(void *data); void hide_set_proc(void *data); void show_set_proc(void *data); void duplicate_set_proc(void *data); void kill_set_proc(void *data); void killd_set_proc(void *data); void copy12_set_proc(void *data); void copy21_set_proc(void *data); void move12_set_proc(void *data); void move21_set_proc(void *data); void swap_set_proc(void *data); void newF_set_proc(void *data); void newS_set_proc(void *data); void newE_set_proc(void *data); void newB_set_proc(void *data); void editS_set_proc(void *data); void editE_set_proc(void *data); SpinStructure *CreateLineWidthChoice(Widget parent, char *s); SetChoiceItem CreateSetSelector(Widget parent, char *label, int type, int ff, int gtype, int stype); int GetSelectedSet(SetChoiceItem l); int GetSelectedSets(SetChoiceItem l, int **sets); void update_set_list(int gno, SetChoiceItem l); int save_set_list(SetChoiceItem l); void update_save_set_list( SetChoiceItem l, int newgr ); int SetSelectedSet(int gno, int setno, SetChoiceItem l); Widget *CreatePanelChoice(Widget parent, char *labstr, int nchoices, ...); void SetChoice(Widget * w, int value); int GetChoice(Widget * w); Widget CreateTextItem2(Widget parent, int len, char *s); Widget CreateTextItem4(Widget parent, int len, char *s); Widget CreateScrollTextItem2(Widget parent, int hgt, char *s); Widget CreateCommandButtons(Widget parent, int n, Widget * buts, char **l); Widget CreateCommandButtonsNoDefault(Widget parent, int n, Widget * buts, char **l); Widget *CreatePrecisionChoice(Widget parent, char *s); TransformStructure *CreateTransformDialogForm(Widget parent, char *s, int sel_type); int GetTransformDialogSettings(TransformStructure *tdialog, int exclusive, int *gsrc, int *gdest, int *nssrc, int **svaluessrc, int *nsdest, int **svaluesdest); void SetLabel(Widget w, char *s); void AlignLabel(Widget w, int alignment); void SetFixedFont(Widget w); Widget CreateMenuBar(Widget parent); Widget CreateMenu(Widget parent, char *label, char mnemonic, int help); Widget CreateMenuButton(Widget parent, char *label, char mnemonic, Button_CBProc cb, void *data); Widget CreateMenuCloseButton(Widget parent, Widget shell); Widget CreateMenuHelpButton(Widget parent, char *label, char mnemonic, Widget form, char *ha); Widget CreateMenuToggle(Widget parent, char *label, char mnemonic, TB_CBProc cb, void *data); Widget CreateMenuLabel(Widget parent, char *name); void AddHelpCB(Widget w, char *ha); void ContextHelpCB(void *data); char *GetStringSimple(XmString xms); char *xv_getstr(Widget w); Boolean xv_evalexpr(Widget w, double *); Boolean xv_evalexpri(Widget w, int *); void xv_setstr(Widget w, char *s); void handle_close(Widget w); void RaiseWindow(Widget w); void destroy_dialog(Widget w, XtPointer client_data, XtPointer call_data); void destroy_dialog_cb(void *data); void savewidget(Widget w); void deletewidget(Widget w); #endif /* __MOTIFINC_H_ */ grace-5.1.23/src/parser.h0000644000076500001440000000354510071615562014676 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __PARSER_H_ #define __PARSER_H_ #define GRARR_TMP 0 #define GRARR_VEC 1 #define GRARR_SET 2 /* symbol table entry type */ typedef struct { char *s; int type; void *data; } symtab_entry; /* array variable */ typedef struct _grarr { int type; int length; double *data; } grarr; void init_symtab(void); int addto_symtab(symtab_entry newkey); int get_parser_gno(void); int set_parser_gno(int gno); int get_parser_setno(void); int set_parser_setno(int gno, int setno); int scanner(char *s); int s_scanner(char *s, double *res); int v_scanner(char *s, int *reslen, double **vres); void realloc_vrbl(grarr *vrbl, int len); grarr *define_parser_arr(char * const name); int undefine_parser_var(void *ptr); grarr *get_parser_arr_by_name(char * const name); #endif /* __PARSER_H_ */ grace-5.1.23/src/rstdrv.h0000644000076500001440000000471510071615562014726 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" typedef enum { RST_FORMAT_PNM, RST_FORMAT_JPG, RST_FORMAT_PNG } RasterFormat; # define DEFAULT_RASTER_FORMAT RST_FORMAT_PNM /* PNM sub-formats */ #define PNM_FORMAT_PBM 0 #define PNM_FORMAT_PGM 1 #define PNM_FORMAT_PPM 2 #define DEFAULT_PNM_FORMAT PNM_FORMAT_PPM #ifdef HAVE_LIBJPEG # define JPEG_DCT_IFAST 0 # define JPEG_DCT_ISLOW 1 # define JPEG_DCT_FLOAT 2 #define JPEG_DCT_DEFAULT JPEG_DCT_ISLOW #endif #define INTENSITY(r, g, b) ((299*r + 587*g + 114*b)/1000) void rst_drawpixel(VPoint vp); void rst_drawpolyline(VPoint *vps, int n, int mode); void rst_fillpolygon(VPoint *vps, int nc); void rst_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void rst_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void rst_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void rst_leavegraphics(void); int pnminitgraphics(void); int pnm_op_parser(char *opstring); #ifdef NONE_GUI # define pnm_gui_setup NULL #else void pnm_gui_setup(void); #endif #ifdef HAVE_LIBJPEG int jpginitgraphics(void); int jpg_op_parser(char *opstring); # ifdef NONE_GUI # define jpg_gui_setup NULL # else void jpg_gui_setup(void); # endif #endif #ifdef HAVE_LIBPNG int pnginitgraphics(void); int png_op_parser(char *opstring); # ifdef NONE_GUI # define png_gui_setup NULL # else void png_gui_setup(void); # endif #endif grace-5.1.23/src/as274c.c0000644000076500001440000005575010071615561014404 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "as274c.h" #include "utils.h" #include "protos.h" int includ(int np, int nrbar, double w, double *xrow, double y, double *d, double *rbar, double *thetab, double *sserr) { int ier=0, i, k, nextr; double cbar, sbar, di, xi, xk, dpi, wxi; /* ALGORITHM AS274.1 APPL. STATIST. (1992) VOL 41, NO. 2 Calling this routine updates d, rbar, thetab and sserr by the inclusion of xrow, yelem with the specified weight. This version has been modified to make it slightly faster when the early elements of XROW are not zeroes. *** WARNING *** The elements of XROW are over-written. */ --thetab; --rbar; --d; --xrow; #ifdef STRINGENT /* Some checks. */ if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (ier) return ier; #endif /* STRINGENT */ /* the function includ() is called for each obs, and is where all the time is spent. To make it faster, we skip the checks about whether nrbar is big enough for np. If you'd like to have the checks in anyway, then compile with -DSTRINGENT */ nextr = 1; /* Skip unnecessary transformations. Test on exact zeroes must be used or stability can be destroyed. */ for (i=1; i<=np; ++i) { if (w == 0) return ier; xi = xrow[i]; if (xi == 0) nextr += np - i; else { di = d[i]; wxi = w * xi; dpi = di + wxi * xi; cbar = di / dpi; sbar = wxi / dpi; w = cbar * w; d[i] = dpi; if (i != np) for (k = i + 1; k <= np; ++k) { xk = xrow[k]; xrow[k] = xk - xi * rbar[nextr]; rbar[nextr] = cbar * rbar[nextr] + sbar * xk; ++nextr; } xk = y; y = xk - xi * thetab[i]; thetab[i] = cbar * thetab[i] + sbar * xk; } } /* Y * SQRT(W) is now equal to the Brown, Durbin & Evans recursive residual. */ *sserr += w * y * y; return ier; } /* includ */ int clear(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr) /* ALGORITHM AS274.2 APPL. STATIST. (1992) VOL.41, NO. 2 Sets arrays to zero prior to calling AS75.1 */ { int ier=0; if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (ier) return ier; memset(d, 0, np*sizeof(double)); memset(thetab, 0, np*sizeof(double)); memset(rbar, 0, nrbar*sizeof(double)); *sserr = 0; return 0; } int regcf(int np, int nrbar, double *d, double *rbar, double *thetab, double *tol, double *beta, int nreq) { int ier=0, i, j, nextr; /* ALGORITHM AS274.3 APPL. STATIST. (1992) VOL 41, NO.2 Modified version of AS75.4 to calculate regression coefficients for the first NREQ variables, given an orthogonal reduction from AS75.1. */ --beta; --tol; --thetab; --rbar; --d; /* Some checks. */ if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (nreq < 1 || nreq > np) ier += 4; if (ier) return ier; for (i = nreq; i >= 1; --i) if (sqrt(d[i]) < tol[i]) { beta[i] = d[i] = 0; } else { beta[i] = thetab[i]; nextr = (i - 1) * (np + np - i) / 2 + 1; for (j=i+1; j<=nreq; ++j) beta[i] -= rbar[nextr++] * beta[j]; } return ier; } /* regcf */ int tolset(int np, int nrbar, double *d, double *rbar, double *tol) /* ALGORITHM AS274.4 APPL. STATIST. (1992) VOL 41, NO.2 Sets up array TOL for testing for zeroes in an orthogonal reduction formed using AS75.1. EPS is a machine-dependent constant. For compilers which use the IEEE format for floating-point numbers, recommended values are 1.E-06 for single precision and 1.E-15 for double precision. */ { const double eps = 1e-15; double d__1, sum, *work; int ier=0, col, pos, row; --tol; --rbar; --d; /* Some checks. */ if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (ier) return ier; /* Set TOL(I) = sum of absolute values in column I of RBAR after scaling each element by the square root of its row multiplier. */ work = -1 + (double *) xmalloc(np*sizeof(double)); for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]); for (col = 1; col <= np; ++col) { pos = col - 1; sum = work[col]; for (row = 1; row <= col-1; ++row) { sum += (d__1 = rbar[pos], fabs(d__1)) * work[row]; pos += np - row - 1; } tol[col] = eps * sum; } xfree(work+1); return 0; } /* tolset */ int sing(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr, double *tol, int *lindep) /* ALGORITHM AS274.5 APPL. STATIST. (1992) VOL 41, NO. 2 Checks for singularities, reports, and adjusts orthogonal reductions produced by AS75.1. */ { double d__1, temp, *work; int ier=0, np2, col, pos, row, pos2; --lindep; --tol; --thetab; --rbar; --d; if (np <= 0) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (ier) return ier; work = -1 + (double *) xmalloc(np*sizeof(double)); /* Set elements within RBAR to zero if they are less than TOL(COL) in absolute value after being scaled by the square root of their row multiplier. */ for (col = 1; col <= np; ++col) work[col] = sqrt(d[col]); for (col = 1; col <= np; ++col) { temp = tol[col]; pos = col - 1; for (row = 1; row < col; ++row) { if ((d__1 = rbar[pos], fabs(d__1)) * work[row] < temp) rbar[pos] = 0; pos += np - row - 1; } /* If diagonal element is near zero, set it to zero, set appropriate element of LINDEP, and use INCLUD to augment the projections in the lower rows of the orthogonalization. */ lindep[col] = 0; if (work[col] < temp) { lindep[col] = 1; --ier; if (col < np) { np2 = np - col; pos2 = pos + np2 + 1; ier = includ(np2, np2*(np2-1)/2, d[col], rbar+pos+1, thetab[col], d+col+1, rbar+pos2, thetab+col+1, sserr); } else { d__1 = thetab[col]; /* for squaring */ *sserr += d[col] * (d__1 * d__1); } d[col] = work[col] = thetab[col] = 0; } } xfree(work+1); return ier; } /* sing */ int ss(int np, double *d, double *thetab, double *sserr, double *rss) /* ALGORITHM AS274.6 APPL. STATIST. (1992) VOL 41, NO. 2 Calculates partial residual sums of squares from an orthogonal reduction from AS75.1. */ { double sum; int i; --rss; --thetab; --d; if (np < 1) return 1; sum = rss[np] = *sserr; for (i = np; i >= 2; --i) { sum += d[i] * thetab[i] * thetab[i]; rss[i - 1] = sum; } return 0; } /* ss */ int cov(int np, int nrbar, double *d, double *rbar, int nreq, double *rinv, double *var, double *covmat, int dimcov, double *sterr) /* ALGORITHM AS274.7 APPL. STATIST. (1992) VOL 41, NO.2 Calculate covariance matrix for regression coefficients for the first NREQ variables, from an orthogonal reduction produced from AS75.1. */ { int ier=0, k, start, col, pos, row, pos1, pos2; double sum; --sterr; --covmat; --rinv; --rbar; --d; if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (dimcov < nreq * (nreq + 1) / 2) ier += 4; for (row = 1; row <= nreq; ++row) if (d[row] == 0) ier = -row; if (ier) return ier; inv(np, nrbar, rbar+1, nreq, rinv+1); start = pos = 1; for (row = 1; row <= nreq; ++row) { pos2 = start; for (col = row; col <= nreq; ++col) { pos1 = start + col - row; sum = (row == col ? 1.0 : rinv[pos1-1])/d[col]; for (k = col + 1; k <= nreq; ++k) sum += rinv[pos1++] * rinv[pos2++] / d[k]; covmat[pos] = sum * *var; if (row == col) sterr[row] = sqrt(covmat[pos]); ++pos; } start += nreq - row; } return 0; } /* cov */ void inv(int np, int nrbar, double *rbar, int nreq, double *rinv) /* ALGORITHM AS274.8 APPL. STATIST. (1992) VOL 41, NO. 2 Invert first NREQ rows and columns of Cholesky factorization produced by AS75.1. */ { int pos, row; --rinv; --rbar; /* Invert RBAR ignoring row multipliers, from the bottom up. */ pos = nreq * (nreq - 1) / 2; for (row = nreq - 1; row >= 1; --row) { int col, start = (row - 1) * (np + np - row) / 2 + 1; for (col = nreq; col >= row+1; --col) { double sum=0; int pos1=start, pos2=pos, k; for (k = row + 1; k <= col-1; ++k) { pos2 += nreq - k; sum -= rbar[pos1++] * rinv[pos2]; } rinv[pos] = sum - rbar[pos1]; --pos; } } } /* inv */ int pcorr(int np, int nrbar, double *d, double *rbar, double *thetab, double *sserr, int in, double *cormat, int dimc, double *ycorr) /* ALGORITHM AS274.9 APPL. STATIST. (1992) VOL 41, NO. 2 Calculate partial correlations after the first IN variables have been forced into the regression. */ { int ier=0, i, start, in1; double *work; --cormat; --thetab; --rbar; --d; if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (in < 0 || in > np - 1) ier += 4; if (dimc < (np - in) * (np - in - 1) / 2) ier += 8; if (ier) return ier; start = in * (np + np - in - 1) / 2 + 1; in1 = in + 1; work = (double *) xmalloc(np*sizeof(double)); cor(np-in, d+in1, rbar+start, thetab+in1, sserr, work, cormat+1, ycorr); /* Check for zeroes. */ for (i=0; i<(np-in); ++i) if (work[i] <= 0) ier = -1-i; xfree(work); return ier; } /* pcorr */ void cor(int np, double *d, double *rbar, double *thetab, double *sserr, double *work, double *cormat, double *ycorr) /* ALGORITHM AS274.10 APPL. STATIST. (1992) VOL 41, NO.2 Calculate correlations from an orthogonal reduction. This routine will usually be called from PCORR, which will have removed the appropriate number of rows at the start. */ { int i__1, i__2, diff, pos, row, col1, col2, pos1, pos2; double sumy, sum; --ycorr; --cormat; --work; --thetab; --rbar; --d; /* process by columns, including the projections of the dependent variable (THETAB). */ sumy = *sserr; i__1 = np; for (row = 1; row <= i__1; ++row) sumy += d[row] * thetab[row] * thetab[row]; sumy = sqrt(sumy); pos = np * (np - 1) / 2; for (col1 = np; col1 >= 1; --col1) { /* find length of column COL1. */ sum = d[col1]; i__1 = pos1 = col1 - 1; for (row = 1; row <= i__1; ++row) { sum += d[row] * rbar[pos1] * rbar[pos1]; pos1 += np - row - 1; } work[col1] = sqrt(sum); /* If SUM = 0, set all correlations with this variable to zero. */ if (sum == 0) { ycorr[col1] = 0; i__1 = col1 + 1; for (col2 = np; col2 >= i__1; --col2) { cormat[pos] = 0; --pos; } goto L70; } /* Form cross-products, then divide by product of column lengths. */ sum = d[col1] * thetab[col1]; i__1 = pos1 = col1 - 1; for (row = 1; row <= i__1; ++row) { sum += d[row] * rbar[pos1] * thetab[row]; pos1 += np - row - 1; } ycorr[col1] = sum / (sumy * work[col1]); i__1 = col1 + 1; for (col2 = np; col2 >= i__1; --col2) { if (work[col2] > 0) { pos1 = col1 - 1; pos2 = col2 - 1; diff = col2 - col1; i__2 = col1 - 1; for (sum=0, row = 1; row <= i__2; ++row) { sum += d[row] * rbar[pos1] * rbar[pos2]; pos1 += np - row - 1; pos2 = pos1 + diff; } sum += d[col1] * rbar[pos2]; cormat[pos] = sum / (work[col1] * work[col2]); } else cormat[pos] = 0; --pos; } L70: ; } } /* cor */ int vmove(int np, int nrbar, int *vorder, double *d, double *rbar, double *thetab, double *rss, int from, int to, double *tol) /* ALGORITHM AS274.11 APPL. STATIST. (1992) VOL 41, NO. 2 Move variable from position FROM to position TO in an orthogonal reduction produced by AS75.1. */ { int ier=0, last, m; double d__1, cbar, sbar, d1new, d2new, x, y, d1, d2; int first, m1, m2, mp1, inc, col, pos, row; --tol; --rss; --thetab; --rbar; --d; --vorder; if (np <= 0) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (from < 1 || from > np) ier += 4; if (to < 1 || to > np) ier += 8; if (ier) return ier; if (from == to) return ier; if (from < to) { first = from; last = to - 1; inc = 1; } else { first = from - 1; last = to; inc = -1; } /* Find addresses of first elements of RBAR in rows M and (M+1). */ for (m = first; inc < 0 ? m >= last : m <= last; m += inc) { m1 = (m - 1) * (np + np - m) / 2 + 1; m2 = m1 + np - m; mp1 = m + 1; d1 = d[m]; d2 = d[mp1]; /* Special cases. */ if (d1 == 0 && d2 == 0) goto L40; x = rbar[m1]; if (fabs(x) * sqrt(d1) < tol[mp1]) x = 0; if (d1 == 0 || x == 0) { d[m] = d2; d[mp1] = d1; rbar[m1] = 0; for (col = m + 2; col <= np; ++col) { x = rbar[++m1]; rbar[m1] = rbar[m2]; rbar[m2++] = x; } x = thetab[m]; thetab[m] = thetab[mp1]; thetab[mp1] = x; goto L40; } else if (d2 == 0) { d__1 = x; d[m] = d1 * d__1 * d__1; rbar[m1] = 1.0/x; for (col = m + 2; col <= np; ++col) rbar[++m1] /= x; thetab[m] /= x; goto L40; } /* Planar rotation in regular case. */ d__1 = x; d1new = d2 + d1 * (d__1 * d__1); cbar = d2 / d1new; sbar = x * d1 / d1new; d2new = d1 * cbar; d[m] = d1new; d[mp1] = d2new; rbar[m1] = sbar; for (col = m + 2; col <= np; ++col) { y = rbar[++m1]; rbar[m1] = cbar * rbar[m2] + sbar * y; rbar[m2] = y - x * rbar[m2]; ++m2; } y = thetab[m]; thetab[m] = cbar * thetab[mp1] + sbar * y; thetab[mp1] = y - x * thetab[mp1]; /* Swap columns M and (M+1) down to row (M-1). */ L40: if (m == 1) goto L60; pos = m; for (row = 1; row < m; ++row) { x = rbar[pos]; rbar[pos] = rbar[pos - 1]; rbar[pos - 1] = x; pos += np - row - 1; } /* Adjust variable order (VORDER), the tolerances (TOL) and the vector of residual sums of squares (RSS). */ L60: m1 = vorder[m]; vorder[m] = vorder[mp1]; vorder[mp1] = m1; x = tol[m]; tol[m] = tol[mp1]; tol[mp1] = x; d__1 = thetab[mp1]; rss[m] = rss[mp1] + d[mp1] * (d__1 * d__1); } return 0; } /* vmove */ int reordr(int np, int nrbar, int *vorder, double *d, double *rbar, double *thetab, double *rss, double *tol, int *list, int n, int pos1) /* ALGORITHM AS274.12 APPL. STATIST. (1992) VOL 41, NO.2 Re-order the variables in an orthogonal reduction produced by AS75.1 so that the N variables in LIST start at position POS1, though will not necessarily be in the same order as in LIST. Any variables in VORDER before position POS1 are not moved. Auxiliary routine called: VMOVE */ { int ier=0, next, i, j; --list; --tol; --rss; --thetab; --rbar; --d; --vorder; if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (n < 1 || n >= np + 1 - pos1) ier += 4; if (ier) return ier; /* Work through VORDER finding variables which are in LIST. */ i = next = pos1; do { int l=vorder[i]; for (j=1; j<=n; j++) if (l==list[j]) { if (i > next) vmove(np, nrbar, vorder+1, d+1, rbar+1, thetab+1, rss+1, i, next, tol+1); if (++next >= n + pos1) return 0; break; } } while (++i <= np); return 8; } /* reordr */ int hdiag(double *xrow, int np, int nrbar, double *d, double *rbar, double *tol, int nreq, double *hii) /* ALGORITHM AS274.13 APPL. STATIST. (1992) VOL.41, NO.2 */ { int i__1, i__2, ier=0, col, pos, row; double d__1, sum, *wk; --tol; --rbar; --d; --xrow; if (np < 1) ier = 1; if (nrbar < np * (np - 1) / 2) ier += 2; if (nreq > np) ier += 4; if (ier) return ier; /* The elements of XROW.inv(RBAR).sqrt(D) are calculated and stored in WK. */ wk = -1 + (double *) xmalloc(np*sizeof(double)); *hii = 0; i__1 = nreq; for (col = 1; col <= i__1; ++col) if (sqrt(d[col]) <= tol[col]) wk[col] = 0; else { i__2 = pos = col - 1; sum = xrow[col]; for (row = 1; row <= i__2; ++row) { sum -= wk[row] * rbar[pos]; pos += np - row - 1; } d__1 = wk[col] = sum; *hii += d__1 * d__1 / d[col]; } xfree(wk+1); return 0; } /* hdiag */ void pr_utdm_v(double *x, int N, int width, int precision) /* "print a upper triangular double matrix stored as a vector" The matrix is N x N, the vector has N*(N+1)/2 elements. Each element is formatted using width and precision. There are no sanity checks at all. */ { int pos=0, i, j, leavespace; char s[100], fmt[100]; /* will be used in making printf() formats */ char buf[256]; sprintf(fmt, "%%%d.%dg", width, precision); for (i=0; i #include #include #include "defines.h" #include "utils.h" #include "draw.h" #include "patterns.h" #include "device.h" #include "devlist.h" #include "mfdrv.h" extern FILE *prstream; static Device_entry dev_mf = {DEVICE_FILE, "Metafile", mfinitgraphics, NULL, NULL, "gmf", TRUE, FALSE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; int register_mf_drv(void) { return register_device(dev_mf); } int mfinitgraphics(void) { int i, j; Page_geometry pg; /* device-dependent routines */ devupdatecmap = NULL; devdrawpixel = mf_drawpixel; devdrawpolyline = mf_drawpolyline; devfillpolygon = mf_fillpolygon; devdrawarc = mf_drawarc; devfillarc = mf_fillarc; devputpixmap = mf_putpixmap; devputtext = mf_puttext; devleavegraphics = mf_leavegraphics; fprintf(prstream, "#GMF-%s\n", GMF_VERSION); fprintf(prstream, "FontResources {\n"); for (i = 0; i < number_of_fonts(); i++) { fprintf(prstream, "\t( %d , \"%s\" , \"%s\" )\n", i, get_fontalias(i), get_fontfallback(i)); } fprintf(prstream, "}\n"); fprintf(prstream, "ColorResources {\n"); for (i = 0; i < number_of_colors(); i++) { RGB *rgb = get_rgb(i); fprintf(prstream, "\t( %d , \"%s\" , %d , %d , %d )\n", i, get_colorname(i), rgb->red, rgb->green, rgb->blue); } fprintf(prstream, "}\n"); fprintf(prstream, "PatternResources {\n"); for (i = 0; i < number_of_patterns(); i++) { fprintf(prstream, "\t( %d , ", i); for (j = 0; j < 32; j++) { fprintf(prstream, "%02x", pat_bits[i][j]); } fprintf(prstream, " )\n"); } fprintf(prstream, "}\n"); fprintf(prstream, "DashResources {\n"); for (i = 0; i < number_of_linestyles(); i++) { fprintf(prstream, "\t( %d , [ ", i); for (j = 0; j < dash_array_length[i]; j++) { fprintf(prstream, "%d ", dash_array[i][j]); } fprintf(prstream, "] )\n"); } fprintf(prstream, "}\n"); pg = get_page_geometry(); fprintf(prstream, "InitGraphics { %.4f %ld %ld }\n", pg.dpi, pg.width, pg.height); return RETURN_SUCCESS; } void mf_setpen(void) { Pen pen; pen = getpen(); fprintf(prstream, "SetPen { %d %d }\n", pen.color, pen.pattern); } void mf_setdrawbrush(void) { fprintf(prstream, "SetLineWidth { %.4f }\n", getlinewidth()); fprintf(prstream, "SetLineStyle { %d }\n", getlinestyle()); } void mf_drawpixel(VPoint vp) { mf_setpen(); fprintf(prstream, "DrawPixel { ( %.4f , %.4f ) }\n", vp.x, vp.y); } void mf_drawpolyline(VPoint *vps, int n, int mode) { int i; mf_setpen(); mf_setdrawbrush(); fprintf(prstream, "DrawPolyline {\n"); if (mode == POLYLINE_CLOSED) { fprintf(prstream, "\tClosed\n"); } else { fprintf(prstream, "\tOpen\n"); } for (i = 0; i < n; i++) { fprintf(prstream, "\t( %.4f , %.4f )\n", vps[i].x, vps[i].y); } fprintf(prstream, "}\n"); } void mf_fillpolygon(VPoint *vps, int nc) { int i; mf_setpen(); fprintf(prstream, "FillPolygon {\n"); for (i = 0; i < nc; i++) { fprintf(prstream, "\t( %.4f , %.4f )\n", vps[i].x, vps[i].y); } fprintf(prstream, "}\n"); } void mf_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { mf_setpen(); mf_setdrawbrush(); fprintf(prstream, "DrawArc { ( %.4f , %.4f ) ( %.4f , %.4f ) %d %d }\n", vp1.x, vp1.y, vp2.x, vp2.y, a1, a2); } void mf_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { char *name; mf_setpen(); /* FIXME - mode */ if (mode == ARCFILL_CHORD) { name = "FillChord"; } else { name = "FillPieSlice"; } fprintf(prstream, "%s { ( %.4f , %.4f ) ( %.4f , %.4f ) %d %d }\n", name, vp1.x, vp1.y, vp2.x, vp2.y, a1, a2); } void mf_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { int i, j, k; long paddedW; int bit; char buf[16]; if (pixmap_bpp == 1) { strcpy(buf, "Bitmap"); } else { strcpy(buf, "Pixmap"); } fprintf(prstream, "Put%s {\n", buf); if (pixmap_type == PIXMAP_TRANSPARENT) { strcpy(buf, "Transparent"); } else { strcpy(buf, "Opaque"); } fprintf(prstream, "\t( %.4f , %.4f ) %dx%d %s\n", vp.x, vp.y, width, height, buf); if (pixmap_bpp != 1) { for (k = 0; k < height; k++) { fprintf(prstream, "\t"); for (j = 0; j < width; j++) { fprintf(prstream, "%02x", (databits)[k*width+j]); } fprintf(prstream, "\n"); } } else { paddedW = PAD(width, bitmap_pad); for (k = 0; k < height; k++) { fprintf(prstream, "\t"); for (j = 0; j < paddedW/bitmap_pad; j++) { for (i = 0; i < bitmap_pad; i++) { bit = bin_dump(&databits[k*paddedW/bitmap_pad + j], i, bitmap_pad); if (bit) { fprintf(prstream, "X"); } else { fprintf(prstream, "."); } } } fprintf(prstream, "\n"); } } fprintf(prstream, "}\n"); } void mf_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning) { int i; mf_setpen(); fprintf(prstream, "PutText {\n"); fprintf(prstream, "\t( %.4f , %.4f )\n", vp.x, vp.y); fprintf(prstream, "\t %d %.4f %.4f %.4f %.4f %d %d %d %d \"", font, tm->cxx, tm->cxy, tm->cyx, tm->cyy, underline, overline, kerning, len); for (i = 0; i < len; i++) { fputc(s[i], prstream); } fprintf(prstream, "\"\n"); fprintf(prstream, "}\n"); } void mf_leavegraphics(void) { view v; v = get_bbox(BBOX_TYPE_GLOB); fprintf(prstream, "LeaveGraphics { %.4f %.4f %.4f %.4f }\n", v.xv1, v.yv1, v.xv2, v.yv2); } grace-5.1.23/src/mbitmaps.h0000644000076500001440000001077410071615562015220 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Bitmaps for matrix fill order selector */ #ifndef __MBITMAPS_H_ #define __MBITMAPS_H_ #define MBITMAP_WIDTH 20 #define MBITMAP_HEIGHT 20 static unsigned char m_hv_lr_bt_bits[] = { 0x00, 0x03, 0x00, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x08, 0x0f, 0x00, 0x10, 0x03, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x83, 0x00, 0x00, 0x0f, 0x01, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x00}; static unsigned char m_hv_lr_tb_bits[] = { 0x00, 0x03, 0x00, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x01, 0x00, 0x83, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x03, 0x00, 0x08, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x00}; static unsigned char m_hv_rl_bt_bits[] = { 0x00, 0x0c, 0x00, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x01, 0x00, 0x8c, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x05, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x08, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x0c, 0x00}; static unsigned char m_hv_rl_tb_bits[] = { 0x00, 0x0c, 0x00, 0x00, 0x0f, 0x00, 0xfc, 0xff, 0x03, 0x08, 0x0f, 0x00, 0x10, 0x0c, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x0f, 0x01, 0xfc, 0xff, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x0c, 0x00}; static unsigned char m_vh_lr_bt_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x0c, 0x00, 0x02, 0x14, 0x00, 0x02, 0x24, 0x00, 0x02, 0x44, 0x00, 0x02, 0x84, 0x00, 0x02, 0x0e, 0x05, 0x07, 0x0e, 0x06, 0x07, 0x1f, 0x87, 0x0f, 0x1f, 0x88, 0x0f, 0x04, 0x10, 0x02, 0x04, 0x20, 0x02, 0x04, 0x40, 0x02, 0x04, 0x80, 0x02, 0x04, 0x00, 0x03, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char m_vh_lr_tb_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0x04, 0x80, 0x02, 0x04, 0x40, 0x02, 0x04, 0x20, 0x02, 0x04, 0x10, 0x02, 0x1f, 0x88, 0x0f, 0x1f, 0x87, 0x0f, 0x0e, 0x06, 0x07, 0x0e, 0x05, 0x07, 0x84, 0x00, 0x02, 0x44, 0x00, 0x02, 0x24, 0x00, 0x02, 0x14, 0x00, 0x02, 0x0c, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char m_vh_rl_bt_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0x04, 0x80, 0x02, 0x04, 0x40, 0x02, 0x04, 0x20, 0x02, 0x04, 0x10, 0x02, 0x0e, 0x0a, 0x07, 0x0e, 0x06, 0x07, 0x1f, 0x8e, 0x0f, 0x1f, 0x81, 0x0f, 0x84, 0x00, 0x02, 0x44, 0x00, 0x02, 0x24, 0x00, 0x02, 0x14, 0x00, 0x02, 0x0c, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char m_vh_rl_tb_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x0c, 0x00, 0x02, 0x14, 0x00, 0x02, 0x24, 0x00, 0x02, 0x44, 0x00, 0x02, 0x84, 0x00, 0x02, 0x1f, 0x81, 0x0f, 0x1f, 0x8e, 0x0f, 0x0e, 0x06, 0x07, 0x0e, 0x0a, 0x07, 0x04, 0x10, 0x02, 0x04, 0x20, 0x02, 0x04, 0x40, 0x02, 0x04, 0x80, 0x02, 0x04, 0x00, 0x03, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #endif /* __MBITMAPS_H_ */ grace-5.1.23/src/graphs.c0000644000076500001440000007773210071615561014671 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Graph stuff * */ #include #include #include #include #include #include "defines.h" #include "utils.h" #include "device.h" #include "draw.h" #include "graphs.h" #include "graphutils.h" #include "parser.h" #include "protos.h" /* graph definition */ graph *g = NULL; static int maxgraph = 0; /* the current graph */ static int cg = -1; int is_valid_gno(int gno) { if (gno >= 0 && gno < maxgraph) { return TRUE; } else { return FALSE; } } int number_of_graphs(void) { return maxgraph; } int get_cg(void) { return cg; } char *graph_types(int it) { static char s[16]; switch (it) { case GRAPH_XY: strcpy(s, "XY"); break; case GRAPH_CHART: strcpy(s, "Chart"); break; case GRAPH_POLAR: strcpy(s, "Polar"); break; case GRAPH_SMITH: strcpy(s, "Smith"); break; case GRAPH_FIXED: strcpy(s, "Fixed"); break; case GRAPH_PIE: strcpy(s, "Pie"); break; default: strcpy(s, "Unknown"); break; } return s; } /* * kill all sets in a graph */ int kill_all_sets(int gno) { int i; if (is_valid_gno(gno) == TRUE) { for (i = 0; i < g[gno].maxplot; i++) { killset(gno, i); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int kill_graph(int gno) { int j; if (is_valid_gno(gno) == TRUE) { kill_all_sets(gno); XCFREE(g[gno].labs.title.s); XCFREE(g[gno].labs.stitle.s); for (j = 0; j < MAXAXES; j++) { free_graph_tickmarks(g[gno].t[j]); g[gno].t[j] = NULL; } if (gno == maxgraph - 1) { maxgraph--; g = xrealloc(g, maxgraph*sizeof(graph)); if (cg == gno) { cg--; } } else { set_graph_hidden(gno, TRUE); } set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } void kill_all_graphs(void) { int i; for (i = maxgraph - 1; i >= 0; i--) { kill_graph(i); } } int copy_graph(int from, int to) { int i, j; if (is_valid_gno(from) != TRUE || is_valid_gno(to) != TRUE || from == to) { return RETURN_FAILURE; } /* kill target graph */ kill_all_sets(to); XCFREE(g[to].labs.title.s); XCFREE(g[to].labs.stitle.s); for (j = 0; j < MAXAXES; j++) { free_graph_tickmarks(g[to].t[j]); g[to].t[j] = NULL; } memcpy(&g[to], &g[from], sizeof(graph)); /* zero allocatable storage */ g[to].p = NULL; g[to].maxplot = 0; g[to].labs.title.s = NULL; g[to].labs.stitle.s = NULL; /* duplicate allocatable storage */ if (realloc_graph_plots(to, g[from].maxplot) != RETURN_SUCCESS) { return RETURN_FAILURE; } for (i = 0; i < g[from].maxplot; i++) { do_copyset(from, i, to, i); } g[to].labs.title.s = copy_string(NULL, g[from].labs.title.s); g[to].labs.stitle.s = copy_string(NULL, g[from].labs.stitle.s); for (j = 0; j < MAXAXES; j++) { g[to].t[j] = copy_graph_tickmarks(g[from].t[j]); } return RETURN_SUCCESS; } int move_graph(int from, int to) { if (is_valid_gno(from) != TRUE || is_valid_gno(to) != TRUE) { return RETURN_FAILURE; } if (copy_graph(from, to) != RETURN_SUCCESS) { return RETURN_FAILURE; } else { kill_graph(from); return RETURN_SUCCESS; } } int duplicate_graph(int gno) { int new_gno = maxgraph; if (is_valid_gno(gno) != TRUE) { return RETURN_FAILURE; } if (set_graph_active(new_gno) != RETURN_SUCCESS) { return RETURN_FAILURE; } if (copy_graph(gno, new_gno) != RETURN_SUCCESS) { return RETURN_FAILURE; } else { return RETURN_SUCCESS; } } int swap_graph(int from, int to) { graph gtmp; if (is_valid_gno(from) != TRUE || is_valid_gno(to) != TRUE) { return RETURN_FAILURE; } memcpy(>mp, &g[from], sizeof(graph)); memcpy(&g[from], &g[to], sizeof(graph)); memcpy(&g[to], >mp, sizeof(graph)); set_dirtystate(); return RETURN_SUCCESS; } int get_graph_framep(int gno, framep *f) { if (is_valid_gno(gno) == TRUE) { memcpy(f, &g[gno].f, sizeof(framep)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_locator(int gno, GLocator *locator) { if (is_valid_gno(gno) == TRUE) { memcpy(locator, &g[gno].locator, sizeof(GLocator)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_world(int gno, world *w) { if (is_valid_gno(gno) == TRUE) { memcpy(w, &g[gno].w, sizeof(world)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_viewport(int gno, view *v) { if (is_valid_gno(gno) == TRUE) { memcpy(v, &g[gno].v, sizeof(view)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_labels(int gno, labels *labs) { if (is_valid_gno(gno) == TRUE) { memcpy(labs, &g[gno].labs, sizeof(labels)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_plotarr(int gno, int i, plotarr *p) { if (is_valid_gno(gno) == TRUE) { memcpy(p, &g[gno].p[i], sizeof(plotarr)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } /* Tickmarks */ int is_valid_axis(int gno, int axis) { if (is_valid_gno(gno) && axis >= 0 && axis < MAXAXES && g[gno].t[axis] != NULL) { return TRUE; } else { return FALSE; } } tickmarks *get_graph_tickmarks(int gno, int a) { if (is_valid_axis(gno, a) == TRUE) { return g[gno].t[a]; } else { return NULL; } } tickmarks *new_graph_tickmarks(void) { tickmarks *retval; retval = xmalloc(sizeof(tickmarks)); if (retval != NULL) { set_default_ticks(retval); } return retval; } tickmarks *copy_graph_tickmarks(tickmarks *t) { tickmarks *retval; int i; if (t == NULL) { return NULL; } else { retval = new_graph_tickmarks(); if (retval != NULL) { memcpy(retval, t, sizeof(tickmarks)); retval->label.s = copy_string(NULL, t->label.s); retval->tl_formula = copy_string(NULL, t->tl_formula); for (i = 0; i < MAX_TICKS; i++) { retval->tloc[i].label = copy_string(NULL, t->tloc[i].label); } } return retval; } } void free_graph_tickmarks(tickmarks *t) { int i; if (t == NULL) { return; } XCFREE(t->label.s); XCFREE(t->tl_formula); for (i = 0; i < MAX_TICKS; i++) { XCFREE(t->tloc[i].label); } XCFREE(t); } int set_graph_tickmarks(int gno, int a, tickmarks *t) { if (is_valid_axis(gno, a) == TRUE) { free_graph_tickmarks(g[gno].t[a]); g[gno].t[a] = copy_graph_tickmarks(t); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_legend(int gno, legend *leg) { if (is_valid_gno(gno) == TRUE) { memcpy(leg, &g[gno].l, sizeof(legend)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int graph_allocate(int gno) { int retval; if (is_valid_gno(gno)) { return RETURN_SUCCESS; } else if (gno >= maxgraph) { retval = realloc_graphs(gno + 1); if (retval != RETURN_SUCCESS) { return RETURN_FAILURE; } else { return set_graph_hidden(gno, TRUE); } } else { return RETURN_FAILURE; } } int set_graph_active(int gno) { if (graph_allocate(gno) != RETURN_SUCCESS) { return RETURN_FAILURE; } else { return set_graph_hidden(gno, FALSE); } } void set_graph_framep(int gno, framep * f) { if (is_valid_gno(gno) != TRUE) { return; } memcpy(&g[gno].f, f, sizeof(framep)); set_dirtystate(); } void set_graph_locator(int gno, GLocator *locator) { if (is_valid_gno(gno) != TRUE) { return; } memcpy(&g[gno].locator, locator, sizeof(GLocator)); set_dirtystate(); } void set_graph_world(int gno, world w) { if (is_valid_gno(gno) != TRUE) { return; } g[gno].w = w; set_dirtystate(); } void set_graph_viewport(int gno, view v) { if (is_valid_gno(gno) != TRUE) { return; } g[gno].v = v; set_dirtystate(); } void set_graph_labels(int gno, labels *labs) { if (is_valid_gno(gno) != TRUE) { return; } xfree(g[gno].labs.title.s); xfree(g[gno].labs.stitle.s); memcpy(&g[gno].labs, labs, sizeof(labels)); g[gno].labs.title.s = copy_string(NULL, labs->title.s); g[gno].labs.stitle.s = copy_string(NULL, labs->stitle.s); set_dirtystate(); } void set_graph_plotarr(int gno, int i, plotarr * p) { if (is_valid_gno(gno) != TRUE) { return; } memcpy(&g[gno].p[i], p, sizeof(plotarr)); set_dirtystate(); } void set_graph_legend(int gno, legend *leg) { if (is_valid_gno(gno) != TRUE) { return; } memcpy(&g[gno].l, leg, sizeof(legend)); set_dirtystate(); } void set_graph_legend_active(int gno, int flag) { if (is_valid_gno(gno) != TRUE) { return; } g[gno].l.active = flag; set_dirtystate(); } /* * Count the number of active sets in graph gno */ int nactive(int gno) { int i, cnt = 0; for (i = 0; i < number_of_sets(gno); i++) { if (is_set_active(gno, i)) { cnt++; } } return cnt; } int select_graph(int gno) { int retval; if (set_parser_gno(gno) == RETURN_SUCCESS) { cg = gno; retval = definewindow(g[gno].w, g[gno].v, g[gno].type, g[gno].xscale, g[gno].yscale, g[gno].xinvert, g[gno].yinvert); } else { retval = RETURN_FAILURE; } return retval; } int realloc_graphs(int n) { int j; graph *gtmp; if (n <= 0) { return RETURN_FAILURE; } gtmp = xrealloc(g, n*sizeof(graph)); if (gtmp == NULL) { return RETURN_FAILURE; } else { g = gtmp; for (j = maxgraph; j < n; j++) { set_default_graph(j); } maxgraph = n; return RETURN_SUCCESS; } } int realloc_graph_plots(int gno, int n) { int oldmaxplot, j; plotarr *ptmp; int c, bg; if (is_valid_gno(gno) != TRUE) { return RETURN_FAILURE; } if (n < 0) { return RETURN_FAILURE; } if (n == g[gno].maxplot) { return RETURN_SUCCESS; } ptmp = xrealloc(g[gno].p, n * sizeof(plotarr)); if (ptmp == NULL && n != 0) { return RETURN_FAILURE; } else { oldmaxplot = g[gno].maxplot; g[gno].p = ptmp; g[gno].maxplot = n; bg = getbgcolor(); c = oldmaxplot + 1; for (j = oldmaxplot; j < n; j++) { set_default_plotarr(&g[gno].p[j]); while (c == bg || get_colortype(c) != COLOR_MAIN) { c++; c %= number_of_colors(); } set_set_colors(gno, j, c); c++; } return RETURN_SUCCESS; } } int set_graph_type(int gno, int gtype) { if (is_valid_gno(gno) == TRUE) { if (g[gno].type == gtype) { return RETURN_SUCCESS; } switch (gtype) { case GRAPH_XY: case GRAPH_CHART: case GRAPH_FIXED: case GRAPH_PIE: break; case GRAPH_POLAR: g[gno].w.xg1 = 0.0; g[gno].w.xg2 = 2*M_PI; g[gno].w.yg1 = 0.0; g[gno].w.yg2 = 1.0; break; case GRAPH_SMITH: g[gno].w.xg1 = -1.0; g[gno].w.xg2 = 1.0; g[gno].w.yg1 = -1.0; g[gno].w.yg2 = 1.0; break; default: errmsg("Internal error in set_graph_type()"); return RETURN_FAILURE; } g[gno].type = gtype; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int is_graph_hidden(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].hidden; } else { return TRUE; } } int set_graph_hidden(int gno, int flag) { if (is_valid_gno(gno) == TRUE) { g[gno].hidden = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int set_graph_stacked(int gno, int flag) { if (is_valid_gno(gno) == TRUE) { g[gno].stacked = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int is_graph_stacked(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].stacked; } else { return FALSE; } } double get_graph_bargap(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].bargap; } else { return 0.0; } } int set_graph_bargap(int gno, double bargap) { if (is_valid_gno(gno) == TRUE) { g[gno].bargap = bargap; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int get_graph_type(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].type; } else { return -1; } } int is_refpoint_active(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].locator.pointset; } else { return FALSE; } } int get_graph_xscale(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].xscale; } else { return -1; } } int get_graph_yscale(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].yscale; } else { return -1; } } int set_graph_xscale(int gno, int scale) { if (is_valid_gno(gno) == TRUE) { if (g[gno].xscale != scale) { int naxis; g[gno].xscale = scale; for (naxis = 0; naxis < MAXAXES; naxis++) { if (is_xaxis(naxis)) { tickmarks *t; t = get_graph_tickmarks(gno, naxis); if (t) { if (scale == SCALE_LOG) { if (g[gno].w.xg2 <= 0.0) { g[gno].w.xg2 = 10.0; } if (g[gno].w.xg1 <= 0.0) { g[gno].w.xg1 = g[gno].w.xg2/1.0e3; } t->tmajor = 10.0; t->nminor = 9; } else { t->nminor = 1; } } } } set_dirtystate(); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int set_graph_yscale(int gno, int scale) { if (is_valid_gno(gno) == TRUE) { if (g[gno].yscale != scale) { int naxis; g[gno].yscale = scale; for (naxis = 0; naxis < MAXAXES; naxis++) { if (is_yaxis(naxis)) { tickmarks *t; t = get_graph_tickmarks(gno, naxis); if (t) { if (scale == SCALE_LOG) { if (g[gno].w.yg2 <= 0.0) { g[gno].w.yg2 = 10.0; } if (g[gno].w.yg1 <= 0.0) { g[gno].w.yg1 = g[gno].w.yg2/1.0e3; } t->tmajor = 10.0; t->nminor = 9; } else { t->nminor = 1; } } } } set_dirtystate(); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int set_graph_znorm(int gno, double norm) { if (is_valid_gno(gno) == TRUE) { g[gno].znorm = norm; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } double get_graph_znorm(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].znorm; } else { return 0.0; } } int is_graph_xinvert(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].xinvert; } else { return FALSE; } } int is_graph_yinvert(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].yinvert; } else { return FALSE; } } int set_graph_xinvert(int gno, int flag) { if (is_valid_gno(gno) == TRUE) { g[gno].xinvert = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int set_graph_yinvert(int gno, int flag) { if (is_valid_gno(gno) == TRUE) { g[gno].yinvert = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int is_axis_active(int gno, int axis) { if (is_valid_axis(gno, axis) == TRUE) { return g[gno].t[axis]->active; } else { return FALSE; } } int is_zero_axis(int gno, int axis) { if (is_valid_axis(gno, axis) == TRUE) { return g[gno].t[axis]->zero; } else { return FALSE; } } int islogx(int gno) { if (is_valid_gno(gno) == TRUE) { return (g[gno].xscale == SCALE_LOG); } else { return FALSE; } } int islogy(int gno) { if (is_valid_gno(gno) == TRUE) { return (g[gno].yscale == SCALE_LOG); } else { return FALSE; } } int islogitx(int gno) { if (is_valid_gno(gno) == TRUE) { return (g[gno].xscale == SCALE_LOGIT); } else { return FALSE; } } int islogity(int gno) { if (is_valid_gno(gno) == TRUE) { return (g[gno].yscale == SCALE_LOGIT); } else { return FALSE; } } /* * Stack manipulation functions */ void clear_world_stack(void) { if (is_valid_gno(cg) != TRUE) { return; } g[cg].ws_top = 1; g[cg].curw = 0; g[cg].ws[0].w.xg1 = 0.0; g[cg].ws[0].w.xg2 = 0.0; g[cg].ws[0].w.yg1 = 0.0; g[cg].ws[0].w.yg2 = 0.0; } static void update_world_stack() { if (is_valid_gno(cg) != TRUE) { return; } g[cg].ws[g[cg].curw].w = g[cg].w; } /* Add a world window to the stack * If there are other windows, simply add this one to the bottom of the stack * Otherwise, replace the first window with the new window */ void add_world(int gno, double x1, double x2, double y1, double y2) { if (is_valid_gno(gno) != TRUE) { return; } /* see if another entry has been stacked */ if( g[gno].ws[0].w.xg1 == 0.0 && g[gno].ws[0].w.xg2 == 0.0 && g[gno].ws[0].w.yg1 == 0.0 && g[gno].ws[0].w.yg2 == 0.0 ) { g[gno].ws_top = 0; } if (g[gno].ws_top < MAX_ZOOM_STACK) { g[gno].ws[g[gno].ws_top].w.xg1 = x1; g[gno].ws[g[gno].ws_top].w.xg2 = x2; g[gno].ws[g[gno].ws_top].w.yg1 = y1; g[gno].ws[g[gno].ws_top].w.yg2 = y2; g[gno].ws_top++; } else { errmsg("World stack full"); } } void cycle_world_stack(void) { int neww; if (is_valid_gno(cg) != TRUE) { return; } if (g[cg].ws_top < 1) { errmsg("World stack empty"); } else { update_world_stack(); neww = (g[cg].curw + 1) % g[cg].ws_top; show_world_stack(neww); } } void show_world_stack(int n) { if (is_valid_gno(cg) != TRUE) { return; } if (g[cg].ws_top < 1) { errmsg("World stack empty"); } else { if (n >= g[cg].ws_top) { errmsg("Selected view greater than stack depth"); } else if (n < 0) { errmsg("Selected view less than zero"); } else { g[cg].curw = n; g[cg].w = g[cg].ws[n].w; } } } void push_world(void) { int i; if (is_valid_gno(cg) != TRUE) { return; } if (g[cg].ws_top < MAX_ZOOM_STACK) { update_world_stack(); for( i=g[cg].ws_top; i>g[cg].curw; i-- ) { g[cg].ws[i] = g[cg].ws[i-1]; } g[cg].ws_top++; } else { errmsg("World stack full"); } } /* modified to actually pop the current world view off the stack */ void pop_world(void) { int i, neww; if (is_valid_gno(cg) != TRUE) { return; } if (g[cg].ws_top <= 1) { errmsg("World stack empty"); } else { if (g[cg].curw != g[cg].ws_top - 1) { for (i = g[cg].curw; i < g[cg].ws_top; i++) { g[cg].ws[i] = g[cg].ws[i + 1]; } neww = g[cg].curw; } else { neww = g[cg].curw - 1; } g[cg].ws_top--; show_world_stack(neww); } } void set_default_graph(int gno) { int i; g[gno].hidden = TRUE; g[gno].type = GRAPH_XY; g[gno].xinvert = FALSE; g[gno].yinvert = FALSE; g[gno].xyflip = FALSE; g[gno].stacked = FALSE; g[gno].bargap = 0.0; g[gno].znorm = 1.0; g[gno].xscale = SCALE_NORMAL; g[gno].yscale = SCALE_NORMAL; g[gno].ws_top = 1; g[gno].ws[0].w.xg1=g[gno].ws[0].w.xg2=g[gno].ws[0].w.yg1=g[gno].ws[0].w.yg2=0; g[gno].curw = 0; g[gno].locator.dsx = g[gno].locator.dsy = 0.0; /* locator props */ g[gno].locator.pointset = FALSE; g[gno].locator.pt_type = 0; g[gno].locator.fx = FORMAT_GENERAL; g[gno].locator.fy = FORMAT_GENERAL; g[gno].locator.px = 6; g[gno].locator.py = 6; for (i = 0; i < MAXAXES; i++) { g[gno].t[i] = new_graph_tickmarks(); switch (i) { case X_AXIS: case Y_AXIS: g[gno].t[i]->active = TRUE; break; case ZX_AXIS: case ZY_AXIS: g[gno].t[i]->active = FALSE; break; } } set_default_framep(&g[gno].f); set_default_world(&g[gno].w); set_default_view(&g[gno].v); set_default_legend(gno, &g[gno].l); set_default_string(&g[gno].labs.title); g[gno].labs.title.charsize = 1.5; set_default_string(&g[gno].labs.stitle); g[gno].labs.stitle.charsize = 1.0; g[gno].maxplot = 0; g[gno].p = NULL; } int is_valid_setno(int gno, int setno) { if (is_valid_gno(gno) == TRUE && setno >= 0 && setno < g[gno].maxplot) { return TRUE; } else { return FALSE; } } int is_set_hidden(int gno, int setno) { if (is_valid_setno(gno, setno) == TRUE) { return g[gno].p[setno].hidden; } else { return FALSE; } } int set_set_hidden(int gno, int setno, int flag) { if (is_valid_setno(gno, setno) == TRUE) { g[gno].p[setno].hidden = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int number_of_sets(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].maxplot; } else { return -1; } } int graph_world_stack_size(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].ws_top; } else { return -1; } } int get_world_stack_current(int gno) { if (is_valid_gno(gno) == TRUE) { return g[gno].curw; } else { return -1; } } int get_world_stack_entry(int gno, int n, world_stack *ws) { if (is_valid_gno(gno) == TRUE) { memcpy(ws, &g[gno].ws[n], sizeof(world_stack)); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int activate_tick_labels(int gno, int axis, int flag) { if (is_valid_axis(gno, axis) == TRUE) { g[gno].t[axis]->tl_flag = flag; set_dirtystate(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int set_set_colors(int gno, int setno, int color) { if (is_valid_setno(gno, setno) != TRUE) { return RETURN_FAILURE; } if (color >= number_of_colors() || color < 0) { return RETURN_FAILURE; } g[gno].p[setno].linepen.color = color; g[gno].p[setno].sympen.color = color; g[gno].p[setno].symfillpen.color = color; g[gno].p[setno].errbar.pen.color = color; set_dirtystate(); return RETURN_SUCCESS; } static int project_version; int get_project_version(void) { return project_version; } int set_project_version(int version) { if (version > bi_version_id()) { project_version = bi_version_id(); return RETURN_FAILURE; } else { project_version = version; return RETURN_SUCCESS; } } void reset_project_version(void) { project_version = bi_version_id(); } static char *project_description = NULL; void set_project_description(char *descr) { project_description = copy_string(project_description, descr); set_dirtystate(); } char *get_project_description(void) { return project_description; } extern plotstr *pstr; void postprocess_project(int version) { int gno, setno, naxis, strno; double ext_x, ext_y; if (version >= bi_version_id()) { return; } if (version < 40005) { set_page_dimensions(792, 612, FALSE); } if (get_project_version() < 50002) { setbgfill(TRUE); } if (get_project_version() < 50003) { allow_two_digits_years(TRUE); set_wrap_year(1900); } if (version <= 40102) { #ifndef NONE_GUI set_pagelayout(PAGE_FIXED); #endif get_page_viewport(&ext_x, &ext_y); rescale_viewport(ext_x, ext_y); } for (gno = 0; gno < number_of_graphs(); gno++) { if (version <= 40102) { g[gno].l.vgap -= 1; } for (setno = 0; setno < number_of_sets(gno); setno++) { if (version < 50000) { switch (g[gno].p[setno].sym) { case SYM_NONE: break; case SYM_DOT_OBS: g[gno].p[setno].sym = SYM_CIRCLE; g[gno].p[setno].symsize = 0.0; g[gno].p[setno].symlines = 0; g[gno].p[setno].symfillpen.pattern = 1; break; default: g[gno].p[setno].sym--; break; } } if ((version < 40004 && g[gno].type != GRAPH_CHART) || g[gno].p[setno].sympen.color == -1) { g[gno].p[setno].sympen.color = g[gno].p[setno].linepen.color; } if (version < 40200 || g[gno].p[setno].symfillpen.color == -1) { g[gno].p[setno].symfillpen.color = g[gno].p[setno].sympen.color; } if (version <= 40102 && g[gno].type == GRAPH_CHART) { set_dataset_type(gno, setno, SET_BAR); g[gno].p[setno].sympen = g[gno].p[setno].linepen; g[gno].p[setno].symlines = g[gno].p[setno].lines; g[gno].p[setno].symlinew = g[gno].p[setno].linew; g[gno].p[setno].lines = 0; g[gno].p[setno].symfillpen = g[gno].p[setno].setfillpen; g[gno].p[setno].setfillpen.pattern = 0; } if (version <= 40102 && g[gno].p[setno].type == SET_XYHILO) { g[gno].p[setno].symlinew = g[gno].p[setno].linew; } if (version <= 50112 && g[gno].p[setno].type == SET_XYHILO) { g[gno].p[setno].avalue.active = FALSE; } if (version < 50100 && g[gno].p[setno].type == SET_BOXPLOT) { g[gno].p[setno].symlinew = g[gno].p[setno].linew; g[gno].p[setno].symlines = g[gno].p[setno].lines; g[gno].p[setno].symsize = 2.0; g[gno].p[setno].errbar.riser_linew = g[gno].p[setno].linew; g[gno].p[setno].errbar.riser_lines = g[gno].p[setno].lines; g[gno].p[setno].lines = 0; g[gno].p[setno].errbar.barsize = 0.0; } if (version < 50003) { g[gno].p[setno].errbar.active = TRUE; g[gno].p[setno].errbar.pen.color = g[gno].p[setno].sympen.color; g[gno].p[setno].errbar.pen.pattern = 1; switch (g[gno].p[setno].errbar.ptype) { case PLACEMENT_NORMAL: g[gno].p[setno].errbar.ptype = PLACEMENT_OPPOSITE; break; case PLACEMENT_OPPOSITE: g[gno].p[setno].errbar.ptype = PLACEMENT_NORMAL; break; case PLACEMENT_BOTH: switch (g[gno].p[setno].type) { case SET_XYDXDX: case SET_XYDYDY: case SET_BARDYDY: g[gno].p[setno].errbar.ptype = PLACEMENT_NORMAL; break; } break; } } if (version < 50002) { g[gno].p[setno].errbar.barsize *= 2; } if (version < 50105) { /* Starting with 5.1.5, X axis min & inverting is honored in pie charts */ if (get_graph_type(gno) == GRAPH_PIE) { world w; get_graph_world(gno, &w); w.xg1 = 0.0; w.xg2 = 2*M_PI; set_graph_world(gno, w); set_graph_xinvert(gno, FALSE); } } if (version < 50107) { /* Starting with 5.1.7, symskip is honored for all set types */ switch (g[gno].p[setno].type) { case SET_BAR: case SET_BARDY: case SET_BARDYDY: case SET_XYHILO: case SET_XYR: case SET_XYVMAP: case SET_BOXPLOT: g[gno].p[setno].symskip = 0; break; } } } for (naxis = 0; naxis < MAXAXES; naxis++) { tickmarks *t = get_graph_tickmarks(gno, naxis); if (!t) { continue; } if (version <= 40102) { if ( (is_xaxis(naxis) && g[gno].xscale == SCALE_LOG) || (!is_xaxis(naxis) && g[gno].yscale == SCALE_LOG) ) { t->tmajor = pow(10.0, t->tmajor); } /* TODO : world/view translation */ t->offsx = 0.0; t->offsy = 0.0; } if (version < 50000) { /* There was no label_op in Xmgr */ t->label_op = t->tl_op; /* in xmgr, axis label placement was in x,y coordinates */ /* in Grace, it's parallel/perpendicular */ if(!is_xaxis(naxis)) { fswap(&t->label.x, &t->label.y); } t->label.y *= -1; } if (version >= 50000 && version < 50103) { /* Autoplacement of axis labels wasn't implemented in early versions of Grace */ if (t->label_place == TYPE_AUTO) { t->label.x = 0.0; t->label.y = 0.08; t->label_place = TYPE_SPEC; } } } } if (version >= 40200 && version <= 50005) { /* BBox type justification was erroneously set */ for (strno = 0; strno < number_of_strings(); strno++) { pstr[strno].just |= JUST_MIDDLE; } } } grace-5.1.23/src/hotwin.c0000644000076500001440000001624610071615561014706 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * hot links * */ #include #include #include #include #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "parser.h" #include "motifinc.h" #include "protos.h" static Widget hotlink_frame = (Widget) NULL; static SetChoiceItem hotlink_set_item; static Widget hotlink_list_item; static Widget hotlink_file_item; static Widget *hotlink_source_item; void create_hotfiles_popup(Widget w, XtPointer client_data, XtPointer call_data); /* * establish hotlinks by associating a set with a column in a file * or the stdout of a process */ static void do_hotlink_proc(Widget w, XtPointer client_data, XtPointer call_data) { int i, numset, src, *sets; char fname[256]; char buf[256]; XmString xms; set_wait_cursor(); numset = GetSelectedSets(hotlink_set_item, &sets); src = GetChoice(hotlink_source_item); strcpy(fname, xv_getstr(hotlink_file_item)); if (numset == SET_SELECT_ERROR) { errwin("No set selected"); unset_wait_cursor(); return; } if (fname[0] == '\0') { errwin("No source selected"); unset_wait_cursor(); return; } for( i=0; i %s -> %s", get_cg(), sets[i], src==0 ? "DISK" : "PIPE", fname ); else sprintf(buf, "G%d.S%d -> %s -> %s:%d", get_cg(), sets[i], src == 0 ? "DISK" : "PIPE", fname, i+1); xms = XmStringCreateLocalized(buf); XmListAddItemUnselected(hotlink_list_item, xms, 0); XmStringFree(xms); set_hotlink(get_cg(), sets[i], i+1, fname, src==0?SOURCE_DISK:SOURCE_PIPE); if( numset == 1 ) setcomment( get_cg(), sets[i], fname ); else { sprintf( buf, "%s:%d", fname, i+1 ); setcomment( get_cg(), sets[i], buf ); } } unset_wait_cursor(); } /* * unlink sets */ static void do_hotunlink_proc(Widget w, XtPointer client_data, XtPointer call_data) { XmString *s, cs; int cnt, setno; char *cstr; set_wait_cursor(); XtVaGetValues(hotlink_list_item, XmNselectedItemCount, &cnt, XmNselectedItems, &s, NULL); if( cnt ) { for( ; cnt; cnt-- ) { cs = XmStringCopy(s[cnt-1]); if ((cstr = GetStringSimple(cs))) { sscanf(cstr, "G%*d.S%d", &setno); if (setno >= 0 && setno < number_of_sets(get_cg())) { set_hotlink(get_cg(), setno, FALSE, NULL, 0); } } XmStringFree(cs); XtFree(cstr); } update_hotlinks(); } unset_wait_cursor(); } /* * update hot links displayed in scrolled list */ void update_hotlinks(void) { int j; char buf[256]; XmString xms; if (hotlink_frame != NULL) { set_wait_cursor(); XmListDeleteAllItems(hotlink_list_item); for (j = 0; j < number_of_sets(get_cg()); j++) { if (is_hotlinked(get_cg(), j)) { sprintf(buf, "G%d.S%d -> %s -> %s:%d", get_cg(), j, get_hotlink_src(get_cg(), j) == SOURCE_DISK ? "DISK" : "PIPE", get_hotlink_file(get_cg(), j), is_hotlinked(get_cg(),j) ); xms = XmStringCreateLocalized(buf); XmListAddItemUnselected(hotlink_list_item, xms, 0); XmStringFree(xms); } } unset_wait_cursor(); } } /* * update the sets in the current graph */ void do_hotupdate_proc(void *data) { int gno, setno; set_wait_cursor(); /* do links */ for (gno = 0; gno < number_of_graphs(); gno++) { for (setno = 0; setno < number_of_sets(gno); setno++) { do_update_hotlink(gno, setno); } } unset_wait_cursor(); xdrawgraph(); } /* * create the big hot links widget */ void create_hotlinks_popup(void *data) { static Widget top, dialog; Arg args[3]; set_wait_cursor(); if (top == NULL) { char *label1[5]; Widget but1[5]; label1[0] = "Link"; label1[1] = "Files..."; label1[2] = "Unlink"; label1[3] = "Update"; label1[4] = "Close"; top = XmCreateDialogShell(app_shell, "Hot links", NULL, 0); handle_close(top); dialog = XmCreateRowColumn(top, "dialog_rc", NULL, 0); XtSetArg(args[0], XmNlistSizePolicy, XmRESIZE_IF_POSSIBLE); XtSetArg(args[1], XmNvisibleItemCount, 5); XtSetArg(args[2], XmNselectionPolicy, XmEXTENDED_SELECT ); hotlink_list_item = XmCreateScrolledList(dialog, "list", args, 3); ManageChild(hotlink_list_item); hotlink_set_item = CreateSetSelector(dialog, "Link set:", SET_SELECT_ACTIVE, FILTER_SELECT_ALL, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); hotlink_file_item = CreateTextItem2(dialog, 30, "To file or SOURCE_PIPE:"); hotlink_source_item = CreatePanelChoice(dialog, "Source: ", 3, "Disk file", "Pipe", NULL); CreateSeparator(dialog); CreateCommandButtons(dialog, 5, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_hotlink_proc, (XtPointer) NULL); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) create_hotfiles_popup, (XtPointer) NULL); XtAddCallback(but1[2], XmNactivateCallback, (XtCallbackProc) do_hotunlink_proc, (XtPointer) NULL); XtAddCallback(but1[3], XmNactivateCallback, (XtCallbackProc) do_hotupdate_proc, (XtPointer) NULL); XtAddCallback(but1[4], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) top); ManageChild(dialog); hotlink_frame = top; } RaiseWindow(top); update_hotlinks(); unset_wait_cursor(); } /* * callback for the file selection widget * this routine copies the selected file into the text widget on the main * hot links widget */ static int do_hotlinkfile_proc(char *filename, void *data) { xv_setstr(hotlink_file_item, filename); return TRUE; } /* * create file selection pop up to choose the file to hot link */ void create_hotfiles_popup(Widget w, XtPointer client_data, XtPointer call_data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Select hot link file"); AddFileSelectionBoxCB(fsb, do_hotlinkfile_proc, NULL); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } grace-5.1.23/src/printwin.c0000644000076500001440000004542110071615562015246 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Page/Device setup */ #include #include #include "cmath.h" #include "globals.h" #include "device.h" #include "utils.h" #include "graphutils.h" #include "plotone.h" #include "motifinc.h" #include "protos.h" extern char print_file[]; static int current_page_units = 0; static Widget psetup_frame; static Widget psetup_rc; static Widget device_opts_item; static Widget printto_item; static Widget print_string_item; static Widget rc_filesel; static Widget printfile_item; static Widget pdev_rc; static OptionStructure *devices_item; static Widget output_frame; static OptionStructure *page_orient_item; static OptionStructure *page_format_item; static Widget page_x_item; static Widget page_y_item; static OptionStructure *page_size_unit_item; static Widget dev_res_item; static Widget fontaa_item; static Widget devfont_item; static Widget dsync_item, psync_item; static void do_pr_toggle(int onoff, void *data); static void do_format_toggle(int value, void *data); static void do_orient_toggle(int value, void *data); static int set_printer_proc(void *data); void create_printfiles_popup(void *data); void create_devopts_popup(void *data); static void do_device_toggle(int value, void *data); static void do_units_toggle(int value, void *data); static void update_printer_setup(int device_id); static void update_device_setup(int device_id); static void do_print_cb(void *data); void create_printer_setup(void *data) { int device; set_wait_cursor(); if (data == NULL) { device = hdevice; } else { device = *((int *) data); } if (psetup_frame == NULL) { int i, ndev; Widget rc, rc1, fr, wbut; Widget menubar, menupane; OptionItem *option_items; psetup_frame = CreateDialogForm(app_shell, "Device setup"); SetDialogFormResizable(psetup_frame, TRUE); menubar = CreateMenuBar(psetup_frame); AddDialogFormChild(psetup_frame, menubar); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Print", 'P', do_print_cb, NULL); CreateMenuSeparator(menupane); CreateMenuCloseButton(menupane, psetup_frame); menupane = CreateMenu(menubar, "Options", 'O', FALSE); dsync_item = CreateMenuToggle(menupane, "Sync page size of all devices", 'S', NULL, NULL); SetToggleButtonState(dsync_item, TRUE); psync_item = CreateMenuToggle(menupane, "Rescale plot on page size change", 'R', NULL, NULL); SetToggleButtonState(psync_item, FALSE); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On device setup", 'd', psetup_frame, "doc/UsersGuide.html#print-setup"); ManageChild(menubar); psetup_rc = CreateVContainer(psetup_frame); fr = CreateFrame(psetup_rc, "Device setup"); rc1 = CreateVContainer(fr); pdev_rc = CreateHContainer(rc1); ndev = number_of_devices(); option_items = xmalloc(ndev*sizeof(OptionItem)); for (i = 0; i < ndev; i++) { option_items[i].value = i; option_items[i].label = get_device_name(i); } devices_item = CreateOptionChoice(pdev_rc, "Device: ", 1, ndev, option_items); AddOptionChoiceCB(devices_item, do_device_toggle, NULL); xfree(option_items); device_opts_item = CreateButton(pdev_rc, "Device options..."); AddButtonCB(device_opts_item, create_devopts_popup, NULL); output_frame = CreateFrame(psetup_rc, "Output"); rc1 = CreateVContainer(output_frame); printto_item = CreateToggleButton(rc1, "Print to file"); AddToggleButtonCB(printto_item, do_pr_toggle, NULL); print_string_item = CreateTextItem2(rc1, 25, "Print command:"); rc_filesel = CreateHContainer(rc1); printfile_item = CreateTextItem2(rc_filesel, 20, "File name:"); wbut = CreateButton(rc_filesel, "Browse..."); AddButtonCB(wbut, create_printfiles_popup, NULL); fr = CreateFrame(psetup_rc, "Page"); rc1 = CreateVContainer(fr); rc = CreateHContainer(rc1); option_items = xmalloc(2*sizeof(OptionItem)); option_items[0].value = PAGE_ORIENT_LANDSCAPE; option_items[0].label = "Landscape"; option_items[1].value = PAGE_ORIENT_PORTRAIT; option_items[1].label = "Portrait"; page_orient_item = CreateOptionChoice(rc, "Orientation: ", 1, 2, option_items); AddOptionChoiceCB(page_orient_item, do_orient_toggle, NULL); xfree(option_items); option_items = xmalloc(3*sizeof(OptionItem)); option_items[0].value = PAGE_FORMAT_CUSTOM; option_items[0].label = "Custom"; option_items[1].value = PAGE_FORMAT_USLETTER; option_items[1].label = "Letter"; option_items[2].value = PAGE_FORMAT_A4; option_items[2].label = "A4"; page_format_item = CreateOptionChoice(rc, "Size: ", 1, 3, option_items); AddOptionChoiceCB(page_format_item, do_format_toggle, NULL); xfree(option_items); rc = CreateHContainer(rc1); page_x_item = CreateTextItem2(rc, 7, "Dimensions:"); page_y_item = CreateTextItem2(rc, 7, "x "); option_items = xmalloc(3*sizeof(OptionItem)); option_items[0].value = 0; option_items[0].label = "pix"; option_items[1].value = 1; option_items[1].label = "in"; option_items[2].value = 2; option_items[2].label = "cm"; page_size_unit_item = CreateOptionChoice(rc, " ", 1, 3, option_items); AddOptionChoiceCB(page_size_unit_item, do_units_toggle, NULL); xfree(option_items); SetOptionChoice(page_size_unit_item, current_page_units); dev_res_item = CreateTextItem2(rc1, 4, "Resolution (dpi):"); fr = CreateFrame(psetup_rc, "Fonts"); rc1 = CreateVContainer(fr); fontaa_item = CreateToggleButton(rc1, "Enable font antialiasing"); devfont_item = CreateToggleButton(rc1, "Use device fonts"); CreateAACDialog(psetup_frame, psetup_rc, set_printer_proc, NULL); } update_printer_setup(device); RaiseWindow(GetParent(psetup_frame)); unset_wait_cursor(); } static void update_printer_setup(int device_id) { if (psetup_frame) { SetOptionChoice(devices_item, device_id); update_device_setup(device_id); } } static void update_device_setup(int device_id) { char buf[GR_MAXPATHLEN], *bufptr; int page_units; double page_x, page_y; PageFormat pf; Page_geometry pg; Device_entry dev; if (psetup_frame) { dev = get_device_props(device_id); pg = dev.pg; if (dev.setup == NULL) { SetSensitive(device_opts_item, False); } else { SetSensitive(device_opts_item, True); } if (print_file == NULL || print_file[0] == '\0') { strcpy(print_file, mybasename(get_docname())); } /* Replace existing filename extension */ bufptr = strrchr(print_file, '.'); if (bufptr) { *(bufptr + 1) = '\0'; } else { strcat(print_file, "."); } strcat(print_file, dev.fext); xv_setstr(printfile_item, print_file); xv_setstr(print_string_item, get_print_cmd()); switch (dev.type) { case DEVICE_TERM: UnmanageChild(output_frame); break; case DEVICE_FILE: ManageChild(output_frame); SetToggleButtonState(printto_item, TRUE); SetSensitive(printto_item, False); SetSensitive(GetParent(print_string_item), False); SetSensitive(rc_filesel, True); break; case DEVICE_PRINT: ManageChild(output_frame); SetToggleButtonState(printto_item, get_ptofile()); SetSensitive(printto_item, True); if (get_ptofile() == TRUE) { SetSensitive(rc_filesel, True); SetSensitive(GetParent(print_string_item), False); } else { SetSensitive(rc_filesel, False); SetSensitive(GetParent(print_string_item), True); } break; } SetOptionChoice(page_orient_item, pg.width < pg.height ? PAGE_ORIENT_PORTRAIT : PAGE_ORIENT_LANDSCAPE); pf = get_page_format(device_id); SetOptionChoice(page_format_item, pf); if (pf == PAGE_FORMAT_CUSTOM) { SetSensitive(page_x_item, True); SetSensitive(page_y_item, True); SetSensitive(page_orient_item->menu, False); } else { SetSensitive(page_x_item, False); SetSensitive(page_y_item, False); SetSensitive(page_orient_item->menu, True); } sprintf (buf, "%.0f", pg.dpi); xv_setstr(dev_res_item, buf); page_units = GetOptionChoice(page_size_unit_item); switch (page_units) { case 0: /* pixels */ page_x = (float) pg.width; page_y = (float) pg.height; break; case 1: /* inches */ page_x = (float) pg.width / pg.dpi; page_y = (float) pg.height / pg.dpi; break; case 2: /* cm */ page_x = (float) CM_PER_INCH * pg.width / pg.dpi; page_y = (float) CM_PER_INCH * pg.height / pg.dpi; break; default: errmsg("Internal error"); return; } sprintf (buf, "%.2f", page_x); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", page_y); xv_setstr(page_y_item, buf); SetToggleButtonState(fontaa_item, dev.fontaa); SetToggleButtonState(devfont_item, dev.devfonts); } } static int set_printer_proc(void *data) { int seldevice; double page_x, page_y; double dpi; int page_units; Device_entry dev; Page_geometry pg; int do_redraw = FALSE; seldevice = GetOptionChoice(devices_item); dev = get_device_props(seldevice); if (dev.type != DEVICE_TERM) { hdevice = seldevice; set_ptofile(GetToggleButtonState(printto_item)); if (get_ptofile()) { strcpy(print_file, xv_getstr(printfile_item)); } else { set_print_cmd(xv_getstr(print_string_item)); } } dev.devfonts = GetToggleButtonState(devfont_item); dev.fontaa = GetToggleButtonState(fontaa_item); if (xv_evalexpr(page_x_item, &page_x) != RETURN_SUCCESS || xv_evalexpr(page_y_item, &page_y) != RETURN_SUCCESS ) { errmsg("Invalid page dimension(s)"); return RETURN_FAILURE; } if (xv_evalexpr(dev_res_item, &dpi) != RETURN_SUCCESS || dpi <= 0.0) { errmsg("Invalid dpi"); return RETURN_FAILURE; } page_units = GetOptionChoice(page_size_unit_item); switch (page_units) { case 0: pg.width = (long) page_x; pg.height = (long) page_y; break; case 1: pg.width = (long) (page_x * dpi); pg.height = (long) (page_y * dpi); break; case 2: pg.width = (long) (page_x * dpi / CM_PER_INCH); pg.height = (long) (page_y * dpi / CM_PER_INCH); break; default: errmsg("Internal error"); return RETURN_FAILURE; } pg.dpi = dpi; if (GetToggleButtonState(dsync_item) == TRUE) { set_page_dimensions((int) rint(72.0*pg.width/pg.dpi), (int) rint(72.0*pg.height/pg.dpi), GetToggleButtonState(psync_item) == TRUE); do_redraw = TRUE; } dev.pg = pg; if (set_device_props(seldevice, dev) != RETURN_SUCCESS) { errmsg("Invalid page dimensions or DPI"); return RETURN_FAILURE; } if (seldevice == tdevice) { do_redraw = TRUE; } if (do_redraw) { drawgraph(); } return RETURN_SUCCESS; } /* * set the print options */ static void do_device_toggle(int value, void *data) { update_device_setup(value); } static void do_pr_toggle(int onoff, void *data) { if (onoff == TRUE) { SetSensitive(rc_filesel, True); SetSensitive(GetParent(print_string_item), False); } else { SetSensitive(rc_filesel, False); SetSensitive(GetParent(print_string_item), True); } } static void do_format_toggle(int value, void *data) { int orientation; int x, y; double px, py; int page_units; double dpi; char buf[32]; if (value == PAGE_FORMAT_CUSTOM) { SetSensitive(page_x_item, True); SetSensitive(page_y_item, True); SetSensitive(page_orient_item->menu, False); } else { SetSensitive(page_x_item, False); SetSensitive(page_y_item, False); SetSensitive(page_orient_item->menu, True); } switch (value) { case PAGE_FORMAT_USLETTER: x = 612; y = 792; break; case PAGE_FORMAT_A4: x = 595; y = 842; break; case PAGE_FORMAT_CUSTOM: default: return; } page_units = GetOptionChoice(page_size_unit_item); switch (page_units) { case 0: /* pixels */ if (xv_evalexpr(dev_res_item, &dpi) != RETURN_SUCCESS) { errmsg("Invalid dpi"); return; } px = (float) x*dpi/72.0; py = (float) y*dpi/72.0; break; case 1: /* inches */ px = (float) x/72.0; py = (float) y/72.0; break; case 2: /* cm */ px = (float) x/72.0*CM_PER_INCH; py = (float) y/72.0*CM_PER_INCH; break; default: errmsg("Internal error"); return; } orientation = GetOptionChoice(page_orient_item); if ((orientation == PAGE_ORIENT_LANDSCAPE && px > py) || (orientation == PAGE_ORIENT_PORTRAIT && px < py) ) { sprintf (buf, "%.2f", px); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", py); xv_setstr(page_y_item, buf); } else { sprintf (buf, "%.2f", py); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", px); xv_setstr(page_y_item, buf); } } static void do_orient_toggle(int value, void *data) { int orientation = value; double px, py; char buf[32]; if (xv_evalexpr(page_x_item, &px) != RETURN_SUCCESS || xv_evalexpr(page_y_item, &py) != RETURN_SUCCESS ) { errmsg("Invalid page dimension(s)"); return; } if ((orientation == PAGE_ORIENT_LANDSCAPE && px > py) || (orientation == PAGE_ORIENT_PORTRAIT && px < py) ) { sprintf (buf, "%.2f", px); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", py); xv_setstr(page_y_item, buf); } else { sprintf (buf, "%.2f", py); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", px); xv_setstr(page_y_item, buf); } } static int do_prfilesel_proc(char *filename, void *data) { xv_setstr(printfile_item, filename); strcpy(print_file, filename); XtVaSetValues(printfile_item, XmNcursorPosition, strlen(filename), NULL); return TRUE; } void create_printfiles_popup(void *data) { static FSBStructure *fsb = NULL; int device; Device_entry dev; char buf[16]; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Select print file"); AddFileSelectionBoxCB(fsb, do_prfilesel_proc, NULL); ManageChild(fsb->FSB); } device = GetOptionChoice(devices_item); dev = get_device_props(device); sprintf(buf, "*.%s", dev.fext); SetFileSelectionBoxPattern(fsb, buf); RaiseWindow(fsb->dialog); unset_wait_cursor(); } void create_devopts_popup(void *data) { int device_id; Device_entry dev; device_id = GetOptionChoice(devices_item); dev = get_device_props(device_id); if (dev.setup == NULL) { /* Should never come to here */ errmsg("No options can be set for this device"); } else { (dev.setup)(); } } static void do_units_toggle(int value, void *data) { char buf[32]; double page_x, page_y; double dev_res; int page_units = value; if (xv_evalexpr(page_x_item, &page_x) != RETURN_SUCCESS || xv_evalexpr(page_y_item, &page_y) != RETURN_SUCCESS ) { errmsg("Invalid page dimension(s)"); return; } if (xv_evalexpr(dev_res_item, &dev_res) != RETURN_SUCCESS) { errmsg("Invalid device resolution(s)"); return; } if (dev_res <= 0.0) { errmsg("Device resolution(s) <= 0"); return; } if (current_page_units == page_units) { ; } else if (current_page_units == 0 && page_units == 1) { page_x /= dev_res; page_y /= dev_res; } else if (current_page_units == 0 && page_units == 2) { page_x /= (dev_res/CM_PER_INCH); page_y /= (dev_res/CM_PER_INCH); } else if (current_page_units == 1 && page_units == 0) { page_x *= dev_res; page_y *= dev_res; } else if (current_page_units == 1 && page_units == 2) { page_x *= CM_PER_INCH; page_y *= CM_PER_INCH; } else if (current_page_units == 2 && page_units == 0) { page_x *= (dev_res/CM_PER_INCH); page_y *= (dev_res/CM_PER_INCH); } else if (current_page_units == 2 && page_units == 1) { page_x /= CM_PER_INCH; page_y /= CM_PER_INCH; } else { errmsg("Internal error"); return; } current_page_units = page_units; sprintf (buf, "%.2f", page_x); xv_setstr(page_x_item, buf); sprintf (buf, "%.2f", page_y); xv_setstr(page_y_item, buf); } static void do_print_cb(void *data) { set_wait_cursor(); do_hardcopy(); unset_wait_cursor(); } grace-5.1.23/src/computils.c0000644000076500001440000012440711014373541015411 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * procedures for performing transformations from the command * line interpreter and the GUI. * */ #include #include #include #include #include #include "globals.h" #include "utils.h" #include "draw.h" #include "ssdata.h" #include "graphs.h" #include "parser.h" #include "protos.h" static void forwarddiff(double *x, double *y, double *resx, double *resy, int n); static void backwarddiff(double *x, double *y, double *resx, double *resy, int n); static void centereddiff(double *x, double *y, double *resx, double *resy, int n); int get_points_inregion(int rno, int invr, int len, double *x, double *y, int *cnt, double **xt, double **yt); static char buf[256]; void do_fourier_command(int gno, int setno, int ftype, int ltype) { switch (ftype) { case FFT_DFT: do_fourier(gno, setno, 0, 0, ltype, 0, 0, 0); break; case FFT_INVDFT : do_fourier(gno, setno, 0, 0, ltype, 1, 0, 0); break; case FFT_FFT: do_fourier(gno, setno, 1, 0, ltype, 0, 0, 0); break; case FFT_INVFFT : do_fourier(gno, setno, 1, 0, ltype, 1, 0, 0); break; } } /* * evaluate a formula */ int do_compute(int gno, int setno, int graphto, int loadto, char *rarray, char *fstr) { if (is_set_active(gno, setno)) { if (gno != graphto || setno != loadto) { if (copysetdata(gno, setno, graphto, loadto) != RETURN_SUCCESS) { return RETURN_FAILURE; } } filter_set(graphto, loadto, rarray); set_parser_setno(graphto, loadto); if (scanner(fstr) != RETURN_SUCCESS) { if (graphto != gno || loadto != setno) { killset(graphto, loadto); } return RETURN_FAILURE; } else { set_dirtystate(); return RETURN_SUCCESS; } } else { return RETURN_FAILURE; } } /* * forward, backward and centered differences */ static void forwarddiff(double *x, double *y, double *resx, double *resy, int n) { int i, eflag = 0; double h; for (i = 1; i < n; i++) { resx[i - 1] = x[i - 1]; h = x[i - 1] - x[i]; if (h == 0.0) { resy[i - 1] = - MAXNUM; eflag = 1; } else { resy[i - 1] = (y[i - 1] - y[i]) / h; } } if (eflag) { errmsg("Warning: infinite slope, check set status before proceeding"); } } static void backwarddiff(double *x, double *y, double *resx, double *resy, int n) { int i, eflag = 0; double h; for (i = 0; i < n - 1; i++) { resx[i] = x[i]; h = x[i + 1] - x[i]; if (h == 0.0) { resy[i] = - MAXNUM; eflag = 1; } else { resy[i] = (y[i + 1] - y[i]) / h; } } if (eflag) { errmsg("Warning: infinite slope, check set status before proceeding"); } } static void centereddiff(double *x, double *y, double *resx, double *resy, int n) { int i, eflag = 0; double h1, h2; for (i = 1; i < n - 1; i++) { resx[i - 1] = x[i]; h1 = x[i] - x[i - 1]; h2 = x[i + 1] - x[i]; if (h1 + h2 == 0.0) { resy[i - 1] = - MAXNUM; eflag = 1; } else { resy[i - 1] = (y[i + 1] - y[i - 1]) / (h1 + h2); } } if (eflag) { errmsg("Warning: infinite slope, check set status before proceeding"); } } static void seasonaldiff(double *x, double *y, double *resx, double *resy, int n, int period) { int i; for (i = 0; i < n - period; i++) { resx[i] = x[i]; resy[i] = y[i] - y[i + period]; } } /* * trapezoidal rule */ double trapint(double *x, double *y, double *resx, double *resy, int n) { int i; double sum = 0.0; double h; if (n < 2) { return 0.0; } if (resx != NULL) { resx[0] = x[0]; } if (resy != NULL) { resy[0] = 0.0; } for (i = 1; i < n; i++) { h = (x[i] - x[i - 1]); if (resx != NULL) { resx[i] = x[i]; } sum = sum + h * (y[i - 1] + y[i]) * 0.5; if (resy != NULL) { resy[i] = sum; } } return sum; } /* * apply a digital filter */ void do_digfilter(int set1, int set2) { int digfiltset; if (!(is_set_active(get_cg(), set1) && is_set_active(get_cg(), set2))) { errmsg("Set not active"); return; } if ((getsetlength(get_cg(), set1) < 3) || (getsetlength(get_cg(), set2) < 3)) { errmsg("Set length < 3"); return; } digfiltset = nextset(get_cg()); if (digfiltset != (-1)) { activateset(get_cg(), digfiltset); setlength(get_cg(), digfiltset, getsetlength(get_cg(), set1) - getsetlength(get_cg(), set2) + 1); sprintf(buf, "Digital filter from set %d applied to set %d", set2, set1); filterser(getsetlength(get_cg(), set1), getx(get_cg(), set1), gety(get_cg(), set1), getx(get_cg(), digfiltset), gety(get_cg(), digfiltset), gety(get_cg(), set2), getsetlength(get_cg(), set2)); setcomment(get_cg(), digfiltset, buf); } } /* * linear convolution */ void do_linearc(int gno1, int set1, int gno2, int set2) { int linearcset, i, itmp, cg = get_cg(); double *xtmp; if (!(is_set_active(gno1, set1) && is_set_active(gno2, set2))) { errmsg("Set not active"); return; } if ((getsetlength(gno1, set1) < 3) || (getsetlength(gno2, set2) < 3)) { errmsg("Set length < 3"); return; } linearcset = nextset(cg); if (linearcset != (-1)) { activateset(cg, linearcset); setlength(cg, linearcset, (itmp = getsetlength(gno1, set1) + getsetlength(gno2, set2) - 1)); linearconv(gety(gno2, set2), gety(gno1, set1), gety(cg, linearcset), getsetlength(gno2, set2), getsetlength(gno1, set1)); xtmp = getx(cg, linearcset); for (i = 0; i < itmp; i++) { xtmp[i] = i; } sprintf(buf, "Linear convolution of set %d with set %d", set1, set2); setcomment(cg, linearcset, buf); } } /* * cross correlation/covariance */ void do_xcor(int gno1, int set1, int gno2, int set2, int maxlag, int covar) { int xcorset, i, ierr, len, cg = get_cg(); double *xtmp; if (!(is_set_active(gno1, set1) && is_set_active(gno2, set2))) { errmsg("Set not active"); return; } len = getsetlength(gno1, set1); if (getsetlength(gno2, set2) != len) { errmsg("Sets must be of the same length"); } if (len < 2) { errmsg("Set length < 2"); return; } if (maxlag < 1 || maxlag > len) { errmsg("Lag incorrectly specified"); return; } xcorset = nextset(cg); if (xcorset != (-1)) { char *fname; activateset(cg, xcorset); setlength(cg, xcorset, maxlag); if (covar) { fname = "covariance"; } else { fname = "correlation"; } if (set1 != set2) { sprintf(buf, "X-%s of G%d.S%d and G%d.S%d at maximum lag %d", fname, gno1, set1, gno2, set2, maxlag); } else { sprintf(buf, "Auto-%s of G%d.S%d at maximum lag %d", fname, gno1, set1, maxlag); } ierr = crosscorr(gety(gno1, set1), gety(gno2, set2), len, maxlag, covar, gety(cg, xcorset)); xtmp = getx(cg, xcorset); for (i = 0; i < maxlag; i++) { xtmp[i] = i; } setcomment(cg, xcorset, buf); } } /* * numerical integration */ double do_int(int gno, int setno, int itype) { int intset; double sum = 0; if (!is_set_active(gno, setno)) { errmsg("Set not active"); return 0.0; } if (getsetlength(gno, setno) < 3) { errmsg("Set length < 3"); return 0.0; } if (itype == 0) { intset = nextset(gno); if (intset != (-1)) { activateset(gno, intset); setlength(gno, intset, getsetlength(gno, setno)); sprintf(buf, "Cumulative sum of set %d", setno); sum = trapint(getx(gno, setno), gety(gno, setno), getx(gno, intset), gety(gno, intset), getsetlength(gno, setno)); setcomment(gno, intset, buf); } } else { sum = trapint(getx(gno, setno), gety(gno, setno), NULL, NULL, getsetlength(gno, setno)); } return sum; } /* * difference a set * itype means * 0 - forward * 1 - backward * 2 - centered difference */ void do_differ(int gno, int setno, int itype) { int diffset; if (!is_set_active(gno, setno)) { errmsg("Set not active"); return; } if (getsetlength(gno, setno) < 3) { errmsg("Set length < 3"); return; } diffset = nextset(gno); if (diffset != (-1)) { activateset(gno, diffset); switch (itype) { case 0: sprintf(buf, "Forward difference of set %d", setno); setlength(gno, diffset, getsetlength(gno, setno) - 1); forwarddiff(getx(gno, setno), gety(gno, setno), getx(gno, diffset), gety(gno, diffset), getsetlength(gno, setno)); break; case 1: sprintf(buf, "Backward difference of set %d", setno); setlength(gno, diffset, getsetlength(gno, setno) - 1); backwarddiff(getx(gno, setno), gety(gno, setno), getx(gno, diffset), gety(gno, diffset), getsetlength(gno, setno)); break; case 2: sprintf(buf, "Centered difference of set %d", setno); setlength(gno, diffset, getsetlength(gno, setno) - 2); centereddiff(getx(gno, setno), gety(gno, setno), getx(gno, diffset), gety(gno, diffset), getsetlength(gno, setno)); break; } setcomment(gno, diffset, buf); } } /* * seasonally difference a set */ void do_seasonal_diff(int setno, int period) { int diffset; if (!is_set_active(get_cg(), setno)) { errmsg("Set not active"); return; } if (getsetlength(get_cg(), setno) < 2) { errmsg("Set length < 2"); return; } diffset = nextset(get_cg()); if (diffset != (-1)) { activateset(get_cg(), diffset); setlength(get_cg(), diffset, getsetlength(get_cg(), setno) - period); seasonaldiff(getx(get_cg(), setno), gety(get_cg(), setno), getx(get_cg(), diffset), gety(get_cg(), diffset), getsetlength(get_cg(), setno), period); sprintf(buf, "Seasonal difference of set %d, period %d", setno, period); setcomment(get_cg(), diffset, buf); } } /* * regression with restrictions to region rno if rno >= 0 */ void do_regress(int gno, int setno, int ideg, int iresid, int rno, int invr, int fitset) /* * gno, setno - set to perform fit on * ideg - degree of fit * irisid - 0 -> whole set, 1-> subset of setno * rno - region number of subset * invr - 1->invert region, 0 -> do nothing * fitset - set to which fitted function will be loaded * Y values are computed at the x values in the set * if -1 is specified, a set with the same x values as the * one being fitted will be created and used */ { int len, i, sdeg = ideg; int cnt = 0, fitlen = 0; double *x, *y, *xt = NULL, *yt = NULL, *xr = NULL, *yr = NULL; char buf[256]; double c[20]; /* coefficients of fitted polynomial */ if (!is_set_active(gno, setno)) { errmsg("Set not active"); return; } len = getsetlength(gno, setno); x = getx(gno, setno); y = gety(gno, setno); if (rno == -1) { xt = x; yt = y; } else if (isactive_region(rno)) { if (!get_points_inregion(rno, invr, len, x, y, &cnt, &xt, &yt)) { if (cnt == 0) { errmsg("No points found in region, operation cancelled"); } return; } len = cnt; } else { errmsg("Selected region is not active"); return; } /* * first part for polynomials, second part for linear fits to transformed * data */ if ((len < ideg && ideg <= 10) || (len < 2 && ideg > 10)) { errmsg("Too few points in set, operation cancelled"); return; } /* determine is set provided or use abscissa from fitted set */ if( fitset == -1 ) { /* create set */ if( (fitset = nextset(gno)) != -1 ) { activateset(gno, fitset); setlength(gno, fitset, len); fitlen = len; xr = getx(gno, fitset); for (i = 0; i < len; i++) { xr[i] = xt[i]; } yr = gety(gno, fitset); } } else { /* set has been provided */ fitlen = getsetlength( gno, fitset ); xr = getx(gno, fitset); yr = gety(gno, fitset); } /* transform data so that system has the form y' = A + B * x' */ if (fitset != -1) { if (ideg == 12) { /* y=A*x^B -> ln(y) = ln(A) + B * ln(x) */ ideg = 1; for (i = 0; i < len; i++) { if (xt[i] <= 0.0) { errmsg("One of X[i] <= 0.0"); return; } if (yt[i] <= 0.0) { errmsg("One of Y[i] <= 0.0"); return; } } for (i = 0; i < len; i++) { xt[i] = log(xt[i]); yt[i] = log(yt[i]); } for( i=0; i ln(y) = ln(A) + B * x */ ideg = 1; for (i = 0; i < len; i++) { if (yt[i] <= 0.0) { errmsg("One of Y[i] <= 0.0"); return; } } for (i = 0; i < len; i++) { yt[i] = log(yt[i]); } } else if (ideg == 14) { /* y = A + B * ln(x) */ ideg = 1; for (i = 0; i < len; i++) { if (xt[i] <= 0.0) { errmsg("One of X[i] <= 0.0"); return; } } for (i = 0; i < len; i++) { xt[i] = log(xt[i]); } for( i=0; i 1/y = a + B*x */ ideg = 1; for (i = 0; i < len; i++) { if (yt[i] == 0.0) { errmsg("One of Y[i] = 0.0"); return; } } for (i = 0; i < len; i++) { yt[i] = 1.0 / yt[i]; } } if (fitcurve(xt, yt, len, ideg, c)) { killset(gno, fitset); goto bustout; } /* compute function at requested x ordinates */ for( i=0; i=0?'+':'-', fabs(c[1])); for( i=2; i<=ideg; i++ ) sprintf( buf+strlen(buf), " %c %.5g * x^%d", c[i]>=0?'+':'-', fabs(c[i]), i ); strcat( buf, "\n" ); } else if (sdeg == 12) { /* ln(y) = ln(A) + b * ln(x) */ sprintf( buf, "\ny = %.5g * x^%.5g\n", exp(c[0]), c[1] ); for (i = 0; i < len; i++) { xt[i] = exp(xt[i]); yt[i] = exp(yt[i]); } for (i = 0; i < fitlen; i++){ yr[i] = exp(yr[i]); xr[i] = exp(xr[i]); } } else if (sdeg == 13) { /* ln(y) = ln(A) + B * x */ sprintf( buf, "\ny = %.5g * exp( %.5g * x )\n", exp(c[0]), c[1] ); for (i = 0; i < len; i++) { yt[i] = exp(yt[i]); } for (i = 0; i < fitlen; i++) yr[i] = exp(yr[i]); } else if (sdeg == 14) { /* y = A + B * ln(x) */ sprintf(buf, "\ny = %.5g %c %.5g * ln(x)\n", c[0], c[1]>=0?'+':'-', fabs(c[1]) ); for (i = 0; i < len; i++) { xt[i] = exp(xt[i]); } for (i = 0; i < fitlen; i++) xr[i] = exp(xr[i]); } else if (sdeg == 15) { /* y = 1/( A + B*x ) */ sprintf( buf, "\ny = 1/(%.5g %c %.5g * x)\n", c[0], c[1]>=0?'+':'-', fabs(c[1]) ); for (i = 0; i < len; i++) { yt[i] = 1.0 / yt[i]; } for (i = 0; i < fitlen; i++) yr[i] = 1.0 / yr[i]; } stufftext(buf); sprintf(buf, "\nRegression of set %d results to set %d\n", setno, fitset); stufftext(buf); switch (iresid) { case 1: /* determine residual */ for (i = 0; i < len; i++) { yr[i] = yt[i] - yr[i]; } break; case 2: break; } sprintf(buf, "%d deg fit of set %d", ideg, setno); setcomment(gno, fitset, buf); } bustout:; if (rno >= 0 && cnt != 0) { /* had a region and allocated memory there */ xfree(xt); xfree(yt); } } /* * running averages, medians, min, max, std. deviation */ void do_runavg(int gno, int setno, int runlen, int runtype, int rno, int invr) { int runset; int len, cnt = 0; double *x, *y, *xt = NULL, *yt = NULL, *xr, *yr; if (!is_set_active(gno, setno)) { errmsg("Set not active"); return; } if (runlen < 2) { errmsg("Length of running average < 2"); return; } len = getsetlength(gno, setno); x = getx(gno, setno); y = gety(gno, setno); if (rno == -1) { xt = x; yt = y; } else if (isactive_region(rno)) { if (!get_points_inregion(rno, invr, len, x, y, &cnt, &xt, &yt)) { if (cnt == 0) { errmsg("No points found in region, operation cancelled"); } return; } len = cnt; } else { errmsg("Selected region is not active"); return; } if (runlen >= len) { errmsg("Length of running average > set length"); goto bustout; } runset = nextset(gno); if (runset != (-1)) { activateset(gno, runset); setlength(gno, runset, len - runlen + 1); xr = getx(gno, runset); yr = gety(gno, runset); switch (runtype) { case 0: runavg(xt, yt, xr, yr, len, runlen); sprintf(buf, "%d-pt. avg. on set %d ", runlen, setno); break; case 1: runmedian(xt, yt, xr, yr, len, runlen); sprintf(buf, "%d-pt. median on set %d ", runlen, setno); break; case 2: runminmax(xt, yt, xr, yr, len, runlen, 0); sprintf(buf, "%d-pt. min on set %d ", runlen, setno); break; case 3: runminmax(xt, yt, xr, yr, len, runlen, 1); sprintf(buf, "%d-pt. max on set %d ", runlen, setno); break; case 4: runstddev(xt, yt, xr, yr, len, runlen); sprintf(buf, "%d-pt. std dev., set %d ", runlen, setno); break; } setcomment(gno, runset, buf); } bustout:; if (rno >= 0 && cnt != 0) { /* had a region and allocated memory there */ xfree(xt); xfree(yt); } } /* * DFT by FFT or definition */ void do_fourier(int gno, int setno, int fftflag, int load, int loadx, int invflag, int type, int wind) { int i, ilen; double *x, *y, *xx, *yy, delt, T; int i2 = 0, specset; if (!is_set_active(get_cg(), setno)) { errmsg("Set not active"); return; } ilen = getsetlength(get_cg(), setno); if (ilen < 2) { errmsg("Set length < 2"); return; } if (fftflag) { if ((i2 = ilog2(ilen)) <= 0) { errmsg("Set length not a power of 2"); return; } } specset = nextset(get_cg()); if (specset != -1) { activateset(get_cg(), specset); setlength(get_cg(), specset, ilen); xx = getx(get_cg(), specset); yy = gety(get_cg(), specset); x = getx(get_cg(), setno); y = gety(get_cg(), setno); copyx(get_cg(), setno, specset); copyy(get_cg(), setno, specset); if (wind != 0) { /* apply data window if needed */ apply_window(xx, yy, ilen, type, wind); } if (type == 0) { /* real data */ for (i = 0; i < ilen; i++) { xx[i] = yy[i]; yy[i] = 0.0; } } if (fftflag) { fft(xx, yy, ilen, i2, invflag); } else { dft(xx, yy, ilen, invflag); } switch (load) { case 0: delt = (x[ilen-1] - x[0])/(ilen -1.0); T = (x[ilen - 1] - x[0]); xx = getx(get_cg(), specset); yy = gety(get_cg(), specset); for (i = 0; i < ilen / 2; i++) { /* carefully get amplitude of complex xform: use abs(a[i]) + abs(a[-i]) except for zero term */ if(i) yy[i] = hypot(xx[i], yy[i])+hypot(xx[ilen-i], yy[ilen-i]); else yy[i]=fabs(xx[i]); switch (loadx) { case 0: xx[i] = i; break; case 1: /* xx[i] = 2.0 * M_PI * i / ilen; */ xx[i] = i / T; break; case 2: if (i == 0) { xx[i] = T + delt; /* the mean */ } else { /* xx[i] = (double) ilen / (double) i; */ xx[i] = T / i; } break; } } setlength(get_cg(), specset, ilen / 2); break; case 1: delt = (x[ilen-1] - x[0])/(ilen -1.0); T = (x[ilen - 1] - x[0]); setlength(get_cg(), specset, ilen / 2); xx = getx(get_cg(), specset); yy = gety(get_cg(), specset); for (i = 0; i < ilen / 2; i++) { yy[i] = -atan2(yy[i], xx[i]); switch (loadx) { case 0: xx[i] = i; break; case 1: /* xx[i] = 2.0 * M_PI * i / ilen; */ xx[i] = i / T; break; case 2: if (i == 0) { xx[i] = T + delt; } else { /* xx[i] = (double) ilen / (double) i; */ xx[i] = T / i; } break; } } break; } if (fftflag) { sprintf(buf, "FFT of set %d", setno); } else { sprintf(buf, "DFT of set %d", setno); } setcomment(get_cg(), specset, buf); } } /* * Apply a window to a set, result goes to a new set. */ void do_window(int setno, int type, int wind) { int ilen; double *xx, *yy; int specset; if (!is_set_active(get_cg(), setno)) { errmsg("Set not active"); return; } ilen = getsetlength(get_cg(), setno); if (ilen < 2) { errmsg("Set length < 2"); return; } specset = nextset(get_cg()); if (specset != -1) { char *wtype[6]; wtype[0] = "Triangular"; wtype[1] = "Hanning"; wtype[2] = "Welch"; wtype[3] = "Hamming"; wtype[4] = "Blackman"; wtype[5] = "Parzen"; activateset(get_cg(), specset); setlength(get_cg(), specset, ilen); xx = getx(get_cg(), specset); yy = gety(get_cg(), specset); copyx(get_cg(), setno, specset); copyy(get_cg(), setno, specset); if (wind != 0) { apply_window(xx, yy, ilen, type, wind); sprintf(buf, "%s windowed set %d", wtype[wind - 1], setno); } else { /* shouldn't happen */ } setcomment(get_cg(), specset, buf); } } void apply_window(double *xx, double *yy, int ilen, int type, int wind) { int i; for (i = 0; i < ilen; i++) { switch (wind) { case 1: /* triangular */ if (type != 0) { xx[i] *= 1.0 - fabs((i - 0.5 * (ilen - 1.0)) / (0.5 * (ilen - 1.0))); } yy[i] *= 1.0 - fabs((i - 0.5 * (ilen - 1.0)) / (0.5 * (ilen - 1.0))); break; case 2: /* Hanning */ if (type != 0) { xx[i] = xx[i] * (0.5 - 0.5 * cos(2.0 * M_PI * i / (ilen - 1.0))); } yy[i] = yy[i] * (0.5 - 0.5 * cos(2.0 * M_PI * i / (ilen - 1.0))); break; case 3: /* Welch (from Numerical Recipes) */ if (type != 0) { xx[i] *= 1.0 - pow((i - 0.5 * (ilen - 1.0)) / (0.5 * (ilen + 1.0)), 2.0); } yy[i] *= 1.0 - pow((i - 0.5 * (ilen - 1.0)) / (0.5 * (ilen + 1.0)), 2.0); break; case 4: /* Hamming */ if (type != 0) { xx[i] = xx[i] * (0.54 - 0.46 * cos(2.0 * M_PI * i / (ilen - 1.0))); } yy[i] = yy[i] * (0.54 - 0.46 * cos(2.0 * M_PI * i / (ilen - 1.0))); break; case 5: /* Blackman */ if (type != 0) { xx[i] = xx[i] * (0.42 - 0.5 * cos(2.0 * M_PI * i / (ilen - 1.0)) + 0.08 * cos(4.0 * M_PI * i / (ilen - 1.0))); } yy[i] = yy[i] * (0.42 - 0.5 * cos(2.0 * M_PI * i / (ilen - 1.0)) + 0.08 * cos(4.0 * M_PI * i / (ilen - 1.0))); break; case 6: /* Parzen (from Numerical Recipes) */ if (type != 0) { xx[i] *= 1.0 - fabs((i - 0.5 * (ilen - 1)) / (0.5 * (ilen + 1))); } yy[i] *= 1.0 - fabs((i - 0.5 * (ilen - 1)) / (0.5 * (ilen + 1))); break; } } } /* * histograms */ int do_histo(int fromgraph, int fromset, int tograph, int toset, double *bins, int nbins, int cumulative, int normalize) { int i, ndata; int *hist; double *x, *y, *data; plotarr p; if (!is_set_active(fromgraph, fromset)) { errmsg("Set not active"); return RETURN_FAILURE; } if (nbins <= 0) { errmsg("Number of bins <= 0"); return RETURN_FAILURE; } if (toset == SET_SELECT_NEXT) { toset = nextset(tograph); } if (!is_valid_setno(tograph, toset)) { errmsg("Can't activate destination set"); return RETURN_FAILURE; } ndata = getsetlength(fromgraph, fromset); data = gety(fromgraph, fromset); hist = xmalloc(nbins*SIZEOF_INT); if (hist == NULL) { errmsg("xmalloc failed in do_histo()"); return RETURN_FAILURE; } if (histogram(ndata, data, nbins, bins, hist) == RETURN_FAILURE){ xfree(hist); return RETURN_FAILURE; } activateset(tograph, toset); setlength(tograph, toset, nbins + 1); x = getx(tograph, toset); y = gety(tograph, toset); x[0] = bins[0]; y[0] = 0.0; for (i = 1; i < nbins + 1; i++) { x[i] = bins[i]; y[i] = hist[i - 1]; if (cumulative) { y[i] += y[i - 1]; } } if (normalize) { for (i = 1; i < nbins + 1; i++) { double factor; if (cumulative) { factor = 1.0/ndata; } else { factor = 1.0/((bins[i] - bins[i - 1])*ndata); } y[i] *= factor; } } xfree(hist); get_graph_plotarr(tograph, toset, &p); p.sym = SYM_NONE; p.linet = LINE_TYPE_LEFTSTAIR; p.dropline = TRUE; p.baseline = FALSE; p.baseline_type = BASELINE_TYPE_0; p.lines = 1; p.symlines = 1; sprintf(p.comments, "Histogram from G%d.S%d", fromgraph, fromset); set_graph_plotarr(tograph, toset, &p); return RETURN_SUCCESS; } int histogram(int ndata, double *data, int nbins, double *bins, int *hist) { int i, j, bsign; double minval, maxval; if (nbins < 1) { errmsg("Number of bins < 1"); return RETURN_FAILURE; } bsign = monotonicity(bins, nbins + 1, TRUE); if (bsign == 0) { errmsg("Non-monotonic bins"); return RETURN_FAILURE; } for (i = 0; i < nbins; i++) { hist[i] = 0; } /* TODO: binary search */ for (i = 0; i < ndata; i++) { for (j = 0; j < nbins; j++) { if (bsign > 0) { minval = bins[j]; maxval = bins[j + 1]; } else { minval = bins[j + 1]; maxval = bins[j]; } if (data[i] >= minval && data[i] <= maxval) { hist[j] += 1; break; } } } return RETURN_SUCCESS; } /* * sample a set, by start/step or logical expression */ void do_sample(int setno, int typeno, char *exprstr, int startno, int stepno) { int len, npts = 0, i, resset; double *x, *y; int reslen; double *result; int gno = get_cg(); if (!is_set_active(gno, setno)) { errmsg("Set not active"); return; } len = getsetlength(gno, setno); resset = nextset(gno); if (resset < 0) { return; } x = getx(gno, setno); y = gety(gno, setno); if (typeno == 0) { if (len <= 2) { errmsg("Set has <= 2 points"); return; } if (startno < 1) { errmsg("Start point < 1 (locations in sets are numbered starting from 1)"); return; } if (stepno < 1) { errmsg("Step < 1"); return; } for (i = startno - 1; i < len; i += stepno) { add_point(gno, resset, x[i], y[i]); npts++; } sprintf(buf, "Sample, %d, %d set #%d", startno, stepno, setno); } else { if (set_parser_setno(gno, setno) != RETURN_SUCCESS) { errmsg("Bad set"); killset(gno, resset); return; } if (v_scanner(exprstr, &reslen, &result) != RETURN_SUCCESS) { killset(gno, resset); return; } if (reslen != len) { errmsg("Internal error"); killset(gno, resset); return; } npts = 0; sprintf(buf, "Sample from %d, using '%s'", setno, exprstr); for (i = 0; i < len; i++) { if ((int) rint(result[i])) { add_point(gno, resset, x[i], y[i]); npts++; } } xfree(result); } if (npts > 0) { setcomment(gno, resset, buf); } } #define prune_xconv(res,x,xtype) \ switch (deltatypeno) { \ case PRUNE_VIEWPORT: \ res = xy_xconv(x); \ break; \ case PRUNE_WORLD: \ switch (xtype) { \ case PRUNE_LIN: \ res = x; \ break; \ case PRUNE_LOG: \ res = log(x); \ break; \ } \ } #define prune_yconv(res,y,ytype) \ switch (deltatypeno) { \ case PRUNE_VIEWPORT: \ res = xy_yconv(y); \ break; \ case PRUNE_WORLD: \ switch (ytype) { \ case PRUNE_LIN: \ res = y; \ break; \ case PRUNE_LOG: \ res = log(y); \ break; \ } \ } /* * Prune data */ void do_prune(int setno, int typeno, int deltatypeno, float deltax, float deltay, int dxtype, int dytype) { int len, npts = 0, d, i, j, k, drop, resset; double *x, *y, *resx, *resy, xtmp, ytmp, ddx = 0.0, ddy = 0.0; double xj = 0.0, xjm = 0.0, xjp = 0.0, yj = 0.0, yjm = 0.0, yjp = 0.0; if (!is_set_active(get_cg(), setno)) { errmsg("Set not active"); return; } len = getsetlength(get_cg(), setno); if (len <= 2) { errmsg("Set has <= 2 points"); return; } x = getx(get_cg(), setno); y = gety(get_cg(), setno); switch (typeno) { case PRUNE_CIRCLE: case PRUNE_ELLIPSE: case PRUNE_RECTANGLE: deltax = fabs(deltax); if (deltax == 0) return; break; } switch (typeno) { case PRUNE_CIRCLE: deltay = deltax; break; case PRUNE_ELLIPSE: case PRUNE_RECTANGLE: case PRUNE_INTERPOLATION: deltay = fabs(deltay); if (deltay == 0) return; break; } if (deltatypeno == PRUNE_WORLD) { if (dxtype == PRUNE_LOG && deltax < 1.0) { deltax = 1.0 / deltax; } if (dytype == PRUNE_LOG && deltay < 1.0) { deltay = 1.0 / deltay; } } resset = nextset(get_cg()); if (resset < 0) { return; } add_point(get_cg(), resset, x[0], y[0]); npts++; resx = getx(get_cg(), resset); resy = gety(get_cg(), resset); switch (typeno) { case PRUNE_CIRCLE: case PRUNE_ELLIPSE: for (i = 1; i < len; i++) { xtmp = x[i]; ytmp = y[i]; drop = FALSE; for (j = npts - 1; j >= 0 && drop == FALSE; j--) { switch (deltatypeno) { case PRUNE_VIEWPORT: ddx = (xy_xconv(xtmp) - xy_xconv(resx[j])) / deltax; if (fabs(ddx) < 1.0) { ddy = (xy_yconv(ytmp) - xy_yconv(resy[j])) / deltay; if (ddx * ddx + ddy * ddy < 1.0) { drop = TRUE; } } break; case PRUNE_WORLD: switch (dxtype) { case PRUNE_LIN: ddx = (xtmp - resx[j]) / deltax; break; case PRUNE_LOG: ddx = (xtmp / resx[j]); if (ddx < 1.0) { ddx = 1.0 / ddx; } ddx /= deltax; break; } if (fabs(ddx) < 1.0) { switch (dytype) { case PRUNE_LIN: ddy = (ytmp - resy[j]) / deltay; break; case PRUNE_LOG: ddy = (ytmp / resy[j]); if (ddy < 1.0) { ddy = 1.0 / ddy; } ddy /= deltay; break; } if (ddx * ddx + ddy * ddy < 1.0) { drop = TRUE; } } break; } } if (drop == FALSE) { add_point(get_cg(), resset, xtmp, ytmp); npts++; resx = getx(get_cg(), resset); resy = gety(get_cg(), resset); } } sprintf(buf, "Prune from %d, %s dx = %g dy = %g", setno, (typeno == 0) ? "Circle" : "Ellipse", deltax, deltay); break; case PRUNE_RECTANGLE: for (i = 1; i < len; i++) { xtmp = x[i]; ytmp = y[i]; drop = FALSE; for (j = npts - 1; j >= 0 && drop == FALSE; j--) { switch (deltatypeno) { case PRUNE_VIEWPORT: ddx = fabs(xy_xconv(xtmp) - xy_xconv(resx[j])); if (ddx < deltax) { ddy = fabs(xy_yconv(ytmp) - xy_yconv(resy[j])); if (ddy < deltay) { drop = TRUE; } } break; case PRUNE_WORLD: switch (dxtype) { case PRUNE_LIN: ddx = fabs(xtmp - resx[j]); break; case PRUNE_LOG: ddx = (xtmp / resx[j]); if (ddx < 1.0) { ddx = 1.0 / ddx; } break; } if (ddx < deltax) { switch (dytype) { case PRUNE_LIN: ddy = fabs(ytmp - resy[j]); break; case PRUNE_LOG: ddy = (ytmp / resy[j]); if (ddy < 1.0) { ddy = 1.0 / ddy; } break; } if (ddy < deltay) { drop = TRUE; } } break; } } if (drop == FALSE) { add_point(get_cg(), resset, xtmp, ytmp); npts++; resx = getx(get_cg(), resset); resy = gety(get_cg(), resset); } } sprintf(buf, "Prune from %d, %s dx = %g dy = %g", setno, "Rectangle", deltax, deltay); break; case PRUNE_INTERPOLATION: k = 0; prune_xconv(xjm, x[0], dxtype); prune_yconv(yjm, y[0], dytype); while (k < len - 2) { d = 1; i = k + d + 1; drop = TRUE; while (TRUE) { prune_xconv(xjp, x[i], dxtype); prune_yconv(yjp, y[i], dytype); for (j = k + 1; j < i && drop == TRUE; j++) { prune_xconv(xj, x[j], dxtype); prune_yconv(yj, y[j], dytype); if (xjp == xjm) { ytmp = 0.5 * (yjp + yjm); } else { ytmp = (yjp*(xj-xjm)+yjm*(xjp-xj))/(xjp-xjm); } switch (deltatypeno) { case PRUNE_VIEWPORT: ddy = fabs(ytmp - yj); break; case PRUNE_WORLD: switch (dytype) { case PRUNE_LIN: ddy = fabs(ytmp - yj); break; case PRUNE_LOG: ddy = exp(fabs(ytmp - yj)); break; } } if (ddy > deltay) { drop = FALSE; } } if (drop == FALSE || i == len - 1) { break; } d *= 2; i = k + d + 1; if (i >= len) { i = len - 1; } } if (drop == FALSE) { i = k + 1; drop = TRUE; while (d > 1) { d /= 2; i += d; prune_xconv(xjp, x[i], dxtype); prune_yconv(yjp, y[i], dytype); drop = TRUE; for (j = k + 1; j < i && drop == TRUE; j++) { prune_xconv(xj, x[j], dxtype); prune_yconv(yj, y[j], dytype); ytmp = (yjp*(xj-xjm)+yjm*(xjp-xj))/(xjp-xjm); switch (deltatypeno) { case PRUNE_VIEWPORT: ddy = fabs(ytmp - yj); break; case PRUNE_WORLD: switch (dytype) { case PRUNE_LIN: ddy = fabs(ytmp - yj); break; case PRUNE_LOG: ddy = exp(fabs(ytmp - yj)); break; } } if (ddy > deltay) { drop = FALSE; } } if (drop == FALSE) { i -= d; } } } k = i; prune_xconv(xjm, x[k], dxtype); prune_yconv(yjm, y[k], dytype); add_point(get_cg(), resset, x[k], y[k]); npts++; resx = getx(get_cg(), resset); resy = gety(get_cg(), resset); } if (k == len - 2) { add_point(get_cg(), resset, x[len-1], y[len-1]); npts++; } sprintf(buf, "Prune from %d, %s dy = %g", setno, "Interpolation", deltay); break; } setcomment(get_cg(), resset, buf); } int get_points_inregion(int rno, int invr, int len, double *x, double *y, int *cnt, double **xt, double **yt) { int i, clen = 0; double *xtmp, *ytmp; *cnt = 0; if (isactive_region(rno)) { for (i = 0; i < len; i++) { if (invr) { if (!inregion(rno, x[i], y[i])) { clen++; } } else { if (inregion(rno, x[i], y[i])) { clen++; } } } if (clen == 0) { return 0; } xtmp = (double *) xcalloc(clen, SIZEOF_DOUBLE); if (xtmp == NULL) { return 0; } ytmp = (double *) xcalloc(clen, SIZEOF_DOUBLE); if (ytmp == NULL) { xfree(xtmp); return 0; } clen = 0; for (i = 0; i < len; i++) { if (invr) { if (!inregion(rno, x[i], y[i])) { xtmp[clen] = x[i]; ytmp[clen] = y[i]; clen++; } } else { if (inregion(rno, x[i], y[i])) { xtmp[clen] = x[i]; ytmp[clen] = y[i]; clen++; } } } } else { return 0; } *cnt = clen; *xt = xtmp; *yt = ytmp; return 1; } int interpolate(double *mesh, double *yint, int meshlen, double *x, double *y, int len, int method) { double *b, *c, *d; double dx; int i, ifound; int m; /* For linear interpolation, non-strict monotonicity is fine */ m = monotonicity(x, len, method == INTERP_LINEAR ? FALSE:TRUE); if (m == 0) { errmsg("Can't interpolate a set with non-monotonic abscissas"); return RETURN_FAILURE; } switch (method) { case INTERP_SPLINE: case INTERP_ASPLINE: b = xcalloc(len, SIZEOF_DOUBLE); c = xcalloc(len, SIZEOF_DOUBLE); d = xcalloc(len, SIZEOF_DOUBLE); if (b == NULL || c == NULL || d == NULL) { xfree(b); xfree(c); xfree(d); return RETURN_FAILURE; } if (method == INTERP_ASPLINE){ /* Akima spline */ aspline(len, x, y, b, c, d); } else { /* Plain cubic spline */ spline(len, x, y, b, c, d); } seval(mesh, yint, meshlen, x, y, b, c, d, len); xfree(b); xfree(c); xfree(d); break; default: /* linear interpolation */ for (i = 0; i < meshlen; i++) { ifound = find_span_index(x, len, m, mesh[i]); if (ifound < 0) { ifound = 0; } else if (ifound > len - 2) { ifound = len - 2; } dx = x[ifound + 1] - x[ifound]; if (dx != 0.0) { yint[i] = y[ifound] + (mesh[i] - x[ifound])* ((y[ifound + 1] - y[ifound])/dx); } else { yint[i] = (y[ifound] + y[ifound + 1])/2; } } break; } return RETURN_SUCCESS; } /* interpolate a set at abscissas from mesh * method - type of spline (or linear interpolation) * if strict is set, perform interpolation only within source set bounds * (i.e., no extrapolation) */ int do_interp(int gno_src, int setno_src, int gno_dest, int setno_dest, double *mesh, int meshlen, int method, int strict) { int len, n, ncols; double *x, *xint; char *s; if (!is_valid_setno(gno_src, setno_src)) { errmsg("Interpolated set not active"); return RETURN_FAILURE; } if (mesh == NULL || meshlen < 1) { errmsg("NULL sampling mesh"); return RETURN_FAILURE; } len = getsetlength(gno_src, setno_src); ncols = dataset_cols(gno_src, setno_src); if (setno_dest == SET_SELECT_NEXT) { setno_dest = nextset(gno_dest); } if (!is_valid_setno(gno_dest, setno_dest)) { errmsg("Can't activate destination set"); return RETURN_FAILURE; } if (dataset_cols(gno_dest, setno_dest) != ncols) { copyset(gno_src, setno_src, gno_dest, setno_dest); } setlength(gno_dest, setno_dest, meshlen); activateset(gno_dest, setno_dest); x = getcol(gno_src, setno_src, DATA_X); for (n = 1; n < ncols; n++) { int res; double *y, *yint; y = getcol(gno_src, setno_src, n); yint = getcol(gno_dest, setno_dest, n); res = interpolate(mesh, yint, meshlen, x, y, len, method); if (res != RETURN_SUCCESS) { killset(gno_dest, setno_dest); return RETURN_FAILURE; } } xint = getcol(gno_dest, setno_dest, DATA_X); memcpy(xint, mesh, meshlen*SIZEOF_DOUBLE); if (strict) { double xmin, xmax; int i, imin, imax; minmax(x, len, &xmin, &xmax, &imin, &imax); for (i = meshlen - 1; i >= 0; i--) { if (xint[i] < xmin || xint[i] > xmax) { del_point(gno_dest, setno_dest, i); } } } switch (method) { case INTERP_SPLINE: s = "cubic spline"; break; case INTERP_ASPLINE: s = "Akima spline"; break; default: s = "linear interpolation"; break; } sprintf(buf, "Interpolated from G%d.S%d using %s", gno_src, setno_src, s); setcomment(gno_dest, setno_dest, buf); return RETURN_SUCCESS; } int get_restriction_array(int gno, int setno, int rtype, int negate, char **rarray) { int i, n, regno; double *x, *y; world w; WPoint wp; if (rtype == RESTRICT_NONE) { *rarray = NULL; return RETURN_SUCCESS; } n = getsetlength(gno, setno); if (n <= 0) { *rarray = NULL; return RETURN_FAILURE; } *rarray = xmalloc(n*SIZEOF_CHAR); if (*rarray == NULL) { return RETURN_FAILURE; } x = getcol(gno, setno, DATA_X); y = getcol(gno, setno, DATA_Y); switch (rtype) { case RESTRICT_REG0: case RESTRICT_REG1: case RESTRICT_REG2: case RESTRICT_REG3: case RESTRICT_REG4: regno = rtype - RESTRICT_REG0; for (i = 0; i < n; i++) { (*rarray)[i] = inregion(regno, x[i], y[i]) ? !negate : negate; } break; case RESTRICT_WORLD: get_graph_world(gno, &w); for (i = 0; i < n; i++) { wp.x = x[i]; wp.y = y[i]; (*rarray)[i] = is_wpoint_inside(&wp, &w) ? !negate : negate; } break; default: errmsg("Internal error in get_restriction_array()"); XCFREE(*rarray); return RETURN_FAILURE; break; } return RETURN_SUCCESS; } int monotonicity(double *array, int len, int strict) { int i; int s0, s1; if (len < 2) { errmsg("Monotonicity of an array of length < 2 is meaningless"); return 0; } s0 = sign(array[1] - array[0]); for (i = 2; i < len; i++) { s1 = sign(array[i] - array[i - 1]); if (s1 != s0) { if (strict) { return 0; } else if (s0 == 0) { s0 = s1; } else if (s1 != 0) { return 0; } } } return s0; } int find_span_index(double *array, int len, int m, double x) { int ind, low = 0, high = len - 1; if (len < 2 || m == 0) { errmsg("find_span_index() called with a non-monotonic array"); return -2; } else if (m > 0) { /* ascending order */ if (x < array[0]) { return -1; } else if (x > array[len - 1]) { return len - 1; } else { while (low <= high) { ind = (low + high) / 2; if (x < array[ind]) { high = ind - 1; } else if (x > array[ind + 1]) { low = ind + 1; } else { return ind; } } } } else { /* descending order */ if (x > array[0]) { return -1; } else if (x < array[len - 1]) { return len - 1; } else { while (low <= high) { ind = (low + high) / 2; if (x > array[ind]) { high = ind - 1; } else if (x < array[ind + 1]) { low = ind + 1; } else { return ind; } } } } /* should never happen */ errmsg("internal error in find_span_index()"); return -2; } grace-5.1.23/src/setwin.c0000644000076500001440000006037410071615562014711 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * setwin - GUI for operations on sets and datasets * */ #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "plotone.h" #include "ssdata.h" #include "parser.h" #include "motifinc.h" #include "protos.h" #define cg get_cg() static void enterCB(Widget w, XtPointer client_data, XtPointer call_data); static void changetypeCB(int n, int *values, void *data); static int datasetprop_aac_cb(void *data); static int datasetop_aac_cb(void *data); static void datasetoptypeCB(int value, void *data); static int setop_aac_cb(void *data); static int leval_aac_cb(void *data); typedef struct _Type_ui { Widget top; ListStructure *sel; Widget comment_item; Widget length_item; OptionStructure *datatype_item; Widget mw; char *rows[MAX_SET_COLS][6]; } Type_ui; static Type_ui tui; void create_datasetprop_popup(void *data) { set_wait_cursor(); if (tui.top == NULL) { Widget menubar, menupane, submenupane, dialog, rc, fr; int i, j; char *rowlabels[MAX_SET_COLS]; char *collabels[6] = {"Min", "at", "Max", "at", "Mean", "Stdev"}; short column_widths[6] = {10, 6, 10, 6, 10, 10}; unsigned char column_alignments[6]; unsigned char column_label_alignments[6]; tui.top = CreateDialogForm(app_shell, "Data set properties"); menubar = CreateMenuBar(tui.top); ManageChild(menubar); AddDialogFormChild(tui.top, menubar); dialog = CreateVContainer(tui.top); tui.sel = CreateSetChoice(dialog, "Data sets:", LIST_TYPE_MULTIPLE, TRUE); AddListChoiceCB(tui.sel, changetypeCB, (void *) tui.sel); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Close", 'C', destroy_dialog_cb, GetParent(tui.top)); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Duplicate", 'D', duplicate_set_proc, (void *) tui.sel); CreateMenuButton(menupane, "Kill data", 'a', killd_set_proc, (void *) tui.sel); CreateMenuSeparator(menupane); submenupane = CreateMenu(menupane, "Edit data", 'E', FALSE); CreateMenuButton(submenupane, "In spreadsheet", 's', editS_set_proc, (void *) tui.sel); CreateMenuButton(submenupane, "In text editor", 'e', editE_set_proc, (void *) tui.sel); submenupane = CreateMenu(menupane, "Create new", 'n', FALSE); CreateMenuButton(submenupane, "By formula", 'f', newF_set_proc, (void *) tui.sel); CreateMenuButton(submenupane, "In spreadsheet", 's', newS_set_proc, (void *) tui.sel); CreateMenuButton(submenupane, "In text editor", 'e', newE_set_proc, (void *) tui.sel); CreateMenuButton(submenupane, "From block data", 'b', newB_set_proc, (void *) tui.sel); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Set appearance...", 'S', define_symbols_popup, (void *) -1); CreateMenuButton(menupane, "Set operations...", 'o', create_setop_popup, NULL); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On data sets", 's', tui.top, "doc/UsersGuide.html#data-sets"); rc = CreateHContainer(dialog); tui.datatype_item = CreateSetTypeChoice(rc, "Type:"); tui.length_item = CreateTextItem2(rc, 6, "Length:"); tui.comment_item = CreateTextItem2(dialog, 26, "Comment:"); for (i = 0; i < 6; i++) { column_alignments[i] = XmALIGNMENT_END; column_label_alignments[i] = XmALIGNMENT_CENTER; } for (i = 0; i < MAX_SET_COLS; i++) { rowlabels[i] = copy_string(NULL, dataset_colname(i)); for (j = 0; j < 6; j++) { tui.rows[i][j] = NULL; } } fr = CreateFrame(dialog, "Statistics"); tui.mw = XtVaCreateManagedWidget("mw", xbaeMatrixWidgetClass, fr, XmNrows, MAX_SET_COLS, XmNcolumns, 6, XmNvisibleRows, MAX_SET_COLS, XmNvisibleColumns, 4, XmNcolumnLabels, collabels, XmNcolumnWidths, column_widths, XmNcolumnAlignments, column_alignments, XmNcolumnLabelAlignments, column_label_alignments, XmNrowLabels, rowlabels, XmNrowLabelWidth, 3, XmNrowLabelAlignment, XmALIGNMENT_CENTER, XmNshowArrows, True, XmNallowColumnResize, True, XmNgridType, XmGRID_COLUMN_SHADOW, XmNcellShadowType, XmSHADOW_OUT, XmNcellShadowThickness, 1, XmNaltRowCount, 1, XmNtraversalOn, False, NULL); XtAddCallback(tui.mw, XmNenterCellCallback, enterCB, NULL); CreateAACDialog(tui.top, dialog, datasetprop_aac_cb, NULL); } RaiseWindow(GetParent(tui.top)); unset_wait_cursor(); } static void changetypeCB(int n, int *values, void *data) { int i, j, ncols; double *datap; int imin, imax; double dmin, dmax, dmean, dsd; ListStructure *listp; SetChoiceData *sdata; int gno, setno; char buf[32]; char **cells[MAX_SET_COLS]; listp = (ListStructure *) data; if (listp == NULL) { return; } sdata = (SetChoiceData *) listp->anydata; gno = sdata->gno; if (n == 1 && is_valid_setno(gno, setno = values[0]) == TRUE) { ncols = dataset_cols(gno, setno); xv_setstr(tui.comment_item, getcomment(gno, setno)); sprintf(buf, "%d", getsetlength(gno, setno)); xv_setstr(tui.length_item, buf); SetOptionChoice(tui.datatype_item, dataset_type(gno, setno)); SetSensitive(tui.datatype_item->menu, TRUE); } else { setno = -1; ncols = 0; xv_setstr(tui.comment_item, ""); xv_setstr(tui.length_item, ""); SetSensitive(tui.datatype_item->menu, FALSE); } for (i = 0; i < MAX_SET_COLS; i++) { datap = getcol(gno, setno, i); minmax(datap, getsetlength(gno, setno), &dmin, &dmax, &imin, &imax); stasum(datap, getsetlength(gno, setno), &dmean, &dsd); for (j = 0; j < 6; j++) { if (i < ncols) { switch (j) { case 0: sprintf(buf, "%g", dmin); break; case 1: sprintf(buf, "%d", imin); break; case 2: sprintf(buf, "%g", dmax); break; case 3: sprintf(buf, "%d", imax); break; case 4: sprintf(buf, "%g", dmean); break; case 5: sprintf(buf, "%g", dsd); break; default: strcpy(buf, ""); break; } tui.rows[i][j] = copy_string(tui.rows[i][j], buf); } else { tui.rows[i][j] = copy_string(tui.rows[i][j], ""); } } cells[i] = &tui.rows[i][0]; } XtVaSetValues(tui.mw, XmNcells, cells, NULL); } static void enterCB(Widget w, XtPointer client_data, XtPointer call_data) { XbaeMatrixEnterCellCallbackStruct *cbs = (XbaeMatrixEnterCellCallbackStruct *) call_data; cbs->doit = False; cbs->map = False; } /* * change dataset properties */ static int datasetprop_aac_cb(void *data) { int error = FALSE; int *selset, nsets, i, len, setno, type; char *s; nsets = GetListChoices(tui.sel, &selset); if (nsets < 1) { errmsg("No set selected"); return RETURN_FAILURE; } else { type = GetOptionChoice(tui.datatype_item); xv_evalexpri(tui.length_item, &len); if (len < 0) { errmsg("Negative set length!"); error = TRUE; } s = xv_getstr(tui.comment_item); if (error == FALSE) { for (i = 0; i < nsets; i++) { setno = selset[i]; set_dataset_type(cg, setno, type); setlength(cg, setno, len); setcomment(cg, setno, s); } } xfree(selset); if (error == FALSE) { update_set_lists(cg); xdrawgraph(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } } typedef enum { DATASETOP_SORT, DATASETOP_REVERSE, DATASETOP_JOIN, DATASETOP_SPLIT, DATASETOP_DROP }dataSetOpType; typedef struct _Datasetop_ui { Widget top; ListStructure *sel; OptionStructure *optype_item; Widget *xy_item; Widget *up_down_item; Widget length_item; Widget start_item; Widget stop_item; } Datasetop_ui; static Datasetop_ui datasetopui; static Widget datasettype_controls[5]; void create_datasetop_popup(void *data) { Widget dialog, menubar, menupane, rc; OptionItem optype_items[5]; set_wait_cursor(); if (datasetopui.top == NULL) { optype_items[0].value = DATASETOP_SORT; optype_items[0].label = "Sort"; optype_items[1].value = DATASETOP_REVERSE; optype_items[1].label = "Reverse"; optype_items[2].value = DATASETOP_JOIN; optype_items[2].label = "Join"; optype_items[3].value = DATASETOP_SPLIT; optype_items[3].label = "Split"; optype_items[4].value = DATASETOP_DROP; optype_items[4].label = "Drop points"; datasetopui.top = CreateDialogForm(app_shell, "Data set operations"); SetDialogFormResizable(datasetopui.top, TRUE); menubar = CreateMenuBar(datasetopui.top); ManageChild(menubar); AddDialogFormChild(datasetopui.top, menubar); dialog = CreateVContainer(datasetopui.top); XtVaSetValues(dialog, XmNrecomputeSize, True, NULL); datasetopui.sel = CreateSetChoice(dialog, "Data sets:", LIST_TYPE_MULTIPLE, TRUE); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Close", 'C', destroy_dialog_cb, GetParent(datasetopui.top)); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On dataset operations", 's', datasetopui.top, "doc/UsersGuide.html#data-set-operations"); datasetopui.optype_item = CreateOptionChoice(dialog, "Operation type:", 1, 5, optype_items); AddOptionChoiceCB(datasetopui.optype_item, datasetoptypeCB, NULL); rc = CreateHContainer(dialog); XtVaSetValues(rc, XmNrecomputeSize, True, NULL); datasetopui.xy_item = CreatePanelChoice(rc, "Sort on:", 7, "X", "Y", "Y1", "Y2", "Y3", "Y4", NULL); datasetopui.up_down_item = CreatePanelChoice(rc, "Order:", 3, "Ascending", "Descending", NULL); datasettype_controls[0] = rc; /* Reverse */ rc = CreateVContainer(dialog); CreateSeparator(rc); datasettype_controls[1] = rc; /* Join */ rc = CreateVContainer(dialog); CreateSeparator(rc); datasettype_controls[2] = rc; /* Split */ rc = CreateVContainer(dialog); datasetopui.length_item = CreateTextItem2(rc, 6, "Length:"); datasettype_controls[3] = rc; /* Drop points */ rc = CreateHContainer(dialog); datasetopui.start_item = CreateTextItem2(rc, 6, "Start at:"); datasetopui.stop_item = CreateTextItem2(rc, 6, "Stop at:"); datasettype_controls[4] = rc; ManageChild(datasettype_controls[0]); UnmanageChild(datasettype_controls[1]); UnmanageChild(datasettype_controls[2]); UnmanageChild(datasettype_controls[3]); UnmanageChild(datasettype_controls[4]); CreateAACDialog(datasetopui.top, dialog, datasetop_aac_cb, NULL); } RaiseWindow(GetParent(datasetopui.top)); unset_wait_cursor(); } static void datasetoptypeCB(int value, void *data) { int i; dataSetOpType type = value; for (i = 0; i < 5; i++) { if (i == type) { ManageChild(datasettype_controls[i]); } else { UnmanageChild(datasettype_controls[i]); } } } static int datasetop_aac_cb(void *data) { int *selset, nsets, i, setno; int sorton, stype; int lpart; int startno, endno; static int son[MAX_SET_COLS] = {DATA_X, DATA_Y, DATA_Y1, DATA_Y2, DATA_Y3, DATA_Y4}; dataSetOpType optype; nsets = GetListChoices(datasetopui.sel, &selset); if (nsets < 1) { errmsg("No set selected"); return RETURN_FAILURE; } else { optype = GetOptionChoice(datasetopui.optype_item); switch (optype) { case DATASETOP_SORT: sorton = son[GetChoice(datasetopui.xy_item)]; stype = GetChoice(datasetopui.up_down_item); for (i = 0; i < nsets; i++) { setno = selset[i]; do_sort(setno, sorton, stype); } break; case DATASETOP_REVERSE: for (i = 0; i < nsets; i++) { setno = selset[i]; reverse_set(cg, setno); } break; case DATASETOP_JOIN: join_sets(cg, selset, nsets); break; case DATASETOP_SPLIT: xv_evalexpri(datasetopui.length_item, &lpart); for (i = 0; i < nsets; i++) { setno = selset[i]; do_splitsets(cg, setno, lpart); } break; case DATASETOP_DROP: xv_evalexpri(datasetopui.start_item, &startno); xv_evalexpri(datasetopui.stop_item, &endno); for (i = 0; i < nsets; i++) { setno = selset[i]; do_drop_points(cg, setno, startno, endno); } break; } xfree(selset); update_set_lists(cg); xdrawgraph(); return RETURN_SUCCESS; } } typedef struct _Setop_ui { Widget top; SrcDestStructure *srcdest; OptionStructure *optype_item; } Setop_ui; static Setop_ui setopui; #define OPTYPE_COPY 0 #define OPTYPE_MOVE 1 #define OPTYPE_SWAP 2 void create_setop_popup(void *data) { set_wait_cursor(); if (setopui.top == NULL) { OptionItem opitems[3]; setopui.top = CreateDialogForm(app_shell, "Set operations"); setopui.srcdest = CreateSrcDestSelector(setopui.top, LIST_TYPE_MULTIPLE); AddDialogFormChild(setopui.top, setopui.srcdest->form); opitems[0].value = OPTYPE_COPY; opitems[0].label = "Copy"; opitems[1].value = OPTYPE_MOVE; opitems[1].label = "Move"; opitems[2].value = OPTYPE_SWAP; opitems[2].label = "Swap"; setopui.optype_item = CreateOptionChoice(setopui.top, "Type of operation:", 0, 3, opitems); CreateAACDialog(setopui.top, setopui.optype_item->menu, setop_aac_cb, NULL); } RaiseWindow(GetParent(setopui.top)); unset_wait_cursor(); } static int setop_aac_cb(void *data) { int optype, error; int i, g1_ok, g2_ok, ns1, ns2, *svalues1, *svalues2, gno1, gno2, setno2; optype = GetOptionChoice(setopui.optype_item); g1_ok = GetSingleListChoice(setopui.srcdest->src->graph_sel, &gno1); g2_ok = GetSingleListChoice(setopui.srcdest->dest->graph_sel, &gno2); ns1 = GetListChoices(setopui.srcdest->src->set_sel, &svalues1); ns2 = GetListChoices(setopui.srcdest->dest->set_sel, &svalues2); error = FALSE; if (g1_ok == RETURN_FAILURE || g2_ok == RETURN_FAILURE) { error = TRUE; errmsg("Please select single source and destination graphs"); } else if (ns1 == 0) { error = TRUE; errmsg("No source sets selected"); } else if (ns2 == 0 && optype == OPTYPE_SWAP) { error = TRUE; errmsg("No destination sets selected"); } else if (ns1 != ns2 && (optype == OPTYPE_SWAP || ns2 != 0)) { error = TRUE; errmsg("Different number of source and destination sets"); } else if (gno1 == gno2 && ns2 == 0 && optype == OPTYPE_MOVE) { error = TRUE; errmsg("Can't move a set to itself"); } else { for (i = 0; i < ns1; i++) { switch (optype) { case OPTYPE_SWAP: if (do_swapset(gno1, svalues1[i], gno2, svalues2[i]) != RETURN_SUCCESS) { error = TRUE; } break; case OPTYPE_COPY: if (ns2 == 0) { setno2 = nextset(gno2); } else { setno2 = svalues2[i]; } if (do_copyset(gno1, svalues1[i], gno2, setno2) != RETURN_SUCCESS) { error = TRUE; } break; case OPTYPE_MOVE: if (ns2 == 0) { setno2 = nextset(gno2); } else { setno2 = svalues2[i]; } if (do_moveset(gno1, svalues1[i], gno2, setno2) != RETURN_SUCCESS) { error = TRUE; } break; } } } if (ns1 > 0) { xfree(svalues1); } if (ns2 > 0) { xfree(svalues2); } if (error == FALSE) { update_all(); xdrawgraph(); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } typedef struct _Leval_ui { Widget top; OptionStructure *set_type; Widget start; Widget stop; Widget npts; Widget mw; int gno; } Leval_ui; void set_type_cb(int type, void *data) { int i, nmrows, nscols; char *rowlabels[MAX_SET_COLS]; Leval_ui *ui = (Leval_ui *) data; nmrows = XbaeMatrixNumRows(ui->mw); nscols = settype_cols(type); if (nmrows > nscols) { XbaeMatrixDeleteRows(ui->mw, nscols, nmrows - nscols); } else if (nmrows < nscols) { for (i = nmrows; i < nscols; i++) { rowlabels[i - nmrows] = copy_string(NULL, dataset_colname(i)); rowlabels[i - nmrows] = concat_strings(rowlabels[i - nmrows], " = "); } XbaeMatrixAddRows(ui->mw, nmrows, NULL, rowlabels, NULL, nscols - nmrows); } } static Leval_ui levalui; static void leaveCB(Widget w, XtPointer client_data, XtPointer call_data) { Leval_ui *ui = (Leval_ui *) client_data; XbaeMatrixLeaveCellCallbackStruct *cs = (XbaeMatrixLeaveCellCallbackStruct *) call_data; XbaeMatrixSetCell(ui->mw, cs->row, cs->column, cs->value); } void create_leval_frame(void *data) { int gno = (int) data; set_wait_cursor(); if (is_valid_gno(gno)) { levalui.gno = gno; } else { levalui.gno = get_cg(); } if (levalui.top == NULL) { int i; Widget fr, rc1; int nscols; char *rows[MAX_SET_COLS][1]; char **cells[MAX_SET_COLS]; char *rowlabels[MAX_SET_COLS]; short column_widths[1] = {50}; int column_maxlengths[1] = {256}; levalui.top = CreateDialogForm(app_shell, "Load & evaluate"); fr = CreateFrame(levalui.top, "Parameter mesh ($t)"); AddDialogFormChild(levalui.top, fr); rc1 = CreateHContainer(fr); levalui.start = CreateTextItem2(rc1, 10, "Start at:"); levalui.stop = CreateTextItem2(rc1, 10, "Stop at:"); levalui.npts = CreateTextItem2(rc1, 6, "Length:"); levalui.set_type = CreateSetTypeChoice(levalui.top, "Set type:"); AddDialogFormChild(levalui.top, levalui.set_type->menu); AddOptionChoiceCB(levalui.set_type, set_type_cb, (void *) &levalui); nscols = settype_cols(curtype); for (i = 0; i < nscols; i++) { rowlabels[i] = copy_string(NULL, dataset_colname(i)); rowlabels[i] = concat_strings(rowlabels[i], " = "); if (i == 0) { rows[i][0] = "$t"; } else { rows[i][0] = ""; } cells[i] = &rows[i][0]; } levalui.mw = XtVaCreateManagedWidget("mw", xbaeMatrixWidgetClass, levalui.top, XmNrows, nscols, XmNcolumns, 1, XmNvisibleRows, MAX_SET_COLS, XmNvisibleColumns, 1, XmNcolumnWidths, column_widths, XmNcolumnMaxLengths, column_maxlengths, XmNrowLabels, rowlabels, XmNrowLabelWidth, 6, XmNrowLabelAlignment, XmALIGNMENT_CENTER, XmNcells, cells, XmNgridType, XmGRID_CELL_SHADOW, XmNcellShadowType, XmSHADOW_ETCHED_OUT, XmNcellShadowThickness, 2, XmNaltRowCount, 0, XmNallowColumnResize, True, NULL); XtAddCallback(levalui.mw, XmNleaveCellCallback, leaveCB, &levalui); CreateAACDialog(levalui.top, levalui.mw, leval_aac_cb, NULL); } RaiseWindow(GetParent(levalui.top)); unset_wait_cursor(); } static int leval_aac_cb(void *data) { int i, nscols, type; double start, stop; int npts; char *formula[MAX_SET_COLS]; int res; int setno, gno; grarr *t; gno = levalui.gno; type = GetOptionChoice(levalui.set_type); nscols = settype_cols(type); if (xv_evalexpr(levalui.start, &start) != RETURN_SUCCESS) { errmsg("Start item undefined"); return RETURN_FAILURE; } if (xv_evalexpr(levalui.stop, &stop) != RETURN_SUCCESS) { errmsg("Stop item undefined"); return RETURN_FAILURE; } if (xv_evalexpri(levalui.npts, &npts) != RETURN_SUCCESS) { errmsg("Number of points undefined"); return RETURN_FAILURE; } XbaeMatrixCommitEdit(levalui.mw, False); for (i = 0; i < nscols; i++) { formula[i] = XbaeMatrixGetCell(levalui.mw, i, 0); } t = get_parser_arr_by_name("$t"); if (t == NULL) { t = define_parser_arr("$t"); if (t == NULL) { errmsg("Internal error"); return RETURN_FAILURE; } } if (t->length != 0) { xfree(t->data); t->length = 0; } t->data = allocate_mesh(start, stop, npts); if (t->data == NULL) { return RETURN_FAILURE; } t->length = npts; setno = nextset(gno); set_dataset_type(gno, setno, type); set_set_hidden(gno, setno, FALSE); if (setlength(gno, setno, npts) != RETURN_SUCCESS) { killset(gno, setno); XCFREE(t->data); t->length = 0; return RETURN_FAILURE; } set_parser_setno(gno, setno); for (i = 0; i < nscols; i++) { char buf[32], *expr; /* preparing the expression */ sprintf(buf, "GRAPH[%d].SET[%d].%s = ", gno, setno, dataset_colname(i)); expr = copy_string(NULL, buf); expr = concat_strings(expr, formula[i]); /* evaluate the expression */ res = scanner(expr); xfree(expr); if (res != RETURN_SUCCESS) { killset(gno, setno); XCFREE(t->data); t->length = 0; return RETURN_FAILURE; } } XCFREE(t->data); t->length = 0; update_set_lists(gno); xdrawgraph(); return RETURN_SUCCESS; } grace-5.1.23/src/mfdrv.h0000644000076500001440000000321110071615562014506 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" #define GMF_VERSION "0.9" int mfinitgraphics(void); void mf_drawpixel(VPoint vp); void mf_drawpolyline(VPoint *vps, int n, int mode); void mf_fillpolygon(VPoint *vps, int nc); void mf_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void mf_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void mf_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void mf_puttext (VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void mf_leavegraphics(void); grace-5.1.23/src/Tab.h0000644000076500001440000000274410102537630014102 0ustar fnevgenyusers /************************************************************************* * Version 1.1 on July-30-1997 * (c) 1997 Pralay Dakua (pkanti@hotmail.com) * * This is a free software and permission to use, modify, distribute, * selling and using for commercial purpose is hereby granted provided * that THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE * INCLUDED IN ALL COPIES AND THEIR SUPPORTING DOCUMENTATIONS. * * There is no warranty for this software. In no event Pralay Dakua * will be liable for merchantability and fitness of the software and * damages due to this software. * * Author: * Pralay Dakua (pkanti@hotmail.com) * **************************************************************************/ #ifndef __TAB_H__ #define __TAB_H__ #include #ifdef __cplusplus extern "C" { #endif extern WidgetClass xmTabWidgetClass; typedef struct _XmTabClassRec *XmTabWidgetClass; typedef struct _XmTabRec *XmTabWidget; #define XmNresizeChildren "resizeChildren" #define XmCResizeChildren "ResizeChildren" /***** constraint resource name//representations ****/ #define XmNtabLabel "tabLabel" #define XmCTabLabel "TabLabel" typedef struct { int reason; XEvent *event; Widget tab_child; XmString tab_label; }XmTabCallbackStruct; extern void XmTabSetTabWidget(Widget, Widget, Boolean); extern Widget XmTabGetTabWidget(Widget); #ifdef __cplusplus } /* Close scope of 'extern "C"' declaration which encloses file. */ #endif #endif /** __TAB_H__ **/ grace-5.1.23/src/patterns.h0000644000076500001440000002342110071615562015235 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __PATTERNS_H_ #define __PATTERNS_H_ static unsigned char pat0_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char pat1_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; static unsigned char pat2_bits[] = { 0xee, 0xee, 0xff, 0xff, 0xbb, 0xbb, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xbb, 0xbb, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xbb, 0xbb, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xbb, 0xbb, 0xff, 0xff}; static unsigned char pat3_bits[] = { 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb, 0xee, 0xee, 0xbb, 0xbb}; static unsigned char pat4_bits[] = { 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa}; static unsigned char pat5_bits[] = { 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; static unsigned char pat6_bits[] = { 0x11, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0x00}; static unsigned char pat7_bits[] = { 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char pat8_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static unsigned char pat9_bits[] = { 0x1e, 0x1e, 0x0f, 0x0f, 0x87, 0x87, 0xc3, 0xc3, 0xe1, 0xe1, 0xf0, 0xf0, 0x78, 0x78, 0x3c, 0x3c, 0x1e, 0x1e, 0x0f, 0x0f, 0x87, 0x87, 0xc3, 0xc3, 0xe1, 0xe1, 0xf0, 0xf0, 0x78, 0x78, 0x3c, 0x3c}; static unsigned char pat10_bits[] = { 0x78, 0x78, 0xf0, 0xf0, 0xe1, 0xe1, 0xc3, 0xc3, 0x87, 0x87, 0x0f, 0x0f, 0x1e, 0x1e, 0x3c, 0x3c, 0x78, 0x78, 0xf0, 0xf0, 0xe1, 0xe1, 0xc3, 0xc3, 0x87, 0x87, 0x0f, 0x0f, 0x1e, 0x1e, 0x3c, 0x3c}; static unsigned char pat11_bits[] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33}; static unsigned char pat12_bits[] = { 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}; static unsigned char pat13_bits[] = { 0x81, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0x42, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0x42, 0x81, 0x81}; static unsigned char pat14_bits[] = { 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01}; static unsigned char pat15_bits[] = { 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80}; static unsigned char pat16_bits[] = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22}; static unsigned char pat17_bits[] = { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}; static unsigned char pat18_bits[] = { 0x22, 0x22, 0xff, 0xff, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xff, 0xff, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xff, 0xff, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0xff, 0xff, 0x22, 0x22, 0x22, 0x22}; static unsigned char pat19_bits[] = { 0xff, 0xff, 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0xff, 0xff, 0xff, 0xff, 0x33, 0x33, 0x33, 0x33}; static unsigned char pat20_bits[] = { 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0}; static unsigned char pat21_bits[] = { 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff}; static unsigned char pat22_bits[] = { 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}; static unsigned char pat23_bits[] = { 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03}; static unsigned char pat24_bits[] = { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xff, 0xff, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xff, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xff, 0xff, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xff, 0xff}; static unsigned char pat25_bits[] = { 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0xff, 0xff, 0xff, 0xff}; static unsigned char pat26_bits[] = { 0x11, 0x11, 0xb8, 0xb8, 0x7c, 0x7c, 0x3a, 0x3a, 0x11, 0x11, 0xa3, 0xa3, 0xc7, 0xc7, 0x8b, 0x8b, 0x11, 0x11, 0xb8, 0xb8, 0x7c, 0x7c, 0x3a, 0x3a, 0x11, 0x11, 0xa3, 0xa3, 0xc7, 0xc7, 0x8b, 0x8b}; static unsigned char pat27_bits[] = { 0x10, 0x10, 0x10, 0x10, 0x28, 0x28, 0xc7, 0xc7, 0x01, 0x01, 0x01, 0x01, 0x82, 0x82, 0x7c, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x28, 0x28, 0xc7, 0xc7, 0x01, 0x01, 0x01, 0x01, 0x82, 0x82, 0x7c, 0x7c}; static unsigned char pat28_bits[] = { 0x1c, 0x1c, 0x12, 0x12, 0x11, 0x11, 0x21, 0x21, 0xc1, 0xc1, 0x21, 0x21, 0x11, 0x11, 0x12, 0x12, 0x1c, 0x1c, 0x12, 0x12, 0x11, 0x11, 0x21, 0x21, 0xc1, 0xc1, 0x21, 0x21, 0x11, 0x11, 0x12, 0x12}; static unsigned char pat29_bits[] = { 0x3e, 0x3e, 0x41, 0x41, 0x80, 0x80, 0x80, 0x80, 0xe3, 0xe3, 0x14, 0x14, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x3e, 0x41, 0x41, 0x80, 0x80, 0x80, 0x80, 0xe3, 0xe3, 0x14, 0x14, 0x08, 0x08, 0x08, 0x08}; static unsigned char pat30_bits[] = { 0x48, 0x48, 0x88, 0x88, 0x84, 0x84, 0x83, 0x83, 0x84, 0x84, 0x88, 0x88, 0x48, 0x48, 0x38, 0x38, 0x48, 0x48, 0x88, 0x88, 0x84, 0x84, 0x83, 0x83, 0x84, 0x84, 0x88, 0x88, 0x48, 0x48, 0x38, 0x38}; static unsigned char pat31_bits[] = { 0x03, 0x03, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x12, 0x12, 0x21, 0x21, 0xc0, 0xc0, 0x03, 0x03, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x12, 0x12, 0x21, 0x21, 0xc0, 0xc0}; static unsigned char *pat_bits[MAXPATTERNS] = { pat0_bits, pat1_bits, pat2_bits, pat3_bits, pat4_bits, pat5_bits, pat6_bits, pat7_bits, pat8_bits, pat9_bits, pat10_bits, pat11_bits, pat12_bits, pat13_bits, pat14_bits, pat15_bits, pat16_bits, pat17_bits, pat18_bits, pat19_bits, pat20_bits, pat21_bits, pat22_bits, pat23_bits, pat24_bits, pat25_bits, pat26_bits, pat27_bits, pat28_bits, pat29_bits, pat30_bits, pat31_bits, }; static char dash_array0[2] = {0, 1}; static char dash_array1[2] = {1, 0}; static char dash_array2[2] = {1, 3}; static char dash_array3[2] = {5, 3}; static char dash_array4[2] = {7, 3}; static char dash_array5[4] = {1, 3, 5, 3}; static char dash_array6[4] = {1, 3, 7, 3}; static char dash_array7[6] = {1, 3, 5, 3, 1, 3}; static char dash_array8[6] = {5, 3, 1, 3, 5, 3}; static char *dash_array[MAXLINESTYLES] = { dash_array0, dash_array1, dash_array2, dash_array3, dash_array4, dash_array5, dash_array6, dash_array7, dash_array8 }; static int dash_array_length[] = {2, 2, 2, 2, 2, 4, 4, 6, 6}; #endif /* __PATTERNS_H_ */ grace-5.1.23/src/graphutils.c0000644000076500001440000005723010565160206015555 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * utilities for graphs * */ #include #include #include #include "globals.h" #include "utils.h" #include "draw.h" #include "device.h" #include "graphs.h" #include "graphutils.h" #include "protos.h" extern char print_file[]; static void auto_ticks(int gno, int axis); char *get_format_types(int f) { char *s; s = "decimal"; switch (f) { case FORMAT_DECIMAL: s = "decimal"; break; case FORMAT_EXPONENTIAL: s = "exponential"; break; case FORMAT_GENERAL: s = "general"; break; case FORMAT_POWER: s = "power"; break; case FORMAT_SCIENTIFIC: s = "scientific"; break; case FORMAT_ENGINEERING: s = "engineering"; break; case FORMAT_COMPUTING: s = "computing"; break; case FORMAT_DDMMYY: s = "ddmmyy"; break; case FORMAT_MMDDYY: s = "mmddyy"; break; case FORMAT_YYMMDD: s = "yymmdd"; break; case FORMAT_MMYY: s = "mmyy"; break; case FORMAT_MMDD: s = "mmdd"; break; case FORMAT_MONTHDAY: s = "monthday"; break; case FORMAT_DAYMONTH: s = "daymonth"; break; case FORMAT_MONTHS: s = "months"; break; case FORMAT_MONTHSY: s = "monthsy"; break; case FORMAT_MONTHL: s = "monthl"; break; case FORMAT_DAYOFWEEKS: s = "dayofweeks"; break; case FORMAT_DAYOFWEEKL: s = "dayofweekl"; break; case FORMAT_DAYOFYEAR: s = "dayofyear"; break; case FORMAT_HMS: s = "hms"; break; case FORMAT_MMDDHMS: s = "mmddhms"; break; case FORMAT_MMDDYYHMS: s = "mmddyyhms"; break; case FORMAT_YYMMDDHMS: s = "yymmddhms"; break; case FORMAT_DEGREESLON: s = "degreeslon"; break; case FORMAT_DEGREESMMLON: s = "degreesmmlon"; break; case FORMAT_DEGREESMMSSLON: s = "degreesmmsslon"; break; case FORMAT_MMSSLON: s = "mmsslon"; break; case FORMAT_DEGREESLAT: s = "degreeslat"; break; case FORMAT_DEGREESMMLAT: s = "degreesmmlat"; break; case FORMAT_DEGREESMMSSLAT: s = "degreesmmsslat"; break; case FORMAT_MMSSLAT: s = "mmsslat"; break; default: s = "unknown"; errmsg("Internal error in get_format_types()"); break; } return s; } int wipeout(void) { if (!noask && is_dirtystate()) { if (!yesno("Abandon unsaved changes?", NULL, NULL, NULL)) { return 1; } } kill_all_graphs(); do_clear_lines(); do_clear_boxes(); do_clear_ellipses(); do_clear_text(); kill_all_regions(); reset_project_version(); map_fonts(FONT_MAP_DEFAULT); set_docname(NULL); set_project_description(NULL); print_file[0] = '\0'; /* a hack! the global "curtype" (as well as all others) should be removed */ curtype = SET_XY; clear_dirtystate(); return 0; } /* The following routines determine default axis range and tickmarks */ static void autorange_byset(int gno, int setno, int autos_type); static double nicenum(double x, int nrange, int round); #define NICE_FLOOR 0 #define NICE_CEIL 1 #define NICE_ROUND 2 void autotick_axis(int gno, int axis) { switch (axis) { case ALL_AXES: auto_ticks(gno, X_AXIS); auto_ticks(gno, ZX_AXIS); auto_ticks(gno, Y_AXIS); auto_ticks(gno, ZY_AXIS); break; case ALL_X_AXES: auto_ticks(gno, X_AXIS); auto_ticks(gno, ZX_AXIS); break; case ALL_Y_AXES: auto_ticks(gno, Y_AXIS); auto_ticks(gno, ZY_AXIS); break; default: auto_ticks(gno, axis); break; } } void autoscale_byset(int gno, int setno, int autos_type) { if ((setno == ALL_SETS && is_valid_gno(gno)) || is_set_active(gno, setno)) { autorange_byset(gno, setno, autos_type); switch (autos_type) { case AUTOSCALE_X: autotick_axis(gno, ALL_X_AXES); break; case AUTOSCALE_Y: autotick_axis(gno, ALL_Y_AXES); break; case AUTOSCALE_XY: autotick_axis(gno, ALL_AXES); break; } } } int autoscale_graph(int gno, int autos_type) { if (number_of_active_sets(gno) > 0) { autoscale_byset(gno, ALL_SETS, autos_type); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } static void round_axis_limits(double *amin, double *amax, int scale) { double smin, smax; int nrange; if (*amin == *amax) { switch (sign(*amin)) { case 0: *amin = -1.0; *amax = +1.0; break; case 1: *amin /= 2.0; *amax *= 2.0; break; case -1: *amin *= 2.0; *amax /= 2.0; break; } } if (scale == SCALE_LOG) { if (*amax <= 0.0) { errmsg("Can't autoscale a log axis by non-positive data"); *amax = 10.0; *amin = 1.0; return; } else if (*amin <= 0.0) { errmsg("Data have non-positive values"); *amin = *amax/1.0e3; } smin = log10(*amin); smax = log10(*amax); } else if (scale == SCALE_LOGIT) { if (*amax <= 0.0) { errmsg("Can't autoscale a logit axis by non-positive data"); *amax = 0.9; *amin = 0.1; return; } else if (*amin <= 0.0) { errmsg("Data have non-positive values"); *amin = 0.1; } smin = log(*amin/(1-*amin)); smax = log(*amax/(1-*amax)); } else { smin = *amin; smax = *amax; } if (sign(smin) == sign(smax)) { nrange = -rint(log10(fabs(2*(smax - smin)/(smax + smin)))); nrange = MAX2(0, nrange); } else { nrange = 0; } smin = nicenum(smin, nrange, NICE_FLOOR); smax = nicenum(smax, nrange, NICE_CEIL); if (sign(smin) == sign(smax)) { if (smax/smin > 5.0) { smin = 0.0; } else if (smin/smax > 5.0) { smax = 0.0; } } if (scale == SCALE_LOG) { *amin = pow(10.0, smin); *amax = pow(10.0, smax); } else if (scale == SCALE_LOGIT) { *amin = exp(smin)/(1.0 + exp(smin)); *amax = exp(smax)/(1.0 + exp(smax)); } else { *amin = smin; *amax = smax; } } static void autorange_byset(int gno, int setno, int autos_type) { world w; double xmax, xmin, ymax, ymin; int scale; if (autos_type == AUTOSCALE_NONE) { return; } get_graph_world(gno, &w); if (get_graph_type(gno) == GRAPH_SMITH) { if (autos_type == AUTOSCALE_X || autos_type == AUTOSCALE_XY) { w.xg1 = -1.0; w.yg1 = -1.0; } if (autos_type == AUTOSCALE_Y || autos_type == AUTOSCALE_XY) { w.xg2 = 1.0; w.yg2 = 1.0; } set_graph_world(gno, w); return; } xmin=w.xg1; xmax=w.xg2; ymin=w.yg1; ymax=w.yg2; if (autos_type == AUTOSCALE_XY) { getsetminmax(gno, setno, &xmin, &xmax, &ymin, &ymax); } else if (autos_type == AUTOSCALE_X) { getsetminmax_c(gno, setno, &xmin, &xmax, &ymin, &ymax, 2); } else if (autos_type == AUTOSCALE_Y) { getsetminmax_c(gno, setno, &xmin, &xmax, &ymin, &ymax, 1); } if (autos_type == AUTOSCALE_X || autos_type == AUTOSCALE_XY) { scale = get_graph_xscale(gno); round_axis_limits(&xmin, &xmax, scale); w.xg1 = xmin; w.xg2 = xmax; } if (autos_type == AUTOSCALE_Y || autos_type == AUTOSCALE_XY) { scale = get_graph_yscale(gno); round_axis_limits(&ymin, &ymax, scale); w.yg1 = ymin; w.yg2 = ymax; } set_graph_world(gno, w); } static void auto_ticks(int gno, int axis) { tickmarks *t; world w; double range, d, tmpmax, tmpmin; int axis_scale; t = get_graph_tickmarks(gno, axis); if (t == NULL) { return; } get_graph_world(gno, &w); if (is_xaxis(axis)) { tmpmin = w.xg1; tmpmax = w.xg2; axis_scale = get_graph_xscale(gno); } else { tmpmin = w.yg1; tmpmax = w.yg2; axis_scale = get_graph_yscale(gno); } if (axis_scale == SCALE_LOG) { if (t->tmajor <= 1.0) { t->tmajor = 10.0; } tmpmax = log10(tmpmax)/log10(t->tmajor); tmpmin = log10(tmpmin)/log10(t->tmajor); } else if (axis_scale == SCALE_LOGIT) { if (t->tmajor >= 0.5) { t->tmajor = 0.4; } tmpmax = log(tmpmax/(1-tmpmax))/log(t->tmajor/(1-t->tmajor)); tmpmin = log(tmpmin/(1-tmpmin))/log(t->tmajor/(1-t->tmajor)); } else if (t->tmajor <= 0.0) { t->tmajor = 1.0; } range = tmpmax - tmpmin; if (axis_scale == SCALE_LOG) { d = ceil(range/(t->t_autonum - 1)); t->tmajor = pow(t->tmajor, d); } else if (axis_scale == SCALE_LOGIT ){ d = ceil(range/(t->t_autonum - 1)); t->tmajor = exp(d)/(1.0 + exp(d)); } else { d = nicenum(range/(t->t_autonum - 1), 0, NICE_ROUND); t->tmajor = d; } /* alter # of minor ticks only if the current value is anomalous */ if (t->nminor < 0 || t->nminor > 10) { if (axis_scale != SCALE_LOG) { t->nminor = 1; } else { t->nminor = 8; } } set_dirtystate(); } /* * nicenum: find a "nice" number approximately equal to x */ static double nicenum(double x, int nrange, int round) { int xsign; double f, y, fexp, rx, sx; if (x == 0.0) { return(0.0); } xsign = sign(x); x = fabs(x); fexp = floor(log10(x)) - nrange; sx = x/pow(10.0, fexp)/10.0; /* scaled x */ rx = floor(sx); /* rounded x */ f = 10*(sx - rx); /* fraction between 0 and 10 */ if ((round == NICE_FLOOR && xsign == +1) || (round == NICE_CEIL && xsign == -1)) { y = (int) floor(f); } else if ((round == NICE_FLOOR && xsign == -1) || (round == NICE_CEIL && xsign == +1)) { y = (int) ceil(f); } else { /* round == NICE_ROUND */ if (f < 1.5) y = 1; else if (f < 3.) y = 2; else if (f < 7.) y = 5; else y = 10; } sx = rx + (double) y/10.0; return (xsign*sx*10.0*pow(10.0, fexp)); } /* * set scroll amount */ void scroll_proc(int value) { scrollper = value / 100.0; } void scrollinout_proc(int value) { shexper = value / 100.0; } /* * pan through world coordinates */ int graph_scroll(int type) { world w; double xmax, xmin, ymax, ymin; double dwc; int gstart, gstop, i; if (scrolling_islinked) { gstart = 0; gstop = number_of_graphs() - 1; } else { gstart = get_cg(); gstop = gstart; } for (i = gstart; i <= gstop; i++) { if (get_graph_world(i, &w) == RETURN_SUCCESS) { if (islogx(i) == TRUE) { xmin = log10(w.xg1); xmax = log10(w.xg2); } else { xmin = w.xg1; xmax = w.xg2; } if (islogy(i) == TRUE) { ymin = log10(w.yg1); ymax = log10(w.yg2); } else { ymin = w.yg1; ymax = w.yg2; } dwc = 1.0; switch (type) { case GSCROLL_LEFT: dwc = -1.0; case GSCROLL_RIGHT: dwc *= scrollper * (xmax - xmin); xmin += dwc; xmax += dwc; break; case GSCROLL_DOWN: dwc = -1.0; case GSCROLL_UP: dwc *= scrollper * (ymax - ymin); ymin += dwc; ymax += dwc; break; } if (islogx(i) == TRUE) { w.xg1 = pow(10.0, xmin); w.xg2 = pow(10.0, xmax); } else { w.xg1 = xmin; w.xg2 = xmax; } if (islogy(i) == TRUE) { w.yg1 = pow(10.0, ymin); w.yg2 = pow(10.0, ymax); } else { w.yg1 = ymin; w.yg2 = ymax; } set_graph_world(i, w); } } return RETURN_SUCCESS; } int graph_zoom(int type) { double dx, dy; double xmax, xmin, ymax, ymin; world w; int gstart, gstop, gno; if (scrolling_islinked) { gstart = 0; gstop = number_of_graphs() - 1; } else { gstart = get_cg(); gstop = gstart; } for (gno = gstart; gno <= gstop; gno++) { if (get_graph_world(gno, &w) == RETURN_SUCCESS) { if (islogx(gno) == TRUE) { xmin = log10(w.xg1); xmax = log10(w.xg2); } else { xmin = w.xg1; xmax = w.xg2; } if (islogy(gno) == TRUE) { ymin = log10(w.yg1); ymax = log10(w.yg2); } else { ymin = w.yg1; ymax = w.yg2; } dx = shexper * (xmax - xmin); dy = shexper * (ymax - ymin); if (type == GZOOM_SHRINK) { dx *= -1; dy *= -1; } xmin -= dx; xmax += dx; ymin -= dy; ymax += dy; if (islogx(gno) == TRUE) { w.xg1 = pow(10.0, xmin); w.xg2 = pow(10.0, xmax); } else { w.xg1 = xmin; w.xg2 = xmax; } if (islogy(gno) == TRUE) { w.yg1 = pow(10.0, ymin); w.yg2 = pow(10.0, ymax); } else { w.yg1 = ymin; w.yg2 = ymax; } set_graph_world(gno, w); } } return RETURN_SUCCESS; } /* * Arrange graphs */ int arrange_graphs(int *graphs, int ngraphs, int nrows, int ncols, int order, int snake, double loff, double roff, double toff, double boff, double vgap, double hgap, int hpack, int vpack) { int i, imax, j, jmax, iw, ih, ng, gno; double pw, ph, w, h; view v; if (hpack) { hgap = 0.0; } if (vpack) { vgap = 0.0; } if (ncols < 1 || nrows < 1) { errmsg("# of rows and columns must be > 0"); return RETURN_FAILURE; } if (hgap < 0.0 || vgap < 0.0) { errmsg("hgap and vgap must be >= 0"); return RETURN_FAILURE; } get_page_viewport(&pw, &ph); w = (pw - loff - roff)/(ncols + (ncols - 1)*hgap); h = (ph - toff - boff)/(nrows + (nrows - 1)*vgap); if (h <= 0.0 || w <= 0.0) { errmsg("Page offsets are too large"); return RETURN_FAILURE; } ng = 0; if (order & GA_ORDER_HV_INV) { imax = ncols; jmax = nrows; } else { imax = nrows; jmax = ncols; } for (i = 0; i < imax && ng < ngraphs; i++) { for (j = 0; j < jmax && ng < ngraphs; j++) { gno = graphs[ng]; set_graph_active(gno); if (order & GA_ORDER_HV_INV) { iw = i; ih = j; if (snake && (iw % 2)) { ih = nrows - ih - 1; } } else { iw = j; ih = i; if (snake && (ih % 2)) { iw = ncols - iw - 1; } } if (order & GA_ORDER_H_INV) { iw = ncols - iw - 1; } /* viewport y coord goes bottom -> top ! */ if (!(order & GA_ORDER_V_INV)) { ih = nrows - ih - 1; } v.xv1 = loff + iw*w*(1.0 + hgap); v.xv2 = v.xv1 + w; v.yv1 = boff + ih*h*(1.0 + vgap); v.yv2 = v.yv1 + h; set_graph_viewport(gno, v); if (hpack) { if (iw == 0) { tickmarks *t = get_graph_tickmarks(gno, Y_AXIS); if (!t) { continue; } t->active = TRUE; t->label_op = PLACEMENT_NORMAL; t->t_op = PLACEMENT_NORMAL; t->tl_op = PLACEMENT_NORMAL; } else { activate_tick_labels(gno, Y_AXIS, FALSE); } } if (vpack) { if (ih == 0) { tickmarks *t = get_graph_tickmarks(gno, X_AXIS); if (!t) { continue; } t->active = TRUE; t->label_op = PLACEMENT_NORMAL; t->t_op = PLACEMENT_NORMAL; t->tl_op = PLACEMENT_NORMAL; } else { activate_tick_labels(gno, X_AXIS, FALSE); } } ng++; } } return RETURN_SUCCESS; } int arrange_graphs_simple(int nrows, int ncols, int order, int snake, double offset, double hgap, double vgap) { int *graphs, i, ngraphs, retval; ngraphs = nrows*ncols; graphs = xmalloc(ngraphs*SIZEOF_INT); if (graphs == NULL) { return RETURN_FAILURE; } for (i = 0; i < ngraphs; i++) { graphs[i] = i; } for (i = number_of_graphs() - 1; i >= ngraphs; i--) { kill_graph(i); } retval = arrange_graphs(graphs, ngraphs, nrows, ncols, order, snake, offset, offset, offset, offset, vgap, hgap, FALSE, FALSE); xfree(graphs); return retval; } void move_legend(int gno, VVector shift) { double xtmp, ytmp; legend l; if (is_valid_gno(gno)) { get_graph_legend(gno, &l); if (l.loctype == COORD_VIEW) { l.legx += shift.x; l.legy += shift.y; } else { world2view(l.legx, l.legy, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &l.legx, &l.legy); } set_graph_legend(gno, &l); set_dirtystate(); } } void move_timestamp(VVector shift) { timestamp.x += shift.x; timestamp.y += shift.y; set_dirtystate(); } void rescale_viewport(double ext_x, double ext_y) { int i, gno; view v; legend leg; linetype l; boxtype b; ellipsetype e; plotstr s; for (gno = 0; gno < number_of_graphs(); gno++) { get_graph_viewport(gno, &v); v.xv1 *= ext_x; v.xv2 *= ext_x; v.yv1 *= ext_y; v.yv2 *= ext_y; set_graph_viewport(gno, v); get_graph_legend(gno, &leg); if (leg.loctype == COORD_VIEW) { leg.legx *= ext_x; leg.legy *= ext_y; set_graph_legend(gno, &leg); } /* TODO: tickmark offsets */ } for (i = 0; i < number_of_lines(); i++) { get_graph_line(i, &l); if (l.loctype == COORD_VIEW) { l.x1 *= ext_x; l.x2 *= ext_x; l.y1 *= ext_y; l.y2 *= ext_y; set_graph_line(i, &l); } } for (i = 0; i < number_of_boxes(); i++) { get_graph_box(i, &b); if (b.loctype == COORD_VIEW) { b.x1 *= ext_x; b.x2 *= ext_x; b.y1 *= ext_y; b.y2 *= ext_y; set_graph_box(i, &b); } } for (i = 0; i < number_of_ellipses(); i++) { get_graph_ellipse(i, &e); if (e.loctype == COORD_VIEW) { e.x1 *= ext_x; e.x2 *= ext_x; e.y1 *= ext_y; e.y2 *= ext_y; set_graph_ellipse(i, &e); } } for (i = 0; i < number_of_strings(); i++) { get_graph_string(i, &s); if (s.loctype == COORD_VIEW) { s.x *= ext_x; s.y *= ext_y; set_graph_string(i, &s); } } } int overlay_graphs(int gsec, int gpri, int type) { int i; tickmarks *tsec, *tpri; world wpri, wsec; view v; if (gsec == gpri) { return RETURN_FAILURE; } if (is_valid_gno(gpri) == FALSE || is_valid_gno(gsec) == FALSE) { return RETURN_FAILURE; } get_graph_viewport(gpri, &v); get_graph_world(gpri, &wpri); get_graph_world(gsec, &wsec); switch (type) { case GOVERLAY_SMART_AXES_XY: wsec = wpri; for (i = 0; i < MAXAXES; i++) { tpri = get_graph_tickmarks(gpri, i); tsec = get_graph_tickmarks(gsec, i); switch(i) { case X_AXIS: case Y_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_BOTH; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = FALSE; break; default: /* don't touch alternative axes */ break; } } break; case GOVERLAY_SMART_AXES_X: wsec.xg1 = wpri.xg1; wsec.xg2 = wpri.xg2; for (i = 0; i < MAXAXES; i++) { tpri = get_graph_tickmarks(gpri, i); tsec = get_graph_tickmarks(gsec, i); switch(i) { case X_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_BOTH; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = FALSE; break; case Y_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_NORMAL; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = TRUE; tsec->label_op = PLACEMENT_OPPOSITE; tsec->t_op = PLACEMENT_OPPOSITE; tsec->tl_op = PLACEMENT_OPPOSITE; break; default: /* don't touch alternative axes */ break; } } break; case GOVERLAY_SMART_AXES_Y: wsec.yg1 = wpri.yg1; wsec.yg2 = wpri.yg2; for (i = 0; i < MAXAXES; i++) { tpri = get_graph_tickmarks(gpri, i); tsec = get_graph_tickmarks(gsec, i); switch(i) { case X_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_NORMAL; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = TRUE; tsec->label_op = PLACEMENT_OPPOSITE; tsec->t_op = PLACEMENT_OPPOSITE; tsec->tl_op = PLACEMENT_OPPOSITE; break; case Y_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_BOTH; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = FALSE; break; default: /* don't touch alternative axes */ break; } } break; case GOVERLAY_SMART_AXES_NONE: for (i = 0; i < MAXAXES; i++) { tpri = get_graph_tickmarks(gpri, i); tsec = get_graph_tickmarks(gsec, i); switch(i) { case X_AXIS: case Y_AXIS: tpri->active = TRUE; tpri->label_op = PLACEMENT_NORMAL; tpri->t_op = PLACEMENT_NORMAL; tpri->tl_op = PLACEMENT_NORMAL; tsec->active = TRUE; tsec->label_op = PLACEMENT_OPPOSITE; tsec->t_op = PLACEMENT_OPPOSITE; tsec->tl_op = PLACEMENT_OPPOSITE; break; default: /* don't touch alternative axes */ break; } } break; default: break; } /* set identical viewports */ set_graph_viewport(gsec, v); /* update world coords */ set_graph_world(gsec, wsec); return RETURN_SUCCESS; } grace-5.1.23/src/lmdif.c0000644000076500001440000014036610071615561014472 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* -- translated by f2c (version 19960717). */ #include #include #include "f2c.h" /* Table of constant values */ static integer c__1 = 1; static logical c_true = TRUE_; static integer c__2 = 2; /* Subroutine */ int qrfac_(integer *m, integer *n, doublereal *a, integer * lda, logical *pivot, integer *ipvt, integer *lipvt, doublereal *rdiag, doublereal *acnorm, doublereal *wa); /* Subroutine */ int lmpar_(integer *n, doublereal *r__, integer *ldr, integer *ipvt, doublereal *diag, doublereal *qtb, doublereal *delta, doublereal *par, doublereal *x, doublereal *sdiag, doublereal *wa1, doublereal *wa2); /* Subroutine */ int qrsolv_(integer *n, doublereal *r__, integer *ldr, integer *ipvt, doublereal *diag, doublereal *qtb, doublereal *x, doublereal *sdiag, doublereal *wa); doublereal dpmpar_(integer *i) { switch ((int) *i) { case 1: return (doublereal) MACHEP; break; case 2: return (doublereal) UFLOWTHRESH; break; case 3: return (doublereal) MAXNUM; break; default: return (doublereal) 0; } } doublereal enorm_(integer *n, doublereal *x) { /* Initialized data */ static doublereal one = 1.; static doublereal zero = 0.; static doublereal rdwarf = 3.834e-20; static doublereal rgiant = 1.304e19; /* System generated locals */ integer i__1; doublereal ret_val = 0.0, d__1; /* Local variables */ static integer i__; static doublereal s1, s2, s3, xabs, x1max, x3max, agiant, floatn; /* ********** */ /* function enorm */ /* given an n-vector x, this function calculates the */ /* euclidean norm of x. */ /* the euclidean norm is computed by accumulating the sum of */ /* squares in three different sums. the sums of squares for the */ /* small and large components are scaled so that no overflows */ /* occur. non-destructive underflows are permitted. underflows */ /* and overflows do not occur in the computation of the unscaled */ /* sum of squares for the intermediate components. */ /* the definitions of small, intermediate and large components */ /* depend on two constants, rdwarf and rgiant. the main */ /* restrictions on these constants are that rdwarf**2 not */ /* underflow and rgiant**2 not overflow. the constants */ /* given here are suitable for every known computer. */ /* the function statement is */ /* double precision function enorm(n,x) */ /* where */ /* n is a positive integer input variable. */ /* x is an input array of length n. */ /* subprograms called */ /* fortran-supplied ... dabs,dsqrt */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --x; /* Function Body */ s1 = zero; s2 = zero; s3 = zero; x1max = zero; x3max = zero; floatn = (doublereal) (*n); agiant = rgiant / floatn; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { xabs = (d__1 = x[i__], abs(d__1)); if (xabs > rdwarf && xabs < agiant) { goto L70; } if (xabs <= rdwarf) { goto L30; } /* sum for large components. */ if (xabs <= x1max) { goto L10; } /* Computing 2nd power */ d__1 = x1max / xabs; s1 = one + s1 * (d__1 * d__1); x1max = xabs; goto L20; L10: /* Computing 2nd power */ d__1 = xabs / x1max; s1 += d__1 * d__1; L20: goto L60; L30: /* sum for small components. */ if (xabs <= x3max) { goto L40; } /* Computing 2nd power */ d__1 = x3max / xabs; s3 = one + s3 * (d__1 * d__1); x3max = xabs; goto L50; L40: if (xabs != zero) { /* Computing 2nd power */ d__1 = xabs / x3max; s3 += d__1 * d__1; } L50: L60: goto L80; L70: /* sum for intermediate components. */ /* Computing 2nd power */ d__1 = xabs; s2 += d__1 * d__1; L80: /* L90: */ ; } /* calculation of norm. */ if (s1 == zero) { goto L100; } ret_val = x1max * sqrt(s1 + s2 / x1max / x1max); goto L130; L100: if (s2 == zero) { goto L110; } if (s2 >= x3max) { ret_val = sqrt(s2 * (one + x3max / s2 * (x3max * s3))); } if (s2 < x3max) { ret_val = sqrt(x3max * (s2 / x3max + x3max * s3)); } goto L120; L110: ret_val = x3max * sqrt(s3); L120: L130: return ret_val; /* last card of function enorm. */ } /* enorm_ */ /* Subroutine */ int fdjac2_(S_fp fcn, integer *m, integer *n, doublereal *x, doublereal *fvec, doublereal *fjac, integer *ldfjac, integer *iflag, doublereal *epsfcn, doublereal *wa) { /* Initialized data */ static doublereal zero = 0.; /* System generated locals */ integer fjac_dim1, fjac_offset, i__1, i__2; /* Local variables */ static doublereal h__; static integer i__, j; static doublereal eps, temp, epsmch; /* ********** */ /* subroutine fdjac2 */ /* this subroutine computes a forward-difference approximation */ /* to the m by n jacobian matrix associated with a specified */ /* problem of m functions in n variables. */ /* the subroutine statement is */ /* subroutine fdjac2(fcn,m,n,x,fvec,fjac,ldfjac,iflag,epsfcn,wa) */ /* where */ /* fcn is the name of the user-supplied subroutine which */ /* calculates the functions. fcn must be declared */ /* in an external statement in the user calling */ /* program, and should be written as follows. */ /* subroutine fcn(m,n,x,fvec,iflag) */ /* integer m,n,iflag */ /* double precision x(n),fvec(m) */ /* ---------- */ /* calculate the functions at x and */ /* return this vector in fvec. */ /* ---------- */ /* return */ /* end */ /* the value of iflag should not be changed by fcn unless */ /* the user wants to terminate execution of fdjac2. */ /* in this case set iflag to a negative integer. */ /* m is a positive integer input variable set to the number */ /* of functions. */ /* n is a positive integer input variable set to the number */ /* of variables. n must not exceed m. */ /* x is an input array of length n. */ /* fvec is an input array of length m which must contain the */ /* functions evaluated at x. */ /* fjac is an output m by n array which contains the */ /* approximation to the jacobian matrix evaluated at x. */ /* ldfjac is a positive integer input variable not less than m */ /* which specifies the leading dimension of the array fjac. */ /* iflag is an integer variable which can be used to terminate */ /* the execution of fdjac2. see description of fcn. */ /* epsfcn is an input variable used in determining a suitable */ /* step length for the forward-difference approximation. this */ /* approximation assumes that the relative errors in the */ /* functions are of the order of epsfcn. if epsfcn is less */ /* than the machine precision, it is assumed that the relative */ /* errors in the functions are of the order of the machine */ /* precision. */ /* wa is a work array of length m. */ /* subprograms called */ /* user-supplied ...... fcn */ /* minpack-supplied ... dpmpar */ /* fortran-supplied ... dabs,dmax1,dsqrt */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa; --fvec; --x; fjac_dim1 = *ldfjac; fjac_offset = fjac_dim1 + 1; fjac -= fjac_offset; /* Function Body */ /* epsmch is the machine precision. */ epsmch = dpmpar_(&c__1); eps = sqrt((max(*epsfcn,epsmch))); i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; h__ = eps * abs(temp); if (h__ == zero) { h__ = eps; } x[j] = temp + h__; (*fcn)(m, n, &x[1], &wa[1], iflag); if (*iflag < 0) { goto L30; } x[j] = temp; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { fjac[i__ + j * fjac_dim1] = (wa[i__] - fvec[i__]) / h__; /* L10: */ } /* L20: */ } L30: return 0; /* last card of subroutine fdjac2. */ } /* fdjac2_ */ /* Subroutine */ int lmdif_(S_fp fcn, integer *m, integer *n, doublereal *x, doublereal *fvec, doublereal *ftol, doublereal *xtol, doublereal * gtol, integer *maxfev, doublereal *epsfcn, doublereal *diag, integer * mode, doublereal *factor, integer *nprint, integer *info, integer * nfev, doublereal *fjac, integer *ldfjac, integer *ipvt, doublereal * qtf, doublereal *wa1, doublereal *wa2, doublereal *wa3, doublereal * wa4) { /* Initialized data */ static doublereal one = 1.; static doublereal p1 = .1; static doublereal p5 = .5; static doublereal p25 = .25; static doublereal p75 = .75; static doublereal p0001 = 1e-4; static doublereal zero = 0.; /* System generated locals */ integer fjac_dim1, fjac_offset, i__1, i__2; doublereal d__1, d__2, d__3; /* Local variables */ static integer i__, j, l; static doublereal par, sum; static integer iter; static doublereal temp, temp1, temp2; static integer iflag; static doublereal delta; static doublereal ratio; static doublereal fnorm, gnorm; static doublereal pnorm, xnorm, fnorm1, actred, dirder, epsmch, prered; /* ********** */ /* subroutine lmdif */ /* the purpose of lmdif is to minimize the sum of the squares of */ /* m nonlinear functions in n variables by a modification of */ /* the levenberg-marquardt algorithm. the user must provide a */ /* subroutine which calculates the functions. the jacobian is */ /* then calculated by a forward-difference approximation. */ /* the subroutine statement is */ /* subroutine lmdif(fcn,m,n,x,fvec,ftol,xtol,gtol,maxfev,epsfcn, */ /* diag,mode,factor,nprint,info,nfev,fjac, */ /* ldfjac,ipvt,qtf,wa1,wa2,wa3,wa4) */ /* where */ /* fcn is the name of the user-supplied subroutine which */ /* calculates the functions. fcn must be declared */ /* in an external statement in the user calling */ /* program, and should be written as follows. */ /* subroutine fcn(m,n,x,fvec,iflag) */ /* integer m,n,iflag */ /* double precision x(n),fvec(m) */ /* ---------- */ /* calculate the functions at x and */ /* return this vector in fvec. */ /* ---------- */ /* return */ /* end */ /* the value of iflag should not be changed by fcn unless */ /* the user wants to terminate execution of lmdif. */ /* in this case set iflag to a negative integer. */ /* m is a positive integer input variable set to the number */ /* of functions. */ /* n is a positive integer input variable set to the number */ /* of variables. n must not exceed m. */ /* x is an array of length n. on input x must contain */ /* an initial estimate of the solution vector. on output x */ /* contains the final estimate of the solution vector. */ /* fvec is an output array of length m which contains */ /* the functions evaluated at the output x. */ /* ftol is a nonnegative input variable. termination */ /* occurs when both the actual and predicted relative */ /* reductions in the sum of squares are at most ftol. */ /* therefore, ftol measures the relative error desired */ /* in the sum of squares. */ /* xtol is a nonnegative input variable. termination */ /* occurs when the relative error between two consecutive */ /* iterates is at most xtol. therefore, xtol measures the */ /* relative error desired in the approximate solution. */ /* gtol is a nonnegative input variable. termination */ /* occurs when the cosine of the angle between fvec and */ /* any column of the jacobian is at most gtol in absolute */ /* value. therefore, gtol measures the orthogonality */ /* desired between the function vector and the columns */ /* of the jacobian. */ /* maxfev is a positive integer input variable. termination */ /* occurs when the number of calls to fcn is at least */ /* maxfev by the end of an iteration. */ /* epsfcn is an input variable used in determining a suitable */ /* step length for the forward-difference approximation. this */ /* approximation assumes that the relative errors in the */ /* functions are of the order of epsfcn. if epsfcn is less */ /* than the machine precision, it is assumed that the relative */ /* errors in the functions are of the order of the machine */ /* precision. */ /* diag is an array of length n. if mode = 1 (see */ /* below), diag is internally set. if mode = 2, diag */ /* must contain positive entries that serve as */ /* multiplicative scale factors for the variables. */ /* mode is an integer input variable. if mode = 1, the */ /* variables will be scaled internally. if mode = 2, */ /* the scaling is specified by the input diag. other */ /* values of mode are equivalent to mode = 1. */ /* factor is a positive input variable used in determining the */ /* initial step bound. this bound is set to the product of */ /* factor and the euclidean norm of diag*x if nonzero, or else */ /* to factor itself. in most cases factor should lie in the */ /* interval (.1,100.). 100. is a generally recommended value. */ /* nprint is an integer input variable that enables controlled */ /* printing of iterates if it is positive. in this case, */ /* fcn is called with iflag = 0 at the beginning of the first */ /* iteration and every nprint iterations thereafter and */ /* immediately prior to return, with x and fvec available */ /* for printing. if nprint is not positive, no special calls */ /* of fcn with iflag = 0 are made. */ /* info is an integer output variable. if the user has */ /* terminated execution, info is set to the (negative) */ /* value of iflag. see description of fcn. otherwise, */ /* info is set as follows. */ /* info = 0 improper input parameters. */ /* info = 1 both actual and predicted relative reductions */ /* in the sum of squares are at most ftol. */ /* info = 2 relative error between two consecutive iterates */ /* is at most xtol. */ /* info = 3 conditions for info = 1 and info = 2 both hold. */ /* info = 4 the cosine of the angle between fvec and any */ /* column of the jacobian is at most gtol in */ /* absolute value. */ /* info = 5 number of calls to fcn has reached or */ /* exceeded maxfev. */ /* info = 6 ftol is too small. no further reduction in */ /* the sum of squares is possible. */ /* info = 7 xtol is too small. no further improvement in */ /* the approximate solution x is possible. */ /* info = 8 gtol is too small. fvec is orthogonal to the */ /* columns of the jacobian to machine precision. */ /* nfev is an integer output variable set to the number of */ /* calls to fcn. */ /* fjac is an output m by n array. the upper n by n submatrix */ /* of fjac contains an upper triangular matrix r with */ /* diagonal elements of nonincreasing magnitude such that */ /* t t t */ /* p *(jac *jac)*p = r *r, */ /* where p is a permutation matrix and jac is the final */ /* calculated jacobian. column j of p is column ipvt(j) */ /* (see below) of the identity matrix. the lower trapezoidal */ /* part of fjac contains information generated during */ /* the computation of r. */ /* ldfjac is a positive integer input variable not less than m */ /* which specifies the leading dimension of the array fjac. */ /* ipvt is an integer output array of length n. ipvt */ /* defines a permutation matrix p such that jac*p = q*r, */ /* where jac is the final calculated jacobian, q is */ /* orthogonal (not stored), and r is upper triangular */ /* with diagonal elements of nonincreasing magnitude. */ /* column j of p is column ipvt(j) of the identity matrix. */ /* qtf is an output array of length n which contains */ /* the first n elements of the vector (q transpose)*fvec. */ /* wa1, wa2, and wa3 are work arrays of length n. */ /* wa4 is a work array of length m. */ /* subprograms called */ /* user-supplied ...... fcn */ /* minpack-supplied ... dpmpar,enorm,fdjac2,lmpar,qrfac */ /* fortran-supplied ... dabs,dmax1,dmin1,dsqrt,mod */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa4; --fvec; --wa3; --wa2; --wa1; --qtf; --ipvt; --diag; --x; fjac_dim1 = *ldfjac; fjac_offset = fjac_dim1 + 1; fjac -= fjac_offset; /* Function Body */ /* epsmch is the machine precision. */ epsmch = dpmpar_(&c__1); *info = 0; iflag = 0; *nfev = 0; /* check the input parameters for errors. */ if (*n <= 0 || *m < *n || *ldfjac < *m || *ftol < zero || *xtol < zero || *gtol < zero || *maxfev <= 0 || *factor <= zero) { goto L300; } if (*mode != 2) { goto L20; } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (diag[j] <= zero) { goto L300; } /* L10: */ } L20: /* evaluate the function at the starting point */ /* and calculate its norm. */ iflag = 1; (*fcn)(m, n, &x[1], &fvec[1], &iflag); *nfev = 1; if (iflag < 0) { goto L300; } fnorm = enorm_(m, &fvec[1]); /* initialize levenberg-marquardt parameter and iteration counter. */ par = zero; iter = 1; /* beginning of the outer loop. */ L30: /* calculate the jacobian matrix. */ iflag = 2; fdjac2_((S_fp)fcn, m, n, &x[1], &fvec[1], &fjac[fjac_offset], ldfjac, & iflag, epsfcn, &wa4[1]); *nfev += *n; if (iflag < 0) { goto L300; } /* if requested, call fcn to enable printing of iterates. */ if (*nprint <= 0) { goto L40; } iflag = 0; if ((iter - 1) % *nprint == 0) { (*fcn)(m, n, &x[1], &fvec[1], &iflag); } if (iflag < 0) { goto L300; } L40: /* compute the qr factorization of the jacobian. */ qrfac_(m, n, &fjac[fjac_offset], ldfjac, &c_true, &ipvt[1], n, &wa1[1], & wa2[1], &wa3[1]); /* on the first iteration and if mode is 1, scale according */ /* to the norms of the columns of the initial jacobian. */ if (iter != 1) { goto L80; } if (*mode == 2) { goto L60; } i__1 = *n; for (j = 1; j <= i__1; ++j) { diag[j] = wa2[j]; if (wa2[j] == zero) { diag[j] = one; } /* L50: */ } L60: /* on the first iteration, calculate the norm of the scaled x */ /* and initialize the step bound delta. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { wa3[j] = diag[j] * x[j]; /* L70: */ } xnorm = enorm_(n, &wa3[1]); delta = *factor * xnorm; if (delta == zero) { delta = *factor; } L80: /* form (q transpose)*fvec and store the first n components in */ /* qtf. */ i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { wa4[i__] = fvec[i__]; /* L90: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { if (fjac[j + j * fjac_dim1] == zero) { goto L120; } sum = zero; i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { sum += fjac[i__ + j * fjac_dim1] * wa4[i__]; /* L100: */ } temp = -sum / fjac[j + j * fjac_dim1]; i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { wa4[i__] += fjac[i__ + j * fjac_dim1] * temp; /* L110: */ } L120: fjac[j + j * fjac_dim1] = wa1[j]; qtf[j] = wa4[j]; /* L130: */ } /* compute the norm of the scaled gradient. */ gnorm = zero; if (fnorm == zero) { goto L170; } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = ipvt[j]; if (wa2[l] == zero) { goto L150; } sum = zero; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { sum += fjac[i__ + j * fjac_dim1] * (qtf[i__] / fnorm); /* L140: */ } /* Computing MAX */ d__2 = gnorm, d__3 = (d__1 = sum / wa2[l], abs(d__1)); gnorm = max(d__2,d__3); L150: /* L160: */ ; } L170: /* test for convergence of the gradient norm. */ if (gnorm <= *gtol) { *info = 4; } if (*info != 0) { goto L300; } /* rescale if necessary. */ if (*mode == 2) { goto L190; } i__1 = *n; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ d__1 = diag[j], d__2 = wa2[j]; diag[j] = max(d__1,d__2); /* L180: */ } L190: /* beginning of the inner loop. */ L200: /* determine the levenberg-marquardt parameter. */ lmpar_(n, &fjac[fjac_offset], ldfjac, &ipvt[1], &diag[1], &qtf[1], &delta, &par, &wa1[1], &wa2[1], &wa3[1], &wa4[1]); /* store the direction p and x + p. calculate the norm of p. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { wa1[j] = -wa1[j]; wa2[j] = x[j] + wa1[j]; wa3[j] = diag[j] * wa1[j]; /* L210: */ } pnorm = enorm_(n, &wa3[1]); /* on the first iteration, adjust the initial step bound. */ if (iter == 1) { delta = min(delta,pnorm); } /* evaluate the function at x + p and calculate its norm. */ iflag = 1; (*fcn)(m, n, &wa2[1], &wa4[1], &iflag); ++(*nfev); if (iflag < 0) { goto L300; } fnorm1 = enorm_(m, &wa4[1]); /* compute the scaled actual reduction. */ actred = -one; if (p1 * fnorm1 < fnorm) { /* Computing 2nd power */ d__1 = fnorm1 / fnorm; actred = one - d__1 * d__1; } /* compute the scaled predicted reduction and */ /* the scaled directional derivative. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { wa3[j] = zero; l = ipvt[j]; temp = wa1[l]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { wa3[i__] += fjac[i__ + j * fjac_dim1] * temp; /* L220: */ } /* L230: */ } temp1 = enorm_(n, &wa3[1]) / fnorm; temp2 = sqrt(par) * pnorm / fnorm; /* Computing 2nd power */ d__1 = temp1; /* Computing 2nd power */ d__2 = temp2; prered = d__1 * d__1 + d__2 * d__2 / p5; /* Computing 2nd power */ d__1 = temp1; /* Computing 2nd power */ d__2 = temp2; dirder = -(d__1 * d__1 + d__2 * d__2); /* compute the ratio of the actual to the predicted */ /* reduction. */ ratio = zero; if (prered != zero) { ratio = actred / prered; } /* update the step bound. */ if (ratio > p25) { goto L240; } if (actred >= zero) { temp = p5; } if (actred < zero) { temp = p5 * dirder / (dirder + p5 * actred); } if (p1 * fnorm1 >= fnorm || temp < p1) { temp = p1; } /* Computing MIN */ d__1 = delta, d__2 = pnorm / p1; delta = temp * min(d__1,d__2); par /= temp; goto L260; L240: if (par != zero && ratio < p75) { goto L250; } delta = pnorm / p5; par = p5 * par; L250: L260: /* test for successful iteration. */ if (ratio < p0001) { goto L290; } /* successful iteration. update x, fvec, and their norms. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { x[j] = wa2[j]; wa2[j] = diag[j] * x[j]; /* L270: */ } i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { fvec[i__] = wa4[i__]; /* L280: */ } xnorm = enorm_(n, &wa2[1]); fnorm = fnorm1; ++iter; L290: /* tests for convergence. */ if (abs(actred) <= *ftol && prered <= *ftol && p5 * ratio <= one) { *info = 1; } if (delta <= *xtol * xnorm) { *info = 2; } if (abs(actred) <= *ftol && prered <= *ftol && p5 * ratio <= one && *info == 2) { *info = 3; } if (*info != 0) { goto L300; } /* tests for termination and stringent tolerances. */ if (*nfev >= *maxfev) { *info = 5; } if (abs(actred) <= epsmch && prered <= epsmch && p5 * ratio <= one) { *info = 6; } if (delta <= epsmch * xnorm) { *info = 7; } if (gnorm <= epsmch) { *info = 8; } if (*info != 0) { goto L300; } /* end of the inner loop. repeat if iteration unsuccessful. */ if (ratio < p0001) { goto L200; } /* end of the outer loop. */ goto L30; L300: /* termination, either normal or user imposed. */ if (iflag < 0) { *info = iflag; } iflag = 0; if (*nprint > 0) { (*fcn)(m, n, &x[1], &fvec[1], &iflag); } return 0; /* last card of subroutine lmdif. */ } /* lmdif_ */ /* Subroutine */ int lmpar_(integer *n, doublereal *r__, integer *ldr, integer *ipvt, doublereal *diag, doublereal *qtb, doublereal *delta, doublereal *par, doublereal *x, doublereal *sdiag, doublereal *wa1, doublereal *wa2) { /* Initialized data */ static doublereal p1 = .1; static doublereal p001 = .001; static doublereal zero = 0.; /* System generated locals */ integer r_dim1, r_offset, i__1, i__2; doublereal d__1, d__2; /* Local variables */ static integer i__, j, k, l; static doublereal fp; static integer jm1, jp1; static doublereal sum, parc, parl; static integer iter; static doublereal temp, paru, dwarf; static integer nsing; static doublereal gnorm; static doublereal dxnorm; /* ********** */ /* subroutine lmpar */ /* given an m by n matrix a, an n by n nonsingular diagonal */ /* matrix d, an m-vector b, and a positive number delta, */ /* the problem is to determine a value for the parameter */ /* par such that if x solves the system */ /* a*x = b , sqrt(par)*d*x = 0 , */ /* in the least squares sense, and dxnorm is the euclidean */ /* norm of d*x, then either par is zero and */ /* (dxnorm-delta) .le. 0.1*delta , */ /* or par is positive and */ /* abs(dxnorm-delta) .le. 0.1*delta . */ /* this subroutine completes the solution of the problem */ /* if it is provided with the necessary information from the */ /* qr factorization, with column pivoting, of a. that is, if */ /* a*p = q*r, where p is a permutation matrix, q has orthogonal */ /* columns, and r is an upper triangular matrix with diagonal */ /* elements of nonincreasing magnitude, then lmpar expects */ /* the full upper triangle of r, the permutation matrix p, */ /* and the first n components of (q transpose)*b. on output */ /* lmpar also provides an upper triangular matrix s such that */ /* t t t */ /* p *(a *a + par*d*d)*p = s *s . */ /* s is employed within lmpar and may be of separate interest. */ /* only a few iterations are generally needed for convergence */ /* of the algorithm. if, however, the limit of 10 iterations */ /* is reached, then the output par will contain the best */ /* value obtained so far. */ /* the subroutine statement is */ /* subroutine lmpar(n,r,ldr,ipvt,diag,qtb,delta,par,x,sdiag, */ /* wa1,wa2) */ /* where */ /* n is a positive integer input variable set to the order of r. */ /* r is an n by n array. on input the full upper triangle */ /* must contain the full upper triangle of the matrix r. */ /* on output the full upper triangle is unaltered, and the */ /* strict lower triangle contains the strict upper triangle */ /* (transposed) of the upper triangular matrix s. */ /* ldr is a positive integer input variable not less than n */ /* which specifies the leading dimension of the array r. */ /* ipvt is an integer input array of length n which defines the */ /* permutation matrix p such that a*p = q*r. column j of p */ /* is column ipvt(j) of the identity matrix. */ /* diag is an input array of length n which must contain the */ /* diagonal elements of the matrix d. */ /* qtb is an input array of length n which must contain the first */ /* n elements of the vector (q transpose)*b. */ /* delta is a positive input variable which specifies an upper */ /* bound on the euclidean norm of d*x. */ /* par is a nonnegative variable. on input par contains an */ /* initial estimate of the levenberg-marquardt parameter. */ /* on output par contains the final estimate. */ /* x is an output array of length n which contains the least */ /* squares solution of the system a*x = b, sqrt(par)*d*x = 0, */ /* for the output par. */ /* sdiag is an output array of length n which contains the */ /* diagonal elements of the upper triangular matrix s. */ /* wa1 and wa2 are work arrays of length n. */ /* subprograms called */ /* minpack-supplied ... dpmpar,enorm,qrsolv */ /* fortran-supplied ... dabs,dmax1,dmin1,dsqrt */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa2; --wa1; --sdiag; --x; --qtb; --diag; --ipvt; r_dim1 = *ldr; r_offset = r_dim1 + 1; r__ -= r_offset; /* Function Body */ /* dwarf is the smallest positive magnitude. */ dwarf = dpmpar_(&c__2); /* compute and store in x the gauss-newton direction. if the */ /* jacobian is rank-deficient, obtain a least squares solution. */ nsing = *n; i__1 = *n; for (j = 1; j <= i__1; ++j) { wa1[j] = qtb[j]; if (r__[j + j * r_dim1] == zero && nsing == *n) { nsing = j - 1; } if (nsing < *n) { wa1[j] = zero; } /* L10: */ } if (nsing < 1) { goto L50; } i__1 = nsing; for (k = 1; k <= i__1; ++k) { j = nsing - k + 1; wa1[j] /= r__[j + j * r_dim1]; temp = wa1[j]; jm1 = j - 1; if (jm1 < 1) { goto L30; } i__2 = jm1; for (i__ = 1; i__ <= i__2; ++i__) { wa1[i__] -= r__[i__ + j * r_dim1] * temp; /* L20: */ } L30: /* L40: */ ; } L50: i__1 = *n; for (j = 1; j <= i__1; ++j) { l = ipvt[j]; x[l] = wa1[j]; /* L60: */ } /* initialize the iteration counter. */ /* evaluate the function at the origin, and test */ /* for acceptance of the gauss-newton direction. */ iter = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { wa2[j] = diag[j] * x[j]; /* L70: */ } dxnorm = enorm_(n, &wa2[1]); fp = dxnorm - *delta; if (fp <= p1 * *delta) { goto L220; } /* if the jacobian is not rank deficient, the newton */ /* step provides a lower bound, parl, for the zero of */ /* the function. otherwise set this bound to zero. */ parl = zero; if (nsing < *n) { goto L120; } i__1 = *n; for (j = 1; j <= i__1; ++j) { l = ipvt[j]; wa1[j] = diag[l] * (wa2[l] / dxnorm); /* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = zero; jm1 = j - 1; if (jm1 < 1) { goto L100; } i__2 = jm1; for (i__ = 1; i__ <= i__2; ++i__) { sum += r__[i__ + j * r_dim1] * wa1[i__]; /* L90: */ } L100: wa1[j] = (wa1[j] - sum) / r__[j + j * r_dim1]; /* L110: */ } temp = enorm_(n, &wa1[1]); parl = fp / *delta / temp / temp; L120: /* calculate an upper bound, paru, for the zero of the function. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { sum = zero; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { sum += r__[i__ + j * r_dim1] * qtb[i__]; /* L130: */ } l = ipvt[j]; wa1[j] = sum / diag[l]; /* L140: */ } gnorm = enorm_(n, &wa1[1]); paru = gnorm / *delta; if (paru == zero) { paru = dwarf / min(*delta,p1); } /* if the input par lies outside of the interval (parl,paru), */ /* set par to the closer endpoint. */ *par = max(*par,parl); *par = min(*par,paru); if (*par == zero) { *par = gnorm / dxnorm; } /* beginning of an iteration. */ L150: ++iter; /* evaluate the function at the current value of par. */ if (*par == zero) { /* Computing MAX */ d__1 = dwarf, d__2 = p001 * paru; *par = max(d__1,d__2); } temp = sqrt(*par); i__1 = *n; for (j = 1; j <= i__1; ++j) { wa1[j] = temp * diag[j]; /* L160: */ } qrsolv_(n, &r__[r_offset], ldr, &ipvt[1], &wa1[1], &qtb[1], &x[1], &sdiag[ 1], &wa2[1]); i__1 = *n; for (j = 1; j <= i__1; ++j) { wa2[j] = diag[j] * x[j]; /* L170: */ } dxnorm = enorm_(n, &wa2[1]); temp = fp; fp = dxnorm - *delta; /* if the function is small enough, accept the current value */ /* of par. also test for the exceptional cases where parl */ /* is zero or the number of iterations has reached 10. */ if (abs(fp) <= p1 * *delta || (parl == zero && fp <= temp && temp < zero) || iter == 10) { goto L220; } /* compute the newton correction. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { l = ipvt[j]; wa1[j] = diag[l] * (wa2[l] / dxnorm); /* L180: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { wa1[j] /= sdiag[j]; temp = wa1[j]; jp1 = j + 1; if (*n < jp1) { goto L200; } i__2 = *n; for (i__ = jp1; i__ <= i__2; ++i__) { wa1[i__] -= r__[i__ + j * r_dim1] * temp; /* L190: */ } L200: /* L210: */ ; } temp = enorm_(n, &wa1[1]); parc = fp / *delta / temp / temp; /* depending on the sign of the function, update parl or paru. */ if (fp > zero) { parl = max(parl,*par); } if (fp < zero) { paru = min(paru,*par); } /* compute an improved estimate for par. */ /* Computing MAX */ d__1 = parl, d__2 = *par + parc; *par = max(d__1,d__2); /* end of an iteration. */ goto L150; L220: /* termination. */ if (iter == 0) { *par = zero; } return 0; /* last card of subroutine lmpar. */ } /* lmpar_ */ /* Subroutine */ int qrfac_(integer *m, integer *n, doublereal *a, integer * lda, logical *pivot, integer *ipvt, integer *lipvt, doublereal *rdiag, doublereal *acnorm, doublereal *wa) { /* Initialized data */ static doublereal one = 1.; static doublereal p05 = .05; static doublereal zero = 0.; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; /* Local variables */ static integer i__, j, k, jp1; static doublereal sum; static integer kmax; static doublereal temp; static integer minmn; static doublereal epsmch; static doublereal ajnorm; /* ********** */ /* subroutine qrfac */ /* this subroutine uses householder transformations with column */ /* pivoting (optional) to compute a qr factorization of the */ /* m by n matrix a. that is, qrfac determines an orthogonal */ /* matrix q, a permutation matrix p, and an upper trapezoidal */ /* matrix r with diagonal elements of nonincreasing magnitude, */ /* such that a*p = q*r. the householder transformation for */ /* column k, k = 1,2,...,min(m,n), is of the form */ /* t */ /* i - (1/u(k))*u*u */ /* where u has zeros in the first k-1 positions. the form of */ /* this transformation and the method of pivoting first */ /* appeared in the corresponding linpack subroutine. */ /* the subroutine statement is */ /* subroutine qrfac(m,n,a,lda,pivot,ipvt,lipvt,rdiag,acnorm,wa) */ /* where */ /* m is a positive integer input variable set to the number */ /* of rows of a. */ /* n is a positive integer input variable set to the number */ /* of columns of a. */ /* a is an m by n array. on input a contains the matrix for */ /* which the qr factorization is to be computed. on output */ /* the strict upper trapezoidal part of a contains the strict */ /* upper trapezoidal part of r, and the lower trapezoidal */ /* part of a contains a factored form of q (the non-trivial */ /* elements of the u vectors described above). */ /* lda is a positive integer input variable not less than m */ /* which specifies the leading dimension of the array a. */ /* pivot is a logical input variable. if pivot is set true, */ /* then column pivoting is enforced. if pivot is set false, */ /* then no column pivoting is done. */ /* ipvt is an integer output array of length lipvt. ipvt */ /* defines the permutation matrix p such that a*p = q*r. */ /* column j of p is column ipvt(j) of the identity matrix. */ /* if pivot is false, ipvt is not referenced. */ /* lipvt is a positive integer input variable. if pivot is false, */ /* then lipvt may be as small as 1. if pivot is true, then */ /* lipvt must be at least n. */ /* rdiag is an output array of length n which contains the */ /* diagonal elements of r. */ /* acnorm is an output array of length n which contains the */ /* norms of the corresponding columns of the input matrix a. */ /* if this information is not needed, then acnorm can coincide */ /* with rdiag. */ /* wa is a work array of length n. if pivot is false, then wa */ /* can coincide with rdiag. */ /* subprograms called */ /* minpack-supplied ... dpmpar,enorm */ /* fortran-supplied ... dmax1,dsqrt,min0 */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa; --acnorm; --rdiag; a_dim1 = *lda; a_offset = a_dim1 + 1; a -= a_offset; --ipvt; /* Function Body */ /* epsmch is the machine precision. */ epsmch = dpmpar_(&c__1); /* compute the initial column norms and initialize several arrays. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { acnorm[j] = enorm_(m, &a[j * a_dim1 + 1]); rdiag[j] = acnorm[j]; wa[j] = rdiag[j]; if (*pivot) { ipvt[j] = j; } /* L10: */ } /* reduce a to r with householder transformations. */ minmn = min(*m,*n); i__1 = minmn; for (j = 1; j <= i__1; ++j) { if (! (*pivot)) { goto L40; } /* bring the column of largest norm into the pivot position. */ kmax = j; i__2 = *n; for (k = j; k <= i__2; ++k) { if (rdiag[k] > rdiag[kmax]) { kmax = k; } /* L20: */ } if (kmax == j) { goto L40; } i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = a[i__ + kmax * a_dim1]; a[i__ + kmax * a_dim1] = temp; /* L30: */ } rdiag[kmax] = rdiag[j]; wa[kmax] = wa[j]; k = ipvt[j]; ipvt[j] = ipvt[kmax]; ipvt[kmax] = k; L40: /* compute the householder transformation to reduce the */ /* j-th column of a to a multiple of the j-th unit vector. */ i__2 = *m - j + 1; ajnorm = enorm_(&i__2, &a[j + j * a_dim1]); if (ajnorm == zero) { goto L100; } if (a[j + j * a_dim1] < zero) { ajnorm = -ajnorm; } i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] /= ajnorm; /* L50: */ } a[j + j * a_dim1] += one; /* apply the transformation to the remaining columns */ /* and update the norms. */ jp1 = j + 1; if (*n < jp1) { goto L100; } i__2 = *n; for (k = jp1; k <= i__2; ++k) { sum = zero; i__3 = *m; for (i__ = j; i__ <= i__3; ++i__) { sum += a[i__ + j * a_dim1] * a[i__ + k * a_dim1]; /* L60: */ } temp = sum / a[j + j * a_dim1]; i__3 = *m; for (i__ = j; i__ <= i__3; ++i__) { a[i__ + k * a_dim1] -= temp * a[i__ + j * a_dim1]; /* L70: */ } if (! (*pivot) || rdiag[k] == zero) { goto L80; } temp = a[j + k * a_dim1] / rdiag[k]; /* Computing MAX */ /* Computing 2nd power */ d__3 = temp; d__1 = zero, d__2 = one - d__3 * d__3; rdiag[k] *= sqrt((max(d__1,d__2))); /* Computing 2nd power */ d__1 = rdiag[k] / wa[k]; if (p05 * (d__1 * d__1) > epsmch) { goto L80; } i__3 = *m - j; rdiag[k] = enorm_(&i__3, &a[jp1 + k * a_dim1]); wa[k] = rdiag[k]; L80: /* L90: */ ; } L100: rdiag[j] = -ajnorm; /* L110: */ } return 0; /* last card of subroutine qrfac. */ } /* qrfac_ */ /* Subroutine */ int qrsolv_(integer *n, doublereal *r__, integer *ldr, integer *ipvt, doublereal *diag, doublereal *qtb, doublereal *x, doublereal *sdiag, doublereal *wa) { /* Initialized data */ static doublereal p5 = .5; static doublereal p25 = .25; static doublereal zero = 0.; /* System generated locals */ integer r_dim1, r_offset, i__1, i__2, i__3; doublereal d__1, d__2; /* Local variables */ static integer i__, j, k, l, jp1, kp1; static doublereal tan__, cos__, sin__, sum, temp, cotan; static integer nsing; static doublereal qtbpj; /* ********** */ /* subroutine qrsolv */ /* given an m by n matrix a, an n by n diagonal matrix d, */ /* and an m-vector b, the problem is to determine an x which */ /* solves the system */ /* a*x = b , d*x = 0 , */ /* in the least squares sense. */ /* this subroutine completes the solution of the problem */ /* if it is provided with the necessary information from the */ /* qr factorization, with column pivoting, of a. that is, if */ /* a*p = q*r, where p is a permutation matrix, q has orthogonal */ /* columns, and r is an upper triangular matrix with diagonal */ /* elements of nonincreasing magnitude, then qrsolv expects */ /* the full upper triangle of r, the permutation matrix p, */ /* and the first n components of (q transpose)*b. the system */ /* a*x = b, d*x = 0, is then equivalent to */ /* t t */ /* r*z = q *b , p *d*p*z = 0 , */ /* where x = p*z. if this system does not have full rank, */ /* then a least squares solution is obtained. on output qrsolv */ /* also provides an upper triangular matrix s such that */ /* t t t */ /* p *(a *a + d*d)*p = s *s . */ /* s is computed within qrsolv and may be of separate interest. */ /* the subroutine statement is */ /* subroutine qrsolv(n,r,ldr,ipvt,diag,qtb,x,sdiag,wa) */ /* where */ /* n is a positive integer input variable set to the order of r. */ /* r is an n by n array. on input the full upper triangle */ /* must contain the full upper triangle of the matrix r. */ /* on output the full upper triangle is unaltered, and the */ /* strict lower triangle contains the strict upper triangle */ /* (transposed) of the upper triangular matrix s. */ /* ldr is a positive integer input variable not less than n */ /* which specifies the leading dimension of the array r. */ /* ipvt is an integer input array of length n which defines the */ /* permutation matrix p such that a*p = q*r. column j of p */ /* is column ipvt(j) of the identity matrix. */ /* diag is an input array of length n which must contain the */ /* diagonal elements of the matrix d. */ /* qtb is an input array of length n which must contain the first */ /* n elements of the vector (q transpose)*b. */ /* x is an output array of length n which contains the least */ /* squares solution of the system a*x = b, d*x = 0. */ /* sdiag is an output array of length n which contains the */ /* diagonal elements of the upper triangular matrix s. */ /* wa is a work array of length n. */ /* subprograms called */ /* fortran-supplied ... dabs,dsqrt */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa; --sdiag; --x; --qtb; --diag; --ipvt; r_dim1 = *ldr; r_offset = r_dim1 + 1; r__ -= r_offset; /* Function Body */ /* copy r and (q transpose)*b to preserve input and initialize s. */ /* in particular, save the diagonal elements of r in x. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { r__[i__ + j * r_dim1] = r__[j + i__ * r_dim1]; /* L10: */ } x[j] = r__[j + j * r_dim1]; wa[j] = qtb[j]; /* L20: */ } /* eliminate the diagonal matrix d using a givens rotation. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { /* prepare the row of d to be eliminated, locating the */ /* diagonal element using p from the qr factorization. */ l = ipvt[j]; if (diag[l] == zero) { goto L90; } i__2 = *n; for (k = j; k <= i__2; ++k) { sdiag[k] = zero; /* L30: */ } sdiag[j] = diag[l]; /* the transformations to eliminate the row of d */ /* modify only a single element of (q transpose)*b */ /* beyond the first n, which is initially zero. */ qtbpj = zero; i__2 = *n; for (k = j; k <= i__2; ++k) { /* determine a givens rotation which eliminates the */ /* appropriate element in the current row of d. */ if (sdiag[k] == zero) { goto L70; } if ((d__1 = r__[k + k * r_dim1], abs(d__1)) >= (d__2 = sdiag[k], abs(d__2))) { goto L40; } cotan = r__[k + k * r_dim1] / sdiag[k]; /* Computing 2nd power */ d__1 = cotan; sin__ = p5 / sqrt(p25 + p25 * (d__1 * d__1)); cos__ = sin__ * cotan; goto L50; L40: tan__ = sdiag[k] / r__[k + k * r_dim1]; /* Computing 2nd power */ d__1 = tan__; cos__ = p5 / sqrt(p25 + p25 * (d__1 * d__1)); sin__ = cos__ * tan__; L50: /* compute the modified diagonal element of r and */ /* the modified element of ((q transpose)*b,0). */ r__[k + k * r_dim1] = cos__ * r__[k + k * r_dim1] + sin__ * sdiag[ k]; temp = cos__ * wa[k] + sin__ * qtbpj; qtbpj = -sin__ * wa[k] + cos__ * qtbpj; wa[k] = temp; /* accumulate the tranformation in the row of s. */ kp1 = k + 1; if (*n < kp1) { goto L70; } i__3 = *n; for (i__ = kp1; i__ <= i__3; ++i__) { temp = cos__ * r__[i__ + k * r_dim1] + sin__ * sdiag[i__]; sdiag[i__] = -sin__ * r__[i__ + k * r_dim1] + cos__ * sdiag[ i__]; r__[i__ + k * r_dim1] = temp; /* L60: */ } L70: /* L80: */ ; } L90: /* store the diagonal element of s and restore */ /* the corresponding diagonal element of r. */ sdiag[j] = r__[j + j * r_dim1]; r__[j + j * r_dim1] = x[j]; /* L100: */ } /* solve the triangular system for z. if the system is */ /* singular, then obtain a least squares solution. */ nsing = *n; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (sdiag[j] == zero && nsing == *n) { nsing = j - 1; } if (nsing < *n) { wa[j] = zero; } /* L110: */ } if (nsing < 1) { goto L150; } i__1 = nsing; for (k = 1; k <= i__1; ++k) { j = nsing - k + 1; sum = zero; jp1 = j + 1; if (nsing < jp1) { goto L130; } i__2 = nsing; for (i__ = jp1; i__ <= i__2; ++i__) { sum += r__[i__ + j * r_dim1] * wa[i__]; /* L120: */ } L130: wa[j] = (wa[j] - sum) / sdiag[j]; /* L140: */ } L150: /* permute the components of z back to components of x. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { l = ipvt[j]; x[l] = wa[j]; /* L160: */ } return 0; /* last card of subroutine qrsolv. */ } /* qrsolv_ */ grace-5.1.23/src/ptswin.c0000644000076500001440000001552510071615562014722 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * track/edit points etc. * */ #include #include #include #include "utils.h" #include "draw.h" #include "graphs.h" #include "events.h" #include "protos.h" #include "motifinc.h" static int track_setno = -1; static int track_add_at; /* where to begin inserting points in the set */ static int track_move_dir; /* direction on point movement */ static Widget points_frame; static ListStructure *track_set_sel; static TextStructure *locate_point_item; static Widget locate_point_message; static Widget goto_index_item; /* * set tracker */ static void do_track_proc(void *data) { set_action(DO_NOTHING); SetLabel(locate_point_message, "Track points"); set_action(TRACKER); } /* * activate the add point item in the canvas event proc */ static void do_add_proc(void *data) { char *s; set_action(DO_NOTHING); track_add_at = (int) data; switch (track_add_at) { case ADD_POINT_BEGINNING: s = "Add points at the beginning of set"; break; case ADD_POINT_END: s = "Add points to the end of set"; break; case ADD_POINT_NEAREST: s = "Add points to the nearest position"; break; default: return; } SetLabel(locate_point_message, s); set_action(ADD_POINT); } /* * activate the delete point item in the canvas event proc */ static void do_del_proc(void *data) { set_action(DO_NOTHING); SetLabel(locate_point_message, "Delete points"); set_action(DEL_POINT); } /* * move a point */ static void do_ptsmove_proc(void *data) { char *s; set_action(DO_NOTHING); track_move_dir = (int) data; switch (track_move_dir) { case MOVE_POINT_XY: s = "Move points"; break; case MOVE_POINT_X: s = "Move points along x"; break; case MOVE_POINT_Y: s = "Move points along y"; break; default: return; } SetLabel(locate_point_message, s); set_action(MOVE_POINT1ST); } static void do_gotopt_proc(void *data) { int ind; WPoint wp; VPoint vp; int cg = get_cg(); if (!is_set_active(cg, track_setno)) { errmsg("No or inactive set selected"); return; } xv_evalexpri(goto_index_item, &ind); if (get_point(cg, track_setno, ind, &wp) == RETURN_SUCCESS) { vp = Wpoint2Vpoint(wp); setpointer(vp); } else { errmsg("Point index out of range"); } } static void points_done_proc(void *data) { set_action(DO_NOTHING); UnmanageChild(GetParent((Widget) data)); } static void track_set_cbproc(int n, int *values, void *data) { if (n == 1) { track_setno = values[0]; } else { track_setno = -1; } } void create_points_frame(void *data) { set_wait_cursor(); if (points_frame == NULL) { Widget dialog, wbut, rc, fr; points_frame = CreateDialogForm(app_shell, "Point explorer"); fr = CreateFrame(points_frame, NULL); AddDialogFormChild(points_frame, fr); locate_point_message = CreateLabel(fr, "Point explorer"); dialog = CreateVContainer(points_frame); AddDialogFormChild(points_frame, dialog); track_set_sel = CreateSetChoice(dialog, "Restrict to set:", LIST_TYPE_SINGLE, TRUE); AddListChoiceCB(track_set_sel, track_set_cbproc, NULL); rc = CreateHContainer(dialog); goto_index_item = CreateTextItem2(rc, 6, "Point location:"); wbut = CreateButton(rc, "Goto point"); AddButtonCB(wbut, do_gotopt_proc, NULL); locate_point_item = CreateTextInput(dialog, "Point data:"); CreateSeparator(dialog); rc = CreateHContainer(dialog); wbut = CreateButton(rc, "Track"); AddButtonCB(wbut, do_track_proc, NULL); wbut = CreateButton(rc, "Move"); AddButtonCB(wbut, do_ptsmove_proc, (void *) MOVE_POINT_XY); wbut = CreateButton(rc, "Move X"); AddButtonCB(wbut, do_ptsmove_proc, (void *) MOVE_POINT_X); wbut = CreateButton(rc, "Move Y"); AddButtonCB(wbut, do_ptsmove_proc, (void *) MOVE_POINT_Y); wbut = CreateButton(rc, "Prepend"); AddButtonCB(wbut, do_add_proc, (void *) ADD_POINT_BEGINNING); wbut = CreateButton(rc, "Append"); AddButtonCB(wbut, do_add_proc, (void *) ADD_POINT_END); wbut = CreateButton(rc, "Insert"); AddButtonCB(wbut, do_add_proc, (void *) ADD_POINT_NEAREST); wbut = CreateButton(rc, "Delete"); AddButtonCB(wbut, do_del_proc, NULL); wbut = CreateButton(rc, "Close"); AddButtonCB(wbut, points_done_proc, (void *) points_frame); ManageChild(points_frame); } RaiseWindow(GetParent(points_frame)); unset_wait_cursor(); } void update_point_locator(int gno, int setno, int loc) { int col, ncols; Datapoint dpoint; char *s, buf[64]; if (points_frame == NULL) { return; } if (get_datapoint(gno, setno, loc, &ncols, &dpoint) == RETURN_SUCCESS) { SelectListChoice(track_set_sel, setno); s = copy_string(NULL, "("); for (col = 0; col < ncols; col++) { sprintf(buf, "%g", dpoint.ex[col]); s = concat_strings(s, buf); if (col != ncols - 1) { s = concat_strings(s, ", "); } } if (dpoint.s != NULL) { s = concat_strings(s, ", \""); s = concat_strings(s, dpoint.s); s = concat_strings(s, "\""); } s = concat_strings(s, ")"); SetTextString(locate_point_item, s); xfree(s); sprintf(buf, "%d", loc); xv_setstr(goto_index_item, buf); } else { track_setno = -1; SelectListChoices(track_set_sel, 0, NULL); SetTextString(locate_point_item, ""); xv_setstr(goto_index_item, ""); } } void get_tracking_props(int *setno, int *move_dir, int *add_at) { *setno = track_setno; *move_dir = track_move_dir; *add_at = track_add_at; } grace-5.1.23/src/locatewin.c0000644000076500001440000001032310071615561015351 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Locator Panel * */ #include #include #include "graphs.h" #include "protos.h" #include "motifinc.h" static Widget locator_frame; /* * Panel item declarations */ static Widget *delta_item; static OptionStructure *loc_formatx; static OptionStructure *loc_formaty; static Widget *loc_precx; static Widget *loc_precy; static Widget locx_item; static Widget locy_item; static Widget fixedp_item; /* * Event and Notify proc declarations */ static int locator_define_notify_proc(void *data); void update_locator_items(int gno) { if (locator_frame) { GLocator locator; char buf[32]; if (get_graph_locator(gno, &locator) != RETURN_SUCCESS) { return; } SetToggleButtonState(fixedp_item, locator.pointset); SetChoice(delta_item, locator.pt_type); SetOptionChoice(loc_formatx, locator.fx); SetOptionChoice(loc_formaty, locator.fy); SetChoice(loc_precx, locator.px); SetChoice(loc_precy, locator.py); sprintf(buf, "%g", locator.dsx); xv_setstr(locx_item, buf); sprintf(buf, "%g", locator.dsy); xv_setstr(locy_item, buf); } } /* * Create the locator Panel */ void create_locator_frame(void *data) { set_wait_cursor(); if (locator_frame == NULL) { Widget rc, rc2, fr, locator_panel; locator_frame = CreateDialogForm(app_shell, "Locator props"); locator_panel = CreateVContainer(locator_frame); delta_item = CreatePanelChoice(locator_panel, "Locator display type:", 7, "[X, Y]", "[DX, DY]", "[DISTANCE]", "[Phi, Rho]", "[VX, VY]", "[SX, SY]", NULL); fr = CreateFrame(locator_panel, "X properties"); rc = CreateVContainer(fr); loc_formatx = CreateFormatChoice(rc, "Format:"); loc_precx = CreatePrecisionChoice(rc, "Precision:"); fr = CreateFrame(locator_panel, "Y properties"); rc = CreateVContainer(fr); loc_formaty = CreateFormatChoice(rc, "Format:"); loc_precy = CreatePrecisionChoice(rc, "Precision:"); fr = CreateFrame(locator_panel, "Fixed point"); rc = CreateVContainer(fr); fixedp_item = CreateToggleButton(rc, "Enable"); rc2 = CreateHContainer(rc); locx_item = CreateTextItem2(rc2, 10, "X:"); locy_item = CreateTextItem2(rc2, 10, "Y:"); CreateAACDialog(locator_frame, locator_panel, locator_define_notify_proc, NULL); } update_locator_items(get_cg()); RaiseWindow(GetParent(locator_frame)); unset_wait_cursor(); } /* * Notify and event procs */ static int locator_define_notify_proc(void *data) { GLocator locator; int gno; gno = get_cg(); if (get_graph_locator(gno, &locator) != RETURN_SUCCESS) { return RETURN_FAILURE; } locator.pt_type = GetChoice(delta_item); locator.fx = GetOptionChoice(loc_formatx); locator.fy = GetOptionChoice(loc_formaty); locator.px = GetChoice(loc_precx); locator.py = GetChoice(loc_precy); locator.pointset = GetToggleButtonState(fixedp_item); xv_evalexpr(locx_item, &locator.dsx ); xv_evalexpr(locy_item, &locator.dsy ); set_graph_locator(gno, &locator); xdrawgraph(); return RETURN_SUCCESS; } grace-5.1.23/src/missing.c0000644000076500001440000003453710071615562015053 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include "defines.h" #include "missing.h" /* To make ANSI C happy about non-empty file */ void _missing_c_dummy_func(void) {} #ifndef HAVE_DRAND48 double drand48(void) { return (double) (1.0/RAND_MAX)*rand(); } #endif #ifndef HAVE_GETTIMEOFDAY int gettimeofday (tv, tz) struct timeval *tv; void *tz; { timeb_t tmp_time; ftime(&tmp_time); if (tv != NULL) { tv->tv_sec = tmp_time.time; tv->tv_usec = tmp_time.millitm * 1000; } return (0); } #endif #ifndef HAVE_POPEN # ifdef __VMS /* drop in popen() / pclose() for VMS * originally written for port of perl to vms */ /* (to aid porting) - how are errors dealt with */ #define ERROR(msg) { fprintf(stderr, "%s\nFile %s line %d\n", msg, __FILE__, __LINE__); } #define FATAL(msg) { fprintf(stderr, "%s\nFile %s line %d\n", msg, __FILE__, __LINE__); exit(RETURN_FAILURE); } #include #include #include #include #include #include #include #include #include #define _cksts(call) \ if (!(sts=(call))&1) FATAL("Internal error") else {} static void create_mbx(unsigned short int *chan, struct dsc$descriptor_s *namdsc) { static unsigned long int mbxbufsiz; long int syiitm = SYI$_MAXBUF, dviitm = DVI$_DEVNAM; unsigned long sts; /* for _cksts */ if (!mbxbufsiz) { /* * Get the SYSGEN parameter MAXBUF, and the smaller of it and the * preprocessor consant BUFSIZ from stdio.h as the size of the * 'pipe' mailbox. */ _cksts(lib$getsyi(&syiitm, &mbxbufsiz, 0, 0, 0, 0)); if (mbxbufsiz > BUFSIZ) mbxbufsiz = BUFSIZ; } _cksts(sys$crembx(0,chan,mbxbufsiz,mbxbufsiz,0,0,0)); _cksts(lib$getdvi(&dviitm, chan, NULL, NULL, namdsc, &namdsc->dsc$w_length)); namdsc->dsc$a_pointer[namdsc->dsc$w_length] = '\0'; } /* end of create_mbx() */ struct pipe_details { struct pipe_details *next; FILE *fp; int pid; unsigned long int completion; }; static struct pipe_details *open_pipes = NULL; static $DESCRIPTOR(nl_desc, "NL:"); static int waitpid_asleep = 0; static void popen_completion_ast(unsigned long int unused) { if (waitpid_asleep) { waitpid_asleep = 0; sys$wake(0,0); } } #pragma message save #pragma message disable (ADDRCONSTEXT) FILE * popen(char *cmd, char *mode) { char mbxname[64]; unsigned short int chan; unsigned long int flags=1; /* nowait - gnu c doesn't allow &1 */ struct pipe_details *info; struct dsc$descriptor_s namdsc = {sizeof mbxname, DSC$K_DTYPE_T, DSC$K_CLASS_S, mbxname}, cmddsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; unsigned long sts; if (!(info=malloc(sizeof(struct pipe_details)))) { ERROR("Cannot malloc space"); return NULL; } info->completion=0; /* I assume this will remain 0 until terminates */ /* create mailbox */ create_mbx(&chan,&namdsc); /* open a FILE* onto it */ info->fp=fopen(mbxname, mode); /* give up other channel onto it */ _cksts(sys$dassgn(chan)); if (!info->fp) return NULL; cmddsc.dsc$w_length=strlen(cmd); cmddsc.dsc$a_pointer=cmd; if (strcmp(mode,"r")==0) { _cksts(lib$spawn(&cmddsc, &nl_desc, &namdsc, &flags, 0 /* name */, &info->pid, &info->completion, 0, popen_completion_ast,0,0,0,0)); } else { _cksts(lib$spawn(&cmddsc, &namdsc, 0 /* sys$output */, &flags, 0 /* name */, &info->pid, &info->completion)); } info->next=open_pipes; /* prepend to list */ open_pipes=info; return info->fp; } #pragma message restore int pclose(FILE *fp) { struct pipe_details *info, *last = NULL; unsigned long int abort = SS$_TIMEOUT, retsts; unsigned long sts; for (info = open_pipes; info != NULL; last = info, info = info->next) if (info->fp == fp) break; if (info == NULL) /* get here => no such pipe open */ /* FATAL("pclose() - no such pipe open ???"); too extreme, removed*/ return -1; /* standard behaviour */ if (!info->completion) { /* Tap them gently on the shoulder . . .*/ _cksts(sys$forcex(&info->pid,0,&abort)); sleep(1); } if (!info->completion) /* We tried to be nice . . . */ _cksts(sys$delprc(&info->pid)); fclose(info->fp); /* remove from list of open pipes */ if (last) last->next = info->next; else open_pipes = info->next; retsts = info->completion; free(info); return retsts; } /* end of pclose() */ /* sort-of waitpid; use only with popen() */ /*{{{unsigned long int waitpid(unsigned long int pid, int *statusp, int flags)*/ unsigned long int waitpid(unsigned long int pid, int *statusp, int flags) { struct pipe_details *info; unsigned long int abort = SS$_TIMEOUT; unsigned long sts; for (info = open_pipes; info != NULL; info = info->next) if (info->pid == pid) break; if (info != NULL) { /* we know about this child */ while (!info->completion) { waitpid_asleep = 1; sys$hiber(); } *statusp = info->completion; return pid; } else { /* we haven't heard of this child */ $DESCRIPTOR(intdsc,"0 00:00:01"); unsigned long int ownercode = JPI$_OWNER, ownerpid, mypid; unsigned long int interval[2]; _cksts(lib$getjpi(&ownercode,&pid,0,&ownerpid,0,0)); _cksts(lib$getjpi(&ownercode,0,0,&mypid,0,0)); if (ownerpid != mypid) FATAL("pid not a child"); _cksts(sys$bintim(&intdsc,interval)); while ((sts=lib$getjpi(&ownercode,&pid,0,&ownerpid,0,0)) & 1) { _cksts(sys$schdwk(0,0,interval,0)); _cksts(sys$hiber()); } _cksts(sts); /* There's no easy way to find the termination status a child we're * not aware of beforehand. If we're really interested in the future, * we can go looking for a termination mailbox, or chase after the * accounting record for the process. */ *statusp = 0; return pid; } } /* end of waitpid() */ # else /* not __VMS */ /* temporary filename */ static char tfile[GR_MAXPATHLEN]; /* filter action */ static enum filtact { FILTER_NONE, FILTER_READ, FILTER_WRITE } filt_act; FILE *popen(char *cmd, char *mode) { switch (mode[0]) { case 'r': filt_act = FILTER_READ; strcpy(buf, cmd); strcat(buf, " > "); break; case 'w': filt_act = FILTER_WRITE; strcpy(buf, cmd); strcat(buf, " < "); break; default: filt_act = FILTER_NONE; return NULL; } strcat(buf, tmpnam(tfile)); if (system(buf) == -1) { tfile[0] = '\0'; filt_act = FILTER_NONE; return NULL; } else { return fopen(tfile, mode); } } int pclose(FILE *fp) { int result = -1; result = fclose( fp ); switch( filt_act ) { case FILTER_READ: remove( tfile ); tfile[0] = '\0'; break; case FILTER_WRITE: remove( tfile ); tfile[0] = '\0'; break; default: break; } return result; } # endif /* __VMS */ #endif /* HAVE_POPEN */ #ifdef __EMX__ char *exe_path_translate(char *path) { static char absfn[GR_MAXPATHLEN]; _abspath(absfn, path, GR_MAXPATHLEN); return(absfn); } #endif #ifdef __VMS # include char *path_translate(const char *path) { char *st; st = decc$translate_vms(path); if ((int) st == 0 || (int) st == -1) { return NULL; } else { return st; } } #endif #ifdef __VMS # ifndef __CRTL_VER # define __CRTL_VER __VMS_VER # endif /* this is a "system" function for VMS because system("spawn/nowait mosaic ...") dosn't work -- system creates a subprocess, which runs spawn and creates another subprocess; when the spawn command completes, the first subprocess exits and the second one (which is a subprocess of the subprocess) also exits. */ #include #include #include #include int system_spawn(const char *command) { $DESCRIPTOR(dstr, ""); int retval; dstr.dsc$a_pointer = malloc(1024); strcpy(dstr.dsc$a_pointer, command); dstr.dsc$w_length = strlen(dstr.dsc$a_pointer); retval = lib$spawn(&dstr, 0, 0, &CLI$M_NOWAIT); free(dstr.dsc$a_pointer); return retval; } # if __CRTL_VER < 70000000 /* Define a getlogin function for VMS before version 7. */ # include # include typedef struct { unsigned short buffer_length, item_code; char *buffer; int *return_len; } itmlst_item; char *getlogin() { int ret, i; itmlst_item itmlst[2]; static char username[13]; itmlst[0].buffer_length = sizeof(username)-1; itmlst[0].item_code = JPI$_USERNAME; itmlst[0].buffer = username; itmlst[0].return_len = NULL; itmlst[1].buffer_length = 0; itmlst[1].item_code = 0; itmlst[1].buffer = NULL; itmlst[1].return_len = NULL; ret = sys$getjpiw(NULL, NULL, NULL, itmlst, NULL, NULL, NULL); if ((ret && 1) == 0) strcpy(username, ""); else { for (i=0; i */ #pragma message save #pragma message disable (CVTDIFTYPES,ADDRCONSTEXT,NEEDCONSTEXT) #include struct uic { unsigned short uid; unsigned short gid; }; #define TEST(ptr, str) { if (ptr == NULL) { \ fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \ str); \ exit(-1); \ } } struct passwd *getpwnam(name) char *name; { int istatus; int UserNameLen; int UserOwnerLen; int UserDeviceLen; int UserDirLen; char UserName[13]; char UserOwner[32]; char UserDevice[32]; char UserDir[64]; char *cptr, *sptr; unsigned long int UserPwd[2]; unsigned short int UserSalt; unsigned long int UserEncrypt; struct uic UicValue; struct passwd *entry; struct dsc$descriptor_s VMSNAME = {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name}; struct itmlist3 { unsigned short int length; unsigned short int item; unsigned long int addr; unsigned long int retaddr; } ItemList[] = { {12, UAI$_USERNAME, &UserName, &UserNameLen}, {8, UAI$_PWD, &UserPwd, 0}, {4, UAI$_UIC, &UicValue, 0}, {32, UAI$_OWNER, &UserOwner, &UserOwnerLen}, {32, UAI$_DEFDEV, &UserDevice, &UserDeviceLen}, {64, UAI$_DEFDIR, &UserDir, &UserDirLen}, {2, UAI$_SALT, &UserSalt, 0}, {4, UAI$_ENCRYPT, &UserEncrypt, 0}, {0, 0, 0, 0} }; UserNameLen = 0; istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0); if (!(istatus & 1)) { #ifdef DEBUG lib$signal(istatus); #endif /* DEBUG */ fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n", name); fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus); return ((struct passwd *)NULL); } entry = (struct passwd *) calloc (1, sizeof(struct passwd)); TEST(entry, "PASSWD_ENTRY"); entry->pw_uid = UicValue.uid; entry->pw_gid = UicValue.gid; entry->pw_salt = UserSalt; entry->pw_encrypt = UserEncrypt; sptr = UserName; cptr = calloc (UserNameLen+1, sizeof(char)); TEST(cptr, "USERNAME"); strncpy (cptr, sptr, UserNameLen); cptr[UserNameLen] = '\0'; entry->pw_name = cptr; cptr = calloc(8, sizeof(char)); TEST(cptr, "PASSWORD"); memcpy(cptr, UserPwd, 8); entry->pw_passwd = cptr; sptr = UserOwner; sptr++; cptr = calloc ((int)UserOwner[0]+1, sizeof(char)); TEST(cptr, "FULLNAME"); strncpy (cptr, sptr, (int)UserOwner[0]); cptr[(int)UserOwner[0]] = '\0'; entry->pw_gecos = cptr; cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char)); TEST(cptr, "HOME"); sptr = UserDevice; sptr++; strncpy (cptr, sptr, (int)UserDevice[0]); sptr = UserDir; sptr++; strncat (cptr, sptr, (int)UserDir[0]); cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0'; entry->pw_dir = cptr; cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char)); TEST(cptr,"SHELL"); strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE"); entry->pw_shell = cptr; return (entry); } #pragma message restore # endif /* __CRTL_VER */ #endif /* __VMS */ grace-5.1.23/src/gd.h0000644000076500001440000000750507015110166013766 0ustar fnevgenyusers#ifndef GD_H #define GD_H 1 /* gd.h: declarations file for the graphic-draw module. * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation. This software is provided "AS IS." Thomas Boutell and * Boutell.Com, Inc. disclaim all warranties, either express or implied, * including but not limited to implied warranties of merchantability and * fitness for a particular purpose, with respect to this code and accompanying * documentation. */ /* This can't be changed in the current palette-only version of gd. */ #define gdMaxColors 256 /* Image type. See functions below; you will not need to change the elements directly. Use the provided macros to access sx, sy, the color table, and colorsTotal for read-only purposes. */ typedef struct gdImageStruct { unsigned char ** pixels; int sx; int sy; int colorsTotal; int red[gdMaxColors]; int green[gdMaxColors]; int blue[gdMaxColors]; int open[gdMaxColors]; int transparent; int *polyInts; int polyAllocated; struct gdImageStruct *brush; struct gdImageStruct *tile; int brushColorMap[gdMaxColors]; int tileColorMap[gdMaxColors]; int styleLength; int stylePos; int *style; int interlace; } gdImage; typedef gdImage * gdImagePtr; /* Point type for use in polygon drawing. */ typedef struct { int x, y; } gdPoint, *gdPointPtr; /* Special colors. */ #define gdStyled (-2) #define gdBrushed (-3) #define gdStyledBrushed (-4) #define gdTiled (-5) /* NOT the same as the transparent color index. This is used in line styles only. */ #define gdTransparent (-6) #define gdArcFillChord 0 #define gdArcFillPieSlice 1 /* Functions to manipulate images. */ gdImagePtr gdImageCreate(int sx, int sy); void gdImageDestroy(gdImagePtr im); void gdImageSetPixel(gdImagePtr im, int x, int y, int color); void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color); /* Corners specified (not width and height). Upper left first, lower right second. */ void gdImageRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color); /* Solid bar. Upper left corner first, lower right corner second. */ void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color); int gdImageBoundsSafe(gdImagePtr im, int x, int y); void gdImagePolygon(gdImagePtr im, gdPointPtr p, int n, int c); void gdImageFilledPolygon(gdImagePtr im, gdPointPtr p, int n, int c); void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color); void gdImageFilledArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int mode, int color); int gdImageGetPixel(gdImagePtr im, int x, int y); int gdImageColorAllocate(gdImagePtr im, int r, int g, int b); int gdImageColorClosest(gdImagePtr im, int r, int g, int b); int gdImageColorExact(gdImagePtr im, int r, int g, int b); void gdImageColorDeallocate(gdImagePtr im, int color); void gdImageColorTransparent(gdImagePtr im, int color); void gdImageSetBrush(gdImagePtr im, gdImagePtr brush); void gdImageSetTile(gdImagePtr im, gdImagePtr tile); void gdImageSetStyle(gdImagePtr im, int *style, int noOfPixels); /* On or off (1 or 0) */ void gdImageInterlace(gdImagePtr im, int interlaceArg); /* Macros to access information about images. READ ONLY. Changing these values will NOT have the desired result. */ #define gdImageSX(im) ((im)->sx) #define gdImageSY(im) ((im)->sy) #define gdImageColorsTotal(im) ((im)->colorsTotal) #define gdImageRed(im, c) ((im)->red[(c)]) #define gdImageGreen(im, c) ((im)->green[(c)]) #define gdImageBlue(im, c) ((im)->blue[(c)]) #define gdImageGetTransparent(im) ((im)->transparent) #define gdImageGetInterlaced(im) ((im)->interlace) #endif grace-5.1.23/src/mathstuff.h0000644000076500001440000000413711014400276015371 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Wrappers for some math functions */ #ifndef _MATHSTUFF_H__ #define _MATHSTUFF_H__ extern double ai_wrap(double x); extern double bi_wrap(double x); extern double chi_wrap(double x); extern double ci_wrap(double x); extern double ellpe_wrap ( double x ); extern double ellpk_wrap ( double x ); extern double fresnlc_wrap(double x); extern double fresnls_wrap(double x); extern double fx(double x); extern double iv_wrap(double v, double x); extern double jv_wrap(double v, double x); extern double kn_wrap(int n, double x); extern double max_wrap(double x, double y); extern double min_wrap(double x, double y); extern double irand_wrap(int x); extern double rnorm(double mean, double sdev); extern double shi_wrap(double x); extern double si_wrap(double x); extern double sqr_wrap(double x); extern double yv_wrap(double v, double x); extern double sign_wrap(double x); double voigt(double gamma, double sigma, double x); /* constants */ extern double pi_const(void); extern double deg_uconst(void); extern double rad_uconst(void); #endif /* _MATHSTUFF_H__ */ grace-5.1.23/src/main.c0000644000076500001440000007144612032137500014314 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2009 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #ifdef HAVE_FCNTL_H # include #endif /* for globals.h */ #define MAIN #include "globals.h" #include "utils.h" #include "files.h" #include "ssdata.h" #include "graphs.h" #include "graphutils.h" #include "plotone.h" #include "device.h" #include "devlist.h" #ifndef NONE_GUI # include "x11drv.h" #endif #include "parser.h" #include "protos.h" extern char batchfile[]; extern char print_file[]; extern int install_cmap; extern Input_buffer *ib_tbl; extern int ib_tblsize; static void usage(FILE *stream, char *progname); static void VersionInfo(void); int inpipe = FALSE; /* if xmgrace is to participate in a pipe */ #if defined(DEBUG) extern int yydebug; #endif int main(int argc, char *argv[]) { char *s; int i, j; int gno; int fd; world w; view v; int cur_graph; /* default (current) graph */ int loadlegend = FALSE; /* legend on and load file names */ int gracebat; /* if executed as 'gracebat' then TRUE */ int cli = FALSE; /* command line interface only */ int remove_flag = FALSE; /* remove file after read */ int noprint = FALSE; /* if gracebat, then don't print if true */ int sigcatch = TRUE; /* we handle signals ourselves */ char fd_name[GR_MAXPATHLEN]; int wpp, hpp; /* * set version */ reset_project_version(); /* * grace home directory */ if ((s = getenv("GRACE_HOME")) != NULL) { set_grace_home(s); } /* define the user's name */ init_username(); /* define the user's home dir */ init_userhome(); /* set the starting directory */ set_workingdir(NULL); /* * print command */ if ((s = getenv("GRACE_PRINT_CMD")) != NULL) { set_print_cmd(s); } /* if no print command defined, print to file by default */ s = get_print_cmd(); if (s == NULL || s[0] == '\0') { set_ptofile(TRUE); } else { set_ptofile(FALSE); } /* * editor */ if ((s = getenv("GRACE_EDITOR")) != NULL) { set_editor(s); } /* * check for changed help file viewer command */ if ((s = getenv("GRACE_HELPVIEWER")) != NULL) { set_help_viewer(s); } /* initialize plots, strings, graphs */ set_program_defaults(); /* initialize the nonl-fit parameters */ initialize_nonl(); /* initialize the parser symbol table */ init_symtab(); /* initialize the rng */ srand48(100L); /* initialize T1lib */ if (init_t1() != RETURN_SUCCESS) { errmsg("--> Broken or incomplete installation - read the FAQ!"); exit (1); } /* initialize colormap data */ initialize_cmap(); /* * if program name is gracebat* then don't initialize the X toolkit */ s = mybasename(argv[0]); if (strstr(s, "gracebat") == s) { gracebat = TRUE; } else { gracebat = FALSE; if (strstr(s, "grace") == s) { cli = TRUE; } else { #ifndef NONE_GUI cli = FALSE; if (initialize_gui(&argc, argv) != RETURN_SUCCESS) { errmsg("Failed initializing GUI, exiting"); exit(1); } #endif } } /* initialize devices */ #ifndef NONE_GUI if (cli == TRUE || gracebat == TRUE) { tdevice = register_dummy_drv(); } else { tdevice = register_x11_drv(); } #else tdevice = register_dummy_drv(); #endif select_device(tdevice); hdevice = register_ps_drv(); register_eps_drv(); #ifdef HAVE_LIBPDF register_pdf_drv(); #endif register_mif_drv(); register_svg_drv(); register_pnm_drv(); #ifdef HAVE_LIBJPEG register_jpg_drv(); #endif #ifdef HAVE_LIBPNG register_png_drv(); #endif register_mf_drv(); /* check whether locale is correctly set */ if (init_locale() != RETURN_SUCCESS) { errmsg("Invalid or unsupported locale"); } /* default is POSIX */ set_locale_num(FALSE); /* load startup file */ getparms("gracerc"); /* load default template */ new_project(NULL); cur_graph = get_cg(); if (argc >= 2) { for (i = 1; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] != '\0') { if (argmatch(argv[i], "-version", 2)) { VersionInfo(); exit(0); } #if defined(DEBUG) if (argmatch(argv[i], "-debug", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for debug flag\n"); usage(stderr, argv[0]); } else { set_debuglevel(atoi(argv[i])); if (get_debuglevel() == 4) { /* turn on debugging in pars.y */ yydebug = TRUE; } } } else #endif if (argmatch(argv[i], "-nosigcatch", 6)) { sigcatch = FALSE; } else if (argmatch(argv[i], "-autoscale", 2)) { i++; if (i == argc) { errmsg("Missing argument for autoscale flag"); usage(stderr, argv[0]); } else { if (!strcmp("x", argv[i])) { autoscale_onread = AUTOSCALE_X; } else if (!strcmp("y", argv[i])) { autoscale_onread = AUTOSCALE_Y; } else if (!strcmp("xy", argv[i])) { autoscale_onread = AUTOSCALE_XY; } else if (!strcmp("none", argv[i])) { autoscale_onread = AUTOSCALE_NONE; } else { errmsg("Improper argument for autoscale flag"); usage(stderr, argv[0]); } } } else if (argmatch(argv[i], "-batch", 2)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for batch file\n"); usage(stderr, argv[0]); } else { strcpy(batchfile, argv[i]); } } else if (argmatch(argv[i], "-datehint", 5)) { i++; if (i == argc) { errmsg("Missing argument for datehint flag"); usage(stderr, argv[0]); } else { if (!strcmp("iso", argv[i])) { set_date_hint(FMT_iso); } else if (!strcmp("european", argv[i])) { set_date_hint(FMT_european); } else if (!strcmp("us", argv[i])) { set_date_hint(FMT_us); } else if (!strcmp("nohint", argv[i])) { set_date_hint(FMT_nohint); } else { errmsg("Improper argument for datehint flag"); usage(stderr, argv[0]); } } } else if (argmatch(argv[i], "-pipe", 5)) { inpipe = TRUE; } else if (argmatch(argv[i], "-noprint", 8)) { noprint = TRUE; } else if (argmatch(argv[i], "-dpipe", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for descriptor pipe\n"); usage(stderr, argv[0]); } else { fd = atoi(argv[i]); sprintf(fd_name, "pipe<%d>", fd); if (register_real_time_input(fd, fd_name, FALSE) != RETURN_SUCCESS) { exit(1); } } } else if (argmatch(argv[i], "-npipe", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for named pipe\n"); usage(stderr, argv[0]); } else { fd = open(argv[i], O_RDONLY | O_NONBLOCK); if (fd < 0) { fprintf(stderr, "Can't open fifo\n"); } else { if (register_real_time_input(fd, argv[i], TRUE) != RETURN_SUCCESS) { exit(1); } } } #ifdef HAVE_NETCDF } else if (argmatch(argv[i], "-netcdf", 7) || argmatch(argv[i], "-hdf", 4)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for netcdf file\n"); usage(stderr, argv[0]); } else { strcpy(netcdf_name, argv[i]); } } else if (argmatch(argv[i], "-netcdfxy", 9) || argmatch(argv[i], "-hdfxy", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for netcdf X variable name\n"); usage(stderr, argv[0]); } else { strcpy(xvar_name, argv[i]); } i++; if (i == argc) { fprintf(stderr, "Missing argument for netcdf Y variable name\n"); usage(stderr, argv[0]); } else { strcpy(yvar_name, argv[i]); } if (strcmp(xvar_name, "null")) { readnetcdf(cur_graph, -1, netcdf_name, xvar_name, yvar_name, -1, -1, 1); } else { readnetcdf(cur_graph, -1, netcdf_name, NULL, yvar_name, -1, -1, 1); } #endif /* HAVE_NETCDF */ } else if (argmatch(argv[i], "-timer", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for time delay\n"); usage(stderr, argv[0]); } else { timer_delay = atoi(argv[i]); } #ifndef NONE_GUI } else if (argmatch(argv[i], "-install", 7)) { install_cmap = CMAP_INSTALL_ALWAYS; } else if (argmatch(argv[i], "-noinstall", 9)) { install_cmap = CMAP_INSTALL_NEVER; } else if (argmatch(argv[i], "-barebones", 9)) { set_barebones( TRUE ); #endif } else if (argmatch(argv[i], "-timestamp", 10)) { timestamp.active = TRUE; } else if (argmatch(argv[i], "-remove", 7)) { remove_flag = TRUE; } else if (argmatch(argv[i], "-fixed", 5)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for fixed canvas width\n"); usage(stderr, argv[0]); } else { if (i == argc - 1) { fprintf(stderr, "Missing argument for fixed canvas height\n"); usage(stderr, argv[0]); } else { wpp = atoi(argv[i]); i++; hpp = atoi(argv[i]); set_page_dimensions(wpp, hpp, FALSE); #ifndef NONE_GUI set_pagelayout(PAGE_FIXED); #endif } } #ifndef NONE_GUI } else if (argmatch(argv[i], "-free", 5)) { set_pagelayout(PAGE_FREE); #endif } else if (argmatch(argv[i], "-noask", 5)) { noask = TRUE; #ifndef NONE_GUI } else if (argmatch(argv[i], "-mono", 5)) { monomode = TRUE; #endif } else if (argmatch(argv[i], "-hdevice", 5)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for hardcopy device select flag\n"); usage(stderr, argv[0]); } else { if (set_printer_by_name(argv[i]) != RETURN_SUCCESS) { errmsg("Unknown or unsupported device"); exit(1); } } } else if (argmatch(argv[i], "-log", 2)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for log plots flag\n"); usage(stderr, argv[0]); } if (!strcmp("x", argv[i])) { set_graph_xscale(cur_graph, SCALE_LOG); } else if (!strcmp("y", argv[i])) { set_graph_yscale(cur_graph, SCALE_LOG); } else if (!strcmp("xy", argv[i])) { set_graph_xscale(cur_graph, SCALE_LOG); set_graph_yscale(cur_graph, SCALE_LOG); } else { fprintf(stderr, "%s: Improper argument for -l flag; should be one of 'x', 'y', 'xy'\n", argv[0]); } } else if (argmatch(argv[i], "-printfile", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing file name for printing\n"); usage(stderr, argv[0]); } else { set_ptofile(TRUE); strcpy(print_file, argv[i]); } } else if (argmatch(argv[i], "-hardcopy", 6)) { gracebat = TRUE; } else if (argmatch(argv[i], "-pexec", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for exec\n"); usage(stderr, argv[0]); } else { scanner(argv[i]); } } else if (argmatch(argv[i], "-graph", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing parameter for graph select\n"); usage(stderr, argv[0]); } else { sscanf(argv[i], "%d", &gno); if (set_graph_active(gno) == RETURN_SUCCESS) { cur_graph = gno; select_graph(gno); } else { fprintf(stderr, "Error activating graph %d\n", gno); } } } else if (argmatch(argv[i], "-block", 6)) { i++; if (i == argc) { fprintf(stderr, "Missing filename for block data\n"); usage(stderr, argv[0]); } else { getdata(cur_graph, argv[i], cursource, LOAD_BLOCK); } } else if (argmatch(argv[i], "-bxy", 4)) { i++; if (i == argc) { fprintf(stderr, "Missing parameter for block data set creation\n"); usage(stderr, argv[0]); } else { int nc, *cols, scol; if (field_string_to_cols(argv[i], &nc, &cols, &scol) != RETURN_SUCCESS) { errmsg("Erroneous field specifications"); return 1; } create_set_fromblock(cur_graph, NEW_SET, curtype, nc, cols, scol, autoscale_onread); xfree(cols); } } else if (argmatch(argv[i], "-nxy", 4)) { i++; if (i == argc) { fprintf(stderr, "Missing filename for nxy data\n"); usage(stderr, argv[0]); } else { getdata(cur_graph, argv[i], cursource, LOAD_NXY); } } else if (argmatch(argv[i], "-type", 2) || argmatch(argv[i], "-settype", 8)) { /* set types */ i++; curtype = get_settype_by_name(argv[i]); if (curtype == -1) { fprintf(stderr, "%s: Unknown set type '%s'\n", argv[0], argv[i]); usage(stderr, argv[0]); } } else if (argmatch(argv[i], "-graphtype", 7)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for graph type\n"); } else { if (!strcmp("xy", argv[i])) { set_graph_type(cur_graph, GRAPH_XY); } else if (!strcmp("polar", argv[i])) { set_graph_type(cur_graph, GRAPH_POLAR); } else if (!strcmp("bar", argv[i]) || !strcmp("chart", argv[i])) { set_graph_type(cur_graph, GRAPH_CHART); } else if (!strcmp("smith", argv[i])) { set_graph_type(cur_graph, GRAPH_SMITH); } else if (!strcmp("fixed", argv[i])) { set_graph_type(cur_graph, GRAPH_FIXED); } else if (!strcmp("pie", argv[i])) { set_graph_type(cur_graph, GRAPH_PIE); } else { fprintf(stderr, "%s: Improper argument for -graphtype\n", argv[0]); usage(stderr, argv[0]); } } } else if (argmatch(argv[i], "-legend", 4)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for -legend\n"); usage(stderr, argv[0]); } else { if (!strcmp("load", argv[i])) { loadlegend = TRUE; set_graph_legend_active(cur_graph, TRUE); } else { fprintf(stderr, "Improper argument for -legend\n"); usage(stderr, argv[0]); } } } else if (argmatch(argv[i], "-rvideo", 7)) { reverse_video(); } else if (argmatch(argv[i], "-param", 2)) { i++; if (i == argc) { fprintf(stderr, "Missing parameter file name\n"); usage(stderr, argv[0]); } else { if (!getparms(argv[i])) { fprintf(stderr, "Unable to read parameter file %s\n", argv[i]); } } } else if (argmatch(argv[i], "-results", 2)) { i++; if (i == argc) { fprintf(stderr, "Missing results file name\n"); usage(stderr, argv[0]); } else { /* open resfile if -results option given */ if ((resfp = grace_openw(argv[i])) == NULL) { exit(1); } setvbuf(resfp, NULL, _IOLBF, 0); } } else if (argmatch(argv[i], "-saveall", 8)) { i++; if (i == argc) { fprintf(stderr, "Missing save file name\n"); usage(stderr, argv[0]); } else { save_project(argv[i]); } } else if (argmatch(argv[i], "-wd", 3)) { i++; if (i == argc) { fprintf(stderr, "Missing parameters for working directory\n"); usage(stderr, argv[0]); } else { if (set_workingdir(argv[i]) != RETURN_SUCCESS) { fprintf(stderr, "Can't change to directory %s, fatal error", argv[i]); exit(1); } } } else if (argmatch(argv[i], "-source", 2)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for data source parameter\n"); usage(stderr, argv[0]); } if (argmatch(argv[i], "pipe", 4)) { cursource = SOURCE_PIPE; } else if (argmatch(argv[i], "disk", 4)) { cursource = SOURCE_DISK; } } else if (argmatch(argv[i], "-viewport", 2)) { i++; if (i > argc - 4) { fprintf(stderr, "Missing parameter(s) for viewport setting\n"); usage(stderr, argv[0]); } else { v.xv1 = atof(argv[i++]); v.yv1 = atof(argv[i++]); v.xv2 = atof(argv[i++]); v.yv2 = atof(argv[i]); set_graph_viewport(cur_graph, v); } } else if (argmatch(argv[i], "-world", 2)) { i++; if (i > argc - 4) { fprintf(stderr, "Missing parameter(s) for world setting\n"); usage(stderr, argv[0]); } else { w.xg1 = atof(argv[i++]); w.yg1 = atof(argv[i++]); w.xg2 = atof(argv[i++]); w.yg2 = atof(argv[i]); set_graph_world(cur_graph, w); } } else if (argmatch(argv[i], "-seed", 5)) { i++; if (i == argc) { fprintf(stderr, "Missing seed for srand48()\n"); usage(stderr, argv[0]); } else { srand48(atol(argv[i])); /* note atol() */ } } else if (argmatch(argv[i], "-maxpath", 8)) { i++; if (i == argc) { fprintf(stderr, "Missing argument for max drawing path\n"); usage(stderr, argv[0]); } else { set_max_path_limit(atoi(argv[i])); } } else if (argmatch(argv[i], "-safe", 5)) { safe_mode = TRUE; } else if (argmatch(argv[i], "-nosafe", 7)) { safe_mode = FALSE; } else if (argmatch(argv[i], "-help", 2)) { usage(stdout, argv[0]); } else if (argmatch(argv[i], "-usage", 5)) { usage(stdout, argv[0]); } else { fprintf(stderr, "No option %s\n", argv[i]); usage(stderr, argv[0]); } } else { if (i != argc) { if (getdata(cur_graph, argv[i], cursource, LOAD_SINGLE) == RETURN_SUCCESS) { set_docname(argv[i]); if (remove_flag) { unlink(argv[i]); } clear_dirtystate(); } } /* end if */ } /* end else */ } /* end for */ } /* end if */ /* * Process events. */ if (sigcatch == TRUE) { installSignal(); } /* * load legend */ if (loadlegend) { for (i = 0; i < number_of_graphs(); i++) { if (is_graph_active(i)) { for (j = 0; j < number_of_sets(i); j++) { load_comments_to_legend(i, j); } } } } /* * if -hardcopy on command line or executed as gracebat, * just plot the graph and quit */ if (gracebat == TRUE) { if (hdevice == 0) { errmsg("Terminal device can't be used for batch plotting"); exit(1); } if (inpipe == TRUE) { getdata(cur_graph, "stdin", SOURCE_DISK, LOAD_SINGLE); inpipe = FALSE; } if (batchfile[0]) { getparms(batchfile); } while (real_time_under_monitoring()) { monitor_input(ib_tbl, ib_tblsize, 0); } if (!noprint) { do_hardcopy(); } bailout(); } else { /* * go main loop */ #ifndef NONE_GUI if (cli == TRUE) { cli_loop(); } else { startup_gui(); } #else cli_loop(); #endif } /* never reaches */ exit(0); } /* * command interface loop */ void cli_loop(void) { Input_buffer *ib_stdin; int previous = -1; if (inpipe == TRUE) { getdata(get_cg(), "stdin", SOURCE_DISK, LOAD_SINGLE); inpipe = FALSE; } if (batchfile[0]) { getparms(batchfile); } if (register_real_time_input(STDIN_FILENO, "stdin", 0) != RETURN_SUCCESS) { exit(1); } for (ib_stdin = ib_tbl; ib_stdin->fd != STDIN_FILENO; ib_stdin++) { ; } while (ib_stdin->fd == STDIN_FILENO) { /* the standard input is still under monitoring */ if (ib_stdin->lineno != previous) { printf("grace:%d> ", ib_stdin->lineno + 1); fflush(stdout); previous = ib_stdin->lineno; } monitor_input(ib_tbl, ib_tblsize, 0); } } static void usage(FILE *stream, char *progname) { /* We use alphabetial order */ fprintf(stream, "Usage of %s command line arguments: \n", progname); fprintf(stream, "-autoscale [x|y|xy|none] Set autoscale type\n"); #ifndef NONE_GUI fprintf(stream, "-barebones Turn off all toolbars\n"); #endif fprintf(stream, "-batch [batch_file] Execute batch_file on start up\n"); fprintf(stream, "-block [block_data] Assume data file is block data\n"); fprintf(stream, "-bxy [x:y:etc.] Form a set from the current block data set\n"); fprintf(stream, " using the current set type from columns\n"); fprintf(stream, " given in the argument\n"); fprintf(stream, "-datehint [iso|european|us\n"); fprintf(stream, " |days|seconds|nohint] Set the hint for dates analysis\n"); fprintf(stream, " (it is only a hint for the parser)\n"); #if defined(DEBUG) fprintf(stream, "-debug [debug_level] Set debugging options\n"); #endif fprintf(stream, "-dpipe [descriptor] Read data from descriptor on startup\n"); fprintf(stream, "-fixed [width] [height] Set canvas size fixed to width*height\n"); #ifndef NONE_GUI fprintf(stream, "-free Use free page layout\n"); #endif fprintf(stream, "-graph [graph_number] Set the current graph number\n"); fprintf(stream, "-graphtype [xy|chart|fixed|polar|pie] Set the type of the current graph\n"); fprintf(stream, "-hardcopy No interactive session, just print and\n"); fprintf(stream, " quit\n"); fprintf(stream, "-hdevice [hardcopy_device_name] Set default hardcopy device\n"); #ifndef NONE_GUI fprintf(stream, "-install Install private colormap\n"); #endif fprintf(stream, "-legend [load] Turn the graph legend on\n"); fprintf(stream, "-log [x|y|xy] Set the axis scaling of the current graph\n"); fprintf(stream, " to logarithmic\n"); fprintf(stream, "-maxpath [length] Set the maximal drawing path length\n"); #ifndef NONE_GUI fprintf(stream, "-mono Run Grace in monochrome mode (affects\n"); fprintf(stream, " the display only)\n"); #endif #ifdef HAVE_NETCDF fprintf(stream, "-netcdf [netcdf file] Assume data file is in netCDF format\n"); fprintf(stream, "-netcdfxy [X var name] [Y var name] If -netcdf was used previously, read from\n"); fprintf(stream, " the netCDF file 'X var name' and 'Y\n"); fprintf(stream, " var name' and create a set. If 'X var\n"); fprintf(stream, " name' is \"null\" then load the\n"); fprintf(stream, " index of Y to X\n"); #endif fprintf(stream, "-noask Assume the answer is yes to all requests -\n"); fprintf(stream, " if the operation would overwrite a file,\n"); fprintf(stream, " grace will do so without prompting\n"); #ifndef NONE_GUI fprintf(stream, "-noinstall Don't use private colormap\n"); #endif fprintf(stream, "-noprint In batch mode, do not print\n"); fprintf(stream, "-nosafe Disable safe mode\n"); fprintf(stream, "-nosigcatch Don't catch signals\n"); fprintf(stream, "-npipe [file] Read data from named pipe on startup\n"); fprintf(stream, "-nxy [nxy_file] Assume data file is in X Y1 Y2 Y3 ...\n"); fprintf(stream, " format\n"); fprintf(stream, "-param [parameter_file] Load parameters from parameter_file to the\n"); fprintf(stream, " current graph\n"); fprintf(stream, "-pexec [parameter_string] Interpret string as a parameter setting\n"); fprintf(stream, "-pipe Read data from stdin on startup\n"); fprintf(stream, "-printfile [file for hardcopy output] Save print output to file \n"); fprintf(stream, "-remove Remove data file after read\n"); fprintf(stream, "-results [results_file] Write results of some data manipulations\n"); fprintf(stream, " to results_file\n"); fprintf(stream, "-rvideo Exchange the color indices for black and\n"); fprintf(stream, " white\n"); fprintf(stream, "-safe Safe mode (default)\n"); fprintf(stream, "-saveall [save_file] Save all to save_file\n"); fprintf(stream, "-seed [seed_value] Integer seed for random number generator\n"); fprintf(stream, "-source [disk|pipe] Source type of next data file\n"); fprintf(stream, "-timer [delay] Set allowed time slice for real time\n"); fprintf(stream, " inputs to delay ms\n"); fprintf(stream, "-timestamp Add timestamp to plot\n"); fprintf(stream, "-settype [xy|xydx|...] Set the type of the next data file\n"); fprintf(stream, "-version Show the program version\n"); fprintf(stream, "-viewport [xmin ymin xmax ymax] Set the viewport for the current graph\n"); fprintf(stream, "-wd [directory] Set the working directory\n"); fprintf(stream, "-world [xmin ymin xmax ymax] Set the world coordinates for the\n"); fprintf(stream, " current graph\n"); fprintf(stream, "-usage|-help This message\n"); fprintf(stream, "\n"); fprintf(stream, " ** If it scrolls too fast, run `%s -help | more\' **\n", progname); exit(0); } static void VersionInfo(void) { int i; fprintf(stdout, "\n%s\n\n", bi_version_string()); /* We don't want to reproduce the complete config.h, but those settings which may be related to problems on runtime */ fprintf(stdout, "GUI toolkit: %s\n", bi_gui()); #ifdef MOTIF_GUI fprintf(stdout, "Xbae version: %s\n", bi_gui_xbae()); #endif fprintf(stdout, "T1lib: %s\n", bi_t1lib()); #ifdef HAVE_FFTW fprintf(stdout, "FFT: FFTW\n"); #else fprintf(stdout, "FFT: built-in\n"); #endif #ifdef HAVE_NETCDF fprintf(stdout, "NetCDF support: on\n"); #else fprintf(stdout, "NetCDF support: off\n"); #endif #ifdef HAVE_LIBPNG fprintf(stdout, "libpng: %s\n", bi_pnglib()); #endif #ifdef HAVE_LIBJPEG fprintf(stdout, "libjpeg: %s\n", bi_libjpeg()); #endif #ifdef HAVE_LIBPDF fprintf(stdout, "PDFlib: %s\n", bi_libpdf()); #endif #ifdef DEBUG fprintf(stdout, "Debugging: enabled\n"); #endif fprintf(stdout, "Built: %s on %s\n", bi_date(), bi_system()); fprintf(stdout, "Compiler flags: %s\n", bi_ccompiler()); fprintf(stdout, "\n"); fprintf(stdout, "Registered devices:\n"); for (i = 0; i < number_of_devices(); i++) { fprintf(stdout, "%s ", get_device_name(i)); } fprintf(stdout, "\n\n"); fprintf(stdout, "(C) Copyright 1991-1995 Paul J Turner\n"); fprintf(stdout, "(C) Copyright 1996-2012 Grace Development Team\n"); fprintf(stdout, "All Rights Reserved\n"); return; } grace-5.1.23/src/graphs.h0000644000076500001440000002452410071615561014665 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __GRAPHS_H_ #define __GRAPHS_H_ #include "defines.h" /* Graph type */ typedef enum { GRAPH_XY , GRAPH_CHART, GRAPH_POLAR, GRAPH_SMITH, GRAPH_FIXED, GRAPH_PIE } GraphType; /* Set types */ typedef enum { SET_XY , SET_XYDX , SET_XYDY , SET_XYDXDX , SET_XYDYDY , SET_XYDXDY , SET_XYDXDXDYDY, SET_BAR , SET_BARDY , SET_BARDYDY , SET_XYHILO , SET_XYZ , SET_XYR , SET_XYSIZE , SET_XYCOLOR , SET_XYCOLPAT , SET_XYVMAP , SET_BOXPLOT , SET_BAD } SetType; #define NUMBER_OF_SETTYPES SET_BAD /* Data column names; */ typedef enum { DATA_X , DATA_Y , DATA_Y1, DATA_Y2, DATA_Y3, DATA_Y4, DATA_BAD } DataColumn; #define MAX_SET_COLS DATA_BAD /* target graph & set*/ typedef struct { int gno; /* graph # */ int setno; /* set # */ } target; typedef struct { int len; /* dataset length */ double *ex[MAX_SET_COLS]; /* arrays of x, y, z, ... depending on type */ char **s; /* pointer to strings */ } Dataset; typedef struct { double ex[MAX_SET_COLS]; /* x, y, dx, z, ... depending on dataset type */ char *s; /* string */ } Datapoint; typedef struct { Dataset data; /* dataset */ int hidden; /* hidden set */ int type; /* dataset type */ char comments[MAX_STRING_LENGTH]; /* how did this set originate */ int hotlink; /* hot linked set */ int hotsrc; /* source for hot linked file (DISK|PIPE) */ char hotfile[GR_MAXPATHLEN]; /* hot linked filename */ int sym; /* set plot symbol type */ double symsize; /* size of symbols */ Pen sympen; /* pen props of symbol line */ Pen symfillpen; /* pen props of symbol filling */ int symlines; /* symbol linestyle */ double symlinew; /* symbol linewidth */ int symskip; /* number of symbols to skip */ unsigned char symchar; /* char used if sym == SYM_CHAR */ int charfont; /* font for symchar if sym == SYM_CHAR */ int linet; /* set line type */ int lines; /* set line style */ double linew; /* line width */ Pen linepen; /* pen for connecting line */ int baseline_type; /* type of baseline */ int baseline; /* should the baseline be drawn */ int dropline; /* should the drop lines (from data points to the baseline) be drawn */ int filltype; /* fill type */ int fillrule; /* fill rule (winding/even-odd) */ Pen setfillpen; /* pen props for set fill */ char lstr[MAX_STRING_LENGTH]; /* legend for this set */ AValue avalue; /* Parameters for annotative string */ Errbar errbar; /* error bar properties */ } plotarr; /* Locator props */ typedef struct { int pointset; /* if (dsx, dsy) have been set */ int pt_type; /* type of locator display */ double dsx, dsy; /* locator fixed point */ int fx, fy; /* locator format type */ int px, py; /* locator precision */ } GLocator; /* * a graph */ typedef struct { int hidden; /* display or not */ int type; /* type of graph */ int maxplot; /* number of sets allocated for this graph */ int xscale; /* scale mapping of X axes*/ int yscale; /* scale mapping of Y axes*/ int xinvert; /* X axes inverted, TRUE or FALSE */ int yinvert; /* Y axes inverted, TRUE or FALSE */ int xyflip; /* whether x and y axes should be flipped */ int stacked; /* TRUE if graph is stacked */ double bargap; /* Distance between bars (in bar charts) */ double znorm; /* Normalization of pseudo-3D graphs */ plotarr *p; /* sets go here */ legend l; /* legends */ world w; /* world */ view v; /* viewport */ labels labs; /* title and subtitle */ tickmarks *t[MAXAXES]; /* flags etc. for tickmarks for all axes */ framep f; /* type of box around plot */ GLocator locator; /* locator props */ world_stack ws[MAX_ZOOM_STACK]; /* zoom stack */ int ws_top; /* stack pointer */ int curw; /* for cycling through the stack */ } graph; int get_cg(void); char *graph_types(int it); char *set_types(int it); int get_settype_by_name(char *s); int kill_graph(int gno); void kill_all_graphs(void); int copy_graph(int from, int to); int move_graph(int from, int to); int swap_graph(int from, int to); int duplicate_graph(int gno); tickmarks *new_graph_tickmarks(void); tickmarks *copy_graph_tickmarks(tickmarks *); tickmarks *get_graph_tickmarks(int gno, int a); void free_graph_tickmarks(tickmarks *t); int set_graph_tickmarks(int gno, int a, tickmarks *t); int get_graph_framep(int gno, framep *f); int get_graph_world(int gno, world *w); int get_graph_viewport(int gno, view *v); int get_graph_labels(int gno, labels *labs); int get_graph_plotarr(int gno, int i, plotarr *p); int get_graph_legend(int gno, legend *leg); int graph_allocate(int gno); int set_graph_active(int gno); void set_graph_framep(int gno, framep *f); void set_graph_world(int gno, world w); void set_graph_viewport(int gno, view v); void set_graph_labels(int gno, labels *labs); void set_graph_plotarr(int gno, int i, plotarr *p); void set_graph_legend(int gno, legend *leg); void set_graph_legend_active(int gno, int flag); int nactive(int gno); #define is_graph_active(gno) is_valid_gno(gno) int is_graph_hidden(int gno); int set_graph_hidden(int gno, int flag); int get_graph_type(int gno); int is_graph_stacked(int gno); int set_graph_stacked(int gno, int flag); double get_graph_bargap(int gno); int set_graph_bargap(int gno, double bargap); int islogx(int gno); int islogy(int gno); int islogitx(int gno); int islogity(int gno); int number_of_graphs(void); int select_graph(int gno); int realloc_graphs(int n); int realloc_graph_plots(int gno, int n); int set_graph_xscale(int gno, int scale); int set_graph_yscale(int gno, int scale); int get_graph_xscale(int gno); int get_graph_yscale(int gno); int set_graph_znorm(int gno, double norm); double get_graph_znorm(int gno); int is_valid_gno(int gno); int set_graph_type(int gno, int gtype); int allocate_set(int gno, int setno); int activateset(int gno, int setno); int is_valid_setno(int gno, int setno); int is_set_active(int gno, int setno); int is_set_hidden(int gno, int setno); int set_set_hidden(int gno, int setno, int flag); #define is_set_drawable(gno, setno) (is_set_active(gno, setno) && !is_set_hidden(gno, setno)) int number_of_sets(int gno); int load_comments_to_legend(int gno, int setno); int settype_cols(int type); int dataset_type(int gno, int setno); int dataset_cols(int gno, int setno); char *dataset_colname(int col); int is_refpoint_active(int gno); int set_refpoint(int gno, WPoint wp); WPoint get_refpoint(int gno); double *getcol(int gno, int setno, int col); #define getx(gno, setno) getcol(gno, setno, 0) #define gety(gno, setno) getcol(gno, setno, 1) char *get_legend_string(int gno, int setno); int set_legend_string(int gno, int setno, char *s); int set_dataset_type(int gno, int set, int stype); char *getcomment(int gno, int setno); int setcomment(int gno, int setno, char *s); int set_set_strings(int gno, int setno, int len, char **s); char **get_set_strings(int gno, int setno); int setlength(int gno, int setno, int length); int getsetlength(int gno, int setno); double setybase(int gno, int setno); int is_graph_xinvert(int gno); int is_graph_yinvert(int gno); int set_graph_xinvert(int gno, int flag); int set_graph_yinvert(int gno, int flag); int is_valid_axis(int gno, int axis); int is_axis_active(int gno, int axis); int is_zero_axis(int gno, int axis); void cycle_world_stack(void); void clear_world_stack(void); void show_world_stack(int n); void add_world(int gno, double x1, double x2, double y1, double y2); void push_world(void); int activate_tick_labels(int gno, int axis, int flag); int get_graph_locator(int gno, GLocator *locator); void set_graph_locator(int gno, GLocator *locator); int graph_world_stack_size(int gno); int get_world_stack_current(int gno); int get_world_stack_entry(int gno, int n, world_stack *ws); int set_set_colors(int gno, int setno, int color); int moveset(int gnofrom, int setfrom, int gnoto, int setto); int copyset(int gnofrom, int setfrom, int gnoto, int setto); int copysetdata(int gnofrom, int setfrom, int gnoto, int setto); int get_recent_setno(void); int get_recent_gno(void); int get_project_version(void); int set_project_version(int version); void reset_project_version(void); void set_project_description(char *descr); char *get_project_description(void); void postprocess_project(int version); #endif /* __GRAPHS_H_ */ grace-5.1.23/src/utils.c0000644000076500001440000007721110565160206014534 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2007 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * misc utilities * */ #include #include #include #include #include #include #include #include #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #include #ifdef HAVE_SYS_SELECT_H # include #endif #include #ifdef HAVE_SETLOCALE # include #endif #include "buildinfo.h" #include "globals.h" #include "utils.h" #include "files.h" #include "protos.h" static void rereadConfig(void); static RETSIGTYPE actOnSignal(int signo); static void bugwarn(char *signame); /* * free and check for NULL pointer */ void xfree(void *ptr) { if (ptr != NULL) { free(ptr); } } void *xmalloc(size_t size) { void *retval; if (size == 0) { retval = NULL; } else { retval = malloc(size); } if (retval == NULL && size != 0) { errmsg("Memory storage exceeded!"); } return retval; } void *xcalloc(size_t nmemb, size_t size) { void *retval; if (nmemb == 0) { retval = NULL; } else { retval = calloc(nmemb, size); } if (retval == NULL && nmemb != 0) { errmsg("Memory storage exceeded!"); } return retval; } void *xrealloc(void *ptr, size_t size) { void *retval; #if defined(REALLOC_IS_BUGGY) if (ptr == NULL) { retval = malloc(size); } else if (size == 0) { xfree(ptr); retval = NULL; } else { retval = realloc(ptr, size); } #else retval = realloc(ptr, size); if (size == 0) { retval = NULL; } #endif if (retval == NULL && size != 0) { errmsg("Memory storage exceeded!"); } return retval; } /* * swap doubles and ints */ void fswap(double *x, double *y) { double tmp; tmp = *x; *x = *y; *y = tmp; } void iswap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; } int isoneof(int c, char *s) { while (*s) { if (c == *s) { return 1; } else { s++; } } return 0; } int argmatch(char *s1, char *s2, int atleast) { int l1 = strlen(s1); int l2 = strlen(s2); if (l1 < atleast) { return 0; } if (l1 > l2) { return 0; } return (strncmp(s1, s2, l1) == 0); } /* * convert a string from lower to upper case * leaving quoted strings alone */ void lowtoupper(char *s) { int i, quoteon = FALSE; for (i = 0; i < strlen(s); i++) { if (s[i] == '"') { if (!quoteon) { quoteon = TRUE; } else if ((i > 0) && (s[i-1] != '\\')) { quoteon = FALSE; } } if (quoteon == FALSE) { if (!isprint(s[i])) { s[i] = ' '; } else if (s[i] >= 'a' && s[i] <= 'z') { s[i] -= ' '; } } } } /* * remove all that fortran nastiness */ void convertchar(char *s) { while (*s++) { if (*s == ',') *s = ' '; if (*s == 'D' || *s == 'd') *s = 'e'; } } /* * log base 2 */ int ilog2(int n) { int i = 0; int n1 = n; while (n1 >>= 1) i++; if (1 << i != n) return -1; else return i; } /* * compute the area bounded by the polygon (xi,yi) */ double comp_area(int n, double *x, double *y) { int i; double sum = 0.0; for (i = 0; i < n; i++) { sum = sum + x[i] * y[(i + 1) % n] - y[i] * x[(i + 1) % n]; } return sum * 0.5; } /* * compute the perimeter bounded by the polygon (xi,yi) */ double comp_perimeter(int n, double *x, double *y) { int i; double sum = 0.0; for (i = 0; i < n - 1; i++) { sum = sum + hypot(x[i] - x[(i + 1) % n], y[i] - y[(i + 1) % n]); } return sum; } char *dayofweekstrs[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char *dayofweekstrl[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char *monthl[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int dayofweek(double j) { int i = (int) floor(j + 1.5); return (i <= 0) ? 6 - (6 - i)%7 : i%7; } /* * escape quotes */ char *escapequotes (char *s) { static char *es = NULL; int i, k, n, len, elen; if (s == NULL) return NULL; len = strlen(s); es = xrealloc(es, (len + 1)*SIZEOF_CHAR); strcpy(es, s); n = 0; while ((es = strchr(es, '\"'))) { es++; n++; } elen = len + n + 1; es = xrealloc(es, elen*SIZEOF_CHAR); i = k = 0; while (i < len) { if (s[i] == '\"') { es[k] = '\\'; k++; } es[k] = s[i]; i++; k++; } es[elen-1] = '\0'; return es; } int sign(double a) { if (a > 0.0) { return +1; } else if (a < 0.0) { return -1; } else { return 0; } } double mytrunc(double a) { if (a > 0.0) { return floor(a); } else { return ceil(a); } } /* * exit grace */ void bailout(void) { if (!is_dirtystate() || yesno("Exit losing unsaved changes?", NULL, NULL, NULL)) { if (resfp) { grace_close(resfp); } exit(0); } } /* * Reread config (TODO) */ static void rereadConfig(void) { getparms("gracerc"); } static void please_report_the_bug(void) { fprintf(stderr, "\nPlease use \"Help/Comments\" to report the bug.\n"); #ifdef HAVE_LESSTIF fprintf(stderr, "NB. This version of Grace was compiled with LessTif.\n"); fprintf(stderr, " Make sure to read the FAQ carefully prior to\n"); fprintf(stderr, " reporting the bug, ESPECIALLY is the problem might\n"); fprintf(stderr, " be related to the graphical interface.\n"); #endif } /* * Warn about bug (TODO X message) */ static void bugwarn(char *signame) { static int emergency_save = FALSE; /* * Since we got so far, memory is probably corrupted so it's better to use * a static storage */ static char buf[GR_MAXPATHLEN]; /* number of interrupts received during the emergency save */ static int interrupts; if (emergency_save != FALSE) { /* don't mind signals anymore: we're in emergency save mode already */ interrupts++; if (interrupts > 10) { fprintf(stderr, "oh, no luck :-(\n"); please_report_the_bug(); abort(); } return; } else { emergency_save = TRUE; interrupts = 0; fprintf(stderr, "\a\nOops! Got %s\n", signame); if (is_dirtystate()) { strcpy(buf, get_docname()); strcat(buf, "$"); fprintf(stderr, "Trying to save your work into file \"%s\"... ", buf); fflush(stderr); noask = TRUE; if (save_project(buf) == RETURN_SUCCESS) { fprintf(stderr, "ok!\n"); } else { fprintf(stderr, "oh, no luck :-(\n"); } } please_report_the_bug(); abort(); } } /* * Signal-handling routines */ static RETSIGTYPE actOnSignal(int signo) { char signame[16]; installSignal(); switch (signo) { #ifdef SIGHUP case SIGHUP: rereadConfig(); break; #endif #ifdef SIGINT case SIGINT: #endif #ifdef SIGQUIT case SIGQUIT: #endif #ifdef SIGTERM case SIGTERM: #endif bailout(); break; #ifdef SIGILL case SIGILL: strcpy(signame, "SIGILL"); #endif #ifdef SIGFPE case SIGFPE: strcpy(signame, "SIGFPE"); #endif #ifdef SIGBUS case SIGBUS: strcpy(signame, "SIGBUS"); #endif #ifdef SIGSEGV case SIGSEGV: strcpy(signame, "SIGSEGV"); #endif #ifdef SIGSYS case SIGSYS: strcpy(signame, "SIGSYS"); #endif bugwarn(signame); break; default: break; } } void installSignal(void){ #ifdef SIGHUP signal(SIGHUP, actOnSignal); /* hangup */ #endif #ifdef SIGINT signal(SIGINT, actOnSignal); /* interrupt */ #endif #ifdef SIGQUIT signal(SIGQUIT, actOnSignal); /* quit */ #endif #ifdef SIGILL signal(SIGILL, actOnSignal); /* illegal instruction */ #endif #ifdef SIGFPE signal(SIGFPE, actOnSignal); /* floating point exception */ #endif #ifdef SIGBUS signal(SIGBUS, actOnSignal); /* bus error */ #endif #ifdef SIGSEGV signal(SIGSEGV, actOnSignal); /* segmentation violation */ #endif #ifdef SIGSYS signal(SIGSYS, actOnSignal); /* bad argument to system call */ #endif #ifdef SIGTERM signal(SIGTERM, actOnSignal); /* software termination signal */ #endif #ifdef SIGALRM signal(SIGALRM, actOnSignal); /* timer */ #endif #ifdef SIGIO signal(SIGIO, actOnSignal); /* input/output ready */ #endif } /* create format string */ char *create_fstring(int form, int prec, double loc, int type) { char format[64], *eng_prefix,*comp_prefix; static char s[MAX_STRING_LENGTH]; double tmp; int m, d, y, h, mm, sec; double arcmin, arcsec; int exponent; double mantissa; int yprec; if (two_digits_years_allowed()) { yprec = 2; } else { yprec = 4; } /* for locale decimal points */ set_locale_num(TRUE); strcpy(format, "%.*lf"); switch (form) { case FORMAT_DECIMAL: sprintf(s, format, prec, loc); tmp = atof(s); /* fix reverse axes problem when loc == -0.0 */ if (tmp == 0.0) { strcpy(format, "%.*lf"); loc = 0.0; sprintf(s, format, prec, loc); } break; case FORMAT_EXPONENTIAL: strcpy(format, "%.*le"); sprintf(s, format, prec, loc); tmp = atof(s); /* fix reverse axes problem when loc == -0.0 */ if (tmp == 0.0) { strcpy(format, "%.*le"); loc = 0.0; sprintf(s, format, prec, loc); } break; case FORMAT_SCIENTIFIC: if (loc != 0.0) { exponent = (int) floor(log10(fabs(loc))); mantissa = loc/pow(10.0, (double) exponent); if (type == LFORMAT_TYPE_EXTENDED) { strcpy(format, "%.*f\\x\\c4\\C\\f{}10\\S%d\\N"); } else { strcpy(format, "%.*fx10(%d)"); } sprintf(s, format, prec, mantissa, exponent); } else { strcpy(format, "%.*f"); sprintf(s, format, prec, 0.0); } break; case FORMAT_COMPUTING: /* As per FORMAT_GENERAL but uses computer notation (K,M,G,...) * to give the value in multiples of the powers of 1024 */ if (loc != 0.0) { exponent = (int) floor(log2(fabs(loc))); if (exponent < 10) { exponent = 0; } else if (exponent > 80) { exponent = 80; } else { exponent = (int) floor((double) exponent/10)*10; } } else { exponent = 0; } /* use next prefix if we would get 1024 because ** of the print precision requested. This happens ** for values slightly less than 1024. */ sprintf(s, "%.*g", prec, loc/(pow(2.0, exponent))); if ((exponent < 80) && (strcmp(s, "1024") == 0)){ exponent += 10; } switch (exponent) { case 10: /* kilo */ comp_prefix = "K"; break; case 20: /* Mega */ comp_prefix = "M"; break; case 30: /* Giga */ comp_prefix = "G"; break; case 40: /* Tera */ comp_prefix = "T"; break; case 50: /* Peta */ comp_prefix = "P"; break; case 60: /* Exa */ comp_prefix = "E"; break; case 70: /* Zetta */ comp_prefix = "Z"; break; case 80: /* Yotta */ comp_prefix = "Y"; break; default: comp_prefix = ""; break; } sprintf(s,"%.*g%s", prec, loc/(pow(2.0, exponent)), comp_prefix); tmp = atof(s); /* fix reverse axes problem when loc == -0.0 */ if (tmp == 0.0) { strcpy(format, "%lg"); loc = 0.0; sprintf(s, format, loc); } break; case FORMAT_ENGINEERING: if (loc != 0.0) { exponent = (int) floor(log10(fabs(loc))); if (exponent < -24) { exponent = -24; } else if (exponent > 24) { exponent = 24; } else { exponent = (int) floor((double) exponent/3)*3; } } else { exponent = 0; } switch (exponent) { case -24: /* yocto */ eng_prefix = "y"; break; case -21: /* zepto */ eng_prefix = "z"; break; case -18: /* atto */ eng_prefix = "a"; break; case -15: /* fempto */ eng_prefix = "f"; break; case -12: /* pico */ eng_prefix = "p"; break; case -9: /* nano */ eng_prefix = "n"; break; case -6: /* micro */ if (type == LFORMAT_TYPE_EXTENDED) { eng_prefix = "\\xm\\f{}"; } else { eng_prefix = "mk"; } break; case -3: /* milli */ eng_prefix = "m"; break; case 3: /* kilo */ eng_prefix = "k"; break; case 6: /* Mega */ eng_prefix = "M"; break; case 9: /* Giga */ eng_prefix = "G"; break; case 12: /* Tera */ eng_prefix = "T"; break; case 15: /* Peta */ eng_prefix = "P"; break; case 18: /* Exa */ eng_prefix = "E"; break; case 21: /* Zetta */ eng_prefix = "Z"; break; case 24: /* Yotta */ eng_prefix = "Y"; break; default: eng_prefix = ""; break; } strcpy(format, "%.*f %s"); sprintf(s, format, prec, loc/(pow(10.0, exponent)), eng_prefix); break; case FORMAT_POWER: if (loc < 0.0) { loc = log10(-loc); if (type == LFORMAT_TYPE_EXTENDED) { strcpy(format, "-10\\S%.*lf\\N"); } else { strcpy(format, "-10(%.*lf)\\N"); } } else if (loc == 0.0) { sprintf(format, "%.*f", prec, 0.0); } else { loc = log10(loc); if (type == LFORMAT_TYPE_EXTENDED) { strcpy(format, "10\\S%.*lf\\N"); } else { strcpy(format, "10(%.*lf)\\N"); } } sprintf(s, format, prec, loc); break; case FORMAT_GENERAL: strcpy(format, "%.*lg"); sprintf(s, format, prec, loc); tmp = atof(s); if (tmp == 0.0) { strcpy(format, "%lg"); loc = 0.0; sprintf(s, format, loc); } break; case FORMAT_DDMMYY: strcpy(format, "%02d-%02d-%0*d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, d, m, yprec, y); break; case FORMAT_MMDDYY: strcpy(format, "%02d-%02d-%0*d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, m, d, yprec, y); break; case FORMAT_YYMMDD: strcpy(format, "%0*d-%02d-%02d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, yprec, y, m, d); break; case FORMAT_MMYY: strcpy(format, "%02d-%0*d"); jul_to_cal_and_time(loc, ROUND_MONTH, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, m, yprec, y); break; case FORMAT_MMDD: strcpy(format, "%02d-%02d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, m, d); break; case FORMAT_MONTHDAY: strcpy(format, "%s-%02d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); if (m - 1 < 0 || m - 1 > 11) { sprintf(s, format, "???"); } else { sprintf(s, format, months[m - 1], d); } break; case FORMAT_DAYMONTH: strcpy(format, "%02d-%s"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); if (m - 1 < 0 || m - 1 > 11) { sprintf(s, format, "???"); } else { sprintf(s, format, d, months[m - 1]); } break; case FORMAT_MONTHS: strcpy(format, "%s"); jul_to_cal_and_time(loc, ROUND_MONTH, &y, &m, &d, &h, &mm, &sec); if (m - 1 < 0 || m - 1 > 11) { sprintf(s, format, "???"); } else { sprintf(s, format, months[m - 1]); } break; case FORMAT_MONTHSY: strcpy(format, "%s-%0*d"); jul_to_cal_and_time(loc, ROUND_MONTH, &y, &m, &d, &h, &mm, &sec); if (m - 1 < 0 || m - 1 > 11) { sprintf(s, format, "???"); } else { sprintf(s, format, months[m - 1], yprec, y); } break; case FORMAT_MONTHL: strcpy(format, "%s"); jul_to_cal_and_time(loc, ROUND_MONTH, &y, &m, &d, &h, &mm, &sec); if (m - 1 < 0 || m - 1 > 11) { sprintf(s, format, "???"); } else { sprintf(s, format, monthl[m - 1]); } break; case FORMAT_DAYOFWEEKS: strcpy(format, "%s"); sprintf(s, format, dayofweekstrs[dayofweek(loc + get_ref_date())]); break; case FORMAT_DAYOFWEEKL: strcpy(format, "%s"); sprintf(s, format, dayofweekstrl[dayofweek(loc + get_ref_date())]); break; case FORMAT_DAYOFYEAR: strcpy(format, "%d"); jul_to_cal_and_time(loc, ROUND_DAY, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, 1 + (int) (cal_to_jul(y, m, d) - cal_to_jul(y, 1, 1))); break; case FORMAT_HMS: strcpy(format, "%02d:%02d:%02d"); jul_to_cal_and_time(loc, ROUND_SECOND, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, h, mm, sec); break; case FORMAT_MMDDHMS: strcpy(format, "%02d-%02d %02d:%02d:%02d"); jul_to_cal_and_time(loc, ROUND_SECOND, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, m, d, h, mm, sec); break; case FORMAT_MMDDYYHMS: strcpy(format, "%02d-%02d-%d %02d:%02d:%02d"); jul_to_cal_and_time(loc, ROUND_SECOND, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, m, d, y, h, mm, sec); break; case FORMAT_YYMMDDHMS: strcpy(format, "%0*d-%02d-%02d %02d:%02d:%02d"); jul_to_cal_and_time(loc, ROUND_SECOND, &y, &m, &d, &h, &mm, &sec); sprintf(s, format, yprec, y, m, d, h, mm, sec); break; case FORMAT_DEGREESLON: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%.*lfW"); } else if (loc > 0.0) { strcpy(format, "%.*lfE"); } else { strcpy(format, "0"); } sprintf(s, format, prec, loc); break; case FORMAT_DEGREESMMLON: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d %.*lf' W"); } else if (loc > 0.0) { strcpy(format, "%d %.*lf' E"); } else { strcpy(format, "0 0'"); } y = loc; arcmin = (loc - y) * 60.0; sprintf(s, format, y, prec, arcmin); break; case FORMAT_DEGREESMMSSLON: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d %d' %.*lf\" W"); } else if (loc > 0.0) { strcpy(format, "%d %d' %.*lf\" E"); } else { strcpy(format, "0 0' 0\""); } y = loc; arcsec = (loc - y) * 3600.0; m = arcsec / 60.0; arcsec = (arcsec - m * 60); sprintf(s, format, y, m, prec, arcsec); break; case FORMAT_MMSSLON: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d' %.*lf\" W"); } else if (loc > 0.0) { strcpy(format, "%d' %.*lf\" E"); } else { strcpy(format, "0 0' 0\""); } y = loc; arcsec = (loc - y) * 3600.0; m = arcsec / 60.0; arcsec = (arcsec - m * 60); sprintf(s, format, m, prec, arcsec); break; case FORMAT_DEGREESLAT: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%.*lfS"); } else if (loc > 0.0) { strcpy(format, "%.*lfN"); } else { strcpy(format, "0"); } sprintf(s, format, prec, loc); break; case FORMAT_DEGREESMMLAT: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d %.*lf' S"); } else if (loc > 0.0) { strcpy(format, "%d %.*lf' N"); } else { strcpy(format, "0 0'"); } y = loc; arcsec = (loc - y) * 60.0; sprintf(s, format, y, prec, arcsec); break; case FORMAT_DEGREESMMSSLAT: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d %d' %.*lf\" S"); } else if (loc > 0.0) { strcpy(format, "%d %d' %.*lf\" N"); } else { strcpy(format, "0 0' 0\""); } y = loc; arcsec = (loc - y) * 3600.0; m = arcsec / 60.0; arcsec = (arcsec - m * 60); sprintf(s, format, y, m, prec, arcsec); break; case FORMAT_MMSSLAT: if (loc < 0.0) { loc *= -1.0; strcpy(format, "%d' %.*lf\" S"); } else if (loc > 0.0) { strcpy(format, "%d' %.*lf\" N"); } else { strcpy(format, "0 0' 0\""); } y = loc; arcsec = (loc - y) * 3600.0; m = arcsec / 60.0; arcsec = (arcsec - m * 60); sprintf(s, format, m, prec, arcsec); break; default: sprintf(s, format, prec, loc); break; } /* revert to POSIX */ set_locale_num(FALSE); return(s); } int bin_dump(char *value, int i, int pad) { char *word; if (i > pad - 1) { return 0; } word = value; #ifdef WORDS_BIGENDIAN return (((*word)>>i)&0x01); #else switch (pad) { case 8: return (((*word)>>i)&0x01); break; case 16: if (i < 8) { word++; return (((*word)>>i)&0x01); } else { return (((*word)>>(8 - i))&0x01); } break; case 32: if (i < 8) { word += 2; return (((*word)>>i)&0x01); } else if (i < 16) { word++; return (((*word)>>(8 - i))&0x01); } else { return (((*word)>>(16 - i))&0x01); } break; default: return 0; } #endif } unsigned char reversebits(unsigned char inword) { int i; unsigned char result = 0; for (i = 0; i <= 7; i++) { result |= (((inword)>>i)&0x01)<<(7 - i); } return (result); } char *copy_string(char *dest, const char *src) { if (src == dest) { ; } else if (src == NULL) { xfree(dest); dest = NULL; } else { dest = xrealloc(dest, (strlen(src) + 1)*SIZEOF_CHAR); strcpy(dest, src); } return(dest); } char *concat_strings(char *dest, const char *src) { if (src != NULL) { if (dest == NULL) { dest = copy_string(NULL, src); } else { dest = xrealloc(dest, (strlen(dest) + strlen(src) + 1)*SIZEOF_CHAR); if (dest != NULL) { strcat(dest, src); } } } return(dest); } int compare_strings(const char *s1, const char *s2) { if (s1 == NULL && s2 == NULL) { return TRUE; } else if (s1 == NULL || s2 == NULL) { return FALSE; } else { return (strcmp(s1, s2) == 0); } } /* location of Grace home directory */ static char grace_home[GR_MAXPATHLEN] = GRACE_HOME; char *get_grace_home(void) { return grace_home; } void set_grace_home(const char *dir) { strncpy(grace_home, dir, GR_MAXPATHLEN - 1); } /* print command */ static char print_cmd[GR_MAXPATHLEN] = GRACE_PRINT_CMD; char *get_print_cmd(void) { return print_cmd; } void set_print_cmd(const char *cmd) { strncpy(print_cmd, cmd, GR_MAXPATHLEN - 1); } /* editor */ static char grace_editor[GR_MAXPATHLEN] = GRACE_EDITOR; char *get_editor(void) { return grace_editor; } void set_editor(const char *cmd) { strncpy(grace_editor, cmd, GR_MAXPATHLEN - 1); } static char help_viewer[GR_MAXPATHLEN] = GRACE_HELPVIEWER; char *get_help_viewer(void) { return help_viewer; } void set_help_viewer(const char *dir) { strncpy(help_viewer, dir, GR_MAXPATHLEN - 1); } /* project file name */ static char docname[GR_MAXPATHLEN] = NONAME; char *get_docname(void) { return docname; } char *get_docbname(void) { static char buf[GR_MAXPATHLEN]; char *bufp; strcpy(buf, mybasename(docname)); bufp = strrchr(buf, '.'); if (bufp) { *(bufp) = '\0'; } return buf; } void set_docname(const char *s) { if (s != NULL) { strncpy(docname, s, GR_MAXPATHLEN - 1); } else { strcpy(docname, NONAME); } } void errmsg(const char *buf) { #ifdef NONE_GUI fprintf(stderr, "%s\n", buf); #else if (inwin) { errwin(buf); } else { fprintf(stderr, "%s\n", buf); } #endif } int yesnoterm(char *msg) { return 1; } int yesno(char *msg, char *s1, char *s2, char *help_anchor) { if (noask) { return 1; } #ifdef NONE_GUI return (yesnoterm(msg)); #else if (inwin) { return (yesnowin(msg, s1, s2, help_anchor)); } else { return (yesnoterm(msg)); } #endif } void stufftext(char *s) { #ifdef NONE_GUI printf(s); #else if (inwin) { stufftextwin(s); } else { printf(s); } #endif /* log results to file */ if (resfp != NULL) { fprintf(resfp, s); } } char *mybasename(const char *s) { int start, end; static char basename[GR_MAXPATHLEN]; s = path_translate(s); if (s == NULL) { errmsg("Could not translate basename:"); return "???"; } end = strlen(s) - 1; /* root is a special case */ if (end == 0 && *s == '/'){ basename[0] = '/'; return basename; } /* strip trailing white space and slashes */ while (s[end] == '/' || s[end] == ' ' || s[end] == '\t') { end--; } /* find start of basename */ start = end; do { start--; } while (start >= 0 && s[start] != '/'); strncpy(basename, s + (start + 1), end - start); basename[end - start] = '\0'; return basename; } static char workingdir[GR_MAXPATHLEN]; int set_workingdir(const char *wd) { char buf[GR_MAXPATHLEN]; if (wd == NULL) { getcwd(workingdir, GR_MAXPATHLEN - 1); if (workingdir[strlen(workingdir)-1] != '/') { strcat(workingdir, "/"); } return RETURN_SUCCESS; } strncpy(buf, wd, GR_MAXPATHLEN - 1); if (buf[0] == '~') { expand_tilde(buf); } if (chdir(buf) >= 0) { strncpy(workingdir, buf, GR_MAXPATHLEN - 1); if (workingdir[strlen(workingdir)-1] != '/') { strcat(workingdir, "/"); } return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } char *get_workingdir(void) { return workingdir; } static char *username = NULL; void init_username(void) { char *s; /* * We don't use it for any kind of authentication, so why not let * user to customize her name? :) */ s = getenv("LOGNAME"); if (s == NULL || s[0] == '\0') { s = getlogin(); if (s == NULL || s[0] == '\0') { s = "a user"; } } username = copy_string(username, s); } char *get_username(void) { return username; } static char *userhome = NULL; void init_userhome(void) { userhome = copy_string(NULL, getenv("HOME")); if (userhome == NULL || userhome[strlen(userhome) - 1] != '/') { userhome = concat_strings(userhome, "/"); } } char *get_userhome(void) { return userhome; } /* TODO this needs some work */ void expand_tilde(char *buf) { char buf2[GR_MAXPATHLEN]; if (buf[0] == '~') { if (strlen(buf) == 1) { strcpy(buf, get_userhome()); } else if (buf[1] == '/') { if (strlen(buf) > 2) { strcpy(buf2, get_userhome()); strcat(buf2, buf + 1); strcpy(buf, buf2); } else { strcpy(buf, get_userhome()); } } else { char tmp[128], *pp = tmp, *q = buf + 1; struct passwd *pent; while (*q && (*q != '/')) { *pp++ = *q++; } *pp = 0; if ((pent = getpwnam(tmp)) != NULL) { strcpy(buf2, pent->pw_dir); strcat(buf2, "/"); strcat(buf2, q); strcpy(buf, buf2); } else { errmsg("No user by that name"); } } } } void echomsg(char *msg) { if (inwin) { #ifndef NONE_GUI set_left_footer(msg); #endif } else { printf("%s\n", msg); } } static void update_timestamp(void) { struct tm tm; time_t time_value; char *str; (void) time(&time_value); tm = *localtime(&time_value); str = asctime(&tm); if (str[strlen(str) - 1] == '\n') { str[strlen(str) - 1]= '\0'; } set_plotstr_string(×tamp, str); } void update_app_title(void) { #ifndef NONE_GUI set_title(mybasename(get_docname())); #endif } /* * dirtystate routines */ static int dirtystate = 0; static int dirtystate_lock = FALSE; void set_dirtystate(void) { if (dirtystate_lock == FALSE) { dirtystate++; update_timestamp(); update_app_title(); /* * TODO: * if ( (dirtystate > SOME_LIMIT) || * (current_time - autosave_time > ANOTHER_LIMIT) ) { * autosave(); * } */ } } void clear_dirtystate(void) { dirtystate = 0; dirtystate_lock = FALSE; update_app_title(); } void lock_dirtystate(flag) { dirtystate_lock = flag; } int is_dirtystate(void) { return (dirtystate ? TRUE:FALSE); } int system_wrap(const char *string) { return system(string); } void msleep_wrap(unsigned int msec) { struct timeval timeout; timeout.tv_sec = msec / 1000; timeout.tv_usec = 1000 * (msec % 1000); select(0, NULL, NULL, NULL, &timeout); } #ifdef HAVE_SETLOCALE static int need_locale = FALSE; static char *system_locale_string, *posix_locale_string; int init_locale(void) { char *s; s = setlocale(LC_NUMERIC, ""); if (s == NULL) { /* invalid/unsupported locale */ return RETURN_FAILURE; } else if (!strcmp(s, "C")) { /* don't enable need_locale, since the system locale is C */ return RETURN_SUCCESS; } else { system_locale_string = copy_string(NULL, s); s = setlocale(LC_NUMERIC, "C"); posix_locale_string = copy_string(NULL, s); need_locale = TRUE; return RETURN_SUCCESS; } } void set_locale_num(int flag) { if (need_locale) { if (flag == TRUE) { setlocale(LC_NUMERIC, system_locale_string); } else { setlocale(LC_NUMERIC, posix_locale_string); } } } #else int init_locale(void) { return RETURN_SUCCESS; } void set_locale_num(int flag) { } #endif /* * Build info stuff */ long bi_version_id(void) { return BI_VERSION_ID; } char *bi_version_string(void) { return BI_VERSION; } char *bi_system(void) { return BI_SYSTEM; } char *bi_date(void) { return BI_DATE; } char *bi_gui(void) { return BI_GUI; } #ifdef MOTIF_GUI char *bi_gui_xbae(void) { return BI_GUI_XBAE; } #endif char *bi_t1lib(void) { return BI_T1LIB; } #ifdef HAVE_LIBPNG char *bi_pnglib(void) { return BI_PNGLIB; } #endif #ifdef HAVE_LIBJPEG char *bi_libjpeg(void) { return BI_LIBJPEG; } #endif #ifdef HAVE_LIBPDF char *bi_libpdf(void) { return BI_LIBPDF; } #endif char *bi_ccompiler(void) { return BI_CCOMPILER; } #ifdef DEBUG static int debuglevel = 0; void set_debuglevel(int level) { debuglevel = level; } int get_debuglevel(void) { return debuglevel; } #endif grace-5.1.23/src/plotone.c0000644000076500001440000021474410243173541015057 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * plotone.c - entry for graphics * */ #include #include #include #include #include #include #include "globals.h" #include "utils.h" #include "files.h" #include "graphs.h" #include "draw.h" #include "device.h" #include "plotone.h" #include "protos.h" FILE *prstream; char print_file[GR_MAXPATHLEN] = ""; /* * draw all active graphs */ void drawgraph(void) { int i; VPoint vp1, vp2; Pen pen; int saveg; saveg = get_cg(); if (initgraphics() == RETURN_FAILURE) { errmsg("Device wasn't properly initialized"); return; } setclipping(FALSE); if (getbgfill() == TRUE) { pen.color = getbgcolor(); pen.pattern = 1; setpen(pen); vp1.x = 0.0; vp1.y = 0.0; get_page_viewport(&vp2.x, &vp2.y); FillRect(vp1, vp2); } reset_bboxes(); activate_bbox(BBOX_TYPE_GLOB, TRUE); activate_bbox(BBOX_TYPE_TEMP, FALSE); for (i = 0; i < number_of_graphs(); i++) { plotone(i); } /* draw objects NOT clipped to a particular graph */ draw_objects(-1); draw_timestamp(); if (get_cg() != saveg) { select_graph(saveg); } leavegraphics(); } /* * If writing to a file, check to see if it exists */ void do_hardcopy(void) { char tbuf[128], *s; char fname[GR_MAXPATHLEN]; view v; double vx, vy; int truncated_out; if (get_ptofile()) { if (print_file[0] == '\0') { Device_entry dev = get_device_props(hdevice); sprintf(print_file, "%s.%s", get_docbname(), dev.fext); } strcpy(fname, print_file); } else { s = get_print_cmd(); if (s == NULL || s[0] == '\0') { errmsg("No print command defined, output aborted"); return; } tmpnam(fname); /* VMS doesn't like extensionless files */ strcat(fname, ".prn"); } prstream = grace_openw(fname); if (prstream == NULL) { return; } select_device(hdevice); drawgraph(); grace_close(prstream); v = get_bbox(BBOX_TYPE_GLOB); get_page_viewport(&vx, &vy); if (v.xv1 < 0.0 || v.xv2 > vx || v.yv1 < 0.0 || v.yv2 > vy) { truncated_out = TRUE; } else { truncated_out = FALSE; } if (get_ptofile() == FALSE) { sprintf(tbuf, "%s %s", get_print_cmd(), fname); if (truncated_out == FALSE || yesno("Printout is truncated. Continue?", NULL, NULL, NULL)) { system_wrap(tbuf); } #ifndef PRINT_CMD_UNLINKS unlink(fname); #endif } else { if (truncated_out == TRUE) { errmsg("Output is truncated - tune device dimensions"); } } select_device(tdevice); } void plotone(int gno) { GraphType gtype; if (is_graph_active(gno) != TRUE || is_graph_hidden(gno) == TRUE) { return; } setclipping(TRUE); set_draw_mode(TRUE); if (select_graph(gno) != RETURN_SUCCESS) { return; } /* fill frame */ fillframe(gno); gtype = get_graph_type(gno); if (gtype != GRAPH_PIE) { /* calculate tick mark positions for all axes */ calculate_tickgrid(gno); /* draw grid lines */ drawgrid(gno); } /* plot type specific routines */ switch(gtype) { case GRAPH_POLAR: draw_polar_graph(gno); break; case GRAPH_SMITH: draw_smith_chart(gno); break; case GRAPH_PIE: draw_pie_chart(gno); break; default: xyplot(gno); break; } if (gtype != GRAPH_PIE) { /* plot axes and tickmarks */ drawaxes(gno); } /* plot frame */ drawframe(gno); /* plot objects */ draw_objects(gno); if (gtype != GRAPH_PIE) { /* plot legends */ dolegend(gno); } /* draw title and subtitle */ draw_titles(gno); /* draw regions and mark the reference points only if in interactive mode */ if (terminal_device() == TRUE) { draw_regions(gno); draw_ref_point(gno); } } void draw_smith_chart(int gno) { } void draw_pie_chart(int gno) { int i, setno, nsets = 0; plotarr p; view v; world w; int sgn; VPoint vpc, vp1, vp2, vps[3], vpa; VVector offset; double r, start_angle, stop_angle; double e_max, norm; double *x, *c, *e, *pt; AValue avalue; char str[MAX_STRING_LENGTH]; get_graph_viewport(gno, &v); vpc.x = (v.xv1 + v.xv2)/2; vpc.y = (v.yv1 + v.yv2)/2; get_graph_world(gno, &w); sgn = is_graph_xinvert(gno) ? -1:1; for (setno = 0; setno < number_of_sets(gno); setno++) { if (is_set_drawable(gno, setno)) { nsets++; if (nsets > 1) { errmsg("Only one set per pie chart can be drawn"); return; } switch (dataset_type(gno, setno)) { case SET_XY: case SET_XYCOLOR: case SET_XYCOLPAT: get_graph_plotarr(gno, setno, &p); /* data */ x = getcol(gno, setno, DATA_X); /* explode factor */ e = getcol(gno, setno, DATA_Y); /* colors */ c = getcol(gno, setno, DATA_Y1); /* patterns */ pt = getcol(gno, setno, DATA_Y2); /* get max explode factor */ e_max = 0.0; for (i = 0; i < p.data.len; i++) { e_max = MAX2(e_max, e[i]); } r = 0.8/(1.0 + e_max)*MIN2(v.xv2 - v.xv1, v.yv2 - v.yv1)/2; norm = 0.0; for (i = 0; i < p.data.len; i++) { if (x[i] < 0.0) { errmsg("No negative values in pie charts allowed"); return; } if (e[i] < 0.0) { errmsg("No negative offsets in pie charts allowed"); return; } norm += x[i]; } stop_angle = w.xg1; for (i = 0; i < p.data.len; i++) { Pen pen; start_angle = stop_angle; stop_angle = start_angle + sgn*2*M_PI*x[i]/norm; offset.x = e[i]*r*cos((start_angle + stop_angle)/2.0); offset.y = e[i]*r*sin((start_angle + stop_angle)/2.0); vps[0].x = vpc.x + r*cos(start_angle) + offset.x; vps[0].y = vpc.y + r*sin(start_angle) + offset.y; vps[1].x = vpc.x + offset.x; vps[1].y = vpc.y + offset.y; vps[2].x = vpc.x + r*cos(stop_angle) + offset.x; vps[2].y = vpc.y + r*sin(stop_angle) + offset.y; vp1.x = vpc.x - r + offset.x; vp1.y = vpc.y - r + offset.y; vp2.x = vpc.x + r + offset.x; vp2.y = vpc.y + r + offset.y; if (c != NULL) { pen.color = (int) rint(c[i]); } else { pen.color = p.symfillpen.color; } if (pt != NULL) { pen.pattern = (int) rint(pt[i]); } else { pen.pattern = p.symfillpen.pattern; } setpen(pen); DrawFilledArc(vp1, vp2, (int) rint(180.0/M_PI*start_angle), (int) rint(180.0/M_PI*stop_angle), ARCFILL_PIESLICE); setpen(p.sympen); setlinewidth(p.symlinew); setlinestyle(p.symlines); DrawPolyline(vps, 3, POLYLINE_OPEN); DrawArc(vp1, vp2, (int) rint(180.0/M_PI*start_angle), (int) rint(180.0/M_PI*stop_angle)); avalue = p.avalue; if (avalue.active == TRUE) { vpa.x = vpc.x + ((1 + e[i])*r + avalue.offset.y)* cos((start_angle + stop_angle)/2.0); vpa.y = vpc.y + ((1 + e[i])*r + avalue.offset.y)* sin((start_angle + stop_angle)/2.0); strcpy(str, avalue.prestr); switch(avalue.type) { case AVALUE_TYPE_X: strcat(str, create_fstring(avalue.format, avalue.prec, x[i], LFORMAT_TYPE_EXTENDED)); break; case AVALUE_TYPE_STRING: if (p.data.s != NULL && p.data.s[i] != NULL) { strcat(str, p.data.s[i]); } break; default: continue; } strcat(str, avalue.appstr); setcharsize(avalue.size); setfont(avalue.font); setcolor(avalue.color); WriteString(vpa, avalue.angle, JUST_CENTER|JUST_MIDDLE, str); } } break; default: errmsg("Unsupported in pie chart set type"); break; } } } } void draw_polar_graph(int gno) { int i; plotarr p; for (i = 0; i < number_of_sets(gno); i++) { if (is_set_drawable(gno, i)) { get_graph_plotarr(gno, i, &p); switch (dataset_type(gno, i)) { case SET_XY: case SET_XYSIZE: case SET_XYCOLOR: case SET_XYZ: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; default: errmsg("Unsupported in polar graph set type"); break; } } } } void xyplot(int gno) { int i, j; plotarr p; int refn; double *refx, *refy; double offset, epsilon; refn = 0; offset = 0.0; refx = NULL; refy = NULL; /* draw sets */ switch (get_graph_type(gno)) { case GRAPH_XY: for (i = 0; i < number_of_sets(gno); i++) { if (is_set_drawable(gno, i)) { get_graph_plotarr(gno, i, &p); switch (dataset_type(gno, i)) { case SET_XY: case SET_XYSIZE: case SET_XYCOLOR: case SET_XYZ: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_BAR: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetbars(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_BARDY: case SET_BARDYDY: drawsetline(gno, i, &p, refn, refx, refy, offset); drawsetbars(gno, i, &p, refn, refx, refy, offset); drawseterrbars(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); break; case SET_XYDX: case SET_XYDY: case SET_XYDXDX: case SET_XYDYDY: case SET_XYDXDY: case SET_XYDXDXDYDY: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawseterrbars(gno, i, &p, 0, NULL, NULL, 0.0); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_XYHILO: drawsethilo(&p); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_XYVMAP: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetvmap(gno, &p); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_BOXPLOT: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetboxplot(&p); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; default: errmsg("Unsupported in XY graph set type"); break; } } } break; case GRAPH_CHART: for (i = 0; i < number_of_sets(gno); i++) { get_graph_plotarr(gno, i, &p); if (is_set_drawable(gno, i)) { if (p.data.len > refn) { refn = p.data.len; refx = p.data.ex[0]; } if (is_graph_stacked(gno) != TRUE) { offset -= 0.5*0.02*p.symsize; } } } offset -= 0.5*(nactive(gno) - 1)*get_graph_bargap(gno); if (is_graph_stacked(gno) == TRUE) { refy = xcalloc(refn, SIZEOF_DOUBLE); if (refy == NULL) { return; } } if (refx) { double xmin, xmax; int imin, imax; minmax(refx, refn, &xmin, &xmax, &imin, &imax); epsilon = 1.0e-3*(xmax - xmin)/refn; } else { epsilon = 0.0; } for (i = 0; i < number_of_sets(gno); i++) { int x_ok; double *x; get_graph_plotarr(gno, i, &p); if (is_set_drawable(gno, i)) { /* check that abscissas are identical with refx */ x = getcol(gno, i, DATA_X); x_ok = TRUE; for (j = 0; j < getsetlength(gno, i); j++) { if (fabs(x[j] - refx[j]) > epsilon) { x_ok = FALSE; break; } } if (x_ok != TRUE) { char buf[128]; sprintf(buf, "Set G%d.S%d has different abscissas, " "skipped from the chart.", gno, i); errmsg(buf); continue; } if (is_graph_stacked(gno) != TRUE) { offset += 0.5*0.02*p.symsize; } switch (dataset_type(gno, i)) { case SET_XY: case SET_XYSIZE: case SET_XYCOLOR: drawsetline(gno, i, &p, refn, refx, refy, offset); if (is_graph_stacked(gno) != TRUE) { drawsetsyms(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); } break; case SET_BAR: drawsetline(gno, i, &p, refn, refx, refy, offset); drawsetbars(gno, i, &p, refn, refx, refy, offset); if (is_graph_stacked(gno) != TRUE) { drawsetavalues(gno, i, &p, refn, refx, refy, offset); } break; case SET_BARDY: case SET_BARDYDY: drawsetline(gno, i, &p, refn, refx, refy, offset); drawsetbars(gno, i, &p, refn, refx, refy, offset); if (is_graph_stacked(gno) != TRUE) { drawseterrbars(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); } break; case SET_XYDY: case SET_XYDYDY: drawsetline(gno, i, &p, refn, refx, refy, offset); if (is_graph_stacked(gno) != TRUE) { drawseterrbars(gno, i, &p, refn, refx, refy, offset); drawsetsyms(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); } break; default: errmsg("Unsupported in XY chart set type"); break; } if (is_graph_stacked(gno) != TRUE) { offset += 0.5*0.02*p.symsize + get_graph_bargap(gno); } else { for (j = 0; j < p.data.len; j++) { refy[j] += p.data.ex[1][j]; } } } } if (is_graph_stacked(gno) == TRUE) { /* Second pass for stacked charts: symbols and avalues */ offset = 0.0; for (j = 0; j < refn; j++) { refy[j] = 0.0; } for (i = 0; i < number_of_sets(gno); i++) { get_graph_plotarr(gno, i, &p); if (is_set_drawable(gno, i)) { switch (dataset_type(gno, i)) { case SET_XY: case SET_XYSIZE: case SET_XYCOLOR: drawsetsyms(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); break; case SET_BAR: drawsetavalues(gno, i, &p, refn, refx, refy, offset); break; case SET_BARDY: case SET_BARDYDY: drawseterrbars(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); break; case SET_XYDY: case SET_XYDYDY: drawseterrbars(gno, i, &p, refn, refx, refy, offset); drawsetsyms(gno, i, &p, refn, refx, refy, offset); drawsetavalues(gno, i, &p, refn, refx, refy, offset); break; } for (j = 0; j < p.data.len; j++) { refy[j] += p.data.ex[1][j]; } } } } if (refy != NULL) { xfree(refy); } break; case GRAPH_FIXED: for (i = 0; i < number_of_sets(gno); i++) { if (is_set_drawable(gno, i)) { get_graph_plotarr(gno, i, &p); switch (dataset_type(gno, i)) { case SET_XY: case SET_XYSIZE: case SET_XYCOLOR: case SET_XYZ: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_XYDX: case SET_XYDY: case SET_XYDXDX: case SET_XYDYDY: case SET_XYDXDY: case SET_XYDXDXDYDY: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawseterrbars(gno, i, &p, 0, NULL, NULL, 0.0); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_XYR: drawcirclexy(&p); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; case SET_XYVMAP: drawsetline(gno, i, &p, 0, NULL, NULL, 0.0); drawsetvmap(gno, &p); drawsetsyms(gno, i, &p, 0, NULL, NULL, 0.0); drawsetavalues(gno, i, &p, 0, NULL, NULL, 0.0); break; default: errmsg("Unsupported in XY graph set type"); break; } } } break; } /* end g.type */ } void draw_regions(int gno) { int i; setclipping(TRUE); /* draw any defined regions for this graph */ for (i = 0; i < MAXREGION; i++) { if (rg[i].active && rg[i].linkto == gno) { setcolor(rg[i].color); setpattern(1); setlinewidth(rg[i].linew); setlinestyle(rg[i].lines); draw_region(i); } } } void draw_ref_point(int gno) { GLocator locator; WPoint wp; VPoint vp; if (is_refpoint_active(gno)) { get_graph_locator(gno, &locator); wp.x = locator.dsx; wp.y = locator.dsy; vp = Wpoint2Vpoint(wp); setcolor(1); setpattern(1); setlinewidth(1.0); setlinestyle(1); symplus(vp, 0.01); DrawCircle (vp, 0.01); } } /* draw title and subtitle */ void draw_titles(int gno) { view v; labels lab; VPoint vp1, vp2; get_graph_viewport(gno, &v); get_graph_labels(gno, &lab); vp1.x = (v.xv2 + v.xv1) / 2; vp1.y = (v.yv2 < v.yv1)? v.yv1 : v.yv2; vp2 = vp1; if (lab.title.s && lab.title.s[0]) { setcolor(lab.title.color); setcharsize(lab.title.charsize); setfont(lab.title.font); vp1.y += 0.06; WriteString(vp1, 0, JUST_CENTER|JUST_BOTTOM, lab.title.s); } if (lab.stitle.s && lab.stitle.s[0]) { setcolor(lab.stitle.color); setcharsize(lab.stitle.charsize); setfont(lab.stitle.font); vp2.y += 0.02; WriteString(vp2, 0, JUST_CENTER|JUST_BOTTOM, lab.stitle.s); } } /* * draw the graph frame */ void drawframe(int gno) { view v; framep f; VPoint vps[4]; get_graph_viewport(gno, &v); get_graph_framep(gno, &f); setpen(f.pen); setlinewidth(f.linew); setlinestyle(f.lines); switch (f.type) { case 0: vps[0].x = v.xv1; vps[0].y = v.yv1; vps[1].x = v.xv2; vps[1].y = v.yv2; DrawRect(vps[0], vps[1]); break; case 1: /* half open */ vps[0].x = v.xv1; vps[0].y = v.yv2; vps[1].x = v.xv1; vps[1].y = v.yv1; vps[2].x = v.xv2; vps[2].y = v.yv1; DrawPolyline(vps, 3, POLYLINE_OPEN); break; case 2: /* break top */ vps[0].x = v.xv1; vps[0].y = v.yv2; vps[1].x = v.xv1; vps[1].y = v.yv1; vps[2].x = v.xv2; vps[2].y = v.yv1; vps[3].x = v.xv2; vps[3].y = v.yv2; DrawPolyline(vps, 4, POLYLINE_OPEN); break; case 3: /* break bottom */ vps[0].x = v.xv1; vps[0].y = v.yv1; vps[1].x = v.xv1; vps[1].y = v.yv2; vps[2].x = v.xv2; vps[2].y = v.yv2; vps[3].x = v.xv2; vps[3].y = v.yv1; DrawPolyline(vps, 4, POLYLINE_OPEN); break; case 4: /* break left */ vps[0].x = v.xv1; vps[0].y = v.yv1; vps[1].x = v.xv2; vps[1].y = v.yv1; vps[2].x = v.xv2; vps[2].y = v.yv2; vps[3].x = v.xv1; vps[3].y = v.yv2; DrawPolyline(vps, 4, POLYLINE_OPEN); break; case 5: /* break right */ vps[0].x = v.xv2; vps[0].y = v.yv1; vps[1].x = v.xv1; vps[1].y = v.yv1; vps[2].x = v.xv1; vps[2].y = v.yv2; vps[3].x = v.xv2; vps[3].y = v.yv2; DrawPolyline(vps, 4, POLYLINE_OPEN); break; } } void fillframe(int gno) { view v; framep f; VPoint vp1, vp2; get_graph_viewport(gno, &v); get_graph_framep(gno, &f); /* fill coordinate frame with background color */ if (f.fillpen.pattern != 0) { setpen(f.fillpen); vp1.x = v.xv1; vp1.y = v.yv1; vp2.x = v.xv2; vp2.y = v.yv2; FillRect(vp1, vp2); } } /* * draw a set filling polygon */ void drawsetfill(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int i, len, setlen, polylen; int line_type = p->linet; double *x, *y; double ybase; world w; WPoint wptmp; VPoint *vps; double xmin, xmax, ymin, ymax; int stacked_chart; if (p->filltype == SETFILL_NONE) { return; } if (get_graph_type(gno) == GRAPH_CHART) { x = refx; setlen = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; setlen = p->data.len; } y = p->data.ex[1]; if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } setclipping(TRUE); get_graph_world(gno, &w); switch (line_type) { case LINE_TYPE_STRAIGHT: case LINE_TYPE_SEGMENT2: case LINE_TYPE_SEGMENT3: if (stacked_chart == TRUE && p->filltype == SETFILL_BASELINE) { len = 2*setlen; } else { len = setlen; } vps = (VPoint *) xmalloc((len + 2) * sizeof(VPoint)); if (vps == NULL) { errmsg("Can't xmalloc in drawsetfill"); return; } for (i = 0; i < setlen; i++) { wptmp.x = x[i]; wptmp.y = y[i]; if (stacked_chart == TRUE) { wptmp.y += refy[i]; } vps[i] = Wpoint2Vpoint(wptmp); vps[i].x += offset; } if (stacked_chart == TRUE && p->filltype == SETFILL_BASELINE) { for (i = 0; i < setlen; i++) { wptmp.x = x[setlen - i - 1]; wptmp.y = refy[setlen - i - 1]; vps[setlen + i] = Wpoint2Vpoint(wptmp); vps[setlen + i].x += offset; } } break; case LINE_TYPE_LEFTSTAIR: case LINE_TYPE_RIGHTSTAIR: len = 2*setlen - 1; vps = (VPoint *) xmalloc((len + 2) * sizeof(VPoint)); if (vps == NULL) { errmsg("Can't xmalloc in drawsetfill"); return; } for (i = 0; i < setlen; i++) { wptmp.x = x[i]; wptmp.y = y[i]; if (stacked_chart == TRUE) { wptmp.y += refy[i]; } vps[2*i] = Wpoint2Vpoint(wptmp); vps[2*i].x += offset; } for (i = 1; i < len; i += 2) { if (line_type == LINE_TYPE_LEFTSTAIR) { vps[i].x = vps[i - 1].x; vps[i].y = vps[i + 1].y; } else { vps[i].x = vps[i + 1].x; vps[i].y = vps[i - 1].y; } } break; default: return; } switch (p->filltype) { case SETFILL_POLYGON: polylen = len; break; case SETFILL_BASELINE: if (stacked_chart == TRUE) { polylen = len; } else { getsetminmax(gno, setno, &xmin, &xmax, &ymin, &ymax); ybase = setybase(gno, setno); polylen = len + 2; wptmp.x = MIN2(xmax, w.xg2); wptmp.y = ybase; vps[len] = Wpoint2Vpoint(wptmp); vps[len].x += offset; wptmp.x = MAX2(xmin, w.xg1); wptmp.y = ybase; vps[len + 1] = Wpoint2Vpoint(wptmp); vps[len + 1].x += offset; } break; default: xfree(vps); return; } setpen(p->setfillpen); setfillrule(p->fillrule); DrawPolygon(vps, polylen); xfree(vps); } /* * draw set's connecting line */ void drawsetline(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int setlen, len; int i, ly = p->lines; int line_type = p->linet; VPoint vps[4], *vpstmp; WPoint wp; double *x, *y; double lw; double ybase; double xmin, xmax, ymin, ymax; int stacked_chart; if (get_graph_type(gno) == GRAPH_CHART) { x = refx; setlen = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; setlen = p->data.len; } y = p->data.ex[1]; if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } if (stacked_chart == TRUE) { ybase = 0.0; } else { ybase = setybase(gno, setno); } setclipping(TRUE); drawsetfill(gno, setno, p, refn, refx, refy, offset); setpen(p->linepen); setlinewidth(p->linew); setlinestyle(ly); if (stacked_chart == TRUE) { lw = getlinewidth(); } else { lw = 0.0; } /* draw the line */ if (ly != 0 && p->linepen.pattern != 0) { switch (line_type) { case LINE_TYPE_NONE: break; case LINE_TYPE_STRAIGHT: vpstmp = (VPoint *) xmalloc(setlen*sizeof(VPoint)); if (vpstmp == NULL) { errmsg("xmalloc failed in drawsetline()"); break; } for (i = 0; i < setlen; i++) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vpstmp[i] = Wpoint2Vpoint(wp); vpstmp[i].x += offset; vpstmp[i].y -= lw/2.0; } DrawPolyline(vpstmp, setlen, POLYLINE_OPEN); xfree(vpstmp); break; case LINE_TYPE_SEGMENT2: for (i = 0; i < setlen - 1; i += 2) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vps[0] = Wpoint2Vpoint(wp); vps[0].x += offset; wp.x = x[i + 1]; wp.y = y[i + 1]; if (stacked_chart == TRUE) { wp.y += refy[i + 1]; } vps[1] = Wpoint2Vpoint(wp); vps[1].x += offset; vps[0].y -= lw/2.0; vps[1].y -= lw/2.0; DrawLine(vps[0], vps[1]); } break; case LINE_TYPE_SEGMENT3: for (i = 0; i < setlen - 2; i += 3) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vps[0] = Wpoint2Vpoint(wp); vps[0].x += offset; wp.x = x[i + 1]; wp.y = y[i + 1]; if (stacked_chart == TRUE) { wp.y += refy[i + 1]; } vps[1] = Wpoint2Vpoint(wp); vps[1].x += offset; wp.x = x[i + 2]; wp.y = y[i + 2]; if (stacked_chart == TRUE) { wp.y += refy[i + 2]; } vps[2] = Wpoint2Vpoint(wp); vps[2].x += offset; DrawPolyline(vps, 3, POLYLINE_OPEN); vps[0].y -= lw/2.0; vps[1].y -= lw/2.0; vps[2].y -= lw/2.0; } if (i == setlen - 2) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vps[0] = Wpoint2Vpoint(wp); vps[0].x += offset; wp.x = x[i + 1]; wp.y = y[i + 1]; if (stacked_chart == TRUE) { wp.y += refy[i + 1]; } vps[1] = Wpoint2Vpoint(wp); vps[1].x += offset; vps[0].y -= lw/2.0; vps[1].y -= lw/2.0; DrawLine(vps[0], vps[1]); } break; case LINE_TYPE_LEFTSTAIR: case LINE_TYPE_RIGHTSTAIR: len = 2*setlen - 1; vpstmp = (VPoint *) xmalloc(len*sizeof(VPoint)); if (vpstmp == NULL) { errmsg("xmalloc failed in drawsetline()"); break; } for (i = 0; i < setlen; i++) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vpstmp[2*i] = Wpoint2Vpoint(wp); vpstmp[2*i].x += offset; } for (i = 1; i < len; i += 2) { if (line_type == LINE_TYPE_LEFTSTAIR) { vpstmp[i].x = vpstmp[i - 1].x; vpstmp[i].y = vpstmp[i + 1].y; } else { vpstmp[i].x = vpstmp[i + 1].x; vpstmp[i].y = vpstmp[i - 1].y; } } DrawPolyline(vpstmp, len, POLYLINE_OPEN); xfree(vpstmp); break; default: errmsg("Invalid line type"); break; } } if (p->dropline == TRUE) { for (i = 0; i < setlen; i ++) { wp.x = x[i]; if (stacked_chart == TRUE) { wp.y = refy[i]; } else { wp.y = ybase; } vps[0] = Wpoint2Vpoint(wp); vps[0].x += offset; wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } vps[1] = Wpoint2Vpoint(wp); vps[1].x += offset; vps[1].y -= lw/2.0; DrawLine(vps[0], vps[1]); } } getsetminmax(gno, setno, &xmin, &xmax, &ymin, &ymax); if (p->baseline == TRUE && stacked_chart != TRUE) { wp.x = xmin; wp.y = ybase; vps[0] = Wpoint2Vpoint(wp); vps[0].x += offset; wp.x = xmax; vps[1] = Wpoint2Vpoint(wp); vps[1].x += offset; DrawLine(vps[0], vps[1]); } } /* draw the symbols */ void drawsetsyms(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int setlen; int i, sy = p->sym; double symsize; VPoint vp; WPoint wp; double *x, *y, *z, *c; int skip = p->symskip + 1; int stacked_chart; double znorm = get_graph_znorm(gno); if (get_graph_type(gno) == GRAPH_CHART) { x = refx; setlen = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; setlen = p->data.len; } y = p->data.ex[1]; if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } if (p->type == SET_XYSIZE) { if (znorm == 0.0) { return; } z = p->data.ex[2]; } else { z = NULL; } if (p->type == SET_XYCOLOR) { c = p->data.ex[2]; } else { c = NULL; } setclipping(FALSE); if ((p->sympen.pattern != 0 && p->symlines != 0) || (p->symfillpen.pattern != 0)) { Pen fillpen; setlinewidth(p->symlinew); setlinestyle(p->symlines); setfont(p->charfont); for (i = 0; i < setlen; i += skip) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } if (!is_validWPoint(wp)){ continue; } vp = Wpoint2Vpoint(wp); vp.x += offset; if (z) { symsize = z[i]/znorm; } else { symsize = p->symsize; } if (c) { fillpen.color = (int) rint(c[i]); if (get_colortype(fillpen.color) != COLOR_MAIN) { fillpen.color = 1; } } else { fillpen.color = p->symfillpen.color; } fillpen.pattern = p->symfillpen.pattern; if (drawxysym(vp, symsize, sy, p->sympen, fillpen, p->symchar) != RETURN_SUCCESS) { return; } } } } /* draw the annotative values */ void drawsetavalues(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int i; int setlen; double *x, *y, *z; WPoint wp; VPoint vp; int skip = p->symskip + 1; AValue avalue; char str[MAX_STRING_LENGTH]; int stacked_chart; avalue = p->avalue; if (avalue.active != TRUE) { return; } if (get_graph_type(gno) == GRAPH_CHART) { x = refx; setlen = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; setlen = p->data.len; } y = p->data.ex[1]; if (dataset_cols(gno, setno) > 2) { z = p->data.ex[2]; } else { z = NULL; } if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } setcharsize(avalue.size); setfont(avalue.font); for (i = 0; i < setlen; i += skip) { wp.x = x[i]; wp.y = y[i]; if (stacked_chart == TRUE) { wp.y += refy[i]; } if (!is_validWPoint(wp)){ continue; } vp = Wpoint2Vpoint(wp); vp.x += avalue.offset.x; vp.y += avalue.offset.y; vp.x += offset; strcpy(str, avalue.prestr); switch(avalue.type) { case AVALUE_TYPE_NONE: break; case AVALUE_TYPE_X: strcat(str, create_fstring(avalue.format, avalue.prec, wp.x, LFORMAT_TYPE_EXTENDED)); break; case AVALUE_TYPE_Y: strcat(str, create_fstring(avalue.format, avalue.prec, wp.y, LFORMAT_TYPE_EXTENDED)); break; case AVALUE_TYPE_XY: strcat(str, create_fstring(avalue.format, avalue.prec, wp.x, LFORMAT_TYPE_EXTENDED)); strcat(str, ", "); strcat(str, create_fstring(avalue.format, avalue.prec, wp.y, LFORMAT_TYPE_EXTENDED)); break; case AVALUE_TYPE_STRING: if (p->data.s != NULL && p->data.s[i] != NULL) { strcat(str, p->data.s[i]); } break; case AVALUE_TYPE_Z: if (z != NULL) { strcat(str, create_fstring(avalue.format, avalue.prec, z[i], LFORMAT_TYPE_EXTENDED)); } break; default: errmsg("Invalid type of ann. value"); return; } strcat(str, avalue.appstr); setcolor(avalue.color); WriteString(vp, avalue.angle, JUST_CENTER|JUST_BOTTOM, str); } } void drawseterrbars(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int i, n; double *x, *y; double *dx_plus, *dx_minus, *dy_plus, *dy_minus, *dtmp; PlacementType ptype = p->errbar.ptype; WPoint wp1, wp2; VPoint vp1, vp2; int stacked_chart; int skip = p->symskip + 1; if (p->errbar.active != TRUE) { return; } if (get_graph_type(gno) == GRAPH_CHART) { x = refx; n = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; n = p->data.len; } y = p->data.ex[1]; if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } dx_plus = NULL; dx_minus = NULL; dy_plus = NULL; dy_minus = NULL; switch (p->type) { case SET_XYDX: dx_plus = p->data.ex[2]; break; case SET_XYDY: case SET_BARDY: dy_plus = p->data.ex[2]; break; case SET_XYDXDX: dx_plus = p->data.ex[2]; dx_minus = p->data.ex[3]; break; case SET_XYDYDY: case SET_BARDYDY: dy_plus = p->data.ex[2]; dy_minus = p->data.ex[3]; break; case SET_XYDXDY: dx_plus = p->data.ex[2]; dy_plus = p->data.ex[3]; break; case SET_XYDXDXDYDY: dx_plus = p->data.ex[2]; dx_minus = p->data.ex[3]; dy_plus = p->data.ex[4]; dy_minus = p->data.ex[5]; break; default: return; } switch (ptype) { case PLACEMENT_OPPOSITE: dtmp = dx_minus; dx_minus = dx_plus; dx_plus = dtmp; dtmp = dy_minus; dy_minus = dy_plus; dy_plus = dtmp; break; case PLACEMENT_BOTH: if (dx_minus == NULL && dy_minus == NULL) { dx_minus = dx_plus; dy_minus = dy_plus; } break; default: break; } setclipping(TRUE); for (i = 0; i < n; i += skip) { wp1.x = x[i]; wp1.y = y[i]; if (stacked_chart == TRUE) { wp1.y += refy[i]; } if (is_validWPoint(wp1) == FALSE) { continue; } vp1 = Wpoint2Vpoint(wp1); vp1.x += offset; if (dx_plus != NULL) { wp2 = wp1; wp2.x += fabs(dx_plus[i]); vp2 = Wpoint2Vpoint(wp2); vp2.x += offset; drawerrorbar(vp1, vp2, &p->errbar); } if (dx_minus != NULL) { wp2 = wp1; wp2.x -= fabs(dx_minus[i]); vp2 = Wpoint2Vpoint(wp2); vp2.x += offset; drawerrorbar(vp1, vp2, &p->errbar); } if (dy_plus != NULL) { wp2 = wp1; wp2.y += fabs(dy_plus[i]); vp2 = Wpoint2Vpoint(wp2); vp2.x += offset; drawerrorbar(vp1, vp2, &p->errbar); } if (dy_minus != NULL) { wp2 = wp1; wp2.y -= fabs(dy_minus[i]); vp2 = Wpoint2Vpoint(wp2); vp2.x += offset; drawerrorbar(vp1, vp2, &p->errbar); } } } /* * draw hi/lo-open/close */ void drawsethilo(plotarr *p) { int i; double *x = p->data.ex[0], *y1 = p->data.ex[1]; double *y2 = p->data.ex[2], *y3 = p->data.ex[3], *y4 = p->data.ex[4]; double ilen = 0.02*p->symsize; int skip = p->symskip + 1; WPoint wp; VPoint vp1, vp2; if (p->symlines != 0) { setpen(p->sympen); setlinewidth(p->symlinew); setlinestyle(p->symlines); for (i = 0; i < p->data.len; i += skip) { wp.x = x[i]; wp.y = y1[i]; vp1 = Wpoint2Vpoint(wp); wp.y = y2[i]; vp2 = Wpoint2Vpoint(wp); DrawLine(vp1, vp2); wp.y = y3[i]; vp1 = Wpoint2Vpoint(wp); vp2 = vp1; vp2.x -= ilen; DrawLine(vp1, vp2); wp.y = y4[i]; vp1 = Wpoint2Vpoint(wp); vp2 = vp1; vp2.x += ilen; DrawLine(vp1, vp2); } } } /* * draw 2D bars */ void drawsetbars(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset) { int i, n; double *x, *y; double lw, bw = 0.01*p->symsize; int skip = p->symskip + 1; double ybase; WPoint wp; VPoint vp1, vp2; int stacked_chart; if (get_graph_type(gno) == GRAPH_CHART) { x = refx; n = MIN2(p->data.len, refn); } else { x = p->data.ex[0]; n = p->data.len; } y = p->data.ex[1]; if (get_graph_type(gno) == GRAPH_CHART && is_graph_stacked(gno) == TRUE) { stacked_chart = TRUE; } else { stacked_chart = FALSE; } if (stacked_chart == TRUE) { ybase = 0.0; } else { ybase = setybase(gno, setno); } setlinewidth(p->symlinew); setlinestyle(p->symlines); if (get_graph_type(gno) == GRAPH_CHART && p->symlines != 0 && p->sympen.pattern != 0) { lw = getlinewidth(); } else { lw = 0.0; } if (p->symfillpen.pattern != 0) { setpen(p->symfillpen); for (i = 0; i < n; i += skip) { wp.x = x[i]; if (stacked_chart == TRUE) { wp.y = refy[i]; } else { wp.y = ybase; } vp1 = Wpoint2Vpoint(wp); vp1.x -= bw; vp1.x += offset; wp.x = x[i]; if (stacked_chart == TRUE) { wp.y += y[i]; } else { wp.y = y[i]; } vp2 = Wpoint2Vpoint(wp); vp2.x += bw; vp2.x += offset; vp1.x += lw/2.0; vp2.x -= lw/2.0; vp1.y += lw/2.0; FillRect(vp1, vp2); } } if (p->symlines != 0 && p->sympen.pattern != 0) { setpen(p->sympen); for (i = 0; i < n; i += skip) { wp.x = x[i]; if (stacked_chart == TRUE) { wp.y = refy[i]; } else { wp.y = ybase; } vp1 = Wpoint2Vpoint(wp); vp1.x -= bw; vp1.x += offset; wp.x = x[i]; if (stacked_chart == TRUE) { wp.y += y[i]; } else { wp.y = y[i]; } vp2 = Wpoint2Vpoint(wp); vp2.x += bw; vp2.x += offset; vp1.x += lw/2.0; vp2.x -= lw/2.0; vp1.y += lw/2.0; DrawRect(vp1, vp2); } } } void drawcirclexy(plotarr *p) { int i, setlen; double *x, *y, *r; int skip = p->symskip + 1; WPoint wp; VPoint vp1, vp2; setclipping(TRUE); setlen = p->data.len; x = p->data.ex[0]; y = p->data.ex[1]; r = p->data.ex[2]; setfillrule(p->fillrule); setlinewidth(p->linew); setlinestyle(p->lines); for (i = 0; i < setlen; i += skip) { wp.x = x[i]; wp.y = y[i]; /* TODO: remove once ellipse clipping works */ if (!is_validWPoint(wp)){ continue; } wp.x = x[i] - r[i]; wp.y = y[i] - r[i]; vp1 = Wpoint2Vpoint(wp); wp.x = x[i] + r[i]; wp.y = y[i] + r[i]; vp2 = Wpoint2Vpoint(wp); if (p->filltype != SETFILL_NONE) { setpen(p->setfillpen); DrawFilledEllipse(vp1, vp2); } setpen(p->linepen); DrawEllipse(vp1, vp2); } } /* Arrows for vector map plots */ void drawsetvmap(int gno, plotarr *p) { int i, setlen; double znorm = get_graph_znorm(gno); int skip = p->symskip + 1; double *x, *y, *vx, *vy; WPoint wp; VPoint vp1, vp2; Arrow arrow = {0, 1.0, 1.0, 0.0}; Errbar eb = p->errbar; setclipping(TRUE); if (znorm == 0.0) { return; } setlen = p->data.len; x = p->data.ex[DATA_X]; y = p->data.ex[DATA_Y]; vx = p->data.ex[DATA_Y1]; vy = p->data.ex[DATA_Y2]; arrow.length = 2*eb.barsize; setpen(p->errbar.pen); for (i = 0; i < setlen; i += skip) { wp.x = x[i]; wp.y = y[i]; if (!is_validWPoint(wp)){ continue; } vp1 = Wpoint2Vpoint(wp); vp2.x = vp1.x + vx[i]/znorm; vp2.y = vp1.y + vy[i]/znorm; setlinewidth(eb.riser_linew); setlinestyle(eb.riser_lines); DrawLine(vp1, vp2); setlinewidth(eb.linew); setlinestyle(eb.lines); draw_arrowhead(vp1, vp2, &arrow); } } void drawsetboxplot(plotarr *p) { int i; double *x, *md, *lb, *ub, *lw, *uw; double size = 0.01*p->symsize; int skip = p->symskip + 1; WPoint wp; VPoint vp1, vp2; x = p->data.ex[0]; md = p->data.ex[1]; lb = p->data.ex[2]; ub = p->data.ex[3]; lw = p->data.ex[4]; uw = p->data.ex[5]; setclipping(TRUE); for (i = 0; i < p->data.len; i += skip) { wp.x = x[i]; wp.y = lb[i]; vp1 = Wpoint2Vpoint(wp); wp.y = ub[i]; vp2 = Wpoint2Vpoint(wp); /* whiskers */ if (p->errbar.active == TRUE) { VPoint vp3; wp.y = lw[i]; vp3 = Wpoint2Vpoint(wp); drawerrorbar(vp1, vp3, &p->errbar); wp.y = uw[i]; vp3 = Wpoint2Vpoint(wp); drawerrorbar(vp2, vp3, &p->errbar); } /* box */ vp1.x -= size; vp2.x += size; setpen(p->symfillpen); FillRect(vp1, vp2); setpen(p->sympen); setlinewidth(p->symlinew); setlinestyle(p->symlines); DrawRect(vp1, vp2); /* median line */ wp.y = md[i]; vp2 = vp1 = Wpoint2Vpoint(wp); vp1.x -= size; vp2.x += size; DrawLine(vp1, vp2); } } int drawxysym(VPoint vp, double size, int symtype, Pen sympen, Pen symfillpen, char s) { double symsize; VPoint vps[4]; char buf[2]; symsize = size*0.01; switch (symtype) { case SYM_NONE: break; case SYM_CIRCLE: setpen(symfillpen); DrawFilledCircle (vp, symsize); setpen(sympen); DrawCircle (vp, symsize); break; case SYM_SQUARE: symsize *= 0.85; vps[0].x = vp.x - symsize; vps[0].y = vp.y - symsize; vps[1].x = vps[0].x; vps[1].y = vp.y + symsize; vps[2].x = vp.x + symsize; vps[2].y = vps[1].y; vps[3].x = vps[2].x; vps[3].y = vps[0].y; setpen(symfillpen); DrawPolygon (vps, 4); setpen(sympen); DrawPolyline (vps, 4, POLYLINE_CLOSED); break; case SYM_DIAMOND: vps[0].x = vp.x; vps[0].y = vp.y + symsize; vps[1].x = vp.x - symsize; vps[1].y = vp.y; vps[2].x = vps[0].x; vps[2].y = vp.y - symsize; vps[3].x = vp.x + symsize; vps[3].y = vps[1].y; setpen(symfillpen); DrawPolygon (vps, 4); setpen(sympen); DrawPolyline (vps, 4, POLYLINE_CLOSED); break; case SYM_TRIANG1: vps[0].x = vp.x; vps[0].y = vp.y + 2*M_SQRT1_3*symsize; vps[1].x = vp.x - symsize; vps[1].y = vp.y - M_SQRT1_3*symsize; vps[2].x = vp.x + symsize; vps[2].y = vps[1].y; setpen(symfillpen); DrawPolygon (vps, 3); setpen(sympen); DrawPolyline (vps, 3, POLYLINE_CLOSED); break; case SYM_TRIANG2: vps[0].x = vp.x - 2*M_SQRT1_3*symsize; vps[0].y = vp.y; vps[1].x = vp.x + M_SQRT1_3*symsize; vps[1].y = vp.y - symsize; vps[2].x = vps[1].x; vps[2].y = vp.y + symsize; setpen(symfillpen); DrawPolygon (vps, 3); setpen(sympen); DrawPolyline (vps, 3, POLYLINE_CLOSED); break; case SYM_TRIANG3: vps[0].x = vp.x - symsize; vps[0].y = vp.y + M_SQRT1_3*symsize; vps[1].x = vp.x; vps[1].y = vp.y - 2*M_SQRT1_3*symsize; vps[2].x = vp.x + symsize; vps[2].y = vps[0].y; setpen(symfillpen); DrawPolygon (vps, 3); setpen(sympen); DrawPolyline (vps, 3, POLYLINE_CLOSED); break; case SYM_TRIANG4: vps[0].x = vp.x - M_SQRT1_3*symsize; vps[0].y = vp.y + symsize; vps[1].x = vps[0].x; vps[1].y = vp.y - symsize; vps[2].x = vp.x + 2*M_SQRT1_3*symsize; vps[2].y = vp.y; setpen(symfillpen); DrawPolygon (vps, 3); setpen(sympen); DrawPolyline (vps, 3, POLYLINE_CLOSED); break; case SYM_PLUS: setpen(sympen); symplus(vp, symsize); break; case SYM_X: setpen(sympen); symx(vp, symsize); break; case SYM_SPLAT: setpen(sympen); symsplat(vp, symsize); break; case SYM_CHAR: setcolor(sympen.color); buf[0] = s; buf[1] = '\0'; setcharsize(size); WriteString(vp, 0, JUST_CENTER|JUST_MIDDLE, buf); break; default: errmsg("Invalid symbol type"); return RETURN_FAILURE; } return RETURN_SUCCESS; } static void drawlegbarsym(VPoint vp, double size, Pen sympen, Pen symfillpen) { double width, height; VPoint vps[4]; width = 0.02*size; height = 0.02*getcharsize(); vps[0].x = vps[1].x = vp.x - width/2; vps[2].x = vps[3].x = vp.x + width/2; vps[0].y = vps[3].y = vp.y - height/2; vps[1].y = vps[2].y = vp.y + height/2; setpen(symfillpen); DrawPolygon (vps, 4); setpen(sympen); DrawPolyline (vps, 4, POLYLINE_CLOSED); } void drawerrorbar(VPoint vp1, VPoint vp2, Errbar *eb) { double ilen; VPoint vp_plus, vp_minus; VVector lvv; double vlength; static Arrow arrow = {0, 1.0, 1.0, 0.0}; lvv.x = vp2.x - vp1.x; lvv.y = vp2.y - vp1.y; vlength = hypot(lvv.x, lvv.y); if (vlength == 0.0) { return; } lvv.x /= vlength; lvv.y /= vlength; setpen(eb->pen); if (eb->arrow_clip && is_validVPoint(vp2) == FALSE) { vp2.x = vp1.x + eb->cliplen*lvv.x; vp2.y = vp1.y + eb->cliplen*lvv.y; setlinewidth(eb->riser_linew); setlinestyle(eb->riser_lines); DrawLine(vp1, vp2); arrow.length = 2*eb->barsize; setlinewidth(eb->linew); setlinestyle(eb->lines); draw_arrowhead(vp1, vp2, &arrow); } else { setlinewidth(eb->riser_linew); setlinestyle(eb->riser_lines); DrawLine(vp1, vp2); setlinewidth(eb->linew); setlinestyle(eb->lines); ilen = 0.01*eb->barsize; vp_minus.x = vp2.x - ilen*lvv.y; vp_minus.y = vp2.y + ilen*lvv.x; vp_plus.x = vp2.x + ilen*lvv.y; vp_plus.y = vp2.y - ilen*lvv.x; DrawLine(vp_minus, vp_plus); } } /* --------------------------------------------------------------- */ /* Objects ... TODO: move to draw.c or separate file */ void draw_objects(int gno) { int i; setclipping(FALSE); /* shut down clipping for strings, boxes, * lines, and legends */ /* Temporarily; pattern property should be part of object props */ setpattern(1); for (i = 0; i < number_of_boxes(); i++) { if (isactive_box(i)) { draw_box(gno, i); } } for (i = 0; i < number_of_ellipses(); i++) { if (isactive_ellipse(i)) { draw_ellipse(gno, i); } } for (i = 0; i < number_of_lines(); i++) { if (isactive_line(i)) { draw_line(gno, i); } } for (i = 0; i < number_of_strings(); i++) { if (isactive_string(i)) { draw_string(gno, i); } } setclipping(TRUE); } /* * draw annotative text */ void draw_string(int gno, int i) { plotstr pstr; VPoint vp; WPoint wptmp; get_graph_string(i, &pstr); if (gno != -2) { if (pstr.loctype == COORD_WORLD && pstr.gno != gno) { return; } if (pstr.loctype == COORD_VIEW && gno != -1) { return; } } if (strlen(pstr.s) && (pstr.charsize > 0.0) && pstr.active) { if (pstr.loctype == COORD_WORLD) { wptmp.x = pstr.x; wptmp.y = pstr.y; vp = Wpoint2Vpoint(wptmp); } else { vp.x = pstr.x; vp.y = pstr.y; } setcolor(pstr.color); setpattern(1); setcharsize(pstr.charsize); setfont(pstr.font); activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); WriteString(vp, pstr.rot, pstr.just, pstr.s); pstr.bb = get_bbox(BBOX_TYPE_TEMP); set_graph_string(i, &pstr); } } /* * draw annotative boxes */ void draw_box(int gno, int i) { boxtype b; WPoint wptmp; VPoint vp1, vp2; get_graph_box(i, &b); if (gno != -2) { if (b.loctype == COORD_WORLD && b.gno != gno) { return; } if (b.loctype == COORD_VIEW && gno != -1) { return; } } if (b.active) { setclipping(FALSE); if (b.loctype == COORD_WORLD) { wptmp.x = b.x1; wptmp.y = b.y1; vp1 = Wpoint2Vpoint(wptmp); wptmp.x = b.x2; wptmp.y = b.y2; vp2 = Wpoint2Vpoint(wptmp); } else { vp1.x = b.x1; vp1.y = b.y1; vp2.x = b.x2; vp2.y = b.y2; } activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); setcolor(b.fillcolor); setpattern(b.fillpattern); FillRect(vp1, vp2); setcolor(b.color); setlinewidth(b.linew); setlinestyle(b.lines); setpattern(1); DrawRect(vp1, vp2); b.bb = get_bbox(BBOX_TYPE_TEMP); set_graph_box(i, &b); setclipping(TRUE); } } /* draw annotative ellipses */ void draw_ellipse(int gno, int i) { WPoint wptmp; VPoint vp1, vp2; ellipsetype b; b = ellip[i]; if (gno != -2) { if (b.loctype == COORD_WORLD && b.gno != gno) { return; } if (b.loctype == COORD_VIEW && gno != -1) { return; } } if (b.active) { setclipping(FALSE); if (b.loctype == COORD_WORLD) { wptmp.x = b.x1; wptmp.y = b.y1; vp1 = Wpoint2Vpoint(wptmp); wptmp.x = b.x2; wptmp.y = b.y2; vp2 = Wpoint2Vpoint(wptmp); } else { vp1.x = b.x1; vp1.y = b.y1; vp2.x = b.x2; vp2.y = b.y2; } activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); setcolor(b.fillcolor); setpattern(b.fillpattern); DrawFilledEllipse(vp1, vp2); setcolor(b.color); setlinewidth(b.linew); setlinestyle(b.lines); setpattern(1); DrawEllipse(vp1, vp2); b.bb = get_bbox(BBOX_TYPE_TEMP); set_graph_ellipse(i, &b); setclipping(TRUE); } } /* * draw annotative lines */ void draw_line(int gno, int i) { linetype l; WPoint wptmp; VPoint vp1, vp2; get_graph_line(i, &l); if (gno != -2) { if (l.loctype == COORD_WORLD && l.gno != gno) { return; } if (l.loctype == COORD_VIEW && gno != -1) { return; } } if (l.active) { setclipping(FALSE); if (l.loctype == COORD_WORLD) { wptmp.x = l.x1; wptmp.y = l.y1; vp1 = Wpoint2Vpoint(wptmp); wptmp.x = l.x2; wptmp.y = l.y2; vp2 = Wpoint2Vpoint(wptmp); } else { vp1.x = l.x1; vp1.y = l.y1; vp2.x = l.x2; vp2.y = l.y2; } activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); setcolor(l.color); setlinewidth(l.linew); setlinestyle(l.lines); DrawLine(vp1, vp2); switch (l.arrow_end) { case 0: break; case 1: draw_arrowhead(vp2, vp1, &l.arrow); break; case 2: draw_arrowhead(vp1, vp2, &l.arrow); break; case 3: draw_arrowhead(vp2, vp1, &l.arrow); draw_arrowhead(vp1, vp2, &l.arrow); break; } l.bb = get_bbox(BBOX_TYPE_TEMP); set_graph_line(i, &l); setclipping(TRUE); } } /* * draw arrow head */ void draw_arrowhead(VPoint vp1, VPoint vp2, const Arrow *arrowp) { double L, l, d, vlength; VVector vnorm; VPoint vpc, vpl, vpr, vps[4]; int lines; int fg; vlength = hypot((vp2.x - vp1.x), (vp2.y - vp1.y)); if (vlength == 0.0) { return; } vnorm.x = (vp2.x - vp1.x)/vlength; vnorm.y = (vp2.y - vp1.y)/vlength; L = 0.01*arrowp->length; d = L*arrowp->dL_ff; l = L*arrowp->lL_ff; vpc.x = vp2.x - L*vnorm.x; vpc.y = vp2.y - L*vnorm.y; vpl.x = vpc.x + 0.5*d*vnorm.y; vpl.y = vpc.y - 0.5*d*vnorm.x; vpr.x = vpc.x - 0.5*d*vnorm.y; vpr.y = vpc.y + 0.5*d*vnorm.x; vpc.x += l*vnorm.x; vpc.y += l*vnorm.y; vps[0] = vpl; vps[1] = vp2; vps[2] = vpr; vps[3] = vpc; lines = getlinestyle(); setlinestyle(1); switch (arrowp->type) { case 0: DrawPolyline(vps, 3, POLYLINE_OPEN); break; case 1: setpattern(1); DrawPolygon(vps, 4); DrawPolyline(vps, 4, POLYLINE_CLOSED); break; case 2: fg = getcolor(); setcolor(getbgcolor()); setpattern(1); DrawPolygon(vps, 4); setcolor(fg); DrawPolyline(vps, 4, POLYLINE_CLOSED); break; default: errmsg("Internal error in draw_arrowhead()"); break; } setlinestyle(lines); return; } void draw_region(int r) { int i; double vshift = 0.05; double xshift = 0.0, yshift = 0.0; region *this; int rgndouble=0; Arrow arrow; WPoint wptmp, wp1, wp2, wp3, wp4; VPoint vps[4], *vpstmp; set_default_arrow(&arrow); this=&rg[r]; switch (this->type) { case REGION_POLYI: case REGION_POLYO: if (this->x != NULL && this->y != NULL && this->n > 2) { vpstmp = xmalloc (this->n*sizeof(VPoint)); if (vpstmp == NULL) { errmsg("xmalloc error in draw_region()"); return; } else { for (i = 0; i < this->n; i++) { wptmp.x = this->x[i]; wptmp.y = this->y[i]; vpstmp[i] = Wpoint2Vpoint(wptmp); } DrawPolyline(vpstmp, this->n, POLYLINE_CLOSED); xfree(vpstmp); } } return; case REGION_ABOVE: xshift = 0.0; yshift = vshift; break; case REGION_BELOW: xshift = 0.0; yshift = -vshift; break; case REGION_TOLEFT: xshift = -vshift; yshift = 0.0; break; case REGION_TORIGHT: xshift = vshift; yshift = 0.0; break; case REGION_HORIZI: case REGION_HORIZO: wp1.x=this->x1; wp1.y=this->y1; wp2.x=this->x1; wp2.y=this->y2; wp3.x=this->x2; wp3.y=this->y1; wp4.x=this->x2; wp4.y=this->y2; rgndouble=1; break; case REGION_VERTI: case REGION_VERTO: wp1.x=this->x1; wp1.y=this->y1; wp2.x=this->x2; wp2.y=this->y1; wp3.x=this->x1; wp3.y=this->y2; wp4.x=this->x2; wp4.y=this->y2; rgndouble=1; break; default: errmsg("Internal error in draw_region"); return; } if(!rgndouble) { wptmp.x = this->x1; wptmp.y = this->y1; vps[1] = Wpoint2Vpoint(wptmp); wptmp.x = this->x2; wptmp.y = this->y2; vps[2] = Wpoint2Vpoint(wptmp); vps[0].x = vps[1].x + xshift; vps[0].y = vps[1].y + yshift; vps[3].x = vps[2].x + xshift; vps[3].y = vps[2].y + yshift; DrawPolyline(vps, 4, POLYLINE_OPEN); draw_arrowhead(vps[1], vps[0], &arrow); draw_arrowhead(vps[2], vps[3], &arrow); } else { vps[0] = Wpoint2Vpoint(wp1); vps[1] = Wpoint2Vpoint(wp2); DrawLine(vps[0], vps[1]); vps[0] = Wpoint2Vpoint(wp3); vps[1] = Wpoint2Vpoint(wp4); DrawLine(vps[0], vps[1]); wp1.x=(wp1.x+wp2.x)/2; wp1.y=(wp1.y+wp2.y)/2; wp3.x=(wp3.x+wp4.x)/2; wp3.y=(wp3.y+wp4.y)/2; vps[0] = Wpoint2Vpoint(wp1); vps[1] = Wpoint2Vpoint(wp3); DrawLine(vps[0], vps[1]); draw_arrowhead(vps[0], vps[1], &arrow); } } /* ---------------------- legends ---------------------- */ /* * draw the legend */ void dolegend(int gno) { int i; int draw_flag; double maxsymsize; double ldist, sdist, yskip; WPoint wptmp; VPoint vp, vp2; view v; legend l; plotarr p; get_graph_legend(gno, &l); if (l.active == FALSE) { return; } maxsymsize = 0.0; draw_flag = FALSE; for (i = 0; i < number_of_sets(gno); i++) { if (is_set_drawable(gno, i)) { get_graph_plotarr(gno, i, &p); if (p.lstr[0] != '\0') { draw_flag = TRUE; } if (p.symsize > maxsymsize) { maxsymsize = p.symsize; } } } if (draw_flag == FALSE) { l.bb.xv1 = l.bb.xv2 = l.bb.yv1 = l.bb.yv2 = 0.0; /* The bb update shouldn't change the dirtystate flag */ lock_dirtystate(TRUE); set_graph_legend(gno, &l); lock_dirtystate(FALSE); return; } setclipping(FALSE); if (l.loctype == COORD_WORLD) { wptmp.x = l.legx; wptmp.y = l.legy; vp = Wpoint2Vpoint(wptmp); } else { vp.x = l.legx; vp.y = l.legy; } ldist = 0.01*l.len; sdist = 0.01*(l.hgap + maxsymsize); yskip = 0.01*l.vgap; activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); update_bbox(BBOX_TYPE_TEMP, vp); set_draw_mode(FALSE); putlegends(gno, vp, ldist, sdist, yskip); v = get_bbox(BBOX_TYPE_TEMP); vp2.x = vp.x + (v.xv2 - v.xv1) + 2*0.01*l.hgap; vp2.y = vp.y - (v.yv2 - v.yv1) - 2*0.01*l.vgap; l.bb.xv1 = vp.x; l.bb.yv1 = vp2.y; l.bb.xv2 = vp2.x; l.bb.yv2 = vp.y; /* The bb update shouldn't change the dirtystate flag */ lock_dirtystate(TRUE); set_graph_legend(gno, &l); lock_dirtystate(FALSE); set_draw_mode(TRUE); setpen(l.boxfillpen); FillRect(vp, vp2); if (l.boxlines != 0 && l.boxpen.pattern != 0) { setpen(l.boxpen); setlinewidth(l.boxlinew); setlinestyle(l.boxlines); DrawRect(vp, vp2); } /* correction */ vp.x += (vp.x - v.xv1) + 0.01*l.hgap; vp.y += (vp.y - v.yv2) - 0.01*l.vgap; reset_bbox(BBOX_TYPE_TEMP); update_bbox(BBOX_TYPE_TEMP, vp); putlegends(gno, vp, ldist, sdist, yskip); } void putlegends(int gno, VPoint vp, double ldist, double sdist, double yskip) { int i, setno; VPoint vp2, vpstr; plotarr p; legend l; vp2.y = vp.y; vp2.x = vp.x + ldist; vpstr.y = vp.y; vpstr.x = vp2.x + sdist; get_graph_legend(gno, &l); for (i = 0; i < number_of_sets(gno); i++) { if (l.invert == FALSE) { setno = i; } else { setno = number_of_sets(gno) - i - 1; } if (is_set_drawable(gno, setno)) { get_graph_plotarr(gno, setno, &p); if (p.lstr == NULL || p.lstr[0] == '\0') { continue; } setcharsize(l.charsize); setfont(l.font); setcolor(l.color); WriteString(vpstr, 0, JUST_LEFT|JUST_TOP, p.lstr); vp.y = (vpstr.y + get_bbox(BBOX_TYPE_TEMP).yv1)/2; vp2.y = vp.y; vpstr.y = get_bbox(BBOX_TYPE_TEMP).yv1 - yskip; setfont(p.charfont); if (l.len != 0 && p.lines != 0 && p.linet != 0) { setpen(p.linepen); setlinewidth(p.linew); setlinestyle(p.lines); DrawLine(vp, vp2); setlinewidth(p.symlinew); setlinestyle(p.symlines); if (p.type == SET_BAR || p.type == SET_BOXPLOT || p.type == SET_BARDY || p.type == SET_BARDYDY) { drawlegbarsym(vp, p.symsize, p.sympen, p.symfillpen); drawlegbarsym(vp2, p.symsize, p.sympen, p.symfillpen); } else { drawxysym(vp, p.symsize, p.sym, p.sympen, p.symfillpen, p.symchar); drawxysym(vp2, p.symsize, p.sym, p.sympen, p.symfillpen, p.symchar); } } else { VPoint vptmp; vptmp.x = (vp.x + vp2.x)/2; vptmp.y = vp.y; setlinewidth(p.symlinew); setlinestyle(p.symlines); if (p.type == SET_BAR || p.type == SET_BOXPLOT || p.type == SET_BARDY || p.type == SET_BARDYDY) { drawlegbarsym(vptmp, p.symsize, p.sympen, p.symfillpen); } else { drawxysym(vptmp, p.symsize, p.sym, p.sympen, p.symfillpen, p.symchar); } } } } } /* plot time stamp */ void draw_timestamp(void) { if (timestamp.active) { VPoint vp; setfont(timestamp.font); setcharsize(timestamp.charsize); setcolor(timestamp.color); vp.x = timestamp.x; vp.y = timestamp.y; activate_bbox(BBOX_TYPE_TEMP, TRUE); reset_bbox(BBOX_TYPE_TEMP); WriteString(vp, timestamp.rot, timestamp.just, timestamp.s); timestamp.bb = get_bbox(BBOX_TYPE_TEMP); } } grace-5.1.23/src/alloca.c0000644000076500001440000003552110071615561014626 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* alloca.c -- allocate automatically reclaimed memory (Mostly) portable public-domain implementation -- D A Gwyn This implementation of the PWB library alloca function, which is used to allocate space off the run-time stack so that it is automatically reclaimed upon procedure exit, was inspired by discussions with J. Q. Johnson of Cornell. J.Otto Tennant contributed the Cray support. There are some preprocessor constants that can be defined when compiling for your specific system, for improved efficiency; however, the defaults should be okay. The general concept of this implementation is to keep track of all alloca-allocated blocks, and reclaim any that are found to be deeper in the stack than the current invocation. This heuristic does not reclaim storage as soon as it becomes invalid, but it will do so eventually. As a special case, alloca(0) reclaims storage without allocating any. It is a good idea to use alloca(0) in your main control loop, etc. to force garbage collection. */ #include #ifndef HAVE_ALLOCA #include /* If your stack is a linked list of frames, you have to provide an "address metric" ADDRESS_FUNCTION macro. */ #if defined (CRAY) && defined (CRAY_STACKSEG_END) long i00afunc (); #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) #else #define ADDRESS_FUNCTION(arg) &(arg) #endif #if __STDC__ typedef void *pointer; #else typedef char *pointer; #endif #ifdef NULL #undef NULL #endif #define NULL 0 extern pointer malloc (); /* Define STACK_DIRECTION if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #ifndef STACK_DIRECTION #define STACK_DIRECTION 0 /* Direction unknown. */ #endif #if STACK_DIRECTION != 0 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ #else /* STACK_DIRECTION == 0; need run-time code. */ static int stack_dir; /* 1 or -1 once known. */ #define STACK_DIR stack_dir static void find_stack_direction () { static char *addr = NULL; /* Address of first `dummy', once known. */ auto char dummy; /* To get stack address. */ if (addr == NULL) { /* Initial entry. */ addr = ADDRESS_FUNCTION (dummy); find_stack_direction (); /* Recurse once. */ } else { /* Second entry. */ if (ADDRESS_FUNCTION (dummy) > addr) stack_dir = 1; /* Stack grew upward. */ else stack_dir = -1; /* Stack grew downward. */ } } #endif /* STACK_DIRECTION == 0 */ /* An "alloca header" is used to: (a) chain together all alloca'ed blocks; (b) keep track of stack depth. It is very important that sizeof(header) agree with malloc alignment chunk size. The following default should work okay. */ #ifndef ALIGN_SIZE #define ALIGN_SIZE sizeof(double) #endif typedef union hdr { char align[ALIGN_SIZE]; /* To force sizeof(header). */ struct { union hdr *next; /* For chaining headers. */ char *deep; /* For stack depth measure. */ } h; } header; static header *last_alloca_header = NULL; /* -> last alloca header. */ #ifdef VMS #include void follow_alloca_headers () { header *hp = last_alloca_header; for (; hp != NULL; hp = hp->h.next) printf ("Allocaheader %p, depth=%p\n", hp, hp->h.deep); fflush (stdout); } #endif /* Return a pointer to at least SIZE bytes of storage, which will be automatically reclaimed upon exit from the procedure that called alloca. Originally, this space was supposed to be taken from the current stack frame of the caller, but that method cannot be made to work for some implementations of C, for example under Gould's UTX/32. */ pointer alloca (size) unsigned size; { auto char probe; /* Probes stack depth: */ register char *depth = ADDRESS_FUNCTION (probe); #if STACK_DIRECTION == 0 if (STACK_DIR == 0) /* Unknown growth direction. */ find_stack_direction (); #endif /* Reclaim garbage, defined as all alloca'd storage that was allocated from deeper in the stack than currently. */ { register header *hp; /* Traverses linked list. */ #ifdef emacs BLOCK_INPUT; #endif #ifdef RL_DEBUG { extern int vms_out_initial; if (vms_out_initial) { printf ("-----------------------\ncurrent depth = %p\n", depth); if (last_alloca_header != NULL && ((STACK_DIR > 0 && last_alloca_header->h.deep > depth) || (STACK_DIR < 0 && last_alloca_header->h.deep < depth))) { printf ("Some of these will be deleted:\n"); follow_alloca_headers (); } } } #endif for (hp = last_alloca_header; hp != NULL;) if ((STACK_DIR > 0 && hp->h.deep > depth) || (STACK_DIR < 0 && hp->h.deep < depth)) { register header *np = hp->h.next; #ifdef RL_DEBUG { extern int vms_out_initial; if (vms_out_initial) { if (hp->h.deep < (1 << 30)) { printf ("There is something wrong here...\n"); abort (); } printf ("Freeing %p\n", hp); fflush (stdout); } } #endif free ((pointer) hp); /* Collect garbage. */ hp = np; /* -> next header. */ } else break; /* Rest are not deeper. */ last_alloca_header = hp; /* -> last valid storage. */ #ifdef emacs UNBLOCK_INPUT; #endif } if (size == 0) return NULL; /* No allocation required. */ /* Allocate combined header + user data storage. */ { register pointer new = malloc (sizeof (header) + size); /* Address of header. */ ((header *) new)->h.next = last_alloca_header; ((header *) new)->h.deep = depth; last_alloca_header = (header *) new; /* User storage begins just after header. */ #ifdef RL_DEBUG { extern int vms_out_initial; if (vms_out_initial) { printf ("Allocation gave %p\n", (char *)new + sizeof (header)); fflush (stdout); } } #endif return (pointer) ((char *) new + sizeof (header)); } } #if defined (CRAY) && defined (CRAY_STACKSEG_END) #ifdef DEBUG_I00AFUNC #include #endif #ifndef CRAY_STACK #define CRAY_STACK #ifndef CRAY2 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ struct stack_control_header { long shgrow:32; /* Number of times stack has grown. */ long shaseg:32; /* Size of increments to stack. */ long shhwm:32; /* High water mark of stack. */ long shsize:32; /* Current size of stack (all segments). */ }; /* The stack segment linkage control information occurs at the high-address end of a stack segment. (The stack grows from low addresses to high addresses.) The initial part of the stack segment linkage control information is 0200 (octal) words. This provides for register storage for the routine which overflows the stack. */ struct stack_segment_linkage { long ss[0200]; /* 0200 overflow words. */ long sssize:32; /* Number of words in this segment. */ long ssbase:32; /* Offset to stack base. */ long:32; long sspseg:32; /* Offset to linkage control of previous segment of stack. */ long:32; long sstcpt:32; /* Pointer to task common address block. */ long sscsnm; /* Private control structure number for microtasking. */ long ssusr1; /* Reserved for user. */ long ssusr2; /* Reserved for user. */ long sstpid; /* Process ID for pid based multi-tasking. */ long ssgvup; /* Pointer to multitasking thread giveup. */ long sscray[7]; /* Reserved for Cray Research. */ long ssa0; long ssa1; long ssa2; long ssa3; long ssa4; long ssa5; long ssa6; long ssa7; long sss0; long sss1; long sss2; long sss3; long sss4; long sss5; long sss6; long sss7; }; #else /* CRAY2 */ /* The following structure defines the vector of words returned by the STKSTAT library routine. */ struct stk_stat { long now; /* Current total stack size. */ long maxc; /* Amount of contiguous space which would be required to satisfy the maximum stack demand to date. */ long high_water; /* Stack high-water mark. */ long overflows; /* Number of stack overflow ($STKOFEN) calls. */ long hits; /* Number of internal buffer hits. */ long extends; /* Number of block extensions. */ long stko_mallocs; /* Block allocations by $STKOFEN. */ long underflows; /* Number of stack underflow calls ($STKRETN). */ long stko_free; /* Number of deallocations by $STKRETN. */ long stkm_free; /* Number of deallocations by $STKMRET. */ long segments; /* Current number of stack segments. */ long maxs; /* Maximum number of stack segments so far. */ long pad_size; /* Stack pad size. */ long current_address; /* Current stack segment address. */ long current_size; /* Current stack segment size. This number is actually corrupted by STKSTAT to include the fifteen word trailer area. */ long initial_address; /* Address of initial segment. */ long initial_size; /* Size of initial segment. */ }; /* The following structure describes the data structure which trails any stack segment. I think that the description in 'asdef' is out of date. I only describe the parts that I am sure about. */ struct stk_trailer { long this_address; /* Address of this block. */ long this_size; /* Size of this block (does not include this trailer). */ long unknown2; long unknown3; long link; /* Address of trailer block of previous segment. */ long unknown5; long unknown6; long unknown7; long unknown8; long unknown9; long unknown10; long unknown11; long unknown12; long unknown13; long unknown14; }; #endif /* CRAY2 */ #endif /* not CRAY_STACK */ #ifdef CRAY2 /* Determine a "stack measure" for an arbitrary ADDRESS. I doubt that "lint" will like this much. */ static long i00afunc (long *address) { struct stk_stat status; struct stk_trailer *trailer; long *block, size; long result = 0; /* We want to iterate through all of the segments. The first step is to get the stack status structure. We could do this more quickly and more directly, perhaps, by referencing the $LM00 common block, but I know that this works. */ STKSTAT (&status); /* Set up the iteration. */ trailer = (struct stk_trailer *) (status.current_address + status.current_size - 15); /* There must be at least one stack segment. Therefore it is a fatal error if "trailer" is null. */ if (trailer == 0) abort (); /* Discard segments that do not contain our argument address. */ while (trailer != 0) { block = (long *) trailer->this_address; size = trailer->this_size; if (block == 0 || size == 0) abort (); trailer = (struct stk_trailer *) trailer->link; if ((block <= address) && (address < (block + size))) break; } /* Set the result to the offset in this segment and add the sizes of all predecessor segments. */ result = address - block; if (trailer == 0) { return result; } do { if (trailer->this_size <= 0) abort (); result += trailer->this_size; trailer = (struct stk_trailer *) trailer->link; } while (trailer != 0); /* We are done. Note that if you present a bogus address (one not in any segment), you will get a different number back, formed from subtracting the address of the first block. This is probably not what you want. */ return (result); } #else /* not CRAY2 */ /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. Determine the number of the cell within the stack, given the address of the cell. The purpose of this routine is to linearize, in some sense, stack addresses for alloca. */ static long i00afunc (long address) { long stkl = 0; long size, pseg, this_segment, stack; long result = 0; struct stack_segment_linkage *ssptr; /* Register B67 contains the address of the end of the current stack segment. If you (as a subprogram) store your registers on the stack and find that you are past the contents of B67, you have overflowed the segment. B67 also points to the stack segment linkage control area, which is what we are really interested in. */ stkl = CRAY_STACKSEG_END (); ssptr = (struct stack_segment_linkage *) stkl; /* If one subtracts 'size' from the end of the segment, one has the address of the first word of the segment. If this is not the first segment, 'pseg' will be nonzero. */ pseg = ssptr->sspseg; size = ssptr->sssize; this_segment = stkl - size; /* It is possible that calling this routine itself caused a stack overflow. Discard stack segments which do not contain the target address. */ while (!(this_segment <= address && address <= stkl)) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); #endif if (pseg == 0) break; stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; this_segment = stkl - size; } result = address - this_segment; /* If you subtract pseg from the current end of the stack, you get the address of the previous stack segment's end. This seems a little convoluted to me, but I'll bet you save a cycle somewhere. */ while (pseg != 0) { #ifdef DEBUG_I00AFUNC fprintf (stderr, "%011o %011o\n", pseg, size); #endif stkl = stkl - pseg; ssptr = (struct stack_segment_linkage *) stkl; size = ssptr->sssize; pseg = ssptr->sspseg; result += size; } return (result); } #endif /* not CRAY2 */ #endif /* CRAY */ #endif /* C_ALLOCA */ grace-5.1.23/src/Makefile0000644000076500001440000000522710340161600014654 0ustar fnevgenyusers##################################################### # Makefile for Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) GRBATCH=gracebat$(EXE) GRACECLI=grace$(EXE) CEPHES_LIB=$(TOP)/cephes/libcephes.a CFLAGS=$(CFLAGS0) -I$(TOP) -I. $(T1_INC) $(XBAE_INC) $(CPPFLAGS) $(GUI_FLAGS) LIBS=$(GUI_LIBS) $(CEPHES_LIB) $(NETCDF_LIBS) $(FFTW_LIB) \ $(T1_LIB) $(PDF_LIB) $(JPEG_LIB) $(PNG_LIB) $(Z_LIB) \ $(NOGUI_LIBS) $(DL_LIB) PREFS=-DGRACE_HOME=\"$(GRACE_HOME)\" -DGRACE_PRINT_CMD=\"$(PRINT_CMD)\" \ -DGRACE_EDITOR=\"$(GRACE_EDITOR)\" \ -DGRACE_HELPVIEWER=\"$(GRACE_HELPVIEWER)\" \ -DCCOMPILER=\"'$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS)'\" all : $(GRACE) include Make.common $(GROBJS) $(GUIOBJS) $(PARS_O) buildinfo$(O) : $(TOP)/config.h include Make.dep xmgrace$(EXE) : $(GROBJS) $(PARS_C) $(GUIOBJS) $(CEPHES_LIB) $(CC) $(CFLAGS) $(GROBJS) $(GUIOBJS) -o $@ $(LDFLAGS) $(LIBS) grace$(EXE) : $(GROBJS) $(PARS_C) $(CEPHES_LIB) $(CC) $(CFLAGS) $(GROBJS) -o $@ $(LDFLAGS) $(LIBS) buildinfo$(EXE) : buildinfo$(O) $(CC) $(CFLAGS) $? -o $@ $(LDFLAGS) $(GUI_LIBS) $(T1_LIB) $(JPEG_LIB) $(PNG_LIB) $(Z_LIB) $(NOGUI_LIBS) buildinfo$(O) : $(TOP)/Make.conf $(CC) $(CFLAGS) $(PREFS) -c buildinfo.c -o $@ buildinfo.h : buildinfo$(EXE) $(GRSRCS) $(GUISRCS) $(RM) t.h ./buildinfo$(EXE) > t.h mv t.h $@ $(PARS_C) : $(PARS_Y) $(YACC) -t $? mv y.tab.c $@ install : $(GRACE) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/bin $(INSTALL_PROGRAM) -s $(GRACE) $(DESTDIR)$(GRACE_HOME)/bin/$(GRACE) cd $(DESTDIR)$(GRACE_HOME)/bin; $(RM) $(GRBATCH); $(LN_S) $(GRACE) $(GRBATCH) tests : dummy $(DESTDIR)$(GRACE_HOME)/bin/$(GRACE) : $(GRACE) $(MAKE) install links : $(DESTDIR)$(GRACE_HOME)/bin/$(GRACE) $(MKINSTALLDIRS) $(DESTDIR)$(PREFIX)/bin cd $(DESTDIR)$(PREFIX)/bin; $(RM) $(GRACE); $(LN_S) $(GRACE_HOME)/bin/$(GRACE) $(GRACE) cd $(DESTDIR)$(PREFIX)/bin; $(RM) $(GRBATCH); $(LN_S) $(GRACE_HOME)/bin/$(GRACE) $(GRBATCH) cd $(DESTDIR)$(PREFIX)/bin; $(RM) $(GRACECLI); $(LN_S) $(GRACE_HOME)/bin/$(GRACE) $(GRACECLI) clean : $(RM) $(GROBJS) $(GUIOBJS) $(PARS_O) buildinfo.h buildinfo$(O) buildinfo$(EXE) distclean : clean $(RM) $(GRACE) tags *.orig *.*gr .gdb_history t1lib.log devclean : distclean $(RM) $(PARS_C) depend : echo "# Generated automatically by \`make depend'" > Make.dep $(CC) $(CFLAGS) -MM $(GRSRCS) $(GUISRCS) $(PARS_C) buildinfo.c \ | sed 's/\.o:/\$$(O)\ :/g' >> Make.dep tags : $(GRSRCS) $(GUISRCS) $(PARS_Y) ctags $(GRSRCS) $(GUISRCS) $(PARS_Y) dummy : # DO NOT DELETE grace-5.1.23/src/pdfdrv.h0000644000076500001440000000336110071615562014663 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" int pdfinitgraphics(void); void pdf_drawpixel(VPoint vp); void pdf_drawpolyline(VPoint *vps, int n, int mode); void pdf_fillpolygon(VPoint *vps, int nc); void pdf_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void pdf_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void pdf_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void pdf_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void pdf_leavegraphics(void); int pdf_op_parser(char *opstring); #if defined(NONE_GUI) # define pdf_gui_setup NULL #else void pdf_gui_setup(void); #endif grace-5.1.23/src/graphappwin.c0000644000076500001440000004412010564432467015717 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Graph appearance * */ #include #include "graphs.h" #include "graphutils.h" #include "utils.h" #include "draw.h" #include "protos.h" #include "motifinc.h" static Widget graphapp_dialog = NULL; /* * Widget item declarations */ static ListStructure *graph_selector; static Widget define_view_xv1; static Widget define_view_xv2; static Widget define_view_yv1; static Widget define_view_yv2; static Widget *graph_type_choice_item; static Widget stacked_item; static TextStructure *label_title_text_item; static TextStructure *label_subtitle_text_item; static OptionStructure *title_color_item; static OptionStructure *title_font_item; static Widget title_size_item; static OptionStructure *stitle_color_item; static OptionStructure *stitle_font_item; static Widget stitle_size_item; static Widget graph_flipxy_item; static SpinStructure *bargap_item; static Widget znorm_item; static Widget *frame_framestyle_choice_item; static OptionStructure *frame_color_choice_item; static OptionStructure *frame_pattern_choice_item; static OptionStructure *frame_lines_choice_item; static SpinStructure *frame_linew_choice_item; static OptionStructure *frame_fillcolor_choice_item; static OptionStructure *frame_fillpattern_choice_item; static Widget legend_x_item; static Widget legend_y_item; static Widget toggle_legends_item; static Widget *toggle_legendloc_item; static Widget *legends_vgap_item; static Widget *legends_hgap_item; static Widget *legends_len_item; static Widget legends_invert_item; static OptionStructure *legend_font_item; static Widget legend_charsize_item; static OptionStructure *legend_color_item; static OptionStructure *legend_boxfillcolor_item; static OptionStructure *legend_boxfillpat_item; static SpinStructure *legend_boxlinew_item; static OptionStructure *legend_boxlines_item; static OptionStructure *legend_boxcolor_item; static OptionStructure *legend_boxpattern_item; /* * Event and Notify proc declarations */ static int graphapp_aac_cb(void *data); void updatelegends(int gno); void update_view(int gno); static void update_frame_items(int gno); void update_graphapp_items(int n, int *values, void *data); void create_graphapp_frame_cb(void *data) { create_graphapp_frame((int) data); } static void flipxy_cb(int onoff, void *data) { if (onoff) { errmsg("Flip XY is not implemented yet."); } } /* * */ void create_graphapp_frame(int gno) { set_wait_cursor(); if (is_valid_gno(gno) == FALSE) { gno = get_cg(); } if (graphapp_dialog == NULL) { Widget graphapp_tab, graphapp_frame, graphapp_main, graphapp_titles, graphapp_legends, graphapp_legendbox, graphapp_spec; Widget menubar, menupane, rc, rc1, rc2, fr; graphapp_dialog = CreateDialogForm(app_shell, "Graph Appearance"); menubar = CreateMenuBar(graphapp_dialog); ManageChild(menubar); AddDialogFormChild(graphapp_dialog, menubar); graph_selector = CreateGraphChoice(graphapp_dialog, "Graph:", LIST_TYPE_MULTIPLE); AddDialogFormChild(graphapp_dialog, graph_selector->rc); AddListChoiceCB(graph_selector, update_graphapp_items, NULL); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Open...", 'O', create_rparams_popup, NULL); CreateMenuButton(menupane, "Save...", 'S', create_wparam_frame, NULL); CreateMenuSeparator(menupane); CreateMenuCloseButton(menupane, graphapp_dialog); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Focus to", 'F', switch_focus_proc, graph_selector); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Hide", 'H', hide_graph_proc, graph_selector); CreateMenuButton(menupane, "Show", 'S', show_graph_proc, graph_selector); CreateMenuButton(menupane, "Duplicate", 'D', duplicate_graph_proc, graph_selector); CreateMenuButton(menupane, "Kill", 'K', kill_graph_proc, graph_selector); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Create new", 'C', create_new_graph_proc, graph_selector); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On graph appearance", 'g', graphapp_dialog, "doc/UsersGuide.html#graph-appearance"); /* ------------ Tabs -------------- */ graphapp_tab = CreateTab(graphapp_dialog); /* ------------ Main tab -------------- */ graphapp_main = CreateTabPage(graphapp_tab, "Main"); fr = CreateFrame(graphapp_main, "Presentation"); rc = CreateHContainer(fr); graph_type_choice_item = CreatePanelChoice(rc, "Type:", 7, "XY graph", "XY chart", "Polar graph", "Smith chart (N/I)", "Fixed", "Pie chart", NULL); stacked_item = CreateToggleButton(rc, "Stacked chart"); fr = CreateFrame(graphapp_main, "Titles"); rc = CreateVContainer(fr); label_title_text_item = CreateCSText(rc, "Title: "); label_subtitle_text_item = CreateCSText(rc, "Subtitle: "); fr = CreateFrame(graphapp_main, "Viewport"); rc = CreateVContainer(fr); rc1 = CreateHContainer(rc); define_view_xv1 = CreateTextItem2(rc1, 8, "Xmin:"); define_view_xv2 = CreateTextItem2(rc1, 8, "Xmax:"); rc1 = CreateHContainer(rc); define_view_yv1 = CreateTextItem2(rc1, 8, "Ymin:"); define_view_yv2 = CreateTextItem2(rc1, 8, "Ymax:"); fr = CreateFrame(graphapp_main, "Display options"); rc = CreateHContainer(fr); toggle_legends_item = CreateToggleButton(rc, "Display legend"); graph_flipxy_item = CreateToggleButton(rc, "Flip XY (N/I)"); AddToggleButtonCB(graph_flipxy_item, flipxy_cb, NULL); /* ------------ Titles tab -------------- */ graphapp_titles = CreateTabPage(graphapp_tab, "Titles"); fr = CreateFrame(graphapp_titles, "Title"); rc2 = CreateVContainer(fr); title_font_item = CreateFontChoice(rc2, "Font:"); title_size_item = CreateCharSizeChoice(rc2, "Character size"); title_color_item = CreateColorChoice(rc2, "Color:"); fr = CreateFrame(graphapp_titles, "Subtitle"); rc2 = CreateVContainer(fr); stitle_font_item = CreateFontChoice(rc2, "Font:"); stitle_size_item = CreateCharSizeChoice(rc2, "Character size"); stitle_color_item = CreateColorChoice(rc2, "Color:"); /* ------------ Frame tab -------------- */ graphapp_frame = CreateTabPage(graphapp_tab, "Frame"); fr = CreateFrame(graphapp_frame, "Frame box"); rc = CreateVContainer(fr); frame_framestyle_choice_item = CreatePanelChoice(rc, "Frame type:", 7, "Closed", "Half open", "Break top", "Break bottom", "Break left", "Break right", NULL); rc2 = CreateHContainer(rc); frame_color_choice_item = CreateColorChoice(rc2, "Color:"); frame_pattern_choice_item = CreatePatternChoice(rc2, "Pattern:"); rc2 = CreateHContainer(rc); frame_linew_choice_item = CreateLineWidthChoice(rc2, "Width:"); frame_lines_choice_item = CreateLineStyleChoice(rc2, "Style:"); fr = CreateFrame(graphapp_frame, "Frame fill"); rc = CreateHContainer(fr); frame_fillcolor_choice_item = CreateColorChoice(rc, "Color:"); frame_fillpattern_choice_item = CreatePatternChoice(rc, "Pattern:"); /* ------------ Legend frame tab -------------- */ graphapp_legendbox = CreateTabPage(graphapp_tab, "Leg. box"); fr = CreateFrame(graphapp_legendbox, "Location"); rc = CreateVContainer(fr); toggle_legendloc_item = CreatePanelChoice(rc, "Locate in:", 3, "World coords", "Viewport coords", NULL); rc1 = CreateHContainer(rc); legend_x_item = CreateTextItem2(rc1, 10, "X:"); legend_y_item = CreateTextItem2(rc1, 10, "Y:"); fr = CreateFrame(graphapp_legendbox, "Frame line"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); legend_boxcolor_item = CreateColorChoice(rc2, "Color:"); legend_boxpattern_item = CreatePatternChoice(rc2, "Pattern:"); rc2 = CreateHContainer(rc); legend_boxlinew_item = CreateLineWidthChoice(rc2, "Width:"); legend_boxlines_item = CreateLineStyleChoice(rc2, "Style:"); fr = CreateFrame(graphapp_legendbox, "Frame fill"); rc = CreateHContainer(fr); legend_boxfillcolor_item = CreateColorChoice(rc, "Color:"); legend_boxfillpat_item = CreatePatternChoice(rc, "Pattern:"); /* ------------ Legends tab -------------- */ graphapp_legends = CreateTabPage(graphapp_tab, "Legends"); fr = CreateFrame(graphapp_legends, "Text properties"); rc = CreateVContainer(fr); legend_font_item = CreateFontChoice(rc, "Font:"); legend_charsize_item = CreateCharSizeChoice(rc, "Char size"); legend_color_item = CreateColorChoice(rc, "Color:"); fr = CreateFrame(graphapp_legends, "Placement"); rc = CreateVContainer(fr); rc1 = CreateHContainer(rc); legends_vgap_item = CreatePanelChoice(rc1, "V-gap:", 7, "0", "1", "2", "3", "4", "5", NULL); legends_hgap_item = CreatePanelChoice(rc1, "H-gap:", 7, "0", "1", "2", "3", "4", "5", NULL); legends_len_item = CreatePanelChoice(rc, "Legend line length:", 16, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10","11","12","13","14", NULL); legends_invert_item = CreateToggleButton(rc, "Put in reverse order"); /* ------------ Special tab -------------- */ graphapp_spec = CreateTabPage(graphapp_tab, "Special"); fr = CreateFrame(graphapp_spec, "2D+ graphs"); znorm_item = CreateTextItem2(fr, 10, "Z normalization"); fr = CreateFrame(graphapp_spec, "XY charts"); bargap_item = CreateSpinChoice(fr, "Bar gap:", 5, SPIN_TYPE_FLOAT, -1.0, 1.0, 0.005); SelectTabPage(graphapp_tab, graphapp_main); CreateAACDialog(graphapp_dialog, graphapp_tab, graphapp_aac_cb, NULL); #ifdef HAVE_LESSTIF /* a kludge against Lesstif geometry calculation bug */ SelectTabPage(graphapp_tab, graphapp_legendbox); RaiseWindow(GetParent(graphapp_dialog)); SelectTabPage(graphapp_tab, graphapp_main); #endif } SelectListChoice(graph_selector, gno); RaiseWindow(GetParent(graphapp_dialog)); unset_wait_cursor(); } /* * Notify and event procs */ static int graphapp_aac_cb(void *data) { int j, gno, n, *values; view v; labels labs; framep f; legend l; int graphtype; int stacked; double bargap; double znorm; /* * int flipxy; */ graphtype = GetChoice(graph_type_choice_item); xv_evalexpr(define_view_xv1, &v.xv1); xv_evalexpr(define_view_xv2, &v.xv2); xv_evalexpr(define_view_yv1, &v.yv1); xv_evalexpr(define_view_yv2, &v.yv2); if (isvalid_viewport(v) == FALSE) { errmsg("Invalid viewport coordinates"); return RETURN_FAILURE; } set_default_string(&labs.title); set_plotstr_string(&labs.title, GetTextString(label_title_text_item)); labs.title.charsize = GetCharSizeChoice(title_size_item); labs.title.color = GetOptionChoice(title_color_item); labs.title.font = GetOptionChoice(title_font_item); set_default_string(&labs.stitle); set_plotstr_string(&labs.stitle, GetTextString(label_subtitle_text_item)); labs.stitle.charsize = GetCharSizeChoice(stitle_size_item); labs.stitle.color = GetOptionChoice(stitle_color_item); labs.stitle.font = GetOptionChoice(stitle_font_item); f.type = GetChoice(frame_framestyle_choice_item); f.pen.color = GetOptionChoice(frame_color_choice_item); f.pen.pattern = GetOptionChoice(frame_pattern_choice_item); f.linew = GetSpinChoice(frame_linew_choice_item); f.lines = GetOptionChoice(frame_lines_choice_item); f.fillpen.color = GetOptionChoice(frame_fillcolor_choice_item); f.fillpen.pattern = GetOptionChoice(frame_fillpattern_choice_item); l.charsize = GetCharSizeChoice(legend_charsize_item); l.active = GetToggleButtonState(toggle_legends_item); l.vgap = GetChoice(legends_vgap_item); l.hgap = GetChoice(legends_hgap_item); l.len = GetChoice(legends_len_item); l.invert = GetToggleButtonState(legends_invert_item); l.loctype = GetChoice(toggle_legendloc_item) ? COORD_VIEW : COORD_WORLD; xv_evalexpr(legend_x_item, &l.legx); xv_evalexpr(legend_y_item, &l.legy); l.font = GetOptionChoice(legend_font_item); l.color = GetOptionChoice(legend_color_item); l.boxfillpen.color = GetOptionChoice(legend_boxfillcolor_item); l.boxfillpen.pattern = GetOptionChoice(legend_boxfillpat_item); l.boxpen.color = GetOptionChoice(legend_boxcolor_item); l.boxpen.pattern = GetOptionChoice(legend_boxpattern_item); l.boxlinew = GetSpinChoice(legend_boxlinew_item); l.boxlines = GetOptionChoice(legend_boxlines_item); stacked = GetToggleButtonState(stacked_item); bargap = GetSpinChoice(bargap_item); xv_evalexpr(znorm_item, &znorm); /* * flipxy = GetToggleButtonState(graph_flipxy_item); */ n = GetListChoices(graph_selector, &values); for (j = 0; j < n; j++) { gno = values[j]; if (is_valid_gno(gno)) { set_graph_type(gno, graphtype); set_graph_stacked(gno, stacked); set_graph_bargap(gno, bargap); set_graph_znorm(gno, znorm); set_graph_viewport(gno, v); set_graph_labels(gno, &labs); set_graph_framep(gno, &f); set_graph_legend(gno, &l); /* * g[gno].xyflip = flipxy; */ } } xfree(values); xdrawgraph(); return RETURN_SUCCESS; } void update_graphapp_items(int n, int *values, void *data) { int gno; labels labs; char buf[32]; if (n != 1) { return; } else { gno = values[0]; } if (is_valid_gno(gno) != TRUE) { return; } if (graphapp_dialog != NULL) { update_view(gno); update_frame_items(gno); updatelegends(gno); get_graph_labels(gno, &labs); SetChoice(graph_type_choice_item, get_graph_type(gno)); SetSpinChoice(bargap_item, get_graph_bargap(gno)); SetToggleButtonState(stacked_item, is_graph_stacked(gno)); sprintf(buf, "%g", get_graph_znorm(gno)); xv_setstr(znorm_item, buf); SetTextString(label_title_text_item, labs.title.s); SetTextString(label_subtitle_text_item, labs.stitle.s); SetCharSizeChoice(title_size_item, labs.title.charsize); SetCharSizeChoice(stitle_size_item, labs.stitle.charsize); SetOptionChoice(title_color_item, labs.title.color); SetOptionChoice(stitle_color_item, labs.stitle.color); SetOptionChoice(title_font_item, labs.title.font); SetOptionChoice(stitle_font_item, labs.stitle.font); /* * SetToggleButtonState(graph_flipxy_item, g[gno].xyflip); */ } } /* * Viewport update */ void update_view(int gno) { view v; char buf[32]; if (graphapp_dialog) { get_graph_viewport(gno, &v); sprintf(buf, "%.9g", v.xv1); xv_setstr(define_view_xv1, buf); sprintf(buf, "%.9g", v.xv2); xv_setstr(define_view_xv2, buf); sprintf(buf, "%.9g", v.yv1); xv_setstr(define_view_yv1, buf); sprintf(buf, "%.9g", v.yv2); xv_setstr(define_view_yv2, buf); } } /* * legend popup */ void updatelegends(int gno) { legend l; char buf[32]; if (graphapp_dialog != NULL) { get_graph_legend(gno, &l); SetCharSizeChoice(legend_charsize_item, l.charsize); SetToggleButtonState(toggle_legends_item, l.active == TRUE); sprintf(buf, "%.9g", l.legx); xv_setstr(legend_x_item, buf); sprintf(buf, "%.9g", l.legy); xv_setstr(legend_y_item, buf); SetChoice(legends_vgap_item, l.vgap); SetChoice(legends_hgap_item, l.hgap); SetChoice(legends_len_item, l.len); SetToggleButtonState(legends_invert_item, l.invert); SetChoice(toggle_legendloc_item, l.loctype == COORD_VIEW); SetOptionChoice(legend_font_item, l.font); SetOptionChoice(legend_color_item, l.color); SetOptionChoice(legend_boxfillcolor_item, l.boxfillpen.color); SetOptionChoice(legend_boxfillpat_item, l.boxfillpen.pattern); SetOptionChoice(legend_boxcolor_item, l.boxpen.color); SetOptionChoice(legend_boxpattern_item, l.boxpen.pattern); SetSpinChoice(legend_boxlinew_item, l.boxlinew); SetOptionChoice(legend_boxlines_item, l.boxlines); } } static void update_frame_items(int gno) { framep f; if (graphapp_dialog) { get_graph_framep(gno, &f); SetChoice(frame_framestyle_choice_item, f.type); SetOptionChoice(frame_color_choice_item, f.pen.color); SetOptionChoice(frame_pattern_choice_item, f.pen.pattern); SetSpinChoice(frame_linew_choice_item, f.linew); SetOptionChoice(frame_lines_choice_item, f.lines); SetOptionChoice(frame_fillcolor_choice_item, f.fillpen.color); SetOptionChoice(frame_fillpattern_choice_item, f.fillpen.pattern); } } grace-5.1.23/src/svgdrv.h0000644000076500001440000000321210071615562014704 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" int svginitgraphics(void); void svg_updatecmap(void); void svg_drawpixel(VPoint vp); void svg_drawpolyline(VPoint *vps, int n, int mode); void svg_fillpolygon(VPoint *vps, int nc); void svg_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void svg_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void svg_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void svg_puttext (VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void svg_leavegraphics(void); grace-5.1.23/src/device.c0000644000076500001440000002021110071615561014620 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include "defines.h" #include "globals.h" #include "graphutils.h" #include "utils.h" #include "device.h" static unsigned int ndevices = 0; static int curdevice = 0; static Device_entry *device_table = NULL; int is_valid_page_geometry(Page_geometry pg) { if (pg.width > 0 && pg.height > 0 && pg.dpi > 0.0) { return TRUE; } else { return FALSE; } } int set_page_geometry(Page_geometry pg) { if (is_valid_page_geometry(pg) == TRUE) { device_table[curdevice].pg = pg; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } Page_geometry get_page_geometry(void) { return (device_table[curdevice].pg); } int set_page_dimensions(int wpp, int hpp, int rescale) { int i; if (wpp <= 0 || hpp <= 0) { return RETURN_FAILURE; } else { if (rescale) { int wpp_old, hpp_old; get_device_page_dimensions(curdevice, &wpp_old, &hpp_old); if (hpp*wpp_old - wpp*hpp_old != 0) { /* aspect ratio changed */ double ext_x, ext_y; double old_aspectr, new_aspectr; old_aspectr = (double) wpp_old/hpp_old; new_aspectr = (double) wpp/hpp; if (old_aspectr >= 1.0 && new_aspectr >= 1.0) { ext_x = new_aspectr/old_aspectr; ext_y = 1.0; } else if (old_aspectr <= 1.0 && new_aspectr <= 1.0) { ext_x = 1.0; ext_y = old_aspectr/new_aspectr; } else if (old_aspectr >= 1.0 && new_aspectr <= 1.0) { ext_x = 1.0/old_aspectr; ext_y = 1.0/new_aspectr; } else { ext_x = new_aspectr; ext_y = old_aspectr; } rescale_viewport(ext_x, ext_y); } } for (i = 0; i < ndevices; i++) { Page_geometry *pg = &device_table[i].pg; pg->width = (unsigned long) rint((double) wpp*(pg->dpi/72)); pg->height = (unsigned long) rint((double) hpp*(pg->dpi/72)); } return RETURN_SUCCESS; } } int get_device_page_dimensions(int dindex, int *wpp, int *hpp) { if (dindex >= ndevices || dindex < 0) { return RETURN_FAILURE; } else { Page_geometry *pg = &device_table[dindex].pg; *wpp = (int) rint((double) pg->width*72/pg->dpi); *hpp = (int) rint((double) pg->height*72/pg->dpi); return RETURN_SUCCESS; } } int register_device(Device_entry device) { int dindex; ndevices++; dindex = ndevices - 1; device_table = xrealloc(device_table, ndevices*sizeof(Device_entry)); device_table[dindex] = device; device_table[dindex].name = copy_string(NULL, device.name); device_table[dindex].fext = copy_string(NULL, device.fext); return dindex; } int select_device(int dindex) { if (dindex >= ndevices || dindex < 0) { return RETURN_FAILURE; } else { curdevice = dindex; return RETURN_SUCCESS; } } /* * set the current print device */ int set_printer(int device) { if (device >= ndevices || device < 0 || device_table[device].type == DEVICE_TERM) { return RETURN_FAILURE; } else { hdevice = device; if (device_table[device].type != DEVICE_PRINT) { set_ptofile(TRUE); } return RETURN_SUCCESS; } } int set_printer_by_name(char *dname) { int device; device = get_device_by_name(dname); return set_printer(device); } int get_device_by_name(char *dname) { int i; i = 0; while (i < ndevices) { if (strncmp(device_table[i].name, dname, strlen(dname)) == 0) { break; } else { i++; } } if (i >= ndevices) { return -1; } else { return i; } } int initgraphics(void) { return ((*device_table[curdevice].init)()); } Device_entry get_device_props(int device) { return (device_table[device]); } Device_entry get_curdevice_props() { return (device_table[curdevice]); } char *get_device_name(int device) { return (device_table[device].name); } void *get_curdevice_data(void) { return (device_table[curdevice].data); } void set_curdevice_data(void *data) { device_table[curdevice].data = data; } int set_device_props(int deviceid, Device_entry device) { if (deviceid >= ndevices || deviceid < 0 || is_valid_page_geometry(device.pg) != TRUE) { return RETURN_FAILURE; } device_table[deviceid].type = device.type; /* * device_table[deviceid].init = device.init; * device_table[deviceid].parser = device.parser; * device_table[deviceid].setup = device.setup; */ device_table[deviceid].devfonts = device.devfonts; device_table[deviceid].fontaa = device.fontaa; device_table[deviceid].pg = device.pg; device_table[deviceid].data = device.data; return RETURN_SUCCESS; } void set_curdevice_props(Device_entry device) { set_device_props(curdevice, device); } int parse_device_options(int dindex, char *options) { char *p, *oldp, opstring[64]; int n; if (dindex >= ndevices || dindex < 0 || device_table[dindex].parser == NULL) { return RETURN_FAILURE; } else { oldp = options; while ((p = strchr(oldp, ',')) != NULL) { n = MIN2((p - oldp), 64 - 1); strncpy(opstring, oldp, n); opstring[n] = '\0'; if (device_table[dindex].parser(opstring) != RETURN_SUCCESS) { return RETURN_FAILURE; } oldp = p + 1; } return device_table[dindex].parser(oldp); } } int number_of_devices(void) { return (ndevices); } void get_page_viewport(double *vx, double *vy) { *vx = device_table[curdevice].pg.width/device_table[curdevice].pg.dpi; *vy = device_table[curdevice].pg.height/device_table[curdevice].pg.dpi; if (*vx < *vy) { *vy /= *vx; *vx = 1.0; } else { *vx /= *vy; *vy = 1.0; } } int terminal_device(void) { if (device_table[curdevice].type == DEVICE_TERM) { return TRUE; } else { return FALSE; } } PageFormat get_page_format(int device) { Page_geometry pg; int width_pp, height_pp; pg = device_table[device].pg; width_pp = (int) rint((double) 72*pg.width/pg.dpi); height_pp = (int) rint((double) 72*pg.height/pg.dpi); if ((width_pp == 612 && height_pp == 792) || (height_pp == 612 && width_pp == 792)) { return PAGE_FORMAT_USLETTER; } else if ((width_pp == 595 && height_pp == 842) || (height_pp == 595 && width_pp == 842)) { return PAGE_FORMAT_A4; } else { return PAGE_FORMAT_CUSTOM; } } /* * flag to indicate destination of hardcopy output, * ptofile = 0 means print to printer, otherwise print to file */ static int ptofile = FALSE; void set_ptofile(int flag) { ptofile = flag; } int get_ptofile(void) { return ptofile; } grace-5.1.23/src/dates.c0000644000076500001440000005302310071615561014470 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1999 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* date and time conversion functions */ /* * We use two calendars here : the one that was established in 532 by * Denys and lasted until 1582, and the one that was created by Luigi * Lilio (Alyosius Lilius) and Christoph Klau (Christophorus Clavius) * for pope Gregorius XIII. Both use the same months (they were * introduced under emperor Augustus, a few years after julian * calendar introduction, both Julius and Augustus were honored by a * month beeing named after each one). * The leap years occured regularly in Denys's calendar : once every * four years, there is no year 0 in this calendar (the leap year -1 * was just before year 1). This calendar was not compliant with earth * motion and the dates were slowly shifting with regard to * astronomical events. * This was corrected in 1582 by introducing gregorian calendar. First * a ten days shift was introduced to reset correct dates (Thursday * October the 4th was followed by Friday October the 15th). The rules * for leap years were also changed : three leap years are removed * every four centuries. These years are those that are multiple of * 100 but not multiple of 400 : 1700, 1800, and 1900 were not leap * years, but 1600 and 2000 were (will be) leap years. * We still use gregorian calendar today, but we now have several time * scales for increased accuracy. The International Atomic Time is a * linear scale : the best scale to use for scientific reference. The * Universal Time Coordinate (often confused with Greenwhich Mean * Time) is a legal time that is almost synchronized with earth * motion. However, since the earth is slightly slowing down, leap * seconds are introduced from time to time in UTC (about one second * every 18 monthes). UTC is not a continuous scale ! When a leap * second is introduced by International Earth Rotation Service, this * is published in advance and the legal time sequence is as follows : * 23:59:59 followed one second later by 23:59:60 followed one second * later by 00:00:00. At the time of this writing (1999-01-05) the * difference between IAT and UTC was 32 seconds, and the last leap * second was introduced in 1998-12-31. * These calendars allow to represent any date from the mist of the * past to the fog of the future, but they are not convenient for * computation. Another time scale is of possible : counting only the * days from a reference. Such a time scale was introduced by * Joseph-Juste Scaliger (Josephus Justus Scaliger) in 1583. He * decided to use "-4713-01-01T12:00:00" as a reference date because * it was at the same time a monday, first of January of a leap year, * there was an exact number of 19 years Meton cycle between this date * and year 1 (for Easter computation), and it was at the beginning of * a 15 years "roman indiction" cycle. The day number is called * "julian day", but it has really nothing to do with the julian * calendar. * In Grace, we consider both julian days and calendar dates, and do * not consider leap seconds. The following routines are used to parse * the dates according to these formats and to convert between * them. If you find yourself in a situation were you need UTC, a very * precise scale, and should take into account leap seconds ... you * should convert your data yourself (for example using International * Atomic Time). But if you bother with that you probably already know * what to do ;-) * Luc */ #include #include #include "defines.h" #include "utils.h" #include "protos.h" static double ref_date = 0.0; /* * store the reference date */ void set_ref_date(double ref) { ref_date = ref; } /* * get the reference date */ double get_ref_date(void) { return ref_date; } static Dates_format date_hint = FMT_nohint; /* * store the user's preferrence (it is only an hint) */ void set_date_hint(Dates_format preferred) { date_hint = preferred; } /* * get the user's preferrence (it is only an hint) */ Dates_format get_date_hint(void) { return date_hint; } static int two_digits_years_flag = FALSE; /* * set two digits years handling */ void allow_two_digits_years(int allowed) { two_digits_years_flag = allowed ? TRUE : FALSE; set_dirtystate(); } /* * get two digits years handling */ int two_digits_years_allowed(void) { return two_digits_years_flag; } static int wrap_year = 1950; static int century = 2000; static int wy = 50; /* * store the wrap year */ void set_wrap_year(int year) { wrap_year = year; century = 100*(1 + wrap_year/100); wy = wrap_year - (century - 100); } /* * get the wrap year */ int get_wrap_year(void) { return wrap_year; } /* * reduce years according to the following rules : * [ wrap_year ; 100*(1 + wrap_year/100) - 1 ] -> [wy ; 99] * [ 100*(1 + wrap_year/100) ; wrap_year + 99] -> [00 ; wy-1] */ static int reduced_year(int y) { if (two_digits_years_allowed()) { if (y < wrap_year) { return y; } else if (y < century) { return y - (century - 100); } else if (y < (wrap_year + 100)) { return y - century; } else { return y; } } else { return y; } } /* * expand years according to the following rules : * [wy ; 99] -> [ wrap_year ; 100*(1 + wrap_year/100) - 1 ] * [00 ; wy-1] -> [ 100*(1 + wrap_year/100) ; wrap_year + 99] */ static int expanded_year(Int_token y) { if (two_digits_years_allowed()) { if (y.value >= 0 && y.value < wy && y.digits <= 2) { return century + y.value; } else if (y.value >= wy && y.value < 100 && y.digits <= 2) { return century - 100 + y.value; } else { return y.value; } } else { return y.value; } } /* * set of functions to convert julian calendar elements * with negative years to julian day */ static int neg_julian_non_leap (int year) { /* one leap year every four years, leap years : -4713, -4709, ..., -5, -1 */ return (3 - year) & 3; } static long neg_julian_cal_to_jul(int y, int m, int d) { /* day 0 : -4713-01-01 * day 1721423 : -1-12-31 */ return (1461L*(y + 1L))/4L + (m*489)/16 - ((m > 2) ? (neg_julian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721057L; } static int neg_julian_year_estimate(long n) { /* year bounds : 4n - 6887153 <= 1461y <= 4n - 6885693 * lower bound reached 31st December of leap years * upper bound reached 1st January of leap years * the lower bound gives a low estimate of the year */ return (int) ((4L*n - 6887153L)/1461L); } /* * set of functions to convert julian calendar elements * with positive years to julian day */ static int pos_julian_non_leap(int year) { /* one leap year every four years, leap years : 4, 8, ..., 1576, 1580 */ return year & 3; } static long pos_julian_cal_to_jul(int y, int m, int d) { /* day 1721424 : 1-01-01 * day 2299160 : 1582-10-04 */ return (1461L*(y -1L))/4L + (m*489)/16 - ((m > 2) ? (pos_julian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721423L; } static int pos_julian_year_estimate(long n) { /* year bounds : 4n - 6885692 <= 1461y <= 4n - 6884232 * lower bound reached 31st December of leap years * upper bound reached 1st January of leap years * the lower bound gives a low estimate of the year */ int y = (int) ((4L*n - 6885692L)/1461L); /* make sure we stay in the positive model even with our underestimate */ return (y < 1) ? 1 : y; } /* * set of functions to convert gregorian calendar elements to julian day */ static int gregorian_non_leap(int year) { /* one leap year every four years, except for multiple of 100 that * are not also multiple of 400 (so 1600, 1896, 1904, and 2000 are * leap years, but 1700, 1800 and 1900 are non leap years */ return (year & 3) || ((year % 100) == 0 && ((year/100 & 3))); } static long gregorian_cal_to_jul(int y, int m, int d) { long c; /* day 2299161 : 1582-10-15 */ c = (long) ((y - 1)/100); return (1461L*(y - 1))/4 + c/4 - c + (m*489)/16 - ((m > 2) ? (gregorian_non_leap(y) ? 32L : 31L) : 30L) + d + 1721425L; } static int gregorian_year_estimate(long n) { /* * year bounds : 400n - 688570288 <= 146097y <= 400n - 688423712 * lower bound reached on : 1696-12-31, 2096-12-31, 2496-12-31 ... * upper bound reached on : 1904-01-01, 2304-01-01, 2704-01-01 ... * the lower bound gives a low estimate of the year */ return (int) ((400L*n - 688570288L)/146097L); } /* * convert calendar elements to Julian day */ long cal_to_jul(int y, int m, int d) { long n; n = gregorian_cal_to_jul(y, m, d); if (n < 2299161L) { /* the date belongs to julian calendar */ n = (y < 0) ? neg_julian_cal_to_jul(y, m, d) : pos_julian_cal_to_jul(y, m, d); } return n; } /* * convert julian day to calendar elements */ static void jul_to_some_cal(long n, int (*some_non_leap) (int), long (*some_cal_to_jul) (int, int, int), int (*some_year_estimate) (long), int *y, int *m, int *d) { int non_leap, day_of_year, days_until_end_of_year; /* lower estimation of year */ *y = some_year_estimate(n); non_leap = some_non_leap(*y); days_until_end_of_year = (int) (some_cal_to_jul(*y, 12, 31) - n); while (days_until_end_of_year < 0) { /* correction of the estimate */ (*y)++; non_leap = some_non_leap(*y); days_until_end_of_year += non_leap ? 365 : 366; } day_of_year = (non_leap ? 365 : 366) - days_until_end_of_year; /* estimate of the month : one too high only on last days of January */ *m = (16*(day_of_year + (non_leap ? 32 : 31))) / 489; /* day of month */ *d = day_of_year - (*m*489)/16 + ((*m > 2) ? (non_leap ? 32 : 31) : 30); if (*d < 1) { /* no luck, our estimate is false near end of January */ *m = 1; *d += 31; } } /* * convert julian day to calendar elements */ void jul_to_cal(long n, int *y, int *m, int *d) { if (n < 1721424L) { jul_to_some_cal(n, neg_julian_non_leap, neg_julian_cal_to_jul, neg_julian_year_estimate, y, m, d); } else if (n < 2299161L) { jul_to_some_cal(n, pos_julian_non_leap, pos_julian_cal_to_jul, pos_julian_year_estimate, y, m, d); } else { jul_to_some_cal(n, gregorian_non_leap, gregorian_cal_to_jul, gregorian_year_estimate, y, m, d); } } /* * convert julian day and hourly elements to julian day */ double jul_and_time_to_jul(long jul, int hour, int min, double sec) { return ((double) jul) + (((double) (((hour - 12)*60 + min)*60)) + sec)/86400.0; } /* * convert calendar and hourly elements to julian day */ double cal_and_time_to_jul(int y, int m, int d, int hour, int min, double sec) { return jul_and_time_to_jul (cal_to_jul(y, m, d), hour, min, sec); } /* * convert julian day to calendar and hourly elements */ void jul_to_cal_and_time(double jday, int rounding, int *y, int *m, int *d, int *hour, int *min, int *sec) { long n; double tmp; /* compensate for the reference date */ jday += get_ref_date(); /* find the time of the day */ n = (long) floor(jday + 0.5); tmp = 24.0*(jday + 0.5 - n); *hour = (int) floor(tmp); tmp = 60.0*(tmp - *hour); *min = (int) floor(tmp); tmp = 60.0*(tmp - *min); *sec = (int) floor(tmp + 0.5); /* perform some rounding */ if (*sec >= 60 || rounding > ROUND_SECOND) { /* we should round to at least nearest minute */ if (*sec >= 30) { (*min)++; } *sec = 0; if (*min == 60 || rounding > ROUND_MINUTE) { /* we should round to at least nearest hour */ if (*min >= 30) { (*hour)++; } *min = 0; if (*hour == 24 || rounding > ROUND_HOUR) { /* we should round to at least nearest day */ if (*hour >= 12) { n++; } *hour = 0; } } } /* now find the date */ jul_to_cal(n, y, m, d); /* perform more rounding */ if (rounding == ROUND_MONTH) { int m2, y2; if (*m < 12) { m2 = *m + 1; y2 = *y; } else { m2 = 1; y2 = *y + 1; } if ((cal_to_jul(y2, m2, 1) - n) <= (n - cal_to_jul(*y, *m, 1))) { *m = m2; *y = y2; } *d = 1; } /* introduce the y2k bug for those who want it :) */ *y = reduced_year(*y); } /* * check the existence of given calendar elements * this includes either number of day in the month * and calendars pecularities (year 0 and October 1582) */ static int check_date(Int_token y, Int_token m, Int_token d, long *jul) { int y_expand, y_check, m_check, d_check; y_expand = expanded_year (y); if (m.digits > 2 || d.digits > 2) { /* this should be the year instead of either the month or the day */ return RETURN_FAILURE; } *jul = cal_to_jul(y_expand, m.value, d.value); jul_to_cal(*jul, &y_check, &m_check, &d_check); if (y_expand != y_check || m.value != m_check || d.value != d_check) { return RETURN_FAILURE; } else { return RETURN_SUCCESS; } } /* * lexical analyzer for float data. Knows about fortran exponent * markers. Store address of following data in *after, only in case of * success (thus it is allowed to have after == &s) */ int parse_float(const char* s, double *value, const char **after) { int neg_mant, neg_exp, digits, dot_exp, raw_exp; const char *after_dot; /* we skip leading whitespace */ while (isspace(*s)) { s++; } /* sign */ if (*s == '-') { neg_mant = 1; s++; } else { neg_mant = 0; if (*s == '+') { s++; } } /* mantissa */ digits = 0; *value = 0.0; while (isdigit(*s)) { *value = *value*10.0 + (*s++ - '0'); digits++; } if (*s == '.') { after_dot = ++s; while (isdigit(*s)) { *value = *value*10.0 + (*s++ - '0'); digits++; } dot_exp = after_dot - s; } else { dot_exp = 0; } if (digits == 0) { /* there should be at least one digit (either before or after dot) */ return RETURN_FAILURE; } /* exponent (d and D are fortran exponent markers) */ raw_exp = 0; if (*s == 'e' || *s == 'E' || *s == 'd' || *s == 'D') { s++; if (*s == '-') { neg_exp = 1; s++; } else { neg_exp = 0; if (*s == '+') { s++; } } while (isdigit(*s)) { raw_exp = raw_exp*10 + (*s++ - '0'); } if (neg_exp) { raw_exp = -raw_exp; } } /* read float */ *value = (neg_mant ? -(*value) : (*value)) * pow (10.0, dot_exp + raw_exp); if (after != NULL) { /* the caller wants to know what follows the float number */ *after = s; } return RETURN_SUCCESS; } /* * lexical analyzer for calendar dates * return the number of read elements, or -1 on failure */ static int parse_calendar_date(const char* s, Int_token tab [5], double *sec) { int i, waiting_separator, negative; negative = 0; waiting_separator = 0; i = 0; while (i < 5) { /* loop from year to minute elements : all integers */ switch (*s) { case '\0': /* end of string */ return i; case ' ' : /* repeatable separator */ s++; negative = 0; break; case '/' : case ':' : case '.' : case 'T' : /* non-repeatable separator */ if (waiting_separator) { if ((*s == 'T') && (i != 3)) { /* the T separator is only allowed between date and time (mainly for iso8601) */ return -1; } s++; negative = 0; waiting_separator = 0; } else { return -1; } break; case '-' : /* either separator or minus sign */ s++; if (waiting_separator) { negative = 0; waiting_separator = 0; } else if ((*s >= '0') && (*s <= '9')) { negative = 1; } else { return -1; } break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : /* digit */ tab[i].value = ((int) *s) - '0'; tab[i].digits = 1; while (isdigit(*++s)) { tab[i].value = tab[i].value*10 + (((int) *s) - '0'); tab[i].digits++; } if (negative) { tab[i].value = -tab[i].value; } i++; negative = 0; waiting_separator = 1; break; default : return -1; } } while (isspace(*s)) { s++; } if (*s == '\0') { return 5; } if ((*s == '/') || (*s == ':') || (*s == '.') || (*s == '-')) { /* this was the seconds separator */ s++; /* seconds are read in float format */ if (parse_float(s, sec, &s) == RETURN_SUCCESS) { while (isspace(*s)) { s++; } if (*s == '\0') { return 6; } } } /* something is wrong */ return -1; } /* * parse a date given either in calendar or numerical format */ int parse_date(const char* s, Dates_format preferred, int absolute, double *jul, Dates_format *recognized) { int i, n; int ky, km, kd; static Dates_format trials [] = {FMT_nohint, FMT_iso, FMT_european, FMT_us}; Int_token tab [5]; long j; double sec; /* first guess : is it a date in calendar format ? */ n = parse_calendar_date(s, tab, &sec); switch (n) { /* we consider hours, minutes and seconds as optional items */ case -1 : /* parse error */ break; case 3 : tab[3].value = 0; /* adding hours */ tab[3].digits = 1; case 4 : tab[4].value = 0; /* adding minutes */ tab[4].digits = 1; case 5 : sec = 0.0; /* adding seconds */ case 6 : /* we now have a complete date */ /* try the user's choice first */ trials[0] = preferred; for (i = 0; i < 4; i++) { if (trials[i] == FMT_iso) { /* YYYY-MM-DD */ ky = 0; km = 1; kd = 2; } else if (trials[i] == FMT_european) { /* DD/MM/(YY)YY */ ky = 2; km = 1; kd = 0; } else if (trials[i] == FMT_us) { /* MM/DD/(YY)YY */ ky = 2; km = 0; kd = 1; } else { /* the user didn't choose a calendar format */ continue; } if (check_date(tab[ky], tab[km], tab[kd], &j) == RETURN_SUCCESS) { *jul = jul_and_time_to_jul(j, tab[3].value, tab[4].value, sec); if (!absolute) { *jul -= get_ref_date(); } *recognized = trials[i]; return RETURN_SUCCESS; } } break; default : /* probably a julian date */ break; } return RETURN_FAILURE; } int parse_date_or_number(const char* s, int absolute, double *value) { Dates_format dummy; const char *sdummy; if (parse_date(s, get_date_hint(), absolute, value, &dummy) == RETURN_SUCCESS) { return RETURN_SUCCESS; } else if (parse_float(s, value, &sdummy) == RETURN_SUCCESS) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } grace-5.1.23/src/monwin.c0000644000076500001440000001215010335446017014674 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Console * */ #include #include #include #include #include "utils.h" #include "files.h" #include "motifinc.h" #include "protos.h" static void clear_results(void *data); static void popup_on(int onoff, void *data); static void create_wmon_frame(void *data); static int wmon_apply_notify_proc(void *data); typedef struct _console_ui { Widget mon_frame; Widget monText; Widget wmon_frame; Widget wmon_text_item; int popup_only_on_errors; } console_ui; /* * Create the mon Panel */ static void create_monitor_frame(int force, char *msg) { static console_ui *ui = NULL; set_wait_cursor(); if (ui == NULL) { Widget menubar, menupane, fr; ui = xmalloc(sizeof(console_ui)); ui->mon_frame = CreateDialogForm(app_shell, "Console"); ui->wmon_frame = NULL; ui->popup_only_on_errors = FALSE; menubar = CreateMenuBar(ui->mon_frame); ManageChild(menubar); AddDialogFormChild(ui->mon_frame, menubar); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Save...", 'S', create_wmon_frame, ui); CreateMenuSeparator(menupane); CreateMenuCloseButton(menupane, ui->mon_frame); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Clear", 'C', clear_results, ui); menupane = CreateMenu(menubar, "Options", 'O', FALSE); CreateMenuToggle(menupane, "Popup only on errors", 'e', popup_on, ui); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On console", 'c', ui->mon_frame, "doc/UsersGuide.html#console"); fr = CreateFrame(ui->mon_frame, NULL); ui->monText = CreateScrollTextItem2(fr, 0, "Messages:"); XmTextSetString(ui->monText, ""); XtVaSetValues(ui->monText, XmNeditable, False, NULL); AddDialogFormChild(ui->mon_frame, fr); ManageChild(ui->mon_frame); } if (msg != NULL) { XmTextPosition pos; pos = XmTextGetLastPosition(ui->monText); XmTextInsert(ui->monText, pos, msg); } if (force || ui->popup_only_on_errors == FALSE) { RaiseWindow(GetParent(ui->mon_frame)); } unset_wait_cursor(); } static void popup_on(int onoff, void *data) { console_ui *ui = (console_ui *) data; ui->popup_only_on_errors = onoff; } static void clear_results(void *data) { console_ui *ui = (console_ui *) data; XmTextSetString(ui->monText, ""); } /* * Create the wmon Frame and the wmon Panel */ static void create_wmon_frame(void *data) { console_ui *ui = (console_ui *) data; if (!ui) { return; } set_wait_cursor(); if (ui->wmon_frame == NULL) { Widget wmon_panel; ui->wmon_frame = CreateDialogForm(app_shell, "Save logs"); wmon_panel = CreateVContainer(ui->wmon_frame); ui->wmon_text_item = CreateTextItem2(wmon_panel, 30, "Save to file: "); CreateAACDialog(ui->wmon_frame, wmon_panel, wmon_apply_notify_proc, ui); } RaiseWindow(GetParent(ui->wmon_frame)); unset_wait_cursor(); } static int wmon_apply_notify_proc(void *data) { console_ui *ui = (console_ui *) data; int len; char *s, *text; FILE *pp; s = xv_getstr(ui->wmon_text_item); pp = grace_openw(s); if (pp == NULL) { return RETURN_FAILURE; } else { text = XmTextGetString(ui->monText); len = XmTextGetLastPosition(ui->monText); fwrite(text, SIZEOF_CHAR, len, pp); grace_close(pp); XtFree(text); return RETURN_SUCCESS; } } void stufftextwin(char *msg) { create_monitor_frame(FALSE, msg); } void errwin(const char *msg) { char *buf; buf = copy_string(NULL, "[Error] "); buf = concat_strings(buf, msg); buf = concat_strings(buf, "\n"); create_monitor_frame(TRUE, buf); xfree(buf); } void create_monitor_frame_cb(void *data) { create_monitor_frame(TRUE, NULL); } grace-5.1.23/src/protos.h0000644000076500001440000000217410071615562014725 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "missing.h" #include "noxprotos.h" #ifndef NONE_GUI # include "xprotos.h" #endif grace-5.1.23/src/globals.h0000644000076500001440000001055210071615561015020 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Global variables of Grace - should be empty :-( * */ #ifndef __GLOBALS_H_ #define __GLOBALS_H_ #include #include #include "defines.h" #include "graphs.h" #include "draw.h" #ifdef MAIN # define GLOBAL(var, type, val) type var = val # define GLOBALARR(arr, type, dim, val) type arr[dim] = val /* target set */ target target_set; /* timestamp */ plotstr timestamp; /* default properties */ defaults grdefaults; /* parameters for non-linear fit */ nonlparms nonl_parms[MAXPARM]; nonlopts nonl_opts; /* region definition */ region rg[MAXREGION]; #else # define GLOBAL(var, type, val) extern type var # define GLOBALARR(arr, type, dim, val) extern type arr[] extern target target_set; extern defaults grdefaults; extern plotstr timestamp; extern nonlparms nonl_parms[]; extern nonlopts nonl_opts; extern region rg[]; #endif /* real-time input delay (prevents getting stuck reading) */ GLOBAL(timer_delay, int, 200); /* linked scroll */ GLOBAL(scrolling_islinked, int, FALSE); /* scroll fraction */ GLOBAL(scrollper, double, 0.05); /* expand/shrink fraction */ GLOBAL(shexper, double, 0.05); /* terminal device */ GLOBAL(tdevice, int, 0); /* hardcopy device */ GLOBAL(hdevice, int, 0); /* set mono mode */ GLOBAL(monomode, int, FALSE); /* use GXxor or GXinvert for xor'ing */ GLOBAL(invert, int, TRUE); /* if true, redraw graph each time action is performed */ GLOBAL(auto_redraw, int, TRUE); /* allow double click ops */ GLOBAL(allow_dc, int, TRUE); /* if TRUE, assume yes for everything */ GLOBAL(noask, int, FALSE); /* true if running X */ GLOBAL(inwin, int, FALSE); /* autoscale after reading in data sets */ GLOBAL(autoscale_onread, int, AUTOSCALE_XY); GLOBAL(focus_policy, int, FOCUS_CLICK); GLOBAL(draw_focus_flag, int, TRUE); /* lines */ GLOBAL(lines, linetype *, NULL); /* boxes */ GLOBAL(boxes, boxtype *, NULL); /* ellipses */ GLOBAL(ellip, ellipsetype *, NULL); /* strings */ GLOBAL(pstr, plotstr *, NULL); /* lines, boxes, ellipses and strings flags */ GLOBAL(box_color, int, 1); GLOBAL(box_lines, int, 1); GLOBAL(box_linew, double, 1.0); GLOBAL(box_fillpat, int, 0); GLOBAL(box_fillcolor, int, 1); GLOBAL(box_loctype, int, COORD_VIEW); GLOBAL(ellipse_color, int, 1); GLOBAL(ellipse_lines, int, 1); GLOBAL(ellipse_linew, double, 1.0); GLOBAL(ellipse_fillpat, int, 0); GLOBAL(ellipse_fillcolor, int, 1); GLOBAL(ellipse_loctype, int, COORD_VIEW); GLOBAL(line_color, int, 1); GLOBAL(line_lines, int, 1); GLOBAL(line_linew, double, 1.0); GLOBAL(line_arrow_end, int, 0); GLOBAL(line_atype, int, 0); GLOBAL(line_asize, double, 1.0); GLOBAL(line_a_dL_ff, double, 1.0); GLOBAL(line_a_lL_ff, double, 1.0); GLOBAL(line_loctype, int, COORD_VIEW); GLOBAL(string_color, int, 1); GLOBAL(string_font, int, 0); GLOBAL(string_rot, int, 0); GLOBAL(string_just, int, 0); GLOBAL(string_size, double, 1.0); GLOBAL(string_loctype, int, COORD_VIEW); /* used in the parser */ GLOBAL(curtype, int, SET_XY); GLOBAL(cursource, int, SOURCE_DISK); /* the current region */ GLOBAL(nr, int, 0); /* file for results */ GLOBAL(resfp, FILE *, NULL); /* format for saving data sets */ GLOBALARR(sformat, char, 128, "%.8g"); #ifdef HAVE_NETCDF GLOBALARR(netcdf_name, char, 512, ""); GLOBALARR(xvar_name, char, 128, ""); GLOBALARR(yvar_name, char, 128, ""); #endif /* the safe mode flag */ GLOBAL(safe_mode, int, TRUE); #endif /* __GLOBALS_H_ */ grace-5.1.23/src/psdrv.c0000644000076500001440000011010410334212211014503 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * GRACE PostScript driver */ #include #include #include #include #include #include #include #include "defines.h" #include "utils.h" #include "draw.h" #include "device.h" #include "devlist.h" #include "patterns.h" #include "psdrv.h" #include "protos.h" #ifndef NONE_GUI # include "motifinc.h" #endif extern FILE *prstream; static void put_string(FILE *fp, char *s, int len); static int curformat = DEFAULT_PS_FORMAT; static unsigned long page_scale; static double pixel_size; static float page_scalef; static int page_orientation; static int *psfont_status = NULL; static int ps_color; static int ps_pattern; static double ps_linew; static int ps_lines; static int ps_linecap; static int ps_linejoin; static int ps_grayscale = FALSE; static int ps_level2 = TRUE; static int docdata = DOCDATA_8BIT; static int ps_setup_offset_x = 0; static int ps_setup_offset_y = 0; static int ps_setup_grayscale = FALSE; static int ps_setup_level2 = TRUE; static int ps_setup_docdata = DOCDATA_8BIT; static int ps_setup_feed = MEDIA_FEED_AUTO; static int ps_setup_hwres = FALSE; static int eps_setup_grayscale = FALSE; static int eps_setup_level2 = TRUE; static int eps_setup_tight_bb = TRUE; static int eps_setup_docdata = DOCDATA_8BIT; static int tight_bb; static Device_entry dev_ps = {DEVICE_PRINT, "PostScript", psprintinitgraphics, ps_op_parser, ps_gui_setup, "ps", TRUE, FALSE, {3300, 2550, 300.0}, NULL }; static Device_entry dev_eps = {DEVICE_FILE, "EPS", epsinitgraphics, eps_op_parser, eps_gui_setup, "eps", TRUE, FALSE, {2500, 2500, 300.0}, NULL }; int register_ps_drv(void) { return register_device(dev_ps); } int register_eps_drv(void) { return register_device(dev_eps); } static int ps_initgraphics(int format) { int i, j; Page_geometry pg; fRGB *frgb; int width_pp, height_pp, page_offset_x, page_offset_y; char **enc; time_t time_value; curformat = format; /* device-dependent routines */ devupdatecmap = NULL; devdrawpixel = ps_drawpixel; devdrawpolyline = ps_drawpolyline; devfillpolygon = ps_fillpolygon; devdrawarc = ps_drawarc; devfillarc = ps_fillarc; devputpixmap = ps_putpixmap; devputtext = ps_puttext; devleavegraphics = ps_leavegraphics; pg = get_page_geometry(); page_scale = MIN2(pg.height, pg.width); pixel_size = 1.0/page_scale; page_scalef = (float) page_scale*72.0/pg.dpi; if (curformat == PS_FORMAT && pg.height < pg.width) { page_orientation = PAGE_ORIENT_LANDSCAPE; } else { page_orientation = PAGE_ORIENT_PORTRAIT; } /* undefine all graphics state parameters */ ps_color = -1; ps_pattern = -1; ps_linew = -1.0; ps_lines = -1; ps_linecap = -1; ps_linejoin = -1; /* Font status table */ if (psfont_status != NULL) { xfree(psfont_status); } psfont_status = xmalloc(number_of_fonts()*SIZEOF_INT); for (i = 0; i < number_of_fonts(); i++) { psfont_status[i] = FALSE; } switch (curformat) { case PS_FORMAT: fprintf(prstream, "%%!PS-Adobe-3.0\n"); tight_bb = FALSE; page_offset_x = ps_setup_offset_x; page_offset_y = ps_setup_offset_y; break; case EPS_FORMAT: fprintf(prstream, "%%!PS-Adobe-3.0 EPSF-3.0\n"); tight_bb = eps_setup_tight_bb; page_offset_x = 0; page_offset_y = 0; break; default: errmsg("Invalid PS format"); return RETURN_FAILURE; } if (page_orientation == PAGE_ORIENT_LANDSCAPE) { width_pp = (int) rint(72.0*pg.height/pg.dpi); height_pp = (int) rint(72.0*pg.width/pg.dpi); } else { width_pp = (int) rint(72.0*pg.width/pg.dpi); height_pp = (int) rint(72.0*pg.height/pg.dpi); } if (tight_bb == TRUE) { fprintf(prstream, "%%%%BoundingBox: (atend)\n"); } else { fprintf(prstream, "%%%%BoundingBox: %d %d %d %d\n", page_offset_x, page_offset_y, width_pp + page_offset_x, height_pp + page_offset_y); } if (ps_level2 == TRUE) { fprintf(prstream, "%%%%LanguageLevel: 2\n"); } else { fprintf(prstream, "%%%%LanguageLevel: 1\n"); } fprintf(prstream, "%%%%Creator: %s\n", bi_version_string()); time(&time_value); fprintf(prstream, "%%%%CreationDate: %s", ctime(&time_value)); switch (docdata) { case DOCDATA_7BIT: fprintf(prstream, "%%%%DocumentData: Clean7Bit\n"); break; case DOCDATA_8BIT: fprintf(prstream, "%%%%DocumentData: Clean8Bit\n"); break; default: fprintf(prstream, "%%%%DocumentData: Binary\n"); break; } if (page_orientation == PAGE_ORIENT_LANDSCAPE) { fprintf(prstream, "%%%%Orientation: Landscape\n"); } else { fprintf(prstream, "%%%%Orientation: Portrait\n"); } if (curformat == PS_FORMAT) { fprintf(prstream, "%%%%Pages: 1\n"); fprintf(prstream, "%%%%PageOrder: Ascend\n"); } fprintf(prstream, "%%%%Title: %s\n", get_docname()); fprintf(prstream, "%%%%For: %s\n", get_username()); fprintf(prstream, "%%%%DocumentNeededResources: (atend)\n"); fprintf(prstream, "%%%%EndComments\n"); /* Definitions */ fprintf(prstream, "%%%%BeginProlog\n"); if (curformat == PS_FORMAT) { fprintf(prstream, "/PAGE_OFFSET_X %d def\n", page_offset_x); fprintf(prstream, "/PAGE_OFFSET_Y %d def\n", page_offset_y); } fprintf(prstream, "/m {moveto} def\n"); fprintf(prstream, "/l {lineto} def\n"); fprintf(prstream, "/s {stroke} def\n"); fprintf(prstream, "/n {newpath} def\n"); fprintf(prstream, "/c {closepath} def\n"); fprintf(prstream, "/RL {rlineto} def\n"); fprintf(prstream, "/SLW {setlinewidth} def\n"); fprintf(prstream, "/GS {gsave} def\n"); fprintf(prstream, "/GR {grestore} def\n"); fprintf(prstream, "/SC {setcolor} def\n"); fprintf(prstream, "/SGRY {setgray} def\n"); fprintf(prstream, "/SRGB {setrgbcolor} def\n"); fprintf(prstream, "/SD {setdash} def\n"); fprintf(prstream, "/SLC {setlinecap} def\n"); fprintf(prstream, "/SLJ {setlinejoin} def\n"); fprintf(prstream, "/SCS {setcolorspace} def\n"); fprintf(prstream, "/FFSF {findfont setfont} def\n"); fprintf(prstream, "/CC {concat} def\n"); fprintf(prstream, "/PXL {n m 0 0 RL s} def\n"); for (i = 0; i < number_of_colors(); i++) { fprintf(prstream,"/Color%d {", i); if (ps_grayscale == TRUE) { fprintf(prstream,"%.4f", get_colorintensity(i)); } else { frgb = get_frgb(i); if (frgb != NULL) { fprintf(prstream, "%.4f %.4f %.4f", frgb->red,frgb->green, frgb->blue); } } fprintf(prstream,"} def\n"); } if (ps_level2 == TRUE) { fprintf(prstream, "/PTRN {\n"); fprintf(prstream, " /pat_bits exch def \n"); fprintf(prstream, " <<\n"); fprintf(prstream, " /PaintType 2\n"); fprintf(prstream, " /PatternType 1 /TilingType 1\n"); fprintf(prstream, " /BBox[0 0 16 16]\n"); fprintf(prstream, " /XStep 16 /YStep 16\n"); fprintf(prstream, " /PaintProc {\n"); fprintf(prstream, " pop\n"); fprintf(prstream, " 16 16 true [-1 0 0 -1 16 16] pat_bits imagemask\n"); fprintf(prstream, " }\n"); fprintf(prstream, " >>\n"); fprintf(prstream, " [%.4f 0 0 %.4f 0 0]\n", 1.0/page_scalef, 1.0/page_scalef); fprintf(prstream, " makepattern\n"); fprintf(prstream, "} def\n"); for (i = 0; i < number_of_patterns(); i++) { fprintf(prstream, "/Pattern%d {<", i); for (j = 0; j < 32; j++) { fprintf(prstream, "%02x", pat_bits[i][j]); } fprintf(prstream, "> PTRN} bind def\n"); } } /* Elliptic arc */ fprintf(prstream, "/ellipsedict 8 dict def\n"); fprintf(prstream, "ellipsedict /mtrx matrix put\n"); fprintf(prstream, "/EARC {\n"); fprintf(prstream, " ellipsedict begin\n"); fprintf(prstream, " /endangle exch def\n"); fprintf(prstream, " /startangle exch def\n"); fprintf(prstream, " /yrad exch def\n"); fprintf(prstream, " /xrad exch def\n"); fprintf(prstream, " /y exch def\n"); fprintf(prstream, " /x exch def\n"); fprintf(prstream, " /savematrix mtrx currentmatrix def\n"); fprintf(prstream, " x y translate\n"); fprintf(prstream, " xrad yrad scale\n"); fprintf(prstream, " 0 0 1 startangle endangle arc\n"); fprintf(prstream, " savematrix setmatrix\n"); fprintf(prstream, " end\n"); fprintf(prstream, "} def\n"); /* Text under/overlining etc */ fprintf(prstream, "/TL {\n"); fprintf(prstream, " /kcomp exch def\n"); fprintf(prstream, " /linewidth exch def\n"); fprintf(prstream, " /offset exch def\n"); fprintf(prstream, " GS\n"); fprintf(prstream, " 0 offset rmoveto\n"); fprintf(prstream, " linewidth SLW\n"); fprintf(prstream, " dup stringwidth exch kcomp add exch RL s\n"); fprintf(prstream, " GR\n"); fprintf(prstream, "} def\n"); /* Kerning stuff */ fprintf(prstream, "/KINIT\n"); fprintf(prstream, "{\n"); fprintf(prstream, " /kvector exch def\n"); fprintf(prstream, " /kid 0 def\n"); fprintf(prstream, "} def\n"); fprintf(prstream, "/KPROC\n"); fprintf(prstream, "{\n"); fprintf(prstream, " pop pop\n"); fprintf(prstream, " kvector kid get\n"); fprintf(prstream, " 0 rmoveto\n"); fprintf(prstream, " /kid 1 kid add def\n"); fprintf(prstream, "} def\n"); /* Default encoding */ enc = get_default_encoding(); fprintf(prstream, "/DefEncoding [\n"); for (i = 0; i < 256; i++) { fprintf(prstream, " /%s\n", enc[i]); } fprintf(prstream, "] def\n"); fprintf(prstream, "%%%%EndProlog\n"); fprintf(prstream, "%%%%BeginSetup\n"); if (ps_level2 == TRUE && curformat == PS_FORMAT) { /* page size feed */ switch (ps_setup_feed) { case MEDIA_FEED_AUTO: break; case MEDIA_FEED_MATCH: fprintf(prstream, "%%%%BeginFeature: *PageSize\n"); fprintf(prstream, "<> setpagedevice\n", width_pp, height_pp); fprintf(prstream, "%%%%EndFeature\n"); break; case MEDIA_FEED_MANUAL: fprintf(prstream, "%%%%BeginFeature: *ManualFeed\n"); fprintf(prstream, "<> setpagedevice\n"); fprintf(prstream, "%%%%EndFeature\n"); break; } /* force HW resolution */ if (ps_setup_hwres == TRUE) { fprintf(prstream, "%%%%BeginFeature: *HWResolution\n"); fprintf(prstream, "<> setpagedevice\n", (int) pg.dpi, (int) pg.dpi); fprintf(prstream, "%%%%EndFeature\n"); } } fprintf(prstream, "%%%%EndSetup\n"); if (curformat == PS_FORMAT) { fprintf(prstream, "%%%%Page: 1 1\n"); } /* compensate for printer page offsets */ if (curformat == PS_FORMAT) { fprintf(prstream, "PAGE_OFFSET_X PAGE_OFFSET_Y translate\n"); } fprintf(prstream, "%.2f %.2f scale\n", page_scalef, page_scalef); /* rotate to get landscape on hardcopy */ if (page_orientation == PAGE_ORIENT_LANDSCAPE) { fprintf(prstream, "90 rotate\n"); fprintf(prstream, "0.0 -1.0 translate\n"); } return RETURN_SUCCESS; } void ps_setpen(void) { Pen pen; pen = getpen(); if (pen.color != ps_color || pen.pattern != ps_pattern) { if (ps_level2 == TRUE) { if (pen.pattern == 1) { if (ps_grayscale == TRUE) { fprintf(prstream, "[/DeviceGray] SCS\n"); } else { fprintf(prstream, "[/DeviceRGB] SCS\n"); } fprintf(prstream, "Color%d SC\n", pen.color); } else { if (ps_grayscale == TRUE) { fprintf(prstream, "[/Pattern /DeviceGray] SCS\n"); } else { fprintf(prstream, "[/Pattern /DeviceRGB] SCS\n"); } fprintf(prstream, "Color%d Pattern%d SC\n", pen.color, pen.pattern); } } else { if (ps_grayscale == TRUE) { fprintf(prstream, "Color%d SGRY\n", pen.color); } else { fprintf(prstream, "Color%d SRGB\n", pen.color); } } ps_color = pen.color; ps_pattern = pen.pattern; } } void ps_setdrawbrush(void) { int i; int ls; double lw; ps_setpen(); ls = getlinestyle(); lw = MAX2(getlinewidth(), pixel_size); if (ls != ps_lines || lw != ps_linew) { fprintf(prstream, "["); if (ls > 1) { for (i = 0; i < dash_array_length[ls]; i++) { fprintf(prstream, "%.4f ", lw*dash_array[ls][i]); } } fprintf(prstream, "] 0 SD\n"); fprintf(prstream, "%.4f SLW\n", lw); ps_linew = lw; ps_lines = ls; } } void ps_setlineprops(void) { int lc, lj; lc = getlinecap(); lj = getlinejoin(); if (lc != ps_linecap) { switch (lc) { case LINECAP_BUTT: fprintf(prstream, "0 SLC\n"); break; case LINECAP_ROUND: fprintf(prstream, "1 SLC\n"); break; case LINECAP_PROJ: fprintf(prstream, "2 SLC\n"); break; } ps_linecap = lc; } if (lj != ps_linejoin) { switch (lj) { case LINEJOIN_MITER: fprintf(prstream, "0 SLJ\n"); break; case LINEJOIN_ROUND: fprintf(prstream, "1 SLJ\n"); break; case LINEJOIN_BEVEL: fprintf(prstream, "2 SLJ\n"); break; } ps_linejoin = lj; } } void ps_drawpixel(VPoint vp) { ps_setpen(); if (ps_linew != pixel_size) { fprintf(prstream, "%.4f SLW\n", pixel_size); ps_linew = pixel_size; } if (ps_linecap != LINECAP_ROUND) { fprintf(prstream, "1 SLC\n"); ps_linecap = LINECAP_ROUND; } if (ps_lines != 1) { fprintf(prstream, "[] 0 SD\n"); ps_lines = 1; } fprintf(prstream, "%.4f %.4f PXL\n", vp.x, vp.y); } void ps_drawpolyline(VPoint *vps, int n, int mode) { int i; ps_setdrawbrush(); ps_setlineprops(); fprintf(prstream, "n\n"); fprintf(prstream, "%.4f %.4f m\n", vps[0].x, vps[0].y); for (i = 1; i < n; i++) { fprintf(prstream, "%.4f %.4f l\n", vps[i].x, vps[i].y); } if (mode == POLYLINE_CLOSED) { fprintf(prstream, "%.4f %.4f l\n", vps[0].x, vps[0].y); fprintf(prstream, "c\n"); } fprintf(prstream, "s\n"); } void ps_fillpolygon(VPoint *vps, int nc) { int i; Pen pen = getpen(); if (pen.pattern == 0 || nc < 3) { return; } fprintf(prstream, "n\n"); fprintf(prstream, "%.4f %.4f m\n", vps[0].x, vps[0].y); for (i = 1; i < nc; i++) { fprintf(prstream, "%.4f %.4f l\n", vps[i].x, vps[i].y); } fprintf(prstream, "c\n"); /* fill bg first if the pattern != solid */ if (pen.pattern != 1 && ps_level2 == TRUE) { fprintf(prstream, "GS\n"); if (ps_grayscale == TRUE) { if (ps_pattern != 1) { fprintf(prstream, "[/DeviceGray] SCS\n"); } fprintf(prstream, "Color%d SGRY\n", getbgcolor()); } else { if (ps_pattern != 1) { fprintf(prstream, "[/DeviceRGB] SCS\n"); } fprintf(prstream, "Color%d SRGB\n", getbgcolor()); } if (getfillrule() == FILLRULE_WINDING) { fprintf(prstream, "fill\n"); } else { fprintf(prstream, "eofill\n"); } fprintf(prstream, "GR\n"); } ps_setpen(); if (getfillrule() == FILLRULE_WINDING) { fprintf(prstream, "fill\n"); } else { fprintf(prstream, "eofill\n"); } } void ps_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { VPoint vpc; double rx, ry; ps_setdrawbrush(); vpc.x = (vp1.x + vp2.x)/2; vpc.y = (vp1.y + vp2.y)/2; rx = fabs(vp2.x - vp1.x)/2; ry = fabs(vp2.y - vp1.y)/2; fprintf(prstream, "n %.4f %.4f %.4f %.4f %d %d EARC s\n", vpc.x, vpc.y, rx, ry, a1, a2); } void ps_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { VPoint vpc; double rx, ry; Pen pen = getpen(); if (pen.pattern == 0) { return; } vpc.x = (vp1.x + vp2.x)/2; vpc.y = (vp1.y + vp2.y)/2; rx = fabs(vp2.x - vp1.x)/2; ry = fabs(vp2.y - vp1.y)/2; fprintf(prstream, "n\n"); if (mode == ARCFILL_PIESLICE) { fprintf(prstream, "%.4f %.4f m\n", vpc.x, vpc.y); } fprintf(prstream, "%.4f %.4f %.4f %.4f %d %d EARC c\n", vpc.x, vpc.y, rx, ry, a1, a2); /* fill bg first if the pattern != solid */ if (pen.pattern != 1 && ps_level2 == TRUE) { fprintf(prstream, "GS\n"); if (ps_grayscale == TRUE) { if (ps_pattern != 1) { fprintf(prstream, "[/DeviceGray] SCS\n"); } fprintf(prstream, "Color%d SGRY\n", getbgcolor()); } else { if (ps_pattern != 1) { fprintf(prstream, "[/DeviceRGB] SCS\n"); } fprintf(prstream, "Color%d SRGB\n", getbgcolor()); } fprintf(prstream, "fill\n"); fprintf(prstream, "GR\n"); } ps_setpen(); fprintf(prstream, "fill\n"); } void ps_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { int j, k; int cindex; int paddedW; RGB *rgb; fRGB *frgb; unsigned char tmpbyte; int linelen; ps_setpen(); fprintf(prstream, "GS\n"); fprintf(prstream, "%.4f %.4f translate\n", vp.x, vp.y); fprintf(prstream, "%.4f %.4f scale\n", (float) width/page_scale, (float) height/page_scale); if (pixmap_bpp != 1) { if (pixmap_type == PIXMAP_TRANSPARENT) { /* TODO: mask */ } if (ps_grayscale == TRUE) { fprintf(prstream, "/picstr %d string def\n", width); fprintf(prstream, "%d %d %d\n", width, height, 8); } else { fprintf(prstream, "/picstr %d string def\n", 3*width); fprintf(prstream, "%d %d %d\n", width, height, GRACE_BPP); } fprintf(prstream, "[%d 0 0 %d 0 0]\n", width, -height); fprintf(prstream, "{currentfile picstr readhexstring pop}\n"); if (ps_grayscale == TRUE || ps_level2 == FALSE) { /* No color images in Level1 */ fprintf(prstream, "image\n"); } else { fprintf(prstream, "false 3\n"); fprintf(prstream, "colorimage\n"); } for (k = 0; k < height; k++) { linelen = 0; for (j = 0; j < width; j++) { cindex = (databits)[k*width+j]; if (ps_grayscale == TRUE || ps_level2 == FALSE) { linelen += fprintf(prstream,"%02x", (int) (255*get_colorintensity(cindex))); } else { rgb = get_rgb(cindex); linelen += fprintf(prstream, "%02x%02x%02x", rgb->red, rgb->green, rgb->blue); } if (linelen >= MAX_PS_LINELEN) { fprintf(prstream, "\n"); linelen = 0; } } fprintf(prstream, "\n"); } } else { /* monocolor bitmap */ paddedW = PAD(width, bitmap_pad); if (pixmap_type == PIXMAP_OPAQUE) { if (ps_grayscale == TRUE) { fprintf(prstream,"%.4f SGRY\n", get_colorintensity(getbgcolor())); } else { frgb = get_frgb(getbgcolor()); fprintf(prstream,"%.4f %.4f %.4f SRGB\n", frgb->red, frgb->green, frgb->blue); } fprintf(prstream, "0 0 1 -1 rectfill\n"); } if (ps_grayscale == TRUE) { fprintf(prstream,"%.4f SGRY\n", get_colorintensity(getcolor())); } else { frgb = get_frgb(getcolor()); fprintf(prstream,"%.4f %.4f %.4f SRGB\n", frgb->red, frgb->green, frgb->blue); } fprintf(prstream, "/picstr %d string def\n", paddedW/8); fprintf(prstream, "%d %d true\n", paddedW, height); fprintf(prstream, "[%d 0 0 %d 0 0]\n", paddedW, -height); fprintf(prstream, "{currentfile picstr readhexstring pop}\n"); fprintf(prstream, "imagemask\n"); for (k = 0; k < height; k++) { linelen = 0; for (j = 0; j < paddedW/bitmap_pad; j++) { tmpbyte = reversebits((unsigned char) (databits)[k*paddedW/bitmap_pad + j]); linelen += fprintf(prstream, "%02x", tmpbyte); if (linelen >= MAX_PS_LINELEN) { fprintf(prstream, "\n"); linelen = 0; } } fprintf(prstream, "\n"); } } fprintf(prstream, "GR\n"); } void ps_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning) { char *fontname; char *encscheme; double *kvector; int i; int linelen; if (psfont_status[font] == FALSE) { fontname = get_fontalias(font); encscheme = get_encodingscheme(font); fprintf(prstream, "/%s findfont\n", fontname); if (strcmp(encscheme, "FontSpecific") != 0) { fprintf(prstream, "dup length dict begin\n"); fprintf(prstream, " {1 index /FID ne {def} {pop pop} ifelse} forall\n"); fprintf(prstream, " /Encoding DefEncoding def\n"); fprintf(prstream, " currentdict\n"); fprintf(prstream, "end\n"); } fprintf(prstream, "/Font%d exch definefont pop\n", font); psfont_status[font] = TRUE; } fprintf(prstream, "/Font%d FFSF\n", font); ps_setpen(); fprintf(prstream, "%.4f %.4f m\n", vp.x, vp.y); fprintf(prstream, "GS\n"); fprintf(prstream, "[%.4f %.4f %.4f %.4f 0 0] CC\n", tm->cxx, tm->cyx, tm->cxy, tm->cyy); if (kerning) { kvector = get_kerning_vector(s, len, font); } else { kvector = NULL; } if (kvector) { linelen = 0; linelen += fprintf(prstream, "["); for (i = 0; i < len - 1; i++) { linelen += fprintf(prstream, "%.4f ", kvector[i]); if (linelen >= MAX_PS_LINELEN) { fprintf(prstream, "\n"); linelen = 0; } } fprintf(prstream, "] KINIT\n"); fprintf(prstream, "{KPROC}\n"); } put_string(prstream, s, len); if (underline | overline) { double w, pos, kcomp; if (kvector) { kcomp = kvector[len - 1]; } else { kcomp = 0.0; } w = get_textline_width(font); if (underline) { pos = get_underline_pos(font); fprintf(prstream, " %.4f %.4f %.4f TL", pos, w, kcomp); } if (overline) { pos = get_overline_pos(font); fprintf(prstream, " %.4f %.4f %.4f TL", pos, w, kcomp); } } if (kvector) { fprintf(prstream, " kshow\n"); xfree(kvector); } else { fprintf(prstream, " show\n"); } fprintf(prstream, "GR\n"); } void ps_leavegraphics(void) { view v; int i, first; if (curformat == PS_FORMAT) { fprintf(prstream, "showpage\n"); fprintf(prstream, "%%%%PageTrailer\n"); } fprintf(prstream, "%%%%Trailer\n"); if (tight_bb == TRUE) { v = get_bbox(BBOX_TYPE_GLOB); if (page_orientation == PAGE_ORIENT_LANDSCAPE) { fprintf(prstream, "%%%%BoundingBox: %d %d %d %d\n", (int) (page_scalef*(1.0 - v.yv2)) - 1, (int) (page_scalef*v.xv1) - 1, (int) (page_scalef*(1.0 - v.yv1)) + 2, (int) (page_scalef*v.xv2) + 2); } else { fprintf(prstream, "%%%%BoundingBox: %d %d %d %d\n", (int) (page_scalef*v.xv1) - 1, (int) (page_scalef*v.yv1) - 1, (int) (page_scalef*v.xv2) + 2, (int) (page_scalef*v.yv2) + 2); } } first = TRUE; for (i = 0; i < number_of_fonts(); i++) { if (psfont_status[i] == TRUE) { if (first) { fprintf(prstream, "%%%%DocumentNeededResources: font %s\n", get_fontalias(i)); first = FALSE; } else { fprintf(prstream, "%%%%+ font %s\n", get_fontalias(i)); } } } fprintf(prstream, "%%%%EOF\n"); } static int is7bit(unsigned char uc) { if (uc >= 0x1b && uc <= 0x7e) { return TRUE; } else { return FALSE; } } static int is8bit(unsigned char uc) { if (is7bit(uc) || uc >= 0x80) { return TRUE; } else { return FALSE; } } /* * Put a NOT NULL-terminated string escaping parentheses and backslashes */ static void put_string(FILE *fp, char *s, int len) { int i, linelen = 0; fputc('(', fp); linelen++; for (i = 0; i < len; i++) { char c = s[i]; unsigned char uc = (unsigned char) c; if (c == '(' || c == ')' || c == '\\') { fputc('\\', fp); linelen++; } if ((docdata == DOCDATA_7BIT && !is7bit(uc)) || (docdata == DOCDATA_8BIT && !is8bit(uc))) { linelen += fprintf(fp, "\\%03o", uc); } else { fputc(c, fp); linelen++; } if (linelen >= MAX_PS_LINELEN) { fprintf(prstream, "\\\n"); linelen = 0; } } fputc(')', fp); } int psprintinitgraphics(void) { int result; ps_grayscale = ps_setup_grayscale; ps_level2 = ps_setup_level2; docdata = ps_setup_docdata; result = ps_initgraphics(PS_FORMAT); if (result == RETURN_SUCCESS) { curformat = PS_FORMAT; } return (result); } int epsinitgraphics(void) { int result; ps_grayscale = eps_setup_grayscale; ps_level2 = eps_setup_level2; docdata = eps_setup_docdata; result = ps_initgraphics(EPS_FORMAT); if (result == RETURN_SUCCESS) { curformat = EPS_FORMAT; } return (result); } int ps_op_parser(char *opstring) { if (!strcmp(opstring, "grayscale")) { ps_setup_grayscale = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "color")) { ps_setup_grayscale = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "level2")) { ps_setup_level2 = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "level1")) { ps_setup_level2 = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:7bit")) { ps_setup_docdata = DOCDATA_7BIT; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:8bit")) { ps_setup_docdata = DOCDATA_8BIT; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:binary")) { ps_setup_docdata = DOCDATA_BINARY; return RETURN_SUCCESS; } else if (!strncmp(opstring, "xoffset:", 8)) { ps_setup_offset_x = atoi(opstring + 8); return RETURN_SUCCESS; } else if (!strncmp(opstring, "yoffset:", 8)) { ps_setup_offset_y = atoi(opstring + 8); return RETURN_SUCCESS; } else if (!strcmp(opstring, "hwresolution:on")) { ps_setup_hwres = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "hwresolution:off")) { ps_setup_hwres = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "mediafeed:auto")) { ps_setup_feed = MEDIA_FEED_AUTO; return RETURN_SUCCESS; } else if (!strcmp(opstring, "mediafeed:match")) { ps_setup_feed = MEDIA_FEED_MATCH; return RETURN_SUCCESS; } else if (!strcmp(opstring, "mediafeed:manual")) { ps_setup_feed = MEDIA_FEED_MANUAL; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } int eps_op_parser(char *opstring) { if (!strcmp(opstring, "grayscale")) { eps_setup_grayscale = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "color")) { eps_setup_grayscale = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "level2")) { eps_setup_level2 = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "level1")) { eps_setup_level2 = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:7bit")) { eps_setup_docdata = DOCDATA_7BIT; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:8bit")) { eps_setup_docdata = DOCDATA_8BIT; return RETURN_SUCCESS; } else if (!strcmp(opstring, "docdata:binary")) { eps_setup_docdata = DOCDATA_BINARY; return RETURN_SUCCESS; } else if (!strcmp(opstring, "bbox:tight")) { eps_setup_tight_bb = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "bbox:page")) { eps_setup_tight_bb = FALSE; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } #ifndef NONE_GUI static void update_ps_setup_frame(void); static int set_ps_setup_proc(void *data); static Widget ps_setup_frame; static Widget ps_setup_grayscale_item; static Widget ps_setup_level2_item; static SpinStructure *ps_setup_offset_x_item; static SpinStructure *ps_setup_offset_y_item; static OptionStructure *ps_setup_feed_item; static Widget ps_setup_hwres_item; static OptionStructure *ps_setup_docdata_item; void ps_gui_setup(void) { set_wait_cursor(); if (ps_setup_frame == NULL) { Widget ps_setup_rc, fr, rc; OptionItem op_items[3] = { {MEDIA_FEED_AUTO, "Automatic" }, {MEDIA_FEED_MATCH, "Match size"}, {MEDIA_FEED_MANUAL, "Manual" } }; OptionItem docdata_op_items[3] = { {DOCDATA_7BIT, "7bit" }, {DOCDATA_8BIT, "8bit"}, {DOCDATA_BINARY, "Binary" } }; ps_setup_frame = CreateDialogForm(app_shell, "PS options"); ps_setup_rc = CreateVContainer(ps_setup_frame); fr = CreateFrame(ps_setup_rc, "PS options"); rc = CreateVContainer(fr); ps_setup_grayscale_item = CreateToggleButton(rc, "Grayscale output"); ps_setup_level2_item = CreateToggleButton(rc, "PS Level 2"); ps_setup_docdata_item = CreateOptionChoice(rc, "Document data:", 1, 3, docdata_op_items); fr = CreateFrame(ps_setup_rc, "Page offsets (pt)"); rc = CreateHContainer(fr); ps_setup_offset_x_item = CreateSpinChoice(rc, "X: ", 4, SPIN_TYPE_INT, -999.0, 999.0, 10.0); ps_setup_offset_y_item = CreateSpinChoice(rc, "Y: ", 4, SPIN_TYPE_INT, -999.0, 999.0, 10.0); fr = CreateFrame(ps_setup_rc, "Hardware"); rc = CreateVContainer(fr); ps_setup_feed_item = CreateOptionChoice(rc, "Media feed:", 1, 3, op_items); ps_setup_hwres_item = CreateToggleButton(rc, "Set hardware resolution"); CreateAACDialog(ps_setup_frame, ps_setup_rc, set_ps_setup_proc, NULL); } update_ps_setup_frame(); RaiseWindow(GetParent(ps_setup_frame)); unset_wait_cursor(); } static void update_ps_setup_frame(void) { if (ps_setup_frame) { SetToggleButtonState(ps_setup_grayscale_item, ps_setup_grayscale); SetToggleButtonState(ps_setup_level2_item, ps_setup_level2); SetSpinChoice(ps_setup_offset_x_item, (double) ps_setup_offset_x); SetSpinChoice(ps_setup_offset_y_item, (double) ps_setup_offset_y); SetOptionChoice(ps_setup_feed_item, ps_setup_feed); SetToggleButtonState(ps_setup_hwres_item, ps_setup_hwres); SetOptionChoice(ps_setup_docdata_item, ps_setup_docdata); } } static int set_ps_setup_proc(void *data) { ps_setup_grayscale = GetToggleButtonState(ps_setup_grayscale_item); ps_setup_level2 = GetToggleButtonState(ps_setup_level2_item); ps_setup_offset_x = (int) GetSpinChoice(ps_setup_offset_x_item); ps_setup_offset_y = (int) GetSpinChoice(ps_setup_offset_y_item); ps_setup_feed = GetOptionChoice(ps_setup_feed_item); ps_setup_hwres = GetToggleButtonState(ps_setup_hwres_item); ps_setup_docdata = GetOptionChoice(ps_setup_docdata_item); return RETURN_SUCCESS; } static void update_eps_setup_frame(void); static int set_eps_setup_proc(void *data); static Widget eps_setup_frame; static Widget eps_setup_grayscale_item; static Widget eps_setup_level2_item; static Widget eps_setup_tight_bb_item; static OptionStructure *eps_setup_docdata_item; void eps_gui_setup(void) { set_wait_cursor(); if (eps_setup_frame == NULL) { Widget fr, rc; OptionItem docdata_op_items[3] = { {DOCDATA_7BIT, "7bit" }, {DOCDATA_8BIT, "8bit"}, {DOCDATA_BINARY, "Binary" } }; eps_setup_frame = CreateDialogForm(app_shell, "EPS options"); fr = CreateFrame(eps_setup_frame, "EPS options"); rc = CreateVContainer(fr); eps_setup_grayscale_item = CreateToggleButton(rc, "Grayscale output"); eps_setup_level2_item = CreateToggleButton(rc, "PS Level 2"); eps_setup_tight_bb_item = CreateToggleButton(rc, "Tight BBox"); eps_setup_docdata_item = CreateOptionChoice(rc, "Document data:", 1, 3, docdata_op_items); CreateAACDialog(eps_setup_frame, fr, set_eps_setup_proc, NULL); } update_eps_setup_frame(); RaiseWindow(GetParent(eps_setup_frame)); unset_wait_cursor(); } static void update_eps_setup_frame(void) { if (eps_setup_frame) { SetToggleButtonState(eps_setup_grayscale_item, eps_setup_grayscale); SetToggleButtonState(eps_setup_level2_item, eps_setup_level2); SetToggleButtonState(eps_setup_tight_bb_item, eps_setup_tight_bb); SetOptionChoice(eps_setup_docdata_item, eps_setup_docdata); } } static int set_eps_setup_proc(void *data) { eps_setup_grayscale = GetToggleButtonState(eps_setup_grayscale_item); eps_setup_level2 = GetToggleButtonState(eps_setup_level2_item); eps_setup_tight_bb = GetToggleButtonState(eps_setup_tight_bb_item); eps_setup_docdata = GetOptionChoice(eps_setup_docdata_item); return RETURN_SUCCESS; } #endif grace-5.1.23/src/events.h0000644000076500001440000001072210071615561014700 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Canvas events * */ #ifndef __EVENTS_H_ #define __EVENTS_H_ #include #include #include /* for canvas event proc */ typedef enum { DO_NOTHING, ZOOM_1ST, ZOOM_2ND, VIEW_1ST, VIEW_2ND, STR_LOC, PLACE_LEGEND_1ST, PLACE_LEGEND_2ND, DEL_POINT, MOVE_POINT1ST, MOVE_POINT2ND, ADD_POINT, DEL_OBJECT, MOVE_OBJECT_1ST, MOVE_OBJECT_2ND, MAKE_BOX_1ST, MAKE_BOX_2ND, MAKE_LINE_1ST, MAKE_LINE_2ND, MAKE_ELLIP_1ST, MAKE_ELLIP_2ND, SEL_POINT, COMP_AREA, COMP_PERIMETER, TRACKER, DEF_REGION, DEF_REGION1ST, DEF_REGION2ND, EDIT_OBJECT, PLACE_TIMESTAMP_1ST, PLACE_TIMESTAMP_2ND, COPY_OBJECT1ST, COPY_OBJECT2ND, AUTO_NEAREST, ZOOMX_1ST, ZOOMX_2ND, ZOOMY_1ST, ZOOMY_2ND, DISLINE1ST, DISLINE2ND } CanvasAction; /* add points at */ #define ADD_POINT_BEGINNING 0 #define ADD_POINT_END 1 #define ADD_POINT_NEAREST 2 /* move points */ #define MOVE_POINT_XY 0 #define MOVE_POINT_X 1 #define MOVE_POINT_Y 2 /* * double click detection interval (ms) */ #define CLICKINT 400 #define MAXPICKDIST 0.015 /* the maximum distance away from an object */ /* you may be when picking it (in viewport */ /* coordinates) */ void anchor_point(int curx, int cury, VPoint curvp); void my_proc(Widget parent, XtPointer data, XEvent *event); void set_actioncb(void *data); void set_action(CanvasAction act); void track_point(int gno, int setno, int *loc, int shift); void getpoints(VPoint *vpp); void set_stack_message(void); void do_select_area(void); void do_select_peri(void); void do_dist_proc(void); void do_select_region(void); int next_graph_containing(int cg, VPoint vp); int graph_clicked(int gno, VPoint vp); int focus_clicked(int cg, VPoint vp, VPoint *avp); int legend_clicked(int gno, VPoint vp, view *bb); int timestamp_clicked(VPoint vp, view *bb); int axis_clicked(int gno, VPoint vp, int *axisno); int title_clicked(int gno, VPoint vp); int find_insert_location(int gno, int setno, VPoint vp); int find_point(int gno, VPoint vp, int *setno, int *loc); void newworld(int gno, int axes, VPoint vp1, VPoint vp2); void push_and_zoom(void); /* action routines */ void set_viewport_action( Widget, XKeyEvent *, String *, Cardinal * ); void enable_zoom_action( Widget, XKeyEvent *, String *, Cardinal * ); void autoscale_action( Widget, XKeyEvent *, String *, Cardinal * ); void autoscale_on_near_action( Widget, XKeyEvent *, String *, Cardinal * ); void draw_line_action( Widget, XKeyEvent *, String *, Cardinal * ); void draw_box_action( Widget, XKeyEvent *, String *, Cardinal * ); void draw_ellipse_action( Widget, XKeyEvent *, String *, Cardinal * ); void write_string_action( Widget, XKeyEvent *, String *, Cardinal * ); void delete_object_action( Widget, XKeyEvent *, String *, Cardinal * ); void move_object_action( Widget, XKeyEvent *, String *, Cardinal * ); void place_legend_action( Widget, XKeyEvent *, String *, Cardinal * ); void place_timestamp_action( Widget, XKeyEvent *, String *, Cardinal * ); void refresh_hotlink_action( Widget, XKeyEvent *, String *, Cardinal * ); void exit_abruptly_action( Widget, XKeyEvent *, String *, Cardinal * ); void update_point_locator(int gno, int setno, int loc); void get_tracking_props(int *setno, int *move_dir, int *add_at); #endif /* __EVENTS_H_ */ grace-5.1.23/src/f2c.h0000644000076500001440000001322510071615561014047 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* f2c.h -- Standard Fortran to C header file */ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE typedef long int integer; typedef unsigned long uinteger; typedef char *address; typedef short int shortint; typedef float real; typedef double doublereal; typedef struct { real r, i; } complex; typedef struct { doublereal r, i; } doublecomplex; typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; #if 0 /* Adjust for integer*8. */ typedef long long longint; /* system-dependent */ typedef unsigned long long ulongint; /* system-dependent */ #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) #define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) #define FALSE_ (0) /* Extern is for use with -E */ #ifndef Extern #define Extern extern #endif /* I/O stuff */ #ifdef f2c_i2 /* for -i2 */ typedef short flag; typedef short ftnlen; typedef short ftnint; #else typedef long int flag; typedef long int ftnlen; typedef long int ftnint; #endif /*external read, write*/ typedef struct { flag cierr; ftnint ciunit; flag ciend; char *cifmt; ftnint cirec; } cilist; /*internal read, write*/ typedef struct { flag icierr; char *iciunit; flag iciend; char *icifmt; ftnint icirlen; ftnint icirnum; } icilist; /*open*/ typedef struct { flag oerr; ftnint ounit; char *ofnm; ftnlen ofnmlen; char *osta; char *oacc; char *ofm; ftnint orl; char *oblnk; } olist; /*close*/ typedef struct { flag cerr; ftnint cunit; char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct { flag aerr; ftnint aunit; } alist; /* inquire */ typedef struct { flag inerr; ftnint inunit; char *infile; ftnlen infilen; ftnint *inex; /*parameters in standard's order*/ ftnint *inopen; ftnint *innum; ftnint *innamed; char *inname; ftnlen innamlen; char *inacc; ftnlen inacclen; char *inseq; ftnlen inseqlen; char *indir; ftnlen indirlen; char *infmt; ftnlen infmtlen; char *inform; ftnint informlen; char *inunf; ftnlen inunflen; ftnint *inrecl; ftnint *innrec; char *inblank; ftnlen inblanklen; } inlist; #define VOID void union Multitype { /* for multiple entry points */ integer1 g; shortint h; integer i; /* longint j; */ real r; doublereal d; complex c; doublecomplex z; }; typedef union Multitype Multitype; /*typedef long int Long;*/ /* No longer used; formerly in Namelist */ struct Vardesc { /* for Namelist */ char *name; char *addr; ftnlen *dims; int type; }; typedef struct Vardesc Vardesc; struct Namelist { char *name; Vardesc **vars; int nvars; }; typedef struct Namelist Namelist; /* AIX has abs() defined */ #ifdef abs #undef abs #endif #define abs(x) ((x) >= 0 ? (x) : -(x)) #define dabs(x) (doublereal)abs(x) #define min(a,b) ((a) <= (b) ? (a) : (b)) #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) #define bit_test(a,b) ((a) >> (b) & 1) #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) #define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ #define F2C_proc_par_types 1 #ifdef __cplusplus typedef int /* Unknown procedure type */ (*U_fp)(...); typedef shortint (*J_fp)(...); typedef integer (*I_fp)(...); typedef real (*R_fp)(...); typedef doublereal (*D_fp)(...), (*E_fp)(...); typedef /* Complex */ VOID (*C_fp)(...); typedef /* Double Complex */ VOID (*Z_fp)(...); typedef logical (*L_fp)(...); typedef shortlogical (*K_fp)(...); typedef /* Character */ VOID (*H_fp)(...); typedef /* Subroutine */ int (*S_fp)(...); #else typedef int /* Unknown procedure type */ (*U_fp)(); typedef shortint (*J_fp)(); typedef integer (*I_fp)(); typedef real (*R_fp)(); typedef doublereal (*D_fp)(), (*E_fp)(); typedef /* Complex */ VOID (*C_fp)(); typedef /* Double Complex */ VOID (*Z_fp)(); typedef logical (*L_fp)(); typedef shortlogical (*K_fp)(); typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ typedef VOID C_f; /* complex function */ typedef VOID H_f; /* character function */ typedef VOID Z_f; /* double complex function */ typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ #ifndef Skip_f2c_Undefs #undef cray #undef gcos #undef mc68010 #undef mc68020 #undef mips #undef pdp11 #undef sgi #undef sparc #undef sun #undef sun2 #undef sun3 #undef sun4 #undef u370 #undef u3b #undef u3b2 #undef u3b5 #undef unix #undef vax #endif #endif grace-5.1.23/src/helpwin.c0000644000076500001440000004204712032137500015031 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include "utils.h" #include "files.h" #include "protos.h" #include "motifinc.h" #define NO_HELP "doc/nohelp.html" #ifdef WITH_LIBHELP # include #endif #ifdef WITH_XMHTML # include void create_helper_frame(char *fname); #endif int force_external_viewer = #if defined WITH_XMHTML || defined WITH_LIBHELP FALSE; #else TRUE; #endif void HelpCB(void *data) { char *URL, *ha; int remote; ha = (char *) data; if (ha == NULL) { ha = NO_HELP; } if (strstr(ha, "http:") || strstr(ha, "ftp:") || strstr(ha, "mailto:")) { URL = copy_string(NULL, ha); remote = TRUE; } else { char *p, *pa; if (ha == strstr(ha, "file:")) { p = (ha + 5); } else { p = ha; } pa = strchr(p, '#'); if (pa) { char *base = copy_string(NULL, p); base[pa - p] = '\0'; if (force_external_viewer) { URL = copy_string(NULL, "file://"); } else { URL = NULL; } URL = concat_strings(URL, grace_path(base)); URL = concat_strings(URL, pa); xfree(base); } else { URL = copy_string(NULL, grace_path(p)); } remote = FALSE; } if (remote || force_external_viewer) { char *help_viewer, *command; int i, j, len, urllen, comlen; help_viewer = get_help_viewer(); len = strlen(help_viewer); urllen = strlen(URL); for (i = 0, comlen = len; i < len - 1; i++) { if ((help_viewer[i] == '%') && (help_viewer[i + 1] == 's')){ comlen += urllen - 2; i++; } } command = xmalloc((comlen + 1)*SIZEOF_CHAR); command[comlen] = '\0'; for (i = 0, j = 0; i < len; i++) { if ((help_viewer[i] == '%') && (help_viewer[i + 1] == 's')){ strcpy (&command[j], URL); j += urllen; i++; } else { command[j++] = help_viewer[i]; } } #ifdef VMS system_spawn(command); #else command = concat_strings(command, "&"); system_wrap(command); #endif xfree(command); } else { #ifdef WITH_XMHTML create_helper_frame(URL); #endif #ifdef WITH_LIBHELP get_help(app_shell, (XtPointer) URL, NULL); #endif } xfree(URL); } /* * say a few things about Grace */ static Widget about_frame; void create_about_grtool(void *data) { set_wait_cursor(); if (about_frame == NULL) { Widget wbut, fr, rc, about_panel; char buf[1024]; about_frame = CreateDialogForm(app_shell, "About"); about_panel = CreateVContainer(about_frame); AddDialogFormChild(about_frame, about_panel); fr = CreateFrame(about_panel, NULL); rc = CreateVContainer(fr); CreateLabel(rc, bi_version_string()); #ifdef DEBUG CreateLabel(rc, "Debugging is enabled"); #endif fr = CreateFrame(about_panel, "Legal stuff"); rc = CreateVContainer(fr); CreateLabel(rc, "Copyright (c) 1991-1995 Paul J Turner"); CreateLabel(rc, "Copyright (c) 1996-2012 Grace Development Team"); CreateLabel(rc, "Maintained by Evgeny Stambulchik"); CreateLabel(rc, "All rights reserved"); CreateLabel(rc, "The program is distributed under the terms of the GNU General Public License"); fr = CreateFrame(about_panel, "Third party copyrights"); rc = CreateVContainer(fr); CreateLabel(rc, "Tab widget, Copyright (c) 1997 Pralay Dakua"); CreateLabel(rc, "Xbae widget,"); CreateLabel(rc, " Copyright (c) 1991, 1992 Bell Communications Research, Inc. (Bellcore)"); CreateLabel(rc, " Copyright (c) 1995-1999 Andrew Lister"); CreateLabel(rc, "Raster driver based on the GD-1.3 library,"); CreateLabel(rc, " Portions copyright (c) 1994-1998 Cold Spring Harbor Laboratory"); CreateLabel(rc, " Portions copyright (c) 1996-1998 Boutell.Com, Inc"); #ifdef HAVE_LIBPDF CreateLabel(rc, "PDFlib library, Copyright (c) 1997-2002 Thomas Merz"); #endif fr = CreateFrame(about_panel, "Build info"); rc = CreateVContainer(fr); sprintf(buf, "Host: %s", bi_system()); CreateLabel(rc, buf); sprintf(buf, "Time: %s", bi_date()); CreateLabel(rc, buf); sprintf(buf, "GUI toolkit: %s ", bi_gui()); CreateLabel(rc, buf); sprintf(buf, "Xbae version: %s ", bi_gui_xbae()); CreateLabel(rc, buf); sprintf(buf, "T1lib: %s ", bi_t1lib()); CreateLabel(rc, buf); #ifdef HAVE_LIBPNG sprintf(buf, "libpng: %s ", bi_pnglib()); CreateLabel(rc, buf); #endif #ifdef HAVE_LIBJPEG sprintf(buf, "libjpeg: %s ", bi_libjpeg()); CreateLabel(rc, buf); #endif #ifdef HAVE_LIBPDF sprintf(buf, "PDFlib: %s ", bi_libpdf()); CreateLabel(rc, buf); #endif fr = CreateFrame(about_panel, "Home page"); rc = CreateVContainer(fr); CreateLabel(rc, "http://plasma-gate.weizmann.ac.il/Grace/"); CreateSeparator(about_panel); wbut = CreateButton(about_panel, "Close"); AlignLabel(wbut, ALIGN_CENTER); AddButtonCB(wbut, destroy_dialog_cb, GetParent(about_frame)); ManageChild(about_frame); } RaiseWindow(GetParent(about_frame)); unset_wait_cursor(); } #ifdef WITH_XMHTML /* * Simplistic HTML viewer */ typedef struct _html_ui { Widget top; Widget html; TextStructure *location; Widget track; char *url; char *base; char *anchor; TextStructure *input; Widget case_sensitive; Widget find_backwards; XmHTMLTextFinder finder; char *last; } html_ui; static char *loadFile(char *URL) { FILE *file; int size; char *content; /* open the given file */ if ((file = grace_openr(URL, SOURCE_DISK)) == NULL) { return NULL; } /* see how large this file is */ fseek(file, 0, SEEK_END); size = ftell(file); rewind(file); /* allocate a buffer large enough to contain the entire file */ if ((content = xmalloc(size + 1)) == NULL) { errmsg("xmalloc failed"); return NULL; } /* now read the contents of this file */ if ((fread(content, 1, size, file)) != size) { errmsg("Warning: did not read entire file!"); } grace_close(file); /* sanity */ content[size] = '\0'; return content; } static char *translateURL(char *url, char *base) { char *fname; URLType type; if (url == NULL) { return NULL; } type = XmHTMLGetURLType(url); if (type != ANCHOR_FILE_LOCAL || url[0] == '/') { fname = copy_string(NULL, url); } else { char *p; fname = copy_string(NULL, base); p = strrchr(fname, '/'); if (p) { p++; *p = '\0'; fname = concat_strings(fname, url); } else { fname = copy_string(NULL, url); } } return fname; } static void anchorCB(Widget w, XtPointer client_data, XtPointer call_data) { int id; XmHTMLAnchorPtr href_data = (XmHTMLAnchorPtr) call_data; html_ui *ui = (html_ui *) client_data; char *turl; /* see if we have been called with a valid reason */ if (href_data->reason != XmCR_ACTIVATE) { return; } switch (href_data->url_type) { /* a named anchor */ case ANCHOR_JUMP: /* see if XmHTML knows this anchor */ if ((id = XmHTMLAnchorGetId(w, href_data->href)) != -1) { /* and let XmHTML jump and mark as visited */ href_data->doit = True; href_data->visited = True; ui->url = copy_string(ui->url, ui->base); ui->url = concat_strings(ui->url, href_data->href); SetTextString(ui->location, ui->url); } break; /* let HelpCB check all other types */ default: turl = translateURL(href_data->href, ui->base); HelpCB(turl); xfree(turl); break; } } static void trackCB(Widget w, XtPointer client_data, XtPointer call_data) { XmHTMLAnchorPtr href_data = (XmHTMLAnchorPtr) call_data; html_ui *ui = (html_ui *) client_data; /* see if we have been called with a valid reason */ if (href_data->reason != XmCR_HTML_ANCHORTRACK) { return; } if (href_data->href) { /* a valid anchor, eg, moving into an anchor */ SetLabel(ui->track, href_data->href); } else { /* a valid anchor, eg, moving away from an anchor */ SetLabel(ui->track, ""); } } static int find_cb(void *data) { char *s, *ptr; int case_sensitive, find_backwards; XmHTMLTextPosition start, end; html_ui *ui = (html_ui *) data; ptr = GetTextString(ui->input); if (!ptr || ptr[0] == '\0') { return RETURN_FAILURE; } if (ui->finder == NULL) { ui->finder = XmHTMLTextFinderCreate(ui->html); if (ui->finder == NULL) { errmsg("XmHTMLTextFinderCreate failed!"); return RETURN_FAILURE; } } s = copy_string(NULL, ptr); case_sensitive = GetToggleButtonState(ui->case_sensitive); find_backwards = GetToggleButtonState(ui->find_backwards); /***** * The second arg represent regcomp flags, the default being * REG_EXTENDED. Using -1 for this arg instructs the finder to * keep the current flags. See man regcomp on possible values for * your system. The third arg specifies whether or not the search * should be done case-insensitive (True) or not (False). The last arg * specifies the search direction. Currently only forward (top to * bottom) is supported. *****/ XmHTMLTextFinderSetPatternFlags(ui->finder, -1, case_sensitive ? False : True, find_backwards ? XmHTML_BACKWARD : XmHTML_FORWARD); if (ui->last == NULL || strcmp(ui->last, s)) { if(!XmHTMLTextFinderSetPattern(ui->finder, s)) { /* failure dialog */ ptr = XmHTMLTextFinderGetErrorString(ui->finder); errmsg(ptr ? ptr : "(unknown error)"); /* must free this */ xfree(ptr); xfree(ui->last); ui->last = s; return RETURN_FAILURE; } } switch (XmHTMLTextFindString(ui->html, ui->finder)) { case XmREG_ERROR: ptr = XmHTMLTextFinderGetErrorString(ui->finder); errmsg(ptr ? ptr : "(unknown error)"); xfree(ptr); break; case XmREG_NOMATCH: if (yesno("End of document reached; continue from beginning?", NULL, NULL, NULL) == TRUE) { xfree(s); XCFREE(ui->last); return find_cb(ui); } break; case XmREG_MATCH: if (XmHTMLTextFindToPosition(ui->html, ui->finder, &start, &end)) { XmHTMLTextSetHighlight(ui->html, start, end, XmHIGHLIGHT_SELECTED); XmHTMLTextShowPosition(ui->html, start); } break; } xfree(ui->last); ui->last = s; return RETURN_SUCCESS; } static void create_find_dialog(void *data) { static Widget dialog = NULL; html_ui *ui = (html_ui *) data; if (!dialog) { Widget rc, rc2; dialog = CreateDialogForm(ui->html, "Find Dialog"); rc = CreateVContainer(dialog); ui->input = CreateTextInput(rc, "Find:"); rc2 = CreateHContainer(rc); ui->case_sensitive = CreateToggleButton(rc2, "Case sensitive"); ui->find_backwards = CreateToggleButton(rc2, "Find backwards (N/I)"); CreateAACDialog(dialog, rc, find_cb, data); ManageChild(dialog); } RaiseWindow(GetParent(dialog)); } static void refresh_cb(void *data) { html_ui *ui = (html_ui *) data; XmHTMLRedisplay(ui->html); } static XmImageInfo *loadImage(Widget w, String url, Dimension width, Dimension height, XtPointer client_data) { char *fname; XmImageInfo *image; html_ui *ui = (html_ui *) client_data; fname = translateURL(url, ui->base); if (fname == NULL) { return NULL; } image = XmHTMLImageDefaultProc(w, fname, NULL, 0); xfree(fname); return image; } void location_cb(void *data) { TextStructure *location = (TextStructure *) data; char *url = GetTextString(location); HelpCB(url); } void create_helper_frame(char *URL) { static html_ui *ui = NULL; char *content; set_wait_cursor(); if (ui == NULL) { Widget fr1, fr2, menubar, menupane, rc; ui = xmalloc(sizeof(html_ui)); ui->url = NULL; ui->base = NULL; ui->anchor = NULL; ui->finder = NULL; ui->last = NULL; ui->top = CreateDialogForm(NULL, "Gracilla"); menubar = CreateMenuBar(ui->top); ManageChild(menubar); AddDialogFormChild(ui->top, menubar); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Close", 'C', destroy_dialog_cb, GetParent(ui->top)); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Find", 'F', create_find_dialog, ui); menupane = CreateMenu(menubar, "View", 'V', FALSE); CreateMenuButton(menupane, "Refresh", 'R', refresh_cb, ui); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuButton(menupane, "User's Guide", 'G', HelpCB, "doc/UsersGuide.html"); CreateMenuButton(menupane, "Tutorial", 'T', HelpCB, "doc/Tutorial.html"); CreateMenuButton(menupane, "FAQ", 'Q', HelpCB, "doc/FAQ.html"); CreateMenuButton(menupane, "Changes", 'C', HelpCB, "doc/CHANGES.html"); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "License terms", 'L', HelpCB, "doc/GPL.html"); ui->location = CreateTextInput(ui->top, "Location:"); AddTextInputCB(ui->location, location_cb, ui->location); AddDialogFormChild(ui->top, ui->location->form); fr1 = CreateFrame(ui->top, NULL); AddDialogFormChild(ui->top, fr1); ui->html = XtVaCreateManagedWidget("html", xmHTMLWidgetClass, fr1, XmNimageProc, loadImage, XmNclientData, (XtPointer) ui, XmNenableBadHTMLWarnings, XmHTML_NONE, XmNanchorButtons, False, XmNmarginWidth, 20, XmNmarginHeight, 20, NULL); XtAddCallback(ui->html, XmNactivateCallback, anchorCB, ui); XtAddCallback(ui->html, XmNanchorTrackCallback, trackCB, ui); fr2 = CreateFrame(ui->top, NULL); AddDialogFormChild(ui->top, fr2); rc = CreateVContainer(fr2); ui->track = CreateLabel(rc, "Welcome to Gracilla!"); XtVaSetValues(fr1, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, fr2, NULL); XtVaSetValues(fr2, XmNtopAttachment, XmATTACH_NONE, NULL); ManageChild(ui->top); XtVaSetValues(rc, XmNresizeHeight, False, NULL); ManageChild(GetParent(ui->top)); } ui->url = copy_string(ui->url, URL); ui->base = copy_string(ui->base, URL); if (ui->url) { char *p; p = strchr(ui->url, '#'); if (p) { ui->base[p - ui->url] = '\0'; ui->anchor = copy_string(ui->anchor, p); } else { XCFREE(ui->anchor); } } SetTextString(ui->location, ui->url); if (ui->finder) { XmHTMLTextFinderDestroy(ui->finder); ui->finder = NULL; ui->last = NULL; } content = loadFile(ui->base); if (content != NULL) { XmHTMLTextSetString(ui->html, content); if (ui->anchor) { int id = XmHTMLAnchorGetId(ui->html, ui->anchor); if (id != -1) { XmHTMLAnchorScrollToId(ui->html, id); } } else { XmHTMLTextScrollToLine(ui->html, 0); } xfree(content); RaiseWindow(GetParent(ui->top)); } unset_wait_cursor(); } #endif /* WITH_XMHTML */ grace-5.1.23/src/ssdata.c0000644000076500001440000003640410564427601014656 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * spreadsheet data stuff * */ #include #include #include #include #include "defines.h" #include "globals.h" #include "utils.h" #include "graphs.h" #include "graphutils.h" #include "files.h" #include "ssdata.h" #include "parser.h" #include "protos.h" double *copy_data_column(double *src, int nrows) { double *dest; dest = xmalloc(nrows*SIZEOF_DOUBLE); if (dest != NULL) { memcpy(dest, src, nrows*SIZEOF_DOUBLE); } return dest; } char **copy_string_column(char **src, int nrows) { char **dest; int i; dest = xmalloc(nrows*sizeof(char *)); if (dest != NULL) { for (i = 0; i < nrows; i++) dest[i] =copy_string(NULL, src[i]); } return dest; } /* TODO: index_shift */ double *allocate_index_data(int nrows) { int i; double *retval; retval = xmalloc(nrows*SIZEOF_DOUBLE); if (retval != NULL) { for (i = 0; i < nrows; i++) { retval[i] = i; } } return retval; } double *allocate_mesh(double start, double stop, int len) { int i; double *retval; retval = xmalloc(len*SIZEOF_DOUBLE); if (retval != NULL) { double s = (start + stop)/2, d = (stop - start)/2; for (i = 0; i < len; i++) { retval[i] = s + d*((double) (2*i + 1 - len)/(len - 1)); } } return retval; } static ss_data blockdata = {0, 0, NULL, NULL}; void set_blockdata(ss_data *ssd) { free_ss_data(&blockdata); if (ssd) { memcpy(&blockdata, ssd, sizeof(ss_data)); } } int get_blockncols(void) { return blockdata.ncols; } int get_blocknrows(void) { return blockdata.nrows; } int *get_blockformats(void) { return blockdata.formats; } int realloc_ss_data(ss_data *ssd, int nrows) { int i, j; char **sp; for (i = 0; i < ssd->ncols; i++) { if (ssd->formats[i] == FFORMAT_STRING) { sp = (char **) ssd->data[i]; for (j = nrows; j < ssd->nrows; j++) { XCFREE(sp[j]); } ssd->data[i] = xrealloc(ssd->data[i], nrows*sizeof(char *)); sp = (char **) ssd->data[i]; for (j = ssd->nrows; j < nrows; j++) { sp[j] = NULL; } } else { ssd->data[i] = xrealloc(ssd->data[i], nrows*SIZEOF_DOUBLE); } } ssd->nrows = nrows; return RETURN_SUCCESS; } void free_ss_data(ss_data *ssd) { if (ssd) { int i, j; char **sp; for (i = 0; i < ssd->ncols; i++) { if (ssd->formats && ssd->formats[i] == FFORMAT_STRING) { sp = (char **) ssd->data[i]; for (j = 0; j < ssd->nrows; j++) { XCFREE(sp[j]); } } XCFREE(ssd->data[i]); } XCFREE(ssd->data); XCFREE(ssd->formats); ssd->nrows = 0; ssd->ncols = 0; } } int init_ss_data(ss_data *ssd, int ncols, int *formats) { int i; ssd->data = xmalloc(ncols*SIZEOF_VOID_P); for (i = 0; i < ncols; i++) { ssd->data[i] = NULL; } ssd->formats = xmalloc(ncols*SIZEOF_INT); memcpy(ssd->formats, formats, ncols*SIZEOF_INT); ssd->ncols = ncols; ssd->nrows = 0; return RETURN_SUCCESS; } static char *next_token(char *s, char **token, int *quoted) { *quoted = FALSE; *token = NULL; if (s == NULL) { return NULL; } while (*s == ' ' || *s == '\t') { s++; } if (*s == '"') { s++; *token = s; while (*s != '\0' && (*s != '"' || (*s == '"' && *(s - 1) == '\\'))) { s++; } if (*s == '"') { /* successfully identified a quoted string */ *quoted = TRUE; } } else { *token = s; if (**token == '\n') { /* EOL reached */ return NULL; } while (*s != '\n' && *s != '\0' && *s != ' ' && *s != '\t') { s++; } } if (*s != '\0') { *s = '\0'; s++; return s; } else { return NULL; } } int parse_ss_row(const char *s, int *nncols, int *nscols, int **formats) { int ncols; int quoted; char *buf, *s1, *token; double value; Dates_format df_pref, ddummy; const char *sdummy; *nscols = 0; *nncols = 0; *formats = NULL; df_pref = get_date_hint(); buf = copy_string(NULL, s); s1 = buf; while ((s1 = next_token(s1, &token, "ed)) != NULL) { if (token == NULL) { *nscols = 0; *nncols = 0; XCFREE(*formats); xfree(buf); return RETURN_FAILURE; } ncols = *nncols + *nscols; /* reallocate the formats array */ if (ncols % 10 == 0) { *formats = xrealloc(*formats, (ncols + 10)*SIZEOF_INT); } if (quoted) { (*formats)[ncols] = FFORMAT_STRING; (*nscols)++; } else if (parse_date(token, df_pref, FALSE, &value, &ddummy) == RETURN_SUCCESS) { (*formats)[ncols] = FFORMAT_DATE; (*nncols)++; } else if (parse_float(token, &value, &sdummy) == RETURN_SUCCESS) { (*formats)[ncols] = FFORMAT_NUMBER; (*nncols)++; } else { /* last resort - treat the field as string, even if not quoted */ (*formats)[ncols] = FFORMAT_STRING; (*nscols)++; } } xfree(buf); return RETURN_SUCCESS; } /* NOTE: the input string will be corrupted! */ int insert_data_row(ss_data *ssd, int row, char *s) { int i, j; int ncols = ssd->ncols; char *token; int quoted; char **sp; double *np; Dates_format df_pref, ddummy; const char *sdummy; int res; df_pref = get_date_hint(); for (i = 0; i < ncols; i++) { s = next_token(s, &token, "ed); if (s == NULL || token == NULL) { /* invalid line: free the already allocated string fields */ for (j = 0; j < i; j++) { if (ssd->formats[j] == FFORMAT_STRING) { sp = (char **) ssd->data[j]; XCFREE(sp[row]); } } return RETURN_FAILURE; } else { if (ssd->formats[i] == FFORMAT_STRING) { sp = (char **) ssd->data[i]; sp[row] = copy_string(NULL, token); if (sp[row] != NULL) { res = RETURN_SUCCESS; } else { res = RETURN_FAILURE; } } else if (ssd->formats[i] == FFORMAT_DATE) { np = (double *) ssd->data[i]; res = parse_date(token, df_pref, FALSE, &np[row], &ddummy); } else { np = (double *) ssd->data[i]; res = parse_float(token, &np[row], &sdummy); } if (res != RETURN_SUCCESS) { for (j = 0; j < i; j++) { if (ssd->formats[j] == FFORMAT_STRING) { sp = (char **) ssd->data[j]; XCFREE(sp[row]); } } return RETURN_FAILURE; } } } return RETURN_SUCCESS; } int store_data(ss_data *ssd, int load_type, char *label) { int ncols, nncols, nncols_req, nscols, nrows; int i, j; double *xdata; int gno, setno; int x_from_index; if (ssd == NULL) { return RETURN_FAILURE; } ncols = ssd->ncols; nrows = ssd->nrows; if (ncols <= 0 || nrows <= 0) { return RETURN_FAILURE; } nncols = 0; for (j = 0; j < ncols; j++) { if (ssd->formats[j] != FFORMAT_STRING) { nncols++; } } nscols = ncols - nncols; gno = get_parser_gno(); if (is_valid_gno(gno) != TRUE) { return RETURN_FAILURE; } switch (load_type) { case LOAD_SINGLE: if (nscols > 1) { errmsg("Can not use more than one column of strings per set"); free_ss_data(ssd); return RETURN_FAILURE; } nncols_req = settype_cols(curtype); x_from_index = FALSE; if (nncols_req == nncols + 1) { x_from_index = TRUE; } else if (nncols_req != nncols) { errmsg("Column count incorrect"); return RETURN_FAILURE; } setno = nextset(gno); set_dataset_type(gno, setno, curtype); nncols = 0; if (x_from_index) { xdata = allocate_index_data(nrows); if (xdata == NULL) { free_ss_data(ssd); } setcol(gno, setno, nncols, xdata, nrows); nncols++; } for (j = 0; j < ncols; j++) { if (ssd->formats[j] == FFORMAT_STRING) { set_set_strings(gno, setno, nrows, (char **) ssd->data[j]); } else { setcol(gno, setno, nncols, (double *) ssd->data[j], nrows); nncols++; } } if (!strlen(getcomment(gno, setno))) { setcomment(gno, setno, label); } XCFREE(ssd->data); XCFREE(ssd->formats); break; case LOAD_NXY: if (nscols != 0) { errmsg("Can not yet use strings when reading in data as NXY"); free_ss_data(ssd); return RETURN_FAILURE; } for (i = 0; i < ncols - 1; i++) { setno = nextset(gno); if (setno == -1) { free_ss_data(ssd); return RETURN_FAILURE; } if (i > 0) { xdata = copy_data_column((double *) ssd->data[0], nrows); if (xdata == NULL) { free_ss_data(ssd); } } else { xdata = (double *) ssd->data[0]; } set_dataset_type(gno, setno, SET_XY); setcol(gno, setno, DATA_X, xdata, nrows); setcol(gno, setno, DATA_Y, (double *) ssd->data[i + 1], nrows); setcomment(gno, setno, label); } XCFREE(ssd->data); XCFREE(ssd->formats); break; case LOAD_BLOCK: set_blockdata(ssd); break; default: errmsg("Internal error"); free_ss_data(ssd); return RETURN_FAILURE; } return RETURN_SUCCESS; } int field_string_to_cols(const char *fs, int *nc, int **cols, int *scol) { int col; char *s, *buf; buf = copy_string(NULL, fs); if (buf == NULL) { return RETURN_FAILURE; } s = buf; *nc = 0; while ((s = strtok(s, ":")) != NULL) { (*nc)++; s = NULL; } *cols = xmalloc((*nc)*SIZEOF_INT); if (*cols == NULL) { xfree(buf); return RETURN_FAILURE; } strcpy(buf, fs); s = buf; *nc = 0; *scol = -1; while ((s = strtok(s, ":")) != NULL) { int strcol; if (*s == '{') { char *s1; strcol = TRUE; s++; if ((s1 = strchr(s, '}')) != NULL) { *s1 = '\0'; } } else { strcol = FALSE; } col = atoi(s); col--; if (strcol) { *scol = col; } else { (*cols)[*nc] = col; (*nc)++; } s = NULL; } xfree(buf); return RETURN_SUCCESS; } char *cols_to_field_string(int nc, int *cols, int scol) { int i; char *s, buf[32]; s = NULL; for (i = 0; i < nc; i++) { sprintf(buf, "%d", cols[i] + 1); if (i != 0) { s = concat_strings(s, ":"); } s = concat_strings(s, buf); } if (scol >= 0) { sprintf(buf, ":{%d}", scol + 1); s = concat_strings(s, buf); } return s; } int create_set_fromblock(int gno, int setno, int type, int nc, int *coli, int scol, int autoscale) { int i, ncols, blockncols, blocklen, column; double *cdata; char buf[256], *s; blockncols = get_blockncols(); if (blockncols <= 0) { errmsg("No block data read"); return RETURN_FAILURE; } blocklen = get_blocknrows(); ncols = settype_cols(type); if (nc > ncols) { errmsg("Too many columns scanned in column string"); return RETURN_FAILURE; } if (nc < ncols) { errmsg("Too few columns scanned in column string"); return RETURN_FAILURE; } for (i = 0; i < nc; i++) { if (coli[i] < -1 || coli[i] >= blockncols) { errmsg("Column index out of range"); return RETURN_FAILURE; } } if (scol >= blockncols) { errmsg("String column index out of range"); return RETURN_FAILURE; } if (setno == NEW_SET) { setno = nextset(gno); if (setno == -1) { return RETURN_FAILURE; } } /* clear data stored in the set, if any */ killsetdata(gno, setno); if (activateset(gno, setno) != RETURN_SUCCESS) { return RETURN_FAILURE; } set_dataset_type(gno, setno, type); for (i = 0; i < nc; i++) { column = coli[i]; if (column == -1) { cdata = allocate_index_data(blocklen); } else { if (blockdata.formats[column] != FFORMAT_STRING) { cdata = copy_data_column((double *) blockdata.data[column], blocklen); } else { errmsg("Tried to read doubles from strings!"); killsetdata(gno, setno); return RETURN_FAILURE; } } if (cdata == NULL) { killsetdata(gno, setno); return RETURN_FAILURE; } setcol(gno, setno, i, cdata, blocklen); } /* strings, if any */ if (scol >= 0) { if (blockdata.formats[scol] != FFORMAT_STRING) { errmsg("Tried to read strings from doubles!"); killsetdata(gno, setno); return RETURN_FAILURE; } else { set_set_strings(gno, setno, blocklen, copy_string_column((char **) blockdata.data[scol], blocklen)); } } s = cols_to_field_string(nc, coli, scol); sprintf(buf, "Cols %s", s); xfree(s); setcomment(gno, setno, buf); autoscale_graph(gno, autoscale); return RETURN_SUCCESS; } grace-5.1.23/src/TabP.h0000644000076500001440000000371706626627165014246 0ustar fnevgenyusers /************************************************************************* * Version 1.1 on July-30-1997 * (c) 1997 Pralay Dakua (pkanti@hotmail.com) * * This is a free software and permission to use, modify, distribute, * selling and using for commercial purpose is hereby granted provided * that THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE * INCLUDED IN ALL COPIES AND THEIR SUPPORTING DOCUMENTATIONS. * * There is no warranty for this software. In no event Pralay Dakua * will be liable for merchantability and fitness of the software and * damages due to this software. * * Author: * Pralay Dakua (pkanti@hotmail.com) * **************************************************************************/ #ifndef __TABP_H__ #define __TABP_H__ #include #include #include "Tab.h" #ifdef __cplusplus extern "C" { #endif typedef struct _XmTabClassPart { XtPointer extension; } XmTabClassPart; typedef struct _XmTabClassRec { CoreClassPart core_class; CompositeClassPart composite_class; ConstraintClassPart constraint_class; XmManagerClassPart manager_class; XmTabClassPart tab_class; } XmTabClassRec; extern XmTabClassRec xmTabClassRec; typedef struct _XmTabPart { XtCallbackList value_changed_callback; Widget active_tab; XmFontList tab_font_list; Boolean resize_children; Dimension cut_size; Dimension raise; Dimension tab_height; Dimension margin_width; Dimension margin_height; GC normal_gc; } XmTabPart; typedef struct _XmTabRec { CorePart core; CompositePart composite; ConstraintPart constraint; XmManagerPart manager; XmTabPart tab; } XmTabRec; typedef struct _XmTabConstraintPart { XmString tab_label; XRectangle tab_rect; } XmTabConstraintPart; typedef struct _XmTabConstraintRec { XmManagerConstraintPart manager; XmTabConstraintPart tab; } XmTabConstraintRec; #ifdef __cplusplus } /* Close scope of 'extern "C"' declaration which encloses file. */ #endif #endif /** __TABP_H__ **/ grace-5.1.23/src/featext.c0000644000076500001440000004602710071615561015036 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * featext.c - routines to perform feature extraction on a set of curves */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "globals.h" #include "utils.h" #include "graphs.h" #include "protos.h" #include "motifinc.h" typedef struct _Featext_ui { Widget top; ListStructure *tograph; OptionStructure *feature_item; Widget *xval_item; ListStructure *absic_graph; SetChoiceItem absic_set; Widget legload_rc; } Featext_ui; static Featext_ui feui; static Widget but2[3]; void do_fext_proc( Widget, XtPointer, XtPointer ); double linear_interp( double, double, double, double, double ); int dbl_comp( const void *, const void * ); int getmedian( int grno, int setno, int sorton, double *median ); int get_zero_crossing( int setl, double *xv, double *yv, double *crossing ); int get_rise_time( int setl, double *xv, double *yv, double min, double max, double *width ); int get_fall_time( int setl, double *xv, double *yv, double min, double max, double *width ); int mute_linear_regression(int n, double *x, double *y, double *slope, double *intercept); int get_half_max_width(int len, double *x, double *y, double *width); int get_barycenter( int n, double *x, double *y, double *barycenter ); void fext_routine( int gto, int feature, int abs_src, int abs_set, int abs_graph ); void get_max_pos( double *a, double *b, int n, double max, double *d ); void do_fext_toggle (Widget w, XtPointer client_data, XtPointer call_data) { int value = (int) client_data; if (value == 2 || value == 3) { SetSensitive(feui.legload_rc, True); } else { SetSensitive(feui.legload_rc, False); } } void create_featext_frame(void *data) { set_wait_cursor(); if (feui.top == NULL) { Widget dialog; char *label2[2]; int i; OptionItem feature_option_items[] = { { 0, "Y minimum" }, { 1, "Y maximum" }, { 2, "Y average" }, { 3, "Y std. dev." }, { 4, "Y median" }, { 5, "X minimum" }, { 6, "X maximum" }, { 7, "X average" }, { 8, "X std. dev." }, { 9, "X median" }, {10, "Frequency" }, {11, "Period" }, {12, "Zero crossing" }, {13, "Rise time" }, {14, "Fall time" }, {15, "Slope" }, {16, "Y intercept" }, {17, "Set length" }, {18, "Half maximal width"}, {19, "Barycenter X" }, {20, "Barycenter Y" }, {21, "X(Y max)" }, {22, "Y(X max)" }, {23, "Integral" } }; label2[0] = "Accept"; label2[1] = "Close"; feui.top = XmCreateDialogShell(app_shell, "Feature Extraction", NULL, 0); handle_close(feui.top); dialog = XmCreateRowColumn(feui.top, "dialog_rc", NULL, 0); feui.tograph = CreateGraphChoice(dialog, "Results to graph:", LIST_TYPE_SINGLE); feui.feature_item = CreateOptionChoice(dialog, "Feature:", 3, 24, feature_option_items); feui.xval_item = CreatePanelChoice(dialog, "X values from:", 5, "Index", "Legends", "X from Set", "Y from set", NULL); for (i = 0; i < 4; i++) { XtAddCallback(feui.xval_item[2 + i], XmNactivateCallback, (XtCallbackProc) do_fext_toggle, (XtPointer) i); } CreateSeparator(dialog); feui.legload_rc= XmCreateRowColumn(dialog, "fext_legload_rc", NULL, 0); feui.absic_graph = CreateGraphChoice(feui.legload_rc, "Abscissa from graph:", LIST_TYPE_SINGLE); feui.absic_set = CreateSetSelector(feui.legload_rc, "set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, 0, SELECTION_TYPE_SINGLE); update_save_set_list( feui.absic_set, 0 ); ManageChild(feui.legload_rc); SetSensitive(feui.legload_rc, False); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_fext_proc,(XtPointer) & feui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc)destroy_dialog,(XtPointer)feui.top); ManageChild(dialog); } RaiseWindow(feui.top); unset_wait_cursor(); } void do_fext_proc( Widget w, XtPointer client_data, XtPointer call_data ) { int gto, feature, abs_graph = -1, abs_set = -1, abs_src; Featext_ui *ui = (Featext_ui *) client_data; feature = GetOptionChoice(ui->feature_item); GetSingleListChoice(ui->tograph, >o); if( gto == -1 ) gto = get_cg(); abs_src = (int) GetChoice(ui->xval_item); if( abs_src ==2 || abs_src==3 ) { abs_set = GetSelectedSet(ui->absic_set); GetSingleListChoice(ui->absic_graph, &abs_graph); } fext_routine( gto, feature, abs_src, abs_set, abs_graph ); update_set_lists(gto); xdrawgraph(); } void fext_routine( int gto, int feature, int abs_src, int abs_set, int abs_graph ) { int i, cs, ns, fts, ncurves, extract_err; double datum, dummy, *absy; double y1, y2; int iy1, iy2; char tbuf[1024]; float *abscissa; double xmin, xmax, ymin, ymax; int cg = get_cg(); double *x; abscissa = xmalloc(number_of_sets(cg)*SIZEOF_FLOAT); if( !is_graph_active( gto ) ){ errwin("Graph for results must be active"); return; } if( (ns=nextset( gto ) )== -1 ) { errwin("Choose a new graph or kill sets!"); return; } ncurves = nactive(get_cg()); switch( abs_src ) { case 0: /* use index */ for( i=0; iamp90 ) x90++; if( x90==setl || x90==0) return 1; x10= x90+1; while( x10amp10 ) x10++; if( x10==setl ) return 1; *width = linear_interp( yv[x10-1], xv[x10-1], yv[x10], xv[x10], amp10 )- linear_interp( yv[x90-1], xv[x90-1], yv[x90], xv[x90], amp90 ); return 0; } int get_zero_crossing( int setl, double *xv, double *yv, double *crossing ) { int i=0; while( i0. ) i++; if( i==setl ) return 1; if( yv[i] == 0 ) *crossing = xv[i]; else *crossing = linear_interp( yv[i], xv[i], yv[i+1], xv[i+1], 0 ); return 0; } /* Get FWHM of the highest peak */ int get_half_max_width(int len, double *x, double *y, double *width) { int i, imin, imax; double ymin, ymax, yavg; double x_u, x_d; minmax(y, len, &ymin, &ymax, &imin, &imax); yavg = (ymin + ymax)/2.0; i = imax; while (i >= 0 && y[i] > yavg) { i--; } if (i < 0) { return RETURN_FAILURE; } x_d = linear_interp(y[i], x[i], y[i + 1], x[i + 1], yavg); i = imax; while (i < len && y[i] > yavg) { i++; } if (i == len) { return RETURN_FAILURE; } x_u = linear_interp(y[i - 1], x[i - 1], y[i], x[i], yavg); *width = fabs(x_u - x_d); return RETURN_SUCCESS; } /* linear interpolate between two points, return a y value given an x */ double linear_interp( double x1, double y1, double x2, double y2, double x ) { return y1 + ( x-x1 )*(y2-y1)/(x2-x1); } /* get the median of the X or Y portion of a set */ int getmedian( int grno, int setno, int sorton, double *median ) { int setlen; double *setdata; setlen = getsetlength( get_cg(), setno ); setdata = (double *)xmalloc( setlen*sizeof(double) ); if( sorton == DATA_X ) memcpy( setdata, getx( grno, setno ), setlen*sizeof(double) ); else memcpy( setdata, gety( grno, setno ), setlen*sizeof(double) ); qsort( setdata, setlen, sizeof(double), dbl_comp ); if( setlen%2 ) /* odd set */ *median = setdata[(setlen+1)/2-1]; else *median = ( setdata[setlen/2-1] + setdata[setlen/2] )/2.; xfree( setdata ); return 0; } int dbl_comp( const void *a, const void *b ) { if( *(double *)a < *(double *)b ) return -1; else if( *(double *)a > *(double *)b ) return 1; else return 0; } int get_barycenter( int n, double *x, double *y, double *barycenter ) { double wsum=0; *barycenter = 0; for( n--; n>=0; n-- ) { wsum += x[n]*y[n]; *barycenter += x[n]; } *barycenter = wsum/(*barycenter); return 0; } /* given maximum of set a, find the corresponding entry in set b */ void get_max_pos( double *a, double *b, int n, double max, double *d ) { int i=-1; while( ++i /* data load types */ #define LOAD_SINGLE 0 #define LOAD_NXY 1 #define LOAD_BLOCK 2 int add_io_filter( int type, int method, char *id, char *comm ); int add_input_filter( int method, char *id, char *comm ); int add_output_filter( int method, char *id, char *comm ); void clear_io_filters( int f ); FILE *filter_read( char *fn ); FILE *filter_write( char *fn ); char *grace_path(char *fn); char *grace_exe_path(char *fn); FILE *grace_openw(char *fn); FILE *grace_openr(char *fn, int src); void grace_close(FILE *fp); int getparms(char *plfile); int getdata(int gno, char *fn, int src, int type); int update_set_from_file(int gno, int setno, char *fn, int src); int readblockdata(int gno, char *fn, FILE * fp); int load_project_file(char *fn, int as_template); int new_project(char *template); int load_project(char *fn); int save_project(char *fn); int write_set(int gno, int setno, FILE *cp, char *format, int rawdata); void outputset(int gno, int setno, char *fname, char *dformat); int readnetcdf(int gno, int setno, char *netcdfname, char *xvar, char *yvar, int nstart, int nstop, int nstride); int write_netcdf(char *fname); char *grace_fgets(char *s, int size, FILE *stream); #endif /* __FILES_H_ */ grace-5.1.23/src/Make.common0000644000076500001440000000340011014400276015276 0ustar fnevgenyusers # The following are for a version that does not link to # the X libraries. # # non-X version sources # PARS_Y = pars.yacc PARS_C = pars.c PARS_O = pars$(O) GRSRCS = main.c plotone.c files.c ssdata.c utils.c drawticks.c \ nonlfit.c lmdif.c as274c.c fit.c fourier.c \ graphs.c graphutils.c setutils.c regionutils.c \ objutils.c computils.c defaults.c params.c \ draw.c dlmodule.c missing.c alloca.c \ iofilters.c dates.c t1fonts.c device.c mfdrv.c \ mifdrv.c psdrv.c pdfdrv.c svgdrv.c gd.c rstdrv.c dummydrv.c \ humlik.c mathstuff.c GROBJS = main$(O) plotone$(O) files$(O) ssdata$(O) utils$(O) drawticks$(O) \ nonlfit$(O) lmdif$(O) as274c$(O) fit$(O) fourier$(O) \ graphs$(O) graphutils$(O) setutils$(O) regionutils$(O) \ objutils$(O) computils$(O) defaults$(O) params$(O) \ draw$(O) dlmodule$(O) $(PARS_O) missing$(O) $(ALLOCA) \ iofilters$(O) dates$(O) t1fonts$(O) device$(O) \ dummydrv$(O) mfdrv$(O) mifdrv$(O) psdrv$(O) \ pdfdrv$(O) svgdrv$(O) gd$(O) rstdrv$(O) humlik$(O) mathstuff$(O) # The following are for a GUI # # X/MOTIF sources # GUISRCS = Tab.c motifutils.c \ compwin.c comwin.c eblockwin.c \ editpwin.c events.c featext.c fileswin.c plotwin.c \ graphappwin.c helpwin.c hotwin.c \ locatewin.c miscwin.c monwin.c \ nonlwin.c printwin.c ptswin.c regionwin.c \ setwin.c strwin.c setappwin.c \ tickwin.c worldwin.c fontwin.c xutil.c x11drv.c xmgrace.c GUIOBJS = Tab$(O) motifutils$(O) \ compwin$(O) comwin$(O) eblockwin$(O) \ editpwin$(O) events$(O) featext$(O) fileswin$(O) plotwin$(O) \ graphappwin$(O) helpwin$(O) hotwin$(O) \ locatewin$(O) miscwin$(O) monwin$(O) \ nonlwin$(O) printwin$(O) ptswin$(O) regionwin$(O) \ setwin$(O) strwin$(O) setappwin$(O) \ tickwin$(O) worldwin$(O) fontwin$(O) xutil$(O) x11drv$(O) xmgrace$(O) grace-5.1.23/src/mifdrv.h0000644000076500001440000000322410071615562014663 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-99 Grace Development Team * Copyright (c) 1991-95 Paul J Turner, Portland, OR * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" int mifinitgraphics(void); void mif_drawpixel(VPoint vp); void mif_drawpolyline(VPoint *vps, int n, int mode); void mif_fillpolygon(VPoint *vps, int nc); void mif_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void mif_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void mif_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void mif_puttext (VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void mif_leavegraphics(void); grace-5.1.23/src/nonlwin.c0000644000076500001440000005321110432706471015055 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * non linear curve fitting * */ #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "files.h" #include "parser.h" #include "motifinc.h" #include "protos.h" /* nonlprefs.load possible values */ #define LOAD_VALUES 0 #define LOAD_RESIDUALS 1 #define LOAD_FUNCTION 2 #define WEIGHT_NONE 0 #define WEIGHT_Y 1 #define WEIGHT_Y2 2 #define WEIGHT_DY 3 #define WEIGHT_CUSTOM 4 /* prefs for non-linear fit */ typedef struct { int autoload; /* do autoload */ int load; /* load to... */ int npoints; /* # of points to evaluate function at */ double start; /* start... */ double stop; /* stop ... */ } nonlprefs; static char buf[256]; static nonlprefs nonl_prefs = {TRUE, LOAD_VALUES, 10, 0.0, 1.0}; static Widget nonl_frame = NULL; static TextStructure *nonl_formula_item; static Widget nonl_title_item; static SrcDestStructure *nonl_set_item; static Widget nonl_parm_item[MAXPARM]; static Widget nonl_value_item[MAXPARM]; static Widget nonl_constr_item[MAXPARM]; static Widget nonl_lowb_item[MAXPARM]; static Widget nonl_uppb_item[MAXPARM]; static Widget nonl_tol_item; static OptionStructure *nonl_nparm_item; static SpinStructure *nonl_nsteps_item; static OptionStructure *nonl_load_item; static Widget nonl_autol_item; static Widget nonl_npts_item; static Widget nonl_start_item, nonl_stop_item; static Widget nonl_fload_rc; static RestrictionStructure *restr_item; static OptionStructure *nonl_weigh_item; static Widget nonl_wfunc_item; static int do_nonl_proc(void *data); static void do_nonl_toggle(int onoff, void *data); static void nonl_wf_cb(int value, void *data); static void do_constr_toggle(int onoff, void *data); static void update_nonl_frame_cb(void *data); static void reset_nonl_frame_cb(void *data); static void do_nparm_toggle(int value, void *data); static void create_openfit_popup(void *data); static void create_savefit_popup(void *data); static int do_openfit_proc(char *filename, void *data); static int do_savefit_proc(char *filename, void *data); static int load_nonl_fit(int src_gno, int src_setno, int force); static void load_nonl_fit_cb(void *data); /* ARGSUSED */ void create_nonl_frame(void *data) { set_wait_cursor(); if (nonl_frame == NULL) { int i; OptionItem np_option_items[MAXPARM + 1], option_items[5]; Widget menubar, menupane; Widget nonl_tab, nonl_main, nonl_advanced; Widget sw, title_fr, fr3, rc1, rc2, rc3, lab; nonl_frame = CreateDialogForm(app_shell, "Non-linear curve fitting"); menubar = CreateMenuBar(nonl_frame); menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "Open...", 'O', create_openfit_popup, NULL); CreateMenuButton(menupane, "Save...", 'S', create_savefit_popup, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Close", 'C', destroy_dialog_cb, GetParent(nonl_frame)); menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Reset fit parameters", 'R', reset_nonl_frame_cb, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Load current fit", 'L', load_nonl_fit_cb, NULL); menupane = CreateMenu(menubar, "View", 'V', FALSE); nonl_autol_item = CreateMenuToggle(menupane, "Autoload", 'A', NULL, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Update", 'U', update_nonl_frame_cb, NULL); menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuHelpButton(menupane, "On fit", 'f', nonl_frame, "doc/UsersGuide.html#non-linear-fit"); ManageChild(menubar); AddDialogFormChild(nonl_frame, menubar); nonl_set_item = CreateSrcDestSelector(nonl_frame, LIST_TYPE_SINGLE); AddDialogFormChild(nonl_frame, nonl_set_item->form); title_fr = CreateFrame(nonl_frame, NULL); XtVaSetValues(title_fr, XmNshadowType, XmSHADOW_ETCHED_OUT, NULL); nonl_title_item = CreateLabel(title_fr, nonl_opts.title); AddDialogFormChild(nonl_frame, title_fr); /* ------------ Tabs --------------*/ nonl_tab = CreateTab(nonl_frame); /* ------------ Main tab --------------*/ nonl_main = CreateTabPage(nonl_tab, "Main"); nonl_formula_item = CreateTextInput(nonl_main, "Formula:"); rc1 = CreateHContainer(nonl_main); for (i = 0; i < MAXPARM + 1; i++) { np_option_items[i].value = i; sprintf(buf, "%d", i); np_option_items[i].label = copy_string(NULL, buf); } nonl_nparm_item = CreateOptionChoice(rc1, "Parameters:", 1, MAXPARM + 1, np_option_items); AddOptionChoiceCB(nonl_nparm_item, do_nparm_toggle, NULL); nonl_tol_item = CreateTextItem2(rc1, 8, "Tolerance:"); nonl_nsteps_item = CreateSpinChoice(rc1, "Iterations:", 3, SPIN_TYPE_INT, 0.0, 500.0, 5.0); SetSpinChoice(nonl_nsteps_item, 5.0); sw = XtVaCreateManagedWidget("sw", xmScrolledWindowWidgetClass, nonl_main, XmNheight, 180, XmNscrollingPolicy, XmAUTOMATIC, NULL); rc2 = CreateVContainer(sw); for (i = 0; i < MAXPARM; i++) { nonl_parm_item[i] = CreateHContainer(rc2); sprintf(buf, "A%1d: ", i); nonl_value_item[i] = CreateTextItem2(nonl_parm_item[i], 10, buf); nonl_constr_item[i] = CreateToggleButton(nonl_parm_item[i], "Bounds:"); AddToggleButtonCB(nonl_constr_item[i], do_constr_toggle, (void *) i); nonl_lowb_item[i] = CreateTextItem2(nonl_parm_item[i], 6, ""); sprintf(buf, "< A%1d < ", i); lab = CreateLabel(nonl_parm_item[i], buf); nonl_uppb_item[i] = CreateTextItem2(nonl_parm_item[i], 6, ""); } /* ------------ Advanced tab --------------*/ nonl_advanced = CreateTabPage(nonl_tab, "Advanced"); restr_item = CreateRestrictionChoice(nonl_advanced, "Source data filtering"); fr3 = CreateFrame(nonl_advanced, "Weighting"); rc3 = CreateHContainer(fr3); option_items[0].value = WEIGHT_NONE; option_items[0].label = "None"; option_items[1].value = WEIGHT_Y; option_items[1].label = "1/Y"; option_items[2].value = WEIGHT_Y2; option_items[2].label = "1/Y^2"; option_items[3].value = WEIGHT_DY; option_items[3].label = "1/dY^2"; option_items[4].value = WEIGHT_CUSTOM; option_items[4].label = "Custom"; nonl_weigh_item = CreateOptionChoice(rc3, "Weights", 1, 5, option_items); nonl_wfunc_item = CreateTextItem2(rc3, 30, "Function:"); AddOptionChoiceCB(nonl_weigh_item, nonl_wf_cb, (void *) nonl_wfunc_item); fr3 = CreateFrame(nonl_advanced, "Load options"); rc3 = CreateVContainer(fr3); option_items[0].value = LOAD_VALUES; option_items[0].label = "Fitted values"; option_items[1].value = LOAD_RESIDUALS; option_items[1].label = "Residuals"; option_items[2].value = LOAD_FUNCTION; option_items[2].label = "Function"; nonl_load_item = CreateOptionChoice(rc3, "Load", 1, 3, option_items); nonl_fload_rc = CreateHContainer(rc3); nonl_start_item = CreateTextItem2(nonl_fload_rc, 6, "Start load at:"); nonl_stop_item = CreateTextItem2(nonl_fload_rc, 6, "Stop load at:"); nonl_npts_item = CreateTextItem2(nonl_fload_rc, 4, "# of points:"); AddOptionChoiceCB(nonl_load_item, do_nonl_toggle, (void *) nonl_fload_rc); CreateAACDialog(nonl_frame, nonl_tab, do_nonl_proc, NULL); } update_nonl_frame(); RaiseWindow(GetParent(nonl_frame)); unset_wait_cursor(); } static void do_nparm_toggle(int value, void *data) { int i; for (i = 0; i < MAXPARM; i++) { if (i < value) { ManageChild(nonl_parm_item[i]); } else { UnmanageChild(nonl_parm_item[i]); } } } static void reset_nonl_frame_cb(void *data) { reset_nonl(); update_nonl_frame(); } static void update_nonl_frame_cb(void *data) { update_nonl_frame(); } void update_nonl_frame(void) { int i; if (nonl_frame) { XmString str = XmStringCreateLocalized(nonl_opts.title); XtVaSetValues(nonl_title_item, XmNlabelString, str, NULL); /* * If I define only XmALIGNMENT_CENTER (default!) then it's ignored - bug in Motif??? */ XtVaSetValues(nonl_title_item, XmNalignment, XmALIGNMENT_BEGINNING, NULL); XtVaSetValues(nonl_title_item, XmNalignment, XmALIGNMENT_CENTER, NULL); XmStringFree(str); SetTextString(nonl_formula_item, nonl_opts.formula); sprintf(buf, "%g", nonl_opts.tolerance); xv_setstr(nonl_tol_item, buf); SetOptionChoice(nonl_nparm_item, nonl_opts.parnum); for (i = 0; i < MAXPARM; i++) { sprintf(buf, "%g", nonl_parms[i].value); xv_setstr(nonl_value_item[i], buf); SetToggleButtonState(nonl_constr_item[i], nonl_parms[i].constr); sprintf(buf, "%g", nonl_parms[i].min); xv_setstr(nonl_lowb_item[i], buf); SetSensitive(nonl_lowb_item[i], nonl_parms[i].constr); sprintf(buf, "%g", nonl_parms[i].max); xv_setstr(nonl_uppb_item[i], buf); SetSensitive(nonl_uppb_item[i], nonl_parms[i].constr); if (i < nonl_opts.parnum) { if (!XtIsManaged (nonl_parm_item[i])) { ManageChild(nonl_parm_item[i]); } } else { if (XtIsManaged (nonl_parm_item[i])) { UnmanageChild(nonl_parm_item[i]); } } } SetToggleButtonState(nonl_autol_item, nonl_prefs.autoload); SetOptionChoice(nonl_load_item, nonl_prefs.load); if (nonl_prefs.load == LOAD_FUNCTION) { SetSensitive(nonl_fload_rc, True); } else { SetSensitive(nonl_fload_rc, False); } if (GetOptionChoice(nonl_weigh_item) == WEIGHT_CUSTOM) { SetSensitive(GetParent(nonl_wfunc_item), True); } else { SetSensitive(GetParent(nonl_wfunc_item), False); } sprintf(buf, "%g", nonl_prefs.start); xv_setstr(nonl_start_item, buf); sprintf(buf, "%g", nonl_prefs.stop); xv_setstr(nonl_stop_item, buf); sprintf(buf, "%d", nonl_prefs.npoints); xv_setstr(nonl_npts_item, buf); } } static void nonl_wf_cb(int value, void *data) { Widget rc = GetParent((Widget) data); if (value == WEIGHT_CUSTOM) { SetSensitive(rc, True); } else { SetSensitive(rc, False); } } static void do_nonl_toggle(int value, void *data) { Widget rc = (Widget) data; if (value == LOAD_FUNCTION) { SetSensitive(rc, True); } else { SetSensitive(rc, False); } } static void do_constr_toggle(int onoff, void *data) { int value = (int) data; if (onoff) { SetSensitive(nonl_lowb_item[value], True); SetSensitive(nonl_uppb_item[value], True); nonl_parms[value].constr = TRUE; } else { SetSensitive(nonl_lowb_item[value], False); SetSensitive(nonl_uppb_item[value], False); nonl_parms[value].constr = FALSE; } } /* ARGSUSED */ static int do_nonl_proc(void *data) { int i; int nsteps; int src_gno, src_setno; int resno; char *fstr; int nlen, wlen; int weight_method; double *ytmp, *warray; int restr_type, restr_negate; char *rarray; if (GetSingleListChoice(nonl_set_item->src->graph_sel, &src_gno) != RETURN_SUCCESS) { errmsg("No source graph selected"); return RETURN_FAILURE; } if (GetSingleListChoice(nonl_set_item->src->set_sel, &src_setno) != RETURN_SUCCESS) { errmsg("No source set selected"); return RETURN_FAILURE; } nonl_opts.formula = copy_string(nonl_opts.formula, GetTextString(nonl_formula_item)); nsteps = (int) GetSpinChoice(nonl_nsteps_item); nonl_opts.tolerance = atof(xv_getstr(nonl_tol_item)); nonl_opts.parnum = GetOptionChoice(nonl_nparm_item); for (i = 0; i < nonl_opts.parnum; i++) { strcpy(buf, xv_getstr(nonl_value_item[i])); if (sscanf(buf, "%lf", &nonl_parms[i].value) != 1) { errmsg("Invalid input in parameter field"); return RETURN_FAILURE; } nonl_parms[i].constr = GetToggleButtonState(nonl_constr_item[i]); if (nonl_parms[i].constr) { strcpy(buf, xv_getstr(nonl_lowb_item[i])); if (sscanf(buf, "%lf", &nonl_parms[i].min) != 1) { errmsg("Invalid input in low-bound field"); return RETURN_FAILURE; } strcpy(buf, xv_getstr(nonl_uppb_item[i])); if (sscanf(buf, "%lf", &nonl_parms[i].max) != 1) { errmsg("Invalid input in upper-bound field"); return RETURN_FAILURE; } if ((nonl_parms[i].value < nonl_parms[i].min) || (nonl_parms[i].value > nonl_parms[i].max)) { errmsg("Initial values must be within bounds"); return RETURN_FAILURE; } } } if (nsteps) { /* apply weigh function */ nlen = getsetlength(src_gno, src_setno); weight_method = GetOptionChoice(nonl_weigh_item); switch (weight_method) { case WEIGHT_Y: case WEIGHT_Y2: ytmp = getcol(src_gno, src_setno, DATA_Y); for (i = 0; i < nlen; i++) { if (ytmp[i] == 0.0) { errmsg("Divide by zero while calculating weights"); return RETURN_FAILURE; } } warray = xmalloc(nlen*SIZEOF_DOUBLE); if (warray == NULL) { errmsg("xmalloc failed in do_nonl_proc()"); return RETURN_FAILURE; } for (i = 0; i < nlen; i++) { if (weight_method == WEIGHT_Y) { warray[i] = 1/ytmp[i]; } else { warray[i] = 1/(ytmp[i]*ytmp[i]); } } break; case WEIGHT_DY: ytmp = getcol(src_gno, src_setno, DATA_Y1); if (ytmp == NULL) { errmsg("The set doesn't have dY data column"); return RETURN_FAILURE; } for (i = 0; i < nlen; i++) { if (ytmp[i] == 0.0) { errmsg("Divide by zero while calculating weights"); return RETURN_FAILURE; } } warray = xmalloc(nlen*SIZEOF_DOUBLE); if (warray == NULL) { errmsg("xmalloc failed in do_nonl_proc()"); } for (i = 0; i < nlen; i++) { warray[i] = 1/(ytmp[i]*ytmp[i]); } break; case WEIGHT_CUSTOM: if (set_parser_setno(src_gno, src_setno) != RETURN_SUCCESS) { errmsg("Bad set"); return RETURN_FAILURE; } fstr = xv_getstr(nonl_wfunc_item); if (v_scanner(fstr, &wlen, &warray) != RETURN_SUCCESS) { errmsg("Error evaluating expression for weights"); return RETURN_FAILURE; } if (wlen != nlen) { errmsg("The array of weights has different length"); xfree(warray); return RETURN_FAILURE; } break; default: warray = NULL; break; } /* apply restriction */ restr_type = GetOptionChoice(restr_item->r_sel); restr_negate = GetToggleButtonState(restr_item->negate); resno = get_restriction_array(src_gno, src_setno, restr_type, restr_negate, &rarray); if (resno != RETURN_SUCCESS) { errmsg("Error in restriction evaluation"); xfree(warray); return RETURN_FAILURE; } /* The fit itself! */ resno = do_nonlfit(src_gno, src_setno, warray, rarray, nsteps); xfree(warray); xfree(rarray); if (resno != RETURN_SUCCESS) { errmsg("Fatal error in do_nonlfit()"); return RETURN_FAILURE; } for (i = 0; i < nonl_opts.parnum; i++) { sprintf(buf, "%g", nonl_parms[i].value); xv_setstr(nonl_value_item[i], buf); } } /* * Select & activate a set to load results to */ load_nonl_fit(src_gno, src_setno, FALSE); return RETURN_SUCCESS; } static void load_nonl_fit_cb(void *data) { int src_gno, src_setno; if (GetSingleListChoice(nonl_set_item->src->graph_sel, &src_gno) != RETURN_SUCCESS) { errmsg("No source graph selected"); return; } if (GetSingleListChoice(nonl_set_item->src->set_sel, &src_setno) != RETURN_SUCCESS) { errmsg("No source set selected"); return; } load_nonl_fit(src_gno, src_setno, TRUE); } static int load_nonl_fit(int src_gno, int src_setno, int force) { int dest_gno, dest_setno; int i, npts = 0; double delx, *xfit, *y, *yfit; if (GetSingleListChoice(nonl_set_item->dest->graph_sel, &dest_gno) != RETURN_SUCCESS) { errmsg("No destination graph selected"); return RETURN_FAILURE; } if (GetSingleListChoice(nonl_set_item->dest->set_sel, &dest_setno) != RETURN_SUCCESS) { /* no dest sel selected; allocate new one */ dest_setno = nextset(dest_gno); if (dest_setno == -1) { return RETURN_FAILURE; } else { activateset(dest_gno, dest_setno); } } nonl_prefs.autoload = GetToggleButtonState(nonl_autol_item); nonl_prefs.load = GetOptionChoice(nonl_load_item); if (nonl_prefs.load == LOAD_FUNCTION) { if (xv_evalexpr(nonl_start_item, &nonl_prefs.start) != RETURN_SUCCESS) { errmsg("Invalid input in start field"); return RETURN_FAILURE; } if (xv_evalexpr(nonl_stop_item, &nonl_prefs.stop) != RETURN_SUCCESS) { errmsg("Invalid input in start field"); return RETURN_FAILURE; } if (xv_evalexpri(nonl_npts_item, &nonl_prefs.npoints) != RETURN_SUCCESS) { errmsg("Invalid input in start field"); return RETURN_FAILURE; } if (nonl_prefs.npoints <= 1) { errmsg("Number of points must be > 1"); return RETURN_FAILURE; } } if (force || nonl_prefs.autoload) { switch (nonl_prefs.load) { case LOAD_VALUES: case LOAD_RESIDUALS: npts = getsetlength(src_gno, src_setno); setlength(dest_gno, dest_setno, npts); copycol2(src_gno, src_setno, dest_gno, dest_setno, DATA_X); break; case LOAD_FUNCTION: npts = nonl_prefs.npoints; setlength(dest_gno, dest_setno, npts); delx = (nonl_prefs.stop - nonl_prefs.start)/(npts - 1); xfit = getx(dest_gno, dest_setno); for (i = 0; i < npts; i++) { xfit[i] = nonl_prefs.start + i * delx; } break; } setcomment(dest_gno, dest_setno, nonl_opts.formula); do_compute(dest_gno, dest_setno, dest_gno, dest_setno, NULL, nonl_opts.formula); if (nonl_prefs.load == LOAD_RESIDUALS) { /* load residuals */ y = gety(src_gno, src_setno); yfit = gety(dest_gno, dest_setno); for (i = 0; i < npts; i++) { yfit[i] -= y[i]; } } update_set_lists(dest_gno); SelectListChoice(nonl_set_item->dest->set_sel, dest_setno); xdrawgraph(); } return RETURN_SUCCESS; } static void create_openfit_popup(void *data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Open fit parameter file"); AddFileSelectionBoxCB(fsb, do_openfit_proc, NULL); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } static int do_openfit_proc(char *filename, void *data) { int res; reset_nonl(); res = getparms(filename); update_nonl_frame(); if (res) { return TRUE; } else { return FALSE; } } static void create_savefit_popup(void *data) { static FSBStructure *fsb = NULL; static Widget title_item = NULL; set_wait_cursor(); if (fsb == NULL) { Widget fr; fsb = CreateFileSelectionBox(app_shell, "Save fit parameter file"); fr = CreateFrame(fsb->rc, NULL); title_item = CreateTextItem2(fr, 25, "Title: "); AddFileSelectionBoxCB(fsb, do_savefit_proc, (void *) title_item); ManageChild(fsb->FSB); } xv_setstr(title_item, nonl_opts.title); RaiseWindow(fsb->dialog); unset_wait_cursor(); } static int do_savefit_proc(char *filename, void *data) { FILE *pp; Widget title_item = (Widget) data; pp = grace_openw(filename); if (pp != NULL) { nonl_opts.title = copy_string(nonl_opts.title, xv_getstr(title_item)); put_fitparms(pp, 0); grace_close(pp); } return TRUE; } grace-5.1.23/src/pdfdrv.c0000644000076500001440000004527310104235413014654 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-2004 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Grace PDF driver */ #include #ifdef HAVE_LIBPDF #include #include #include #include #include #include #include #include "defines.h" #include "utils.h" #include "draw.h" #include "device.h" #include "devlist.h" #include "patterns.h" #include "pdfdrv.h" #include "protos.h" #ifndef NONE_GUI # include "motifinc.h" #endif static void pdf_error_handler(PDF *p, int type, const char* msg); static unsigned long page_scale; static float pixel_size; static float page_scalef; static int *pdf_font_ids; static int *pdf_pattern_ids; static int pdf_color; static int pdf_pattern; static double pdf_linew; static int pdf_lines; static int pdf_linecap; static int pdf_linejoin; static int pdf_setup_pdf1_3 = TRUE; static int pdf_setup_pdfpattern = FALSE; static int pdf_setup_compression = 4; extern FILE *prstream; static PDF *phandle; static Device_entry dev_pdf = {DEVICE_FILE, "PDF", pdfinitgraphics, pdf_op_parser, pdf_gui_setup, "pdf", TRUE, FALSE, {3300, 2550, 300.0}, NULL }; int register_pdf_drv(void) { PDF_boot(); return register_device(dev_pdf); } /* Define Patterns for subsequent calls to PDF_setcolor(). */ void pdfinitpatterns(void) { int i; if (pdf_setup_pdfpattern) { pdf_pattern_ids = xmalloc(number_of_patterns()*SIZEOF_INT); for (i = 1; i < number_of_patterns(); i++) { int j, k, l; pdf_pattern_ids[i] = PDF_begin_pattern(phandle, 16, 16, 16, 16, 2); for (j = 0; j < 256; j++) { k = j%16; l = 15 - j/16; if ((pat_bits[i][j/8] >> (j%8)) & 0x01) { /* the bit is set */ PDF_rect(phandle, (float) k, (float) l, 1.0, 1.0); PDF_fill(phandle); } } PDF_end_pattern(phandle); } } } static size_t pdf_writeproc(PDF *p, void *data, size_t size) { FILE *fp = PDF_get_opaque(p); return fwrite(data, 1, size, fp); } int pdfinitgraphics(void) { int i; Page_geometry pg; char *s; /* device-dependent routines */ devupdatecmap = NULL; devdrawpixel = pdf_drawpixel; devdrawpolyline = pdf_drawpolyline; devfillpolygon = pdf_fillpolygon; devdrawarc = pdf_drawarc; devfillarc = pdf_fillarc; devputpixmap = pdf_putpixmap; devputtext = pdf_puttext; devleavegraphics = pdf_leavegraphics; pg = get_page_geometry(); page_scale = MIN2(pg.height, pg.width); pixel_size = 1.0/page_scale; page_scalef = (float) page_scale*72.0/pg.dpi; /* undefine all graphics state parameters */ pdf_color = -1; pdf_pattern = -1; pdf_linew = -1.0; pdf_lines = -1; pdf_linecap = -1; pdf_linejoin = -1; phandle = PDF_new2(pdf_error_handler, NULL, NULL, NULL, (void *) prstream); if (phandle == NULL) { return RETURN_FAILURE; } if (pdf_setup_pdf1_3 == TRUE) { s = "1.3"; } else { s = "1.4"; } PDF_set_parameter(phandle, "compatibility", s); PDF_open_mem(phandle, pdf_writeproc); PDF_set_value(phandle, "compress", (float) pdf_setup_compression); PDF_set_info(phandle, "Creator", bi_version_string()); PDF_set_info(phandle, "Author", get_username()); PDF_set_info(phandle, "Title", get_docname()); pdf_font_ids = xmalloc(number_of_fonts()*SIZEOF_INT); for (i = 0; i < number_of_fonts(); i++) { pdf_font_ids[i] = -1; } pdfinitpatterns(); PDF_begin_page(phandle, pg.width*72.0/pg.dpi, pg.height*72.0/pg.dpi); if ((s = get_project_description())) { PDF_set_border_style(phandle, "dashed", 3.0); PDF_set_border_dash(phandle, 5.0, 1.0); PDF_set_border_color(phandle, 1.0, 0.0, 0.0); PDF_add_note(phandle, 20.0, 50.0, 320.0, 100.0, s, "Project description", "note", 0); } PDF_scale(phandle, page_scalef, page_scalef); return RETURN_SUCCESS; } void pdf_setpen(const Pen *pen) { fRGB *frgb; if (pen->color != pdf_color || pen->pattern != pdf_pattern) { frgb = get_frgb(pen->color); PDF_setcolor(phandle, "both", "rgb", (float) frgb->red, (float) frgb->green,(float) frgb->blue, 0.0); if (pdf_setup_pdfpattern && pen->pattern > 1 && pen->pattern < number_of_patterns()) { PDF_setcolor(phandle, "both", "pattern", (float) pdf_pattern_ids[pen->pattern], 0.0, 0.0, 0.0); } pdf_color = pen->color; pdf_pattern = pen->pattern; } } void pdf_setdrawbrush(void) { int i; float lw; int ls; float *darray; Pen pen; pen=getpen(); pdf_setpen(&pen); ls = getlinestyle(); lw = MAX2(getlinewidth(), pixel_size); if (ls != pdf_lines || lw != pdf_linew) { PDF_setlinewidth(phandle, lw); if (ls == 0 || ls == 1) { PDF_setdash(phandle, 0, 0); } else { darray = xmalloc(dash_array_length[ls]*SIZEOF_FLOAT); for (i = 0; i < dash_array_length[ls]; i++) { darray[i] = lw*dash_array[ls][i]; } PDF_setpolydash(phandle, darray, dash_array_length[ls]); xfree(darray); } pdf_linew = lw; pdf_lines = ls; } } void pdf_setlineprops(void) { int lc, lj; lc = getlinecap(); lj = getlinejoin(); if (lc != pdf_linecap) { switch (lc) { case LINECAP_BUTT: PDF_setlinecap(phandle, 0); break; case LINECAP_ROUND: PDF_setlinecap(phandle, 1); break; case LINECAP_PROJ: PDF_setlinecap(phandle, 2); break; } pdf_linecap = lc; } if (lj != pdf_linejoin) { switch (lj) { case LINEJOIN_MITER: PDF_setlinejoin(phandle, 0); break; case LINEJOIN_ROUND: PDF_setlinejoin(phandle, 1); break; case LINEJOIN_BEVEL: PDF_setlinejoin(phandle, 2); break; } pdf_linejoin = lj; } } void pdf_drawpixel(VPoint vp) { Pen pen; pen=getpen(); pdf_setpen(&pen); if (pdf_linew != pixel_size) { PDF_setlinewidth(phandle, pixel_size); pdf_linew = pixel_size; } if (pdf_linecap != LINECAP_ROUND) { PDF_setlinecap(phandle, 1); pdf_linecap = LINECAP_ROUND; } if (pdf_lines != 1) { PDF_setpolydash(phandle, NULL, 0); pdf_lines = 1; } PDF_moveto(phandle, (float) vp.x, (float) vp.y); PDF_lineto(phandle, (float) vp.x, (float) vp.y); PDF_stroke(phandle); } void pdf_drawpolyline(VPoint *vps, int n, int mode) { int i; if (getlinestyle() == 0) { return; } pdf_setdrawbrush(); pdf_setlineprops(); PDF_moveto(phandle, (float) vps[0].x, (float) vps[0].y); for (i = 1; i < n; i++) { PDF_lineto(phandle, (float) vps[i].x, (float) vps[i].y); } if (mode == POLYLINE_CLOSED) { PDF_closepath_stroke(phandle); } else { PDF_stroke(phandle); } } void pdf_fillpolygon(VPoint *vps, int nc) { int i; Pen pen; pen=getpen(); pdf_setpen(&pen); if (pen.pattern == 0) { return; } if (getfillrule() == FILLRULE_WINDING) { PDF_set_parameter(phandle, "fillrule", "winding"); } else { PDF_set_parameter(phandle, "fillrule", "evenodd"); } /* fill bg first if the pattern != solid */ if (pdf_setup_pdfpattern && pen.pattern != 1) { Pen solid_pen; solid_pen.color = getbgcolor(); solid_pen.pattern = 1; pdf_setpen(&solid_pen); PDF_moveto(phandle, (float) vps[0].x, (float) vps[0].y); for (i = 1; i < nc; i++) { PDF_lineto(phandle, (float) vps[i].x, (float) vps[i].y); } PDF_fill(phandle); } pen=getpen(); pdf_setpen(&pen); PDF_moveto(phandle, (float) vps[0].x, (float) vps[0].y); for (i = 1; i < nc; i++) { PDF_lineto(phandle, (float) vps[i].x, (float) vps[i].y); } PDF_fill(phandle); } void pdf_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { VPoint vpc; double rx, ry; if (getlinestyle() == 0) { return; } pdf_setdrawbrush(); vpc.x = (vp1.x + vp2.x)/2; vpc.y = (vp1.y + vp2.y)/2; rx = fabs(vp2.x - vp1.x)/2; ry = fabs(vp2.y - vp1.y)/2; if (rx == 0.0 || ry == 0.0) { return; } PDF_save(phandle); PDF_scale(phandle, 1.0, ry/rx); PDF_moveto(phandle, (float) vpc.x + rx*cos(a1*M_PI/180.0), (float) rx/ry*vpc.y + rx*sin(a1*M_PI/180.0)); PDF_arc(phandle, (float) vpc.x, (float) rx/ry*vpc.y, rx, (float) a1, (float) a2); PDF_stroke(phandle); PDF_restore(phandle); } void pdf_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { VPoint vpc; double rx, ry; Pen pen; if (getpattern() == 0) { return; } pen=getpen(); pdf_setpen(&pen); vpc.x = (vp1.x + vp2.x)/2; vpc.y = (vp1.y + vp2.y)/2; rx = fabs(vp2.x - vp1.x)/2; ry = fabs(vp2.y - vp1.y)/2; if (rx == 0.0 || ry == 0.0) { return; } /* fill bg first if the pattern != solid */ if (pdf_setup_pdfpattern && pen.pattern != 1) { Pen solid_pen; solid_pen.color = getbgcolor(); solid_pen.pattern = 1; PDF_save(phandle); pdf_setpen(&solid_pen); PDF_scale(phandle, 1.0, ry/rx); PDF_moveto(phandle, (float) vpc.x + rx*cos(a1*M_PI/180.0), (float) rx/ry*vpc.y + rx*sin(a1*M_PI/180.0)); PDF_arc(phandle, (float) vpc.x, (float) rx/ry*vpc.y, rx, (float) a1, (float) a2); if (mode == ARCFILL_PIESLICE) { PDF_lineto(phandle, (float) vpc.x, (float) rx/ry*vpc.y); } PDF_fill(phandle); PDF_restore(phandle); } PDF_save(phandle); PDF_scale(phandle, 1.0, ry/rx); PDF_moveto(phandle, (float) vpc.x + rx*cos(a1*M_PI/180.0), (float) rx/ry*vpc.y + rx*sin(a1*M_PI/180.0)); PDF_arc(phandle, (float) vpc.x, (float) rx/ry*vpc.y, rx, (float) a1, (float) a2); if (mode == ARCFILL_PIESLICE) { PDF_lineto(phandle, (float) vpc.x, (float) rx/ry*vpc.y); } PDF_fill(phandle); PDF_restore(phandle); } /* TODO: transparent pixmaps */ void pdf_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { char *buf, *bp; int image; int cindex; RGB *fg, *bg; int i, k, j; long paddedW; int components = 3; buf = xmalloc(width*height*components); if (buf == NULL) { errmsg("xmalloc failed in pdf_putpixmap()"); return; } bp = buf; if (pixmap_bpp == 1) { paddedW = PAD(width, bitmap_pad); fg = get_rgb(getcolor()); bg = get_rgb(getbgcolor()); for (k = 0; k < height; k++) { for (j = 0; j < paddedW/bitmap_pad; j++) { for (i = 0; i < bitmap_pad && j*bitmap_pad + i < width; i++) { if (bin_dump(&(databits)[k*paddedW/bitmap_pad + j], i, bitmap_pad)) { *bp++ = (char) fg->red; *bp++ = (char) fg->green; *bp++ = (char) fg->blue; } else { *bp++ = (char) bg->red; *bp++ = (char) bg->green; *bp++ = (char) bg->blue; } } } } } else { for (k = 0; k < height; k++) { for (j = 0; j < width; j++) { cindex = (databits)[k*width + j]; fg = get_rgb(cindex); *bp++ = (char) fg->red; *bp++ = (char) fg->green; *bp++ = (char) fg->blue; } } } image = PDF_open_image(phandle, "raw", "memory", buf, width*height*components, width, height, components, GRACE_BPP, ""); if (image == -1) { errmsg("Not enough memory for image!"); xfree(buf); return; } PDF_place_image(phandle, image, vp.x, vp.y - height*pixel_size, pixel_size); PDF_close_image(phandle, image); xfree(buf); } static char *pdf_builtin_fonts[] = { "Times-Roman", "Times-Italic", "Times-Bold", "Times-BoldItalic", "Helvetica", "Helvetica-Oblique", "Helvetica-Bold", "Helvetica-BoldOblique", "Courier", "Courier-Oblique", "Courier-Bold", "Courier-BoldOblique", "Symbol", "ZapfDingbats" }; static int number_of_pdf_builtin_fonts = sizeof(pdf_builtin_fonts)/sizeof(char *); static int pdf_builtin_font(const char *fname) { int i; for (i = 0; i < number_of_pdf_builtin_fonts; i++) { if (strcmp(pdf_builtin_fonts[i], fname) == 0) { return TRUE; } } return FALSE; } void pdf_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning) { Pen pen; pen=getpen(); pdf_setpen(&pen); if (pdf_font_ids[font] < 0) { char buf[GR_MAXPATHLEN]; char *fontname, *encscheme; char *pdflibenc; int embed; fontname = get_fontalias(font); if (pdf_builtin_font(fontname)) { embed = 0; } else { sprintf(buf, "%s==%s", fontname, get_afmfilename(font, TRUE)); PDF_set_parameter(phandle, "FontAFM", buf); sprintf(buf, "%s==%s", fontname, get_fontfilename(font, TRUE)); PDF_set_parameter(phandle, "FontOutline", buf); embed = 1; } encscheme = get_encodingscheme(font); if (strcmp(encscheme, "FontSpecific") == 0) { pdflibenc = "builtin"; } else { pdflibenc = "winansi"; } pdf_font_ids[font] = PDF_findfont(phandle, fontname, pdflibenc, embed); } PDF_save(phandle); PDF_setfont(phandle, pdf_font_ids[font], 1.0); PDF_set_parameter(phandle, "underline", true_or_false(underline)); PDF_set_parameter(phandle, "overline", true_or_false(overline)); PDF_concat(phandle, (float) tm->cxx, (float) tm->cyx, (float) tm->cxy, (float) tm->cyy, vp.x, vp.y); PDF_show2(phandle, s, len); PDF_restore(phandle); } void pdf_leavegraphics(void) { PDF_end_page(phandle); PDF_close(phandle); PDF_delete(phandle); xfree(pdf_font_ids); XCFREE(pdf_pattern_ids); } static void pdf_error_handler(PDF *p, int type, const char *msg) { char buf[MAX_STRING_LENGTH]; switch (type) { case PDF_NonfatalError: /* continue on a non-fatal error */ sprintf(buf, "PDFlib: %s", msg); errmsg(buf); break; default: /* give up in all other cases */ sprintf(buf, "PDFlib: %s", msg); errmsg(buf); return; } } int pdf_op_parser(char *opstring) { if (!strcmp(opstring, "PDF1.3")) { pdf_setup_pdf1_3 = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "PDF1.4")) { pdf_setup_pdf1_3 = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "patterns:on")) { pdf_setup_pdfpattern = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "patterns:off")) { pdf_setup_pdfpattern = FALSE; return RETURN_SUCCESS; } else if (!strncmp(opstring, "compression:", 12)) { char *bufp; bufp = strchr(opstring, ':'); bufp++; if (bufp != NULL && *bufp != '\0') { pdf_setup_compression = atoi(bufp); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } else { return RETURN_FAILURE; } } #ifndef NONE_GUI static void update_pdf_setup_frame(void); static int set_pdf_setup_proc(void *data); static Widget pdf_setup_frame; static Widget pdf_setup_pdf1_3_item; static Widget pdf_setup_pdfpattern_item; static SpinStructure *pdf_setup_compression_item; void pdf_gui_setup(void) { set_wait_cursor(); if (pdf_setup_frame == NULL) { Widget fr, rc; pdf_setup_frame = CreateDialogForm(app_shell, "PDF options"); fr = CreateFrame(pdf_setup_frame, "PDF options"); rc = CreateVContainer(fr); pdf_setup_pdf1_3_item = CreateToggleButton(rc, "PDF-1.3"); pdf_setup_pdfpattern_item = CreateToggleButton(rc, "Use patterns"); pdf_setup_compression_item = CreateSpinChoice(rc, "Compression:", 1, SPIN_TYPE_INT, 0.0, 9.0, 1.0); CreateAACDialog(pdf_setup_frame, fr, set_pdf_setup_proc, NULL); } update_pdf_setup_frame(); RaiseWindow(GetParent(pdf_setup_frame)); unset_wait_cursor(); } static void update_pdf_setup_frame(void) { if (pdf_setup_frame) { SetToggleButtonState(pdf_setup_pdf1_3_item, pdf_setup_pdf1_3); SetToggleButtonState(pdf_setup_pdfpattern_item, pdf_setup_pdfpattern); SetSpinChoice(pdf_setup_compression_item, (double) pdf_setup_compression); } } static int set_pdf_setup_proc(void *data) { pdf_setup_pdf1_3 = GetToggleButtonState(pdf_setup_pdf1_3_item); pdf_setup_pdfpattern = GetToggleButtonState(pdf_setup_pdfpattern_item); pdf_setup_compression = (int) GetSpinChoice(pdf_setup_compression_item); return RETURN_SUCCESS; } #endif #else /* No PDFlib */ void _pdfdrv_c_dummy_func(void) {} #endif grace-5.1.23/src/eblockwin.c0000644000076500001440000001533410071615561015350 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Edit block data Panel * * */ #include #include #include #include "graphs.h" #include "utils.h" #include "ssdata.h" #include "protos.h" #include "motifinc.h" static int block_curtype = SET_XY; static Widget eblock_frame; static Widget eblock_panel; /* * Panel item declarations */ static OptionStructure *eblock_nchoice_items[MAX_SET_COLS]; static OptionStructure *eblock_schoice_item; static Widget eblock_ncols_item; static OptionStructure *eblock_type_choice_item; static GraphSetStructure *eblock_graphset_item; static OptionStructure *auto_item; /* * Event and Notify proc declarations */ static void eblock_type_notify_proc(int value, void *data); static int eblock_accept_notify_proc(void *data); static void update_eblock(int gno); /* * Create the block data panel */ void create_eblock_frame(int gno) { if (get_blockncols() == 0) { errmsg("Need to read block data first"); return; } set_wait_cursor(); if (eblock_frame == NULL) { int i; char buf[32]; Widget rc, fr; OptionItem blockitem; blockitem.value = 0; blockitem.label = "Index"; eblock_frame = CreateDialogForm(app_shell, "Edit block data"); eblock_panel = CreateVContainer(eblock_frame); fr = CreateFrame(eblock_panel, NULL); eblock_ncols_item = CreateLabel(fr, "tmp"); eblock_graphset_item = CreateGraphSetSelector(eblock_panel, "Load to:", LIST_TYPE_SINGLE); fr = CreateFrame(eblock_panel, NULL); rc = CreateVContainer(fr); eblock_type_choice_item = CreateSetTypeChoice(rc, "Set type:"); AddOptionChoiceCB(eblock_type_choice_item, eblock_type_notify_proc, NULL); for (i = 0; i < MAX_SET_COLS; i++) { sprintf(buf, "%s from column:", dataset_colname(i)); eblock_nchoice_items[i] = CreateOptionChoice(rc, buf, 3, 1, &blockitem); } eblock_schoice_item = CreateOptionChoice(rc, "Strings from column:", 1, 1, &blockitem); auto_item = CreateASChoice(eblock_panel, "Autoscale graph on load:"); CreateAACDialog(eblock_frame, eblock_panel, eblock_accept_notify_proc, NULL); } update_eblock(gno); RaiseWindow(GetParent(eblock_frame)); unset_wait_cursor(); } /* * Notify and event procs */ static void update_eblock(int gno) { int blocklen, blockncols; int *blockformats; int i, ncols, nncols, nscols; char buf[128]; OptionItem *blockitems, *sblockitems; if (eblock_frame == NULL) { return; } blockncols = get_blockncols(); if (blockncols == 0) { errmsg("Need to read block data first"); return; } blocklen = get_blocknrows(); blockformats = get_blockformats(); if (is_valid_gno(gno)) { SelectListChoice(eblock_graphset_item->graph_sel, gno); } sprintf(buf, "Block data: %d column(s) of length %d", blockncols, blocklen); SetLabel(eblock_ncols_item, buf); /* TODO: check if new data arrived */ if (1) { blockitems = xmalloc((blockncols + 1)*sizeof(OptionItem)); sblockitems = xmalloc((blockncols + 1)*sizeof(OptionItem)); blockitems[0].value = -1; blockitems[0].label = copy_string(NULL, "Index"); sblockitems[0].value = -1; sblockitems[0].label = copy_string(NULL, "None"); nncols = 0; nscols = 0; for (i = 0; i < blockncols; i++) { sprintf(buf, "%d", i + 1); if (blockformats[i] != FFORMAT_STRING) { nncols++; blockitems[nncols].value = i; blockitems[nncols].label = copy_string(NULL, buf); } else { nscols++; sblockitems[nscols].value = i; sblockitems[nscols].label = copy_string(NULL, buf); } } for (i = 0; i < MAX_SET_COLS; i++) { int oldchoice = GetOptionChoice(eblock_nchoice_items[i]); UpdateOptionChoice(eblock_nchoice_items[i], nncols + 1, blockitems); if (oldchoice < blockncols) { SetOptionChoice(eblock_nchoice_items[i], oldchoice); } else if (i < blockncols) { SetOptionChoice(eblock_nchoice_items[i], i); } } UpdateOptionChoice(eblock_schoice_item, nscols + 1, sblockitems); for (i = 0; i < nncols + 1; i++) { xfree(blockitems[i].label); } xfree(blockitems); for (i = 0; i < nscols + 1; i++) { xfree(sblockitems[i].label); } xfree(sblockitems); } ncols = settype_cols(block_curtype); for (i = 0; i < MAX_SET_COLS; i++) { SetSensitive(eblock_nchoice_items[i]->menu, (i < ncols)); } } static void eblock_type_notify_proc(int value, void *data) { block_curtype = value; update_eblock(-1); } static int eblock_accept_notify_proc(void *data) { int i, gno, setno; int cs[MAX_SET_COLS], nncols, scol, autoscale; if (GetSingleListChoice(eblock_graphset_item->graph_sel, &gno) != RETURN_SUCCESS) { errmsg("Please select a single graph"); return RETURN_FAILURE; } if (GetSingleListChoice(eblock_graphset_item->set_sel, &setno) != RETURN_SUCCESS) { /* no set selected; allocate new one */ setno = NEW_SET; } nncols = settype_cols(block_curtype); for (i = 0; i < nncols; i++) { cs[i] = GetOptionChoice(eblock_nchoice_items[i]); } scol = GetOptionChoice(eblock_schoice_item); autoscale = GetOptionChoice(auto_item); create_set_fromblock(gno, setno, block_curtype, nncols, cs, scol, autoscale); update_all(); xdrawgraph(); return RETURN_SUCCESS; } grace-5.1.23/src/xmgrace.c0000644000076500001440000011577010565430270015026 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Main Motif interface * */ #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_XPM_H) # include #else # if defined (HAVE_X11_XPM_H) # include # endif #endif #include "globals.h" #include "bitmaps.h" #include "utils.h" #include "files.h" #include "device.h" #include "x11drv.h" #include "graphs.h" #include "graphutils.h" #include "plotone.h" #include "events.h" #include "protos.h" #include "motifinc.h" /* used globally */ XtAppContext app_con; Widget app_shell; static Widget canvas; static Widget drawing_window; /* container for drawing area */ Widget loclab; /* locator label */ Widget statlab; /* status line at the bottom */ Widget stack_depth_item; /* stack depth item on the main panel */ Widget curw_item; /* current world stack item on the main panel */ Display *disp = NULL; Window xwin; extern Window root; extern GC gc; extern int screennumber; extern int depth; extern Colormap cmap; extern unsigned long xvlibcolors[]; /* used locally */ static Widget main_frame; static Widget menu_bar; static Widget frleft, frtop, frbot; /* dialogs along canvas edge */ static Widget form; /* form for mainwindow */ static void MenuCB(void *data); static Widget CreateMainMenuBar(Widget parent); static int toolbar_visible = 1; static int statusbar_visible = 1; static int locbar_visible = 1; static Widget windowbarw[3]; static void graph_scroll_proc(void *data); static void graph_zoom_proc(void *data); static void world_stack_proc(void *data); static void load_example(void *data); #define WSTACK_PUSH 0 #define WSTACK_POP 1 #define WSTACK_CYCLE 2 #define WSTACK_PUSH_ZOOM 3 /* * action routines, to be used with translations */ /* This is for buggy Motif-2.1 that crashes with Ctrl+ */ static void do_nothing_action(Widget w, XEvent *e, String *par, Cardinal *npar) { } static XtActionsRec dummy_actions[] = { {"do_nothing", do_nothing_action} }; static XtActionsRec canvas_actions[] = { { "autoscale", (XtActionProc) autoscale_action }, { "autoscale_on_near", (XtActionProc) autoscale_on_near_action }, { "draw_line", (XtActionProc) draw_line_action }, { "draw_box", (XtActionProc) draw_box_action }, { "draw_ellipse", (XtActionProc) draw_ellipse_action }, { "write_string", (XtActionProc) write_string_action }, { "delete_object", (XtActionProc) delete_object_action }, { "place_legend", (XtActionProc) place_legend_action }, { "place_timestamp", (XtActionProc) place_timestamp_action }, { "move_object", (XtActionProc) move_object_action }, { "refresh_hotlink", (XtActionProc) refresh_hotlink_action }, { "set_viewport", (XtActionProc) set_viewport_action }, { "enable_zoom", (XtActionProc) enable_zoom_action } }; static XtActionsRec list_select_actions[] = { {"list_selectall_action", list_selectall_action}, {"list_unselectall_action", list_unselectall_action}, {"list_invertselection_action", list_invertselection_action} }; static XtActionsRec cstext_actions[] = { {"cstext_edit_action", cstext_edit_action} }; static char canvas_table[] = "#override\n\ Ctrl Alt l: draw_line()\n\ Ctrl Alt b: draw_box()\n\ Ctrl Alt e: draw_ellipse()\n\ Ctrl Alt t: write_string()\n\ Ctrl a: autoscale()\n\ Ctrl d: delete_object()\n\ Ctrl l: place_legend()\n\ Ctrl m: move_object()\n\ Ctrl t: place_timestamp()\n\ Ctrl u: refresh_hotlink()\n\ Ctrl v: set_viewport()\n\ Ctrl z: enable_zoom()"; /* * establish resource stuff */ typedef struct { Boolean invert; Boolean allow_dc; Boolean auto_redraw; Boolean toolbar; Boolean statusbar; Boolean locatorbar; } ApplicationData, *ApplicationDataPtr; static XtResource resources[] = { {"invertDraw", "InvertDraw", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, invert), XtRImmediate, (XtPointer) TRUE}, {"allowDoubleClick", "AllowDoubleClick", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, allow_dc), XtRImmediate, (XtPointer) TRUE}, {"allowRedraw", "AllowRedraw", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, auto_redraw), XtRImmediate, (XtPointer) TRUE}, {"toolBar", "ToolBar", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, toolbar), XtRImmediate, (XtPointer) TRUE}, {"statusBar", "StatusBar", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, statusbar), XtRImmediate, (XtPointer) TRUE}, {"locatorBar", "LocatorBar", XtRBoolean, sizeof(Boolean), XtOffset(ApplicationDataPtr, locatorbar), XtRImmediate, (XtPointer) TRUE} }; String fallbackResourcesCommon[] = { "XMgrace.consoleDialog*text.columns: 72", "XMgrace.consoleDialog*text.rows: 5", "XMgrace*background: #e5e5e5", "XMgrace*foreground: #000000", "XMgrace*XbaeMatrix.oddRowBackground: #cccccc", "XMgrace*XbaeMatrix.evenRowBackground: #cfe7e7", "XMgrace*XbaeMatrix.textBackground: #cfe7e7", "XMgrace*XbaeMatrix.allowColumnResize: False", "XMgrace*XbaeMatrix.allowRowResize: False", "XMgrace*XbaeMatrix.showArrows: True", "XMgrace*fontTable.evenRowBackground: #e5e5e5", "XMgrace*XmPushButton.background: #b0c4de", "XMgrace*XmMenuShell*XmPushButton.background: #e5e5e5", "XMgrace*XmText*background: #cfe7e7", "XMgrace*XmToggleButton.selectColor: #ff0000", "XMgrace*XmToggleButton.fillOnSelect: true", "XMgrace*XmSeparator.margin: 0", #ifdef WITH_XMHTML "XMgrace*XmHTML.background: #ffffff", "XMgrace*XmHTML.foreground: #000000", "XMgrace*XmHTML.width: 600", "XMgrace*XmHTML.height: 500", #endif "XMgrace*mainWin.shadowThickness: 0", "XMgrace*mainWin.menuBar.shadowThickness: 1", "XMgrace*menuBar*tearOffModel: XmTEAR_OFF_ENABLED", "XMgrace*dragInitiatorProtocolStyle: XmDRAG_NONE", "XMgrace*dragReceiverProtocolStyle: XmDRAG_NONE", "XMgrace*fileMenu.newButton.acceleratorText: Ctrl+N", "XMgrace*fileMenu.newButton.accelerator: Ctrln", "XMgrace*fileMenu.openButton.acceleratorText: Ctrl+O", "XMgrace*fileMenu.openButton.accelerator: Ctrlo", "XMgrace*fileMenu.saveButton.acceleratorText: Ctrl+S", "XMgrace*fileMenu.saveButton.accelerator: Ctrls", "XMgrace*fileMenu.exitButton.acceleratorText: Ctrl+Q", "XMgrace*fileMenu.exitButton.accelerator: Ctrlq", "XMgrace*fileMenu.printButton.acceleratorText: Ctrl+P", "XMgrace*fileMenu.printButton.accelerator: Ctrlp", "XMgrace*helpMenu.onContextButton.acceleratorText: Shift+F1", "XMgrace*helpMenu.onContextButton.accelerator: ShiftF1", "XMgrace*readHistoryFSB*pattern: *.com", "XMgrace*openProjectFSB*pattern: *.agr", "XMgrace*saveProjectFSB*pattern: *.agr", "XMgrace*readSetsFSB*pattern: *.dat", "XMgrace*writeSetsFSB*pattern: *.dat", "XMgrace*readParametersFSB*pattern: *.par", "XMgrace*writeParametersFSB*pattern: *.par", "XMgrace*selectNetcdfFileFSB*pattern: *.nc", "XMgrace*selectHotLinkFileFSB*pattern: *.dat", "XMgrace*openFitParameterFileFSB*pattern: *.fit", "XMgrace*saveFitParameterFileFSB*pattern: *.fit", NULL }; String fallbackResourcesHighRes[] = { "XMgrace*mainWin.width: 680", "XMgrace*mainWin.height: 700", "XMgrace*fontList:-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*", "XMgrace.consoleDialog*text.fontList:-*-courier-medium-r-normal-*-12-*-*-*-*-*-*-*", "XMgrace*HContainer.marginHeight: 3", "XMgrace*VContainer.marginHeight: 3", NULL }; String fallbackResourcesLowRes[] = { "XMgrace*mainWin.width: 530", "XMgrace*mainWin.height: 545", "XMgrace*fontList:-*-helvetica-medium-r-normal-*-8-*-*-*-*-*-*-*", "XMgrace.consoleDialog*text.fontList:-*-courier-medium-r-normal-*-8-*-*-*-*-*-*-*", "XMgrace*HContainer.marginHeight: 1", "XMgrace*VContainer.marginHeight: 1", NULL }; /* * main menubar */ /* #define MENU_HELP 200 */ #define MENU_EXIT 201 #define MENU_NEW 203 #define MENU_OPEN 204 #define MENU_SAVE 205 #define MENU_SAVEAS 206 #define MENU_REVERT 207 #define MENU_PRINT 208 #ifdef HAVE__XMVERSIONSTRING extern const char _XmVersionString[]; #endif static int is_motif_compatible(void) { char buf[128]; int bd_lesstif; #ifdef HAVE__XMVERSIONSTRING char *s; int rt_lesstif; #endif /* First, check for compatible version */ if (xmUseVersion < XmVersion) { sprintf(buf, "Run-time Motif library is older than the build, %d < %d", xmUseVersion, XmVersion); errmsg(buf); return FALSE; } bd_lesstif = (strstr(bi_gui(), "Motif") == NULL); #ifdef HAVE__XMVERSIONSTRING /* Then, check whether we are in the Motif/LessTif binary compatibility mode */ /* strcpy is dangerous since the sizeof(_XmVersionString) may be different at run time! 13 chars should be safe, though, and enough to distinguish between Motif and LessTif :) */ strncpy(buf, _XmVersionString, 13); buf[13] = '\0'; rt_lesstif = (strstr(buf, "Motif") == NULL); if (bd_lesstif != rt_lesstif) { sprintf(buf, "The software was built with %s, but is running with %s!", bd_lesstif ? "LessTif":"Motif", rt_lesstif ? "LessTif":"Motif"); errmsg(buf); errmsg("We don't support binary Motif/LessTif compatibility."); errmsg("Use a semistatic binary or compile Grace yourself!"); return FALSE; } /* Finally, if LessTif is used, check for a reasonably new release */ if (rt_lesstif) { s = strstr(_XmVersionString, "Version"); if (s == NULL || (strcmp(s, "Version 0.92.0") < 0)) { errmsg("An old version of LessTif, please upgrade to 0.92.0 at least"); } } #endif #if XbaeVersion >= 40800 /* Now we should compare whether Xbae was built against the runtime version of M*tif/LessTif. */ strncpy(buf, XbaeGetXmVersionTxt(), 13); buf[13] = '\0'; rt_lesstif = (strstr(buf, "Motif") == NULL); if (bd_lesstif != rt_lesstif) { sprintf(buf, "libXbae was built with %s, but is running with %s!", bd_lesstif ? "LessTif":"Motif", rt_lesstif ? "LessTif":"Motif"); errmsg(buf); errmsg("Use a semistatic binary or compile Grace/libXbae yourself!"); return FALSE; } /* Now we check for consistency of the used M*tif version */ if (XbaeGetXmVersionNum() != XmVersion) { sprintf(buf, "libXbae was built with Motif/LessTif %i, but is running with %i!", XbaeGetXmVersionNum(), XmVersion); errmsg(buf); errmsg("Use a semistatic binary or compile Grace/libXbae yourself!"); return FALSE; } #endif /* XbaeVersion > 40800 */ return TRUE; } int initialize_gui(int *argc, char **argv) { Screen *screen; ApplicationData rd; String *allResources, *resolResources; int lowres = FALSE; unsigned int i, n_common, n_resol; char *display_name = NULL; /* Locale settings for GUI */ XtSetLanguageProc(NULL, NULL, NULL); XtToolkitInitialize(); app_con = XtCreateApplicationContext(); /* Check if we're running in the low-resolution X */ for (i = 1; i < *argc - 1; i++) { /* See if display name was specified in the args */ char *pattern = "-display"; if (strlen(argv[i]) > 1 && strstr(pattern, argv[i]) == pattern) { display_name = argv[i + 1]; } } disp = XOpenDisplay(display_name); if (disp == NULL) { errmsg("Can't open display"); return RETURN_FAILURE; } screen = DefaultScreenOfDisplay(disp); if (HeightOfScreen(screen) < 740) { lowres = TRUE; } n_common = sizeof(fallbackResourcesCommon)/sizeof(String) - 1; if (lowres) { n_resol = sizeof(fallbackResourcesLowRes)/sizeof(String) - 1; resolResources = fallbackResourcesLowRes; } else { n_resol = sizeof(fallbackResourcesHighRes)/sizeof(String) - 1; resolResources = fallbackResourcesHighRes; } allResources = xmalloc((n_common + n_resol + 1)*sizeof(String)); for (i = 0; i < n_common; i++) { allResources[i] = fallbackResourcesCommon[i]; } for (i = 0; i < n_resol; i++) { allResources[n_common + i] = resolResources[i]; } allResources[n_common + n_resol] = NULL; XtAppSetFallbackResources(app_con, allResources); XtDisplayInitialize(app_con, disp, "xmgrace", "XMgrace", NULL, 0, argc, argv); XtAppAddActions(app_con, dummy_actions, XtNumber(dummy_actions)); XtAppAddActions(app_con, canvas_actions, XtNumber(canvas_actions)); XtAppAddActions(app_con, list_select_actions, XtNumber(list_select_actions)); XtAppAddActions(app_con, cstext_actions, XtNumber(cstext_actions)); app_shell = XtAppCreateShell(NULL, "XMgrace", applicationShellWidgetClass, disp, NULL, 0); if (is_motif_compatible() != TRUE) { return RETURN_FAILURE; } XtGetApplicationResources(app_shell, &rd, resources, XtNumber(resources), NULL, 0); invert = rd.invert; allow_dc = rd.allow_dc; auto_redraw = rd.auto_redraw; toolbar_visible = rd.toolbar; statusbar_visible = rd.statusbar; locbar_visible = rd.locatorbar; return RETURN_SUCCESS; } static void do_drawgraph(void *data) { drawgraph(); } static void MenuCB(void *data) { char *s; switch ((int) data) { case MENU_EXIT: bailout(); break; case MENU_NEW: new_project(NULL); xdrawgraph(); break; case MENU_OPEN: create_openproject_popup(); break; case MENU_SAVE: if (strcmp (get_docname(), NONAME) != 0) { set_wait_cursor(); save_project(get_docname()); unset_wait_cursor(); } else { create_saveproject_popup(); } break; case MENU_SAVEAS: create_saveproject_popup(); break; case MENU_REVERT: set_wait_cursor(); s = copy_string(NULL, get_docname()); if (strcmp (s, NONAME) != 0) { load_project(s); } else { new_project(NULL); } xfree(s); xdrawgraph(); unset_wait_cursor(); break; case MENU_PRINT: set_wait_cursor(); do_hardcopy(); unset_wait_cursor(); break; default: break; } } /* * service the autoscale buttons on the main panel */ static void autoscale_proc(void *data) { int cg = get_cg(); if (autoscale_graph(cg, (int) data) == RETURN_SUCCESS) { update_ticks(cg); xdrawgraph(); } else { errmsg("Can't autoscale (no active sets?)"); } } void autoon_proc(void *data) { set_action(0); set_action(AUTO_NEAREST); } /* * service the autoticks button on the main panel */ void autoticks_proc(void *data) { autotick_axis(get_cg(), ALL_AXES); update_ticks(get_cg()); xdrawgraph(); } /* * set the message in the left footer */ void set_left_footer(char *s) { if (s == NULL) { char hbuf[64]; char buf[GR_MAXPATHLEN + 100]; gethostname(hbuf, 63); sprintf(buf, "%s, %s, %s", hbuf, display_name(), get_docname()); SetLabel(statlab, buf); } else { SetLabel(statlab, s); } XmUpdateDisplay(statlab); } /* * for world stack */ void set_stack_message(void) { char buf[16]; if (stack_depth_item) { sprintf(buf, " SD:%1d ", graph_world_stack_size(get_cg())); SetLabel(stack_depth_item, buf); sprintf(buf, " CW:%1d ", get_world_stack_current(get_cg())); SetLabel(curw_item, buf); } } /* * clear the locator reference point */ void do_clear_point(void *data) { GLocator locator; get_graph_locator(get_cg(), &locator); locator.pointset = FALSE; set_graph_locator(get_cg(), &locator); xdrawgraph(); } /* * set visibility of the toolbars */ static void set_view_items(void) { if (statusbar_visible) { SetToggleButtonState(windowbarw[1], TRUE); ManageChild(frbot); XtVaSetValues(drawing_window, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, frbot, NULL); if (toolbar_visible) { XtVaSetValues(frleft, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, frbot, NULL); } } else { SetToggleButtonState(windowbarw[1], FALSE); XtVaSetValues(drawing_window, XmNbottomAttachment, XmATTACH_FORM, NULL); UnmanageChild(frbot); if (toolbar_visible) { XtVaSetValues(frleft, XmNbottomAttachment, XmATTACH_FORM, NULL); } } if (toolbar_visible) { SetToggleButtonState(windowbarw[2], TRUE); ManageChild(frleft); if (statusbar_visible) { XtVaSetValues(frleft, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, frbot, NULL); } if (locbar_visible) { XtVaSetValues(frleft, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frtop, NULL); } XtVaSetValues(drawing_window, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, frleft, NULL); } else { SetToggleButtonState(windowbarw[2], FALSE); UnmanageChild(frleft); XtVaSetValues(drawing_window, XmNleftAttachment, XmATTACH_FORM, NULL); } if (locbar_visible) { SetToggleButtonState(windowbarw[0], TRUE); ManageChild(frtop); XtVaSetValues(drawing_window, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frtop, NULL); if (toolbar_visible) { XtVaSetValues(frleft, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frtop, NULL); } } else { SetToggleButtonState(windowbarw[0], FALSE); UnmanageChild(frtop); XtVaSetValues(drawing_window, XmNtopAttachment, XmATTACH_FORM, NULL); if (toolbar_visible) { XtVaSetValues(frleft, XmNtopAttachment, XmATTACH_FORM, NULL); } } } /* * service routines for the View pulldown */ void set_statusbar(int onoff, void *data) { if (onoff) { statusbar_visible = 1; } else { statusbar_visible = 0; } set_view_items(); } void set_toolbar(int onoff, void *data) { if (onoff) { toolbar_visible = 1; } else { toolbar_visible = 0; } set_view_items(); } void set_locbar(int onoff, void *data) { if (onoff) { locbar_visible = 1; } else { locbar_visible = 0; } set_view_items(); } void set_barebones(int onoff) { if (onoff){ locbar_visible = 0; toolbar_visible = 0; statusbar_visible = 0; } } /* * create the main menubar */ static Widget CreateMainMenuBar(Widget parent) { Widget menubar; Widget menupane, submenupane, sub2menupane; static char buf[128]; menubar = CreateMenuBar(parent); /* * File menu */ menupane = CreateMenu(menubar, "File", 'F', FALSE); CreateMenuButton(menupane, "New", 'N', MenuCB, (void *) MENU_NEW); CreateMenuButton(menupane, "Open...", 'O', MenuCB, (void *) MENU_OPEN); CreateMenuButton(menupane, "Save", 'S', MenuCB, (void *) MENU_SAVE); CreateMenuButton(menupane, "Save as...", 'a', MenuCB, (void *) MENU_SAVEAS); CreateMenuButton(menupane, "Revert to saved", 'v', MenuCB, (void *) MENU_REVERT); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Print setup...", 't', create_printer_setup, &hdevice); CreateMenuButton(menupane, "Print", 'P', MenuCB, (void *) MENU_PRINT); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Exit", 'x', MenuCB, (void *) MENU_EXIT); /* * Edit menu */ menupane = CreateMenu(menubar, "Edit", 'E', FALSE); CreateMenuButton(menupane, "Data sets...", 'D', create_datasetprop_popup, NULL); CreateMenuButton(menupane, "Set operations...", 'o', create_setop_popup, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Arrange graphs...", 'r', create_arrange_frame, NULL); CreateMenuButton(menupane, "Overlay graphs...", 'O', create_overlay_frame, NULL); CreateMenuButton(menupane, "Autoscale graphs...", 'A', create_autos_frame, NULL); CreateMenuSeparator(menupane); submenupane = CreateMenu(menupane, "Regions", 'i', FALSE); CreateMenuButton(submenupane, "Status...", 'S', define_status_popup, NULL); CreateMenuButton(submenupane, "Define...", 'D', create_define_frame, NULL); CreateMenuButton(submenupane, "Clear...", 'C', create_clear_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Report on...", 'R', create_reporton_frame, NULL); CreateMenuButton(menupane, "Hot links...", 'l', create_hotlinks_popup, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Set locator fixed point", 'f', set_actioncb, (void *) SEL_POINT); CreateMenuButton(menupane, "Clear locator fixed point", 'C', do_clear_point, NULL); CreateMenuButton(menupane, "Locator props...", 'p', create_locator_frame, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Preferences...", 'r', create_props_frame, NULL); /* * Data menu */ menupane = CreateMenu(menubar, "Data", 'D', FALSE); CreateMenuButton(menupane, "Data set operations...", 'o', create_datasetop_popup, NULL); submenupane = CreateMenu(menupane, "Transformations", 'T', FALSE); CreateMenuButton(submenupane, "Evaluate expression...", 'E', create_eval_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Histograms...", 'H', create_histo_frame, NULL); CreateMenuButton(submenupane, "Fourier transforms...", 'u', create_fourier_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Running averages...", 'a', create_run_frame, NULL); CreateMenuButton(submenupane, "Differences...", 'D', create_diff_frame, NULL); CreateMenuButton(submenupane, "Seasonal differences...", 'o', create_seasonal_frame, NULL); CreateMenuButton(submenupane, "Integration...", 'I', create_int_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Interpolation/splines...", 't', create_interp_frame, NULL); CreateMenuButton(submenupane, "Regression...", 'R', create_reg_frame, NULL); CreateMenuButton(submenupane, "Non-linear curve fitting...", 'N', create_nonl_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Correlation/covariance...", 'C', create_xcor_frame, NULL); CreateMenuButton(submenupane, "Digital filter...", 'f', create_digf_frame, NULL); CreateMenuButton(submenupane, "Linear convolution...", 'v', create_lconv_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Geometric transforms...", 'G', create_geom_frame, NULL); CreateMenuSeparator(submenupane); CreateMenuButton(submenupane, "Sample points...", 'm', create_samp_frame, NULL); CreateMenuButton(submenupane, "Prune data...", 'P', create_prune_frame, NULL); CreateMenuButton(menupane, "Feature extraction...", 'x', create_featext_frame, NULL); CreateMenuSeparator(menupane); submenupane = CreateMenu(menupane, "Import", 'I', FALSE); CreateMenuButton(submenupane, "ASCII...", 'A', create_file_popup, NULL); #ifdef HAVE_NETCDF CreateMenuButton(submenupane, "NetCDF...", 'N', create_netcdfs_popup, NULL); #endif submenupane = CreateMenu(menupane, "Export", 'E', FALSE); CreateMenuButton(submenupane, "ASCII...", 'A', create_write_popup, NULL); /* Plot menu */ menupane = CreateMenu(menubar, "Plot", 'P', FALSE); CreateMenuButton(menupane, "Plot appearance...", 'p', create_plot_frame_cb, NULL); CreateMenuButton(menupane, "Graph appearance...", 'G', create_graphapp_frame_cb, (void *) -1); CreateMenuButton(menupane, "Set appearance...", 'S', define_symbols_popup, (void *) -1); CreateMenuButton(menupane, "Axis properties...", 'x', create_axes_dialog_cb, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Load parameters...", 'L', create_rparams_popup, NULL); CreateMenuButton(menupane, "Save parameters...", 'S', create_wparam_frame, NULL); /* View menu */ menupane = CreateMenu(menubar, "View", 'V', FALSE); windowbarw[0] = CreateMenuToggle(menupane, "Show locator bar", 'L', set_locbar, NULL); windowbarw[1] = CreateMenuToggle(menupane, "Show status bar", 'S', set_statusbar, NULL); windowbarw[2] = CreateMenuToggle(menupane, "Show tool bar", 'T', set_toolbar, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Page setup...", 'P', create_printer_setup, &tdevice); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Redraw", 'R', do_drawgraph, NULL); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "Update all", 'U', update_all_cb, NULL); /* Window menu */ menupane = CreateMenu(menubar, "Window", 'W', FALSE); CreateMenuButton(menupane, "Commands", 'C', open_command, NULL); CreateMenuButton(menupane, "Point explorer", 'P', create_points_frame, NULL); CreateMenuButton(menupane, "Drawing objects", 'o', define_objects_popup, NULL); CreateMenuButton(menupane, "Font tool", 'F', create_fonttool_cb, NULL); /* * CreateMenuButton(menupane, "Area/perimeter...", 'A', create_area_frame, NULL); */ CreateMenuButton(menupane, "Console", 'l', create_monitor_frame_cb, NULL); /* help menu */ menupane = CreateMenu(menubar, "Help", 'H', TRUE); CreateMenuButton(menupane, "User's Guide", 'G', HelpCB, "doc/UsersGuide.html"); CreateMenuButton(menupane, "Tutorial", 'T', HelpCB, "doc/Tutorial.html"); CreateMenuButton(menupane, "FAQ", 'Q', HelpCB, "doc/FAQ.html"); CreateMenuButton(menupane, "Changes", 'C', HelpCB, "doc/CHANGES.html"); CreateMenuSeparator(menupane); submenupane = CreateMenu(menupane, "Examples", 'E', FALSE); sub2menupane = CreateMenu(submenupane, "General intro", 'i', FALSE); CreateMenuButton(sub2menupane, "Explain", '\0', load_example, "explain.agr"); CreateMenuButton(sub2menupane, "Properties", '\0', load_example, "props.agr"); CreateMenuButton(sub2menupane, "Axes", '\0',load_example, "axes.agr"); CreateMenuButton(sub2menupane, "Fonts", '\0', load_example, "tfonts.agr"); CreateMenuButton(sub2menupane, "Arrows", '\0', load_example, "arrows.agr"); CreateMenuButton(sub2menupane, "Symbols and lines", '\0', load_example, "symslines.agr"); CreateMenuButton(sub2menupane, "Fills", '\0', load_example, "fills.agr"); CreateMenuButton(sub2menupane, "World stack", '\0', load_example, "tstack.agr"); CreateMenuButton(sub2menupane, "Inset graphs", '\0', load_example, "tinset.agr"); CreateMenuButton(sub2menupane, "Many graphs", '\0', load_example, "manygraphs.agr"); sub2menupane = CreateMenu(submenupane, "XY graphs", 'g', FALSE); CreateMenuButton(sub2menupane, "Log scale", '\0', load_example, "tlog.agr"); CreateMenuButton(sub2menupane, "Log2 scale", '\0', load_example, "log2.agr"); CreateMenuButton(sub2menupane, "Log2/log scale", '\0', load_example, "log2log.agr"); CreateMenuButton(sub2menupane, "Logit scale", '\0', load_example, "logit.agr"); CreateMenuButton(sub2menupane, "Reciprocal scale", '\0', load_example, "reciprocal.agr"); CreateMenuButton(sub2menupane, "Error bars", '\0', load_example, "terr.agr"); CreateMenuButton(sub2menupane, "Date/time axis formats", '\0', load_example, "times.agr"); CreateMenuButton(sub2menupane, "Australia map", '\0', load_example, "au.agr"); CreateMenuButton(sub2menupane, "A CO2 analysis", '\0', load_example, "co2.agr"); CreateMenuButton(sub2menupane, "Motif statistics", '\0', load_example, "motif.agr"); CreateMenuButton(sub2menupane, "Spectrum", '\0', load_example, "spectrum.agr"); sub2menupane = CreateMenu(submenupane, "XY charts", 'c', FALSE); CreateMenuButton(sub2menupane, "Bar chart", '\0', load_example, "bar.agr"); CreateMenuButton(sub2menupane, "Stacked bar", '\0', load_example, "stackedb.agr"); CreateMenuButton(sub2menupane, "Bar chart with error bars", '\0', load_example, "chartebar.agr"); CreateMenuButton(sub2menupane, "Different charts", '\0', load_example, "charts.agr"); sub2menupane = CreateMenu(submenupane, "Polar graphs", 'P', FALSE); CreateMenuButton(sub2menupane, "Polar graph", '\0', load_example, "polar.agr"); sub2menupane = CreateMenu(submenupane, "Pie charts", 'i', FALSE); CreateMenuButton(sub2menupane, "Pie chart", '\0', load_example, "pie.agr"); sub2menupane = CreateMenu(submenupane, "Special set presentations", 'S', FALSE); CreateMenuButton(sub2menupane, "HILO", '\0', load_example, "hilo.agr"); CreateMenuButton(sub2menupane, "XY Radius", '\0', load_example, "txyr.agr"); CreateMenuButton(sub2menupane, "XYZ", '\0', load_example, "xyz.agr"); CreateMenuButton(sub2menupane, "Box plot", '\0', load_example, "boxplot.agr"); CreateMenuButton(sub2menupane, "Vector map", '\0', load_example, "vmap.agr"); CreateMenuButton(sub2menupane, "XY Size", '\0', load_example, "xysize.agr"); CreateMenuButton(sub2menupane, "XY Color", '\0', load_example, "xycolor.agr"); sub2menupane = CreateMenu(submenupane, "Type setting", 'T', FALSE); CreateMenuButton(sub2menupane, "Simple", '\0', load_example, "test2.agr"); CreateMenuButton(sub2menupane, "Text transforms", '\0', load_example, "txttrans.agr"); CreateMenuButton(sub2menupane, "Advanced", '\0', load_example, "typeset.agr"); sub2menupane = CreateMenu(submenupane, "Calculus", 'u', FALSE); CreateMenuButton(sub2menupane, "Non-linear fit", '\0', load_example, "logistic.agr"); CreateMenuSeparator(menupane); sprintf(buf, "http://plasma-gate.weizmann.ac.il/Grace/comments.phtml?version_id=%ld", bi_version_id()); CreateMenuButton(menupane, "Comments", 'm', HelpCB, buf); CreateMenuSeparator(menupane); CreateMenuButton(menupane, "License terms", 'L', HelpCB, "doc/GPL.html"); CreateMenuButton(menupane, "About...", 'A', create_about_grtool, NULL); return (menubar); } /* * build the GUI */ void startup_gui(void) { Widget bt, rc3, rcleft; Pixmap icon, shape; /* * Allow users to change tear off menus with X resources */ XmRepTypeInstallTearOffModelConverter(); RegisterEditRes(app_shell); /* * We handle important WM events ourselves */ handle_close(app_shell); xlibinit(); XtVaSetValues(app_shell, XmNcolormap, cmap, NULL); /* * build the UI here */ main_frame = XtVaCreateManagedWidget("mainWin", xmMainWindowWidgetClass, app_shell, NULL); menu_bar = CreateMainMenuBar(main_frame); ManageChild(menu_bar); form = XmCreateForm(main_frame, "form", NULL, 0); frleft = CreateFrame(form, NULL); rcleft = XtVaCreateManagedWidget("toolBar", xmRowColumnWidgetClass, frleft, XmNorientation, XmVERTICAL, XmNpacking, XmPACK_TIGHT, XmNspacing, 0, XmNentryBorder, 0, XmNmarginWidth, 0, XmNmarginHeight, 0, NULL); frtop = CreateFrame(form, NULL); loclab = CreateLabel(frtop, ""); frbot = CreateFrame(form, NULL); statlab = CreateLabel(frbot, ""); if (get_pagelayout() == PAGE_FIXED) { drawing_window = XtVaCreateManagedWidget("drawing_window", xmScrolledWindowWidgetClass, form, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, XmNscrollingPolicy, XmAUTOMATIC, XmNvisualPolicy, XmVARIABLE, NULL); canvas = XtVaCreateManagedWidget("canvas", xmDrawingAreaWidgetClass, drawing_window, XmNresizePolicy, XmRESIZE_ANY, XmNbackground, xvlibcolors[0], NULL); } else { canvas = XtVaCreateManagedWidget("canvas", xmDrawingAreaWidgetClass, form, XmNresizePolicy, XmRESIZE_ANY, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, XmNbackground, xvlibcolors[0], NULL); drawing_window = canvas; } XtAddCallback(canvas, XmNexposeCallback, (XtCallbackProc) expose_resize, NULL); XtAddCallback(canvas, XmNresizeCallback, (XtCallbackProc) expose_resize, NULL); XtAddEventHandler(canvas, EnterWindowMask | LeaveWindowMask | ButtonPressMask | PointerMotionMask | KeyPressMask | ColormapChangeMask, False, (XtEventHandler) my_proc, NULL); XtOverrideTranslations(canvas, XtParseTranslationTable(canvas_table)); AddHelpCB(canvas, "doc/UsersGuide.html#canvas"); XtVaSetValues(frtop, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); XtVaSetValues(frbot, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(frleft, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frtop, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, frbot, XmNleftAttachment, XmATTACH_FORM, NULL); XtVaSetValues(drawing_window, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, frtop, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, frbot, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, frleft, XmNrightAttachment, XmATTACH_FORM, NULL); ManageChild(form); if (get_pagelayout() == PAGE_FIXED) { unsigned int w, h; sync_canvas_size(&w, &h, FALSE); } XmMainWindowSetAreas(main_frame, menu_bar, NULL, NULL, NULL, form); bt = CreateButton(rcleft, "Draw"); AddButtonCB(bt, do_drawgraph, NULL); /* zoom and autoscale */ rc3 = XtVaCreateManagedWidget("rc", xmRowColumnWidgetClass, rcleft, XmNorientation, XmHORIZONTAL, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 4, XmNspacing, 0, XmNentryBorder, 0, NULL); bt = CreateBitmapButton(rc3, 16, 16, zoom_bits); AddButtonCB(bt, set_actioncb, (void *) ZOOM_1ST); bt = CreateBitmapButton(rc3, 16, 16, auto_bits); AddButtonCB(bt, autoscale_proc, (void *) AUTOSCALE_XY); /* expand/shrink */ bt = CreateBitmapButton(rc3, 16, 16, expand_bits); AddButtonCB(bt, graph_zoom_proc, (void *) GZOOM_EXPAND); bt = CreateBitmapButton(rc3, 16, 16, shrink_bits); AddButtonCB(bt, graph_zoom_proc, (void *) GZOOM_SHRINK); /* * scrolling buttons */ bt = CreateBitmapButton(rc3, 16, 16, left_bits); AddButtonCB(bt, graph_scroll_proc, (void *) GSCROLL_LEFT); bt = CreateBitmapButton(rc3, 16, 16, right_bits); AddButtonCB(bt, graph_scroll_proc, (void *) GSCROLL_RIGHT); bt = CreateBitmapButton(rc3, 16, 16, down_bits); AddButtonCB(bt, graph_scroll_proc, (void *) GSCROLL_DOWN); bt = CreateBitmapButton(rc3, 16, 16, up_bits); AddButtonCB(bt, graph_scroll_proc, (void *) GSCROLL_UP); CreateSeparator(rcleft); bt = CreateButton(rcleft, "AutoT"); AddButtonCB(bt, autoticks_proc, NULL); bt = CreateButton(rcleft, "AutoO"); AddButtonCB(bt, autoon_proc, NULL); rc3 = XtVaCreateManagedWidget("rc", xmRowColumnWidgetClass, rcleft, XmNorientation, XmHORIZONTAL, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 4, XmNspacing, 0, XmNentryBorder, 0, NULL); bt = CreateButton(rc3, "ZX"); AddButtonCB(bt, set_actioncb, (void *) ZOOMX_1ST); bt = CreateButton(rc3, "ZY"); AddButtonCB(bt, set_actioncb, (void *) ZOOMY_1ST); bt = CreateButton(rc3, "AX"); AddButtonCB(bt, autoscale_proc, (void *) AUTOSCALE_X); bt = CreateButton(rc3, "AY"); AddButtonCB(bt, autoscale_proc, (void *) AUTOSCALE_Y); bt = CreateButton(rc3, "PZ"); AddButtonCB(bt, world_stack_proc, (void *) WSTACK_PUSH_ZOOM); bt = CreateButton(rc3, "Pu"); AddButtonCB(bt, world_stack_proc, (void *) WSTACK_PUSH); bt = CreateButton(rc3, "Po"); AddButtonCB(bt, world_stack_proc, (void *) WSTACK_POP); bt = CreateButton(rc3, "Cy"); AddButtonCB(bt, world_stack_proc, (void *) WSTACK_CYCLE); stack_depth_item = CreateLabel(rcleft, ""); curw_item = CreateLabel(rcleft, ""); bt = CreateButton(rcleft, "Exit"); AddButtonCB(bt, MenuCB, (void *) MENU_EXIT); /* * initialize cursors */ init_cursors(); /* * initialize some option menus */ init_option_menus(); /* * initialize the tool bars */ set_view_items(); SetLabel(loclab, "G0:[X, Y] = "); set_stack_message(); set_left_footer(NULL); /* * set icon */ #if defined(HAVE_XPM) XpmCreatePixmapFromData(disp, root, grace_icon_xpm, &icon, &shape, NULL); #else icon = XCreateBitmapFromData(disp, root, (char *) grace_icon_bits, grace_icon_width, grace_icon_height); shape = XCreateBitmapFromData(disp, root, (char *) grace_mask_bits, grace_icon_width, grace_icon_height); #endif XtVaSetValues(app_shell, XtNiconPixmap, icon, XtNiconMask, shape, NULL); XtRealizeWidget(app_shell); xwin = XtWindow(canvas); inwin = 1; /* * set the title */ update_app_title(); XtAppMainLoop(app_con); } void sync_canvas_size(unsigned int *w, unsigned int *h, int inv) { Page_geometry pg = get_page_geometry(); if (inv) { GetDimensions(canvas, w, h); set_page_dimensions(*w*72.0/pg.dpi, *h*72.0/pg.dpi, TRUE); } else { *w = pg.width; *h = pg.height; SetDimensions(canvas, *w, *h); } } static int page_layout = PAGE_FIXED; int get_pagelayout(void) { return page_layout; } void set_pagelayout(int layout) { if (page_layout == layout) { return; } if (inwin) { errmsg("Can not change layout after initialization of GUI"); return; } else { page_layout = layout; } } static void graph_scroll_proc(void *data) { graph_scroll((int) data); xdrawgraph(); } static void graph_zoom_proc(void *data) { graph_zoom((int) data); xdrawgraph(); } static void world_stack_proc(void *data) { switch ((int) data) { case WSTACK_PUSH_ZOOM: push_and_zoom(); break; case WSTACK_PUSH: push_world(); break; case WSTACK_POP: pop_world(); break; case WSTACK_CYCLE: cycle_world_stack(); break; default: return; } update_all(); xdrawgraph(); } static void load_example(void *data) { char *s, buf[128]; set_wait_cursor(); s = (char *) data; sprintf(buf, "examples/%s", s); load_project_file(buf, FALSE); xdrawgraph(); unset_wait_cursor(); } grace-5.1.23/src/psdrv.h0000644000076500001440000000430210071615562014530 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" #define PS_FORMAT 0 #define EPS_FORMAT 1 /* #define EPSI_FORMAT 2 */ #define DEFAULT_PS_FORMAT PS_FORMAT #define MEDIA_FEED_AUTO 0 #define MEDIA_FEED_MATCH 1 #define MEDIA_FEED_MANUAL 2 #define DOCDATA_7BIT 0 #define DOCDATA_8BIT 1 #define DOCDATA_BINARY 2 #define MAX_PS_LINELEN 70 int psprintinitgraphics(void); int epsinitgraphics(void); void ps_drawpixel(VPoint vp); void ps_drawpolyline(VPoint *vps, int n, int mode); void ps_fillpolygon(VPoint *vps, int nc); void ps_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void ps_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void ps_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void ps_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void ps_leavegraphics(void); int ps_op_parser(char *opstring); int eps_op_parser(char *opstring); #if defined(NONE_GUI) # define ps_gui_setup NULL #else void ps_gui_setup(void); #endif #if defined(NONE_GUI) # define eps_gui_setup NULL #else void eps_gui_setup(void); #endif grace-5.1.23/src/xprotos.h0000644000076500001440000001245710335446017015122 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Prototypes involving X * */ #ifndef __XPROTOS_H_ #define __XPROTOS_H_ #include #include "defines.h" int initialize_gui(int *argc, char **argv); void startup_gui(void); void set_left_footer(char *s); void xdrawgraph(void); void expose_resize(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cbs); void setpointer(VPoint vp); void select_line(int x1, int y1, int x2, int y2, int erase); void select_region(int x1, int y1, int x2, int y2, int erase); void slide_region(view bbox, int shift_x, int shift_y, int erase); void reset_crosshair(void); void crosshair_motion(int x, int y); void draw_focus(int gno); void switch_current_graph(int gto); char *display_name(void); void xunregister_rti(XtInputId); void xregister_rti(Input_buffer *ib); int yesnowin(char *msg1, char *msg2, char *s1, char *help_anchor); void create_file_popup(void *data); void create_netcdfs_popup(void *data); void create_rparams_popup(void *data); void create_wparam_frame(void *data); void create_saveproject_popup(void); void create_openproject_popup(void); void do_hotupdate_proc(void *data); void create_eblock_frame(int gno); void create_printer_setup(void *data); void open_command(void *data); void create_eval_frame(void *data); void create_load_frame(void *data); void create_histo_frame(void *data); void create_fourier_frame(void *data); void create_run_frame(void *data); void create_reg_frame(void *data); void create_diff_frame(void *data); void create_seasonal_frame(void *data); void create_interp_frame(void *data); void create_int_frame(void *data); void create_xcor_frame(void *data); void create_samp_frame(void *data); void create_prune_frame(void *data); void create_digf_frame(void *data); void create_lconv_frame(void *data); void create_leval_frame(void *data); void create_geom_frame(void *data); void create_write_popup(void *data); void create_hotlinks_popup(void *data); void update_hotlinks(void); void create_saveall_popup(void *data); void create_points_frame(void *data); void create_region_frame(void *data); void create_define_frame(void *data); void create_clear_frame(void *data); void create_reporton_frame(void *data); void create_area_frame(void *data); void define_region(int nr, int rtype); void define_status_popup(void *data); void create_about_grtool(void *data); void update_set_lists(int gno); void updatesymbols(int gno, int value); void updatelegends(int gno); void update_view(int gno); void define_symbols_popup(void *data); void update_ticks(int gno); void create_axes_dialog(int axisno); void create_axes_dialog_cb(void *data); void create_graph_frame(void *data); void create_world_frame(void *data); void create_arrange_frame(void *data); void create_overlay_frame(void *data); void create_autos_frame(void *data); void define_objects_popup(void *data); void update_locator_items(int gno); void create_locator_frame(void *data); void create_graphapp_frame(int gno); void create_graphapp_frame_cb(void *data); void create_monitor_frame_cb(void *data); void stufftextwin(char *s); void HelpCB(void *data); void create_nonl_frame(void *data); void update_nonl_frame(void); void update_prune_frame(void); void update_misc_items(void); void create_plot_frame(void); void create_plot_frame_cb(void *data); void create_props_frame(void *data); void create_fonttool(Widget w); void create_fonttool_cb(void *data); void set_wait_cursor(void); void unset_wait_cursor(void); void set_cursor(int c); void init_cursors(void); int init_option_menus(void); void sync_canvas_size(unsigned int *w, unsigned int *h, int inv); void box_edit_popup(int no); void ellipse_edit_popup(int no); void line_edit_popup(int no); void string_edit_popup(int no); int object_edit_popup(int type, int id); void set_title(char *ts); void set_pagelayout(int layout); int get_pagelayout(void); void errwin(const char *s); void create_datasetprop_popup(void *data); void create_datasetop_popup(void *data); void create_setop_popup(void *data); void create_featext_frame(void *data); void create_ss_frame(int gno, int setno); void update_ss_editors(int gno); void do_ext_editor(int gno, int setno); void set_graph_selectors(int gno); void update_props_items(void); void update_all(void); void update_all_cb(void *data); void set_barebones(int onoff); #endif /* __XPROTOS_H_ */ grace-5.1.23/src/comwin.c0000644000076500001440000003231310071615561014663 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Command Panel * */ #include #include #include #include #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "files.h" #include "motifinc.h" #include "parser.h" #include "protos.h" /* * Widget item declarations */ static Widget command; static Widget comshell; static Widget hl; /* command history list */ static void comcall(Widget w, XtPointer cd, XtPointer calld); static void clear_history(Widget w, XtPointer client_data, XtPointer call_data); static void replay_history(Widget w, XtPointer client_data, XtPointer call_data); static void whist_apply_notify_proc(Widget w, XtPointer client_data, XtPointer call_data); static void add_com(Widget w, XtPointer client_data, XtPointer call_data); static void replace_com(Widget w, XtPointer client_data, XtPointer call_data); static void delete_com(Widget w, XtPointer client_data, XtPointer call_data); static void move_com(Widget w, XtPointer client_data, XtPointer call_data); void close_rhist_popup(Widget w, XtPointer client_data, XtPointer call_data); void comwin_add_act(Widget w, XKeyEvent *e, String *p, Cardinal *c); void comwin_delete_act(Widget w, XKeyEvent *e, String *p, Cardinal *c); void comwin_down_act(Widget w, XKeyEvent *e, String *p, Cardinal *c); void comwin_replace_act(Widget w, XKeyEvent *e, String *p, Cardinal *c); void comwin_up_act(Widget w, XKeyEvent *e, String *p, Cardinal *c); void create_rhist_popup(Widget w, XtPointer client_data, XtPointer call_data); void create_whist_frame(Widget w, XtPointer client_data, XtPointer call_data); static int do_rhist_proc(char *filename, void *data); void open_command(void *data); extern XtAppContext app_con; void comwin_add_act( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { add_com ((Widget) NULL, (XtPointer) NULL, (XtPointer) NULL); } void comwin_replace_act( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { replace_com ((Widget) NULL, (XtPointer) NULL, (XtPointer) NULL); } void comwin_delete_act( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { delete_com ((Widget) NULL, (XtPointer) NULL, (XtPointer) NULL); } void comwin_up_act( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { move_com ((Widget) NULL, (XtPointer) 0, (XtPointer) NULL); } void comwin_down_act( Widget w, XKeyEvent *e, String *p, Cardinal *c ) { move_com ((Widget) NULL, (XtPointer) 1, (XtPointer) NULL); } static XtActionsRec actions[] = { { "comwin_add", (XtActionProc) comwin_add_act }, { "comwin_replace", (XtActionProc) comwin_replace_act }, { "comwin_delete", (XtActionProc) comwin_delete_act }, { "comwin_up", (XtActionProc) comwin_up_act }, { "comwin_down", (XtActionProc) comwin_down_act } }; static char comwin_table[] = "#override\n\ Shift ~Ctrl ~Meta ~AltReturn: comwin_add()\n\ Shift Ctrl ~Meta ~AltReturn: comwin_replace()\n\ Shift ~Ctrl ~Meta ~AltosfBackSpace: comwin_delete()\n\ Shift ~Ctrl ~Meta ~AltosfUp: comwin_up()\n\ Shift ~Ctrl ~Meta ~AltosfDown: comwin_down()"; static void comcall(Widget w, XtPointer cd, XtPointer calld) { char *ts; XmCommandCallbackStruct *s = (XmCommandCallbackStruct *) calld; ts = GetStringSimple(s->value); scanner(ts); XtFree(ts); } static void delete_com(Widget w, XtPointer client_data, XtPointer call_data) /* delete a entry from the history list */ { int npos, *pos; if( XmListGetSelectedPos( hl, &pos, &npos ) == True ) { XmListDeletePos( hl, pos[0] ); xfree( pos ); } } static void move_com(Widget w, XtPointer client_data, XtPointer call_data) /* move a entry up(0) or down(1) in the history list */ { int npos, *pos, numit; XmString selit, *selitemlst; if( XmListGetSelectedPos( hl, &pos, &npos ) == True ) { XtVaGetValues( hl, XmNselectedItems, &selitemlst, XmNitemCount, &numit, NULL ); selit = XmStringCopy( selitemlst[0] ); XmListDeletePos( hl, pos[0] ); if( client_data == 0 ) { pos[0]--; } else { if( pos[0] < numit ) { pos[0]++; } else { pos[0] = 1; } } XmListAddItem( hl, selit, pos[0] ); XmListSelectPos( hl, pos[0], False ); XmStringFree( selit ); xfree( pos ); } } static void add_com(Widget w, XtPointer client_data, XtPointer call_data) /* * copy the contents of the command line to thestory list without executing it */ { int npos, *pos, numit=-1, newpos; XmString comtxt; XtVaGetValues( command, XmNcommand, &comtxt, NULL ); if (!XmStringEmpty(comtxt)) { if( XmListGetSelectedPos( hl, &pos, &npos ) == True ) { XtVaGetValues( hl, XmNitemCount, &numit, NULL ); newpos = ++pos[0]; } else { newpos = 0; } XmListAddItem( hl, comtxt, newpos ); XmListSelectPos( hl, newpos, False ); if( numit>0 ) { xfree( pos ); } } XmStringFree( comtxt ); comtxt=XmStringCreateLocalized( "" ); XmCommandSetValue( command, comtxt ); XmStringFree( comtxt ); } static void replace_com(Widget w, XtPointer client_data, XtPointer call_data) /* * replace a entry in the history list with the command line * without executing it */ { int npos, *pos; XmString comtxt; XtVaGetValues( command, XmNcommand, &comtxt, NULL ); if(!XmStringEmpty(comtxt) && XmListGetSelectedPos(hl, &pos, &npos)==True) { XmListDeletePos( hl, pos[0] ); XmListAddItem( hl, comtxt, pos[0] ); XmListSelectPos( hl, pos[0], False ); xfree( pos ); XmStringFree( comtxt ); comtxt=XmStringCreateLocalized( "" ); XmCommandSetValue( command, comtxt); XmStringFree( comtxt ); } } static void clear_history(Widget w, XtPointer client_data, XtPointer call_data) { int i; int ac = 0, hc; Arg al[5]; Widget h = XmCommandGetChild(command, XmDIALOG_HISTORY_LIST); ac = 0; XtSetArg(al[ac], XmNhistoryItemCount, &hc); ac++; XtGetValues(command, al, ac); for (i = 0; i < hc; i++) { XmListDeletePos(h, 0); } } #define MAXERR 5 static void replay_history(Widget w, XtPointer client_data, XtPointer call_data) { int errpos; static int errcount; char *ts; int i; int ac = 0, hc; XmStringTable xmstrs; Arg al[5]; ac = 0; XtSetArg(al[ac], XmNhistoryItems, &xmstrs); ac++; XtSetArg(al[ac], XmNhistoryItemCount, &hc); ac++; XtGetValues(command, al, ac); errcount = 0; for (i = 0; i < hc; i++) { ts = GetStringSimple(xmstrs[i]); errpos = scanner(ts); XtFree(ts); if (errpos) { errcount++; } if (errcount > MAXERR) { if (yesno("Lots of errors, cancel?", NULL, NULL, NULL)) { break; } else { errcount = 0; } } } } void open_command(void *data) { Widget form, fr1, fr2, but[6]; char *labrow1[5] = { "Add", "Delete", "Replace", "Up", "Down"}; char *labrow2[6] = { "Read...", "Save...", "Clear", "Replay", "Close", "Help"}; set_wait_cursor(); if (command == NULL) { XmString str; comshell = XmCreateDialogShell(app_shell, "Commands", NULL, 0); handle_close(comshell); command = XmCreateCommand(comshell, "command", NULL, 0); hl = XmCommandGetChild(command, XmDIALOG_HISTORY_LIST); str = XmStringCreateLocalized("Command"); XtVaSetValues(command, XmNpromptString, str, NULL); XmStringFree(str); form = XmCreateForm(command, "commandform", NULL, 0); XtVaSetValues(form, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, hl, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, XmCommandGetChild(command, XmDIALOG_PROMPT_LABEL), NULL); fr1 = CreateFrame(form, NULL); XtVaSetValues(fr1, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); CreateCommandButtonsNoDefault(fr1, 5, but, labrow1); XtAddCallback(but[0], XmNactivateCallback, add_com, NULL); XtAddCallback(but[1], XmNactivateCallback, delete_com, NULL); XtAddCallback(but[2], XmNactivateCallback, replace_com, NULL); XtAddCallback(but[3], XmNactivateCallback, move_com, (XtPointer) 0); XtAddCallback(but[4], XmNactivateCallback, move_com, (XtPointer) 1); fr2 = CreateFrame(form, NULL); XtVaSetValues(fr2, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, fr1, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); CreateCommandButtonsNoDefault(fr2, 6, but, labrow2); XtAddCallback(but[0], XmNactivateCallback, create_rhist_popup, NULL); XtAddCallback(but[1], XmNactivateCallback, create_whist_frame, NULL); XtAddCallback(but[2], XmNactivateCallback, clear_history, NULL); XtAddCallback(but[3], XmNactivateCallback, replay_history, NULL); XtAddCallback(but[4], XmNactivateCallback, destroy_dialog, comshell); AddButtonCB(but[5], HelpCB, "doc/UsersGuide.html#commands"); XtAddCallback(command, XmNcommandEnteredCallback, comcall, NULL); ManageChild(form); ManageChild(command); ManageChild(comshell); XtAppAddActions(app_con, actions, XtNumber(actions)); XtOverrideTranslations(XmCommandGetChild(command, XmDIALOG_COMMAND_TEXT), XtParseTranslationTable(comwin_table)); } RaiseWindow(comshell); unset_wait_cursor(); } static Widget rhist_dialog; void close_rhist_popup(Widget w, XtPointer client_data, XtPointer call_data) { UnmanageChild(rhist_dialog); } static int do_rhist_proc(char *filename, void *data) { char buf[512]; int sl; FILE *fp; XmString list_item; Widget h = XmCommandGetChild(command, XmDIALOG_HISTORY_LIST); if ((fp = grace_openr(filename, SOURCE_DISK)) != NULL) { while (grace_fgets(buf, 255, fp) != NULL) { sl = strlen(buf); buf[sl - 1] = 0; if (strlen(buf) == 0) { continue; } list_item = XmStringCreateLocalized(buf); XmListAddItemUnselected(h, list_item, 0); XmStringFree(list_item); } grace_close(fp); return TRUE; } else { return FALSE; } } void create_rhist_popup(Widget w, XtPointer client_data, XtPointer call_data) { static FSBStructure *fsb = NULL; set_wait_cursor(); if (fsb == NULL) { fsb = CreateFileSelectionBox(app_shell, "Read history"); AddFileSelectionBoxCB(fsb, do_rhist_proc, NULL); ManageChild(fsb->FSB); } RaiseWindow(fsb->dialog); unset_wait_cursor(); } /* * Panel item declarations */ static Widget whist_frame; static Widget whist_panel; static Widget whist_text_item; /* * Create the whist Frame and the whist Panel */ void create_whist_frame(Widget w, XtPointer client_data, XtPointer call_data) { set_wait_cursor(); if (whist_frame == NULL) { Widget buts[2]; char *label1[2]; label1[0] = "Accept"; label1[1] = "Cancel"; whist_frame = XmCreateDialogShell(app_shell, "Write history", NULL, 0); handle_close(whist_frame); whist_panel = XmCreateRowColumn(whist_frame, "whist_rc", NULL, 0); whist_text_item = CreateTextItem2(whist_panel, 30, "Write history to:"); CreateSeparator(whist_panel); CreateCommandButtons(whist_panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, (XtCallbackProc) whist_apply_notify_proc, (XtPointer) NULL); XtAddCallback(buts[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) whist_frame); ManageChild(whist_panel); } RaiseWindow(whist_frame); unset_wait_cursor(); } static void whist_apply_notify_proc(Widget w, XtPointer client_data, XtPointer call_data) { int i, ac = 0, hc; char *ts; XmStringTable xmstrs; Arg al[5]; FILE *pp; pp = grace_openw(xv_getstr(whist_text_item)); if (pp != NULL) { ac = 0; XtSetArg(al[ac], XmNhistoryItems, &xmstrs); ac++; XtSetArg(al[ac], XmNhistoryItemCount, &hc); ac++; XtGetValues(command, al, ac); for (i = 0; i < hc; i++) { ts = GetStringSimple(xmstrs[i]); fprintf(pp, "%s\n", ts); XtFree(ts); } grace_close(pp); } UnmanageChild(whist_frame); } grace-5.1.23/src/plotone.h0000644000076500001440000000555610071615562015066 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * plotone.h */ #ifndef __PLOTONE_H_ #define __PLOTONE_H_ #include "defines.h" #include "draw.h" void drawgraph(void); void do_hardcopy(void); void plotone(int gno); void xyplot(int gno); void draw_polar_graph(int gno); void draw_smith_chart(int gno); void draw_pie_chart(int gno); void drawframe(int gno); void fillframe(int gno); void drawsetfill(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawsetline(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawsetbars(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawsetsyms(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawsetavalues(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawseterrbars(int gno, int setno, plotarr *p, int refn, double *refx, double *refy, double offset); void drawsethilo(plotarr *p); void drawcirclexy(plotarr *p); void drawsetvmap(int gno, plotarr *p); void drawsetboxplot(plotarr *p); int drawxysym(VPoint vp, double size, int symtype, Pen sympen, Pen symfillpen, char s); void drawerrorbar(VPoint vp1, VPoint vp2, Errbar *eb); void draw_region(int r); void draw_objects(int gno); void draw_string(int gno, int i); void draw_box(int gno, int i); void draw_ellipse(int gno, int i); void draw_line(int gno, int i); void draw_arrowhead(VPoint vp1, VPoint vp2, const Arrow *arrowp); void dolegend(int gno); void putlegends(int gno, VPoint vp, double ldist, double sdist, double yskip); void draw_titles(int gno); void draw_ref_point(int gno); void draw_timestamp(void); void draw_regions(int gno); #endif /* __PLOTONE_H_ */ grace-5.1.23/src/tickwin.c0000644000076500001440000010036110071615562015037 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * ticks / tick labels / axis labels * */ #include #include #include #include #include #include #include "globals.h" #include "protos.h" #include "utils.h" #include "graphs.h" #include "graphutils.h" #include "motifinc.h" #define cg get_cg() static int curaxis; static Widget axes_dialog = NULL; static Widget axes_tab; static OptionStructure *editaxis; /* which axis to edit */ static Widget axis_active; /* active or not */ static Widget axis_zero; /* "zero" or "plain" */ static OptionStructure *axis_scale; /* axis scale */ static Widget axis_invert; /* invert axis */ static Widget *axis_applyto; /* override */ static Widget offx; /* x offset of axis in viewport coords */ static Widget offy; /* y offset of axis in viewport coords */ static Widget tonoff; /* toggle display of axis ticks */ static Widget tlonoff; /* toggle display of tick labels */ static TextStructure *axislabel; /* axis label */ static Widget *axislabellayout; /* axis label layout (perp or parallel) */ static OptionStructure *axislabelplace; /* axis label placement, auto or specified */ static Widget axislabelspec_rc; static Widget axislabelspec_para; /* location of axis label if specified (viewport coords) */ static Widget axislabelspec_perp; /* location of axis label if specified (viewport coords) */ static OptionStructure *axislabelfont; /* axis label font */ static Widget axislabelcharsize;/* axis label charsize */ static OptionStructure *axislabelcolor; /* axis label color */ static Widget *axislabelop; /* tick labels normal|opposite|both sides */ static Widget tmajor; /* major tick spacing */ static SpinStructure *nminor; /* # of minor ticks */ static Widget *tickop; /* ticks normal|opposite|both sides */ static Widget *ticklop; /* tick labels normal|opposite|both sides */ static OptionStructure *tlform; /* format for labels */ static Widget *tlprec; /* precision for labels */ static OptionStructure *tlfont; /* tick label font */ static Widget tlcharsize; /* tick label charsize */ static OptionStructure *tlcolor; /* tick label color */ static Widget tlappstr; /* tick label append string */ static Widget tlprestr; /* tick label prepend string */ static Widget *tlskip; /* tick marks to skip */ static Widget *tlstarttype; /* use graph min or starting value */ static Widget tlstart; /* value to start tick labels */ static Widget *tlstoptype; /* use graph max or stop value */ static Widget tlstop; /* value to stop tick labels */ static OptionStructure *tlgaptype; /* tick label placement, auto or specified */ static Widget tlgap_rc; static Widget tlgap_para; /* location of tick label if specified (viewport coords) */ static Widget tlgap_perp; /* location of tick label if specified (viewport coords) */ static Widget tlangle; /* angle */ static Widget *tlstagger; /* stagger */ static TextStructure *tlformula; /* transformation if tick labels */ static Widget *autonum; /* number of autotick divisions */ static Widget tround; /* place at rounded positions */ static Widget tgrid; /* major ticks grid */ static OptionStructure *tgridcol; static SpinStructure *tgridlinew; static OptionStructure *tgridlines; static Widget tmgrid; /* minor ticks grid */ static OptionStructure *tmgridcol; static SpinStructure *tmgridlinew; static OptionStructure *tmgridlines; static Widget tlen; /* tick length */ static Widget tmlen; static Widget *tinout; /* ticks in out or both */ static Widget baronoff; /* axis bar */ static OptionStructure *barcolor; static SpinStructure *barlinew; static OptionStructure *barlines; static OptionStructure *specticks; /* special ticks/labels */ static SpinStructure *nspec; static Widget specloc[MAX_TICKS]; static Widget speclabel[MAX_TICKS]; static Widget axis_world_start; static Widget axis_world_stop; static void set_axis_proc(int value, void *data); static void set_active_proc(int onoff, void *data); static int axes_aac_cb(void *data); static void axis_scale_cb(int value, void *data); static void auto_spec_cb(int value, void *data); void create_axes_dialog_cb(void *data) { create_axes_dialog(-1); } /* * Create the ticks popup */ void create_axes_dialog(int axisno) { set_wait_cursor(); if (axisno >= 0 && axisno < MAXAXES) { curaxis = axisno; } if (axes_dialog == NULL) { int i; char buf[32]; OptionItem opitems[MAXAXES]; Widget rc_head, rc, rc2, rc3, fr, sw, axes_main, axes_label, axes_ticklabel, axes_tickmark, axes_special, vbar; axes_dialog = CreateDialogForm(app_shell, "Axes"); rc_head = CreateVContainer(axes_dialog); AddDialogFormChild(axes_dialog, rc_head); rc = CreateHContainer(rc_head); opitems[0].value = X_AXIS; opitems[0].label = "X axis"; opitems[1].value = Y_AXIS; opitems[1].label = "Y axis"; opitems[2].value = ZX_AXIS; opitems[2].label = "Alt X axis"; opitems[3].value = ZY_AXIS; opitems[3].label = "Alt Y axis"; editaxis = CreateOptionChoice(rc, "Edit:", 0, MAXAXES, opitems); AddOptionChoiceCB(editaxis, set_axis_proc, NULL); axis_active = CreateToggleButton(rc, "Active"); AddToggleButtonCB(axis_active, set_active_proc, NULL); rc = CreateHContainer(rc_head); axis_world_start = CreateTextItem2(rc, 10, "Start:"); axis_world_stop = CreateTextItem2(rc, 10, "Stop:"); rc = CreateHContainer(rc_head); opitems[0].value = SCALE_NORMAL; opitems[0].label = "Linear"; opitems[1].value = SCALE_LOG; opitems[1].label = "Logarithmic"; opitems[2].value = SCALE_REC; opitems[2].label = "Reciprocal"; opitems[3].value = SCALE_LOGIT; opitems[3].label = "Logit"; axis_scale = CreateOptionChoice(rc, "Scale:", 0, 4, opitems); AddOptionChoiceCB(axis_scale, axis_scale_cb, NULL); axis_invert = CreateToggleButton(rc, "Invert axis"); /* ------------ Tabs --------------*/ axes_tab = CreateTab(axes_dialog); AddDialogFormChild(axes_dialog, axes_tab); axes_main = CreateTabPage(axes_tab, "Main"); fr = CreateFrame(axes_main, "Axis label"); axislabel = CreateCSText(fr, "Label string:"); fr = CreateFrame(axes_main, "Tick properties"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); tmajor = CreateTextItem2(rc2, 8, "Major spacing:"); nminor = CreateSpinChoice(rc2, "Minor ticks:", 2, SPIN_TYPE_INT, 0.0, (double) MAX_TICKS - 1, 1.0); rc2 = CreateHContainer(rc); tlform = CreateFormatChoice(rc2, "Format:"); tlprec = CreatePrecisionChoice(rc2, "Precision:"); fr = CreateFrame(axes_main, "Display options"); rc = CreateHContainer(fr); rc2 = CreateVContainer(rc); tlonoff = CreateToggleButton(rc2, "Display tick labels"); tonoff = CreateToggleButton(rc2, "Display tick marks"); rc2 = CreateVContainer(rc); baronoff = CreateToggleButton(rc2, "Display axis bar"); fr = CreateFrame(axes_main, "Axis placement"); rc = CreateHContainer(fr); axis_zero = CreateToggleButton(rc, "Zero axis"); offx = CreateTextItem2(rc, 6, "Offsets - Normal:"); offy = CreateTextItem2(rc, 6, "Opposite:"); fr = CreateFrame(axes_main, "Tick label properties"); rc = CreateHContainer(fr); tlfont = CreateFontChoice(rc, "Font:"); tlcolor = CreateColorChoice(rc, "Color:"); axes_label = CreateTabPage(axes_tab, "Axis label & bar"); fr = CreateFrame(axes_label, "Label properties"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); axislabelfont = CreateFontChoice(rc2, "Font:"); axislabelcolor = CreateColorChoice(rc2, "Color:"); rc2 = CreateHContainer(rc); axislabelcharsize = CreateCharSizeChoice(rc2, "Char size"); SetScaleWidth(axislabelcharsize, 160); axislabellayout = CreatePanelChoice(rc2, "Layout:", 3, "Parallel to axis", "Perpendicular to axis", NULL); rc2 = CreateHContainer(rc); axislabelop = CreatePanelChoice(rc2, "Side:", 4, "Normal", "Opposite", "Both", NULL); opitems[0].value = TYPE_AUTO; opitems[0].label = "Auto"; opitems[1].value = TYPE_SPEC; opitems[1].label = "Specified"; axislabelplace = CreateOptionChoice(rc2, "Location:", 0, 2, opitems); axislabelspec_rc = CreateHContainer(rc); axislabelspec_para = CreateTextItem2(axislabelspec_rc, 7, "Parallel offset:"); axislabelspec_perp = CreateTextItem2(axislabelspec_rc, 7, "Perpendicular offset:"); AddOptionChoiceCB(axislabelplace, auto_spec_cb, axislabelspec_rc); fr = CreateFrame(axes_label, "Bar properties"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); barcolor = CreateColorChoice(rc2, "Color:"); barlinew = CreateLineWidthChoice(rc2, "Width:"); barlines = CreateLineStyleChoice(rc, "Line style:"); axes_ticklabel = CreateTabPage(axes_tab, "Tick labels"); fr = CreateFrame(axes_ticklabel, "Labels"); rc2 = CreateHContainer(fr); tlcharsize = CreateCharSizeChoice(rc2, "Char size"); SetScaleWidth(tlcharsize, 200); tlangle = CreateAngleChoice(rc2, "Angle"); SetScaleWidth(tlangle, 180); fr = CreateFrame(axes_ticklabel, "Placement"); rc = CreateHContainer(fr); rc2 = CreateVContainer(rc); ticklop = CreatePanelChoice(rc2, "Side:", 4, "Normal", "Opposite", "Both", NULL); tlstagger = CreatePanelChoice(rc2, "Stagger:", 11, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL); rc2 = CreateVContainer(rc); rc3 = CreateHContainer(rc2); tlstarttype = CreatePanelChoice(rc3, "Start at:", 3, "Axis min", "Specified:", NULL); tlstart = CreateTextItem2(rc3, 8, ""); rc3 = CreateHContainer(rc2); tlstoptype = CreatePanelChoice(rc3, "Stop at:", 3, "Axis max", "Specified:", NULL); tlstop = CreateTextItem2(rc3, 8, ""); fr = CreateFrame(axes_ticklabel, "Extra"); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); tlskip = CreatePanelChoice(rc2, "Skip every:", 11, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL); tlformula = CreateTextInput(rc2, "Axis transform:"); rc2 = CreateHContainer(rc); tlprestr = CreateTextItem2(rc2, 13, "Prepend:"); tlappstr = CreateTextItem2(rc2, 13, "Append:"); opitems[0].value = TYPE_AUTO; opitems[0].label = "Auto"; opitems[1].value = TYPE_SPEC; opitems[1].label = "Specified"; tlgaptype = CreateOptionChoice(rc, "Location:", 0, 2, opitems); tlgap_rc = CreateHContainer(rc); tlgap_para = CreateTextItem2(tlgap_rc, 7, "Parallel offset:"); tlgap_perp = CreateTextItem2(tlgap_rc, 7, "Perpendicular offset:"); AddOptionChoiceCB(tlgaptype, auto_spec_cb, tlgap_rc); axes_tickmark = CreateTabPage(axes_tab, "Tick marks"); fr = CreateFrame(axes_tickmark, "Placement"); rc2 = CreateVContainer(fr); rc = CreateHContainer(rc2); tinout = CreatePanelChoice(rc, "Pointing:", 4, "In", "Out", "Both", NULL); tickop = CreatePanelChoice(rc, "Draw on:", 4, "Normal side", "Opposite side", "Both sides", NULL); rc = CreateHContainer(rc2); tround = CreateToggleButton(rc, "Place at rounded positions"); autonum = CreatePanelChoice(rc, "Autotick divisions", 12, "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", NULL); rc2 = CreateHContainer(axes_tickmark); /* major tick marks */ fr = CreateFrame(rc2, "Major ticks"); rc = CreateVContainer(fr); tgrid = CreateToggleButton(rc, "Draw grid lines"); tlen = CreateCharSizeChoice(rc, "Tick length"); tgridcol = CreateColorChoice(rc, "Color:"); tgridlinew = CreateLineWidthChoice(rc, "Line width:"); tgridlines = CreateLineStyleChoice(rc, "Line style:"); fr = CreateFrame(rc2, "Minor ticks"); rc = CreateVContainer(fr); tmgrid = CreateToggleButton(rc, "Draw grid lines"); tmlen = CreateCharSizeChoice(rc, "Tick length"); tmgridcol = CreateColorChoice(rc, "Color:"); tmgridlinew = CreateLineWidthChoice(rc, "Line width:"); tmgridlines = CreateLineStyleChoice(rc, "Line style:"); axes_special = CreateTabPage(axes_tab, "Special"); opitems[0].value = TICKS_SPEC_NONE; opitems[0].label = "None"; opitems[1].value = TICKS_SPEC_MARKS; opitems[1].label = "Tick marks"; opitems[2].value = TICKS_SPEC_BOTH; opitems[2].label = "Tick marks and labels"; specticks = CreateOptionChoice(axes_special, "Special ticks:", 0, 3, opitems); nspec = CreateSpinChoice(axes_special, "Number of user ticks to use:", 3, SPIN_TYPE_INT, 0.0, (double) MAX_TICKS, 1.0); CreateLabel(axes_special, "Tick location - Label:"); sw = XtVaCreateManagedWidget("sw", xmScrolledWindowWidgetClass, axes_special, XmNheight, 240, XmNscrollingPolicy, XmAUTOMATIC, NULL); rc = CreateVContainer(sw); for (i = 0; i < MAX_TICKS; i++) { rc3 = CreateHContainer(rc); sprintf(buf, "%2d", i); specloc[i] = CreateTextItem4(rc3, 12, buf); speclabel[i] = CreateTextItem4(rc3, 30, ""); } SelectTabPage(axes_tab, axes_main); rc = CreateVContainer(axes_dialog); axis_applyto = CreatePanelChoice(rc, "Apply to:", 5, "Current axis", "All axes, current graph", "Current axis, all graphs", "All axes, all graphs", NULL); CreateAACDialog(axes_dialog, rc, axes_aac_cb, NULL); /* set reasonable scrolling */ vbar = XtNameToWidget(sw, "VertScrollBar"); if (vbar) { int maxval; XtVaGetValues(vbar, XmNmaximum, &maxval, NULL); XtVaSetValues(vbar, XmNincrement, (int) rint(maxval/MAX_TICKS), NULL); } } update_ticks(cg); RaiseWindow(GetParent(axes_dialog)); unset_wait_cursor(); } /* * Callback function for definition of tick marks and axis labels. */ static int axes_aac_cb(void *data) { int i, j; int applyto; int axis_start, axis_stop, graph_start, graph_stop; int scale, invert; tickmarks *t; double axestart, axestop; char *cp; world w; applyto = GetChoice(axis_applyto); t = new_graph_tickmarks(); if (!t) { return RETURN_FAILURE; } t->active = GetToggleButtonState(axis_active); t->zero = GetToggleButtonState(axis_zero); if (xv_evalexpr(tmajor, &t->tmajor) != RETURN_SUCCESS) { errmsg( "Specify major tick spacing" ); free_graph_tickmarks(t); return RETURN_FAILURE; } t->nminor = (int) GetSpinChoice(nminor); t->tl_flag = GetToggleButtonState(tlonoff); t->t_flag = GetToggleButtonState(tonoff); t->t_drawbar = GetToggleButtonState(baronoff); set_plotstr_string(&t->label, GetTextString(axislabel)); xv_evalexpr(offx, &t->offsx); xv_evalexpr(offy, &t->offsy); t->label_layout = GetChoice(axislabellayout) ? LAYOUT_PERPENDICULAR : LAYOUT_PARALLEL; t->label_place = GetOptionChoice(axislabelplace); if (t->label_place == TYPE_SPEC) { xv_evalexpr(axislabelspec_para, &t->label.x); xv_evalexpr(axislabelspec_perp, &t->label.y); } t->label.font = GetOptionChoice(axislabelfont); t->label.color = GetOptionChoice(axislabelcolor); t->label.charsize = GetCharSizeChoice(axislabelcharsize); /* somehow the value of axislabelop gets automagically correctly applied to all selected axes without checking for the value of applyto directly here (strange...) */ t->label_op = GetChoice(axislabelop); t->tl_font = GetOptionChoice(tlfont); t->tl_color = GetOptionChoice(tlcolor); t->tl_skip = GetChoice(tlskip); t->tl_prec = GetChoice(tlprec); t->tl_staggered = (int) GetChoice(tlstagger); strcpy(t->tl_appstr, xv_getstr(tlappstr)); strcpy(t->tl_prestr, xv_getstr(tlprestr)); t->tl_starttype = (int) GetChoice(tlstarttype) == 0 ? TYPE_AUTO : TYPE_SPEC; if (t->tl_starttype == TYPE_SPEC) { if(xv_evalexpr(tlstart, &t->tl_start) != RETURN_SUCCESS) { errmsg( "Specify tick label start" ); free_graph_tickmarks(t); return RETURN_FAILURE; } } t->tl_stoptype = (int) GetChoice(tlstoptype) == 0 ? TYPE_AUTO : TYPE_SPEC; if (t->tl_stoptype == TYPE_SPEC) { if(xv_evalexpr(tlstop, &t->tl_stop) != RETURN_SUCCESS){ errmsg( "Specify tick label stop" ); free_graph_tickmarks(t); return RETURN_FAILURE; } } t->tl_format = GetOptionChoice(tlform); t->tl_formula = copy_string(NULL, GetTextString(tlformula)); t->tl_gaptype = GetOptionChoice(tlgaptype); if (t->tl_gaptype == TYPE_SPEC) { xv_evalexpr(tlgap_para, &t->tl_gap.x); xv_evalexpr(tlgap_perp, &t->tl_gap.y); } t->tl_angle = GetAngleChoice(tlangle); t->tl_charsize = GetCharSizeChoice(tlcharsize); switch ((int) GetChoice(tinout)) { case 0: t->t_inout = TICKS_IN; break; case 1: t->t_inout = TICKS_OUT; break; case 2: t->t_inout = TICKS_BOTH; break; } t->props.color = GetOptionChoice(tgridcol); t->props.linew = GetSpinChoice(tgridlinew); t->props.lines = GetOptionChoice(tgridlines); t->mprops.color = GetOptionChoice(tmgridcol); t->mprops.linew = GetSpinChoice(tmgridlinew); t->mprops.lines = GetOptionChoice(tmgridlines); t->props.size = GetCharSizeChoice(tlen); t->mprops.size = GetCharSizeChoice(tmlen); t->t_autonum = GetChoice(autonum) + 2; t->t_round = GetToggleButtonState(tround); t->props.gridflag = GetToggleButtonState(tgrid); t->mprops.gridflag = GetToggleButtonState(tmgrid); t->t_drawbarcolor = GetOptionChoice(barcolor); t->t_drawbarlinew = GetSpinChoice(barlinew); t->t_drawbarlines = GetOptionChoice(barlines); t->t_spec = GetOptionChoice(specticks); /* only read special info if special ticks used */ if (t->t_spec != TICKS_SPEC_NONE) { t->nticks = (int) GetSpinChoice(nspec); /* ensure that enough tick positions have been specified */ for (i = 0; i < t->nticks; i++) { if (xv_evalexpr(specloc[i], &t->tloc[i].wtpos) == RETURN_SUCCESS) { cp = xv_getstr(speclabel[i]); if (cp[0] == '\0') { t->tloc[i].type = TICK_TYPE_MINOR; } else { t->tloc[i].type = TICK_TYPE_MAJOR; } if (t->t_spec == TICKS_SPEC_BOTH) { t->tloc[i].label = copy_string(t->tloc[i].label, cp); } else { t->tloc[i].label = copy_string(t->tloc[i].label, NULL); } } else { errmsg("Not enough tick locations specified"); free_graph_tickmarks(t); return RETURN_FAILURE; } } } switch (applyto) { case 0: /* current axis */ axis_start = curaxis; axis_stop = curaxis; graph_start = cg; graph_stop = cg; break; case 1: /* all axes, current graph */ axis_start = 0; axis_stop = MAXAXES - 1; graph_start = cg; graph_stop = cg; break; case 2: /* current axis, all graphs */ axis_start = curaxis; axis_stop = curaxis; graph_start = 0; graph_stop = number_of_graphs() - 1; break; case 3: /* all axes, all graphs */ axis_start = 0; axis_stop = MAXAXES - 1; graph_start = 0; graph_stop = number_of_graphs() - 1; break; default: axis_start = curaxis; axis_stop = curaxis; graph_start = cg; graph_stop = cg; break; } if (xv_evalexpr(axis_world_start, &axestart) != RETURN_SUCCESS || xv_evalexpr(axis_world_stop, &axestop) != RETURN_SUCCESS) { errmsg("Axis start/stop values undefined"); free_graph_tickmarks(t); return RETURN_FAILURE; } for (i = graph_start; i <= graph_stop; i++) { for (j = axis_start; j <= axis_stop; j++) { get_graph_world(i, &w); if (is_xaxis(j)) { w.xg1 = axestart; w.xg2 = axestop; } else { w.yg1 = axestart; w.yg2 = axestop; } set_graph_world(i, w); scale = GetOptionChoice(axis_scale); if (is_xaxis(j)) { set_graph_xscale(i, scale); } else { set_graph_yscale(i, scale); } invert = GetToggleButtonState(axis_invert); if (is_xaxis(j)) { set_graph_xinvert(i, invert); } else { set_graph_yinvert(i, invert); } t->tl_op = GetChoice(ticklop); t->t_op = GetChoice(tickop); set_graph_tickmarks(i, j, t); } } free_graph_tickmarks(t); xdrawgraph(); update_ticks(cg); return RETURN_SUCCESS; } /* * This CB services the axis "Scale" selector */ static void axis_scale_cb(int value, void *data) { int scale = value; double major_space, axestart, axestop; int auton; char buf[32]; xv_evalexpr(tmajor, &major_space); xv_evalexpr(axis_world_start, &axestart) ; xv_evalexpr(axis_world_stop, &axestop); auton = GetChoice(autonum) + 2; switch (scale) { case SCALE_NORMAL: if (major_space <= 0.0) { sprintf(buf, "%g", (axestop - axestart)/auton); xv_setstr(tmajor, buf); } break; case SCALE_LOG: if (axestart <= 0.0 && axestop <= 0.0) { errmsg("Can't set logarithmic scale for negative coordinates"); SetOptionChoice(axis_scale, SCALE_NORMAL); return; } else if (axestart <= 0.0) { axestart = axestop/1.0e3; sprintf(buf, "%g", axestart); xv_setstr(axis_world_start, buf); } xv_setstr(tmajor, "10"); SetSpinChoice(nminor, 9); break; case SCALE_LOGIT: if (axestart <= 0.0 && axestop <= 0.0) { errmsg("Can't set logit scale for values outside 0 and 1"); SetOptionChoice(axis_scale, SCALE_NORMAL); return; } if (axestart <= 0.0) { axestart = 0.1; sprintf(buf, "%g", axestart); xv_setstr(axis_world_start, buf); } if (axestop >= 1.0) { axestop = 0.95; sprintf(buf, "%g", axestop); xv_setstr(axis_world_stop, buf); } if (major_space >= 1.0) { xv_setstr(tmajor, "0.6"); } break; } } /* * Fill 'Axes' dialog with values */ void update_ticks(int gno) { tickmarks *t; world w; char buf[128]; int i; if (axes_dialog && XtIsManaged(axes_dialog)) { t = get_graph_tickmarks(gno, curaxis); if (!t) { return; } SetToggleButtonState(axis_active, is_axis_active(gno, curaxis)); if (is_axis_active(gno, curaxis) == FALSE) { SetSensitive(axes_tab, False); } else { SetSensitive(axes_tab, True); } SetOptionChoice(editaxis, curaxis); SetToggleButtonState(axis_zero, is_zero_axis(gno, curaxis)); get_graph_world(gno, &w); if (is_xaxis(curaxis)) { sprintf(buf, "%.9g", w.xg1); xv_setstr(axis_world_start, buf); sprintf(buf, "%.9g", w.xg2); xv_setstr(axis_world_stop, buf); SetOptionChoice(axis_scale, get_graph_xscale(gno)); SetToggleButtonState(axis_invert, is_graph_xinvert(gno)); } else { sprintf(buf, "%.9g", w.yg1); xv_setstr(axis_world_start, buf); sprintf(buf, "%.9g", w.yg2); xv_setstr(axis_world_stop, buf); SetOptionChoice(axis_scale, get_graph_yscale(gno)); SetToggleButtonState(axis_invert, is_graph_yinvert(gno)); } sprintf(buf, "%.4f", t->offsx); xv_setstr(offx, buf); sprintf(buf, "%.4f", t->offsy); xv_setstr(offy, buf); SetChoice(axislabellayout, t->label_layout == LAYOUT_PERPENDICULAR ? 1 : 0); SetOptionChoice(axislabelplace, t->label_place); sprintf(buf, "%.4f", t->label.x); xv_setstr(axislabelspec_para, buf); sprintf(buf, "%.4f", t->label.y); xv_setstr(axislabelspec_perp, buf); SetSensitive(axislabelspec_rc, t->label_place == TYPE_SPEC); SetOptionChoice(axislabelfont, t->label.font); SetOptionChoice(axislabelcolor, t->label.color); SetCharSizeChoice(axislabelcharsize, t->label.charsize); SetChoice(axislabelop, t->label_op); SetToggleButtonState(tlonoff, t->tl_flag); SetToggleButtonState(tonoff, t->t_flag); SetToggleButtonState(baronoff, t->t_drawbar); SetTextString(axislabel, t->label.s); if (is_log_axis(gno, curaxis)) { if (t->tmajor <= 1.0) { t->tmajor = 10.0; } sprintf(buf, "%g", t->tmajor); } else if (is_logit_axis(gno, curaxis)) { if (t->tmajor <= 0.0) { t->tmajor = 0.1; } else if (t->tmajor >= 0.5) { t->tmajor = 0.4; } sprintf(buf, "%g", t->tmajor); } else if (t->tmajor > 0) { sprintf(buf, "%g", t->tmajor); } else { strcpy(buf, "UNDEFINED"); } xv_setstr(tmajor, buf); SetSpinChoice(nminor, t->nminor); SetOptionChoice(tlfont, t->tl_font); SetOptionChoice(tlcolor, t->tl_color); SetChoice(tlskip, t->tl_skip); SetChoice(tlstagger, t->tl_staggered); xv_setstr(tlappstr, t->tl_appstr); xv_setstr(tlprestr, t->tl_prestr); SetChoice(tlstarttype, t->tl_starttype == TYPE_SPEC); if (t->tl_starttype == TYPE_SPEC) { sprintf(buf, "%f", t->tl_start); xv_setstr(tlstart, buf); sprintf(buf, "%f", t->tl_stop); xv_setstr(tlstop, buf); } SetChoice(tlstoptype, t->tl_stoptype == TYPE_SPEC); if (t->tl_stoptype == TYPE_SPEC) { sprintf(buf, "%f", t->tl_stop); xv_setstr(tlstop, buf); } SetOptionChoice(tlform, t->tl_format); SetChoice(ticklop, t->tl_op); SetTextString(tlformula, t->tl_formula); SetChoice(tlprec, t->tl_prec); SetOptionChoice(tlgaptype, t->tl_gaptype); sprintf(buf, "%.4f", t->tl_gap.x); xv_setstr(tlgap_para, buf); sprintf(buf, "%.4f", t->tl_gap.y); xv_setstr(tlgap_perp, buf); SetSensitive(tlgap_rc, t->tl_gaptype == TYPE_SPEC); SetCharSizeChoice(tlcharsize, t->tl_charsize); SetAngleChoice(tlangle, t->tl_angle); switch (t->t_inout) { case TICKS_IN: SetChoice(tinout, 0); break; case TICKS_OUT: SetChoice(tinout, 1); break; case TICKS_BOTH: SetChoice(tinout, 2); break; } SetChoice(tickop, t->t_op); SetOptionChoice(tgridcol, t->props.color); SetSpinChoice(tgridlinew, t->props.linew); SetOptionChoice(tgridlines, t->props.lines); SetOptionChoice(tmgridcol, t->mprops.color); SetSpinChoice(tmgridlinew, t->mprops.linew); SetOptionChoice(tmgridlines, t->mprops.lines); SetCharSizeChoice(tlen, t->props.size); SetCharSizeChoice(tmlen, t->mprops.size); SetChoice(autonum, t->t_autonum - 2); SetToggleButtonState(tround, t->t_round); SetToggleButtonState(tgrid, t->props.gridflag); SetToggleButtonState(tmgrid, t->mprops.gridflag); SetOptionChoice(barcolor, t->t_drawbarcolor); SetSpinChoice(barlinew, t->t_drawbarlinew); SetOptionChoice(barlines, t->t_drawbarlines); SetOptionChoice(specticks, t->t_spec); SetSpinChoice(nspec, t->nticks); for (i = 0; i < t->nticks; i++) { sprintf(buf, "%.9g", t->tloc[i].wtpos); xv_setstr(specloc[i], buf); if (t->tloc[i].type == TICK_TYPE_MAJOR) { xv_setstr(speclabel[i], t->tloc[i].label); } else { xv_setstr(speclabel[i], ""); } } } } static void set_active_proc(int onoff, void *data) { SetSensitive(axes_tab, onoff); } static void set_axis_proc(int value, void *data) { curaxis = value; update_ticks(cg); } static void auto_spec_cb(int value, void *data) { Widget rc = (Widget) data; SetSensitive(rc, value); } grace-5.1.23/src/noxprotos.h0000644000076500001440000002674211014400276015451 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Prototypes not involving X * */ #ifndef __NOXPROTOS_H_ #define __NOXPROTOS_H_ /* For FILE */ #include #include "defines.h" #include "graphs.h" int filter_set(int gno, int setno, char *rarray); void do_fourier_command(int gno, int setno, int ftype, int ltype); int do_compute(int gno, int setno, int graphto, int loadto, char *rarray, char *fstr); double trapint(double *x, double *y, double *resx, double *resy, int n); void do_digfilter(int set1, int set2); void do_linearc(int gno1, int set1, int gno2, int set2); void do_xcor(int gno1, int set1, int gno2, int set2, int lag, int covar); double do_int(int gno, int setno, int itype); void do_differ(int gno, int setno, int itype); void do_regress(int gno, int setno, int ideg, int iresid, int rno, int invr, int rset); void do_runavg(int gno, int setno, int runlen, int runtype, int rno, int invr); void do_fourier(int gno, int setno, int fftflag, int load, int loadx, int invflag, int type, int wind); void do_window(int setno, int type, int wind); void apply_window(double *xx, double *yy, int ilen, int type, int wind); int do_histo(int fromgraph, int fromset, int tograph, int toset, double *bins, int nbins, int cumulative, int normalize); int histogram(int ndata, double *data, int nbins, double *bins, int *hist); void do_sample(int setno, int typeno, char *exprstr, int startno, int stepno); void do_prune(int setno, int typeno, int deltatypeno, float deltax, float deltay, int dxtype, int dytype); void set_program_defaults(void); void set_region_defaults(int i); void set_default_framep(framep * f); void set_default_world(world * w); void set_default_view(view * v); void set_default_string(plotstr * s); void set_default_arrow(Arrow *arrowp); void set_default_line(linetype * l); void set_default_box(boxtype * b); void set_default_ellipse(ellipsetype * b); void set_default_legend(int gno, legend * l); void set_default_plotarr(plotarr * p); void set_default_graph(int gno); int realloc_lines(int n); int realloc_boxes(int n); int realloc_ellipses(int n); int realloc_strings(int n); void set_default_ticks(tickmarks *t); void calculate_tickgrid(int gno); void drawgrid(int gno); void drawaxes(int gno); void unregister_real_time_input(const char *name); int register_real_time_input(int fd, const char *name, int reopen); int real_time_under_monitoring(void); int monitor_input(Input_buffer *tbl, int tblsize, int no_wait); void stasum(double *x, int n, double *xbar, double *sd); double leasev(double *c, int degree, double x); int fitcurve(double *x, double *y, int n, int ideg, double *fitted); void runavg(double *x, double *y, double *ax, double *ay, int n, int ilen); void runstddev(double *x, double *y, double *ax, double *ay, int n, int ilen); void runmedian(double *x, double *y, double *ax, double *ay, int n, int ilen); void runminmax(double *x, double *y, double *ax, double *ay, int n, int ilen, int type); void filterser(int n, double *x, double *y, double *resx, double *resy, double *h, int len); void linearconv(double *x, double *h, double *y, int n, int m); int crosscorr(double *x, double *y, int n, int maxlag, int covar, double *xres); int transfit(int type, int n, double *x, double *y, double *fitted); int linear_regression(int n, double *x, double *y, double *fitted); void spline(int n, double *x, double *y, double *b, double *c, double *d); void aspline(int n, double *x, double *y, double *b, double *c, double *d); int seval(double *u, double *v, int ulen, double *x, double *y, double *b, double *c, double *d, int n); void dft(double *jr, double *ji, int n, int iflag); void fft(double *real_data, double *imag_data, int n_pts, int nu, int inv); float humlik(const float x, const float y); void putparms(int gno, FILE * pp, int embed); void put_fitparms(FILE * pp, int embed); void get_graph_box(int i, boxtype * b); void get_graph_line(int i, linetype * l); void get_graph_ellipse(int i, ellipsetype * e); void get_graph_string(int i, plotstr * s); void set_graph_box(int i, boxtype *b); void set_graph_line(int i, linetype *l); void set_graph_string(int i, plotstr *s); void set_graph_ellipse(int i, ellipsetype * e); char *object_types(int type); void pop_world(void); void define_autos(int aon, int au, int ap); int find_item(int gno, VPoint vp, view *bb, int *type, int *id); int is_valid_line(int line); int is_valid_box(int box); int is_valid_ellipse(int ellipse); int is_valid_string(int string); int isactive_line(int lineno); int isactive_box(int boxno); int isactive_ellipse(int ellipno); int isactive_string(int strno); int next_line(void); int next_box(void); int next_ellipse(void); int next_string(void); void kill_box(int boxno); void kill_ellipse(int ellipseno); void kill_line(int lineno); void kill_string(int stringno); void copy_object(int type, int from, int to); int kill_object(int type, int id); int next_object(int type); int duplicate_object(int type, int id); int get_object_bb(int type, int id, view *bb); void move_object(int type, int id, VVector shift); int number_of_boxes(void); int number_of_ellipses(void); int number_of_lines(void); int number_of_strings(void); void init_string(int id, VPoint vp); void init_line(int id, VPoint vp1, VPoint vp2); void init_box(int id, VPoint vp1, VPoint vp2); void init_ellipse(int id, VPoint vp1, VPoint vp2); void do_clear_lines(void); void do_clear_boxes(void); void do_clear_text(void); void do_clear_ellipses(void); int getsetminmax(int gno, int setno, double *x1, double *x2, double *y1, double *y2); int getsetminmax_c(int gno, int setno, double *xmin, double *xmax, double *ymin, double *ymax, int ivec); void minmax(double *x, int n, double *xmin, double *xmax, int *imin, int *imax); int minmaxrange(double *bvec, double *vec, int n, double bvmin, double bvmax, double *vmin, double *vmax); double vmin(double *x, int n); double vmax(double *x, int n); int set_point(int gno, int setn, int seti, WPoint wp); int get_point(int gno, int setn, int seti, WPoint *wp); int get_datapoint(int gno, int setn, int seti, int *ncols, Datapoint *wp); void setcol(int gno, int setno, int col, double *x, int len); void copycol2(int gfrom, int setfrom, int gto, int setto, int col); #define copyx(gno, setfrom, setto) copycol2(gno, setfrom, gno, setto, 0) #define copyy(gno, setfrom, setto) copycol2(gno, setfrom, gno, setto, 1) void packsets(int gno); int nextset(int gno); void killset(int gno, int setno); void killsetdata(int gno, int setno); int number_of_active_sets(int gno); int swapset(int gfrom, int j1, int gto, int j2); int pushset(int gno, int setno, int push_type); void droppoints(int gno, int setno, int startno, int endno); int join_sets(int gno, int *sets, int nsets); void sort_xy(double *tmp1, double *tmp2, int up, int sorton, int stype); void reverse_set(int gno, int setno); void del_point(int gno, int setno, int pt); void add_point(int gno, int setno, double px, double py); void zero_datapoint(Datapoint *dpoint); int add_point_at(int gno, int setno, int ind, const Datapoint *dpoint); void delete_byindex(int gno, int setno, int *ind); int do_copyset(int gfrom, int j1, int gto, int j2); int do_moveset(int gfrom, int j1, int gto, int j2); int do_swapset(int gno1, int setno1, int gno2, int setno2); void do_splitsets(int gno, int setno, int lpart); void do_activate(int setno, int type, int len); void do_hideset(int gno, int setno); void do_showset(int gno, int setno); void do_changetype(int setno, int type); void do_copy(int j1, int gfrom, int j2, int gto); void do_move(int j1, int gfrom, int j2, int gto); void do_drop_points(int gno, int setno, int startno, int endno); void do_kill(int gno, int setno, int soft); void do_sort(int setno, int sorton, int stype); void do_cancel_pickop(void); void set_hotlink(int gno, int setno, int onoroff, char *fname, int src); int is_hotlinked(int gno, int setno); void do_update_hotlink(int gno, int setno); char *get_hotlink_file(int gno, int setno); int get_hotlink_src(int gno, int setno); void sortset(int gno, int setno, int sorton, int stype); void do_seasonal_diff(int setno, int period); int do_nonlfit(int gno, int setno, double *warray, char *rarray, int nsteps); int do_interp(int gno_src, int setno_src, int gno_dest, int setno_dest, double *mesh, int meshlen, int method, int strict); int get_restriction_array(int gno, int setno, int rtype, int negate, char **rarray); int monotonicity(double *array, int len, int strict); int find_span_index(double *array, int len, int m, double x); int inbounds(int gno, double x, double y); int intersect_to_left(double x, double y, double x1, double y1, double x2, double y2); int inbound(double x, double y, double *xlist, double *ylist, int n); int isleft(double x, double y, double x1, double y1, double x2, double y2); int isright(double x, double y, double x1, double y1, double x2, double y2); int isabove(double x, double y, double x1, double y1, double x2, double y2); int isbelow(double x, double y, double x1, double y1, double x2, double y2); void reporton_region(int gno, int rno, int type); int isactive_region(int regno); char *region_types(int it, int which); void kill_region(int r); void kill_all_regions(void); void activate_region(int r, int type, int gno); void load_poly_region(int r, int gno, int n, WPoint *wps); int inregion(int regno, double x, double y); void set_plotstr_string(plotstr * pstr, char *buf); void cli_loop(void); void initialize_nonl(void); void reset_nonl(void); int is_xaxis(int axis); int is_yaxis(int axis); int is_log_axis(int gno, int axis); int is_logit_axis(int gno, int axis); void kill_blockdata(void); void alloc_blockdata(int ncols); void set_ref_date(double ref); double get_ref_date(void); void set_date_hint(Dates_format preferred); Dates_format get_date_hint(void); void allow_two_digits_years(int allowed); int two_digits_years_allowed(void); void set_wrap_year(int year); int get_wrap_year(void); long cal_to_jul(int y, int m, int d); void jul_to_cal(long n, int *y, int *m, int *d); double jul_and_time_to_jul(long jul, int hour, int min, double sec); double cal_and_time_to_jul(int y, int m, int d, int hour, int min, double sec); void jul_to_cal_and_time(double jday, int rounding, int *y, int *m, int *d, int *hour, int *min, int *sec); int parse_float(const char *s, double *value, const char **after); int parse_date(const char* s, Dates_format preferred, int absolute, double *jul, Dates_format *recognized); int parse_date_or_number(const char* s, int absolute, double *value); #endif /* __NOXPROTOS_H_ */ grace-5.1.23/src/XMgrace.ad0000644000076500001440000000160310102537530015047 0ustar fnevgenyusers! ! X defaults for xmgrace ! !XMgrace*fontList: -adobe-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-* ! Fixed font for "Results" window !XMgrace*background: #e5e5e5e5e5e5 !XMgrace*XmPushButton*background: #b0b0c4c4dede !XMgrace*XmArrowButton*background: #b0b0c4c4dede !XMgrace*XmText*background: #ceb8e75be75b !XMgrace*XmMenuShell*background: #cccccccccccc !XMgrace*XmToggleButton.fillOnSelect: True !XMgrace*XmToggleButton.selectColor: red !XMgrace*XmSeparator.margin: 0 ! Disable tear-off menus !XMgrace*menuBar*tearOffModel: XmTEAR_OFF_DISABLED ! Use GXinvert rather than GXxor for rubberband lines ! if the rubberbanding for zooms and lines, etc. doesn't ! appear on the canvas, set the following resource to no. !XMgrace.invertDraw: True ! Allow double clicks on canvas !XMgrace.allowDoubleClick: No ! Switch toolbar(s) off !XMgrace*toolBar: Off !XMgrace*statusBar: Off !XMgrace*locatorBar: Off grace-5.1.23/src/objutils.c0000644000076500001440000003521011004675676015233 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * operations on objects (strings, lines, and boxes) * */ #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "protos.h" static int maxboxes = 0; static int maxlines = 0; static int maxstr = 0; static int maxellipses = 0; int number_of_lines(void) { return maxlines; } int number_of_boxes(void) { return maxboxes; } int number_of_ellipses(void) { return maxellipses; } int number_of_strings(void) { return maxstr; } int is_valid_line(int line) { return (line >= 0 && line < maxlines); } int is_valid_box(int box) { return (box >= 0 && box < maxboxes); } int is_valid_ellipse(int ellipse) { return (ellipse >= 0 && ellipse < maxellipses); } int is_valid_string(int string) { return (string >= 0 && string < maxstr); } void move_object(int type, int id, VVector shift) { double xtmp, ytmp; boxtype box; ellipsetype ellipse; linetype line; plotstr str; switch (type) { case OBJECT_BOX: if (isactive_box(id)) { get_graph_box(id, &box); if (box.loctype == COORD_VIEW) { box.x1 += shift.x; box.y1 += shift.y; box.x2 += shift.x; box.y2 += shift.y; } else { world2view(box.x1, box.y1, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &box.x1, &box.y1); world2view(box.x2, box.y2, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &box.x2, &box.y2); } set_graph_box(id, &box); set_dirtystate(); } break; case OBJECT_ELLIPSE: if (isactive_ellipse(id)) { get_graph_ellipse(id, &ellipse); if (ellipse.loctype == COORD_VIEW) { ellipse.x1 += shift.x; ellipse.y1 += shift.y; ellipse.x2 += shift.x; ellipse.y2 += shift.y; } else { world2view(ellipse.x1, ellipse.y1, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &ellipse.x1, &ellipse.y1); world2view(ellipse.x2, ellipse.y2, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &ellipse.x2, &ellipse.y2); } set_graph_ellipse(id, &ellipse); set_dirtystate(); } break; case OBJECT_LINE: if (isactive_line(id)) { get_graph_line(id, &line); if (line.loctype == COORD_VIEW) { line.x1 += shift.x; line.y1 += shift.y; line.x2 += shift.x; line.y2 += shift.y; } else { world2view(line.x1, line.y1, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &line.x1, &line.y1); world2view(line.x2, line.y2, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &line.x2, &line.y2); } set_graph_line(id, &line); set_dirtystate(); } break; case OBJECT_STRING: if (isactive_string(id)) { get_graph_string(id, &str); if (str.loctype == COORD_VIEW) { str.x += shift.x; str.y += shift.y; } else { world2view(str.x, str.y, &xtmp, &ytmp); xtmp += shift.x; ytmp += shift.y; view2world(xtmp, ytmp, &str.x, &str.y); } set_graph_string(id, &str); set_dirtystate(); } break; } } int isactive_line(int lineno) { if (is_valid_line(lineno)) { return lines[lineno].active; } else { return FALSE; } } int isactive_box(int boxno) { if (is_valid_box(boxno)) { return boxes[boxno].active; } else { return FALSE; } } int isactive_ellipse(int ellipno) { if (is_valid_ellipse(ellipno)) { return ellip[ellipno].active; } else { return FALSE; } } int isactive_string(int strno) { if (is_valid_string(strno) && pstr[strno].s && pstr[strno].s[0]) { return TRUE; } else { return FALSE; } } int next_line(void) { int i, maxold; for (i = 0; i < maxlines; i++) { if (!isactive_line(i)) { lines[i].active = TRUE; set_dirtystate(); return (i); } } maxold = maxlines; if (realloc_lines(maxlines + OBJECT_BUFNUM) == RETURN_SUCCESS) { return maxold; } else { errmsg("Error - no lines available"); return (-1); } } int next_box(void) { int i, maxold; for (i = 0; i < maxboxes; i++) { if (!isactive_box(i)) { boxes[i].active = TRUE; set_dirtystate(); return (i); } } maxold = maxboxes; if (realloc_boxes(maxboxes + OBJECT_BUFNUM) == RETURN_SUCCESS) { return maxold; } else { errmsg("Error - no boxes available"); return (-1); } } int next_string(void) { int i, maxold; for (i = 0; i < maxstr; i++) { if (!isactive_string(i)) { set_dirtystate(); return (i); } } maxold = maxstr; if (realloc_strings(maxstr + OBJECT_BUFNUM) == RETURN_SUCCESS) { return maxold; } else { errmsg("Error - no strings available"); return (-1); } } int next_ellipse(void) { int i, maxold; for (i = 0; i < maxellipses; i++) { if (!isactive_ellipse(i)) { ellip[i].active = TRUE; set_dirtystate(); return (i); } } maxold = maxellipses; if (realloc_ellipses(maxellipses + OBJECT_BUFNUM) == RETURN_SUCCESS) { return maxold; } else { errmsg("Error - no ellipses available"); return (-1); } } int next_object(int type) { switch (type) { case OBJECT_BOX: return next_box(); break; case OBJECT_ELLIPSE: return next_ellipse(); break; case OBJECT_LINE: return next_line(); break; case OBJECT_STRING: return next_string(); break; default: return -1; break; } } int kill_object(int type, int id) { switch (type) { case OBJECT_BOX: kill_box(id); break; case OBJECT_ELLIPSE: kill_ellipse(id); break; case OBJECT_LINE: kill_line(id); break; case OBJECT_STRING: kill_string(id); break; default: return RETURN_FAILURE; break; } return RETURN_SUCCESS; } void copy_object(int type, int from, int to) { switch (type) { case OBJECT_BOX: boxes[to] = boxes[from]; break; case OBJECT_ELLIPSE: ellip[to] = ellip[from]; break; case OBJECT_LINE: lines[to] = lines[from]; break; case OBJECT_STRING: kill_string(to); pstr[to] = pstr[from]; pstr[to].s = copy_string(NULL, pstr[from].s); break; } set_dirtystate(); } int duplicate_object(int type, int id) { int newid; if ((newid = next_object(type)) >= 0) { copy_object(type, id, newid); } else { newid = -1; } return newid; } void kill_box(int boxno) { boxes[boxno].active = FALSE; set_dirtystate(); } void kill_ellipse(int ellipseno) { ellip[ellipseno].active = FALSE; set_dirtystate(); } void kill_line(int lineno) { lines[lineno].active = FALSE; set_dirtystate(); } void kill_string(int stringno) { XCFREE(pstr[stringno].s); pstr[stringno].active = FALSE; set_dirtystate(); } int get_object_bb(int type, int id, view *bb) { switch (type) { case OBJECT_BOX: *bb = boxes[id].bb; break; case OBJECT_ELLIPSE: *bb = ellip[id].bb; break; case OBJECT_LINE: *bb = lines[id].bb; break; case OBJECT_STRING: *bb = pstr[id].bb; break; default: return RETURN_FAILURE; break; } return RETURN_SUCCESS; } void set_plotstr_string(plotstr *pstr, char *buf) { pstr->s = copy_string(pstr->s, buf); } void init_line(int id, VPoint vp1, VPoint vp2) { if (id < 0 || id > number_of_lines()) { return; } lines[id].active = TRUE; lines[id].color = line_color; lines[id].lines = line_lines; lines[id].linew = line_linew; lines[id].loctype = line_loctype; if (line_loctype == COORD_VIEW) { lines[id].x1 = vp1.x; lines[id].y1 = vp1.y; lines[id].x2 = vp2.x; lines[id].y2 = vp2.y; lines[id].gno = -1; } else { lines[id].gno = get_cg(); view2world(vp1.x, vp1.y, &lines[id].x1, &lines[id].y1); view2world(vp2.x, vp2.y, &lines[id].x2, &lines[id].y2); } lines[id].arrow_end = line_arrow_end; set_default_arrow(&lines[id].arrow); set_dirtystate(); } void init_box(int id, VPoint vp1, VPoint vp2) { if (id < 0 || id > number_of_boxes()) { return; } boxes[id].color = box_color; boxes[id].fillcolor = box_fillcolor; boxes[id].fillpattern = box_fillpat; boxes[id].lines = box_lines; boxes[id].linew = box_linew; boxes[id].loctype = box_loctype; boxes[id].active = TRUE; if (box_loctype == COORD_VIEW) { boxes[id].x1 = vp1.x; boxes[id].y1 = vp1.y; boxes[id].x2 = vp2.x; boxes[id].y2 = vp2.y; boxes[id].gno = -1; } else { boxes[id].gno = get_cg(); view2world(vp1.x, vp1.y, &boxes[id].x1, &boxes[id].y1); view2world(vp2.x, vp2.y, &boxes[id].x2, &boxes[id].y2); } set_dirtystate(); } void init_ellipse(int id, VPoint vp1, VPoint vp2) { if (id < 0 || id > number_of_ellipses()) { return; } ellip[id].color = ellipse_color; ellip[id].fillcolor = ellipse_fillcolor; ellip[id].fillpattern = ellipse_fillpat; ellip[id].lines = ellipse_lines; ellip[id].linew = ellipse_linew; ellip[id].loctype = ellipse_loctype; ellip[id].active = TRUE; if (ellipse_loctype == COORD_VIEW) { ellip[id].x1 = vp1.x; ellip[id].y1 = vp1.y; ellip[id].x2 = vp2.x; ellip[id].y2 = vp2.y; ellip[id].gno = -1; } else { ellip[id].gno = get_cg(); view2world(vp1.x, vp1.y, &ellip[id].x1, &ellip[id].y1); view2world(vp2.x, vp2.y, &ellip[id].x2, &ellip[id].y2); } set_dirtystate(); } void init_string(int id, VPoint vp) { if (id < 0 || id > number_of_strings()) { return; } pstr[id].s = copy_string(NULL, "\0"); pstr[id].font = string_font; pstr[id].color = string_color; pstr[id].rot = string_rot; pstr[id].charsize = string_size; pstr[id].loctype = string_loctype; pstr[id].just = string_just; pstr[id].active = TRUE; if (string_loctype == COORD_VIEW) { pstr[id].x = vp.x; pstr[id].y = vp.y; pstr[id].gno = -1; } else { pstr[id].gno = get_cg(); view2world(vp.x, vp.y, &pstr[id].x, &pstr[id].y); } set_dirtystate(); } void do_clear_lines(void) { int i; for (i = 0; i < maxlines; i++) { kill_line(i); } } void do_clear_boxes(void) { int i; for (i = 0; i < maxboxes; i++) { kill_box(i); } } void do_clear_ellipses(void) { int i; for (i = 0; i < maxellipses; i++) { kill_ellipse(i); } } void do_clear_text(void) { int i; for (i = 0; i < maxstr; i++) { kill_string(i); } } int realloc_lines(int n) { int i; void *ptmp; if (n > maxlines) { ptmp = xrealloc(lines, n * sizeof(linetype)); if (ptmp != NULL) { lines = ptmp; for (i = maxlines; i < n; i++) { set_default_line(&lines[i]); } maxlines = n; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } return RETURN_SUCCESS; } int realloc_boxes(int n) { int i; void *ptmp; if (n > maxboxes) { ptmp = xrealloc(boxes, n * sizeof(boxtype)); if (ptmp != NULL) { boxes = ptmp; for (i = maxboxes; i < n; i++) { set_default_box(&boxes[i]); } maxboxes = n; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } return RETURN_SUCCESS; } int realloc_ellipses(int n) { int i; void *ptmp; if (n > maxellipses) { ptmp = xrealloc(ellip, n * sizeof(ellipsetype)); if (ptmp != NULL) { ellip = ptmp; for (i = maxellipses; i < n; i++) { set_default_ellipse(&ellip[i]); } maxellipses = n; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } return RETURN_SUCCESS; } int realloc_strings(int n) { int i; void *ptmp; if (n > maxstr) { ptmp = xrealloc(pstr, n * sizeof(plotstr)); if (ptmp != NULL) { pstr = ptmp; for (i = maxstr; i < n; i++) { set_default_string(&pstr[i]); } maxstr = n; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } return RETURN_SUCCESS; } void get_graph_box(int i, boxtype * b) { memcpy(b, &boxes[i], sizeof(boxtype)); } void get_graph_ellipse(int i, ellipsetype * b) { memcpy(b, &ellip[i], sizeof(ellipsetype)); } void get_graph_line(int i, linetype * l) { memcpy(l, &lines[i], sizeof(linetype)); } void get_graph_string(int i, plotstr * s) { memcpy(s, &pstr[i], sizeof(plotstr)); } void set_graph_box(int i, boxtype * b) { memcpy(&boxes[i], b, sizeof(boxtype)); } void set_graph_line(int i, linetype * l) { memcpy(&lines[i], l, sizeof(linetype)); } void set_graph_ellipse(int i, ellipsetype * e) { memcpy(&ellip[i], e, sizeof(ellipsetype)); } void set_graph_string(int i, plotstr * s) { memcpy(&pstr[i], s, sizeof(plotstr)); } char *object_types(int type) { char *stype; switch (type) { case OBJECT_LINE: stype = "line"; break; case OBJECT_BOX: stype = "box"; break; case OBJECT_ELLIPSE: stype = "ellipse"; break; case OBJECT_STRING: stype = "string"; break; default: stype = ""; break; } return stype; } grace-5.1.23/src/Tab.c0000644000076500001440000007161710124376046014110 0ustar fnevgenyusers /************************************************************************* * Version 1.1 on July-30-1997 * (c) 1997 Pralay Dakua (pkanti@hotmail.com) * * This is a free software and permission to use, modify, distribute, * selling and using for commercial purpose is hereby granted provided * that THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE * INCLUDED IN ALL COPIES AND THEIR SUPPORTING DOCUMENTATIONS. * * There is no warranty for this software. In no event Pralay Dakua * will be liable for merchantability and fitness of the software and * damages due to this software. * * Author: * Pralay Dakua (pkanti@hotmail.com) * **************************************************************************/ #include "TabP.h" static void Initialize(Widget,Widget,ArgList,Cardinal*); static void Destroy(Widget); static void Resize(Widget); static void ReDisplay(Widget, XEvent*, Region); static Boolean SetValues(Widget,Widget, Widget,ArgList,Cardinal*); static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry*, XtWidgetGeometry*); static XtGeometryResult GeometryManager(Widget, XtWidgetGeometry*, XtWidgetGeometry*); static void ChangeManaged(Widget); static void InsertChild(Widget); static void DeleteChild(Widget); static void Constraint_Initialize(Widget,Widget,ArgList,Cardinal*); static Boolean Constraint_SetValues(Widget,Widget, Widget,ArgList,Cardinal*); static void Constraint_Destroy(Widget); static void Layout(XmTabWidget); static void draw_tabs(XmTabWidget); static void compute_tab_rects(XmTabWidget); static Widget search_tab(XmTabWidget, XEvent*); static void change_tab(XmTabWidget, Widget); static void create_gc(XmTabWidget); static void change_gc(XmTabWidget); static void configure_children(XmTabWidget); static void get_children_space(XmTabWidget, Dimension*, Dimension*, Dimension*); void DrawShadowLines(Display*, Drawable, GC, XPoint*, int, Dimension); #define offset(field) XtOffsetOf(XmTabRec, field) #define ACTIONPROC(proc) static void proc(Widget,XEvent*,String*,Cardinal*) #define MANAGE(w) w->core.managed = True #define UNMANAGE(w) w->core.managed = False ACTIONPROC(ClickAction); static XtResource resources[]={ { XmNvalueChangedCallback, XmCValueChangedCallback, XtRCallback, sizeof(XtPointer), offset(tab.value_changed_callback), XtRCallback, NULL }, { XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList), offset(tab.tab_font_list), XmRString, "fixed" }, { XmNresizeChildren, XmCResizeChildren, XmRBoolean, sizeof(Boolean), offset(tab.resize_children), XmRImmediate, (XtPointer)True }, { XmNshadowThickness, XmCShadowThickness, XmRDimension, sizeof(Dimension), offset(manager.shadow_thickness), XmRString, "2" }, { XmNmarginWidth, XmCMarginWidth, XmRDimension, sizeof(Dimension), offset(tab.margin_width), XmRString, "3" }, { XmNmarginHeight, XmCMarginHeight, XmRDimension, sizeof(Dimension), offset(tab.margin_height), XmRString, "3" } }; static XtResource constraint_resources[]={ { XmNtabLabel, XmCTabLabel, XmRXmString, sizeof(XmString), XtOffsetOf(XmTabConstraintRec, tab.tab_label), XmRImmediate, (XtPointer)NULL } }; static XtActionsRec actions[] = { {"ClickAction",ClickAction} }; static char translations[] = ": ClickAction()"; XmTabClassRec xmTabClassRec={ { /***** core class ******/ (WidgetClass) &xmManagerClassRec, /* super class */ "XmTab", /* class name */ sizeof(XmTabRec), /* widget size */ NULL, /* class initialize */ NULL, /* class part initialize */ False, /* class inited */ (XtInitProc)Initialize, /* initialize */ NULL, /* initialize hook */ XtInheritRealize, /* realize */ actions, /* actions */ XtNumber(actions), /* num actions */ resources, /* resources */ XtNumber(resources), /* num resources */ NULLQUARK, /* xrm class */ True, /* compress motion */ XtExposeCompressMultiple, /* compress exposure */ False, /* compress enter leave */ False, /* visible interest */ (XtWidgetProc)Destroy, /* destroy */ (XtWidgetProc)Resize, /* resize */ (XtExposeProc)ReDisplay, /* expose */ (XtSetValuesFunc)SetValues, /* set values */ NULL, /* set values hook */ XtInheritSetValuesAlmost, /* set values almost */ NULL, /* get values hook */ XtInheritAcceptFocus, /* accept focus */ XtVersion, /* version */ NULL, /* callback private */ translations, /* tm table */ (XtGeometryHandler)QueryGeometry, /* query geometry */ XtInheritDisplayAccelerator, /* display accelerator */ NULL /* extension */ }, { /***** composite class part *****/ (XtGeometryHandler)GeometryManager, /* geomerty manager */ (XtWidgetProc)ChangeManaged, /* change managed */ InsertChild, /* XtInheritInsertChild, insert child */ DeleteChild, /* XtInheritDeleteChild delete child */ NULL /* extension */ }, { /**** Constraint Class Part *****/ constraint_resources, /* constraint resource list */ XtNumber(constraint_resources), /* number of constraints in list */ sizeof(XmTabConstraintRec), /* size of constraint record */ (XtInitProc)Constraint_Initialize, /* constraint initialization */ (XtWidgetProc)Constraint_Destroy, /* constraint destroy proc */ (XtSetValuesFunc)Constraint_SetValues, /* constraint set_values proc */ NULL /* pointer to extension record */ }, { /****** Manager Class Part *****/ NULL, /* translations */ NULL, /* syn_resources */ 0, /* num_syn_resources */ NULL, /* syn_constraint_resources */ 0, /* num_syn_constraint_resources */ XmInheritParentProcess, /* parent_process */ NULL /* extension */ }, { /******* Tab Class Part ******/ NULL /* extension */ } }; WidgetClass xmTabWidgetClass=(WidgetClass) &xmTabClassRec; static XmManagerClassRec *SuperClass = (XmManagerClassRec*) &xmManagerClassRec; /*********************** Actions *******************************/ static void ClickAction(Widget w, XEvent *event, String *params,Cardinal *nparams) { XmTabWidget wid = (XmTabWidget)w; Widget tab_wid; XmTabCallbackStruct call_data; XmTabConstraintRec *tab_constraint; tab_wid = search_tab(wid, event); if(!tab_wid) return; change_tab(wid, tab_wid); draw_tabs(wid); tab_constraint = (XmTabConstraintRec *) tab_wid->core.constraints; call_data.reason = XmCR_VALUE_CHANGED; call_data.tab_child = tab_wid; call_data.event = event; if( tab_constraint->tab.tab_label ) { call_data.tab_label = XmStringCopy(tab_constraint->tab.tab_label); } else { call_data.tab_label = XmStringCreateLocalized(XtName(tab_wid));; } XtCallCallbacks(w, XmNvalueChangedCallback, &call_data); XmStringFree(call_data.tab_label); } /*********************** end of Actions **************************/ /********************** Core Class Methods **********************/ static void Initialize(Widget treq,Widget tnew,ArgList args,Cardinal *nargs) { XmTabWidget wid = (XmTabWidget) tnew; wid->tab.raise = 0; wid->tab.cut_size = 0; wid->tab.active_tab = NULL; create_gc(wid); } static void Resize(Widget w) { XmTabWidget wid = (XmTabWidget)w; Layout(wid); draw_tabs(wid); } static void ReDisplay(Widget w, XEvent *event, Region region) { XmTabWidget wid = (XmTabWidget)w; draw_tabs(wid); } static void Destroy(Widget w) { /* * XmTabWidget wid = (XmTabWidget)w; */ } static Boolean SetValues(Widget current,Widget request, Widget new, ArgList args,Cardinal *nargs) { XmTabWidget curw = (XmTabWidget) current; XmTabWidget neww = (XmTabWidget) new; Boolean redraw = False; if((curw->tab.margin_width != neww->tab.margin_width) || (curw->tab.margin_height != neww->tab.margin_height)) { Layout(neww); redraw = True; } else if( curw->manager.shadow_thickness != neww->manager.shadow_thickness) { Layout(neww); redraw = True; } else if( curw->tab.tab_font_list != neww->tab.tab_font_list) { Layout(neww); redraw = True; } else if( curw->tab.resize_children != neww->tab.resize_children) { Layout(neww); } if(curw->manager.foreground != neww->manager.foreground) { change_gc(neww); redraw = True; } return(redraw); } static XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply) { XmTabWidget wid = (XmTabWidget)w; Dimension extra_width, extra_height; Dimension width, height, rect_space; Dimension own_width; XtGeometryResult ret_val = XtGeometryNo; compute_tab_rects(wid); extra_width = 2*(wid->tab.margin_width + wid->manager.shadow_thickness +1); extra_height = wid->tab.tab_height + 2*(wid->tab.margin_height + wid->manager.shadow_thickness +1); reply->request_mode = 0; if( request->request_mode & CWX ) { reply->request_mode |= CWX; reply->x = request->x; ret_val = XtGeometryYes; } if( request->request_mode & CWY ) { reply->request_mode |= CWY; reply->y = request->y; ret_val = XtGeometryYes; } if( request->request_mode & CWSibling ) { reply->request_mode |= CWSibling; reply->sibling = request->sibling; ret_val = XtGeometryYes; } if( request->request_mode & CWBorderWidth ) { reply->request_mode |= CWBorderWidth; reply->border_width = request->border_width; ret_val = XtGeometryYes; } if( request->request_mode & CWStackMode ) { reply->request_mode |= CWStackMode; reply->stack_mode = request->stack_mode; ret_val = XtGeometryYes; } get_children_space(wid, &width, &height, &rect_space); rect_space = rect_space + wid->manager.shadow_thickness + 2*wid->tab.margin_width; own_width = width + extra_width; if(own_width < rect_space) own_width = rect_space; if( (request->request_mode & CWWidth) || (request->request_mode == 0)) { reply->request_mode |= CWWidth; reply->width = own_width; ret_val = XtGeometryAlmost; } if( (request->request_mode & CWHeight) || (request->request_mode == 0)) { reply->request_mode |= CWHeight; reply->height = height + extra_height; ret_val = XtGeometryAlmost; } return(ret_val); } /********************** end of Core Class Methods ***************/ /********************** Composite Methods ***********************/ static XtGeometryResult GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply) { XmTabWidget wid = (XmTabWidget)w->core.parent; XtGeometryResult ret_val = XtGeometryNo; Dimension extra_width, extra_height; reply->request_mode = 0; if(request->request_mode & CWWidth) { extra_width = 2*(wid->tab.margin_width + wid->manager.shadow_thickness + 1); if(request->width > (wid->core.width - extra_width)) { reply->width = wid->core.width - extra_width; ret_val = XtGeometryNo; /* * reply->request_mode |= CWWidth; */ } else { reply->width = request->width; ret_val = XtGeometryYes; } reply->request_mode |= CWWidth; } if(request->request_mode & CWHeight) { extra_height = wid->tab.tab_height + 2*(wid->tab.margin_height + wid->manager.shadow_thickness + 1); if(request->height > (wid->core.height - extra_height)) { reply->height = wid->core.height - extra_height; ret_val = XtGeometryNo; } else { reply->height = request->height; ret_val = XtGeometryYes; } reply->request_mode |= CWHeight; } return(ret_val); } static void ChangeManaged(Widget w) { XmTabWidget wid = (XmTabWidget)w; Widget child; int i; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; child->core.mapped_when_managed = True; if(child == wid->tab.active_tab) { MANAGE(child); } else { UNMANAGE(child); } } Layout(wid); draw_tabs(wid); } static void InsertChild(Widget w) { XmTabWidget wid = (XmTabWidget)w->core.parent; (*SuperClass->composite_class.insert_child)(w); if(wid->composite.num_children == 1) wid->tab.active_tab = w; } static void DeleteChild(Widget w) { XmTabWidget wid = (XmTabWidget)w->core.parent; (*SuperClass->composite_class.delete_child)(w); if( w == wid->tab.active_tab) { if(wid->composite.num_children > 0) { change_tab(wid, wid->composite.children[0]); } else { wid->tab.active_tab = NULL; } } } static void Layout(XmTabWidget wid) { compute_tab_rects(wid); configure_children(wid); } /********************** end of Composite Methods ***************/ /****************** Constraint Class Methods *******************/ static void Constraint_Initialize(Widget treq,Widget tnew, ArgList args,Cardinal *nargs) { XmTabConstraintRec *tab_const; XmString temp_str; tab_const = (XmTabConstraintRec *) tnew->core.constraints; if(tab_const->tab.tab_label) { temp_str = tab_const->tab.tab_label; tab_const->tab.tab_label = XmStringCopy(temp_str); } } static void Constraint_Destroy(Widget w) { XmTabConstraintRec *tab_const; tab_const = (XmTabConstraintRec *) w->core.constraints; if(tab_const->tab.tab_label) XmStringFree(tab_const->tab.tab_label); } static Boolean Constraint_SetValues(Widget current,Widget request, Widget new, ArgList args,Cardinal *nargs) { Boolean redraw = False; XmTabConstraintRec *tab_con_cur; XmTabConstraintRec *tab_con_new; XmString temp_str; XmTabWidget tab_wid = (XmTabWidget)(new->core.parent); tab_con_cur = (XmTabConstraintRec *) current->core.constraints; tab_con_new = (XmTabConstraintRec *) new->core.constraints; if( !XmStringCompare(tab_con_cur->tab.tab_label, tab_con_new->tab.tab_label)) { XmStringFree(tab_con_cur->tab.tab_label); temp_str = tab_con_new->tab.tab_label; tab_con_new->tab.tab_label = XmStringCopy(temp_str); Layout(tab_wid); redraw = True; } return(redraw); } /****************** end of Constraint Class Methods ************/ /*************** local processing functions *****************/ static void configure_children(XmTabWidget wid) { int i; Widget child; Position x, y; Dimension width, height; Dimension own_width, own_height, own_width_ret, own_height_ret; XtGeometryResult geo_result; Dimension extra_width, extra_height; Dimension rect_space; x = (Position)(wid->tab.margin_width + wid->manager.shadow_thickness + 1); y = (Position)(wid->tab.margin_height + wid->tab.tab_height + wid->manager.shadow_thickness + 1); for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; XtMoveWidget(child, x, y); } get_children_space(wid, &width, &height, &rect_space); extra_width = 2*(wid->tab.margin_width + wid->manager.shadow_thickness + 1); extra_height = wid->tab.tab_height + 2*(wid->tab.margin_height + wid->manager.shadow_thickness + 1); own_width = own_width_ret = width + extra_width; own_height = own_height_ret = height + extra_height; rect_space = rect_space + wid->manager.shadow_thickness + 2*wid->tab.margin_width; if(rect_space > own_width) own_width = own_width_ret = rect_space; geo_result = XtMakeResizeRequest((Widget)wid, own_width, own_height, &own_width_ret, &own_height_ret); if(geo_result == XtGeometryYes) { width = ( own_width_ret > extra_width ) ? (own_width_ret - extra_width) : 1; height = ( own_height_ret > extra_height ) ? (own_height_ret - extra_height) : 1; } else { width = wid->core.width - extra_width; height = wid->core.height - extra_height; } if(wid->tab.resize_children) { for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; XtResizeWidget(child, width, height, 0); } } else { for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; if(child->core.width > width) XtResizeWidget(child, width, child->core.height, 0); if(child->core.height > height) XtResizeWidget(child, child->core.width, height, 0); } } } static void get_children_space(XmTabWidget wid, Dimension *width, Dimension *height, Dimension *rect_space) { XtGeometryResult geo_result; XtWidgetGeometry reply; int i; Widget child; XmTabConstraintRec *tab_const; *width = 1; *height = 1; *rect_space = 0; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; geo_result = XtQueryGeometry(child, NULL, &reply); if((reply.request_mode & CWWidth) && (reply.width > *width)) { *width = reply.width; } if((reply.request_mode & CWHeight) && (reply.height > *height)) { *height = reply.height; } tab_const = (XmTabConstraintRec *) child->core.constraints; *rect_space = (Dimension)(tab_const->tab.tab_rect.x + tab_const->tab.tab_rect.width); XtResizeWidget(child, reply.width, reply.height, 0); } } static void change_gc(XmTabWidget wid) { XtReleaseGC((Widget)wid, wid->tab.normal_gc); create_gc(wid); } static void create_gc(XmTabWidget wid) { XGCValues gc_val; unsigned long gc_mask; XmFontContext font_context; XmFontType font_type; XmFontListEntry font_list_entry; XtPointer pointer; if (!XmFontListInitFontContext(&font_context, wid->tab.tab_font_list)) { XtAppErrorMsg( XtWidgetToApplicationContext((Widget) wid), "newFont", "badFont", "Tab", "XmTab: XmFontListInitFontContext failed, bad fontList", NULL, 0); } if ((font_list_entry = XmFontListNextEntry(font_context)) == NULL) { XtAppErrorMsg( XtWidgetToApplicationContext((Widget) wid), "newFont", "badFont", "Tab", "XmTab: XmFontListNextEntry failed, no next fontList", NULL, 0); } pointer = XmFontListEntryGetFont(font_list_entry, &font_type); gc_val.foreground = wid->manager.foreground; gc_val.background = wid->core.background_pixel; gc_mask = GCForeground | GCBackground; if (font_type == XmFONT_IS_FONT) { XFontStruct *font_struct = (XFontStruct *)pointer; gc_val.font = font_struct->fid; gc_mask |= GCFont; } wid->tab.normal_gc = XtGetGC((Widget)wid, gc_mask, &gc_val); XmFontListFreeFontContext(font_context); } static void change_tab(XmTabWidget wid, Widget new_tab) { if(XtIsRealized(wid->tab.active_tab)) XtUnmapWidget(wid->tab.active_tab); wid->tab.active_tab = new_tab; XtManageChild(new_tab); } static void compute_tab_rects(XmTabWidget wid) { Dimension str_width; Dimension str_height; short left_x, left_y; unsigned short width, height; int i; XmTabConstraintRec *tab_constraint; XmFontList font_list; String name; XmString xm_name; Dimension greater_height; short x_space, y_space; XmString temp_str; Widget child; left_x = wid->tab.margin_width; left_y = wid->tab.margin_height; font_list = wid->tab.tab_font_list; temp_str = XmStringCreateLocalized("0"); str_width = XmStringWidth(font_list, temp_str); str_height = XmStringHeight(font_list, temp_str); XmStringFree(temp_str); x_space = 2*str_width; y_space = str_height/2; greater_height = 0; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; tab_constraint = (XmTabConstraintRec *) child->core.constraints; if(tab_constraint->tab.tab_label) { str_width = XmStringWidth(font_list, tab_constraint->tab.tab_label); str_height = XmStringHeight(font_list, tab_constraint->tab.tab_label); } else { name = XtName(child); xm_name = XmStringCreateLocalized(name); str_width = XmStringWidth(font_list, xm_name); str_height = XmStringHeight(font_list, xm_name); XmStringFree(xm_name); } width = (unsigned short)( str_width + x_space); height = (unsigned short)(str_height + y_space); if( height > greater_height) greater_height = height; tab_constraint->tab.tab_rect.x = left_x; tab_constraint->tab.tab_rect.y = left_y; tab_constraint->tab.tab_rect.width = width; left_x += (short) width + wid->manager.shadow_thickness/2; } wid->tab.tab_height = greater_height; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; tab_constraint = (XmTabConstraintRec *) child->core.constraints; tab_constraint->tab.tab_rect.height = greater_height; } wid->tab.cut_size = greater_height/8; wid->tab.raise = greater_height/10; if(wid->tab.raise > wid->tab.margin_height) wid->tab.raise = wid->tab.margin_height; } static void draw_tabs(XmTabWidget wid) { Widget w = (Widget)wid; GC bright_gc, dark_gc; XPoint point[4]; int i; Widget child; short x, y; short width, height; XmTabConstraintRec *tab_constraint; Position str_x, str_y; Dimension str_width; Dimension str_height; XmFontList font_list; String name; XmString xm_name = (XmString) NULL; if(!XtWindow(w)) return; XClearWindow(XtDisplay(w), XtWindow(w)); bright_gc = wid->manager.top_shadow_GC; dark_gc = wid->manager.bottom_shadow_GC; font_list = wid->tab.tab_font_list; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; if(wid->tab.active_tab == child) { continue; } tab_constraint = (XmTabConstraintRec *) child->core.constraints; x = tab_constraint->tab.tab_rect.x; y = tab_constraint->tab.tab_rect.y; width = (short)tab_constraint->tab.tab_rect.width; height = (short)tab_constraint->tab.tab_rect.height; if(tab_constraint->tab.tab_label) { str_width = XmStringWidth(font_list, tab_constraint->tab.tab_label); str_height = XmStringHeight(font_list, tab_constraint->tab.tab_label); } else { name = XtName(child); xm_name = XmStringCreateLocalized(name); str_width = XmStringWidth(font_list, xm_name); str_height = XmStringHeight(font_list, xm_name); } str_x = x + wid->manager.shadow_thickness; str_y = y + (height - str_height)/2; str_width = width - 2*wid->manager.shadow_thickness; if(tab_constraint->tab.tab_label) { XmStringDraw(XtDisplay(wid), XtWindow(wid), font_list, tab_constraint->tab.tab_label, wid->tab.normal_gc, str_x, str_y, str_width, XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, &(tab_constraint->tab.tab_rect)); } else { XmStringDraw(XtDisplay(wid), XtWindow(wid), font_list, xm_name, wid->tab.normal_gc, str_x, str_y, str_width, XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, &(tab_constraint->tab.tab_rect)); XmStringFree(xm_name); } point[0].x = x; point[0].y = y + height; point[1].x = x; point[1].y = y + wid->tab.cut_size; point[2].x = x + wid->tab.cut_size; point[2].y = y; point[3].x = x + width - wid->tab.cut_size; point[3].y = y; DrawShadowLines(XtDisplay(w), XtWindow(w), bright_gc, point, 4, wid->manager.shadow_thickness); point[0].x = x + width - wid->tab.cut_size; point[0].y = y; point[1].x = x + width; point[1].y = y + wid->tab.cut_size; point[2].x = x + width; point[2].y = y + height; DrawShadowLines(XtDisplay(w), XtWindow(w), dark_gc, point, 3, wid->manager.shadow_thickness); } if(wid->composite.num_children == 0 || !wid->tab.active_tab) return; /*** draw the current active tab label and its shade ***/ child = wid->tab.active_tab; tab_constraint = (XmTabConstraintRec *) child->core.constraints; x = tab_constraint->tab.tab_rect.x; y = tab_constraint->tab.tab_rect.y; width = (short)tab_constraint->tab.tab_rect.width; height = (short)tab_constraint->tab.tab_rect.height; if(tab_constraint->tab.tab_label) { str_width = XmStringWidth(font_list, tab_constraint->tab.tab_label); str_height = XmStringHeight(font_list, tab_constraint->tab.tab_label); } else { name = XtName(child); xm_name = XmStringCreateLocalized(name); str_width = XmStringWidth(font_list, xm_name); str_height = XmStringHeight(font_list, xm_name); } str_x = x + wid->manager.shadow_thickness; str_y = y + (height - str_height)/2; str_width = width - 2*wid->manager.shadow_thickness; if(tab_constraint->tab.tab_label) { XmStringDraw(XtDisplay(wid), XtWindow(wid), font_list, tab_constraint->tab.tab_label, wid->tab.normal_gc, str_x, str_y, str_width, XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, &(tab_constraint->tab.tab_rect)); } else { XmStringDraw(XtDisplay(wid), XtWindow(wid), font_list, xm_name, wid->tab.normal_gc, str_x, str_y, str_width, XmALIGNMENT_CENTER, XmSTRING_DIRECTION_L_TO_R, &(tab_constraint->tab.tab_rect)); XmStringFree(xm_name); } point[0].x = x; point[0].y = y + height; point[1].x = x; point[1].y = y + wid->tab.cut_size - wid->tab.raise; point[2].x = x + wid->tab.cut_size; point[2].y = y - wid->tab.raise; point[3].x = x + width - wid->tab.cut_size; point[3].y = y - wid->tab.raise; DrawShadowLines(XtDisplay(w), XtWindow(w), bright_gc, point, 4, wid->manager.shadow_thickness); point[0].x = x + width - wid->tab.cut_size; point[0].y = y - wid->tab.raise; point[1].x = x + width; point[1].y = y + wid->tab.cut_size - wid->tab.raise; point[2].x = x + width; point[2].y = y + height; DrawShadowLines(XtDisplay(w), XtWindow(w), dark_gc, point, 3, wid->manager.shadow_thickness); /*** draw the border around the tab child ****/ x = tab_constraint->tab.tab_rect.x; y = tab_constraint->tab.tab_rect.y; width = (short)tab_constraint->tab.tab_rect.width; height = (short)tab_constraint->tab.tab_rect.height; point[0].x = wid->tab.margin_width; point[0].y = wid->core.height - wid->tab.margin_height; point[1].x = wid->tab.margin_width; point[1].y = y + height; point[2].x = x; point[2].y = y + height; DrawShadowLines(XtDisplay(wid), XtWindow(wid), bright_gc, point, 3, wid->manager.shadow_thickness); point[0].x = x + width; point[0].y = y + height; point[1].x = wid->core.width - wid->tab.margin_width; point[1].y = y + height; DrawShadowLines(XtDisplay(wid), XtWindow(wid), bright_gc, point, 2, wid->manager.shadow_thickness); point[0].x = wid->core.width - wid->tab.margin_width; point[0].y = y + height; point[1].x = wid->core.width - wid->tab.margin_width; point[1].y = wid->core.height - wid->tab.margin_height; point[2].x = wid->tab.margin_width; point[2].y = wid->core.height - wid->tab.margin_height; DrawShadowLines(XtDisplay(wid), XtWindow(wid), dark_gc, point, 3, wid->manager.shadow_thickness); } void DrawShadowLines(Display *display, Drawable drawable, GC gc, XPoint *points, int num_points, Dimension shad_thick) { XGCValues gc_val; unsigned long gc_mask; int line_width; /*** get the original linewidth and store it ***/ gc_mask = GCLineWidth; XGetGCValues(display, gc, gc_mask, &gc_val); line_width = gc_val.line_width; /*** change the GC according to shadow thickness ***/ gc_val.line_width = (int) shad_thick; XChangeGC(display, gc, gc_mask, &gc_val); /*** draw now ***/ XDrawLines(display, drawable, gc, points, num_points, CoordModeOrigin); /*** restore original line_width in GC ***/ gc_val.line_width = line_width; XChangeGC(display, gc, gc_mask, &gc_val); } static Widget search_tab(XmTabWidget wid, XEvent *event) { int i; XmTabConstraintRec *tab_constraint; int rect_x, rect_y; int width, height; int ev_x, ev_y; Widget child; ev_x = event->xbutton.x; ev_y = event->xbutton.y; for(i=0; i< wid->composite.num_children; i++) { child = wid->composite.children[i]; if( child == wid->tab.active_tab) continue; tab_constraint = (XmTabConstraintRec *) child->core.constraints; rect_x = (int) tab_constraint->tab.tab_rect.x; rect_y = (int) tab_constraint->tab.tab_rect.y; width = (int) tab_constraint->tab.tab_rect.width; height = (int) tab_constraint->tab.tab_rect.height; if( ev_x >= rect_x && ev_y >= rect_y && ev_x <= (rect_x + width) && ev_y <= (rect_y + height)) { if( ev_x < (rect_x + wid->tab.cut_size) && ev_y < (rect_y + wid->tab.cut_size) && (wid->tab.cut_size - (rect_x - ev_x)) < (ev_y - rect_y) ) { return(child); } else if( ev_x > (rect_x + width - wid->tab.cut_size) && ev_y < (rect_y + wid->tab.cut_size) && (wid->tab.cut_size - (rect_x + width - ev_x)) < (ev_y - rect_y) ) { return(child); } else { return(child); } } } return(NULL); } /************************* Public methods *********************************/ extern void XmTabSetTabWidget(Widget tab, Widget child, Boolean notify) { XmTabWidget wid = (XmTabWidget) tab; int i; Widget tab_wid; XmTabCallbackStruct call_data; XmTabConstraintRec *tab_constraint; /**** first be sure the mentioned widget is a valid child ***/ tab_wid = NULL; for(i=0; i< wid->composite.num_children; i++) { if(wid->composite.children[i] == child) { tab_wid = child; break; } } if(!tab_wid) return; if(tab_wid == wid->tab.active_tab) return; change_tab(wid, tab_wid); draw_tabs(wid); if(notify) { call_data.reason = XmCR_VALUE_CHANGED; call_data.tab_child = tab_wid; call_data.event = NULL; tab_constraint = (XmTabConstraintRec *) child->core.constraints; if( tab_constraint->tab.tab_label ) { call_data.tab_label = XmStringCopy(tab_constraint->tab.tab_label); } else { call_data.tab_label = XmStringCreateLocalized(XtName(child));; } XtCallCallbacks((Widget)wid, XmNvalueChangedCallback, &call_data); XmStringFree(call_data.tab_label); } } extern Widget XmTabGetTabWidget(Widget tab) { XmTabWidget wid = (XmTabWidget) tab; return(wid->tab.active_tab); } /************************* end of file **********************************/ grace-5.1.23/src/draw.c0000644000076500001440000013271710337717324014342 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2005 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Interface to device drivers * */ #include #include #include #include #include #include "defines.h" #include "device.h" #include "graphs.h" #include "utils.h" #include "draw.h" int ReqUpdateColorSel = FALSE; /* a part of pre-GUI layer; should be in a separate module */ int AAGrayLevelsOK = FALSE; /* used to invalidate AA gray levels' cache */ void (*devupdatecmap)(); /* update color map */ void (*devdrawpixel) (); /* device pixel drawing routine */ void (*devdrawpolyline) (); /* device polyline drawing routine */ void (*devfillpolygon) (); /* device polygon filling routine */ void (*devdrawarc) (); /* device arc drawing routine */ void (*devfillarc) (); /* device arc filling routine */ void (*devleavegraphics) (); /* device exit */ static int all_points_inside(VPoint *vps, int n); static void purge_dense_points(const VPoint *vps, int n, VPoint *pvps, int *np); /* Current drawing properties */ static DrawProps draw_props = {{1, 1}, 0, TRUE, 1, 0.0, LINECAP_BUTT, LINEJOIN_MITER, 1.0, 0, FILLRULE_WINDING}; static world worldwin; static view viewport; static int coordinates; static int scaletypex; static int scaletypey; static double xv_med; static double yv_med; static double xv_rc; static double yv_rc; static double fxg_med; static double fyg_med; static int clipflag = TRUE; /* whether clipping must be in force */ static int revflag = FALSE; /* * set pen properties */ void setpen(Pen pen) { draw_props.pen = pen; return; } Pen getpen(void) { return (draw_props.pen); } /* * make the current color color */ void setcolor(int color) { draw_props.pen.color = color; return; } int getcolor(void) { return (draw_props.pen.color); } /* * set the background color of the canvas */ void setbgcolor(int bgcolor) { draw_props.bgcolor = bgcolor; } int getbgcolor(void) { return (draw_props.bgcolor); } /* * determines whether page background is filled */ void setbgfill(int flag) { draw_props.bgfilled = flag; } int getbgfill(void) { return (draw_props.bgfilled); } /* * make the current linestyle lines */ void setlinestyle(int lines) { draw_props.lines = lines; return; } int getlinestyle(void) { return (draw_props.lines); } #define MAGIC_LINEW_SCALE 0.0015 /* * make the current line width linew */ void setlinewidth(double linew) { draw_props.linew = linew; return; } double getlinewidth(void) { return ((double) MAGIC_LINEW_SCALE*draw_props.linew); } void setpattern(int pattern) { draw_props.pen.pattern = pattern; return; } int getpattern(void) { return (draw_props.pen.pattern); } /* * set the current character size to size */ void setcharsize(double charsize) { draw_props.charsize = charsize; return; } double getcharsize(void) { return (draw_props.charsize); } /* * setfont - make font the current font to use for writing strings */ void setfont(int font) { draw_props.font = font; return; } int getfont(void) { return (draw_props.font); } /* * set the current fillrule */ void setfillrule(int rule) { draw_props.fillrule = rule; return; } int getfillrule(void) { return (draw_props.fillrule); } /* * set/get the current linecap parameter */ void setlinecap(int type) { draw_props.linecap = type; return; } int getlinecap(void) { return (draw_props.linecap); } /* * set/get the current linejoin type */ void setlinejoin(int type) { draw_props.linejoin = type; return; } int getlinejoin(void) { return (draw_props.linejoin); } /* * Convert point's world coordinates to viewport */ VPoint Wpoint2Vpoint(WPoint wp) { VPoint vp; world2view(wp.x, wp.y, &vp.x, &vp.y); return (vp); } void symplus(VPoint vp, double s) { VPoint vp1, vp2; vp1.x = vp.x - s; vp1.y = vp.y; vp2.x = vp.x + s; vp2.y = vp.y; DrawLine(vp1, vp2); vp1.x = vp.x; vp1.y = vp.y - s; vp2.x = vp.x; vp2.y = vp.y + s; DrawLine(vp1, vp2); } void symx(VPoint vp, double s) { VPoint vp1, vp2; double side = M_SQRT1_2*s; vp1.x = vp.x - side; vp1.y = vp.y - side; vp2.x = vp.x + side; vp2.y = vp.y + side; DrawLine(vp1, vp2); vp1.x = vp.x - side; vp1.y = vp.y + side; vp2.x = vp.x + side; vp2.y = vp.y - side; DrawLine(vp1, vp2); } void symsplat(VPoint vp, double s) { symplus(vp, s); symx(vp, s); } void leavegraphics(void) { /* devsymreset(); */ (*devleavegraphics) (); } /* * DrawPixel - put a pixel in the current color at position vp */ void DrawPixel(VPoint vp) { if (is_validVPoint(vp)) { if (get_draw_mode() == TRUE) { (*devdrawpixel)(vp); } update_bboxes(vp); } } /* * DrawRect - draw a rectangle using the current color and linestyle */ void DrawRect(VPoint vp1, VPoint vp2) { VPoint vps[4]; vps[0].x = vp1.x; vps[0].y = vp1.y; vps[1].x = vp1.x; vps[1].y = vp2.y; vps[2].x = vp2.x; vps[2].y = vp2.y; vps[3].x = vp2.x; vps[3].y = vp1.y; DrawPolyline(vps, 4, POLYLINE_CLOSED); } /* * DrawRect - draw a rectangle using the current color and linestyle */ void FillRect(VPoint vp1, VPoint vp2) { VPoint vps[4]; vps[0].x = vp1.x; vps[0].y = vp1.y; vps[1].x = vp1.x; vps[1].y = vp2.y; vps[2].x = vp2.x; vps[2].y = vp2.y; vps[3].x = vp2.x; vps[3].y = vp1.y; DrawPolygon(vps, 4); } /* * DrawPolyline - draw a connected line in the current color and linestyle * with nodes given by vps[] */ void DrawPolyline(VPoint *vps, int n, int mode) { int i, nmax, nc, max_purge, npurged; VPoint vp1, vp2; VPoint vp1c, vp2c; VPoint *vpsc; if (getlinestyle() == 0 || (getpen()).pattern == 0) { return; } if (n <= 1) { return; } if (mode == POLYLINE_CLOSED) { nmax = n + 1; } else { nmax = n; } max_purge = get_max_path_limit(); /* * in most real cases, all points of a set are inside the viewport; * so we check it prior to going into complicated clipping mode */ if (doclipping() && !all_points_inside(vps, n)) { vpsc = xmalloc((nmax)*sizeof(VPoint)); if (vpsc == NULL) { errmsg ("xmalloc() failed in DrawPolyline()"); return; } nc = 0; for (i = 0; i < nmax - 1; i++) { vp1 = vps[i]; if (i < n - 1) { vp2 = vps[i + 1]; } else { vp2 = vps[0]; } if (clip_line(vp1, vp2, &vp1c, &vp2c)) { if (nc == 0) { vpsc[nc] = vp1c; nc++; } vpsc[nc] = vp2c; nc++; if (vp2.x != vp2c.x || vp2.y != vp2c.y || i == nmax - 2) { update_bboxes_with_vpoints(vpsc, nc, getlinewidth()); if (get_draw_mode() == TRUE) { if (nc != nmax) { mode = POLYLINE_OPEN; } if (max_purge && nc > max_purge) { npurged = max_purge; purge_dense_points(vpsc, nc, vpsc, &npurged); } else { npurged = nc; } (*devdrawpolyline)(vpsc, npurged, mode); } nc = 0; } } } xfree(vpsc); } else { update_bboxes_with_vpoints(vps, n, getlinewidth()); if (get_draw_mode() == TRUE) { if (max_purge && n > max_purge) { npurged = max_purge; vpsc = xmalloc(max_purge*sizeof(VPoint)); if (vpsc == NULL) { errmsg ("xmalloc() failed in DrawPolyline()"); return; } purge_dense_points(vps, n, vpsc, &npurged); (*devdrawpolyline)(vpsc, npurged, mode); xfree(vpsc); } else { (*devdrawpolyline)(vps, n, mode); } } } } /* * DrawLine - draw a straight line in the current color and linestyle * with nodes given by vp1 and vp2 */ void DrawLine(VPoint vp1, VPoint vp2) { VPoint vps[2]; vps[0] = vp1; vps[1] = vp2; DrawPolyline(vps, 2, POLYLINE_OPEN); } /* * DrawPolygon - draw a filled polygon in the current color and pattern * with nodes given by vps[] */ void DrawPolygon(VPoint *vps, int n) { int nc, max_purge, npurged; VPoint *vptmp; if ((getpen()).pattern == 0) { return; } if (n < 3) { return; } max_purge = get_max_path_limit(); if (doclipping() && !all_points_inside(vps, n)) { /* In the worst case, the clipped polygon may have twice more vertices */ vptmp = xmalloc((2*n) * sizeof(VPoint)); if (vptmp == NULL) { errmsg("xmalloc() failed in DrawPolygon"); return; } else { memcpy(vptmp, vps, n * sizeof(VPoint)); nc = clip_polygon(vptmp, n); if (nc > 2) { update_bboxes_with_vpoints(vptmp, nc, 0.0); if (get_draw_mode() == TRUE) { if (max_purge && nc > max_purge) { npurged = max_purge; purge_dense_points(vptmp, nc, vptmp, &npurged); } else { npurged = nc; } (*devfillpolygon) (vptmp, npurged); } } xfree(vptmp); } } else { update_bboxes_with_vpoints(vps, n, 0.0); if (get_draw_mode() == TRUE) { if (max_purge && n > max_purge) { npurged = max_purge; vptmp = xmalloc(max_purge*sizeof(VPoint)); if (vptmp == NULL) { errmsg ("xmalloc() failed in DrawPolygon()"); return; } purge_dense_points(vps, n, vptmp, &npurged); (*devfillpolygon) (vptmp, npurged); xfree(vptmp); } else { (*devfillpolygon) (vps, n); } } } } /* * DrawArc - draw an arc line */ void DrawArc(VPoint vp1, VPoint vp2, int angle1, int angle2) { view v; if (getlinestyle() == 0 || (getpen()).pattern == 0) { return; } if (angle1 > angle2) { iswap(&angle1, &angle2); } /* TODO: clipping!!!*/ if (get_draw_mode() == TRUE) { (*devdrawarc)(vp1, vp2, angle1, angle2); } /* TODO: consider open arcs! */ VPoints2bbox(&vp1, &vp2, &v); view_extend(&v, getlinewidth()/2); update_bboxes_with_view(&v); } /* * DrawFilledArc - draw a filled arc */ void DrawFilledArc(VPoint vp1, VPoint vp2, int angle1, int angle2, int mode) { if ((getpen()).pattern == 0) { return; } if (points_overlap(vp1, vp2)) { DrawPixel(vp1); return; } if (angle1 > angle2) { iswap(&angle1, &angle2); } /* TODO: clipping!!!*/ if (get_draw_mode() == TRUE) { (*devfillarc)(vp1, vp2, angle1, angle2, mode); } /* TODO: consider open arcs! */ update_bboxes(vp1); update_bboxes(vp2); } /* * DrawEllipse - draw an ellipse */ void DrawEllipse(VPoint vp1, VPoint vp2) { DrawArc(vp1, vp2, 0, 360); } /* * DrawFilledEllipse - draw a filled ellipse */ void DrawFilledEllipse(VPoint vp1, VPoint vp2) { DrawFilledArc(vp1, vp2, 0, 360, ARCFILL_CHORD); } /* * DrawCircle - draw a circle */ void DrawCircle(VPoint vp, double radius) { VPoint vp1, vp2; vp1.x = vp.x - radius; vp1.y = vp.y - radius; vp2.x = vp.x + radius; vp2.y = vp.y + radius; DrawArc(vp1, vp2, 0, 360); } /* * DrawFilledCircle - draw a filled circle */ void DrawFilledCircle(VPoint vp, double radius) { VPoint vp1, vp2; vp1.x = vp.x - radius; vp1.y = vp.y - radius; vp2.x = vp.x + radius; vp2.y = vp.y + radius; DrawFilledArc(vp1, vp2, 0, 360, ARCFILL_CHORD); } /* * ------------------ Clipping routines --------------- */ /* * clip if clipflag = TRUE */ void setclipping(int flag) { clipflag = flag ? TRUE:FALSE; } /* * */ int doclipping(void) { return(clipflag ? TRUE:FALSE); } /* * is_wpoint_inside() checks if point qp is inside of world rectangle w */ int is_wpoint_inside(WPoint *wp, world *w) { return ((wp->x >= w->xg1) && (wp->x <= w->xg2) && (wp->y >= w->yg1) && (wp->y <= w->yg2)); } /* some to avoid round errors due to the finite FP precision */ #define VP_EPSILON 0.0001 /* * is_vpoint_inside() checks if point vp is inside of viewport rectangle v */ int is_vpoint_inside(view v, VPoint vp, double epsilon) { return ((vp.x >= v.xv1 - epsilon) && (vp.x <= v.xv2 + epsilon) && (vp.y >= v.yv1 - epsilon) && (vp.y <= v.yv2 + epsilon)); } static int all_points_inside(VPoint *vps, int n) { int i; for (i = 0; i < n; i++) { if (is_vpoint_inside(viewport, vps[i], VP_EPSILON) != TRUE) { return FALSE; } } return TRUE; } /* * is_validVPoint() checks if a point is inside of (current) graph viewport */ int is_validVPoint(VPoint vp) { if (doclipping()) { return (is_vpoint_inside(viewport, vp, VP_EPSILON)); } else { return TRUE; } } /* * is_validWPoint() checks if a point is inside of (current) world rectangle */ int is_validWPoint(WPoint wp) { if (coordinates == COORDINATES_POLAR) { if (wp.y >= 0.0 && wp.y <= worldwin.yg2) { return TRUE; } else { return FALSE; } } else { if (((wp.x >= worldwin.xg1 && wp.x <= worldwin.xg2) || (wp.x >= worldwin.xg2 && wp.x <= worldwin.xg1)) && ((wp.y >= worldwin.yg1 && wp.y <= worldwin.yg2) || (wp.y >= worldwin.yg2 && wp.y <= worldwin.yg1))) { return TRUE; } else { return FALSE; } } } #define LINE_FINITE 0 #define LINE_INFINITE 1 /* TODO: implement fpcomp() */ #define FPCMP_EPS 1.0e-6 /* * line_intersect() returns pointer to the intersection point of two * lines defined by points vp1, vp2 and vp1p, vp2p respectively. * If the lines don't intersect, return NULL. * If mode == LINE_INFINTE, the second line is assumed to be infinite. * Note!! If the lines have more than single intersection point (parallel * partially coinsiding lines), the function returns NULL, too. * The routine uses the Liang-Barsky algorithm, slightly modified for the * sake of generality (but for the price of performance) */ VPoint *line_intersect(VPoint vp1, VPoint vp2, VPoint vp1p, VPoint vp2p, int mode) { static VPoint vpbuf; double vprod, t, tp; vprod = (vp2p.x - vp1p.x)*(vp2.y - vp1.y) - (vp2.x - vp1.x)*(vp2p.y - vp1p.y); if (vprod == 0) { return NULL; } else { t = ((vp1.x - vp1p.x)*vp2p.y + (vp2p.x - vp1.x)*vp1p.y - (vp2p.x - vp1p.x)*vp1.y)/vprod; if ((t >= 0.0 - FPCMP_EPS) && (t <= 1.0 + FPCMP_EPS)) { vpbuf.x = vp1.x + t*(vp2.x - vp1.x); vpbuf.y = vp1.y + t*(vp2.y - vp1.y); if (mode == LINE_INFINITE) { return &vpbuf; } else { if (vp1p.x != vp2p.x) { tp = (vpbuf.x - vp1p.x)/(vp2p.x - vp1p.x); } else { tp = (vpbuf.y - vp1p.y)/(vp2p.y - vp1p.y); } if ((tp >= 0.0 - FPCMP_EPS) && (tp <= 1.0 + FPCMP_EPS)) { return &vpbuf; } else { return NULL; } } } else { return NULL; } } } /* * clip_line() clips a straight line defined by points vp1 and vp2 * onto viewport rectangle; endpoints of the clipped line are returned by * vp1c and vp2c, and the function itself returns TRUE if (a part of) the line * should be drawn and FALSE otherwise */ int clip_line(VPoint vp1, VPoint vp2, VPoint *vp1c, VPoint *vp2c) { int ends_found = 0; int na; int vp1_ok = FALSE, vp2_ok = FALSE; VPoint *vpp, vptmp[2], vpsa[5]; if (is_validVPoint(vp1)) { vp1_ok = TRUE; ends_found++; } if (is_validVPoint(vp2)) { vp2_ok = TRUE; ends_found++; } if (vp1_ok && vp2_ok) { *vp1c = vp1; *vp2c = vp2; return (TRUE); } else { vpsa[0].x = viewport.xv1 - VP_EPSILON; vpsa[0].y = viewport.yv1 - VP_EPSILON; vpsa[1].x = viewport.xv2 + VP_EPSILON; vpsa[1].y = viewport.yv1 - VP_EPSILON; vpsa[2].x = viewport.xv2 + VP_EPSILON; vpsa[2].y = viewport.yv2 + VP_EPSILON; vpsa[3].x = viewport.xv1 - VP_EPSILON; vpsa[3].y = viewport.yv2 + VP_EPSILON; vpsa[4] = vpsa[0]; na = 0; while ((ends_found < 2) && na < 4) { if ((vpp = line_intersect(vp1, vp2, vpsa[na], vpsa[na + 1], LINE_FINITE)) != NULL) { vptmp[ends_found] = *vpp; ends_found++; } na++; } if (ends_found == 0) { return (FALSE); } else if (ends_found == 2) { if (vp1_ok) { *vp1c = vp1; *vp2c = vptmp[1]; } else if (vp2_ok) { *vp1c = vptmp[1]; *vp2c = vp2; } else { *vp1c = vptmp[0]; *vp2c = vptmp[1]; } return (TRUE); } else if (ends_found == 1) { /* one of the points was on a frame edge exactly, but * line_intersect(), due to a final FP precision, didn't * find it */ return (FALSE); } else { /* this would be really strange! */ errmsg("Internal error in clip_line()"); return (FALSE); } } } static int is_inside_boundary(VPoint vp, VPoint vp1c, VPoint vp2c) { /* vector product should be positive if vp1c, vp2c and vp lie * counter-clockwise */ if ((vp2c.x - vp1c.x)*(vp.y - vp2c.y) - (vp.x - vp2c.x)*(vp2c.y - vp1c.y) >= 0.0){ return TRUE; } else { return FALSE; } } /* size of buffer array used in polygon clipping */ static int polybuf_length; int intersect_polygon(VPoint *vps, int n, VPoint vp1p, VPoint vp2p) { int i, nc, ishift; VPoint vp1, vp2, *vpp; nc = 0; ishift = polybuf_length - n; memmove(vps + ishift, vps, n * sizeof(VPoint)); vp1 = vps[polybuf_length - 1]; for (i = ishift; i < polybuf_length; i++) { vp2 = vps[i]; if (is_inside_boundary(vp2, vp1p, vp2p)) { if (is_inside_boundary(vp1, vp1p, vp2p)) { vps[nc] = vp2; nc++; } else { vpp = line_intersect(vp1, vp2, vp1p, vp2p, LINE_INFINITE); if (vpp != NULL) { vps[nc] = *vpp; nc++; } vps[nc] = vp2; nc++; } } else if (is_inside_boundary(vp1, vp1p, vp2p)) { vpp = line_intersect(vp1, vp2, vp1p, vp2p, LINE_INFINITE); if (vpp != NULL) { vps[nc] = *vpp; nc++; } } vp1 = vp2; } return nc; } int clip_polygon(VPoint *vps, int n) { int nc, na; VPoint vpsa[5]; polybuf_length = 2*n; vpsa[0].x = viewport.xv1; vpsa[0].y = viewport.yv1; vpsa[1].x = viewport.xv2; vpsa[1].y = viewport.yv1; vpsa[2].x = viewport.xv2; vpsa[2].y = viewport.yv2; vpsa[3].x = viewport.xv1; vpsa[3].y = viewport.yv2; vpsa[4] = vpsa[0]; nc = n; for (na = 0; na < 4; na++) { nc = intersect_polygon(vps, nc, vpsa[na], vpsa[na + 1]); if (nc < 2) { break; } } return nc; } /* * ------------------ Colormap routines --------------- */ static CMap_entry *cmap_table; static int maxcolors = 0; int number_of_colors(void) { return maxcolors; } int is_valid_color(RGB rgb) { if (((rgb.red <= 0xff) && (rgb.red >= 0x00)) && ((rgb.green <= 0xff) && (rgb.green >= 0x00)) && ((rgb.blue <= 0xff) && (rgb.blue >= 0x00))) { return TRUE; } else { return FALSE; } } int compare_rgb(RGB *rgb1, RGB *rgb2) { if ((rgb1->red == rgb2->red) && (rgb1->green == rgb2->green) && (rgb1->blue == rgb2->blue)) { return TRUE; } else { return FALSE; } } int find_color(RGB rgb) { int i; int cindex = BAD_COLOR; for (i = 0; i < maxcolors; i++) { if (compare_rgb(&cmap_table[i].rgb, &rgb) == TRUE) { cindex = i; break; } } return (cindex); } int get_color_by_name(char *cname) { int i; int cindex = BAD_COLOR; for (i = 0; i < maxcolors; i++) { if (cmap_table[i].ctype == COLOR_MAIN && compare_strings(cmap_table[i].cname, cname) == TRUE) { cindex = i; break; } } return (cindex); } int realloc_colors(int n) { int i; CMap_entry *cmap_tmp; if (n > MAXCOLORS) { return RETURN_FAILURE; } else { for (i = n; i < maxcolors; i++) { XCFREE(cmap_table[i].cname); } cmap_tmp = xrealloc(cmap_table, n*sizeof(CMap_entry)); if (cmap_tmp == NULL) { return RETURN_FAILURE; } else { cmap_table = cmap_tmp; for (i = maxcolors; i < n; i++) { cmap_table[i].rgb.red = 0; cmap_table[i].rgb.green = 0; cmap_table[i].rgb.blue = 0; cmap_table[i].cname = NULL; cmap_table[i].ctype = COLOR_NONE; cmap_table[i].tstamp = 0; } } maxcolors = n; } return RETURN_SUCCESS; } int store_color(int n, CMap_entry cmap) { if (is_valid_color(cmap.rgb) != TRUE) { return RETURN_FAILURE; } else if (n >= maxcolors && realloc_colors(n + 1) == RETURN_FAILURE) { return RETURN_FAILURE; } else { if (cmap.cname == NULL || strlen(cmap.cname) == 0) { cmap_table[n].cname = copy_string(cmap_table[n].cname, "unnamed"); } else { cmap_table[n].cname = copy_string(cmap_table[n].cname, cmap.cname); } cmap_table[n].rgb = cmap.rgb; cmap_table[n].ctype = cmap.ctype; cmap_table[n].tstamp = 1; /* invalidate AA gray levels' cache */ AAGrayLevelsOK = FALSE; /* inform current device of changes in the cmap database */ if (devupdatecmap != NULL) { (*devupdatecmap)(); } if (cmap.ctype == COLOR_MAIN) { ReqUpdateColorSel = TRUE; } return RETURN_SUCCESS; } } /* * add_color() adds a new entry to the colormap table */ int add_color(CMap_entry cmap) { int cindex; if (is_valid_color(cmap.rgb) != TRUE) { cindex = BAD_COLOR; } else if ((cindex = find_color(cmap.rgb)) != BAD_COLOR) { if (cmap.ctype == COLOR_MAIN && cmap_table[cindex].ctype != COLOR_MAIN) { cmap_table[cindex].ctype = COLOR_MAIN; ReqUpdateColorSel = TRUE; } } else if (store_color(maxcolors, cmap) == RETURN_FAILURE) { cindex = BAD_COLOR; } else { cindex = maxcolors - 1; } return (cindex); } /* * int delete_color(int cindex) * { * } */ RGB *get_rgb(unsigned int cindex) { if (cindex < maxcolors) { return &(cmap_table[cindex].rgb); } else { return NULL; } } fRGB *get_frgb(unsigned int cindex) { static fRGB frgb; if (cindex < maxcolors) { frgb.red = (double) cmap_table[cindex].rgb.red / (MAXCOLORS - 1); frgb.green = (double) cmap_table[cindex].rgb.green / (MAXCOLORS - 1); frgb.blue = (double) cmap_table[cindex].rgb.blue / (MAXCOLORS - 1); return &frgb; } else { return NULL; } } fRGB *get_fsrgb(unsigned int cindex) { static fRGB fsrgb; if (cindex < maxcolors) { fsrgb = *get_frgb(cindex); if (fsrgb.red <= 0.0031308) { fsrgb.red *= 12.92; } else { fsrgb.red = 1.055*pow(fsrgb.red,1.0/2.4)-0.055; } if (fsrgb.green <= 0.0031308) { fsrgb.green *= 12.92; } else { fsrgb.green = 1.055*pow(fsrgb.green,1.0/2.4)-0.055; } if (fsrgb.blue <= 0.0031308) { fsrgb.blue *= 12.92; } else { fsrgb.blue = 1.055*pow(fsrgb.blue,1.0/2.4)-0.055; } return &fsrgb; } else { return NULL; } } RGB *get_srgb(unsigned int cindex) { static fRGB fsrgb; static RGB srgb; if (cindex < maxcolors) { fsrgb = *get_fsrgb(cindex); srgb.red = round(fsrgb.red * (MAXCOLORS - 1)); srgb.green = round(fsrgb.green * (MAXCOLORS - 1)); srgb.blue = round(fsrgb.blue * (MAXCOLORS - 1)); return &srgb; } else { return NULL; } } CMap_entry *get_cmap_entry(unsigned int cindex) { if (cindex < maxcolors) { return &(cmap_table[cindex]); } else { return NULL; } } char *get_colorname(unsigned int cindex) { if (cindex < maxcolors) { return (cmap_table[cindex].cname); } else { return NULL; } } int get_colortype(unsigned int cindex) { if (cindex < maxcolors) { return (cmap_table[cindex].ctype); } else { return (BAD_COLOR); } } YIQ RGB2YIQ(RGB rgb) { YIQ yiq; if (is_valid_color(rgb)) { yiq.y = (0.299*rgb.red + 0.587*rgb.green + 0.114*rgb.blue) /(MAXCOLORS - 1); yiq.i = (0.596*rgb.red - 0.275*rgb.green - 0.321*rgb.blue) /(MAXCOLORS - 1); yiq.q = (0.212*rgb.red - 0.528*rgb.green + 0.311*rgb.blue) /(MAXCOLORS - 1); } else { yiq.y = 0.0; yiq.i = 0.0; yiq.q = 0.0; } return (yiq); } double get_colorintensity(int cindex) { double retval; if (cindex < maxcolors) { retval = RGB2YIQ(cmap_table[cindex].rgb).y; } else { retval = 0.0; } return (retval); } static CMap_entry cmap_init[] = { /* white */ {{255, 255, 255}, "white", COLOR_MAIN, 0}, /* black */ {{0, 0, 0}, "black", COLOR_MAIN, 0}, /* red */ {{255, 0, 0}, "red", COLOR_MAIN, 0}, /* green */ {{0, 255, 0}, "green", COLOR_MAIN, 0}, /* blue */ {{0, 0, 255}, "blue", COLOR_MAIN, 0}, /* yellow */ {{255, 255, 0}, "yellow", COLOR_MAIN, 0}, /* brown */ {{188, 143, 143}, "brown", COLOR_MAIN, 0}, /* grey */ {{220, 220, 220}, "grey", COLOR_MAIN, 0}, /* violet */ {{148, 0, 211}, "violet", COLOR_MAIN, 0}, /* cyan */ {{0, 255, 255}, "cyan", COLOR_MAIN, 0}, /* magenta*/ {{255, 0, 255}, "magenta", COLOR_MAIN, 0}, /* orange */ {{255, 165, 0}, "orange", COLOR_MAIN, 0}, /* indigo */ {{114, 33, 188}, "indigo", COLOR_MAIN, 0}, /* maroon */ {{103, 7, 72}, "maroon", COLOR_MAIN, 0}, /* turquoise */ {{64, 224, 208}, "turquoise", COLOR_MAIN, 0}, /* forest green */ {{0, 139, 0}, "green4", COLOR_MAIN, 0} }; /* * initialize_cmap() * Initialize the colormap segment data and setup the RGB values. */ void initialize_cmap(void) { int i, n; n = sizeof(cmap_init)/sizeof(CMap_entry); realloc_colors(n); for (i = 0; i < n; i++) { store_color(i, cmap_init[i]); } } void reverse_video(void) { CMap_entry ctmp; memcpy(&ctmp, &cmap_table[0], sizeof(CMap_entry)); memcpy(&cmap_table[0], &cmap_table[1], sizeof(CMap_entry)); memcpy(&cmap_table[1], &ctmp, sizeof(CMap_entry)); revflag = !revflag; } int is_video_reversed(void) { return revflag; } /* * ------------------ Pattern routines --------------- */ int number_of_patterns(void) { return MAXPATTERNS; } /* * ------------------ Line style routines --------------- */ int number_of_linestyles(void) { return MAXLINESTYLES; } /* * ------------- coordinate conversion routines ------------ */ char *scale_types(int it) { static char s[16]; switch (it) { case SCALE_NORMAL: strcpy(s, "Normal"); break; case SCALE_LOG: strcpy(s, "Logarithmic"); break; case SCALE_REC: strcpy(s, "Reciprocal"); break; case SCALE_LOGIT: strcpy(s, "Logit"); break; default: strcpy(s, "Unknown"); break; } return s; } /* * axis scaling */ double fscale(double wc, int scale) { switch (scale) { case SCALE_NORMAL: return (wc); case SCALE_LOG: return (log10(wc)); case SCALE_REC: return (1.0/wc); case SCALE_LOGIT: return (log(wc/(1.0-wc))); default: errmsg("internal error in fscale()"); return (wc); } } /* * inverse of the above */ double ifscale(double vc, int scale) { switch (scale) { case SCALE_NORMAL: return (vc); case SCALE_LOG: return (pow(10.0, vc)); case SCALE_REC: return (1.0/vc); case SCALE_LOGIT: return (exp(vc)/(1+exp(vc))); default: errmsg("internal error in ifscale()"); return (vc); } } /* * map world co-ordinates to viewport */ double xy_xconv(double wx) { if ((scaletypex == SCALE_LOG && wx <= 0.0) || (scaletypex == SCALE_REC && wx == 0.0) || (scaletypex == SCALE_LOGIT && wx <= 0.0) || (scaletypex == SCALE_LOGIT && wx >= 1.0)){ return 0; } else { return (xv_med + xv_rc*(fscale(wx, scaletypex) - fxg_med)); } } double xy_yconv(double wy) { if ((scaletypey == SCALE_LOG && wy <= 0.0) || (scaletypey == SCALE_REC && wy == 0.0) || (scaletypey == SCALE_LOGIT && wy <= 0.0) || (scaletypey == SCALE_LOGIT && wy >= 1.0)) { return 0; } else { return (yv_med + yv_rc*(fscale(wy, scaletypey) - fyg_med)); } } int polar2xy(double phi, double rho, double *x, double *y) { if (rho < 0.0) { return (RETURN_FAILURE); } else { *x = rho*cos(phi); *y = rho*sin(phi); return (RETURN_SUCCESS); } } void xy2polar(double x, double y, double *phi, double *rho) { *phi = atan2(y, x); *rho = hypot(x, y); } int world2view(double x, double y, double *xv, double *yv) { if (coordinates == COORDINATES_POLAR) { if (polar2xy(xv_rc*x, yv_rc*y, xv, yv) != RETURN_SUCCESS) { return (RETURN_FAILURE); } *xv += xv_med; *yv += yv_med; } else { *xv = xy_xconv(x); *yv = xy_yconv(y); } return (RETURN_SUCCESS); } /* * view2world - given (xv,yv) in viewport coordinates, return world coordinates * in (xw,yw) */ void view2world(double xv, double yv, double *xw, double *yw) { if (coordinates == COORDINATES_POLAR) { xy2polar(xv - xv_med, yv - yv_med, xw, yw); *xw /= xv_rc; *yw /= yv_rc; } else { *xw = ifscale(fxg_med + (1.0/xv_rc)*(xv - xv_med), scaletypex); *yw = ifscale(fyg_med + (1.0/yv_rc)*(yv - yv_med), scaletypey); } } /* * definewindow - defines the scaling * of the plotting rectangle to be used for clipping */ int definewindow(world w, view v, int gtype, int xscale, int yscale, int invx, int invy) { double dx, dy; /* Safety checks */ if (isvalid_viewport(v) == FALSE) { errmsg("Invalid viewport coordinates"); return RETURN_FAILURE; } dx = w.xg2 - w.xg1; if (dx <= 0.0) { errmsg("World DX <= 0.0"); return RETURN_FAILURE; } dy = w.yg2 - w.yg1; if (dy <= 0.0) { errmsg("World DY <= 0.0"); return RETURN_FAILURE; } switch (gtype) { case GRAPH_POLAR: if (w.yg2 <= 0.0) { errmsg("World Rho-max <= 0.0"); return RETURN_FAILURE; } else if ((xscale != SCALE_NORMAL) || (yscale != SCALE_NORMAL)) { errmsg("Only linear scales are supported in Polar plots"); return RETURN_FAILURE; } else if (invy == TRUE) { errmsg("Can't set Y scale inverted in Polar plot"); return RETURN_FAILURE; } else { coordinates = COORDINATES_POLAR; worldwin = w; viewport = v; scaletypex = xscale; xv_med = (v.xv1 + v.xv2)/2; if (invx == FALSE) { xv_rc = +1.0; } else { xv_rc = -1.0; } scaletypey = yscale; yv_med = (v.yv1 + v.yv2)/2; yv_rc = (MIN2(v.xv2 - v.xv1, v.yv2 - v.yv1)/2.0)/w.yg2; return RETURN_SUCCESS; } break; case GRAPH_FIXED: if ((xscale != SCALE_NORMAL) || (yscale != SCALE_NORMAL)) { errmsg("Only linear axis scale is allowed in Fixed graphs"); return RETURN_FAILURE; } else { coordinates = COORDINATES_XY; worldwin = w; viewport = v; scaletypex = xscale; xv_med = (v.xv1 + v.xv2)/2; fxg_med = (w.xg1 + w.xg2)/2; scaletypey = yscale; yv_med = (v.yv1 + v.yv2)/2; fyg_med = (w.yg1 + w.yg2)/2; xv_rc = MIN2((v.xv2 - v.xv1)/(w.xg2 - w.xg1), (v.yv2 - v.yv1)/(w.yg2 - w.yg1)); yv_rc = xv_rc; if (invx == TRUE) { xv_rc = -xv_rc; } if (invy == TRUE) { yv_rc = -yv_rc; } return RETURN_SUCCESS; } break; default: if (xscale == SCALE_LOG) { if (w.xg1 <= 0) { errmsg("World X-min <= 0.0"); return RETURN_FAILURE; } if (w.xg2 <= 0) { errmsg("World X-max <= 0.0"); return RETURN_FAILURE; } } else if (xscale == SCALE_REC) { if (sign(w.xg1) != sign(w.xg2)) { errmsg("X-axis contains 0"); return RETURN_FAILURE; } } if (xscale == SCALE_LOGIT) { if (w.xg1 <= 0) { errmsg("World X-min <= 0.0"); return RETURN_FAILURE; } if (w.xg2 >= 1) { errmsg("World X-max >= 1.0"); return RETURN_FAILURE; } } if (yscale == SCALE_LOG) { if (w.yg1 <= 0.0) { errmsg("World Y-min <= 0.0"); return RETURN_FAILURE; } if (w.yg2 <= 0.0) { errmsg("World Y-max <= 0.0"); return RETURN_FAILURE; } } else if (yscale == SCALE_REC) { if (sign(w.yg1) != sign(w.yg2)) { errmsg("Y-axis contains 0"); return RETURN_FAILURE; } } if (yscale == SCALE_LOGIT) { if (w.yg1 <= 0) { errmsg("World Y-min <= 0.0"); return RETURN_FAILURE; } if (w.yg2 >= 1) { errmsg("World Y-max >= 1.0"); return RETURN_FAILURE; } } coordinates = COORDINATES_XY; worldwin = w; viewport = v; scaletypex = xscale; xv_med = (v.xv1 + v.xv2)/2; fxg_med = (fscale(w.xg1, xscale) + fscale(w.xg2, xscale))/2; if (invx == FALSE) { xv_rc = (v.xv2 - v.xv1)/(fscale(w.xg2, xscale) - fscale(w.xg1, xscale)); } else { xv_rc = - (v.xv2 - v.xv1)/(fscale(w.xg2, xscale) - fscale(w.xg1, xscale)); } scaletypey = yscale; yv_med = (v.yv1 + v.yv2)/2; fyg_med = (fscale(w.yg1, yscale) + fscale(w.yg2, yscale))/2; if (invy == FALSE) { yv_rc = (v.yv2 - v.yv1)/(fscale(w.yg2, yscale) - fscale(w.yg1, yscale)); } else { yv_rc = - (v.yv2 - v.yv1)/(fscale(w.yg2, yscale) - fscale(w.yg1, yscale)); } return RETURN_SUCCESS; break; } } int isvalid_viewport(view v) { if ((v.xv2 <= v.xv1) || (v.yv2 <= v.yv1)) { return FALSE; } else { return TRUE; } } /* * ---------------- bbox utilities -------------------- */ static BBox_type bboxes[2]; static const view invalid_view = {0.0, 0.0, 0.0, 0.0}; void reset_bbox(int type) { view *vp; switch(type) { case BBOX_TYPE_GLOB: vp = &(bboxes[0].v); break; case BBOX_TYPE_TEMP: vp = &(bboxes[1].v); break; default: errmsg ("Incorrect call of reset_bbox()"); return; } *vp = invalid_view; } void reset_bboxes(void) { reset_bbox(BBOX_TYPE_GLOB); reset_bbox(BBOX_TYPE_TEMP); } void freeze_bbox(int type) { BBox_type *bbp; switch(type) { case BBOX_TYPE_GLOB: bbp = &bboxes[0]; break; case BBOX_TYPE_TEMP: bbp = &bboxes[1]; break; default: errmsg ("Incorrect call of freeze_bbox()"); return; } bbp->fv = bbp->v; } view get_bbox(int type) { view v; switch(type) { case BBOX_TYPE_GLOB: v = bboxes[0].v; break; case BBOX_TYPE_TEMP: v = bboxes[1].v; break; default: v = invalid_view; errmsg ("Incorrect call of get_bbox()"); break; } return (v); } int is_valid_bbox(view v) { if ((v.xv1 == invalid_view.xv1) && (v.xv2 == invalid_view.xv2) && (v.yv1 == invalid_view.yv1) && (v.yv2 == invalid_view.yv2)) { return (FALSE); } else { return (TRUE); } } view merge_bboxes(view v1, view v2) { view vtmp; if (!is_valid_bbox(v1)) { if (is_valid_bbox(v2)) { return (v2); } else { return (invalid_view); } } else if (!is_valid_bbox(v2)) { return (v1); } else { vtmp.xv1 = MIN2(v1.xv1, v2.xv1); vtmp.xv2 = MAX2(v1.xv2, v2.xv2); vtmp.yv1 = MIN2(v1.yv1, v2.yv1); vtmp.yv2 = MAX2(v1.yv2, v2.yv2); return (vtmp); } } void update_bbox(int type, VPoint vp) { BBox_type *bbp; switch(type) { case BBOX_TYPE_GLOB: /* Global bbox is updated only with real drawings */ if (get_draw_mode() == FALSE) { return; } bbp = &bboxes[0]; break; case BBOX_TYPE_TEMP: bbp = &bboxes[1]; break; default: errmsg ("Incorrect call of update_bbox()"); return; } if (bbp->active == TRUE) { if (is_vpoint_inside(bbp->v, vp, 0.0) == FALSE) { if (is_valid_bbox(bbp->v)) { bbp->v.xv1 = MIN2(bbp->v.xv1, vp.x); bbp->v.xv2 = MAX2(bbp->v.xv2, vp.x); bbp->v.yv1 = MIN2(bbp->v.yv1, vp.y); bbp->v.yv2 = MAX2(bbp->v.yv2, vp.y); } else { bbp->v.xv1 = vp.x; bbp->v.xv2 = vp.x; bbp->v.yv1 = vp.y; bbp->v.yv2 = vp.y; } } } } void update_bboxes(VPoint vp) { update_bbox(BBOX_TYPE_GLOB, vp); update_bbox(BBOX_TYPE_TEMP, vp); } void melt_bbox(int type) { BBox_type *bbp; switch(type) { case BBOX_TYPE_GLOB: bbp = &bboxes[0]; break; case BBOX_TYPE_TEMP: bbp = &bboxes[1]; break; default: errmsg ("Incorrect call of melt_bbox()"); return; } bbp->v = merge_bboxes(bbp->v, bbp->fv); } void activate_bbox(int type, int status) { BBox_type *bbp; switch(type) { case BBOX_TYPE_GLOB: bbp = &bboxes[0]; break; case BBOX_TYPE_TEMP: bbp = &bboxes[1]; break; default: errmsg ("Incorrect call of activate_bbox()"); return; } bbp->active = status; } /* Extend all view boundaries with w */ int view_extend(view *v, double w) { if (!v) { return RETURN_FAILURE; } else { v->xv1 -= w; v->xv2 += w; v->yv1 -= w; v->yv2 += w; return RETURN_SUCCESS; } } int update_bboxes_with_view(view *v) { if (!v) { return RETURN_FAILURE; } else { VPoint vp; vp.x = v->xv1; vp.y = v->yv1; update_bboxes(vp); vp.x = v->xv2; vp.y = v->yv2; update_bboxes(vp); return RETURN_SUCCESS; } } int update_bboxes_with_vpoints(VPoint *vps, int n, double lw) { if (!vps || n < 1) { return RETURN_FAILURE; } else { int i; double xmin, xmax, ymin, ymax; view v; xmin = xmax = vps[0].x; ymin = ymax = vps[0].y; for (i = 1; i < n; i++) { if (vps[i].x < xmin) { xmin = vps[i].x; } else if (vps[i].x > xmax) { xmax = vps[i].x; } if (vps[i].y < ymin) { ymin = vps[i].y; } else if (vps[i].y > ymax) { ymax = vps[i].y; } } v.xv1 = xmin; v.xv2 = xmax; v.yv1 = ymin; v.yv2 = ymax; view_extend(&v, lw/2); update_bboxes_with_view(&v); return RETURN_SUCCESS; } } int VPoints2bbox(VPoint *vp1, VPoint *vp2, view *bb) { if (!bb || !vp1 || !vp2) { return RETURN_FAILURE; } else { if (vp1->x <= vp2->x) { bb->xv1 = vp1->x; bb->xv2 = vp2->x; } else { bb->xv1 = vp2->x; bb->xv2 = vp1->x; } if (vp1->y <= vp2->y) { bb->yv1 = vp1->y; bb->yv2 = vp2->y; } else { bb->yv1 = vp2->y; bb->yv2 = vp1->y; } return RETURN_SUCCESS; } } static int draw_mode = TRUE; void set_draw_mode(int mode) { draw_mode = mode ? TRUE:FALSE; } int get_draw_mode(void) { return (draw_mode); } void vpswap(VPoint *vp1, VPoint *vp2) { VPoint vptmp; vptmp = *vp1; *vp1 = *vp2; *vp2 = vptmp; } int points_overlap(VPoint vp1, VPoint vp2) { double delta; delta = 1.0/MIN2(page_width, page_height); if (fabs(vp2.x - vp1.x) < delta || fabs(vp2.y - vp1.y) < delta) { return TRUE; } else { return FALSE; } } static int max_path_length = MAX_DRAWING_PATH; void set_max_path_limit(int limit) { max_path_length = limit; } int get_max_path_limit(void) { return max_path_length; } #define PURGE_INIT_FACTOR 1.0 #define PURGE_ITER_FACTOR M_SQRT2 #define PURGE_EPS_WORST 0.01 /* Note: vps and pvps may be the same array! */ static void purge_dense_points(const VPoint *vps, int n, VPoint *pvps, int *np) { int i, j, iter; int ok; double eps; VPoint vptmp; if (*np <= 0) { *np = 0; return; } if (n <= *np) { memmove(pvps, vps, n*sizeof(VPoint)); *np = n; return; } /* Start with 1/np epsilon */ eps = PURGE_INIT_FACTOR/(*np); iter = 0; ok = FALSE; while (ok == FALSE) { j = 0; vptmp = vps[0]; for (i = 1; i < n; i++) { if (fabs(vps[i].x - vptmp.x) > eps || fabs(vps[i].y - vptmp.y) > eps) { vptmp = vps[i]; j++; if (j >= *np) { break; } } } if (j < *np - 1) { ok = TRUE; } else { eps *= PURGE_ITER_FACTOR; } iter++; } if (eps > PURGE_EPS_WORST) { errmsg("Purging failed. Increase 'Max drawing path length' in prefs."); } /* actually fill in the purged array */ pvps[0] = vps[0]; j = 0; for (i = 1; i < n; i++) { if (fabs(vps[i].x - pvps[j].x) > eps || fabs(vps[i].y - pvps[j].y) > eps) { pvps[++j] = vps[i]; } } *np = j + 1; #ifdef DEBUG if (get_debuglevel() == 6) { printf("Purging %d points to %d in %d iteration(s)\n", n, *np, iter); } #endif } grace-5.1.23/src/dummydrv.h0000644000076500001440000000320410071615561015240 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defines.h" int dummyinitgraphics(void); void dummy_drawpixel(VPoint vp); void dummy_drawpolyline(VPoint *vps, int n, int mode); void dummy_fillpolygon(VPoint *vps, int nc); void dummy_drawarc(VPoint vp1, VPoint vp2, int a1, int a2); void dummy_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode); void dummy_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type); void dummy_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning); void dummy_leavegraphics(void); grace-5.1.23/src/xutil.c0000644000076500001440000002506110071615562014537 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include "defines.h" #include "globals.h" #include "utils.h" #include "files.h" #include "graphs.h" #include "graphutils.h" #include "plotone.h" #include "device.h" #include "x11drv.h" #include "protos.h" extern Window root, xwin; extern Display *disp; extern Widget app_shell; extern XtAppContext app_con; extern GC gc, gcxor; extern int depth; static Pixmap bufpixmap = (Pixmap) NULL; extern int win_h, win_w; /* declared in x11drv.c */ extern int inpipe; extern char batchfile[]; extern Input_buffer *ib_tbl; extern int ib_tblsize; /* * cursors */ static Cursor wait_cursor; static Cursor line_cursor; static Cursor find_cursor; static Cursor move_cursor; static Cursor text_cursor; static Cursor kill_cursor; static int cur_cursor = -1; static void xmonitor_rti(XtPointer ib, int *ptrFd, XtInputId *ptrId); void DefineDialogCursor(Cursor c); void UndefineDialogCursor(); void set_wait_cursor() { if (disp == NULL) { return; } DefineDialogCursor(wait_cursor); } void unset_wait_cursor() { if (disp == NULL) { return; } UndefineDialogCursor(); if (cur_cursor >= 0) { set_cursor(cur_cursor); } } void set_cursor(int c) { if (disp == NULL) { return; } XUndefineCursor(disp, xwin); cur_cursor = c; switch (c) { case 0: XDefineCursor(disp, xwin, line_cursor); break; case 1: XDefineCursor(disp, xwin, find_cursor); break; case 2: XDefineCursor(disp, xwin, text_cursor); break; case 3: XDefineCursor(disp, xwin, kill_cursor); break; case 4: XDefineCursor(disp, xwin, move_cursor); break; default: cur_cursor = -1; break; } XFlush(disp); } void init_cursors(void) { wait_cursor = XCreateFontCursor(disp, XC_watch); line_cursor = XCreateFontCursor(disp, XC_crosshair); find_cursor = XCreateFontCursor(disp, XC_hand2); text_cursor = XCreateFontCursor(disp, XC_xterm); kill_cursor = XCreateFontCursor(disp, XC_pirate); move_cursor = XCreateFontCursor(disp, XC_fleur); cur_cursor = -1; } /* * put a string in the title bar */ void set_title(char *ts) { static char *ts_save = NULL; static int dstate_save = 0; int dstate = is_dirtystate(); if (!inwin || ts == NULL) { return; } else if (ts_save == NULL || strcmp(ts_save, ts) != 0 || dstate != dstate_save) { char *buf1, *buf2; ts_save = copy_string(ts_save, ts); dstate_save = dstate; buf1 = copy_string(NULL, "Grace: "); buf1 = concat_strings(buf1, ts); buf2 = copy_string(NULL, ts); if (dstate) { buf2 = concat_strings(buf2, "*"); buf1 = concat_strings(buf1, " (modified)"); } XtVaSetValues(app_shell, XtNtitle, buf1, XtNiconName, buf2, NULL); xfree(buf1); xfree(buf2); } } /* * Auxiliary routines for simultaneous drawing on display and pixmap */ static void aux_XDrawLine(int x1, int y1, int x2, int y2) { XDrawLine(disp, xwin, gcxor, x1, y1, x2, y2); if (bufpixmap != (Pixmap) NULL) { XDrawLine(disp, bufpixmap, gcxor, x1, y1, x2, y2); } } static void aux_XDrawRectangle(int x1, int y1, int x2, int y2) { XDrawRectangle(disp, xwin, gcxor, x1, y1, x2, y2); if (bufpixmap != (Pixmap) NULL) { XDrawRectangle(disp, bufpixmap, gcxor, x1, y1, x2, y2); } } static void aux_XFillRectangle(int x, int y, unsigned int width, unsigned int height) { XFillRectangle(disp, xwin, gcxor, x, y, width, height); if (bufpixmap != (Pixmap) NULL) { XFillRectangle(disp, bufpixmap, gcxor, x, y, width, height); } } /* * draw the graph focus indicators */ void draw_focus(int gno) { int ix1, iy1, ix2, iy2; view v; VPoint vp; if (draw_focus_flag == TRUE) { get_graph_viewport(gno, &v); vp.x = v.xv1; vp.y = v.yv1; xlibVPoint2dev(vp, &ix1, &iy1); vp.x = v.xv2; vp.y = v.yv2; xlibVPoint2dev(vp, &ix2, &iy2); aux_XFillRectangle(ix1 - 5, iy1 - 5, 10, 10); aux_XFillRectangle(ix1 - 5, iy2 - 5, 10, 10); aux_XFillRectangle(ix2 - 5, iy2 - 5, 10, 10); aux_XFillRectangle(ix2 - 5, iy1 - 5, 10, 10); } } /* * rubber band line (optionally erasing previous one) */ void select_line(int x1, int y1, int x2, int y2, int erase) { static int x1_old, y1_old, x2_old, y2_old; if (erase) { aux_XDrawLine(x1_old, y1_old, x2_old, y2_old); } x1_old = x1; y1_old = y1; x2_old = x2; y2_old = y2; aux_XDrawLine(x1, y1, x2, y2); } /* * draw an xor'ed box (optionally erasing previous one) */ void select_region(int x1, int y1, int x2, int y2, int erase) { static int x1_old, y1_old, dx_old, dy_old; int dx = x2 - x1; int dy = y2 - y1; if (dx < 0) { iswap(&x1, &x2); dx = -dx; } if (dy < 0) { iswap(&y1, &y2); dy = -dy; } if (erase) { aux_XDrawRectangle(x1_old, y1_old, dx_old, dy_old); } x1_old = x1; y1_old = y1; dx_old = dx; dy_old = dy; aux_XDrawRectangle(x1, y1, dx, dy); } /* * slide an xor'ed bbox shifted by shift_*, (optionally erasing previous one) */ void slide_region(view bb, int shift_x, int shift_y, int erase) { int x1, x2; int y1, y2; VPoint vp; vp.x = bb.xv1; vp.y = bb.yv1; xlibVPoint2dev(vp, &x1, &y1); x1 += shift_x; y1 += shift_y; vp.x = bb.xv2; vp.y = bb.yv2; xlibVPoint2dev(vp, &x2, &y2); x2 += shift_x; y2 += shift_y; select_region(x1, y1, x2, y2, erase); } static int crosshair_erase = FALSE; void reset_crosshair(void) { crosshair_erase = FALSE; } /* * draw a crosshair cursor */ void crosshair_motion(int x, int y) { static int cursor_oldx, cursor_oldy; /* Erase the previous crosshair */ if (crosshair_erase == TRUE) { aux_XDrawLine(0, cursor_oldy, win_w, cursor_oldy); aux_XDrawLine(cursor_oldx, 0, cursor_oldx, win_h); } /* Draw the new crosshair */ aux_XDrawLine(0, y, win_w, y); aux_XDrawLine(x, 0, x, win_h); crosshair_erase = TRUE; cursor_oldx = x; cursor_oldy = y; } /* * expose/resize proc */ void expose_resize(Widget w, XtPointer client_data, XmDrawingAreaCallbackStruct *cbs) { static int inc = 0; #if defined(DEBUG) if (get_debuglevel() == 7) { printf("Call to expose_resize(); reason == %d\n", cbs->reason); } #endif /* HACK */ if (xwin == 0) { return; } if (!inc) { inwin = TRUE; inc++; if (batchfile[0]) { getparms(batchfile); } if (inpipe == TRUE) { getdata(get_cg(), "stdin", SOURCE_DISK, LOAD_SINGLE); inpipe = FALSE; } update_all(); drawgraph(); return; } if (cbs->reason == XmCR_EXPOSE) { xlibredraw(cbs->window, cbs->event->xexpose.x, cbs->event->xexpose.y, cbs->event->xexpose.width, cbs->event->xexpose.height); return; } if (get_pagelayout() == PAGE_FREE) { unsigned int w, h; sync_canvas_size(&w, &h, TRUE); drawgraph(); } } /* * redraw all */ void xdrawgraph(void) { if (inwin && (auto_redraw)) { set_wait_cursor(); drawgraph(); unset_wait_cursor(); } } void xlibredraw(Window window, int x, int y, int width, int height) { if (inwin == TRUE && bufpixmap != (Pixmap) NULL) { XCopyArea(disp, bufpixmap, window, gc, x, y, width, height, x, y); } } Pixmap resize_bufpixmap(unsigned int w, unsigned int h) { static unsigned int pixmap_w = 0, pixmap_h = 0; if (w == 0 || h == 0) { return (bufpixmap); } if (bufpixmap == (Pixmap) NULL) { bufpixmap = XCreatePixmap(disp, root, w, h, depth); } else if (pixmap_w != w || pixmap_h != h) { XFreePixmap(disp, bufpixmap); bufpixmap = XCreatePixmap(disp, root, w, h, depth); } if (bufpixmap == (Pixmap) NULL) { errmsg("Can't allocate buffer pixmap"); pixmap_w = 0; pixmap_h = 0; return (xwin); } else { pixmap_w = w; pixmap_h = h; return (bufpixmap); } } static void xmonitor_rti(XtPointer ib, int *ptrFd, XtInputId *ptrId) { set_wait_cursor(); monitor_input((Input_buffer *) ib, 1, 1); unset_wait_cursor(); } void xunregister_rti(XtInputId id) { if (disp != (Display *) NULL) { /* the screen has been initialized : we can remove the buffer */ XtRemoveInput(id); } } void xregister_rti(Input_buffer *ib) { if (disp != (Display *) NULL) { /* the screen has been initialized : we can register the buffer */ ib->id = (unsigned long) XtAppAddInput(app_con, ib->fd, (XtPointer) XtInputReadMask, xmonitor_rti, (XtPointer) ib); } } /* * for the goto point feature */ void setpointer(VPoint vp) { int x, y; xlibVPoint2dev(vp, &x, &y); /* Make sure we remain inside the DA widget dimensions */ x = MAX2(x, 0); x = MIN2(x, win_w); y = MAX2(y, 0); y = MIN2(y, win_h); XWarpPointer(disp, None, xwin, 0, 0, 0, 0, x, y); } char *display_name(void) { return DisplayString(disp); } grace-5.1.23/src/fontwin.c0000644000076500001440000003053110326532651015054 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Font tool * */ #include #include #include #include #include #include #include #include #include #include #include #include "t1fonts.h" #include "utils.h" #include "motifinc.h" #include "protos.h" /* used globally */ extern Widget app_shell; extern Display *disp; extern Window root; extern GC gc; extern int depth; extern unsigned long xvlibcolors[]; static Widget fonttool_frame = NULL; static OptionStructure *font_select_item; static TextStructure *string_item = NULL; static Widget cstext_parent = NULL; static int FontID; static BBox bbox; static float Size = 16.8; static int enable_edit_cb; static void DrawCB(Widget w,XtPointer cd, XbaeMatrixDrawCellCallbackStruct *cbs); static void EnterCB(Widget w, XtPointer cd, XbaeMatrixEnterCellCallbackStruct *cbs); static void update_fonttool_cb(int value, void *data); static void EditStringCB(Widget w, XtPointer client_data, XmAnyCallbackStruct *cbs); static void fonttool_aac_cb(void *data); void create_fonttool_cb(void *data) { create_fonttool((Widget) data); } #ifdef NEW_CODE static void enlarge_glyph(Widget parent, XtPointer closure, XEvent *event, Boolean* doit) { XButtonPressedEvent *e = (XButtonPressedEvent *) event; if (e->button == 3) { int row, col; int x0, y0, x1, y1, cwidth, cheight; XbaeMatrixRowColToXY(parent, 0, 0, &x0, &y0); XbaeMatrixRowColToXY(parent, 1, 1, &x1, &y1); cwidth = x1 - x0; cheight = y0 - y1; col = (e->x - xleft)/cwidth; row = (yupper - e->y)/cheight; printf("%d %d\n", col, row); } } #endif void create_fonttool(Widget cstext) { int i; short widths[16]; unsigned char column_alignments[16]; Widget fonttool_panel, font_table, aac_buts; if (string_item != NULL && cstext == string_item->text) { /* avoid recursion */ return; } if (cstext_parent != NULL) { /* unlock previous parent */ SetSensitive(cstext_parent, True); } cstext_parent = cstext; if (fonttool_frame == NULL) { fonttool_frame = XmCreateDialogShell(app_shell, "Font tool", NULL, 0); handle_close(fonttool_frame); fonttool_panel = XtCreateWidget("fonttool_panel", xmFormWidgetClass, fonttool_frame, NULL, 0); font_select_item = CreateFontChoice(fonttool_panel, "Font:"); XtVaSetValues(font_select_item->menu, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_FORM, NULL); for (i = 0; i < 16; i++) { widths[i] = 2; column_alignments[i] = XmALIGNMENT_BEGINNING; } font_table = XtVaCreateManagedWidget( "fontTable", xbaeMatrixWidgetClass, fonttool_panel, XmNrows, 16, XmNcolumns, 16, XmNvisibleRows, 8, XmNvisibleColumns, 16, XmNfill, True, XmNcolumnWidths, widths, XmNcolumnAlignments, column_alignments, XmNgridType, XmGRID_CELL_SHADOW, XmNcellShadowType, XmSHADOW_ETCHED_OUT, XmNcellShadowThickness, 2, XmNaltRowCount, 0, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, font_select_item->menu, NULL); XtAddCallback(font_table, XmNdrawCellCallback, (XtCallbackProc) DrawCB, NULL); XtAddCallback(font_table, XmNenterCellCallback, (XtCallbackProc) EnterCB, NULL); #ifdef NEW_CODE XtAddEventHandler(font_table, ButtonPressMask, False, enlarge_glyph, NULL); #endif AddOptionChoiceCB(font_select_item, update_fonttool_cb, font_table); string_item = CreateCSText(fonttool_panel, "CString:"); XtVaSetValues(string_item->form, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, font_table, NULL); XtAddCallback(string_item->text, XmNmodifyVerifyCallback, (XtCallbackProc) EditStringCB, font_table); #ifdef NEW_CODE scrolled_window = XtVaCreateManagedWidget("scrolled_window", xmScrolledWindowWidgetClass, fonttool_panel, XmNscrollingPolicy, XmAUTOMATIC, XmNvisualPolicy, XmVARIABLE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, GetParent(string_item), XmNbottomAttachment, XmATTACH_FORM, NULL); glyph_item = XtVaCreateManagedWidget("glyph", xmDrawingAreaWidgetClass, scrolled_window, XmNheight, (Dimension) 100, XmNwidth, (Dimension) 600, XmNresizePolicy, XmRESIZE_ANY, XmNbackground, xvlibcolors[0], NULL); #endif aac_buts = CreateAACButtons(fonttool_panel, fonttool_panel, fonttool_aac_cb); XtVaSetValues(aac_buts, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, string_item->form, XmNbottomAttachment, XmATTACH_FORM, NULL); update_fonttool_cb(0, font_table); ManageChild(fonttool_panel); } enable_edit_cb = FALSE; if (cstext_parent == NULL) { SetTextString(string_item, ""); } else { SetTextString(string_item, xv_getstr(cstext_parent)); /* Lock editable text */ SetSensitive(cstext_parent, False); } enable_edit_cb = TRUE; RaiseWindow(fonttool_frame); } static T1_TMATRIX UNITY_MATRIX = {1.0, 0.0, 0.0, 1.0}; static void DrawCB(Widget w, XtPointer cd, XbaeMatrixDrawCellCallbackStruct *cbs) { unsigned char c; GLYPH *glyph; int height, width, hshift, vshift; Pixmap pixmap, ptmp; char dummy_bits[1] = {0}; int valid_char; long bg, fg; c = 16*cbs->row + cbs->column; if (FontID == BAD_FONT_ID) { glyph = NULL; } else { glyph = T1_SetChar(FontID, c, Size, &UNITY_MATRIX); } if (glyph != NULL && glyph->bits != NULL) { valid_char = TRUE; height = glyph->metrics.ascent - glyph->metrics.descent; width = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; hshift = MAX2(glyph->metrics.leftSideBearing - bbox.llx, 0); vshift = MAX2(bbox.ury - glyph->metrics.ascent, 0); XtVaGetValues(w, XmNbackground, &bg, XmNforeground, &fg, NULL); XSetForeground(disp, gc, bg); ptmp = XCreateBitmapFromData(disp, root, (char *) glyph->bits, width, height); XSetBackground(disp, gc, bg); pixmap = XCreatePixmap(disp, root, bbox.urx - bbox.llx, bbox.ury - bbox.lly, depth); XFillRectangle(disp, pixmap, gc, 0, 0, bbox.urx - bbox.llx, bbox.ury - bbox.lly); XSetForeground(disp, gc, fg); XCopyPlane(disp, ptmp, pixmap, gc, 0, 0, width, height, hshift, vshift, 1); XFreePixmap(disp, ptmp); } else { if (c == ' ') { valid_char = TRUE; } else { valid_char = FALSE; } pixmap = XCreateBitmapFromData(disp, root, dummy_bits, 1, 1); } /* Assign it a pixmap */ cbs->pixmap = pixmap; cbs->type = XbaePixmap; XbaeMatrixSetCellUserData(w, cbs->row, cbs->column, (XtPointer) valid_char); return; } static void insert_into_string(char *s) { int pos; pos = GetTextCursorPos(string_item); TextInsert(string_item, pos, s); } static void EnterCB(Widget w, XtPointer cd, XbaeMatrixEnterCellCallbackStruct *cbs) { int valid_char; char s[7]; unsigned char c; valid_char = (int) XbaeMatrixGetCellUserData(w, cbs->row, cbs->column); if (valid_char == TRUE) { c = 16*cbs->row + cbs->column; /* TODO: check for c being displayable in the _X_ font */ if (c > 31) { s[0] = (char) c; s[1] = '\0'; } else { sprintf(s, "\\#{%02x}", c); } insert_into_string(s); } else { XBell(disp, 25); } } static void update_fonttool_cb(int value, void *data) { char *buf; int x0, y0, x1, y1, cwidth, cheight; int csize, bsize; Widget font_table = (Widget) data; FontID = value; switch (T1_CheckForFontID(FontID)) { case 0: T1_LoadFont(FontID); break; case -1: errmsg("Couldn't load font"); FontID = BAD_FONT_ID; return; break; default: break; } bbox = T1_GetFontBBox(FontID); /* check if bbox is zero or invalid and then calculate it ourselves */ if (bbox.llx >= bbox.urx || bbox.lly >= bbox.ury) { int c; memset(&bbox, 0, sizeof(bbox)); for (c = 0; c < 256; c++) { BBox bbox_tmp = T1_GetCharBBox(FontID, c); bbox.llx = MIN2(bbox.llx, bbox_tmp.llx); bbox.lly = MIN2(bbox.lly, bbox_tmp.lly); bbox.urx = MAX2(bbox.urx, bbox_tmp.urx); bbox.ury = MAX2(bbox.ury, bbox_tmp.ury); } } XbaeMatrixRowColToXY(font_table, 0, 0, &x0, &y0); XbaeMatrixRowColToXY(font_table, 1, 1, &x1, &y1); cwidth = x1 - x0; cheight = y1 - y0; /* 6 = 2*cellShadowThickness + 2 */ csize = MIN2(cwidth, cheight) - 6; bsize = MAX2(bbox.urx - bbox.llx, bbox.ury - bbox.lly); Size = floor(1000.0*csize/bsize); bbox.llx = bbox.llx*Size/1000; bbox.lly = bbox.lly*Size/1000; bbox.urx = bbox.urx*Size/1000; bbox.ury = bbox.ury*Size/1000; XbaeMatrixRefresh(font_table); buf = copy_string(NULL, "\\f{"); buf = concat_strings(buf, get_fontalias(FontID)); buf = concat_strings(buf, "}"); insert_into_string(buf); xfree(buf); } static void EditStringCB(Widget w, XtPointer client_data, XmAnyCallbackStruct *cbs) { unsigned char c; int valid_char; static int column = 0, row = 0; XmTextVerifyCallbackStruct *tcbs; XmTextBlock text; Widget ftable = (Widget) client_data; if (enable_edit_cb != TRUE) { return; } XbaeMatrixDeselectCell(ftable, row, column); tcbs = (XmTextVerifyCallbackStruct *) cbs; text = tcbs->text; if (text->length == 1) { /* */ c = text->ptr[0]; row = c/16; column = c % 16; valid_char = (int) XbaeMatrixGetCellUserData(ftable, row, column); if (valid_char == TRUE) { XbaeMatrixSelectCell(ftable, row, column); } else { tcbs->doit = False; } } } static void fonttool_aac_cb(void *data) { int aac_mode; aac_mode = (int) data; if (aac_mode == AAC_CLOSE) { UnmanageChild(fonttool_frame); if (cstext_parent != NULL) { SetSensitive(cstext_parent, True); } return; } if (cstext_parent != NULL) { xv_setstr(cstext_parent, GetTextString(string_item)); } if (aac_mode == AAC_ACCEPT) { UnmanageChild(fonttool_frame); if (cstext_parent != NULL) { SetSensitive(cstext_parent, True); } } } grace-5.1.23/src/graphutils.h0000644000076500001440000000516010071615561015556 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Graph utils * */ #ifndef __GRAPHUTILS_H_ #define __GRAPHUTILS_H_ #define GSCROLL_LEFT 0 #define GSCROLL_RIGHT 1 #define GSCROLL_DOWN 2 #define GSCROLL_UP 3 #define GZOOM_SHRINK 0 #define GZOOM_EXPAND 1 #define GOVERLAY_SMART_AXES_DISABLED 0 #define GOVERLAY_SMART_AXES_NONE 1 #define GOVERLAY_SMART_AXES_X 2 #define GOVERLAY_SMART_AXES_Y 3 #define GOVERLAY_SMART_AXES_XY 4 /* Order of matrix fill (inversion mask bits) */ #define GA_ORDER_V_INV 1 #define GA_ORDER_H_INV 2 #define GA_ORDER_HV_INV 4 /* Default page offsets and gaps for graph arranging */ #define GA_OFFSET_DEFAULT 0.15 #define GA_GAP_DEFAULT 0.2 char *get_format_types(int f); int wipeout(void); void scroll_proc(int value); void scrollinout_proc(int value); int graph_scroll(int type); int graph_zoom(int type); int overlay_graphs(int gsec, int gpri, int type); int arrange_graphs(int *graphs, int ngraphs, int nrows, int ncols, int order, int snake, double loff, double roff, double toff, double boff, double vgap, double hgap, int hpack, int vpack); int arrange_graphs_simple(int nrows, int ncols, int order, int snake, double offset, double hgap, double vgap); void autotick_axis(int gno, int axis); void autoscale_byset(int gno, int setno, int autos_type); int autoscale_graph(int gno, int autos_type); void move_legend(int gno, VVector shift); void move_timestamp(VVector shift); void rescale_viewport(double ext_x, double ext_y); #endif /* __GRAPHUTILS_H_ */ grace-5.1.23/src/regionutils.c0000644000076500001440000002051210071615562015732 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * routines to allocate, manipulate, and return * information about regions. * */ #include #include #include #include "globals.h" #include "draw.h" #include "graphs.h" #include "utils.h" #include "protos.h" int regiontype = 0; /* * see if (x,y) lies inside the plot */ int inbounds(int gno, double x, double y) { WPoint wp; wp.x = x; wp.y = y; return is_validWPoint(wp); } int isactive_region(int regno) { return (regno == MAXREGION || regno == MAXREGION + 1 || rg[regno].active == TRUE); } char *region_types(int it, int which) { char *s; s = "UNDEFINED"; switch (it) { case REGION_TOLEFT: s = "REGION_TOLEFT"; break; case REGION_TORIGHT: s = "REGION_TORIGHT"; break; case REGION_ABOVE: s = "REGION_ABOVE"; break; case REGION_BELOW: s = "REGION_BELOW"; break; case REGION_POLYI: if (which) { s = "REGION_POLYI"; } else { s = "INSIDE POLY"; } break; case REGION_POLYO: if (which) { s = "REGION_POLYO"; } else { s = "OUTSIDE POLY"; } break; case REGION_HORIZI: s ="REGION_HORIZI"; break; case REGION_VERTI: s ="REGION_VERTI"; break; case REGION_HORIZO: s ="REGION_HORIZO"; break; case REGION_VERTO: s ="REGION_VERTO"; break; } return s; } void kill_region(int r) { if (rg[r].active) { XCFREE(rg[r].x); XCFREE(rg[r].y); rg[r].active = FALSE; rg[r].n = 0; set_dirtystate(); } } void kill_all_regions(void) { int r; for (r = 0; r < MAXREGION; r++) { kill_region(r); } } void activate_region(int r, int type, int linkto) { kill_region(r); rg[r].active = TRUE; rg[r].type = type; rg[r].linkto = linkto; set_dirtystate(); } /* * report on sets in a region */ void reporton_region(int gno, int rno, int type) { char buf[256]; int i, j, first, contained; double *x, *y; sprintf(buf, "\nRegion R%1d contains:\n", rno); stufftext(buf); for (j = 0; j < number_of_sets(gno); j++) { if (is_set_active(gno, j)) { x = getx(gno, j); y = gety(gno, j); first = 1; contained = 0; for (i = 0; i < getsetlength(gno, j); i++) { if (inregion(rno, x[i], y[i])) { contained = 1; switch (type) { case 0: /* report on sets */ if (first) { first = 0; sprintf(buf, " Set S%1d\n", j); stufftext(buf); } break; case 1: /* points */ if (first) { first = 0; sprintf(buf, " Set S%1d\n", j); stufftext(buf); } sprintf(buf, " %d %f %f\n", i + 1, x[i], y[i]); stufftext(buf); break; } } else { contained = 0; } } } } stufftext("\n"); } void load_poly_region(int r, int gno, int n, WPoint *wps) { int i; if (n > 2) { activate_region(r, regiontype, gno); rg[r].n = n; rg[r].x = xcalloc(n, SIZEOF_DOUBLE); rg[r].y = xcalloc(n, SIZEOF_DOUBLE); for (i = 0; i < n; i++) { rg[r].x[i] = wps[i].x; rg[r].y[i] = wps[i].y; } } } /* * routines to determine if a point lies in a polygon */ int intersect_to_left(double x, double y, double x1, double y1, double x2, double y2) { double xtmp, m, b; /* ignore horizontal lines */ if (y1 == y2) { return 0; } /* not contained vertically */ if (((y < y1) && (y < y2)) || ((y > y1) && (y > y2))) { return 0; } /* none of the above, compute the intersection */ if ((xtmp = x2 - x1) != 0.0) { m = (y2 - y1) / xtmp; b = y1 - m * x1; xtmp = (y - b) / m; } else { xtmp = x1; } if (xtmp <= x) { /* check for intersections at a vertex */ /* if this is the max ordinate then accept */ if (y == y1) { if (y1 > y2) { return 1; } else { return 0; } } /* check for intersections at a vertex */ if (y == y2) { if (y2 > y1) { return 1; } else { return 0; } } /* no vertices intersected */ return 1; } return 0; } /* * determine if (x,y) is in the polygon xlist[], ylist[] */ int inbound(double x, double y, double *xlist, double *ylist, int n) { int i, l = 0; for (i = 0; i < n; i++) { l += intersect_to_left(x, y, xlist[i], ylist[i], xlist[(i + 1) % n], ylist[(i + 1) % n]); } return l % 2; } /* * routines to determine if a point lies to the left of an infinite line */ int isleft(double x, double y, double x1, double y1, double x2, double y2) { double xtmp, m, b; /* horizontal lines */ if (y1 == y2) { return 0; } /* none of the above, compute the intersection */ if ((xtmp = x2 - x1) != 0.0) { m = (y2 - y1) / xtmp; b = y1 - m * x1; xtmp = (y - b) / m; } else { xtmp = x1; } if (xtmp >= x) { return 1; } return 0; } /* * routines to determine if a point lies to the left of an infinite line */ int isright(double x, double y, double x1, double y1, double x2, double y2) { double xtmp, m, b; /* horizontal lines */ if (y1 == y2) { return 0; } if ((xtmp = x2 - x1) != 0.0) { m = (y2 - y1) / xtmp; b = y1 - m * x1; xtmp = (y - b) / m; } else { xtmp = x1; } if (xtmp <= x) { return 1; } return 0; } /* * routines to determine if a point lies above an infinite line */ int isabove(double x, double y, double x1, double y1, double x2, double y2) { double ytmp, m, b; /* vertical lines */ if (x1 == x2) { return 0; } if ((ytmp = y2 - y1) != 0.0) { m = ytmp / (x2 - x1); b = y1 - m * x1; ytmp = m * x + b; } else { ytmp = y1; } if (ytmp <= y) { return 1; } return 0; } /* * routines to determine if a point lies below an infinite line */ int isbelow(double x, double y, double x1, double y1, double x2, double y2) { double ytmp, m, b; /* vertical lines */ if (x1 == x2) { return 0; } if ((ytmp = y2 - y1) != 0.0) { m = ytmp / (x2 - x1); b = y1 - m * x1; ytmp = m * x + b; } else { ytmp = y1; } if (ytmp >= y) { return 1; } return 0; } int inregion(int regno, double x, double y) { if (regno == MAXREGION) { return (inbounds(get_cg() , x, y)); } if (regno == MAXREGION + 1) { return (!inbounds(get_cg() , x, y)); } if (rg[regno].active == TRUE) { switch (rg[regno].type) { case REGION_POLYI: if (inbound(x, y, rg[regno].x, rg[regno].y, rg[regno].n)) { return 1; } break; case REGION_POLYO: if (!inbound(x, y, rg[regno].x, rg[regno].y, rg[regno].n)) { return 1; } break; case REGION_TORIGHT: if (isright(x, y, rg[regno].x1, rg[regno].y1, rg[regno].x2, rg[regno].y2)) { return 1; } break; case REGION_TOLEFT: if (isleft(x, y, rg[regno].x1, rg[regno].y1, rg[regno].x2, rg[regno].y2)) { return 1; } break; case REGION_ABOVE: if (isabove(x, y, rg[regno].x1, rg[regno].y1, rg[regno].x2, rg[regno].y2)) { return 1; } break; case REGION_BELOW: if (isbelow(x, y, rg[regno].x1, rg[regno].y1, rg[regno].x2, rg[regno].y2)) { return 1; } break; case REGION_HORIZI: return (x >= rg[regno].x1) && ( x <= rg[regno].x2); break; case REGION_VERTI: return (y >= rg[regno].y1) && ( y <= rg[regno].y2); break; case REGION_HORIZO: return !( (x >= rg[regno].x1) && ( x <= rg[regno].x2) ); break; case REGION_VERTO: return !( (y >= rg[regno].y1) && ( y <= rg[regno].y2) ); break; } } return 0; } grace-5.1.23/src/mifdrv.c0000644000076500001440000006235010071615562014663 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Driver for the Maker Interchange Format */ #include #include #include #include #include "defines.h" #include "utils.h" #include "cmath.h" #include "draw.h" #include "device.h" #include "devlist.h" #include "patterns.h" #include "mifdrv.h" #define MIF_MARGIN 15.0 extern FILE *prstream; static Device_entry dev_mif = {DEVICE_FILE, "MIF", mifinitgraphics, NULL, NULL, "mif", TRUE, FALSE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; /* mapping between Grace and MIF fill patterns. This is really ugly but * MIF uses only 16 patterns which can only be customised on UNIX platforms * and there only for the whole FrameMaker-product and not for a single * document. */ static int mif_fillpattern(int fillpattern) { switch (fillpattern) { case 0 : return 15; case 1 : return 0; case 2 : return 1; case 3 : return 2; case 4 : return 3; case 5 : return 4; case 6 : return 5; case 7 : return 6; case 8 : return 7; case 9 : return 8; case 10 : return 9; case 11 : return 10; case 12 : return 11; case 13 : return 12; case 14 : return 13; case 15 : return 14; case 16 : return 10; case 17 : return 11; case 18 : return 12; case 19 : return 2; case 20 : return 3; case 21 : return 4; case 22 : return 5; case 23 : return 6; case 24 : return 7; case 25 : return 8; case 26 : return 9; case 27 : return 10; case 28 : return 11; case 29 : return 12; case 30 : return 13; case 31 : return 14; default : return 0; } } /* * escape special characters */ static char *escape_specials(unsigned char *s, int len) { static char *es = NULL; int i, elen = 0; /* Define Array with all charactercodes from 128 to 255 for the conversion of the ISOLatin1 codes to FrameMaker codes. Characters, which are not part of the FrameMaker characterset are coded as \xc0 (exclamdown) The following conversions are defined onesuperior -> 1 twosuperior -> 2 threesuperior -> 3 degree -> ring multiply -> x Yacute -> Y divide -> : yacute -> y Matthias Dillier, 10.1.2001 */ static char *code[128] = { "80","81","82","83","84","85","86","87", "88","89","8a","8b","8c","8d","8e","8f", "f5","d4","d5","f6","f7","f8","f9","fa", "ac","99","fb","fc","9c","fd","fe","c0", "a0","c1","a2","a3","db","b4","c0","a4", "ac","a9","bb","c7","c2","2d","a8","f8", "fb","c0","32","33","ab","c0","a6","e1", "fc","31","bc","c8","c0","c0","c0","c0", "cb","e7","e5","cc","80","81","ae","82", "e9","83","e6","e8","ed","ea","eb","ec", "c0","84","f1","ee","ef","cd","85","78", "af","f4","f2","f3","86","59","c0","a7", "88","87","89","8b","8a","8c","be","8d", "8f","8e","90","91","93","92","94","95", "c0","96","98","97","99","9b","9a","3a", "bf","9d","9c","9e","9f","79","c0","d8" }; elen = 0; for (i = 0; i < len; i++) { if (s[i] == '\t' || s[i] == '>' || s[i] == '`' || s[i] == '\'' || s[i] == '\\') { elen++; } else if (s[i] > 0x7f) { elen += 4; } elen++; } es = xrealloc(es, (elen + 1)*SIZEOF_CHAR); elen = 0; for (i = 0; i < len; i++) { if (s[i] == '\t') { es[elen++] = '\\'; es[elen++] = 't'; } else if (s[i] == '>') { es[elen++] = '\\'; es[elen++] = '>'; } else if (s[i] == '`') { es[elen++] = '\\'; es[elen++] = 'Q'; } else if (s[i] == '\'') { es[elen++] = '\\'; es[elen++] = 'q'; } else if (s[i] == '\\') { es[elen++] = '\\'; es[elen++] = '\\'; } else if (s[i] > 0x7f) { es[elen++] = '\\'; es[elen++] = 'x'; /* Convert special characters to mif-charactercodes */ es[elen++] = code[s[i] - 128][0]; es[elen++] = code[s[i] - 128][1]; es[elen++] = ' '; } else { es[elen++] = (char) s[i]; } } es[elen] = '\0'; return (es); } int register_mif_drv(void) { return register_device(dev_mif); } int mifinitgraphics(void) { int i; double *data; double c, m, y, k; fRGB *frgb; /* device-dependent routines */ devupdatecmap = NULL; devdrawpixel = mif_drawpixel; devdrawpolyline = mif_drawpolyline; devfillpolygon = mif_fillpolygon; devdrawarc = mif_drawarc; devfillarc = mif_fillarc; devputpixmap = mif_putpixmap; devputtext = mif_puttext; devleavegraphics = mif_leavegraphics; data = (double *) xrealloc(get_curdevice_data(), SIZEOF_DOUBLE); set_curdevice_data((void *) data); if (data == NULL) { return RETURN_FAILURE; } *data = MIN2(page_width_pp, page_height_pp); fprintf(prstream, " # Generated by %s\n", bi_version_string()); fprintf(prstream, "\n"); fprintf(prstream, "red > 1e-3 || frgb->green > 1e-3 || frgb->blue > 1e-3) { c = 100.0 - 100.0*frgb->red; m = 100.0 - 100.0*frgb->green; y = 100.0 - 100.0*frgb->blue; k = 0.0; } else { c = 0.0; m = 0.0; y = 0.0; k = 100.0; } fprintf(prstream, " \n", get_colorname(i)); fprintf(prstream, " \n", c); fprintf(prstream, " \n", m); fprintf(prstream, " \n", y); fprintf(prstream, " \n", k); if (c < 0.1 && m < 0.1 && y < 0.1 && k > 99.9) { fprintf(prstream, " \n"); } else if (c < 0.1 && m < 0.1 && y < 0.1 && k < 0.1) { fprintf(prstream, " \n"); } else if (c < 0.1 && m > 99.9 && y > 99.9 && k < 0.1) { fprintf(prstream, " \n"); } else if (c > 99.9 && m < 0.1 && y > 99.9 && k < 0.1) { fprintf(prstream, " \n"); } else if (c > 99.9 && m > 99.9 && y < 0.1 && k < 0.1) { fprintf(prstream, " \n"); } else if (c > 99.9 && m < 0.1 && y < 0.1 && k < 0.1) { fprintf(prstream, " \n"); } else if (c < 0.1 && m > 99.9 && y < 0.1 && k < 0.1) { fprintf(prstream, " \n"); } else if (c < 0.1 && m < 0.1 && y > 99.9 && k < 0.1) { fprintf(prstream, " \n"); } fprintf(prstream, " > # end of Color\n"); } } fprintf(prstream, "> # end of ColorCatalog\n"); fprintf(prstream, "\n", page_width_pp + 2*MIF_MARGIN, page_height_pp + 2*MIF_MARGIN); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, "> # end of Document\n"); fprintf(prstream, "\n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n", page_width_pp + 2*MIF_MARGIN, page_height_pp + 2*MIF_MARGIN); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " > # end of TextRect\n"); fprintf(prstream, "> # end of Page\n"); fprintf(prstream, "\n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n", page_width_pp + 2*MIF_MARGIN, page_height_pp + 2*MIF_MARGIN); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " > # end TextRect\n"); fprintf(prstream, "> # end Page\n"); fprintf(prstream, "\n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n", page_width_pp + 2*MIF_MARGIN, page_height_pp + 2*MIF_MARGIN); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); return RETURN_SUCCESS; } void mif_object_props (int draw, int fill) { int i, ls; double lw; Pen pen; double side; pen = getpen(); if (draw) { fprintf(prstream, " \n"); side = *((double *) get_curdevice_data()); lw = side*getlinewidth(); fprintf(prstream, " \n", lw); fprintf(prstream, " \n"); } else { fprintf(prstream, " \n"); for (i = 0; i < dash_array_length[ls]; i++) { fprintf(prstream, " \n", lw*dash_array[ls][i]); } } fprintf(prstream, " > # end of DashedPattern\n"); } else { fprintf(prstream, " \n"); } if (fill) { fprintf(prstream, " \n", mif_fillpattern(pen.pattern)); } else { fprintf(prstream, " \n"); } fprintf(prstream, " \n", get_colorname(pen.color)); fprintf(prstream, " \n"); } void mif_drawpixel(VPoint vp) { double side; side = *((double *) get_curdevice_data()); fprintf(prstream, " \n", vp.x*side + MIF_MARGIN, (1.0 - vp.y)*side + MIF_MARGIN, 72.0/page_dpi, 72.0/page_dpi); fprintf(prstream, " > # end of Rectangle\n"); } void mif_drawpolyline(VPoint *vps, int n, int mode) { int i; double side; side = *((double *) get_curdevice_data()); if (mode == POLYLINE_CLOSED) { fprintf(prstream, " \n", vps[i].x*side + MIF_MARGIN, (1.0 - vps[i].y)*side + MIF_MARGIN); } if (mode == POLYLINE_CLOSED) { fprintf(prstream, " > # end of Polygon\n"); } else { switch (getlinecap()) { case LINECAP_BUTT : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; case LINECAP_ROUND : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; case LINECAP_PROJ : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; default : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; } fprintf(prstream, " > # end of PolyLine\n"); } } void mif_fillpolygon(VPoint *vps, int nc) { int i; double side; side = *((double *) get_curdevice_data()); fprintf(prstream, " \n", vps[i].x*side + MIF_MARGIN, (1.0 - vps[i].y)*side + MIF_MARGIN); } fprintf(prstream, " > # end of Polygon\n"); } static void mif_arc(int draw, int fill, VPoint vp1, VPoint vp2, int a1, int a2) { double side; side = *((double *) get_curdevice_data()); fprintf(prstream, " \n", MIN2(vp1.x, vp2.x)*side + MIF_MARGIN, (1.0 - MAX2(vp1.y, vp2.y))*side + MIF_MARGIN, fabs(vp2.x - vp1.x)*side, fabs(vp2.y - vp1.y)*side); fprintf(prstream, " \n", (a2 > 90) ? (450 - a2) : (90 - a2)); fprintf(prstream, " \n", a2 - a1); switch (getlinecap()) { case LINECAP_BUTT : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; case LINECAP_ROUND : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; case LINECAP_PROJ : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; default : fprintf(prstream, " \n"); fprintf(prstream, " \n"); break; } fprintf(prstream, " > # end of Arc\n"); } void mif_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { mif_arc(TRUE, FALSE, vp1, vp2, a1, a2); } void mif_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { int old_color; double rx, ry; VPoint vp[3]; mif_arc(FALSE, TRUE, vp1, vp2, a1, a2); if (mode == ARCFILL_CHORD) { /* compute the associated triangle */ rx = fabs(vp2.x - vp1.x)/2; ry = fabs(vp2.y - vp1.y)/2; vp[0].x = (vp1.x + vp2.x)/2; vp[0].y = (vp1.y + vp2.y)/2; vp[1].x = vp[0].x + rx * cos(a1*M_PI/180.0); vp[1].y = vp[0].y + ry * sin(a1*M_PI/180.0); vp[2].x = vp[0].x + rx * cos(a2*M_PI/180.0); vp[2].y = vp[0].y + ry * sin(a2*M_PI/180.0); if (a2 - a1 > 180) { /* the chord is larger than the default pieslice */ if (a2 - a1 < 360) { /* the triangle is not degenerated, we need to fill it */ mif_fillpolygon(vp, 3); } } else { /* the chord is smaller than the default pieslice */ /* this is a terrible hack ! MIF does not support filling only the chord of an arc so we overwrite with the background color, thus erasing underlying objects ... */ old_color = getcolor(); setcolor(getbgcolor()); mif_fillpolygon(vp, 3); setcolor(old_color); } } } /* * the following function does not work yet :-( */ void mif_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { int i, j, k, paddedW; double side; fRGB *frgb; unsigned char tmpbyte; if (pixmap_bpp != 1 && pixmap_bpp != 8) { /* MIF supports only black and white or 256 colors images */ return; } side = *((double *) get_curdevice_data()); fprintf(prstream, " \n", vp.x*side + MIF_MARGIN, (1.0 - vp.y)*side + MIF_MARGIN, 72.0*width/page_dpi, 72.0*height/page_dpi); fprintf(prstream, " \n"); fprintf(prstream, "=FrameImage\n"); fprintf(prstream, "&%%v\n"); fprintf(prstream, "&\\x\n"); /* image header */ fprintf(prstream, "&59a66a95\n"); fprintf(prstream, "&%.8x\n", (unsigned int) width); fprintf(prstream, "&%.8x\n", (unsigned int) height); fprintf(prstream, "&%.8x\n", (unsigned int) pixmap_bpp); fprintf(prstream, "&00000000\n"); fprintf(prstream, "&00000001\n"); if (pixmap_bpp == 1) { fprintf(prstream, "&00000000\n"); fprintf(prstream, "&00000000\n"); /* image data */ paddedW = PAD(width, bitmap_pad); for (k = 0; k < height; k++) { fprintf(prstream, "&"); for (j = 0; j < paddedW/bitmap_pad; j++) { tmpbyte = reversebits((unsigned char) (databits)[k*paddedW/bitmap_pad + j]); fprintf(prstream, "%.2x", tmpbyte); } fprintf(prstream, "\n"); } } else { fprintf(prstream, "&00000001\n"); fprintf(prstream, "&00000300\n"); /* colormap */ for (i = 0; i < 256; i++) { /* red intensities */ frgb = get_frgb(i); fprintf(prstream, "&%.2x\n", (frgb != NULL) ? ((unsigned int) frgb->red) : 0); } for (i = 0; i < 256; i++) { /* green intensities */ frgb = get_frgb(i); fprintf(prstream, "&%.2x\n", (frgb != NULL) ? ((unsigned int) frgb->green) : 0); } for (i = 0; i < 256; i++) { /* blue intensities */ frgb = get_frgb(i); fprintf(prstream, "&%.2x\n", (frgb != NULL) ? ((unsigned int) frgb->blue) : 0); } /* image data */ for (k = 0; k < height; k++) { fprintf(prstream, "&"); for (j = 0; j < width; j++) { fprintf(prstream, "%.2x", (unsigned int) (databits)[k*width+j]); } fprintf(prstream, "\n"); } } fprintf(prstream, "&\\x\n"); fprintf(prstream, "=EndInset\n"); fprintf(prstream, " \n"); fprintf(prstream, " > # end of ImportObject\n"); } void mif_puttext(VPoint vp, char *s, int len, int font, TextMatrix *tm, int underline, int overline, int kerning) { char *fontalias, *dash, *family, *fontfullname; double angle, side, size; Pen pen; side = *((double *) get_curdevice_data()); pen = getpen(); fprintf(prstream, " cyx, tm->cyy)*180.0/M_PI; if (angle < 0.0) { angle += 360.0; } fprintf(prstream, " \n", angle); fprintf(prstream, " \n", side*vp.x + MIF_MARGIN, side*(1.0 - vp.y) + MIF_MARGIN); fprintf(prstream, " \n"); fontalias = get_fontalias(font); fontfullname = get_fontfullname(font); family = NULL; if ((dash = strchr(fontalias, '-')) == NULL) { family = copy_string(family, fontalias); } else { family = xrealloc(family, dash - fontalias + 1); strncpy(family, fontalias, dash - fontalias); family[dash - fontalias] = '\0'; } fprintf(prstream, " \n", family); copy_string(family, NULL); fprintf(prstream, " \n", get_fontweight(font)); if (strstr(fontfullname, "UltraCompressed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "ExtraCompressed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Compressed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "UltraCondensed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "ExtraCondensed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Condensed") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Narrow") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Wide") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Poster") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Expanded") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "ExtraExtended") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Extended") != NULL) { fprintf(prstream, " \n"); } if (get_italic_angle(font) != 0) { if (strstr(fontfullname, "Italic") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Obliqued") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Oblique") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Upright") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Kursiv") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Cursive") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Slanted") != NULL) { fprintf(prstream, " \n"); } else if (strstr(fontfullname, "Inclined") != NULL) { fprintf(prstream, " \n"); } else { fprintf(prstream, " \n"); } } size = fabs((tm->cxx*tm->cyy - tm->cxy*tm->cyx) / sqrt(tm->cxx*tm->cxx + tm->cyx*tm->cyx)); fprintf(prstream, " \n", side*size); fprintf(prstream, " \n", fontalias); fprintf(prstream, " \n", (underline == TRUE) ? "FSingle" : "FNoUnderlining"); fprintf(prstream, " \n", (overline == TRUE) ? "Yes" : "No"); fprintf(prstream, " \n", (kerning == TRUE) ? "Yes" : "No"); fprintf(prstream, " \n", get_colorname(pen.color)); fprintf(prstream, " > # end of Font\n"); fprintf(prstream, " \n", escape_specials((unsigned char *) s, len)); fprintf(prstream, " > # end of TextLine\n"); } void mif_leavegraphics(void) { fprintf(prstream, " \n"); fprintf(prstream, " > # end of Group\n"); fprintf(prstream, " > # end of Frame\n"); fprintf(prstream, "> # end of AFrames\n"); fprintf(prstream, "\n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " > # end of ParaLine\n"); fprintf(prstream, " > # end of Para\n"); fprintf(prstream, "> # end of TextFlow\n"); fprintf(prstream, "\n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " \n"); fprintf(prstream, " > # end of ParaLine\n"); fprintf(prstream, " > # end of Para\n"); fprintf(prstream, "> # end of TextFlow\n"); fprintf(prstream, "# End of MIFFile\n"); } grace-5.1.23/src/strwin.c0000644000076500001440000010450410071615562014720 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * strings, lines, boxes and elipses * */ #include #include #include #include #include #include #include #include #include "globals.h" #include "utils.h" #include "graphs.h" #include "events.h" #include "protos.h" #include "motifinc.h" static char buf[256]; static Widget objects_frame; static Widget strings_frame; static Widget lines_frame; static Widget boxes_frame; static Widget ellip_frame; static OptionStructure *strings_font_item; static Widget strings_rot_item; static Widget strings_size_item; static Widget *strings_loc_item; static OptionStructure *strings_color_item; static OptionStructure *strings_just_item; static Widget *lines_arrow_item; static SpinStructure *lines_asize_item; static Widget *lines_atype_item; static SpinStructure *lines_a_dL_ff_item; static SpinStructure *lines_a_lL_ff_item; static OptionStructure *lines_color_item; static OptionStructure *lines_style_item; static SpinStructure *lines_width_item; static Widget *lines_loc_item; static OptionStructure *boxes_color_item; static OptionStructure *boxes_lines_item; static SpinStructure *boxes_linew_item; static OptionStructure *boxes_fillpat_item; static OptionStructure *boxes_fillcol_item; static Widget *boxes_loc_item; static OptionStructure *ellip_color_item; static OptionStructure *ellip_lines_item; static SpinStructure *ellip_linew_item; static OptionStructure *ellip_fillpat_item; static OptionStructure *ellip_fillcol_item; static Widget *ellip_loc_item; static void define_ellip_popup(void *data); static void define_strings_popup(void *data); static void define_lines_popup(void *data); static void define_boxes_popup(void *data); void ellip_def_proc(Widget w, XtPointer client_data, XtPointer call_data) { ellipse_color = GetOptionChoice(ellip_color_item); ellipse_loctype = GetChoice(ellip_loc_item) ? COORD_VIEW : COORD_WORLD; ellipse_lines = GetOptionChoice(ellip_lines_item); ellipse_linew = GetSpinChoice(ellip_linew_item); ellipse_fillcolor = GetOptionChoice(ellip_fillcol_item); ellipse_fillpat = GetOptionChoice(ellip_fillpat_item); } void update_ellip(void) { if (ellip_frame) { SetOptionChoice(ellip_color_item, ellipse_color); SetOptionChoice(ellip_lines_item, ellipse_lines); SetSpinChoice(ellip_linew_item, ellipse_linew); SetOptionChoice(ellip_fillpat_item, ellipse_fillpat); SetOptionChoice(ellip_fillcol_item, ellipse_fillcolor); SetChoice(ellip_loc_item, ellipse_loctype == COORD_VIEW ? 1 : 0); } } void boxes_def_proc(Widget w, XtPointer client_data, XtPointer call_data) { box_color = GetOptionChoice(boxes_color_item); box_loctype = GetChoice(boxes_loc_item) ? COORD_VIEW : COORD_WORLD; box_lines = GetOptionChoice(boxes_lines_item); box_linew = GetSpinChoice(boxes_linew_item); box_fillcolor = GetOptionChoice(boxes_fillcol_item); box_fillpat = GetOptionChoice(boxes_fillpat_item); } void lines_def_proc(Widget w, XtPointer client_data, XtPointer call_data) { line_asize = GetSpinChoice(lines_asize_item); line_color = GetOptionChoice(lines_color_item); line_arrow_end = GetChoice(lines_arrow_item); line_atype = GetChoice(lines_atype_item); line_a_dL_ff = GetSpinChoice(lines_a_dL_ff_item); line_a_lL_ff = GetSpinChoice(lines_a_lL_ff_item); line_lines = GetOptionChoice(lines_style_item); line_linew = GetSpinChoice(lines_width_item); line_loctype = GetChoice(lines_loc_item) ? COORD_VIEW : COORD_WORLD; } void updatestrings(void) { if (strings_frame) { SetOptionChoice(strings_font_item, string_font); SetOptionChoice(strings_color_item, string_color); SetCharSizeChoice(strings_size_item, string_size); SetAngleChoice(strings_rot_item, string_rot); SetChoice(strings_loc_item, string_loctype == COORD_VIEW ? 1 : 0); SetOptionChoice(strings_just_item, string_just); } } void update_lines(void) { if (lines_frame) { SetOptionChoice(lines_color_item, line_color); SetOptionChoice(lines_style_item, line_lines); SetSpinChoice(lines_width_item, line_linew); SetChoice(lines_arrow_item, line_arrow_end); SetChoice(lines_atype_item, line_atype); SetSpinChoice(lines_asize_item, line_asize); SetSpinChoice(lines_a_dL_ff_item, line_a_dL_ff); SetSpinChoice(lines_a_lL_ff_item, line_a_lL_ff); SetChoice(lines_loc_item, line_loctype == COORD_VIEW ? 1 : 0); } } void update_boxes(void) { if (boxes_frame) { SetOptionChoice(boxes_color_item, box_color); SetOptionChoice(boxes_lines_item, box_lines); SetSpinChoice(boxes_linew_item, box_linew); SetOptionChoice(boxes_fillpat_item, box_fillpat); SetOptionChoice(boxes_fillcol_item, box_fillcolor); SetChoice(boxes_loc_item, box_loctype == COORD_VIEW ? 1 : 0); } } void define_string_defaults(Widget w, XtPointer client_data, XtPointer call_data) { if (strings_frame) { string_font = GetOptionChoice(strings_font_item); string_color = GetOptionChoice(strings_color_item); string_size = GetCharSizeChoice(strings_size_item); string_rot = GetAngleChoice(strings_rot_item); string_loctype = GetChoice(strings_loc_item) ? COORD_VIEW : COORD_WORLD; string_just = GetOptionChoice(strings_just_item); } } static void close_objects_cb(void *data) { set_action(DO_NOTHING); destroy_dialog_cb((Widget) data); } static void clear_objects_cb(void *data) { int type = (int) data; switch (type) { case OBJECT_LINE: if (yesno("Delete all lines?", NULL, NULL, NULL)) { do_clear_lines(); xdrawgraph(); } break; case OBJECT_BOX: if (yesno("Delete all boxes?", NULL, NULL, NULL)) { do_clear_boxes(); xdrawgraph(); } break; case OBJECT_ELLIPSE: if (yesno("Delete all ellipses?", NULL, NULL, NULL)) { do_clear_ellipses(); xdrawgraph(); } break; case OBJECT_STRING: if (yesno("Delete all text strings?", NULL, NULL, NULL)) { do_clear_text(); xdrawgraph(); } break; default: break; } } void define_objects_popup(void *data) { Widget wbut; Widget panel, rc; set_wait_cursor(); if (objects_frame == NULL) { objects_frame = XmCreateDialogShell(app_shell, "Objects", NULL, 0); handle_close(objects_frame); panel = XmCreateRowColumn(objects_frame, "ticks_rc", NULL, 0); XtVaSetValues(panel, XmNorientation, XmHORIZONTAL, NULL); rc = XmCreateRowColumn(panel, "rc", NULL, 0); wbut = CreateButton(rc, "Text"); AddButtonCB(wbut, set_actioncb, (void *) STR_LOC); wbut = CreateButton(rc, "Text props..."); AddButtonCB(wbut, define_strings_popup, NULL); wbut = CreateButton(rc, "Line"); AddButtonCB(wbut, set_actioncb, (void *) MAKE_LINE_1ST); wbut = CreateButton(rc, "Line props..."); AddButtonCB(wbut, define_lines_popup, NULL); wbut = CreateButton(rc, "Box"); AddButtonCB(wbut, set_actioncb, (void *) MAKE_BOX_1ST); wbut = CreateButton(rc, "Box props..."); AddButtonCB(wbut, define_boxes_popup, NULL); wbut = CreateButton(rc, "Ellipse"); AddButtonCB(wbut, set_actioncb, (void *) MAKE_ELLIP_1ST); wbut = CreateButton(rc, "Ellipse props..."); AddButtonCB(wbut, define_ellip_popup, NULL); ManageChild(rc); rc = XmCreateRowColumn(panel, "rc", NULL, 0); wbut = CreateButton(rc, "Edit object"); AddButtonCB(wbut, set_actioncb, (void *) EDIT_OBJECT); wbut = CreateButton(rc, "Move object"); AddButtonCB(wbut, set_actioncb, (void *) MOVE_OBJECT_1ST); wbut = CreateButton(rc, "Copy object"); AddButtonCB(wbut, set_actioncb, (void *) COPY_OBJECT1ST); wbut = CreateButton(rc, "Delete object"); AddButtonCB(wbut, set_actioncb, (void *) DEL_OBJECT); wbut = CreateButton(rc, "Clear all text"); AddButtonCB(wbut, clear_objects_cb, (void *) OBJECT_STRING); wbut = CreateButton(rc, "Clear all lines"); AddButtonCB(wbut, clear_objects_cb, (void *) OBJECT_LINE); wbut = CreateButton(rc, "Clear all boxes"); AddButtonCB(wbut, clear_objects_cb, (void *) OBJECT_BOX); wbut = CreateButton(rc, "Clear all ellipses"); AddButtonCB(wbut, clear_objects_cb, (void *) OBJECT_ELLIPSE); wbut = CreateButton(rc, "Close"); AddButtonCB(wbut, close_objects_cb, objects_frame); ManageChild(rc); ManageChild(panel); } RaiseWindow(objects_frame); unset_wait_cursor(); } static void define_ellip_popup(void *data) { Widget rc; Widget buts[2]; Widget panel; set_wait_cursor(); if (ellip_frame == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; ellip_frame = XmCreateDialogShell(app_shell, "Ellipses", NULL, 0); handle_close(ellip_frame); panel = XmCreateRowColumn(ellip_frame, "ellip_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); ellip_color_item = CreateColorChoice(rc, "Color: "); ellip_linew_item = CreateLineWidthChoice(rc, "Line width:"); ellip_lines_item = CreateLineStyleChoice(rc, "Line style:"); ellip_fillpat_item = CreatePatternChoice(rc, "Fill pattern:"); ellip_fillcol_item = CreateColorChoice(rc, "Fill color: "); ellip_loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); ManageChild(rc); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, ellip_def_proc, (XtPointer) 0); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) ellip_frame); ManageChild(panel); } RaiseWindow(ellip_frame); update_ellip(); unset_wait_cursor(); } static void define_strings_popup(void *data) { Widget rc; Widget buts[2]; Widget panel; set_wait_cursor(); if (strings_frame == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; strings_frame = XmCreateDialogShell(app_shell, "Strings", NULL, 0); handle_close(strings_frame); panel = XmCreateRowColumn(strings_frame, "strings_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); strings_font_item = CreateFontChoice(rc, "Font:"); strings_color_item = CreateColorChoice(rc, "Color: "); strings_just_item = CreateJustChoice(rc, "Justification:"); strings_loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); ManageChild(rc); strings_rot_item = CreateAngleChoice(panel, "Rotation"); strings_size_item = CreateCharSizeChoice(panel, "Size"); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, define_string_defaults, (XtPointer) 0); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) strings_frame); ManageChild(panel); } RaiseWindow(strings_frame); updatestrings(); unset_wait_cursor(); } static void define_lines_popup(void *data) { Widget rc, fr, rc2; Widget buts[2]; Widget panel; set_wait_cursor(); if (lines_frame == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; lines_frame = XmCreateDialogShell(app_shell, "Lines", NULL, 0); handle_close(lines_frame); panel = XmCreateRowColumn(lines_frame, "lines_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); lines_color_item = CreateColorChoice(rc, "Color: "); lines_width_item = CreateLineWidthChoice(rc, "Line width:"); lines_style_item = CreateLineStyleChoice(rc, "Line style:"); fr = CreateFrame(rc, "Arrow"); rc2 = XtVaCreateWidget("rc2", xmRowColumnWidgetClass, fr, NULL); lines_arrow_item = CreatePanelChoice(rc2, "Place at:", 5, "None", "Start", "End", "Both ends", NULL); lines_atype_item = CreatePanelChoice(rc2, "Type:", 4, "Line", "Filled", "Opaque", NULL); lines_asize_item = CreateSpinChoice(rc2, "Length", 4, SPIN_TYPE_FLOAT, -10.0, 10.0, 0.5); lines_a_dL_ff_item = CreateSpinChoice(rc2, "d/L form factor", 4, SPIN_TYPE_FLOAT, 0.0, 10.0, 0.1); lines_a_lL_ff_item = CreateSpinChoice(rc2, "l/L form factor", 4, SPIN_TYPE_FLOAT, -1.0, 1.0, 0.1); ManageChild(rc2); lines_loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); ManageChild(rc); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, lines_def_proc, (XtPointer) 0); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) lines_frame); ManageChild(panel); } update_lines(); RaiseWindow(lines_frame); unset_wait_cursor(); } static void define_boxes_popup(void *data) { Widget rc; Widget buts[2]; Widget panel; set_wait_cursor(); if (boxes_frame == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; boxes_frame = XmCreateDialogShell(app_shell, "Boxes", NULL, 0); handle_close(boxes_frame); panel = XmCreateRowColumn(boxes_frame, "boxes_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); boxes_color_item = CreateColorChoice(rc, "Color: "); boxes_linew_item = CreateLineWidthChoice(rc, "Line width:"); boxes_lines_item = CreateLineStyleChoice(rc, "Line style:"); boxes_fillpat_item = CreatePatternChoice(rc, "Fill pattern:"); boxes_fillcol_item = CreateColorChoice(rc, "Fill color: "); boxes_loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); ManageChild(rc); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, boxes_def_proc, (XtPointer) 0); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) boxes_frame); ManageChild(panel); } RaiseWindow(boxes_frame); update_boxes(); unset_wait_cursor(); } typedef struct { Widget top; OptionStructure *color_item; SpinStructure *linew_item; OptionStructure *lines_item; OptionStructure *fill_color_item; OptionStructure *fill_pattern_item; Widget *loc_item; Widget x1_item; Widget x2_item; Widget y1_item; Widget y2_item; int boxno; } EditBoxUI; static EditBoxUI box_ui,ellip_ui; void update_box_edit(EditBoxUI *ui) { if (ui->top) { int boxno = ui->boxno; SetOptionChoice(ui->color_item, boxes[boxno].color); SetOptionChoice(ui->lines_item, boxes[boxno].lines); SetSpinChoice(ui->linew_item, boxes[boxno].linew); SetOptionChoice(ui->fill_pattern_item, boxes[boxno].fillpattern); SetOptionChoice(ui->fill_color_item, boxes[boxno].fillcolor); SetChoice(ui->loc_item, boxes[boxno].loctype == COORD_VIEW ? 1 : 0); sprintf(buf, "%.12f", boxes[boxno].x1); xv_setstr(ui->x1_item, buf); sprintf(buf, "%.12f", boxes[boxno].x2); xv_setstr(ui->x2_item, buf); sprintf(buf, "%.12f", boxes[boxno].y1); xv_setstr(ui->y1_item, buf); sprintf(buf, "%.12f", boxes[boxno].y2); xv_setstr(ui->y2_item, buf); } } void update_ellipse_edit(EditBoxUI *ui) { if (ui->top) { int ellipno = ui->boxno; SetOptionChoice(ui->color_item, ellip[ellipno].color); SetOptionChoice(ui->lines_item, ellip[ellipno].lines); SetSpinChoice(ui->linew_item, ellip[ellipno].linew); SetOptionChoice(ui->fill_pattern_item, ellip[ellipno].fillpattern); SetOptionChoice(ui->fill_color_item, ellip[ellipno].fillcolor); SetChoice(ui->loc_item, ellip[ellipno].loctype == COORD_VIEW ? 1 : 0); sprintf(buf, "%.12f", 0.5*(ellip[ellipno].x1+ellip[ellipno].x2)); xv_setstr(ui->x1_item, buf); sprintf(buf, "%.12f", 0.5*(ellip[ellipno].y1+ellip[ellipno].y2)); xv_setstr(ui->y1_item, buf); sprintf(buf, "%.12f", fabs(ellip[ellipno].x1-ellip[ellipno].x2) ); xv_setstr(ui->x2_item, buf); sprintf(buf, "%.12f", fabs(ellip[ellipno].y1-ellip[ellipno].y2) ); xv_setstr(ui->y2_item, buf); } } void swap_ellipwv_coords(Widget w, XtPointer client_data, XtPointer call_data) { EditBoxUI *ui = (EditBoxUI *)client_data; int ellipno = ui->boxno; double x1, x2, y1, y2; if(((int)GetChoice(ui->loc_item)?COORD_VIEW : COORD_WORLD) == ellip[ellipno].loctype) { return; } xv_evalexpr(ui->x1_item, &x1); xv_evalexpr(ui->x2_item, &x2); xv_evalexpr(ui->y1_item, &y1); xv_evalexpr(ui->y2_item, &y2); if( ellip[ellipno].loctype == COORD_VIEW ) { ellip[ellipno].gno = get_cg(); ellip[ellipno].loctype = COORD_WORLD; view2world( x1-x2/2., y1-y2/2., &ellip[ellipno].x1,&ellip[ellipno].y1 ); view2world( x1+x2/2., y1+y2/2., &ellip[ellipno].x2,&ellip[ellipno].y2 ); } else { ellip[ellipno].loctype = COORD_VIEW; world2view( x1-x2/2., y1-y2/2., &ellip[ellipno].x1,&ellip[ellipno].y1 ); world2view( x1+x2/2., y1+y2/2., &ellip[ellipno].x2,&ellip[ellipno].y2 ); } update_ellipse_edit( ui ); } void ellipse_edit_proc(Widget w, XtPointer client_data, XtPointer call_data) { EditBoxUI *ui = (EditBoxUI *) client_data; int ellipno = ui->boxno; double a, b, c, d; if (xv_evalexpr( ui->x1_item, &a ) != RETURN_SUCCESS || xv_evalexpr( ui->x2_item, &b ) != RETURN_SUCCESS || xv_evalexpr( ui->y1_item, &c ) != RETURN_SUCCESS || xv_evalexpr( ui->y2_item, &d ) != RETURN_SUCCESS ) { return; } ellip[ellipno].color = GetOptionChoice(ui->color_item); ellip[ellipno].loctype = GetChoice(ui->loc_item) ? COORD_VIEW : COORD_WORLD; ellip[ellipno].lines = GetOptionChoice(ui->lines_item); ellip[ellipno].linew = GetSpinChoice(ui->linew_item); ellip[ellipno].fillcolor = GetOptionChoice(ui->fill_color_item); ellip[ellipno].fillpattern = GetOptionChoice(ui->fill_pattern_item); ellip[ellipno].x1 = a - b/2.; ellip[ellipno].x2 = a + b/2.; ellip[ellipno].y1 = c - d/2.; ellip[ellipno].y2 = c + d/2.; set_dirtystate(); xdrawgraph(); } void swap_boxwv_coords(Widget w, XtPointer client_data, XtPointer call_data) { EditBoxUI *ui = (EditBoxUI *)client_data; int boxno = ui->boxno; if( ((int)GetChoice(ui->loc_item)?COORD_VIEW:COORD_WORLD) == boxes[boxno].loctype ) { return; } if( boxes[boxno].loctype == COORD_VIEW ) { boxes[boxno].gno = get_cg(); boxes[boxno].loctype = COORD_WORLD; view2world( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &boxes[boxno].x1,&boxes[boxno].y1 ); view2world( atof(xv_getstr(ui->x2_item)), atof(xv_getstr(ui->y2_item)), &boxes[boxno].x2,&boxes[boxno].y2 ); } else { boxes[boxno].loctype = COORD_VIEW; world2view( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &boxes[boxno].x1,&boxes[boxno].y1 ); world2view( atof(xv_getstr(ui->x2_item)), atof(xv_getstr(ui->y2_item)), &boxes[boxno].x2,&boxes[boxno].y2 ); } update_box_edit( ui ); } void box_edit_proc(Widget w, XtPointer client_data, XtPointer call_data) { EditBoxUI *ui = (EditBoxUI *) client_data; int boxno = ui->boxno; boxes[boxno].color = GetOptionChoice(ui->color_item); boxes[boxno].loctype = GetChoice(ui->loc_item) ? COORD_VIEW : COORD_WORLD; boxes[boxno].lines = GetOptionChoice(ui->lines_item); boxes[boxno].linew = GetSpinChoice(ui->linew_item); boxes[boxno].fillcolor = GetOptionChoice(ui->fill_color_item); boxes[boxno].fillpattern = GetOptionChoice(ui->fill_pattern_item); xv_evalexpr( ui->x1_item, &boxes[boxno].x1 ); xv_evalexpr( ui->x2_item, &boxes[boxno].x2 ); xv_evalexpr( ui->y1_item, &boxes[boxno].y1 ); xv_evalexpr( ui->y2_item, &boxes[boxno].y2 ); set_dirtystate(); xdrawgraph(); } void box_edit_popup(int boxno) { Widget rc; Widget panel; Widget buts[2]; set_wait_cursor(); if (box_ui.top == NULL) { char *label1[3]; label1[0] = "Accept"; label1[1] = "Close"; box_ui.top = XmCreateDialogShell(app_shell, "Edit box", NULL, 0); handle_close(box_ui.top); panel = XmCreateRowColumn(box_ui.top, "boxes_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); box_ui.color_item = CreateColorChoice(rc, "Color: "); box_ui.linew_item = CreateLineWidthChoice(rc, "Line width:"); box_ui.lines_item = CreateLineStyleChoice(rc, "Line style:"); box_ui.fill_pattern_item = CreatePatternChoice(rc, "Fill pattern:"); box_ui.fill_color_item = CreateColorChoice(rc, "Fill color: "); box_ui.loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); XtAddCallback(box_ui.loc_item[2], XmNactivateCallback, swap_boxwv_coords, (XtPointer) &box_ui); XtAddCallback(box_ui.loc_item[3], XmNactivateCallback, swap_boxwv_coords, (XtPointer) &box_ui); box_ui.x1_item = CreateTextItem2(rc, 12, "Xmin = "); box_ui.y1_item = CreateTextItem2(rc, 12, "Ymin = "); box_ui.x2_item = CreateTextItem2(rc, 12, "Xmax = "); box_ui.y2_item = CreateTextItem2(rc, 12, "Ymax = "); ManageChild(rc); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, box_edit_proc, (XtPointer) &box_ui); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) box_ui.top); ManageChild(panel); } box_ui.boxno = boxno; update_box_edit(&box_ui); RaiseWindow(box_ui.top); unset_wait_cursor(); } void ellipse_edit_popup(int boxno) { /* static EditBoxUI ui;*/ Widget rc; Widget panel; Widget buts[2]; set_wait_cursor(); if (ellip_ui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; ellip_ui.top = XmCreateDialogShell(app_shell, "Edit ellipse", NULL, 0); handle_close(ellip_ui.top); panel = XmCreateRowColumn(ellip_ui.top, "ellipses_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); ellip_ui.color_item = CreateColorChoice(rc, "Color: "); ellip_ui.linew_item = CreateLineWidthChoice(rc, "Line width:"); ellip_ui.lines_item = CreateLineStyleChoice(rc, "Line style:"); ellip_ui.fill_pattern_item = CreatePatternChoice(rc, "Fill pattern:"); ellip_ui.fill_color_item = CreateColorChoice(rc, "Fill color: "); ellip_ui.loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); XtAddCallback(ellip_ui.loc_item[2], XmNactivateCallback, swap_ellipwv_coords, (XtPointer) &ellip_ui ); XtAddCallback(ellip_ui.loc_item[3], XmNactivateCallback, swap_ellipwv_coords, (XtPointer) &ellip_ui ); ellip_ui.x1_item = CreateTextItem2(rc, 12, "Xcentre = "); ellip_ui.y1_item = CreateTextItem2(rc, 12, "Ycentre = "); ellip_ui.x2_item = CreateTextItem2(rc, 12, "Width = "); ellip_ui.y2_item = CreateTextItem2(rc, 12, "Height = "); ManageChild(rc); CreateSeparator(panel); ellip_ui.boxno = boxno; CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, ellipse_edit_proc, (XtPointer) &ellip_ui); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) ellip_ui.top); ManageChild(panel); } ellip_ui.boxno = boxno; update_ellipse_edit(&ellip_ui); RaiseWindow(ellip_ui.top); unset_wait_cursor(); } typedef struct { Widget top; OptionStructure *color_item; SpinStructure *linew_item; OptionStructure *lines_item; Widget *loc_item; Widget *arrow_item; Widget *atype_item; SpinStructure *asize_item; SpinStructure *dL_ff_item; SpinStructure *lL_ff_item; Widget x1_item; Widget y1_item; Widget x2_item; Widget y2_item; int lineno; } EditLineUI; void update_line_edit(EditLineUI *ui) { if (ui->top) { int lineno = ui->lineno; SetOptionChoice(ui->color_item, lines[lineno].color); SetOptionChoice(ui->lines_item, lines[lineno].lines); SetSpinChoice(ui->linew_item, lines[lineno].linew); SetChoice(ui->arrow_item, lines[lineno].arrow_end); SetChoice(ui->atype_item, lines[lineno].arrow.type); SetSpinChoice(ui->asize_item, lines[lineno].arrow.length); SetSpinChoice(ui->dL_ff_item, lines[lineno].arrow.dL_ff); SetSpinChoice(ui->lL_ff_item, lines[lineno].arrow.lL_ff); SetChoice(ui->loc_item, lines[lineno].loctype == COORD_VIEW ? 1 : 0); sprintf(buf, "%.12f", lines[lineno].x1); xv_setstr(ui->x1_item, buf); sprintf(buf, "%.12f", lines[lineno].y1); xv_setstr(ui->y1_item, buf); sprintf(buf, "%.12f", lines[lineno].x2); xv_setstr(ui->x2_item, buf); sprintf(buf, "%.12f", lines[lineno].y2); xv_setstr(ui->y2_item, buf); } } void swap_linewv_coords(Widget w, XtPointer client_data, XtPointer call_data) { EditLineUI *ui = (EditLineUI *)client_data; int lineno = ui->lineno; if( lines[lineno].loctype == ((int) GetChoice(ui->loc_item)?COORD_VIEW:COORD_WORLD) ) { return; } if( lines[lineno].loctype == COORD_VIEW ) { lines[lineno].gno = get_cg(); lines[lineno].loctype = COORD_WORLD; view2world( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &lines[lineno].x1,&lines[lineno].y1 ); view2world( atof(xv_getstr(ui->x2_item)), atof(xv_getstr(ui->y2_item)), &lines[lineno].x2,&lines[lineno].y2 ); } else { lines[lineno].loctype = COORD_VIEW; world2view( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &lines[lineno].x1,&lines[lineno].y1 ); world2view( atof(xv_getstr(ui->x2_item)), atof(xv_getstr(ui->y2_item)), &lines[lineno].x2,&lines[lineno].y2 ); } update_line_edit( ui ); } void line_edit_proc(Widget w, XtPointer client_data, XtPointer call_data) { EditLineUI *ui = (EditLineUI *) client_data; int lineno = ui->lineno; lines[lineno].color = GetOptionChoice(ui->color_item); lines[lineno].loctype = GetChoice(ui->loc_item) ? COORD_VIEW : COORD_WORLD; lines[lineno].lines = GetOptionChoice(ui->lines_item); lines[lineno].linew = GetSpinChoice(ui->linew_item); xv_evalexpr(ui->x1_item, &lines[lineno].x1); xv_evalexpr(ui->y1_item, &lines[lineno].y1); xv_evalexpr(ui->x2_item, &lines[lineno].x2); xv_evalexpr(ui->y2_item, &lines[lineno].y2); lines[lineno].arrow_end = GetChoice(ui->arrow_item); lines[lineno].arrow.type = GetChoice(ui->atype_item); lines[lineno].arrow.length = GetSpinChoice(ui->asize_item); lines[lineno].arrow.dL_ff = GetSpinChoice(ui->dL_ff_item); lines[lineno].arrow.lL_ff = GetSpinChoice(ui->lL_ff_item); set_dirtystate(); xdrawgraph(); } static EditLineUI line_ui; void line_edit_popup(int lineno) { Widget rc, fr, rc2; Widget panel; Widget buts[2]; set_wait_cursor(); if (line_ui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; line_ui.top = XmCreateDialogShell(app_shell, "Edit Line", NULL, 0); handle_close(line_ui.top); panel = XmCreateRowColumn(line_ui.top, "lines_rc", NULL, 0); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); line_ui.color_item = CreateColorChoice(rc, "Color: "); line_ui.linew_item = CreateLineWidthChoice(rc, "Line width:"); line_ui.lines_item = CreateLineStyleChoice(rc, "Line style:"); fr = CreateFrame(rc, "Arrow"); rc2 = XtVaCreateWidget("rc2", xmRowColumnWidgetClass, fr, NULL); line_ui.arrow_item = CreatePanelChoice(rc2, "Place at:", 5, "None", "Start", "End", "Both ends", NULL); line_ui.atype_item = CreatePanelChoice(rc2, "Type:", 4, "Line", "Filled", "Opaque", NULL); line_ui.asize_item = CreateSpinChoice(rc2, "Length", 4, SPIN_TYPE_FLOAT, -10.0, 10.0, 0.5); line_ui.dL_ff_item = CreateSpinChoice(rc2, "d/L form factor", 4, SPIN_TYPE_FLOAT, 0.0, 10.0, 0.1); line_ui.lL_ff_item = CreateSpinChoice(rc2, "l/L form factor", 4, SPIN_TYPE_FLOAT, -1.0, 1.0, 0.1); ManageChild(rc2); line_ui.loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); XtAddCallback(line_ui.loc_item[2], XmNactivateCallback, swap_linewv_coords, (XtPointer) &line_ui); XtAddCallback(line_ui.loc_item[3], XmNactivateCallback, swap_linewv_coords, (XtPointer) &line_ui); line_ui.x1_item = CreateTextItem2(rc, 12, "X1 = "); line_ui.y1_item = CreateTextItem2(rc, 12, "Y1 = "); line_ui.x2_item = CreateTextItem2(rc, 12, "X2 = "); line_ui.y2_item = CreateTextItem2(rc, 12, "Y2 = "); ManageChild(rc); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, line_edit_proc, (XtPointer) &line_ui); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) line_ui.top); ManageChild(panel); } RaiseWindow(line_ui.top); line_ui.lineno = lineno; update_line_edit(&line_ui); unset_wait_cursor(); } typedef struct { Widget top; TextStructure *string_item; OptionStructure *color_item; Widget *loc_item; OptionStructure *font_item; Widget size_item; Widget rot_item; OptionStructure *just_item; Widget x1_item; Widget y1_item; int stringno; } EditStringUI; void update_string_edit(EditStringUI *ui) { if (ui->top) { plotstr *pstring = &pstr[ui->stringno]; SetTextString(ui->string_item, pstring->s); SetOptionChoice(ui->color_item, pstring->color); SetOptionChoice(ui->just_item, pstring->just); SetOptionChoice(ui->font_item, pstring->font ); SetCharSizeChoice(ui->size_item, pstring->charsize); SetAngleChoice(ui->rot_item, pstring->rot); SetChoice(ui->loc_item, pstring->loctype == COORD_VIEW ? 1 : 0); sprintf(buf, "%.12f", pstring->x); xv_setstr(ui->x1_item, buf); sprintf(buf, "%.12f", pstring->y); xv_setstr(ui->y1_item, buf); } } void swap_stringwv_coords(Widget w, XtPointer client_data, XtPointer call_data) { EditStringUI *ui = (EditStringUI *)client_data; int stringno = ui->stringno; if( pstr[stringno].loctype == ((int)GetChoice(ui->loc_item)?COORD_VIEW:COORD_WORLD) ) { return; } if( pstr[stringno].loctype == COORD_VIEW ) { pstr[stringno].gno = get_cg(); pstr[stringno].loctype = COORD_WORLD; view2world( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &pstr[stringno].x,&pstr[stringno].y ); } else { pstr[stringno].loctype = COORD_VIEW; world2view( atof(xv_getstr(ui->x1_item)), atof(xv_getstr(ui->y1_item)), &pstr[stringno].x,&pstr[stringno].y ); } update_string_edit( ui ); } void string_edit_proc(Widget w, XtPointer client_data, XtPointer call_data) { EditStringUI *ui = (EditStringUI *) client_data; int stringno = ui->stringno; pstr[stringno].s = copy_string(pstr[stringno].s, GetTextString(ui->string_item)); pstr[stringno].color = GetOptionChoice(ui->color_item); pstr[stringno].loctype = GetChoice(ui->loc_item) ? COORD_VIEW : COORD_WORLD; pstr[stringno].font = GetOptionChoice(ui->font_item); pstr[stringno].just = GetOptionChoice(ui->just_item); xv_evalexpr(ui->x1_item, &pstr[stringno].x); xv_evalexpr(ui->y1_item, &pstr[stringno].y); pstr[stringno].charsize = GetCharSizeChoice(ui->size_item); pstr[stringno].rot = GetAngleChoice(ui->rot_item); set_dirtystate(); xdrawgraph(); } static EditStringUI string_ui; void string_edit_popup(int stringno) { Widget rc; Widget buts[2]; Widget panel; set_wait_cursor(); if (string_ui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; string_ui.top = XmCreateDialogShell(app_shell, "Edit String", NULL, 0); handle_close(string_ui.top); panel = XmCreateRowColumn(string_ui.top, "strings_rc", NULL, 0); string_ui.string_item = CreateCSText(panel, "String:"); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, panel, NULL); string_ui.color_item = CreateColorChoice(rc, "Color: "); string_ui.font_item = CreateFontChoice(rc, "Font:"); string_ui.just_item = CreateJustChoice(rc, "Justification:"); string_ui.loc_item = CreatePanelChoice(rc, "Position in:", 3, "World coordinates", "Viewport coordinates", NULL); XtAddCallback(string_ui.loc_item[2], XmNactivateCallback, swap_stringwv_coords, (XtPointer) &string_ui); XtAddCallback(string_ui.loc_item[3], XmNactivateCallback, swap_stringwv_coords, (XtPointer) &string_ui); string_ui.x1_item = CreateTextItem2(rc, 12, "X = "); string_ui.y1_item = CreateTextItem2(rc, 12, "Y = "); ManageChild(rc); string_ui.rot_item = CreateAngleChoice(panel, "Rotation"); string_ui.size_item = CreateCharSizeChoice(panel, "Size"); CreateSeparator(panel); CreateCommandButtons(panel, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, string_edit_proc, (XtPointer) &string_ui ); XtAddCallback(buts[1], XmNactivateCallback, destroy_dialog, (XtPointer) string_ui.top); ManageChild(panel); } RaiseWindow(string_ui.top); string_ui.stringno = stringno; update_string_edit(&string_ui); unset_wait_cursor(); } int object_edit_popup(int type, int id) { switch (type) { case OBJECT_BOX: box_edit_popup(id); break; case OBJECT_ELLIPSE: ellipse_edit_popup(id); break; case OBJECT_LINE: line_edit_popup(id); break; case OBJECT_STRING: string_edit_popup(id); break; default: return RETURN_FAILURE; break; } return RETURN_SUCCESS; } grace-5.1.23/src/fit.c0000644000076500001440000004406410071615561014157 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * curve fitting, and other numerical routines used in compose. * * Contents: * * void stasum() - compute mean and variance * double leasev() - evaluate least squares polynomial * int fitcurve() - compute coefficients for a polynomial fit of degree >1 * void runavg() - compute a running average * void runstddev() - compute a running standard deviation * void runmedian() - compute a running median * void runminmax() - compute a running minimum or maximum * void filterser() - apply a digital filter * void linearconv() - convolve one set with another * int crosscorr() - cross/auto correlation * int linear_regression() - linear regression * void spline() - compute a spline fit * int seval() - evaluate the spline computed in spline() */ #include #include #include #include #include "defines.h" #include "utils.h" #include "protos.h" #include "as274c.h" static char buf[256]; /* compute mean and standard dev */ void stasum(double *x, int n, double *xbar, double *sd) { int i; *xbar = 0; *sd = 0; if (x == NULL) { return; } if (n < 1) { return; } for (i = 0; i < n; i++) { *xbar = (*xbar) + x[i]; } *xbar = (*xbar)/n; if (n > 1) { for (i = 0; i < n; i++) { *sd = (*sd) + (x[i] - *xbar) * (x[i] - *xbar); } *sd = sqrt(*sd/(n - 1)); } } /* evaluate least squares polynomial */ double leasev(double *c, int degree, double x) { double temp; int i; /* * Commented out - refer to "Numerical Methods in C" for the * reason, section 5.2! The revolution has begun. temp = 0.0; for (i = 0; i <= degree; i++) { if ((i == 0) && (x == 0.0)) { temp = temp + c[i]; } else { temp = temp + c[i] * pow(x, (double) (i)); } } */ temp = c[degree]; for( i=degree-1; i>=0; i-- ) temp = c[i] + temp*x; return (temp); } /* polynomial curve fitting */ int fitcurve(double *x, double *y, int n, int ideg, double *coeff) /* * x - x values * y - y values * n - number of points * ideg - degree of fit * coeff - coefficients of fit */ { int i, ifail; ifail = 1; if (ideg > 1) { dofitcurve(n, x, y, ideg, coeff); } else { ifail = linear_regression(n, x, y, coeff); if (ifail == 1) { errmsg("Linear_regression entered with N < 2"); return ifail; } else if (ifail == 2) { errmsg("Linear_regression - all values of x or y are the same"); return ifail; } } /* check coefficients */ for (i = 0; i <= ideg; i++) { if (!finite(coeff[i])) { errmsg("Linear_regression - all values of x or y are the same"); ifail = 3; return ifail; } } ifail = 0; return ifail; } /* compute a running average */ void runavg(double *x, double *y, double *ax, double *ay, int n, int ilen) { int i; double sumy = 0.0; double sumx = 0.0; for (i = 0; i < ilen; i++) { sumx = sumx + x[i]; sumy = sumy + y[i]; } ax[0] = sumx / ilen; ay[0] = sumy / ilen; for (i = 1; i < (n - ilen + 1); i++) { sumx = x[i + ilen - 1] - x[i - 1] + sumx; ax[i] = sumx / ilen; sumy = y[i + ilen - 1] - y[i - 1] + sumy; ay[i] = sumy / ilen; } } /* compute a running standard deviation */ void runstddev(double *x, double *y, double *ax, double *ay, int n, int ilen) { int i; double ybar, ysd; double sumx = 0.0; for (i = 0; i < ilen; i++) { sumx = sumx + x[i]; } ax[0] = sumx / ilen; stasum(y, ilen, &ybar, &ysd); ay[0] = ysd; for (i = 1; i < (n - ilen + 1); i++) { stasum(y + i, ilen, &ybar, &ysd); sumx = x[i + ilen - 1] - x[i - 1] + sumx; ax[i] = sumx / ilen; ay[i] = ysd; } } /* compute a running median */ void runmedian(double *x, double *y, double *ax, double *ay, int n, int ilen) { int i, j, nlen = n - ilen + 1; double *tmpx, *tmpy; tmpx = (double *) xcalloc(ilen, sizeof(double)); if (tmpx == NULL) { errmsg("Can't xcalloc tmpx in runmedian"); return; } tmpy = (double *) xcalloc(ilen, sizeof(double)); if (tmpy == NULL) { errmsg("Can't xcalloc tmpy in runmedian"); XCFREE(tmpx); return; } for (i = 0; i < nlen; i++) { for (j = 0; j < ilen; j++) { tmpx[j] = x[j + i]; tmpy[j] = y[j + i]; } sort_xy(tmpx, tmpy, ilen, 1, 0); if (ilen % 2) { ax[i] = x[i + (ilen / 2)]; ay[i] = tmpy[ilen / 2]; } else { ax[i] = (x[i + ilen / 2] + x[i + (ilen - 1) / 2]) * 0.5; ay[i] = (tmpy[ilen / 2] + tmpy[(ilen - 1) / 2]) * 0.5; } } XCFREE(tmpx); XCFREE(tmpy); } /* compute a running minimum or maximum */ void runminmax(double *x, double *y, double *ax, double *ay, int n, int ilen, int type) { int i, j; double min, max; double sumx = 0.0; min = max = y[0]; for (i = 0; i < ilen; i++) { sumx = sumx + x[i]; if (min > y[i]) min = y[i]; if (max < y[i]) max = y[i]; } ax[0] = sumx / ilen; if (type == 0) { ay[0] = min; } else if (type == 1) { ay[0] = max; } else { errmsg("Unknown type in runminmax, setting type = min"); type = 0; } for (i = 1; i < (n - ilen + 1); i++) { sumx = x[i + ilen - 1] - x[i - 1] + sumx; ax[i] = sumx / ilen; min = y[i]; max = y[i]; for (j = 0; j < ilen; j++) { if (min > y[i + j]) min = y[i + j]; if (max < y[i + j]) max = y[i + j]; } if (type == 0) { ay[i] = min; } else if (type == 1) { ay[i] = max; } } } /* Apply a digital filter of length len to a set in x, y, of length n with the results going to resx, resy. the length of the result is set by the caller */ void filterser(int n, double *x, double *y, double *resx, double *resy, double *h, int len) { int i, j, outlen, eo, ld2; double sum; outlen = n - len + 1; eo = len % 2; ld2 = len / 2; for (i = 0; i < outlen; i++) { sum = 0.0; for (j = 0; j < len; j++) { sum = sum + h[j] * y[j + i]; } resy[i] = sum; if (eo) resx[i] = x[i + ld2]; else resx[i] = (x[i + ld2] + x[i + ld2 - 1]) / 2.0; } } /* linear convolution of set x (length n) with h (length m) and result to y. the length of y is set by the caller */ void linearconv(double *x, double *h, double *y, int n, int m) { int i, j, itmp; for (i = 0; i < n + m - 1; i++) { for (j = 0; j < m; j++) { itmp = i - j; if ((itmp >= 0) && (itmp < n)) { y[i] = y[i] + h[j] * x[itmp]; } } } } /* * cross correlation/covariance */ int crosscorr(double *x, double *y, int n, int maxlag, int covar, double *xres) { double cnorm = 1.0; double xbar, ybar, sd; int i, j; if (!x || !y || !xres || n < 2 || maxlag > n) { return RETURN_FAILURE; } if (covar) { stasum(x, n, &xbar, &sd); stasum(y, n, &ybar, &sd); } else { xbar = 0.0; ybar = 0.0; } for (i = 0; i < maxlag; i++) { xres[i] = 0.0; for (j = 0; j < n - i; j++) { xres[i] += (y[j] - ybar)*(x[j + i] - xbar); } if (i == 0) { if (xres[0] != 0.0) { cnorm = fabs(xres[0]); } } xres[i] /= cnorm; } return RETURN_SUCCESS; } /* References, _Aplied Linear Regression_, Weisberg _Elements of Statistical Computing_, Thisted Fits y = coef*x + intercept + e uses a 2 pass method for means and variances */ int linear_regression(int n, double *x, double *y, double *coeff) { double xbar, ybar; /* sample means */ double sdx, sdy; /* sample standard deviations */ double sxy, rxy; /* sample covariance and sample correlation */ double SXX, SYY, SXY; /* sums of squares */ double RSS; /* residual sum of squares */ double rms; /* residual mean square */ double sereg; /* standard error of regression */ double seslope, seintercept; double slope, intercept; /* */ double SSreg, F, R2; int i; if (n < 2) { return 1; } xbar = ybar = 0.0; SXX = SYY = SXY = 0.0; for (i = 0; i < n; i++) { xbar = xbar + x[i]; ybar = ybar + y[i]; } xbar = xbar / n; ybar = ybar / n; for (i = 0; i < n; i++) { SXX = SXX + (x[i] - xbar) * (x[i] - xbar); SYY = SYY + (y[i] - ybar) * (y[i] - ybar); SXY = SXY + (x[i] - xbar) * (y[i] - ybar); } sdx = sqrt(SXX / (n - 1)); sdy = sqrt(SYY / (n - 1)); if (sdx == 0.0) { return 2; } if (sdy == 0.0) { return 2; } sxy = SXY / (n - 1); rxy = sxy / (sdx * sdy); slope = SXY / SXX; intercept = ybar - slope * xbar; RSS = SYY - slope * SXY; sprintf(buf, "Number of observations\t\t\t = %d\n", n); stufftext(buf); sprintf(buf, "Mean of independent variable\t\t = %.7g\n", xbar); stufftext(buf); sprintf(buf, "Mean of dependent variable\t\t = %.7g\n", ybar); stufftext(buf); sprintf(buf, "Standard dev. of ind. variable\t\t = %.7g\n", sdx); stufftext(buf); sprintf(buf, "Standard dev. of dep. variable\t\t = %.7g\n", sdy); stufftext(buf); sprintf(buf, "Correlation coefficient\t\t\t = %.7g\n", rxy); stufftext(buf); sprintf(buf, "Regression coefficient (SLOPE)\t\t = %.7g\n", slope); stufftext(buf); if (n == 2) { coeff[1] = (y[1] - y[0])/(x[1] - x[0]); coeff[0] = y[0] - coeff[1]*x[0]; sprintf(buf, "Regression constant (INTERCEPT)\t\t = %.7g\n", intercept); stufftext(buf); return 0; } rms = RSS / (n - 2); sereg = sqrt(rms); seintercept = sqrt(rms * (1.0 / n + xbar * xbar / SXX)); seslope = sqrt(rms / SXX); SSreg = SYY - RSS; F = SSreg / rms; R2 = SSreg / SYY; sprintf(buf, "Standard error of coefficient\t\t = %.7g\n", seslope); stufftext(buf); sprintf(buf, "t - value for coefficient\t\t = %.7g\n", slope / seslope); stufftext(buf); sprintf(buf, "Regression constant (INTERCEPT)\t\t = %.7g\n", intercept); stufftext(buf); sprintf(buf, "Standard error of constant\t\t = %.7g\n", seintercept); stufftext(buf); sprintf(buf, "t - value for constant\t\t\t = %.7g\n", intercept / seintercept); stufftext(buf); sprintf(buf, "\nAnalysis of variance\n"); stufftext(buf); sprintf(buf, "Source\t\t d.f\t Sum of squares\t Mean Square\t F\n"); stufftext(buf); sprintf(buf, "Regression\t 1\t%.7g\t%.7g\t%.7g\n", SSreg, SSreg, F); stufftext(buf); sprintf(buf, "Residual\t%5d\t%.7g\t%.7g\n", n - 2, RSS, rms); stufftext(buf); sprintf(buf, "Total\t\t%5d\t%.7g\n\n", n - 1, SYY); stufftext(buf); for (i = 0; i < n; i++) { coeff[0] = intercept; coeff[1] = slope; } return 0; } /* a literal translation of the spline routine in Forsyth, Malcolm, and Moler */ void spline(int n, double *x, double *y, double *b, double *c, double *d) { /* c c the coefficients b(i), c(i), and d(i), i=1,2,...,n are computed c for a cubic interpolating spline c c s(x) = y(i) + b(i)*(x-x(i)) + c(i)*(x-x(i))**2 + d(i)*(x-x(i))**3 c c for x(i) .le. x .le. x(i+1) c c input.. c c n = the number of data points or knots (n.ge.2) c x = the abscissas of the knots in strictly increasing order c y = the ordinates of the knots c c output.. c c b, c, d = arrays of spline coefficients as defined above. c c using p to denote differentiation, c c y(i) = s(x(i)) c b(i) = sp(x(i)) c c(i) = spp(x(i))/2 c d(i) = sppp(x(i))/6 (derivative from the right) c c the accompanying function subprogram seval can be used c to evaluate the spline. c c */ int nm1, ib, i; double t; /* Gack! */ x--; y--; b--; c--; d--; /* Fortran 66 */ nm1 = n - 1; if (n < 2) return; if (n < 3) goto l50; /* c c set up tridiagonal system c c b = diagonal, d = offdiagonal, c = right hand side. c */ d[1] = x[2] - x[1]; c[2] = (y[2] - y[1]) / d[1]; for (i = 2; i <= nm1; i++) { d[i] = x[i + 1] - x[i]; b[i] = 2.0 * (d[i - 1] + d[i]); c[i + 1] = (y[i + 1] - y[i]) / d[i]; c[i] = c[i + 1] - c[i]; } /* c c end conditions. third derivatives at x(1) and x(n) c obtained from divided differences c */ b[1] = -d[1]; b[n] = -d[n - 1]; c[1] = 0.0; c[n] = 0.0; if (n == 3) goto l15; c[1] = c[3] / (x[4] - x[2]) - c[2] / (x[3] - x[1]); c[n] = c[n - 1] / (x[n] - x[n - 2]) - c[n - 2] / (x[n - 1] - x[n - 3]); c[1] = c[1] * d[1] * d[1] / (x[4] - x[1]); c[n] = -c[n] * d[n - 1] * d[n - 1] / (x[n] - x[n - 3]); /* c c forward elimination c */ l15:; for (i = 2; i <= n; i++) { t = d[i - 1] / b[i - 1]; b[i] = b[i] - t * d[i - 1]; c[i] = c[i] - t * c[i - 1]; } /* c c back substitution c */ c[n] = c[n] / b[n]; for (ib = 1; ib <= nm1; ib++) { i = n - ib; c[i] = (c[i] - d[i] * c[i + 1]) / b[i]; } /* c c c(i) is now the sigma(i) of the text c c compute polynomial coefficients c */ b[n] = (y[n] - y[nm1]) / d[nm1] + d[nm1] * (c[nm1] + 2.0 * c[n]); for (i = 1; i <= nm1; i++) { b[i] = (y[i + 1] - y[i]) / d[i] - d[i] * (c[i + 1] + 2.0 * c[i]); d[i] = (c[i + 1] - c[i]) / d[i]; c[i] = 3.0 * c[i]; } c[n] = 3.0 * c[n]; d[n] = d[n - 1]; return; l50:; b[1] = (y[2] - y[1]) / (x[2] - x[1]); c[1] = 0.0; d[1] = 0.0; b[2] = b[1]; c[2] = 0.0; d[2] = 0.0; return; } /*************************************************************************** * aspline - modified version of David Frey's spline.c * * * * aspline does an Akima spline interpolation. * ***************************************************************************/ void aspline(int n, double *x, double *y, double *b, double *c, double *d) { int i; double num, den; double m_m1, m_m2, m_p1, m_p2; double x_m1, x_m2, x_p1, x_p2; double y_m1, y_m2, y_p1, y_p2; #define dx(i) (x[i+1]-x[i]) #define dy(i) (y[i+1]-y[i]) #define m(i) (dy(i)/dx(i)) if (n > 0) /* we have data to process */ { /* * calculate the coefficients of the spline * (the Akima interpolation itself) */ /* b) interpolate the missing points: */ x_m1 = x[0] + x[1] - x[2]; y_m1 = (x[0]-x_m1) * (m(1) - 2 * m(0)) + y[0]; m_m1 = (y[0]-y_m1)/(x[0]-x_m1); x_m2 = 2 * x[0] - x[2]; y_m2 = (x_m1-x_m2) * (m(0) - 2 * m_m1) + y_m1; m_m2 = (y_m1-y_m2)/(x_m1-x_m2); x_p1 = x[n-1] + x[n-2] - x[n-3]; y_p1 = (2 * m(n-2) - m(n-3)) * (x_p1 - x[n-1]) + y[n-1]; m_p1 = (y_p1-y[n-1])/(x_p1-x[n-1]); x_p2 = 2 * x[n-1] - x[n-3]; y_p2 = (2 * m_p1 - m(n-2)) * (x_p2 - x_p1) + y_p1; m_p2 = (y_p2-y_p1)/(x_p2-x_p1); /* i = 0 */ num=fabs(m(1) - m(0)) * m_m1 + fabs(m_m1 - m_m2) * m(0); den=fabs(m(1) - m(0)) + fabs(m_m1 - m_m2); if (den != 0.0) b[0]=num / den; else b[0]=0.0; /* i = 1 */ num=fabs(m(2) - m(1)) * m(0) + fabs(m(0) - m_m1) * m(1); den=fabs(m(2) - m(1)) + fabs(m(0) - m_m1); if (den != 0.0) b[1]=num / den; else b[1]=0.0; for (i=2; i < n-2; i++) { num=fabs(m(i+1) - m(i)) * m(i-1) + fabs(m(i-1) - m(i-2)) * m(i); den=fabs(m(i+1) - m(i)) + fabs(m(i-1) - m(i-2)); if (den != 0.0) b[i]=num / den; else b[i]=0.0; } /* i = n - 2 */ num=fabs(m_p1 - m(n-2)) * m(n-3) + fabs(m(n-3) - m(n-4)) * m(n-2); den=fabs(m_p1 - m(n-2)) + fabs(m(n-3) - m(n-4)); if (den != 0.0) b[n-2]=num / den; else b[n-2]=0.0; /* i = n - 1 */ num=fabs(m_p2 - m_p1) * m(n-2) + fabs(m(n-2) - m(n-3)) * m_p1; den=fabs(m_p2 - m_p1) + fabs(m(n-2) - m(n-3)); if (den != 0.0) b[n-1]=num / den; else b[n-1]=0.0; for (i=0; i < n-1; i++) { double dxv = dx(i); c[i]=(3 * m(i) - 2 * b[i] - b[i+1]) / dxv; d[i]=(b[i] + b[i+1] - 2 * m(i)) / (dxv * dxv); } } #undef dx #undef dy #undef m } int seval(double *u, double *v, int ulen, double *x, double *y, double *b, double *c, double *d, int n) { /* * * this subroutine evaluates the cubic spline function on a mesh * * seval = y(i) + b(i)*(u-x(i)) + c(i)*(u-x(i))**2 + d(i)*(u-x(i))**3 * * where x(i) .lt. u .lt. x(i+1), using horner's rule * * if u .lt. x(1) then i = 1 is used. * if u .ge. x(n) then i = n is used. * * input.. * * u = the array of abscissas at which the spline is to be evaluated * ulen = length of the mesh * * x,y = the arrays of data abscissas and ordinates * b,c,d = arrays of spline coefficients computed by spline * n = the number of data points * * output.. * * v = the array of evaluated values */ int j, m; m = monotonicity(x, n, FALSE); if (m == 0) { errmsg("seval() called with a non-monotonic array"); return RETURN_FAILURE; } for (j = 0; j < ulen; j++) { double dx; int ifound; ifound = find_span_index(x, n, m, u[j]); if (ifound < 0) { ifound = 0; } else if (ifound > n - 2) { ifound = n - 1; } dx = u[j] - x[ifound]; v[j] = y[ifound] + dx*(b[ifound] + dx*(c[ifound] + dx*d[ifound])); } return RETURN_SUCCESS; } grace-5.1.23/src/plotwin.c0000644000076500001440000001004410071615562015061 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2000 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * Plot properties * */ #include #include #include #include "globals.h" #include "utils.h" #include "protos.h" #include "motifinc.h" static Widget plot_frame; /* * Panel item declarations */ static OptionStructure *bg_color_item; static Widget bg_fill_item; static Widget timestamp_active_item; static OptionStructure *timestamp_font_item; static Widget timestamp_size_item; static Widget timestamp_rotate_item; static OptionStructure *timestamp_color_item; Widget timestamp_x_item; Widget timestamp_y_item; static int plot_define_notify_proc(void *data); static void update_plot_items(void); void create_plot_frame_cb(void *data) { create_plot_frame(); } void create_plot_frame(void) { set_wait_cursor(); if (plot_frame == NULL) { Widget panel, fr, rc; plot_frame = CreateDialogForm(app_shell, "Plot appearance"); panel = CreateVContainer(plot_frame); fr = CreateFrame(panel, "Page background"); rc = CreateHContainer(fr); bg_color_item = CreateColorChoice(rc, "Color:"); bg_fill_item = CreateToggleButton(rc, "Fill"); fr = CreateFrame(panel, "Time stamp"); rc = CreateVContainer(fr); timestamp_active_item = CreateToggleButton(rc, "Enable"); timestamp_font_item = CreateFontChoice(rc, "Font:"); timestamp_color_item = CreateColorChoice(rc, "Color:"); timestamp_size_item = CreateCharSizeChoice(rc, "Character size"); timestamp_rotate_item = CreateAngleChoice(rc, "Angle"); timestamp_x_item = CreateTextItem2(rc, 10, "Timestamp X:"); timestamp_y_item = CreateTextItem2(rc, 10, "Timestamp Y:"); CreateAACDialog(plot_frame, panel, plot_define_notify_proc, NULL); } update_plot_items(); RaiseWindow(GetParent(plot_frame)); unset_wait_cursor(); } static void update_plot_items(void) { char buf[32]; if (plot_frame) { SetOptionChoice(bg_color_item, getbgcolor()); SetToggleButtonState(bg_fill_item, getbgfill()); SetToggleButtonState(timestamp_active_item, timestamp.active); SetOptionChoice(timestamp_font_item, timestamp.font); SetOptionChoice(timestamp_color_item, timestamp.color); SetCharSizeChoice(timestamp_size_item, timestamp.charsize); SetAngleChoice(timestamp_rotate_item, timestamp.rot); sprintf(buf, "%g", timestamp.x); xv_setstr(timestamp_x_item, buf); sprintf(buf, "%g", timestamp.y); xv_setstr(timestamp_y_item, buf); } } static int plot_define_notify_proc(void *data) { setbgcolor(GetOptionChoice(bg_color_item)); setbgfill(GetToggleButtonState(bg_fill_item)); timestamp.active = GetToggleButtonState(timestamp_active_item); timestamp.font = GetOptionChoice(timestamp_font_item); timestamp.color = GetOptionChoice(timestamp_color_item); timestamp.charsize = GetCharSizeChoice(timestamp_size_item); timestamp.rot = GetAngleChoice(timestamp_rotate_item); xv_evalexpr(timestamp_x_item, ×tamp.x); xv_evalexpr(timestamp_y_item, ×tamp.y); set_dirtystate(); xdrawgraph(); return RETURN_SUCCESS; } grace-5.1.23/src/ssdata.h0000644000076500001440000000417410071615562014660 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * SS data * */ #ifndef __SSDATA_H_ #define __SSDATA_H_ #define FFORMAT_NUMBER 0 #define FFORMAT_STRING 1 #define FFORMAT_DATE 2 typedef struct _ss_data { int ncols; int nrows; int *formats; void **data; } ss_data; double *copy_data_column(double *src, int nrows); double *allocate_index_data(int nrows); double *allocate_mesh(double start, double stop, int len); void set_blockdata(ss_data *ssd); int get_blockncols(void); int get_blocknrows(void); int *get_blockformats(void); int realloc_ss_data(ss_data *ssd, int nrows); void free_ss_data(ss_data *ssd); int init_ss_data(ss_data *ssd, int ncols, int *formats); int parse_ss_row(const char *s, int *nncols, int *nscols, int **formats); int insert_data_row(ss_data *ssd, int row, char *s); int store_data(ss_data *ssd, int load_type, char *label); int create_set_fromblock(int gno, int setno, int type, int nc, int *coli, int scol, int autoscale); char *cols_to_field_string(int nc, int *cols, int scol); int field_string_to_cols(const char *fs, int *nc, int **cols, int *scol); #endif /* __SSDATA_H_ */ grace-5.1.23/src/worldwin.c0000644000076500001440000002775410071615562015252 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Contents: * arrange graphs popup * overlay graphs popup * autoscaling popup */ #include #include #include #include "mbitmaps.h" #include "globals.h" #include "graphutils.h" #include "device.h" #include "utils.h" #include "motifinc.h" #include "protos.h" static Widget overlay_dialog = NULL; /* * Panel item declarations */ static ListStructure *graph_overlay1_choice_item; static ListStructure *graph_overlay2_choice_item; static OptionStructure *graph_overlaytype_item; static int define_arrange_proc(void *data); static int define_overlay_proc(void *data); static int define_autos_proc(void *data); typedef struct _Arrange_ui { Widget top; ListStructure *graphs; SpinStructure *nrows; SpinStructure *ncols; OptionStructure *order; Widget snake; SpinStructure *toff; SpinStructure *loff; SpinStructure *roff; SpinStructure *boff; SpinStructure *hgap; SpinStructure *vgap; Widget hpack; Widget vpack; Widget add; Widget kill; } Arrange_ui; /* * Arrange graphs popup routines */ static int define_arrange_proc(void *data) { Arrange_ui *ui = (Arrange_ui *) data; int ngraphs, *graphs; int nrows, ncols, order, snake; int hpack, vpack, add, kill; double toff, loff, roff, boff, vgap, hgap; nrows = (int) GetSpinChoice(ui->nrows); ncols = (int) GetSpinChoice(ui->ncols); if (nrows < 1 || ncols < 1) { errmsg("# of rows and columns must be > 0"); return RETURN_FAILURE; } ngraphs = GetListChoices(ui->graphs, &graphs); if (ngraphs == 0) { graphs = NULL; } order = GetOptionChoice(ui->order); snake = GetToggleButtonState(ui->snake); toff = GetSpinChoice(ui->toff); loff = GetSpinChoice(ui->loff); roff = GetSpinChoice(ui->roff); boff = GetSpinChoice(ui->boff); hgap = GetSpinChoice(ui->hgap); vgap = GetSpinChoice(ui->vgap); add = GetToggleButtonState(ui->add); kill = GetToggleButtonState(ui->kill); hpack = GetToggleButtonState(ui->hpack); vpack = GetToggleButtonState(ui->vpack); if (add && ngraphs < nrows*ncols) { int gno; graphs = xrealloc(graphs, nrows*ncols*SIZEOF_INT); for (gno = number_of_graphs(); ngraphs < nrows*ncols; ngraphs++, gno++) { graphs[ngraphs] = gno; } } if (kill && ngraphs > nrows*ncols) { for (; ngraphs > nrows*ncols; ngraphs--) { kill_graph(graphs[ngraphs - 1]); } } arrange_graphs(graphs, ngraphs, nrows, ncols, order, snake, loff, roff, toff, boff, vgap, hgap, hpack, vpack); update_all(); SelectListChoices(ui->graphs, ngraphs, graphs); xfree(graphs); xdrawgraph(); return RETURN_SUCCESS; } void hpack_cb(int onoff, void *data) { Arrange_ui *ui = (Arrange_ui *) data; SetSensitive(ui->hgap->rc, !onoff); } void vpack_cb(int onoff, void *data) { Arrange_ui *ui = (Arrange_ui *) data; SetSensitive(ui->vgap->rc, !onoff); } void create_arrange_frame(void *data) { static Arrange_ui *ui = NULL; set_wait_cursor(); if (ui == NULL) { Widget arrange_panel, fr, gr, rc; BitmapOptionItem opitems[8] = { {0 | 0 | 0 , m_hv_lr_tb_bits}, {0 | 0 | GA_ORDER_V_INV, m_hv_lr_bt_bits}, {0 | GA_ORDER_H_INV | 0 , m_hv_rl_tb_bits}, {0 | GA_ORDER_H_INV | GA_ORDER_V_INV, m_hv_rl_bt_bits}, {GA_ORDER_HV_INV | 0 | 0 , m_vh_lr_tb_bits}, {GA_ORDER_HV_INV | 0 | GA_ORDER_V_INV, m_vh_lr_bt_bits}, {GA_ORDER_HV_INV | GA_ORDER_H_INV | 0 , m_vh_rl_tb_bits}, {GA_ORDER_HV_INV | GA_ORDER_H_INV | GA_ORDER_V_INV, m_vh_rl_bt_bits} }; ui = xmalloc(sizeof(Arrange_ui)); ui->top = CreateDialogForm(app_shell, "Arrange graphs"); arrange_panel = CreateVContainer(ui->top); fr = CreateFrame(arrange_panel, NULL); rc = CreateVContainer(fr); ui->graphs = CreateGraphChoice(rc, "Arrange graphs:", LIST_TYPE_MULTIPLE); ui->add = CreateToggleButton(rc, "Add graphs as needed to fill the matrix"); ui->kill = CreateToggleButton(rc, "Kill extra graphs"); fr = CreateFrame(arrange_panel, "Matrix"); gr = CreateGrid(fr, 4, 1); ui->ncols = CreateSpinChoice(gr, "Cols:", 2, SPIN_TYPE_INT, (double) 1, (double) 99, (double) 1); PlaceGridChild(gr, ui->ncols->rc, 0, 0); ui->nrows = CreateSpinChoice(gr, "Rows:", 2, SPIN_TYPE_INT, (double) 1, (double) 99, (double) 1); PlaceGridChild(gr, ui->nrows->rc, 1, 0); ui->order = CreateBitmapOptionChoice(gr, "Order:", 2, 8, MBITMAP_WIDTH, MBITMAP_HEIGHT, opitems); PlaceGridChild(gr, ui->order->menu, 2, 0); rc = CreateHContainer(gr); ui->snake = CreateToggleButton(rc, "Snake fill"); PlaceGridChild(gr, rc, 3, 0); fr = CreateFrame(arrange_panel, "Page offsets"); gr = CreateGrid(fr, 3, 3); ui->toff = CreateSpinChoice(gr, "", 4, SPIN_TYPE_FLOAT, 0.0, 1.0, 0.05); PlaceGridChild(gr, ui->toff->rc, 1, 0); ui->loff = CreateSpinChoice(gr, "", 4, SPIN_TYPE_FLOAT, 0.0, 1.0, 0.05); PlaceGridChild(gr, ui->loff->rc, 0, 1); ui->roff = CreateSpinChoice(gr, "", 4, SPIN_TYPE_FLOAT, 0.0, 1.0, 0.05); PlaceGridChild(gr, ui->roff->rc, 2, 1); ui->boff = CreateSpinChoice(gr, "", 4, SPIN_TYPE_FLOAT, 0.0, 1.0, 0.05); PlaceGridChild(gr, ui->boff->rc, 1, 2); fr = CreateFrame(arrange_panel, "Spacing"); gr = CreateGrid(fr, 2, 1); rc = CreateHContainer(gr); ui->hgap = CreateSpinChoice(rc, "Hgap/width", 3, SPIN_TYPE_FLOAT, 0.0, 9.0, 0.1); ui->hpack = CreateToggleButton(rc, "Pack"); AddToggleButtonCB(ui->hpack, hpack_cb, ui); PlaceGridChild(gr, rc, 0, 0); rc = CreateHContainer(gr); ui->vgap = CreateSpinChoice(rc, "Vgap/height", 3, SPIN_TYPE_FLOAT, 0.0, 9.0, 0.1); ui->vpack = CreateToggleButton(rc, "Pack"); AddToggleButtonCB(ui->vpack, vpack_cb, ui); PlaceGridChild(gr, rc, 1, 0); CreateAACDialog(ui->top, arrange_panel, define_arrange_proc, ui); SetSpinChoice(ui->nrows, (double) 1); SetSpinChoice(ui->ncols, (double) 1); SetSpinChoice(ui->toff, GA_OFFSET_DEFAULT); SetSpinChoice(ui->loff, GA_OFFSET_DEFAULT); SetSpinChoice(ui->roff, GA_OFFSET_DEFAULT); SetSpinChoice(ui->boff, GA_OFFSET_DEFAULT); SetSpinChoice(ui->hgap, GA_GAP_DEFAULT); SetSpinChoice(ui->vgap, GA_GAP_DEFAULT); SetToggleButtonState(ui->add, TRUE); } RaiseWindow(GetParent(ui->top)); unset_wait_cursor(); } /* * Overlay graphs popup routines */ static int define_overlay_proc(void *data) { int g1, g2; int type = GetOptionChoice(graph_overlaytype_item); if (GetSingleListChoice(graph_overlay1_choice_item, &g1) != RETURN_SUCCESS) { errmsg("Please select a single graph"); return RETURN_FAILURE; } if (GetSingleListChoice(graph_overlay2_choice_item, &g2) != RETURN_SUCCESS) { errmsg("Please select a single graph"); return RETURN_FAILURE; } if (g1 == g2) { errmsg("Can't overlay a graph onto itself"); return RETURN_FAILURE; } overlay_graphs(g1, g2, type); update_all(); xdrawgraph(); return RETURN_SUCCESS; } void create_overlay_frame(void *data) { char *label1[2]; set_wait_cursor(); if (overlay_dialog == NULL) { OptionItem opitems[5]; label1[0] = "Accept"; label1[1] = "Close"; overlay_dialog = CreateDialogForm(app_shell, "Overlay graphs"); graph_overlay1_choice_item = CreateGraphChoice(overlay_dialog, "Overlay graph:", LIST_TYPE_SINGLE); AddDialogFormChild(overlay_dialog, graph_overlay1_choice_item->rc); graph_overlay2_choice_item = CreateGraphChoice(overlay_dialog, "Onto graph:", LIST_TYPE_SINGLE); AddDialogFormChild(overlay_dialog, graph_overlay2_choice_item->rc); opitems[0].value = GOVERLAY_SMART_AXES_DISABLED; opitems[0].label = "Disabled"; opitems[1].value = GOVERLAY_SMART_AXES_NONE; opitems[1].label = "X and Y axes different"; opitems[2].value = GOVERLAY_SMART_AXES_X; opitems[2].label = "Same X axis scaling"; opitems[3].value = GOVERLAY_SMART_AXES_Y; opitems[3].label = "Same Y axis scaling"; opitems[4].value = GOVERLAY_SMART_AXES_XY; opitems[4].label = "Same X and Y axis scaling"; graph_overlaytype_item = CreateOptionChoice(overlay_dialog, "Smart axis hints:", 0, 5, opitems); CreateAACDialog(overlay_dialog, graph_overlaytype_item->menu, define_overlay_proc, NULL); } RaiseWindow(GetParent(overlay_dialog)); unset_wait_cursor(); } /* * autoscale popup */ typedef struct _Auto_ui { Widget top; SetChoiceItem sel; OptionStructure *on_item; Widget *applyto_item; } Auto_ui; static Auto_ui aui; static int define_autos_proc(void *data) { int aon, au, ap; Auto_ui *ui = (Auto_ui *) data; aon = GetOptionChoice(ui->on_item); ap = GetChoice(ui->applyto_item); au = GetSelectedSet(ui->sel); if (au == SET_SELECT_ERROR) { errmsg("No set selected"); return RETURN_FAILURE; } if (au == SET_SELECT_ALL) { au = -1; } define_autos(aon, au, ap); return RETURN_SUCCESS; } void create_autos_frame(void *data) { set_wait_cursor(); if (aui.top == NULL) { Widget rc; aui.top = CreateDialogForm(app_shell, "Autoscale graphs"); rc = CreateVContainer(aui.top); aui.on_item = CreateASChoice(rc, "Autoscale:"); aui.sel = CreateSetSelector(rc, "Use set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); aui.applyto_item = CreatePanelChoice(rc, "Apply to graph:", 3, "Current", "All", NULL); CreateAACDialog(aui.top, rc, define_autos_proc, &aui); } RaiseWindow(GetParent(aui.top)); unset_wait_cursor(); } void define_autos(int aon, int au, int ap) { int i, ming, maxg; int cg = get_cg(); if (au >= 0 && !is_set_active(cg, au)) { errmsg("Set not active"); return; } if (ap) { ming = 0; maxg = number_of_graphs() - 1; } else { ming = cg; maxg = cg; } if (ming == cg && maxg == cg) { if (!is_graph_active(cg)) { errmsg("Current graph is not active!"); return; } } for (i = ming; i <= maxg; i++) { if (is_graph_active(i)) { autoscale_byset(i, au, aon); } } update_ticks(cg); xdrawgraph(); } grace-5.1.23/src/devlist.h0000644000076500001440000000312610071615561015046 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-99 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * list of device init functions * */ #ifndef __DEVLIST_H_ #define __DEVLIST_H_ #include int register_dummy_drv(void); #ifndef NONE_GUI int register_x11_drv(void); #endif int register_ps_drv(void); int register_eps_drv(void); int register_mf_drv(void); int register_mif_drv(void); int register_svg_drv(void); #ifdef HAVE_LIBPDF int register_pdf_drv(void); #endif int register_pnm_drv(void); #ifdef HAVE_LIBJPEG int register_jpg_drv(void); #endif #ifdef HAVE_LIBPNG int register_png_drv(void); #endif #endif /* __DEVLIST_H_ */ grace-5.1.23/src/dlmodule.h0000644000076500001440000000243110071615561015177 0ustar fnevgenyusers/* * Grace - Graphics for Exploratory Data Analysis * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-95 Paul J Turner, Portland, OR * Copyright (c) 1996-98 GRACE Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * dlmodule.h - header for DLL stuff for Grace */ #include #include "defines.h" #if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD) # define HAVE_DL #endif int load_module(char *fname, char *dl_function, char *dl_key, int dl_type); grace-5.1.23/src/compwin.c0000644000076500001440000015711311014373541015046 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2001 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * transformations, curve fitting, etc. * * formerly, this was all one big popup, now it is several. * All are created as needed * */ #include #include #include #include #include #include #include #include #include #include #include #include "globals.h" #include "graphs.h" #include "utils.h" #include "ssdata.h" #include "motifinc.h" #include "protos.h" static Widget but1[3]; static Widget but2[3]; static void compute_aac(void *data); static void do_digfilter_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_linearc_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_xcor_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_int_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_differ_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_seasonal_proc(Widget w, XtPointer client_data, XtPointer call_data); static int do_interp_proc(void *data); static void do_regress_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_runavg_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_fourier_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_fft_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_window_proc(Widget w, XtPointer client_data, XtPointer call_data); static int do_histo_proc(void *data); static void do_sample_proc(Widget w, XtPointer client_data, XtPointer call_data); static void do_prune_toggle(Widget w, XtPointer client_data, XtPointer call_data); static void do_prune_proc(Widget w, XtPointer client_data, XtPointer call_data); static void set_regr_sensitivity(Widget , XtPointer , XtPointer ); typedef struct _Eval_ui { Widget top; SrcDestStructure *srcdest; Widget formula_item; RestrictionStructure *restr_item; } Eval_ui; static Eval_ui eui; void create_eval_frame(void *data) { set_wait_cursor(); if (eui.top == NULL) { Widget dialog, rc_trans, fr; eui.top = XmCreateDialogShell(app_shell, "evaluateExpression", NULL, 0); XtVaSetValues(eui.top, XmNallowShellResize, True, NULL); handle_close(eui.top); dialog = XtVaCreateWidget("dialog", xmFormWidgetClass, eui.top, XmNresizePolicy, XmRESIZE_ANY, NULL); eui.srcdest = CreateSrcDestSelector(dialog, LIST_TYPE_MULTIPLE); XtVaSetValues(eui.srcdest->form, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); rc_trans = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNrecomputeSize, True, NULL); CreateSeparator(rc_trans); eui.formula_item = CreateScrollTextItem2(rc_trans, 3, "Formula:"); eui.restr_item = CreateRestrictionChoice(rc_trans, "Source data filtering"); ManageChild(rc_trans); fr = CreateFrame(dialog, NULL); XtVaSetValues(fr, XmNtopAttachment, XmATTACH_NONE, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); CreateAACButtons(fr, dialog, compute_aac); XtVaSetValues(rc_trans, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, eui.srcdest->form, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_WIDGET, XmNbottomWidget, fr, NULL); ManageChild(dialog); } RaiseWindow(eui.top); unset_wait_cursor(); } /* * evaluate a formula */ static void compute_aac(void *data) { int aac_mode, error, resno; int i, g1_ok, g2_ok, ns1, ns2, *svalues1, *svalues2, gno1, gno2, setno1, setno2; char fstr[256]; int restr_type, restr_negate; char *rarray; aac_mode = (int) data; if (aac_mode == AAC_CLOSE) { UnmanageChild(eui.top); return; } set_wait_cursor(); restr_type = GetOptionChoice(eui.restr_item->r_sel); restr_negate = GetToggleButtonState(eui.restr_item->negate); g1_ok = GetSingleListChoice(eui.srcdest->src->graph_sel, &gno1); g2_ok = GetSingleListChoice(eui.srcdest->dest->graph_sel, &gno2); ns1 = GetListChoices(eui.srcdest->src->set_sel, &svalues1); ns2 = GetListChoices(eui.srcdest->dest->set_sel, &svalues2); error = FALSE; if (g1_ok == RETURN_FAILURE || g2_ok == RETURN_FAILURE) { error = TRUE; errmsg("Please select single source and destination graphs"); } else if (ns1 == 0) { error = TRUE; errmsg("No source sets selected"); } else if (ns1 != ns2 && ns2 != 0) { error = TRUE; errmsg("Different number of source and destination sets"); } else { strcpy(fstr, xv_getstr(eui.formula_item)); for (i = 0; i < ns1; i++) { setno1 = svalues1[i]; if (ns2 != 0) { setno2 = svalues2[i]; } else { setno2 = nextset(gno2); set_set_hidden(gno2, setno2, FALSE); } resno = get_restriction_array(gno1, setno1, restr_type, restr_negate, &rarray); if (resno != RETURN_SUCCESS) { errmsg("Error in evaluation restriction"); break; } resno = do_compute(gno1, setno1, gno2, setno2, rarray, fstr); XCFREE(rarray); if (resno != RETURN_SUCCESS) { errmsg("Error in do_compute(), check formula"); break; } } } if (aac_mode == AAC_ACCEPT && error == FALSE) { UnmanageChild(eui.top); } if (ns1 > 0) { xfree(svalues1); } if (ns2 > 0) { xfree(svalues2); } if (error == FALSE) { if (gno1 != gno2) { update_set_lists(gno1); update_set_lists(gno2); } else { update_set_lists(gno1); } xdrawgraph(); } unset_wait_cursor(); } #define SAMPLING_MESH 0 #define SAMPLING_SET 1 /* interpolation */ typedef struct _Interp_ui { TransformStructure *tdialog; OptionStructure *method; OptionStructure *sampling; Widget strict; Widget mrc; Widget mstart; Widget mstop; Widget mlength; ListStructure *sset_sel; } Interp_ui; static Interp_ui *interpui = NULL; static void sampling_cb(int value, void *data) { Interp_ui *ui = (Interp_ui *) data; if (value == SAMPLING_MESH) { SetSensitive(ui->mrc, True); SetSensitive(ui->sset_sel->list, False); } else { SetSensitive(ui->mrc, False); SetSensitive(ui->sset_sel->list, True); } } void create_interp_frame(void *data) { set_wait_cursor(); if (interpui == NULL) { Widget fr, rc, rc2; OptionItem opitems[3]; interpui = xmalloc(sizeof(Interp_ui)); interpui->tdialog = CreateTransformDialogForm(app_shell, "Interpolation", LIST_TYPE_MULTIPLE); fr = CreateFrame(interpui->tdialog->form, NULL); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); opitems[0].value = INTERP_LINEAR; opitems[0].label = "Linear"; opitems[1].value = INTERP_SPLINE; opitems[1].label = "Cubic spline"; opitems[2].value = INTERP_ASPLINE; opitems[2].label = "Akima spline"; interpui->method = CreateOptionChoice(rc2, "Method:", 0, 3, opitems); interpui->strict = CreateToggleButton(rc2, "Strict (within source set bounds)"); CreateSeparator(rc); opitems[0].value = SAMPLING_MESH; opitems[0].label = "Linear mesh"; opitems[1].value = SAMPLING_SET; opitems[1].label = "Abscissas of another set"; interpui->sampling = CreateOptionChoice(rc, "Sampling:", 0, 2, opitems); AddOptionChoiceCB(interpui->sampling, sampling_cb, interpui); interpui->mrc = CreateHContainer(rc); interpui->mstart = CreateTextItem2(interpui->mrc, 10, "Start at:"); interpui->mstop = CreateTextItem2(interpui->mrc, 10, "Stop at:"); interpui->mlength = CreateTextItem2(interpui->mrc, 6, "Length:"); interpui->sset_sel = CreateSetChoice(rc, "Sampling set", LIST_TYPE_SINGLE, TRUE); SetSensitive(interpui->sset_sel->list, False); CreateAACDialog(interpui->tdialog->form, fr, do_interp_proc, interpui); } RaiseWindow(GetParent(interpui->tdialog->form)); unset_wait_cursor(); } static int do_interp_proc(void *data) { int error, res; int nssrc, nsdest, *svaluessrc, *svaluesdest, gsrc, gdest; int method, sampling, strict; int i, meshlen; double *mesh = NULL; Interp_ui *ui = (Interp_ui *) data; res = GetTransformDialogSettings(ui->tdialog, TRUE, &gsrc, &gdest, &nssrc, &svaluessrc, &nsdest, &svaluesdest); if (res != RETURN_SUCCESS) { return RETURN_FAILURE; } error = FALSE; method = GetOptionChoice(ui->method); sampling = GetOptionChoice(ui->sampling); strict = GetToggleButtonState(ui->strict); if (sampling == SAMPLING_SET) { int gsampl, setnosampl; gsampl = get_cg(); res = GetSingleListChoice(ui->sset_sel, &setnosampl); if (res != RETURN_SUCCESS) { errmsg("Please select single sampling set"); error = TRUE; } else { meshlen = getsetlength(gsampl, setnosampl); mesh = getcol(gsampl, setnosampl, DATA_X); } } else { double start, stop; if (xv_evalexpr(ui->mstart, &start) != RETURN_SUCCESS || xv_evalexpr(ui->mstop, &stop) != RETURN_SUCCESS || xv_evalexpri(ui->mlength, &meshlen) != RETURN_SUCCESS ) { errmsg("Can't parse mesh settings"); error = TRUE; } else { mesh = allocate_mesh(start, stop, meshlen); if (mesh == NULL) { errmsg("Can't allocate mesh"); error = TRUE; } } } if (error) { xfree(svaluessrc); if (nsdest > 0) { xfree(svaluesdest); } return RETURN_FAILURE; } for (i = 0; i < nssrc; i++) { int setnosrc, setnodest; setnosrc = svaluessrc[i]; if (nsdest != 0) { setnodest = svaluesdest[i]; } else { setnodest = SET_SELECT_NEXT; } res = do_interp(gsrc, setnosrc, gdest, setnodest, mesh, meshlen, method, strict); if (res != RETURN_SUCCESS) { errmsg("Error in do_interp()"); error = TRUE; break; } } xfree(svaluessrc); if (nsdest > 0) { xfree(svaluesdest); } if (sampling == SAMPLING_MESH) { xfree(mesh); } update_set_lists(gdest); xdrawgraph(); if (error) { return RETURN_FAILURE; } else { return RETURN_SUCCESS; } } /* histograms */ typedef struct _Histo_ui { TransformStructure *tdialog; Widget cumulative; Widget normalize; OptionStructure *sampling; Widget mrc; Widget mstart; Widget mstop; Widget mlength; ListStructure *sset_sel; } Histo_ui; static Histo_ui *histoui = NULL; static void binsampling_cb(int value, void *data) { Histo_ui *ui = (Histo_ui *) data; if (value == SAMPLING_MESH) { SetSensitive(ui->mrc, True); SetSensitive(ui->sset_sel->list, False); } else { SetSensitive(ui->mrc, False); SetSensitive(ui->sset_sel->list, True); } } void create_histo_frame(void *data) { set_wait_cursor(); if (histoui == NULL) { Widget fr, rc, rc2; OptionItem opitems[2]; histoui = xmalloc(sizeof(Histo_ui)); histoui->tdialog = CreateTransformDialogForm(app_shell, "Histograms", LIST_TYPE_MULTIPLE); fr = CreateFrame(histoui->tdialog->form, NULL); rc = CreateVContainer(fr); rc2 = CreateHContainer(rc); histoui->cumulative = CreateToggleButton(rc2, "Cumulative histogram"); histoui->normalize = CreateToggleButton(rc2, "Normalize"); CreateSeparator(rc); opitems[0].value = SAMPLING_MESH; opitems[0].label = "Linear mesh"; opitems[1].value = SAMPLING_SET; opitems[1].label = "Abscissas of another set"; histoui->sampling = CreateOptionChoice(rc, "Bin sampling:", 0, 2, opitems); AddOptionChoiceCB(histoui->sampling, binsampling_cb, histoui); histoui->mrc = CreateHContainer(rc); histoui->mstart = CreateTextItem2(histoui->mrc, 10, "Start at:"); histoui->mstop = CreateTextItem2(histoui->mrc, 10, "Stop at:"); histoui->mlength = CreateTextItem2(histoui->mrc, 6, "# of bins"); histoui->sset_sel = CreateSetChoice(rc, "Sampling set", LIST_TYPE_SINGLE, TRUE); SetSensitive(histoui->sset_sel->list, False); CreateAACDialog(histoui->tdialog->form, fr, do_histo_proc, histoui); } RaiseWindow(GetParent(histoui->tdialog->form)); unset_wait_cursor(); } static int do_histo_proc(void *data) { int error, res; int nssrc, nsdest, *svaluessrc, *svaluesdest, gsrc, gdest; int cumulative, normalize, sampling; int i, nbins; double *bins = NULL; Histo_ui *ui = (Histo_ui *) data; res = GetTransformDialogSettings(ui->tdialog, TRUE, &gsrc, &gdest, &nssrc, &svaluessrc, &nsdest, &svaluesdest); if (res != RETURN_SUCCESS) { return RETURN_FAILURE; } error = FALSE; cumulative = GetToggleButtonState(ui->cumulative); normalize = GetToggleButtonState(ui->normalize); sampling = GetOptionChoice(ui->sampling); if (sampling == SAMPLING_SET) { int gsampl, setnosampl; gsampl = get_cg(); res = GetSingleListChoice(ui->sset_sel, &setnosampl); if (res != RETURN_SUCCESS) { errmsg("Please select single sampling set"); error = TRUE; } else { nbins = getsetlength(gsampl, setnosampl) - 1; bins = getcol(gsampl, setnosampl, DATA_X); } } else { double start, stop; if (xv_evalexpr(ui->mstart, &start) != RETURN_SUCCESS || xv_evalexpr(ui->mstop, &stop) != RETURN_SUCCESS || xv_evalexpri(ui->mlength, &nbins) != RETURN_SUCCESS ){ errmsg("Can't parse mesh settings"); error = TRUE; } else { bins = allocate_mesh(start, stop, nbins + 1); if (bins == NULL) { errmsg("Can't allocate mesh"); error = TRUE; } } } if (error) { xfree(svaluessrc); if (nsdest > 0) { xfree(svaluesdest); } return RETURN_FAILURE; } for (i = 0; i < nssrc; i++) { int setnosrc, setnodest; setnosrc = svaluessrc[i]; if (nsdest != 0) { setnodest = svaluesdest[i]; } else { setnodest = SET_SELECT_NEXT; } res = do_histo(gsrc, setnosrc, gdest, setnodest, bins, nbins, cumulative, normalize); if (res != RETURN_SUCCESS) { errmsg("Error in do_histo()"); error = TRUE; break; } } xfree(svaluessrc); if (nsdest > 0) { xfree(svaluesdest); } if (sampling == SAMPLING_MESH) { xfree(bins); } update_set_lists(gdest); xdrawgraph(); if (error) { return RETURN_FAILURE; } else { return RETURN_SUCCESS; } } /* DFTs */ typedef struct _Four_ui { Widget top; SetChoiceItem sel; Widget *load_item; Widget *window_item; Widget *loadx_item; Widget *inv_item; Widget *type_item; Widget *graph_item; } Four_ui; static Four_ui fui; void create_fourier_frame(void *data) { Widget dialog; Widget rc; Widget buts[4]; set_wait_cursor(); if (fui.top == NULL) { char *l[4]; l[0] = "DFT"; l[1] = "FFT"; l[2] = "Window only"; l[3] = "Close"; fui.top = XmCreateDialogShell(app_shell, "Fourier transforms", NULL, 0); handle_close(fui.top); dialog = XmCreateRowColumn(fui.top, "dialog_rc", NULL, 0); fui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 5, XmNorientation, XmHORIZONTAL, XmNisAligned, True, XmNadjustLast, False, XmNentryAlignment, XmALIGNMENT_END, NULL); XtVaCreateManagedWidget("Data window: ", xmLabelWidgetClass, rc, NULL); fui.window_item = CreatePanelChoice(rc, " ", 8, "None (Rectangular)", "Triangular", "Hanning", "Welch", "Hamming", "Blackman", "Parzen", NULL); XtVaCreateManagedWidget("Load result as: ", xmLabelWidgetClass, rc, NULL); fui.load_item = CreatePanelChoice(rc, " ", 4, "Magnitude", "Phase", "Coefficients", NULL); XtVaCreateManagedWidget("Let result X = ", xmLabelWidgetClass, rc, NULL); fui.loadx_item = CreatePanelChoice(rc, " ", 4, "Index", "Frequency", "Period", NULL); XtVaCreateManagedWidget("Perform: ", xmLabelWidgetClass, rc, NULL); fui.inv_item = CreatePanelChoice(rc, " ", 3, "Transform", "Inverse transform", NULL); XtVaCreateManagedWidget("Data is: ", xmLabelWidgetClass, rc, NULL); fui.type_item = CreatePanelChoice(rc, " ", 3, "Real", "Complex", NULL); ManageChild(rc); CreateSeparator(dialog); CreateCommandButtons(dialog, 4, buts, l); XtAddCallback(buts[0], XmNactivateCallback, (XtCallbackProc) do_fourier_proc, (XtPointer) & fui); XtAddCallback(buts[1], XmNactivateCallback, (XtCallbackProc) do_fft_proc, (XtPointer) & fui); XtAddCallback(buts[2], XmNactivateCallback, (XtCallbackProc) do_window_proc, (XtPointer) & fui); XtAddCallback(buts[3], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) fui.top); ManageChild(dialog); } RaiseWindow(fui.top); unset_wait_cursor(); } /* * DFT */ static void do_fourier_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int *selsets; int i, cnt; int setno, load, loadx, invflag, type, wind; Four_ui *ui = (Four_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } wind = GetChoice(ui->window_item); load = GetChoice(ui->load_item); loadx = GetChoice(ui->loadx_item); invflag = GetChoice(ui->inv_item); type = GetChoice(ui->type_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_fourier(gno, setno, 0, load, loadx, invflag, type, wind); } update_set_lists(gno); xfree(selsets); unset_wait_cursor(); xdrawgraph(); } /* * DFT by FFT */ static void do_fft_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int *selsets; int i, cnt; int setno, load, loadx, invflag, type, wind; Four_ui *ui = (Four_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } wind = GetChoice(ui->window_item); load = GetChoice(ui->load_item); loadx = GetChoice(ui->loadx_item); invflag = GetChoice(ui->inv_item); type = GetChoice(ui->type_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_fourier(gno, setno, 1, load, loadx, invflag, type, wind); } update_set_lists(gno); xfree(selsets); unset_wait_cursor(); xdrawgraph(); } /* * Apply data window only */ static void do_window_proc(Widget w, XtPointer client_data, XtPointer call_data) { int *selsets; int i, cnt; int setno, type, wind; Four_ui *ui = (Four_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } wind = GetChoice(ui->window_item); type = GetChoice(ui->type_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_window(setno, type, wind); } update_set_lists(get_cg()); xfree(selsets); unset_wait_cursor(); xdrawgraph(); } /* running averages */ typedef struct _Run_ui { Widget top; SetChoiceItem sel; Widget len_item; Widget *type_item; Widget *region_item; Widget rinvert_item; } Run_ui; static Run_ui rui; void create_run_frame(void *data) { Widget dialog; Widget rc; set_wait_cursor(); if (rui.top == NULL) { char *label2[2]; label2[0] = "Accept"; label2[1] = "Close"; rui.top = XmCreateDialogShell(app_shell, "Running averages", NULL, 0); handle_close(rui.top); dialog = XmCreateRowColumn(rui.top, "dialog_rc", NULL, 0); rui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 5, XmNorientation, XmHORIZONTAL, XmNisAligned, True, XmNadjustLast, False, XmNentryAlignment, XmALIGNMENT_END, NULL); XtVaCreateManagedWidget("Running:", xmLabelWidgetClass, rc, NULL); rui.type_item = CreatePanelChoice(rc, " ", 6, "Average", "Median", "Minimum", "Maximum", "Std. dev.", NULL); rui.len_item = CreateTextItem4(rc, 10, "Length of average:"); XtVaCreateManagedWidget("Restrictions:", xmLabelWidgetClass, rc, NULL); rui.region_item = CreatePanelChoice(rc, " ", 9, "None", "Region 0", "Region 1", "Region 2", "Region 3", "Region 4", "Inside graph", "Outside graph", NULL); rui.rinvert_item = CreateToggleButton(rc, "Invert region"); ManageChild(rc); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_runavg_proc, (XtPointer) & rui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) rui.top); ManageChild(dialog); } RaiseWindow(rui.top); unset_wait_cursor(); } /* * running averages, medians, min, max, std. deviation */ static void do_runavg_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int *selsets; int i, cnt; int runlen, runtype, setno, rno, invr; Run_ui *ui = (Run_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } if (xv_evalexpri(ui->len_item, &runlen ) != RETURN_SUCCESS) { return; } runtype = GetChoice(ui->type_item); rno = GetChoice(ui->region_item) - 1; invr = GetToggleButtonState(ui->rinvert_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_runavg(gno, setno, runlen, runtype, rno, invr); } update_set_lists(gno); unset_wait_cursor(); xfree(selsets); xdrawgraph(); } /* TODO finish this */ void do_eval_regress() { } typedef struct _Reg_ui { Widget top; SetChoiceItem sel; Widget *degree_item; Widget zero_item; Widget *resid_item; Widget *region_item; Widget rinvert_item; Widget start_item; Widget stop_item; Widget step_item; Widget fload_rc; Widget method_item; } Reg_ui; static Reg_ui regui; /* * set sensitivity of start, stop iand load buttons */ static void set_regr_sensitivity(Widget w, XtPointer client_data, XtPointer call_data) { if( (int)client_data == 2 ) SetSensitive( regui.fload_rc, True ); else SetSensitive( regui.fload_rc, False ); } void create_reg_frame(void *data) { Widget dialog; Widget rc, rc2; Widget buts[2]; int i; set_wait_cursor(); if (regui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; regui.top = XmCreateDialogShell(app_shell, "Regression", NULL, 0); handle_close(regui.top); dialog = XmCreateRowColumn(regui.top, "dialog_rc", NULL, 0); regui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNorientation, XmVERTICAL, NULL); rc2 = XtVaCreateWidget("rc2", xmRowColumnWidgetClass, rc, XmNorientation, XmHORIZONTAL, NULL); XtVaCreateManagedWidget("Type of fit:", xmLabelWidgetClass, rc2, NULL); regui.degree_item = CreatePanelChoice(rc2, " ", 16, "Linear", "Quadratic", "Cubic", "4th degree", "5th degree", "6th degree", "7th degree", "8th degree", "9th degree", "10th degree", "1-10", "Power y=A*x^B", "Exponential y=A*exp(B*x)", "Logarithmic y=A+B*ln(x)", "Inverse y=1/(A+Bx)", NULL); ManageChild(rc2); rc2 = XtVaCreateWidget("rc2", xmRowColumnWidgetClass, rc, XmNorientation, XmHORIZONTAL, NULL); XtVaCreateManagedWidget("Load:", xmLabelWidgetClass, rc2, NULL); regui.resid_item = CreatePanelChoice(rc2, " ", 4, "Fitted values", "Residuals", "Function", NULL); ManageChild(rc2); for( i=2; i<5; i++ ) XtAddCallback( regui.resid_item[i], XmNactivateCallback, set_regr_sensitivity, (XtPointer)(i-2) ); rc2 = XtVaCreateWidget("rc2", xmRowColumnWidgetClass, rc, XmNorientation, XmHORIZONTAL, NULL); XtVaCreateManagedWidget("Restrictions:", xmLabelWidgetClass, rc2, NULL); regui.region_item = CreatePanelChoice(rc2, " ", 9, "None", "Region 0", "Region 1", "Region 2", "Region 3", "Region 4", "Inside graph", "Outside graph", NULL); regui.rinvert_item = CreateToggleButton(rc2, "Invert region"); ManageChild(rc2); CreateSeparator(rc); regui.fload_rc = XmCreateRowColumn(rc, "nonl_fload_rc", NULL, 0); XtVaSetValues(regui.fload_rc, XmNorientation, XmHORIZONTAL, NULL); regui.start_item = CreateTextItem2(regui.fload_rc, 6, "Start load at:"); regui.stop_item = CreateTextItem2(regui.fload_rc, 6, "Stop load at:"); regui.step_item = CreateTextItem2(regui.fload_rc, 4, "# of points:"); ManageChild(regui.fload_rc); ManageChild(rc); SetSensitive(regui.fload_rc, False); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, buts, label1); XtAddCallback(buts[0], XmNactivateCallback, (XtCallbackProc) do_regress_proc, (XtPointer) & regui); XtAddCallback(buts[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) regui.top); ManageChild(dialog); } RaiseWindow(regui.top); unset_wait_cursor(); } /* * regression */ static void do_regress_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int *selsets; int cnt; Reg_ui *ui = (Reg_ui *) client_data; int setno, ideg, iresid, i, j, k; int rno = GetChoice(ui->region_item) - 1; int invr = GetToggleButtonState(ui->rinvert_item); int nstep = 0, rx, rset = 0; double xstart, xstop, stepsize = 0.0, *xr; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } ideg = (int) GetChoice(ui->degree_item) + 1; switch(rx=GetChoice(ui->resid_item) ){ case 0: /* evaluate fitted function at original x's */ iresid = 0; rset = -1; break; case 1: /* load residue at original x points */ iresid = 1; rset = -1; break; case 2: /* evaluate fitted function at new x points */ iresid = 0; if(xv_evalexpri(ui->step_item, &nstep) != RETURN_SUCCESS || nstep < 2 ) { errwin("Number points < 2"); return; } if(xv_evalexpr(ui->start_item, &xstart ) != RETURN_SUCCESS) { errwin("Specify starting value"); return; } if(xv_evalexpr(ui->stop_item, &xstop) != RETURN_SUCCESS) { errwin("Specify stopping value"); return; } else { stepsize = (xstop - xstart)/(nstep-1); } break; default: errwin("Internal error"); return; } set_wait_cursor(); for (i = (ideg==11?1:ideg); i <= (ideg==11?10:ideg); i++) { for (j = 0; j < cnt; j++) { setno = selsets[j]; if( rx == 2 ) { if( (rset = nextset( gno )) == -1 ){ errwin("Not enough sets"); return; } activateset( gno, rset ); setlength( gno, rset, nstep); xr = getx( gno, rset ); for( k=0; ksel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } itype = (int) GetChoice(ui->type_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_differ(gno, setno, itype); } update_set_lists(gno); unset_wait_cursor(); xfree(selsets); xdrawgraph(); } /* numerical integration */ typedef struct _Int_ui { Widget top; SetChoiceItem sel; Widget *type_item; Widget sum_item; Widget *region_item; Widget rinvert_item; } Int_ui; static Int_ui iui; void create_int_frame(void *data) { Widget dialog; set_wait_cursor(); if (iui.top == NULL) { char *label2[2]; label2[0] = "Accept"; label2[1] = "Close"; iui.top = XmCreateDialogShell(app_shell, "Integration", NULL, 0); handle_close(iui.top); dialog = XmCreateRowColumn(iui.top, "dialog_rc", NULL, 0); iui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); iui.type_item = CreatePanelChoice(dialog, "Load:", 3, "Cumulative sum", "Sum only", NULL); iui.sum_item = CreateTextItem2(dialog, 10, "Sum:"); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_int_proc, (XtPointer) & iui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) iui.top); ManageChild(dialog); } RaiseWindow(iui.top); unset_wait_cursor(); } /* * numerical integration */ static void do_int_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int *selsets; int i, cnt; int setno, itype; double sum; Int_ui *ui = (Int_ui *) client_data; char buf[32]; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } itype = GetChoice(ui->type_item); set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; sum = do_int(gno, setno, itype); sprintf(buf, "%g", sum); xv_setstr(ui->sum_item, buf); } update_set_lists(gno); unset_wait_cursor(); xfree(selsets); xdrawgraph(); } /* seasonal differencing */ typedef struct _Seas_ui { Widget top; SetChoiceItem sel; Widget *type_item; Widget period_item; Widget *region_item; Widget rinvert_item; } Seas_ui; static Seas_ui sui; void create_seasonal_frame(void *data) { Widget dialog; set_wait_cursor(); if (sui.top == NULL) { char *label2[2]; label2[0] = "Accept"; label2[1] = "Close"; sui.top = XmCreateDialogShell(app_shell, "Seasonal differences", NULL, 0); handle_close(sui.top); dialog = XmCreateRowColumn(sui.top, "dialog_rc", NULL, 0); sui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); sui.period_item = CreateTextItem2(dialog, 10, "Period:"); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_seasonal_proc, (XtPointer) & sui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) sui.top); ManageChild(dialog); } RaiseWindow(sui.top); unset_wait_cursor(); } /* * seasonal differences */ static void do_seasonal_proc(Widget w, XtPointer client_data, XtPointer call_data) { int *selsets; int i, cnt; int setno, period; Seas_ui *ui = (Seas_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } if(xv_evalexpri(ui->period_item, &period ) != RETURN_SUCCESS) return; set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_seasonal_diff(setno, period); } update_set_lists(get_cg()); xfree(selsets); unset_wait_cursor(); xdrawgraph(); } /* cross correlation */ typedef struct _Cross_ui { Widget top; SetChoiceItem sel1; SetChoiceItem sel2; Widget lag_item; Widget covar_item; } Cross_ui; static Cross_ui crossui; void create_xcor_frame(void *data) { Widget dialog; set_wait_cursor(); if (crossui.top == NULL) { char *label2[3]; label2[0] = "Accept"; label2[1] = "Close"; crossui.top = XmCreateDialogShell(app_shell, "Correlation/Covariance", NULL, 0); handle_close(crossui.top); dialog = XmCreateRowColumn(crossui.top, "dialog_rc", NULL, 0); crossui.sel1 = CreateSetSelector(dialog, "Select set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); crossui.sel2 = CreateSetSelector(dialog, "Select set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); crossui.lag_item = CreateTextItem2(dialog, 10, "Maximum lag:"); crossui.covar_item = CreateToggleButton(dialog, "Calculate covariance"); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_xcor_proc, (XtPointer) & crossui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) crossui.top); ManageChild(dialog); } RaiseWindow(crossui.top); unset_wait_cursor(); } /* * cross correlation */ static void do_xcor_proc(Widget w, XtPointer client_data, XtPointer call_data) { int gno = get_cg(); int set1, set2, maxlag, covar; Cross_ui *ui = (Cross_ui *) client_data; set1 = GetSelectedSet(ui->sel1); set2 = GetSelectedSet(ui->sel2); if (set1 == SET_SELECT_ERROR || set2 == SET_SELECT_ERROR) { errwin("Select 2 sets"); return; } if(xv_evalexpri(ui->lag_item, &maxlag) != RETURN_SUCCESS) { return; } covar = GetToggleButtonState(ui->covar_item); set_wait_cursor(); do_xcor(gno, set1, gno, set2, maxlag, covar); update_set_lists(gno); xdrawgraph(); unset_wait_cursor(); } /* sample a set */ typedef struct _Samp_ui { Widget top; SetChoiceItem sel; Widget *type_item; Widget start_item; Widget step_item; Widget expr_item; Widget *region_item; Widget rinvert_item; } Samp_ui; static Samp_ui sampui; void create_samp_frame(void *data) { static Widget dialog; Widget rc; set_wait_cursor(); if (sampui.top == NULL) { char *label2[2]; label2[0] = "Accept"; label2[1] = "Close"; sampui.top = XmCreateDialogShell(app_shell, "Sample points", NULL, 0); handle_close(sampui.top); dialog = XmCreateRowColumn(sampui.top, "dialog_rc", NULL, 0); sampui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 5, XmNorientation, XmHORIZONTAL, XmNisAligned, True, XmNadjustLast, False, XmNentryAlignment, XmALIGNMENT_END, NULL); XtVaCreateManagedWidget("Sample type:", xmLabelWidgetClass, rc, NULL); sampui.type_item = CreatePanelChoice(rc, " ", 3, "Start/step", "Expression", NULL); sampui.start_item = CreateTextItem4(rc, 10, "Start:"); sampui.step_item = CreateTextItem4(rc, 10, "Step:"); sampui.expr_item = CreateTextItem4(rc, 10, "Logical expression:"); ManageChild(rc); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_sample_proc, (XtPointer) & sampui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) sampui.top); ManageChild(dialog); } RaiseWindow(sampui.top); unset_wait_cursor(); } /* * sample a set, by start/step or logical expression */ static void do_sample_proc(Widget w, XtPointer client_data, XtPointer call_data) { int *selsets; int i, cnt; int setno, typeno; char *exprstr; int startno, stepno; Samp_ui *ui = (Samp_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errmsg("No sets selected"); return; } typeno = GetChoice(ui->type_item); if (typeno == 0) { exprstr = ""; if (xv_evalexpri(ui->start_item, &startno) != RETURN_SUCCESS || xv_evalexpri(ui->step_item, &stepno) != RETURN_SUCCESS) { errmsg("Please select start and step values"); return; } } else { exprstr = xv_getstr(ui->expr_item); startno = stepno = 1; } set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_sample(setno, typeno, exprstr, startno, stepno); } xfree(selsets); update_set_lists(get_cg()); xdrawgraph(); unset_wait_cursor(); } /* Prune data */ typedef struct _Prune_ui { Widget top; SetChoiceItem sel; Widget *type_item; Widget *dxtype_item; Widget *dytype_item; Widget *deltatype_item; Widget dx_rc; Widget dy_rc; Widget dx_item; Widget dy_item; } Prune_ui; static Prune_ui pruneui; void create_prune_frame(void *data) { int i; static Widget dialog; set_wait_cursor(); if (pruneui.top == NULL) { char *label2[2]; label2[0] = "Accept"; label2[1] = "Close"; pruneui.top = XmCreateDialogShell(app_shell, "Prune data", NULL, 0); handle_close(pruneui.top); dialog = XmCreateRowColumn(pruneui.top, "dialog_rc", NULL, 0); pruneui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); pruneui.type_item = CreatePanelChoice(dialog, "Prune type: ", 5, "Interpolation", "Circle", "Ellipse", "Rectangle", NULL); pruneui.dx_rc = XtVaCreateWidget("dx_rc", xmRowColumnWidgetClass, dialog, XmNorientation, XmHORIZONTAL, NULL); pruneui.dx_item = CreateTextItem4(pruneui.dx_rc, 17, "Delta X:"); ManageChild(pruneui.dx_rc); pruneui.dy_rc = XtVaCreateWidget("dy_rc", xmRowColumnWidgetClass, dialog, XmNorientation, XmHORIZONTAL, NULL); pruneui.dy_item = CreateTextItem4(pruneui.dy_rc, 17, "Delta Y:"); ManageChild(pruneui.dy_rc); CreateSeparator(dialog); pruneui.deltatype_item = CreatePanelChoice(dialog, "Type of Delta coordinates:", 3, "Viewport", "World", NULL); pruneui.dxtype_item = CreatePanelChoice(dialog, "Scaling of Delta X:", 3, "Linear", "Logarithmic", NULL); pruneui.dytype_item = CreatePanelChoice(dialog, "Scaling of Delta Y:", 3, "Linear", "Logarithmic", NULL); update_prune_frame(); for (i = 0; i <= 3; i++) { XtAddCallback(pruneui.type_item[2 + i], XmNactivateCallback, (XtCallbackProc) do_prune_toggle, (XtPointer) &pruneui); } for (i = 0; i <= 1; i++) { XtAddCallback(pruneui.deltatype_item[2 + i], XmNactivateCallback, (XtCallbackProc) do_prune_toggle, (XtPointer) &pruneui); } do_prune_toggle ((Widget) NULL, (XtPointer) &pruneui, 0); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but2, label2); XtAddCallback(but2[0], XmNactivateCallback, (XtCallbackProc) do_prune_proc, (XtPointer) & pruneui); XtAddCallback(but2[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) pruneui.top); ManageChild(dialog); } RaiseWindow(pruneui.top); unset_wait_cursor(); } void update_prune_frame(void) { if (pruneui.top != NULL) { SetChoice(pruneui.dxtype_item, (get_graph_xscale(get_cg()) == SCALE_LOG) ? 1 : 0); SetChoice(pruneui.dytype_item, (get_graph_yscale(get_cg()) == SCALE_LOG) ? 1 : 0); } } /* * Toggle prune type */ static void do_prune_toggle(Widget w, XtPointer client_data, XtPointer call_data) { Prune_ui *ui = (Prune_ui *) client_data; int typeno = (int) GetChoice(ui->type_item); int deltatypeno = (int) GetChoice(ui->deltatype_item); switch (typeno) { case PRUNE_CIRCLE: SetSensitive(pruneui.dx_rc, TRUE); SetSensitive(pruneui.dy_rc, FALSE); switch (deltatypeno) { case PRUNE_VIEWPORT: SetSensitive(*pruneui.dxtype_item, FALSE); SetSensitive(*pruneui.dytype_item, FALSE); break; case PRUNE_WORLD: SetSensitive(*pruneui.dxtype_item, TRUE); SetSensitive(*pruneui.dytype_item, FALSE); break; } break; case PRUNE_ELLIPSE: case PRUNE_RECTANGLE: SetSensitive(pruneui.dx_rc, TRUE); SetSensitive(pruneui.dy_rc, TRUE); switch (deltatypeno) { case PRUNE_VIEWPORT: SetSensitive(*pruneui.dxtype_item, FALSE); SetSensitive(*pruneui.dytype_item, FALSE); break; case PRUNE_WORLD: SetSensitive(*pruneui.dxtype_item, TRUE); SetSensitive(*pruneui.dytype_item, TRUE); break; } break; case PRUNE_INTERPOLATION: SetSensitive(pruneui.dx_rc, FALSE); SetSensitive(pruneui.dy_rc, TRUE); switch (deltatypeno) { case PRUNE_VIEWPORT: SetSensitive(*pruneui.dxtype_item, FALSE); SetSensitive(*pruneui.dytype_item, FALSE); break; case PRUNE_WORLD: SetSensitive(*pruneui.dxtype_item, FALSE); SetSensitive(*pruneui.dytype_item, TRUE); break; } break; } } /* * Prune data */ static void do_prune_proc(Widget w, XtPointer client_data, XtPointer call_data) { int *selsets; int i, cnt; int setno, typeno, deltatypeno; int dxtype, dytype; double deltax, deltay; Prune_ui *ui = (Prune_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } typeno = (int) GetChoice(ui->type_item); deltatypeno = (int) GetChoice(ui->deltatype_item); dxtype = (int) GetChoice(ui->dxtype_item); dytype = (int) GetChoice(ui->dytype_item); if( XtIsSensitive(ui->dx_rc)== True ){ if(xv_evalexpr(ui->dx_item, &deltax) != RETURN_SUCCESS) return; } else deltax = 0; if( XtIsSensitive(ui->dy_rc)== True ){ if(xv_evalexpr(ui->dy_item, &deltay) != RETURN_SUCCESS ) return; } else deltay = 0; set_wait_cursor(); for (i = 0; i < cnt; i++) { setno = selsets[i]; do_prune(setno, typeno, deltatypeno, deltax, deltay, dxtype, dytype); } update_set_lists(get_cg()); unset_wait_cursor(); xfree(selsets); xdrawgraph(); } /* apply a digital filter in set 2 to set 1 */ typedef struct _Digf_ui { Widget top; SetChoiceItem sel1; SetChoiceItem sel2; Widget *type_item; Widget *region_item; Widget rinvert_item; } Digf_ui; static Digf_ui digfui; void create_digf_frame(void *data) { Widget dialog; set_wait_cursor(); if (digfui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; digfui.top = XmCreateDialogShell(app_shell, "Digital filter", NULL, 0); handle_close(digfui.top); dialog = XmCreateRowColumn(digfui.top, "dialog_rc", NULL, 0); digfui.sel1 = CreateSetSelector(dialog, "Filter set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); digfui.sel2 = CreateSetSelector(dialog, "With weights from set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_digfilter_proc, (XtPointer) & digfui); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) digfui.top); ManageChild(dialog); } RaiseWindow(digfui.top); unset_wait_cursor(); } /* * apply a digital filter */ static void do_digfilter_proc(Widget w, XtPointer client_data, XtPointer call_data) { int set1, set2; Digf_ui *ui = (Digf_ui *) client_data; set1 = GetSelectedSet(ui->sel1); set2 = GetSelectedSet(ui->sel2); if (set1 == SET_SELECT_ERROR || set2 == SET_SELECT_ERROR) { errwin("Select 2 sets"); return; } set_wait_cursor(); do_digfilter(set1, set2); update_set_lists(get_cg()); unset_wait_cursor(); } /* linear convolution */ typedef struct _Lconv_ui { Widget top; SetChoiceItem sel1; SetChoiceItem sel2; Widget *type_item; Widget lag_item; Widget *region_item; Widget rinvert_item; } Lconv_ui; static Lconv_ui lconvui; void create_lconv_frame(void *data) { Widget dialog; set_wait_cursor(); if (lconvui.top == NULL) { char *label1[2]; label1[0] = "Accept"; label1[1] = "Close"; lconvui.top = XmCreateDialogShell(app_shell, "Linear convolution", NULL, 0); handle_close(lconvui.top); dialog = XmCreateRowColumn(lconvui.top, "dialog_rc", NULL, 0); lconvui.sel1 = CreateSetSelector(dialog, "Convolve set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); lconvui.sel2 = CreateSetSelector(dialog, "With set:", SET_SELECT_ACTIVE, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_SINGLE); CreateSeparator(dialog); CreateCommandButtons(dialog, 2, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_linearc_proc, (XtPointer) & lconvui); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) lconvui.top); ManageChild(dialog); } RaiseWindow(lconvui.top); unset_wait_cursor(); } /* * linear convolution */ static void do_linearc_proc(Widget w, XtPointer client_data, XtPointer call_data) { int set1, set2; Lconv_ui *ui = (Lconv_ui *) client_data; set1 = GetSelectedSet(ui->sel1); set2 = GetSelectedSet(ui->sel2); if (set1 == SET_SELECT_ERROR || set2 == SET_SELECT_ERROR) { errwin("Select 2 sets"); return; } set_wait_cursor(); do_linearc(get_cg(), set1, get_cg(), set2); update_set_lists(get_cg()); xdrawgraph(); unset_wait_cursor(); } /* * Rotate, scale, translate */ typedef struct _Geom_ui { Widget top; SetChoiceItem sel; SetChoiceItem sel2; Widget *order_item; Widget degrees_item; Widget rotx_item; Widget roty_item; Widget scalex_item; Widget scaley_item; Widget transx_item; Widget transy_item; Widget *region_item; Widget rinvert_item; } Geom_ui; static Geom_ui gui; static void do_geom_proc(Widget w, XtPointer client_data, XtPointer call_data); static void reset_geom_proc(Widget, XtPointer, XtPointer); void create_geom_frame(void *data) { Widget dialog; Widget rc; set_wait_cursor(); if (gui.top == NULL) { char *label1[3]; label1[0] = "Accept"; label1[1] = "Reset"; label1[2] = "Close"; gui.top = XmCreateDialogShell(app_shell, "Geometric transformations", NULL, 0); handle_close(gui.top); dialog = XmCreateRowColumn(gui.top, "dialog_rc", NULL, 0); gui.sel = CreateSetSelector(dialog, "Apply to set:", SET_SELECT_ALL, FILTER_SELECT_NONE, GRAPH_SELECT_CURRENT, SELECTION_TYPE_MULTIPLE); rc = XtVaCreateWidget("rc", xmRowColumnWidgetClass, dialog, XmNpacking, XmPACK_COLUMN, XmNnumColumns, 8, XmNorientation, XmHORIZONTAL, XmNisAligned, True, XmNadjustLast, False, XmNentryAlignment, XmALIGNMENT_END, NULL); gui.order_item = CreatePanelChoice(dialog, "Apply in order:", 7, "Rotate, translate, scale", "Rotate, scale, translate", "Translate, scale, rotate", "Translate, rotate, scale", "Scale, translate, rotate", "Scale, rotate, translate", NULL); gui.degrees_item = CreateTextItem4(rc, 10, "Rotation (degrees):"); gui.rotx_item = CreateTextItem4(rc, 10, "Rotate about X = :"); gui.roty_item = CreateTextItem4(rc, 10, "Rotate about Y = :"); gui.scalex_item = CreateTextItem4(rc, 10, "Scale X:"); gui.scaley_item = CreateTextItem4(rc, 10, "Scale Y:"); gui.transx_item = CreateTextItem4(rc, 10, "Translate X:"); gui.transy_item = CreateTextItem4(rc, 10, "Translate Y:"); ManageChild(rc); CreateSeparator(dialog); CreateCommandButtons(dialog, 3, but1, label1); XtAddCallback(but1[0], XmNactivateCallback, (XtCallbackProc) do_geom_proc, (XtPointer) & gui); XtAddCallback(but1[1], XmNactivateCallback, (XtCallbackProc) reset_geom_proc, (XtPointer) & gui.top); XtAddCallback(but1[2], XmNactivateCallback, (XtCallbackProc) destroy_dialog, (XtPointer) gui.top); ManageChild(dialog); xv_setstr(gui.degrees_item, "0.0"); xv_setstr(gui.rotx_item, "0.0"); xv_setstr(gui.roty_item, "0.0"); xv_setstr(gui.scalex_item, "1.0"); xv_setstr(gui.scaley_item, "1.0"); xv_setstr(gui.transx_item, "0.0"); xv_setstr(gui.transy_item, "0.0"); } RaiseWindow(gui.top); unset_wait_cursor(); } /* * compute geom */ static void do_geom_proc(Widget w, XtPointer client_data, XtPointer call_data) { int i, j, k, cnt, order[3], setno, ord; int *selsets; double degrees, sx, sy, rotx, roty, tx, ty, xtmp, ytmp, *x, *y; double cosd, sind; Geom_ui *ui = (Geom_ui *) client_data; cnt = GetSelectedSets(ui->sel, &selsets); if (cnt == SET_SELECT_ERROR) { errwin("No sets selected"); return; } ord = (int) GetChoice(ui->order_item); switch (ord) { case 0: order[0] = 0; /* rotate */ order[1] = 1; /* translate */ order[2] = 2; /* scale */ break; case 1: order[0] = 0; order[1] = 2; order[2] = 1; break; case 2: order[0] = 1; order[1] = 2; order[2] = 0; break; case 3: order[0] = 1; order[1] = 0; order[2] = 2; break; case 4: order[0] = 2; order[1] = 1; order[2] = 0; break; case 5: order[0] = 2; order[1] = 0; order[2] = 1; break; } /* check input fields */ if (xv_evalexpr(ui->degrees_item, °rees) != RETURN_SUCCESS || xv_evalexpr(ui->rotx_item, &rotx) != RETURN_SUCCESS || xv_evalexpr(ui->roty_item, &roty) != RETURN_SUCCESS || xv_evalexpr(ui->transx_item, &tx) != RETURN_SUCCESS || xv_evalexpr(ui->transy_item, &ty) != RETURN_SUCCESS || xv_evalexpr(ui->scalex_item, &sx) != RETURN_SUCCESS || xv_evalexpr(ui->scaley_item, &sy) != RETURN_SUCCESS ) return; degrees = M_PI / 180.0 * degrees; cosd = cos(degrees); sind = sin(degrees); set_wait_cursor(); for (k = 0; k < cnt; k++) { setno = selsets[k]; if (is_set_active(get_cg(), setno)) { x = getx(get_cg(), setno); y = gety(get_cg(), setno); for (j = 0; j < 3; j++) { switch (order[j]) { case 0: /* rotate */ if (degrees == 0.0) { break; } for (i = 0; i < getsetlength(get_cg(), setno); i++) { xtmp = x[i] - rotx; ytmp = y[i] - roty; x[i] = rotx + cosd * xtmp - sind * ytmp; y[i] = roty + sind * xtmp + cosd * ytmp; } break; case 1: /* translate */ for (i = 0; i < getsetlength(get_cg(), setno); i++) { x[i] += tx; y[i] += ty; } break; case 2: /* scale */ for (i = 0; i < getsetlength(get_cg(), setno); i++) { x[i] *= sx; y[i] *= sy; } break; } /* end case */ } /* end for j */ update_set_lists(get_cg()); } /* end if */ } /* end for k */ update_set_lists(get_cg()); xfree(selsets); set_dirtystate(); unset_wait_cursor(); xdrawgraph(); } static void reset_geom_proc(Widget w, XtPointer client_data, XtPointer call_data) { Geom_ui *tui = (Geom_ui *) client_data; xv_setstr(tui->degrees_item, "0.0"); xv_setstr(tui->rotx_item, "0.0"); xv_setstr(tui->roty_item, "0.0"); xv_setstr(tui->scalex_item, "1.0"); xv_setstr(tui->scaley_item, "1.0"); xv_setstr(tui->transx_item, "0.0"); xv_setstr(tui->transy_item, "0.0"); } grace-5.1.23/src/x11drv.c0000644000076500001440000004400511177401755014523 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2003 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * * driver for X11 for Grace * */ #include #include #include "defines.h" #include #include #include "globals.h" #include "utils.h" #include "device.h" #include "devlist.h" #include "draw.h" #include "graphs.h" #include "patterns.h" #include "x11drv.h" #include "protos.h" extern Display *disp; extern Window xwin; Window root; int screennumber; GC gc, gcxor; int depth; static Visual *visual; static int pixel_size; int install_cmap = CMAP_INSTALL_AUTO; static int private_cmap = FALSE; unsigned long xvlibcolors[MAXCOLORS]; Colormap cmap; static Pixmap displaybuff = (Pixmap) NULL; static int xlibcolor; static int xlibbgcolor; static int xlibpatno; static int xliblinewidth; static int xliblinestyle; static int xlibfillrule; static int xlibarcfillmode; static int xliblinecap; static int xliblinejoin; unsigned int win_h = 0, win_w = 0; #define win_scale ((win_h < win_w) ? win_h:win_w) Pixmap resize_bufpixmap(unsigned int w, unsigned int h); static Device_entry dev_x11 = {DEVICE_TERM, "X11", xlibinitgraphics, NULL, NULL, "", FALSE, TRUE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; int register_x11_drv(void) { long mrsize; int max_path_limit; /* XExtendedMaxRequestSize() appeared in X11R6 */ #if XlibSpecificationRelease > 5 mrsize = XExtendedMaxRequestSize(disp); #else mrsize = 0; #endif if (mrsize <= 0) { mrsize = XMaxRequestSize(disp); } max_path_limit = (mrsize - 3)/2; if (max_path_limit < get_max_path_limit()) { char buf[128]; sprintf(buf, "Setting max drawing path length to %d (limited by the X server)", max_path_limit); errmsg(buf); set_max_path_limit(max_path_limit); } dev_x11.pg.dpi = rint(MM_PER_INCH*DisplayWidth(disp, screennumber)/ DisplayWidthMM(disp, screennumber)); return register_device(dev_x11); } int xlibinit(void) { XGCValues gc_val; XPixmapFormatValues *pmf; int i, n; screennumber = DefaultScreen(disp); visual = DefaultVisual(disp, screennumber); root = RootWindow(disp, screennumber); gc = DefaultGC(disp, screennumber); depth = DisplayPlanes(disp, screennumber); pixel_size = 0; pmf = XListPixmapFormats (disp, &n); if (pmf) { for (i = 0; i < n; i++) { if (pmf[i].depth == depth) { pixel_size = pmf[i].bits_per_pixel/8; break; } } XFree ((char *) pmf); } if (pixel_size == 0) { monomode = TRUE; } /* * init colormap */ cmap = DefaultColormap(disp, screennumber); /* redefine colormap, if needed */ if (install_cmap == CMAP_INSTALL_ALWAYS) { cmap = XCopyColormapAndFree(disp, cmap); private_cmap = TRUE; } xlibinitcmap(); /* * set GCs */ gc_val.foreground = xvlibcolors[0]; gc_val.background = xvlibcolors[1]; if (invert) { gc_val.function = GXinvert; } else { gc_val.function = GXxor; } gcxor = XCreateGC(disp, root, GCFunction | GCForeground, &gc_val); displaybuff = resize_bufpixmap(win_w, win_h); /* * disable font AA in mono mode */ if (monomode == TRUE) { Device_entry dev; dev = get_device_props(tdevice); dev.fontaa = FALSE; set_device_props(tdevice, dev); } return RETURN_SUCCESS; } int xconvxlib(double x) { return ((int) rint(win_scale * x)); } int yconvxlib(double y) { return ((int) rint(win_h - win_scale * y)); } void xlibVPoint2dev(VPoint vp, int *x, int *y) { *x = xconvxlib(vp.x); *y = yconvxlib(vp.y); } XPoint VPoint2XPoint(VPoint vp) { XPoint xp; xp.x = xconvxlib(vp.x); xp.y = yconvxlib(vp.y); return(xp); } /* * xlibdev2VPoint - given (x,y) in screen coordinates, return the * viewport coordinates */ VPoint xlibdev2VPoint(int x, int y) { VPoint vp; if (win_scale == 0) { vp.x = (double) 0.0; vp.y = (double) 0.0; } else { vp.x = (double) x / win_scale; vp.y = (double) (win_h - y) / win_scale; } return (vp); } void xlibupdatecmap(void) { /* TODO: replace!!! */ if (inwin) { xlibinitcmap(); } } void xlibinitcmap(void) { int i; RGB *prgb; XColor xc[MAXCOLORS]; for (i = 0; i < MAXCOLORS; i++) { xc[i].pixel = 0; xc[i].flags = DoRed | DoGreen | DoBlue; } for (i = 0; i < number_of_colors(); i++) { /* even in mono, b&w must be allocated */ if (monomode == FALSE || i < 2) { prgb = get_rgb(i); if (prgb != NULL) { xc[i].red = prgb->red << (16 - GRACE_BPP); xc[i].green = prgb->green << (16 - GRACE_BPP); xc[i].blue = prgb->blue << (16 - GRACE_BPP); if (XAllocColor(disp, cmap, &xc[i])) { xvlibcolors[i] = xc[i].pixel; } else { if (install_cmap != CMAP_INSTALL_NEVER && private_cmap == FALSE) { cmap = XCopyColormapAndFree(disp, cmap); private_cmap = TRUE; /* will try to allocate the same color * in the private colormap */ i--; } else { /* really bad */ xvlibcolors[i] = xvlibcolors[1]; /* * errmsg("Can't allocate color"); */ } } } } else { xvlibcolors[i] = xvlibcolors[1]; } } } int xlibinitgraphics(void) { int i, j; double step; XPoint xp; if (inwin == FALSE) { return RETURN_FAILURE; } xlibcolor = BAD_COLOR; xlibbgcolor = BAD_COLOR; xlibpatno = -1; xliblinewidth = -1; xliblinestyle = -1; xlibfillrule = -1; xlibarcfillmode = -1; xliblinecap = -1; xliblinejoin = -1; /* device-dependent routines */ devupdatecmap = xlibupdatecmap; devdrawpixel = xlibdrawpixel; devdrawpolyline = xlibdrawpolyline; devfillpolygon = xlibfillpolygon; devdrawarc = xlibdrawarc; devfillarc = xlibfillarc; devputpixmap = xlibputpixmap; devleavegraphics = xlibleavegraphics; /* init settings specific to X11 driver */ if (get_pagelayout() == PAGE_FIXED) { sync_canvas_size(&win_w, &win_h, FALSE); } else { sync_canvas_size(&win_w, &win_h, TRUE); } displaybuff = resize_bufpixmap(win_w, win_h); xlibupdatecmap(); XSetForeground(disp, gc, xvlibcolors[0]); XSetFillStyle(disp, gc, FillSolid); XFillRectangle(disp, displaybuff, gc, 0, 0, win_w, win_h); XSetForeground(disp, gc, xvlibcolors[1]); step = (double) win_scale/10; for (i = 0; i < win_w/step; i++) { for (j = 0; j < win_h/step; j++) { xp.x = rint(i*step); xp.y = win_h - rint(j*step); XDrawPoint(disp, displaybuff, gc, xp.x, xp.y); } } XSetLineAttributes(disp, gc, 1, LineSolid, CapButt, JoinMiter); XDrawRectangle(disp, displaybuff, gc, 0, 0, win_w - 1, win_h - 1); return RETURN_SUCCESS; } void xlib_setpen(void) { int fg, bg, p; fg = getcolor(); bg = getbgcolor(); p = getpattern(); if ((fg == xlibcolor) && (bg == xlibbgcolor) && (p == xlibpatno)) { return; } if (fg != xlibcolor) { XSetForeground(disp, gc, xvlibcolors[fg]); xlibcolor = fg; } if (bg != xlibbgcolor) { XSetBackground(disp, gc, xvlibcolors[bg]); xlibbgcolor = bg; } if (p >= number_of_patterns() || p < 0) { p = 0; } xlibpatno = p; if (p == 0) { /* TODO: transparency !!!*/ return; } else if (p == 1) { /* To make X faster */ XSetFillStyle(disp, gc, FillSolid); } else { /* TODO: implement cache ? */ Pixmap ptmp = XCreatePixmapFromBitmapData(disp, root, (char *) pat_bits[p], 16, 16, xvlibcolors[fg], xvlibcolors[bg], PlanesOfScreen(DefaultScreenOfDisplay(disp))); XSetFillStyle(disp, gc, FillTiled); XSetTile(disp, gc, ptmp); XFreePixmap(disp, ptmp); return; } } void xlib_setdrawbrush(void) { unsigned int iw; int style; int lc, lj; int i, scale, darr_len; char *xdarr; xlib_setpen(); iw = (unsigned int) rint(getlinewidth()*win_scale); if (iw == 1) { iw = 0; } style = getlinestyle(); lc = getlinecap(); lj = getlinejoin(); switch (lc) { case LINECAP_BUTT: lc = CapButt; break; case LINECAP_ROUND: lc = CapRound; break; case LINECAP_PROJ: lc = CapProjecting; break; } switch (lj) { case LINEJOIN_MITER: lj = JoinMiter; break; case LINEJOIN_ROUND: lj = JoinRound; break; case LINEJOIN_BEVEL: lj = JoinBevel; break; } if (iw != xliblinewidth || style != xliblinestyle || lc != xliblinecap || lj != xliblinejoin) { if (style > 1) { darr_len = dash_array_length[style]; xdarr = xmalloc(darr_len*SIZEOF_CHAR); if (xdarr == NULL) { return; } scale = MAX2(1, iw); for (i = 0; i < darr_len; i++) { xdarr[i] = scale*dash_array[style][i]; } XSetLineAttributes(disp, gc, iw, LineOnOffDash, lc, lj); XSetDashes(disp, gc, 0, xdarr, darr_len); xfree(xdarr); } else if (style == 1) { XSetLineAttributes(disp, gc, iw, LineSolid, lc, lj); } xliblinestyle = style; xliblinewidth = iw; xliblinecap = lc; xliblinejoin = lj; } return; } void xlibdrawpixel(VPoint vp) { XPoint xp; xp = VPoint2XPoint(vp); xlib_setpen(); XDrawPoint(disp, displaybuff, gc, xp.x, xp.y); } void xlibdrawpolyline(VPoint *vps, int n, int mode) { int i, xn = n; XPoint *p; if (n <= 1 || getlinestyle() == 0 || getpattern() == 0) { return; } if (mode == POLYLINE_CLOSED) { xn++; } p = xmalloc(xn*sizeof(XPoint)); if (p == NULL) { return; } for (i = 0; i < n; i++) { p[i] = VPoint2XPoint(vps[i]); } if (mode == POLYLINE_CLOSED) { p[n] = p[0]; } xlib_setdrawbrush(); XDrawLines(disp, displaybuff, gc, p, xn, CoordModeOrigin); xfree(p); } void xlibfillpolygon(VPoint *vps, int npoints) { int i; XPoint *p; if (npoints < 3 || getpattern() == 0) { return; } p = (XPoint *) xmalloc(npoints*sizeof(XPoint)); if (p == NULL) { return; } for (i = 0; i < npoints; i++) { p[i] = VPoint2XPoint(vps[i]); } xlib_setpen(); if (getfillrule() != xlibfillrule) { xlibfillrule = getfillrule(); if (getfillrule() == FILLRULE_WINDING) { XSetFillRule(disp, gc, WindingRule); } else { XSetFillRule(disp, gc, EvenOddRule); } } XFillPolygon(disp, displaybuff, gc, p, npoints, Complex, CoordModeOrigin); xfree(p); } /* * xlibdrawarc */ void xlibdrawarc(VPoint vp1, VPoint vp2, int angle1, int angle2) { int x1, y1, x2, y2; xlibVPoint2dev(vp1, &x1, &y2); xlibVPoint2dev(vp2, &x2, &y1); if (getlinestyle() == 0 || getpattern() == 0) { return; } xlib_setdrawbrush(); if (x1 != x2 || y1 != y2) { XDrawArc(disp, displaybuff, gc, MIN2(x1, x2), MIN2(y1, y2), abs(x2 - x1), abs(y2 - y1), 64 * angle1, 64 * (angle2 - angle1)); } else { /* zero radius */ XDrawPoint(disp, displaybuff, gc, x1, y1); } } /* * xlibfillarc */ void xlibfillarc(VPoint vp1, VPoint vp2, int angle1, int angle2, int mode) { int x1, y1, x2, y2; xlibVPoint2dev(vp1, &x1, &y2); xlibVPoint2dev(vp2, &x2, &y1); if (getpattern() != 0) { xlib_setpen(); if (x1 != x2 || y1 != y2) { if (xlibarcfillmode != mode) { xlibarcfillmode = mode; if (mode == ARCFILL_CHORD) { XSetArcMode(disp, gc, ArcChord); } else { XSetArcMode(disp, gc, ArcPieSlice); } } XFillArc(disp, displaybuff, gc, MIN2(x1, x2), MIN2(y1, y2), abs(x2 - x1), abs(y2 - y1), 64 * angle1, 64 * (angle2 - angle1)); } else { /* zero radius */ XDrawPoint(disp, displaybuff, gc, x1, y1); } } } void xlibputpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { int j, k, l; XPoint xp; static XImage *ximage; Pixmap clipmask = 0; char *pixmap_ptr; char *clipmask_ptr = NULL; int line_off; int cindex, fg, bg; xp = VPoint2XPoint(vp); if (pixmap_bpp != 1) { if (monomode == TRUE) { /* TODO: dither pixmaps on mono displays */ return; } pixmap_ptr = xcalloc(PAD(width, 8) * height, pixel_size); if (pixmap_ptr == NULL) { errmsg("xmalloc failed in xlibputpixmap()"); return; } /* re-index pixmap */ for (k = 0; k < height; k++) { for (j = 0; j < width; j++) { cindex = (unsigned char) (databits)[k*width+j]; for (l = 0; l < pixel_size; l++) { pixmap_ptr[pixel_size*(k*width+j) + l] = (char) (xvlibcolors[cindex] >> (8*l)); } } } ximage=XCreateImage(disp, visual, depth, ZPixmap, 0, pixmap_ptr, width, height, bitmap_pad, /* lines padded to bytes */ 0 /* number of bytes per line */ ); if (pixmap_type == PIXMAP_TRANSPARENT) { clipmask_ptr = xcalloc((PAD(width, 8)>>3) * height, SIZEOF_CHAR); if (clipmask_ptr == NULL) { errmsg("xmalloc failed in xlibputpixmap()"); return; } else { /* Note: We pad the clipmask always to byte boundary */ bg = getbgcolor(); for (k = 0; k < height; k++) { line_off = k*(PAD(width, 8) >> 3); for (j = 0; j < width; j++) { cindex = (unsigned char) (databits)[k*width+j]; if (cindex != bg) { clipmask_ptr[line_off+(j>>3)] |= (0x01 << (j%8)); } } } clipmask=XCreateBitmapFromData(disp, root, clipmask_ptr, width, height); xfree(clipmask_ptr); } } } else { pixmap_ptr = xcalloc((PAD(width, bitmap_pad)>>3) * height, sizeof(unsigned char)); if (pixmap_ptr == NULL) { errmsg("xmalloc failed in xlibputpixmap()"); return; } memcpy(pixmap_ptr, databits, ((PAD(width, bitmap_pad)>>3) * height)); fg = getcolor(); if (fg != xlibcolor) { XSetForeground(disp, gc, xvlibcolors[fg]); xlibcolor = fg; } ximage=XCreateImage(disp, visual, 1, XYBitmap, 0, pixmap_ptr, width, height, bitmap_pad, /* lines padded to bytes */ 0 /* number of bytes per line */ ); if (pixmap_type == PIXMAP_TRANSPARENT) { clipmask=XCreateBitmapFromData(disp, root, pixmap_ptr, PAD(width, bitmap_pad), height); } } if (pixmap_type == PIXMAP_TRANSPARENT) { XSetClipMask(disp, gc, clipmask); XSetClipOrigin(disp, gc, xp.x, xp.y); } /* Force bit and byte order */ ximage->bitmap_bit_order=LSBFirst; ximage->byte_order=LSBFirst; XPutImage(disp, displaybuff, gc, ximage, 0, 0, xp.x, xp.y, width, height); XDestroyImage(ximage); if (pixmap_type == PIXMAP_TRANSPARENT) { XFreePixmap(disp, clipmask); clipmask = 0; XSetClipMask(disp, gc, None); XSetClipOrigin(disp, gc, 0, 0); } } void xlibleavegraphics(void) { int cg = get_cg(); if (is_graph_hidden(cg) == FALSE) { draw_focus(cg); } reset_crosshair(); xlibredraw(xwin, 0, 0, win_w, win_h); XFlush(disp); } grace-5.1.23/src/rstdrv.c0000644000076500001440000007724511521104225014717 0ustar fnevgenyusers/* * Grace - GRaphing, Advanced Computation and Exploration of data * * Home page: http://plasma-gate.weizmann.ac.il/Grace/ * * Copyright (c) 1991-1995 Paul J Turner, Portland, OR * Copyright (c) 1996-2002 Grace Development Team * * Maintained by Evgeny Stambulchik * * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * Grace generic raster format driver */ #include #include #include #include #include "defines.h" #include "utils.h" #include "draw.h" #include "device.h" #include "devlist.h" #include "patterns.h" #include "rstdrv.h" #include "protos.h" #include "gd.h" #ifdef HAVE_LIBJPEG # define JPEG_INTERNAL_OPTIONS # include #endif #ifdef HAVE_LIBPNG # include # include #endif #ifndef NONE_GUI # include "motifinc.h" #endif static void rstImagePnm(gdImagePtr ihandle, FILE *prstream); extern FILE *prstream; /* Declare the image */ static gdImagePtr ihandle = NULL; static int curformat = DEFAULT_RASTER_FORMAT; static int rst_colors[MAXCOLORS]; static int rst_drawbrush, rst_fillbrush; static Pen rstpen; static int rstlines, rstlinew; static int rst_dash_array_length; static unsigned long page_scale; #ifdef HAVE_LIBJPEG static void rstImageJpg(gdImagePtr ihandle, FILE *prstream); static int jpg_setup_quality = 75; static int jpg_setup_grayscale = FALSE; static int jpg_setup_baseline = FALSE; static int jpg_setup_progressive = FALSE; static int jpg_setup_optimize = FALSE; static int jpg_setup_smoothing = 0; static int jpg_setup_dct = JPEG_DCT_DEFAULT; #endif #ifdef HAVE_LIBPNG static void rstImagePng(gdImagePtr ihandle, FILE *prstream); static int png_setup_interlaced = FALSE; static int png_setup_transparent = FALSE; static int png_setup_compression = 4; #endif static Device_entry dev_pnm = {DEVICE_FILE, "PNM", pnminitgraphics, pnm_op_parser, pnm_gui_setup, "pnm", FALSE, TRUE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; #ifdef HAVE_LIBJPEG static Device_entry dev_jpg = {DEVICE_FILE, "JPEG", jpginitgraphics, jpg_op_parser, jpg_gui_setup, "jpg", FALSE, TRUE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; #endif #ifdef HAVE_LIBPNG static Device_entry dev_png = {DEVICE_FILE, "PNG", pnginitgraphics, png_op_parser, png_gui_setup, "png", FALSE, TRUE, {DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT, 72.0}, NULL }; #endif int register_pnm_drv(void) { return register_device(dev_pnm); } #ifdef HAVE_LIBJPEG int register_jpg_drv(void) { return register_device(dev_jpg); } #endif #ifdef HAVE_LIBPNG int register_png_drv(void) { return register_device(dev_png); } #endif static void rst_updatecmap(void) { int i, c; RGB *prgb; int red, green, blue; if (!ihandle) { return; } for (i = 0; i < number_of_colors(); i++) { prgb = get_rgb(i); if (prgb != NULL) { red = prgb->red >> (GRACE_BPP - 8); green = prgb->green >> (GRACE_BPP - 8); blue = prgb->blue >> (GRACE_BPP - 8); if ((c = gdImageColorExact(ihandle, red, green, blue)) == -1 && (c = gdImageColorAllocate(ihandle, red, green, blue)) == -1 && (c = gdImageColorClosest(ihandle, red, green, blue)) == -1) { c = rst_colors[0]; } rst_colors[i] = c; } } } static gdPoint VPoint2gdPoint(VPoint vp) { gdPoint gdp; gdp.x = (int) rint(page_scale * vp.x); gdp.y = (int) rint(page_height - page_scale * vp.y); return (gdp); } void rst_setdrawbrush(void) { static gdImagePtr brush = NULL; int i, j, k; int *tmp_dash_array; RGB *prgb; int red, green, blue, bcolor; int scale; int on, off; rstpen = getpen(); rstlinew = MAX2((int) rint(getlinewidth()*page_scale), 1); rstlines = getlinestyle(); if (rstlines == 0 || rstpen.pattern == 0) { /* Should never come to here */ rst_drawbrush = gdTransparent; return; } if (rstlinew > 1) { if (brush != NULL) { gdImageDestroy(brush); } brush = gdImageCreate(rstlinew, rstlinew); prgb = get_rgb(rstpen.color); red = prgb->red >> (GRACE_BPP - 8); green = prgb->green >> (GRACE_BPP - 8); blue = prgb->blue >> (GRACE_BPP - 8); bcolor = gdImageColorAllocate(brush, red, green, blue); gdImageFilledRectangle(brush, 0, 0, rstlinew, rstlinew, bcolor); gdImageSetBrush(ihandle, brush); } if (rstlines > 1) { rst_dash_array_length = 0; for (i = 0; i < dash_array_length[rstlines]; i++) { rst_dash_array_length += dash_array[rstlines][i]; } if (rstlinew <= 1) { scale = 1; on = rstpen.color; off = gdTransparent; rst_drawbrush = gdStyled; } else { scale = rstlinew; on = 1; off = 0; rst_drawbrush = gdStyledBrushed; } tmp_dash_array = (int *) xmalloc((scale*rst_dash_array_length + 1)*SIZEOF_INT); if (tmp_dash_array == NULL) { return; } k = 0; for (i = 0; i < dash_array_length[rstlines]; i++) { if (i % 2 == 0) { /* black */ for (j = 0; j < (dash_array[rstlines][i] - 1)*scale + 1; j++) { tmp_dash_array[k++] = on; } } else { /* white */ for (j = 0; j < (dash_array[rstlines][i] + 1)*scale - 1; j++) { tmp_dash_array[k++] = off; } } } gdImageSetStyle(ihandle, tmp_dash_array, k); xfree(tmp_dash_array); } else { if (rstlinew <= 1) { rst_drawbrush = rst_colors[rstpen.color]; } else { rst_drawbrush = gdBrushed; } } } void rst_setfillbrush(void) { static gdImagePtr brush = NULL; int i, j, k; RGB *prgb; int red, green, blue, fgcolor, bgcolor; unsigned char p; rstpen = getpen(); if (rstpen.pattern == 0) { /* Should never come to here */ rst_fillbrush = gdTransparent; } else if (rstpen.pattern == 1) { rst_fillbrush = rst_colors[rstpen.color]; } else { /* TODO */ if (brush != NULL) { gdImageDestroy(brush); } brush = gdImageCreate(16, 16); prgb = get_rgb(rstpen.color); red = prgb->red >> (GRACE_BPP - 8); green = prgb->green >> (GRACE_BPP - 8); blue = prgb->blue >> (GRACE_BPP - 8); fgcolor = gdImageColorAllocate(brush, red, green, blue); prgb = get_rgb(getbgcolor()); red = prgb->red >> (GRACE_BPP - 8); green = prgb->green >> (GRACE_BPP - 8); blue = prgb->blue >> (GRACE_BPP - 8); bgcolor = gdImageColorAllocate(brush, red, green, blue); for (k = 0; k < 16; k++) { for (j = 0; j < 2; j++) { for (i = 0; i < 8; i++) { p = pat_bits[rstpen.pattern][k*2+j]; if ((p >> i) & 0x01) { gdImageSetPixel(brush, 8*j + i, k, fgcolor); } else { gdImageSetPixel(brush, 8*j + i, k, bgcolor); } } } } gdImageSetTile(ihandle, brush); rst_fillbrush = gdTiled; } } static int rst_initgraphics(int format) { Page_geometry pg; curformat = format; /* device-dependent routines */ devupdatecmap = rst_updatecmap; devdrawpixel = rst_drawpixel; devdrawpolyline = rst_drawpolyline; devfillpolygon = rst_fillpolygon; devdrawarc = rst_drawarc; devfillarc = rst_fillarc; devputpixmap = rst_putpixmap; devleavegraphics = rst_leavegraphics; pg = get_page_geometry(); page_scale = MIN2(pg.height,pg.width); /* Allocate the image */ ihandle = gdImageCreate(pg.width, pg.height); if (ihandle == NULL) { return RETURN_FAILURE; } rst_updatecmap(); return RETURN_SUCCESS; } void rst_drawpixel(VPoint vp) { gdPoint gdp; gdp = VPoint2gdPoint(vp); gdImageSetPixel(ihandle, gdp.x, gdp.y, rst_colors[getcolor()]); } void rst_drawpolyline(VPoint *vps, int n, int mode) { int i; gdPointPtr gdps; gdps = (gdPointPtr) xmalloc(n*sizeof(gdPoint)); if (gdps == NULL) { return; } for (i = 0; i < n; i++) { gdps[i] = VPoint2gdPoint(vps[i]); } rst_setdrawbrush(); if (mode == POLYLINE_CLOSED) { gdImagePolygon(ihandle, gdps, n, rst_drawbrush); } else { for (i = 0; i < n - 1; i++) { gdImageLine(ihandle, gdps[i].x, gdps[i].y, gdps[i + 1].x, gdps[i + 1].y, rst_drawbrush); } } xfree(gdps); } void rst_fillpolygon(VPoint *vps, int nc) { int i; gdPointPtr gdps; gdps = (gdPointPtr) xmalloc(nc*sizeof(gdPoint)); if (gdps == NULL) { return; } for (i = 0; i < nc; i++) { gdps[i] = VPoint2gdPoint(vps[i]); } rst_setfillbrush(); gdImageFilledPolygon(ihandle, gdps, nc, rst_fillbrush); xfree(gdps); } void rst_drawarc(VPoint vp1, VPoint vp2, int a1, int a2) { gdPoint gdp1, gdp2, gdc; int w, h; gdp1 = VPoint2gdPoint(vp1); gdp2 = VPoint2gdPoint(vp2); gdc.x = (gdp1.x + gdp2.x)/2; gdc.y = (gdp1.y + gdp2.y)/2; w = (gdp2.x - gdp1.x); h = (gdp2.y - gdp1.y); rst_setdrawbrush(); gdImageArc(ihandle, gdc.x, gdc.y, w, h, a1, a2, rst_drawbrush); } void rst_fillarc(VPoint vp1, VPoint vp2, int a1, int a2, int mode) { gdPoint gdp1, gdp2, gdc; int w, h; gdp1 = VPoint2gdPoint(vp1); gdp2 = VPoint2gdPoint(vp2); gdc.x = (gdp1.x + gdp2.x)/2; gdc.y = (gdp1.y + gdp2.y)/2; w = (gdp2.x - gdp1.x); h = (gdp2.y - gdp1.y); rst_setfillbrush(); gdImageFilledArc(ihandle, gdc.x, gdc.y, w, h, a1, a2, mode == ARCFILL_CHORD ? gdArcFillChord:gdArcFillPieSlice, rst_fillbrush); } void rst_putpixmap(VPoint vp, int width, int height, char *databits, int pixmap_bpp, int bitmap_pad, int pixmap_type) { int cindex, bg; int color, bgcolor; int i, k, j; long paddedW; gdPoint gdp; int x, y; bg = getbgcolor(); bgcolor = rst_colors[bg]; gdp = VPoint2gdPoint(vp); y = gdp.y; if (pixmap_bpp == 1) { color = getcolor(); paddedW = PAD(width, bitmap_pad); for (k = 0; k < height; k++) { x = gdp.x; y++; for (j = 0; j < paddedW/bitmap_pad; j++) { for (i = 0; i < bitmap_pad && j*bitmap_pad + i < width; i++) { x++; if (bin_dump(&(databits)[k*paddedW/bitmap_pad+j], i, bitmap_pad)) { gdImageSetPixel(ihandle, x, y, color); } else { if (pixmap_type == PIXMAP_OPAQUE) { gdImageSetPixel(ihandle, x, y, bgcolor); } } } } } } else { for (k = 0; k < height; k++) { x = gdp.x; y++; for (j = 0; j < width; j++) { x++; cindex = (databits)[k*width+j]; if (cindex != bg || pixmap_type == PIXMAP_OPAQUE) { color = rst_colors[cindex]; gdImageSetPixel(ihandle, x, y, color); } } } } } void rst_leavegraphics(void) { /* Output the image to the disk file. */ switch (curformat) { case RST_FORMAT_PNM: rstImagePnm(ihandle, prstream); break; #ifdef HAVE_LIBJPEG case RST_FORMAT_JPG: rstImageJpg(ihandle, prstream); break; #endif #ifdef HAVE_LIBPNG case RST_FORMAT_PNG: if (png_setup_transparent == TRUE) { gdImageColorTransparent(ihandle, rst_colors[getbgcolor()]); } gdImageInterlace(ihandle, png_setup_interlaced); rstImagePng(ihandle, prstream); break; #endif default: errmsg("Invalid raster format"); break; } /* Destroy the image in memory. */ gdImageDestroy(ihandle); ihandle = NULL; } int pnminitgraphics(void) { int result; result = rst_initgraphics(RST_FORMAT_PNM); if (result == RETURN_SUCCESS) { curformat = RST_FORMAT_PNM; } return (result); } static int pnm_setup_format = DEFAULT_PNM_FORMAT; static int pnm_setup_rawbits = TRUE; static void rstImagePnm(gdImagePtr ihandle, FILE *prstream) { int w, h; int i, j, k; int c; unsigned char r, g, b; unsigned char y, pbm_buf; if (pnm_setup_rawbits == TRUE) { switch (pnm_setup_format) { case PNM_FORMAT_PBM: fprintf(prstream, "P4\n"); break; case PNM_FORMAT_PGM: fprintf(prstream, "P5\n"); break; case PNM_FORMAT_PPM: fprintf(prstream, "P6\n"); break; } } else { switch (pnm_setup_format) { case PNM_FORMAT_PBM: fprintf(prstream, "P1\n"); break; case PNM_FORMAT_PGM: fprintf(prstream, "P2\n"); break; case PNM_FORMAT_PPM: fprintf(prstream, "P3\n"); break; } } fprintf(prstream, "#Creator: %s\n", bi_version_string()); w = gdImageSX(ihandle); h = gdImageSY(ihandle); fprintf(prstream, "%d %d\n", w, h); if (pnm_setup_format != PNM_FORMAT_PBM) { fprintf(prstream, "255\n"); } k = 0; pbm_buf = 0; for (i = 0; i < h; i++) { for (j = 0; j < w; j++) { c = gdImageGetPixel(ihandle, j, i); r = (unsigned char) gdImageRed(ihandle, c); g = (unsigned char) gdImageGreen(ihandle, c); b = (unsigned char) gdImageBlue(ihandle, c); if (pnm_setup_rawbits == TRUE) { switch (pnm_setup_format) { case PNM_FORMAT_PBM: y = (r == 255 && g == 255 && b == 255 ? 0x00:0x01); pbm_buf |= (y << (7 - k)); k++; /* completed byte or padding line */ if (k == 8 || j == w - 1) { fwrite(&pbm_buf, 1, 1, prstream); k = 0; pbm_buf = 0; } break; case PNM_FORMAT_PGM: y = INTENSITY(r, g, b); fwrite(&y, 1, 1, prstream); break; case PNM_FORMAT_PPM: fwrite(&r, 1, 1, prstream); fwrite(&g, 1, 1, prstream); fwrite(&b, 1, 1, prstream); break; } } else { switch (pnm_setup_format) { case PNM_FORMAT_PBM: y = (r == 255 && g == 255 && b == 255 ? 0:1); fprintf(prstream, "%1d\n", y); break; case PNM_FORMAT_PGM: y = INTENSITY(r, g, b); fprintf(prstream, "%3d\n", y); break; case PNM_FORMAT_PPM: fprintf(prstream, "%3d %3d %3d\n", r, g, b); break; } } } } } #ifdef HAVE_LIBJPEG int jpginitgraphics(void) { int result; result = rst_initgraphics(RST_FORMAT_JPG); if (result == RETURN_SUCCESS) { curformat = RST_FORMAT_JPG; } return (result); } static void rstImageJpg(gdImagePtr ihandle, FILE *prstream) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; J_DCT_METHOD dct_method; JSAMPROW row_pointer; /* pointer to a single row */ int w, h; int i, j, k; int c; int r, g, b; unsigned char y; w = gdImageSX(ihandle); h = gdImageSY(ihandle); cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, prstream); cinfo.image_width = w; cinfo.image_height = h; if (jpg_setup_grayscale) { cinfo.input_components = 1; cinfo.in_color_space = JCS_GRAYSCALE; } else { cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; } jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, jpg_setup_quality, jpg_setup_baseline); cinfo.smoothing_factor = jpg_setup_smoothing; switch (jpg_setup_dct) { case JPEG_DCT_IFAST: dct_method = JDCT_IFAST; break; case JPEG_DCT_ISLOW: dct_method = JDCT_ISLOW; break; case JPEG_DCT_FLOAT: dct_method = JDCT_FLOAT; break; default: dct_method = JDCT_DEFAULT; } cinfo.dct_method = dct_method; if (jpg_setup_progressive) { #ifdef C_PROGRESSIVE_SUPPORTED jpeg_simple_progression(&cinfo); #else errmsg("jpeglib: sorry, progressive output was not compiled"); #endif } if (jpg_setup_optimize) { #ifdef ENTROPY_OPT_SUPPORTED cinfo.optimize_coding = TRUE; #else errmsg("jpeglib: sorry, entropy optimization was not compiled"); #endif } jpeg_start_compress(&cinfo, TRUE); if (jpg_setup_grayscale) { row_pointer = xmalloc(w); } else { row_pointer = xmalloc(3*w); } while ((i = cinfo.next_scanline) < h) { k = 0; for (j = 0; j < w; j++) { c = gdImageGetPixel(ihandle, j, i); r = gdImageRed(ihandle, c); g = gdImageGreen(ihandle, c); b = gdImageBlue(ihandle, c); if (jpg_setup_grayscale) { y = INTENSITY(r, g, b); row_pointer[k++] = y; } else { row_pointer[k++] = r; row_pointer[k++] = g; row_pointer[k++] = b; } } jpeg_write_scanlines(&cinfo, &row_pointer, 1); } xfree(row_pointer); jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); } int jpg_op_parser(char *opstring) { char *bufp; if (!strcmp(opstring, "grayscale")) { jpg_setup_grayscale = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "color")) { jpg_setup_grayscale = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "optimize:on")) { jpg_setup_optimize = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "optimize:off")) { jpg_setup_optimize = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "baseline:on")) { jpg_setup_baseline = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "baseline:off")) { jpg_setup_baseline = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "progressive:on")) { jpg_setup_progressive = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "progressive:off")) { jpg_setup_progressive = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "dct:ifast")) { jpg_setup_dct = JPEG_DCT_IFAST; return RETURN_SUCCESS; } else if (!strcmp(opstring, "dct:islow")) { jpg_setup_dct = JPEG_DCT_ISLOW; return RETURN_SUCCESS; } else if (!strcmp(opstring, "dct:float")) { jpg_setup_dct = JPEG_DCT_FLOAT; return RETURN_SUCCESS; } else if (!strncmp(opstring, "quality:", 8)) { bufp = strchr(opstring, ':'); bufp++; if (bufp != NULL && *bufp != '\0') { jpg_setup_quality = atoi(bufp); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } else if (!strncmp(opstring, "smoothing:", 10)) { bufp = strchr(opstring, ':'); bufp++; if (bufp != NULL && *bufp != '\0') { jpg_setup_smoothing = atoi(bufp); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } else { return RETURN_FAILURE; } } #endif int pnm_op_parser(char *opstring) { if (!strcmp(opstring, "rawbits:on")) { pnm_setup_rawbits = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "rawbits:off")) { pnm_setup_rawbits = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "format:pbm")) { pnm_setup_format = PNM_FORMAT_PBM; return RETURN_SUCCESS; } else if (!strcmp(opstring, "format:pgm")) { pnm_setup_format = PNM_FORMAT_PGM; return RETURN_SUCCESS; } else if (!strcmp(opstring, "format:ppm")) { pnm_setup_format = PNM_FORMAT_PPM; return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } #ifdef HAVE_LIBPNG int pnginitgraphics(void) { int result; result = rst_initgraphics(RST_FORMAT_PNG); if (result == RETURN_SUCCESS) { curformat = RST_FORMAT_PNG; } return (result); } static void rstImagePng(gdImagePtr ihandle, FILE *prstream) { png_structp png_ptr; png_infop info_ptr; int w, h; int interlace_type; int i, num_palette; png_color *palette; png_byte trans; int num_text; png_text text_ptr[4]; char *s; png_uint_32 res_meter; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { return; } info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { png_destroy_write_struct(&png_ptr, NULL); return; } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return; } png_init_io(png_ptr, prstream); /* set the zlib compression level */ png_set_compression_level(png_ptr, png_setup_compression); w = gdImageSX(ihandle); h = gdImageSY(ihandle); if (png_setup_interlaced) { interlace_type = PNG_INTERLACE_ADAM7; } else { interlace_type = PNG_INTERLACE_NONE; } png_set_IHDR(png_ptr, info_ptr, w, h, 8, PNG_COLOR_TYPE_PALETTE, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); num_palette = gdImageColorsTotal(ihandle); palette = xmalloc(num_palette*sizeof(png_color)); if (palette == NULL) { return; } for (i = 0; i < num_palette; i++) { palette[i].red = gdImageRed(ihandle, i); palette[i].green = gdImageGreen(ihandle, i); palette[i].blue = gdImageBlue(ihandle, i); } png_set_PLTE(png_ptr, info_ptr, palette, num_palette); res_meter = (png_uint_32) rint(page_dpi/MM_PER_INCH*1000.0); png_set_pHYs(png_ptr, info_ptr, res_meter, res_meter, PNG_RESOLUTION_METER); #ifdef PNG_WRITE_tRNS_SUPPORTED if (png_setup_transparent) { trans = gdImageGetTransparent(ihandle); png_set_tRNS(png_ptr, info_ptr, &trans, 1, NULL); } #endif #if (defined(PNG_WRITE_tEXt_SUPPORTED) || defined(PNG_WRITE_zTXt_SUPPORTED)) text_ptr[0].key = "Title"; text_ptr[0].text = get_docname(); text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE; text_ptr[1].key = "Author"; text_ptr[1].text = get_username(); text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE; text_ptr[2].key = "Software"; text_ptr[2].text = bi_version_string(); text_ptr[2].compression = PNG_TEXT_COMPRESSION_NONE; num_text = 3; if ((s = get_project_description())) { text_ptr[3].key = "Description"; text_ptr[3].text = s; if (strlen(s) > 1024) { text_ptr[3].compression = PNG_TEXT_COMPRESSION_zTXt; } else { text_ptr[3].compression = PNG_TEXT_COMPRESSION_NONE; } num_text++; } png_set_text(png_ptr, info_ptr, text_ptr, num_text); #endif png_write_info(png_ptr, info_ptr); png_write_image(png_ptr, (png_byte **) ihandle->pixels); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); xfree(palette); } int png_op_parser(char *opstring) { char *bufp; if (!strcmp(opstring, "interlaced:on")) { png_setup_interlaced = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "interlaced:off")) { png_setup_interlaced = FALSE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "transparent:on")) { png_setup_transparent = TRUE; return RETURN_SUCCESS; } else if (!strcmp(opstring, "transparent:off")) { png_setup_transparent = FALSE; return RETURN_SUCCESS; } else if (!strncmp(opstring, "compression:", 12)) { bufp = strchr(opstring, ':'); bufp++; if (bufp != NULL && *bufp != '\0') { png_setup_compression = atoi(bufp); return RETURN_SUCCESS; } else { return RETURN_FAILURE; } } else { return RETURN_FAILURE; } } #endif #ifndef NONE_GUI static void update_pnm_setup_frame(void); static int set_pnm_setup_proc(void *data); static Widget pnm_setup_frame; static Widget pnm_setup_rawbits_item; static Widget *pnm_setup_format_item; #ifdef HAVE_LIBPNG static void update_png_setup_frame(void); static int set_png_setup_proc(void *data); static Widget png_setup_frame; static Widget png_setup_interlaced_item; static Widget png_setup_transparent_item; static SpinStructure *png_setup_compression_item; void png_gui_setup(void) { set_wait_cursor(); if (png_setup_frame == NULL) { Widget fr, rc; png_setup_frame = CreateDialogForm(app_shell, "PNG options"); fr = CreateFrame(png_setup_frame, "PNG options"); rc = CreateVContainer(fr); png_setup_interlaced_item = CreateToggleButton(rc, "Interlaced"); png_setup_transparent_item = CreateToggleButton(rc, "Transparent"); png_setup_compression_item = CreateSpinChoice(rc, "Compression:", 1, SPIN_TYPE_INT, (double) Z_NO_COMPRESSION, (double) Z_BEST_COMPRESSION, 1.0); CreateAACDialog(png_setup_frame, fr, set_png_setup_proc, NULL); } update_png_setup_frame(); RaiseWindow(GetParent(png_setup_frame)); unset_wait_cursor(); } static void update_png_setup_frame(void) { if (png_setup_frame) { SetToggleButtonState(png_setup_interlaced_item, png_setup_interlaced); SetToggleButtonState(png_setup_transparent_item, png_setup_transparent); SetSpinChoice(png_setup_compression_item, png_setup_compression); } } static int set_png_setup_proc(void *data) { png_setup_interlaced = GetToggleButtonState(png_setup_interlaced_item); png_setup_transparent = GetToggleButtonState(png_setup_transparent_item); png_setup_compression = GetSpinChoice(png_setup_compression_item); return RETURN_SUCCESS; } #endif void pnm_gui_setup(void) { set_wait_cursor(); if (pnm_setup_frame == NULL) { Widget fr, rc; pnm_setup_frame = CreateDialogForm(app_shell, "PNM options"); fr = CreateFrame(pnm_setup_frame, "PNM options"); rc = CreateVContainer(fr); pnm_setup_format_item = CreatePanelChoice(rc, "Format: ", 4, "1-bit mono (PBM)", "8-bit grayscale (PGM)", "8-bit color (PPM)", NULL); pnm_setup_rawbits_item = CreateToggleButton(rc, "\"Rawbits\""); CreateAACDialog(pnm_setup_frame, fr, set_pnm_setup_proc, NULL); } update_pnm_setup_frame(); RaiseWindow(GetParent(pnm_setup_frame)); unset_wait_cursor(); } static void update_pnm_setup_frame(void) { if (pnm_setup_frame) { SetChoice(pnm_setup_format_item, pnm_setup_format); SetToggleButtonState(pnm_setup_rawbits_item, pnm_setup_rawbits); } } static int set_pnm_setup_proc(void *data) { pnm_setup_format = GetChoice(pnm_setup_format_item); pnm_setup_rawbits = GetToggleButtonState(pnm_setup_rawbits_item); return RETURN_SUCCESS; } #ifdef HAVE_LIBJPEG static void update_jpg_setup_frame(void); static int set_jpg_setup_proc(void *data); static Widget jpg_setup_frame; static Widget jpg_setup_grayscale_item; static Widget jpg_setup_baseline_item; static Widget jpg_setup_optimize_item; static Widget jpg_setup_progressive_item; static SpinStructure *jpg_setup_quality_item; static SpinStructure *jpg_setup_smoothing_item; static Widget *jpg_setup_dct_item; void jpg_gui_setup(void) { set_wait_cursor(); if (jpg_setup_frame == NULL) { Widget jpg_setup_rc, fr, rc; jpg_setup_frame = CreateDialogForm(app_shell, "JPEG options"); jpg_setup_rc = CreateVContainer(jpg_setup_frame); fr = CreateFrame(jpg_setup_rc, "JPEG options"); rc = CreateVContainer(fr); jpg_setup_quality_item = CreateSpinChoice(rc, "Quality:", 3, SPIN_TYPE_INT, 0.0, 100.0, 5.0); jpg_setup_optimize_item = CreateToggleButton(rc, "Optimize"); jpg_setup_progressive_item = CreateToggleButton(rc, "Progressive"); jpg_setup_grayscale_item = CreateToggleButton(rc, "Grayscale"); fr = CreateFrame(jpg_setup_rc, "JPEG advanced options"); rc = CreateVContainer(fr); jpg_setup_smoothing_item = CreateSpinChoice(rc, "Smoothing:", 3, SPIN_TYPE_INT, 0.0, 100.0, 10.0); jpg_setup_baseline_item = CreateToggleButton(rc, "Force baseline"); jpg_setup_dct_item = CreatePanelChoice(rc, "DCT: ", 4, "Fast integer", "Slow integer", "Float", NULL); CreateAACDialog(jpg_setup_frame, jpg_setup_rc, set_jpg_setup_proc, NULL); } update_jpg_setup_frame(); RaiseWindow(GetParent(jpg_setup_frame)); unset_wait_cursor(); } static void update_jpg_setup_frame(void) { if (jpg_setup_frame) { SetToggleButtonState(jpg_setup_grayscale_item, jpg_setup_grayscale); SetToggleButtonState(jpg_setup_baseline_item, jpg_setup_baseline); SetToggleButtonState(jpg_setup_optimize_item, jpg_setup_optimize); SetToggleButtonState(jpg_setup_progressive_item, jpg_setup_progressive); SetSpinChoice(jpg_setup_quality_item, jpg_setup_quality); SetSpinChoice(jpg_setup_smoothing_item, jpg_setup_smoothing); SetChoice(jpg_setup_dct_item, jpg_setup_dct); } } static int set_jpg_setup_proc(void *data) { jpg_setup_grayscale = GetToggleButtonState(jpg_setup_grayscale_item); jpg_setup_baseline = GetToggleButtonState(jpg_setup_baseline_item); jpg_setup_optimize = GetToggleButtonState(jpg_setup_optimize_item); jpg_setup_progressive = GetToggleButtonState(jpg_setup_progressive_item); jpg_setup_quality = (int) GetSpinChoice(jpg_setup_quality_item); jpg_setup_smoothing = (int) GetSpinChoice(jpg_setup_smoothing_item); jpg_setup_dct = GetChoice(jpg_setup_dct_item); return RETURN_SUCCESS; } #endif #endif grace-5.1.23/examples/0000755000076500001440000000000012032153126014241 5ustar fnevgenyusersgrace-5.1.23/examples/typeset.agr0000644000076500001440000002267706626627163016472 0ustar fnevgenyusers# Grace project file # @version 50001 @page size 600 600 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 2 to "Times-Italic" , "Times-Italic" @map font 1 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 6 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 5 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 8 to "Symbol" , "Symbol" @map font 9 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Aug 28 20:10:49 1998" @with string @ string on @ string loctype view @ string 0.18, 0.68 @ string color 4 @ string rot 45 @ string font 0 @ string just 0 @ string char size 2.000000 @ string def "M\m{0}\so\N\M{0}\S+\N = \x\c\m{1}o\m{2}\M{1}\v{1}l\N\M{1}\v{-1}n\N\C\f{}4 5 6\m{3}\M{2}\N\v{1}1 2 3\N\M{2}\v{-1}7 8 9\N\x\c\M{3}o\M{3}\v{1}|\N\M{3}\v{-1}~" @with string @ string on @ string loctype view @ string 0.5, 0.23 @ string color 3 @ string rot 0 @ string font 2 @ string just 0 @ string char size 2.500000 @ string def "x\m{0}\Si\N\M{0}\sj\uk\U\N = \xD\f{}\sjl\Ny\m{1}\Sli\N\M{1}\s\uk\U" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 2 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "Tests of advanced typesetting" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "(not L\v{.25}\z{.7}A\NT\v{-.3}E\NX, but...)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.5 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 0 @ legend char size 1.000000 @ legend color 2 @ legend length 6 @ legend vgap 1 @ legend hgap 2 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 11 @ s0 symbol size 1.500000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 0 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 79 @ s0 symbol char font 9 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "X=x, Y=x*sqrt(1 + x^2)" @ s0 legend "y = x\x\cW\z{1.4}V\m{1}\z{.9}\v{.75}>>\N\C\f{}\M{1}1 + x\S2" @ s1 type xy @ s1 symbol 11 @ s1 symbol size 1.500000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 0 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 59 @ s1 symbol char font 9 @ s1 symbol center false @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "X=x, Y=1/(1 + x^4)" @ s1 legend "y = \x\c\m{0}>>>\C\f{}\M{0}\h{1.2}\v{.5}1\N\M{0}\v{-1}(1 + x\S4\N\v{-1})" @WITH G0 @G0 ON @TARGET S0 @TYPE xy 0 0 0.1 0.100499 0.2 0.203961 0.3 0.313209 0.4 0.430813 0.5 0.559017 0.6 0.699714 0.7 0.854459 0.8 1.0245 0.9 1.21083 1 1.41421 & @TARGET S1 @TYPE xy 0 1 0.1 0.9999 0.2 0.998403 0.3 0.991965 0.4 0.975039 0.5 0.941176 0.6 0.885269 0.7 0.806387 0.8 0.709421 0.9 0.603828 1 0.5 & grace-5.1.23/examples/stackedb.agr0000644000076500001440000002743407602143727016543 0ustar fnevgenyusers# Grace project file # @version 50002 @page size 792 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 1 to "Times-Italic" , "Times-Italic" @map font 2 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 5 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 6 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 8 to "Courier" , "Courier" @map font 9 to "Courier-Oblique" , "Courier-Oblique" @map font 10 to "Courier-Bold" , "Courier-Bold" @map font 11 to "Courier-BoldOblique" , "Courier-BoldOblique" @map font 12 to "Symbol" , "Symbol" @map font 13 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Mon Oct 26 00:21:07 1998" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Chart @g0 stacked true @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 26 @ world ymin 0 @ world ymax 100 @ stack world 0, 0, 0, 0 @ view xmin 0.173203 @ view xmax 1.129085 @ view ymin 0.258170 @ view ymax 0.810458 @ title "Stacked Bar Chart" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "This is a test" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 10 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op top @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 50 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.2 @ legend y1 0.211632 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type bar @ s0 symbol 0 @ s0 symbol size 1.200000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 14 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 0 @ s0 fill pattern 3 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "stackedb.d" @ s0 legend "Data A" @ s1 type bar @ s1 symbol 0 @ s1 symbol size 0.900000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol center false @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 1 @ s1 fill rule 0 @ s1 fill color 0 @ s1 fill pattern 12 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 2 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "stackedb.d" @ s1 legend "Data B" @ s2 type bar @ s2 symbol 0 @ s2 symbol size 0.700000 @ s2 symbol color 4 @ s2 symbol pattern 1 @ s2 symbol fill color 4 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 1 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 2 @ s2 symbol center false @ s2 symbol skip 0 @ s2 line type 0 @ s2 line linestyle 1 @ s2 line linewidth 1 @ s2 line color 4 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 1 @ s2 fill rule 0 @ s2 fill color 0 @ s2 fill pattern 11 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 2 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar off @ s2 errorbar type both @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1 @ s2 errorbar riser linestyle 1 @ s2 comment "stackedb.d" @ s2 legend "Data C" @target G0.S0 @type bar 1 33.946 2 25.614 3 25.0006 4 24.2704 5 15.7987 6 21.3681 7 24.8826 8 29.0979 9 23.9795 10 25.3131 11 26.3076 12 26.1749 13 29.6666 14 15.8253 15 28.4008 16 17.2521 17 19.4874 18 34.1693 19 21.4648 20 30.227 21 35.4159 22 21.9448 23 27.3906 24 24.7534 25 20.198 & @target G0.S1 @type bar 1 15.025 2 18.273 3 12.2412 4 26.7101 5 24.7056 6 29.3052 7 26.2247 8 15.207 9 22.4822 10 16.1582 11 17.1656 12 25.4875 13 25.3682 14 30.248 15 33.6494 16 16.9775 17 24.4685 18 25.6392 19 30.8699 20 24.8896 21 22.4499 22 32.8321 23 26.5939 24 21.9545 25 20.4343 & @target G0.S2 @type bar 1 24.7315 2 21.6617 3 24.3678 4 20.1053 5 28.0689 6 26.4796 7 20.5632 8 29.5739 9 26.5511 10 29.586 11 22.3493 12 24.1086 13 23.9796 14 22.7104 15 28.1255 16 24.4711 17 23.5013 18 22.0144 19 36.2019 20 21.4046 21 21.3532 22 16.324 23 27.4997 24 28.8972 25 32.0952 & grace-5.1.23/examples/co2.agr0000644000076500001440000022617006626627163015452 0ustar fnevgenyusers# xvgr parameter file # @version 20100 @with line @ line on @ line loctype view @ line 0.213033, 0.822294, 0.265664, 0.799677 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @line def @with string @ string on @ string loctype view @ string 0.595238, 0.197092 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Data" @with string @ string on @ string loctype view @ string 0.604010, 0.332795 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Regression" @with string @ string on @ string loctype view @ string 0.609023, 0.473344 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "12 Mo. running average" @with string @ string on @ string loctype view @ string 0.600251, 0.588045 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Trend removed" @with string @ string on @ string loctype view @ string 0.598997, 0.757674 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Spectrum" @with string @ string on @ string loctype view @ string 0.274436, 0.796446 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "app. 12 month" @with string @ string on @ string loctype view @ string 0.177945, 0.760905 @ string linewidth 1 @ string color 1 @ string rot 90 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "6 Mo." @with g0 @g0 ON @g0 label OFF @g0 hidden FALSE @g0 type XY @g0 autoscale type AUTO @g0 fixedpoint OFF @g0 fixedpoint xy 0.000000 , 0.000000 @g0 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1974 @ world xmax 1986 @ world ymin 320 @ world ymax 349.99 @ view xmin 0.150000 @ view xmax 0.900000 @ view ymin 0.150000 @ view ymax 0.290000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "mlo.dat" @ xaxis tick ON @ xaxis tick major 5.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "Years" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel ON @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 10.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 0 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 0 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 0 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel angle 0 @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 1 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 0 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel angle 0 @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 1 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g1 @g1 ON @g1 label OFF @g1 hidden FALSE @g1 type XY @g1 autoscale type AUTO @g1 fixedpoint OFF @g1 fixedpoint xy 0.000000 , 0.000000 @g1 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1974 @ world xmax 1986 @ world ymin 320 @ world ymax 349.99 @ view xmin 0.150000 @ view xmax 0.900000 @ view ymin 0.290000 @ view ymax 0.430000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "" @ xaxis tick ON @ xaxis tick major 5.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel OFF @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 10.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 0 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 0 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 0 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel angle 0 @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 1 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 0 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel angle 0 @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 1 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g2 @g2 ON @g2 label OFF @g2 hidden FALSE @g2 type XY @g2 autoscale type AUTO @g2 fixedpoint OFF @g2 fixedpoint xy 0.000000 , 0.000000 @g2 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1974 @ world xmax 1986 @ world ymin 320 @ world ymax 349.99 @ view xmin 0.150000 @ view xmax 0.900000 @ view ymin 0.430000 @ view ymax 0.570000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "" @ xaxis tick ON @ xaxis tick major 5.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "Years" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel OFF @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 10.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "CO\s2\N (ppm)" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 0 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 0 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 0 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel angle 0 @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 1 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 0 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel angle 0 @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 1 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g3 @g3 ON @g3 label OFF @g3 hidden FALSE @g3 type XY @g3 autoscale type AUTO @g3 fixedpoint OFF @g3 fixedpoint xy 0.000000 , 0.000000 @g3 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1974 @ world xmax 1986 @ world ymin -6 @ world ymax 3.999 @ view xmin 0.150000 @ view xmax 0.900000 @ view ymin 0.570000 @ view ymax 0.710000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "" @ xaxis tick ON @ xaxis tick major 5.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel OFF @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 2.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 0 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 0 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 0 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel angle 0 @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 1 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 2.000000 @ zeroyaxis tick minor 1.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 0 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel angle 0 @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 1 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g4 @g4 ON @g4 label OFF @g4 hidden FALSE @g4 type XY @g4 autoscale type AUTO @g4 fixedpoint OFF @g4 fixedpoint xy 0.000000 , 0.000000 @g4 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 0 @ world xmax 150 @ world ymin 0 @ world ymax 3 @ view xmin 0.150000 @ view xmax 0.900000 @ view ymin 0.710000 @ view ymax 0.850000 @ title "Sample analyses of CO\s2\N at MLO" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "" @ xaxis tick ON @ xaxis tick major 50.000000 @ xaxis tick minor 25.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel OFF @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 1.000000 @ yaxis tick minor 0.500000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 0 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 0 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 50.000000 @ zeroxaxis tick minor 25.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 0 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel angle 0 @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 1 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 1.000000 @ zeroyaxis tick minor 0.500000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 0 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel angle 0 @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 1 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @WITH G0 @G0 ON 1974.330000 333.100000 1974.420000 332.100000 1974.500000 331.100000 1974.580000 329.100000 1974.670000 327.400000 1974.750000 327.300000 1974.830000 328.200000 1974.920000 329.600000 1975.000000 330.600000 1975.080000 331.400000 1975.170000 331.900000 1975.250000 333.200000 1975.330000 333.900000 1975.420000 333.400000 1975.500000 331.900000 1975.580000 330.000000 1975.670000 328.500000 1975.750000 328.400000 1975.830000 329.300000 1975.920000 331.000000 1976.000000 331.600000 1976.080000 332.600000 1976.170000 333.600000 1976.250000 334.700000 1976.330000 334.700000 1976.420000 334.200000 1976.500000 333.000000 1976.580000 330.800000 1976.670000 329.000000 1976.750000 328.600000 1976.830000 330.200000 1976.920000 331.600000 1977.000000 332.700000 1977.080000 333.200000 1977.170000 334.900000 1977.250000 336.100000 1977.330000 336.800000 1977.420000 336.100000 1977.500000 334.800000 1977.580000 332.600000 1977.670000 331.300000 1977.750000 331.200000 1977.830000 332.400000 1977.920000 333.500000 1978.000000 334.700000 1978.080000 335.200000 1978.170000 336.500000 1978.250000 337.800000 1978.330000 338.000000 1978.420000 338.000000 1978.500000 336.400000 1978.580000 334.500000 1978.670000 332.500000 1978.750000 332.300000 1978.830000 333.800000 1978.920000 334.800000 1979.000000 336.000000 1979.080000 336.600000 1979.170000 337.900000 1979.250000 339.000000 1979.330000 339.100000 1979.420000 339.300000 1979.500000 337.600000 1979.580000 335.700000 1979.670000 333.800000 1979.750000 334.100000 1979.830000 335.300000 1979.920000 336.800000 1980.000000 337.800000 1980.080000 338.300000 1980.170000 340.100000 1980.250000 340.900000 1980.330000 341.500000 1980.420000 341.300000 1980.500000 339.400000 1980.580000 337.700000 1980.670000 336.100000 1980.750000 336.100000 1980.830000 337.200000 1980.920000 338.400000 1981.000000 339.300000 1981.080000 340.400000 1981.170000 341.700000 1981.250000 342.500000 1981.330000 343.000000 1981.420000 342.500000 1981.500000 340.900000 1981.580000 338.800000 1981.670000 337.100000 1981.750000 337.100000 1981.830000 338.500000 1981.920000 339.900000 1982.000000 340.900000 1982.080000 341.700000 1982.170000 342.700000 1982.250000 343.700000 1982.330000 344.300000 1982.420000 343.400000 1982.500000 342.000000 1982.580000 340.000000 1982.670000 337.800000 1982.750000 338.000000 1982.830000 339.200000 1982.920000 340.600000 1983.000000 341.400000 1983.080000 342.700000 1983.170000 343.000000 1983.250000 345.300000 1983.330000 345.900000 1983.420000 345.400000 1983.500000 344.200000 1983.580000 342.100000 1983.670000 340.100000 1983.750000 340.200000 1983.830000 341.400000 1983.920000 343.000000 1984.000000 343.600000 1984.080000 344.500000 1984.170000 345.100000 1984.250000 346.000000 1984.330000 347.300000 1984.420000 346.600000 1984.500000 345.000000 1984.580000 342.000000 1984.670000 340.900000 1984.750000 341.100000 1984.830000 342.800000 1984.920000 344.300000 1985.000000 344.900000 1985.080000 345.600000 1985.170000 347.200000 1985.250000 347.600000 1985.330000 348.500000 1985.420000 347.900000 1985.500000 346.000000 1985.580000 343.900000 1985.670000 342.600000 1985.750000 342.600000 1985.830000 344.100000 1985.920000 345.500000 & @WITH G1 @G1 ON 1974.330000 329.484963 1974.420000 329.614811 1974.500000 329.730231 1974.580000 329.845651 1974.670000 329.975499 1974.750000 330.090919 1974.830000 330.206339 1974.920000 330.336187 1975.000000 330.451607 1975.080000 330.567027 1975.170000 330.696875 1975.250000 330.812295 1975.330000 330.927716 1975.420000 331.057563 1975.500000 331.172983 1975.580000 331.288404 1975.670000 331.418251 1975.750000 331.533672 1975.830000 331.649092 1975.920000 331.778940 1976.000000 331.894360 1976.080000 332.009780 1976.170000 332.139628 1976.250000 332.255048 1976.330000 332.370468 1976.420000 332.500316 1976.500000 332.615736 1976.580000 332.731156 1976.670000 332.861004 1976.750000 332.976424 1976.830000 333.091844 1976.920000 333.221692 1977.000000 333.337112 1977.080000 333.452533 1977.170000 333.582380 1977.250000 333.697801 1977.330000 333.813221 1977.420000 333.943068 1977.500000 334.058489 1977.580000 334.173909 1977.670000 334.303757 1977.750000 334.419177 1977.830000 334.534597 1977.920000 334.664445 1978.000000 334.779865 1978.080000 334.895285 1978.170000 335.025133 1978.250000 335.140553 1978.330000 335.255973 1978.420000 335.385821 1978.500000 335.501241 1978.580000 335.616662 1978.670000 335.746509 1978.750000 335.861929 1978.830000 335.977350 1978.920000 336.107197 1979.000000 336.222618 1979.080000 336.338038 1979.170000 336.467886 1979.250000 336.583306 1979.330000 336.698726 1979.420000 336.828574 1979.500000 336.943994 1979.580000 337.059414 1979.670000 337.189262 1979.750000 337.304682 1979.830000 337.420102 1979.920000 337.549950 1980.000000 337.665370 1980.080000 337.780790 1980.170000 337.910638 1980.250000 338.026058 1980.330000 338.141479 1980.420000 338.271326 1980.500000 338.386747 1980.580000 338.502167 1980.670000 338.632014 1980.750000 338.747435 1980.830000 338.862855 1980.920000 338.992703 1981.000000 339.108123 1981.080000 339.223543 1981.170000 339.353391 1981.250000 339.468811 1981.330000 339.584231 1981.420000 339.714079 1981.500000 339.829499 1981.580000 339.944919 1981.670000 340.074767 1981.750000 340.190187 1981.830000 340.305607 1981.920000 340.435455 1982.000000 340.550875 1982.080000 340.666296 1982.170000 340.796143 1982.250000 340.911564 1982.330000 341.026984 1982.420000 341.156832 1982.500000 341.272252 1982.580000 341.387672 1982.670000 341.517520 1982.750000 341.632940 1982.830000 341.748360 1982.920000 341.878208 1983.000000 341.993628 1983.080000 342.109048 1983.170000 342.238896 1983.250000 342.354316 1983.330000 342.469736 1983.420000 342.599584 1983.500000 342.715004 1983.580000 342.830425 1983.670000 342.960272 1983.750000 343.075693 1983.830000 343.191113 1983.920000 343.320960 1984.000000 343.436381 1984.080000 343.551801 1984.170000 343.681649 1984.250000 343.797069 1984.330000 343.912489 1984.420000 344.042337 1984.500000 344.157757 1984.580000 344.273177 1984.670000 344.403025 1984.750000 344.518445 1984.830000 344.633865 1984.920000 344.763713 1985.000000 344.879133 1985.080000 344.994553 1985.170000 345.124401 1985.250000 345.239821 1985.330000 345.355242 1985.420000 345.485089 1985.500000 345.600510 1985.580000 345.715930 1985.670000 345.845778 1985.750000 345.961198 1985.830000 346.076618 1985.920000 346.206466 & @WITH G2 @G2 ON 1974.791667 330.416667 1974.875000 330.483333 1974.958333 330.591667 1975.041667 330.658333 1975.125000 330.733333 1975.208333 330.825000 1975.291667 330.916667 1975.375000 331.008333 1975.458333 331.125000 1975.541667 331.208333 1975.625000 331.308333 1975.708333 331.450000 1975.791667 331.575000 1975.875000 331.641667 1975.958333 331.708333 1976.041667 331.800000 1976.125000 331.866667 1976.208333 331.908333 1976.291667 331.925000 1976.375000 332.000000 1976.458333 332.050000 1976.541667 332.141667 1976.625000 332.191667 1976.708333 332.300000 1976.791667 332.416667 1976.875000 332.591667 1976.958333 332.750000 1977.041667 332.900000 1977.125000 333.050000 1977.208333 333.241667 1977.291667 333.458333 1977.375000 333.641667 1977.458333 333.800000 1977.541667 333.966667 1977.625000 334.133333 1977.708333 334.266667 1977.791667 334.408333 1977.875000 334.508333 1977.958333 334.666667 1978.041667 334.800000 1978.125000 334.958333 1978.208333 335.058333 1978.291667 335.150000 1978.375000 335.266667 1978.458333 335.375000 1978.541667 335.483333 1978.625000 335.600000 1978.708333 335.716667 1978.791667 335.816667 1978.875000 335.908333 1978.958333 336.016667 1979.041667 336.116667 1979.125000 336.216667 1979.208333 336.325000 1979.291667 336.475000 1979.375000 336.600000 1979.458333 336.766667 1979.541667 336.916667 1979.625000 337.058333 1979.708333 337.241667 1979.791667 337.400000 1979.875000 337.600000 1979.958333 337.766667 1980.041667 337.916667 1980.125000 338.083333 1980.208333 338.275000 1980.291667 338.441667 1980.375000 338.600000 1980.458333 338.733333 1980.541667 338.858333 1980.625000 339.033333 1980.708333 339.166667 1980.791667 339.300000 1980.875000 339.425000 1980.958333 339.525000 1981.041667 339.650000 1981.125000 339.741667 1981.208333 339.825000 1981.291667 339.908333 1981.375000 340.016667 1981.458333 340.141667 1981.541667 340.275000 1981.625000 340.383333 1981.708333 340.466667 1981.791667 340.566667 1981.875000 340.675000 1981.958333 340.750000 1982.041667 340.841667 1982.125000 340.941667 1982.208333 341.000000 1982.291667 341.075000 1982.375000 341.133333 1982.458333 341.191667 1982.541667 341.233333 1982.625000 341.316667 1982.708333 341.341667 1982.791667 341.475000 1982.875000 341.608333 1982.958333 341.775000 1983.041667 341.958333 1983.125000 342.133333 1983.208333 342.325000 1983.291667 342.508333 1983.375000 342.691667 1983.458333 342.891667 1983.541667 343.075000 1983.625000 343.225000 1983.708333 343.400000 1983.791667 343.458333 1983.875000 343.575000 1983.958333 343.675000 1984.041667 343.741667 1984.125000 343.733333 1984.208333 343.800000 1984.291667 343.875000 1984.375000 343.991667 1984.458333 344.100000 1984.541667 344.208333 1984.625000 344.300000 1984.708333 344.475000 1984.791667 344.608333 1984.875000 344.708333 1984.958333 344.816667 1985.041667 344.900000 1985.125000 345.058333 1985.208333 345.200000 1985.291667 345.325000 1985.375000 345.433333 1985.458333 345.533333 & @WITH G3 @G3 ON 1974.330000 3.615037 1974.420000 2.485189 1974.500000 1.369769 1974.580000 -0.745651 1974.670000 -2.575499 1974.750000 -2.790919 1974.830000 -2.006339 1974.920000 -0.736187 1975.000000 0.148393 1975.080000 0.832973 1975.170000 1.203125 1975.250000 2.387705 1975.330000 2.972284 1975.420000 2.342437 1975.500000 0.727017 1975.580000 -1.288404 1975.670000 -2.918251 1975.750000 -3.133672 1975.830000 -2.349092 1975.920000 -0.778940 1976.000000 -0.294360 1976.080000 0.590220 1976.170000 1.460372 1976.250000 2.444952 1976.330000 2.329532 1976.420000 1.699684 1976.500000 0.384264 1976.580000 -1.931156 1976.670000 -3.861004 1976.750000 -4.376424 1976.830000 -2.891844 1976.920000 -1.621692 1977.000000 -0.637112 1977.080000 -0.252533 1977.170000 1.317620 1977.250000 2.402199 1977.330000 2.986779 1977.420000 2.156932 1977.500000 0.741511 1977.580000 -1.573909 1977.670000 -3.003757 1977.750000 -3.219177 1977.830000 -2.134597 1977.920000 -1.164445 1978.000000 -0.079865 1978.080000 0.304715 1978.170000 1.474867 1978.250000 2.659447 1978.330000 2.744027 1978.420000 2.614179 1978.500000 0.898759 1978.580000 -1.116662 1978.670000 -3.246509 1978.750000 -3.561929 1978.830000 -2.177350 1978.920000 -1.307197 1979.000000 -0.222618 1979.080000 0.261962 1979.170000 1.432114 1979.250000 2.416694 1979.330000 2.401274 1979.420000 2.471426 1979.500000 0.656006 1979.580000 -1.359414 1979.670000 -3.389262 1979.750000 -3.204682 1979.830000 -2.120102 1979.920000 -0.749950 1980.000000 0.134630 1980.080000 0.519210 1980.170000 2.189362 1980.250000 2.873942 1980.330000 3.358521 1980.420000 3.028674 1980.500000 1.013253 1980.580000 -0.802167 1980.670000 -2.532014 1980.750000 -2.647435 1980.830000 -1.662855 1980.920000 -0.592703 1981.000000 0.191877 1981.080000 1.176457 1981.170000 2.346609 1981.250000 3.031189 1981.330000 3.415769 1981.420000 2.785921 1981.500000 1.070501 1981.580000 -1.144919 1981.670000 -2.974767 1981.750000 -3.090187 1981.830000 -1.805607 1981.920000 -0.535455 1982.000000 0.349125 1982.080000 1.033704 1982.170000 1.903857 1982.250000 2.788436 1982.330000 3.273016 1982.420000 2.243168 1982.500000 0.727748 1982.580000 -1.387672 1982.670000 -3.717520 1982.750000 -3.632940 1982.830000 -2.548360 1982.920000 -1.278208 1983.000000 -0.593628 1983.080000 0.590952 1983.170000 0.761104 1983.250000 2.945684 1983.330000 3.430264 1983.420000 2.800416 1983.500000 1.484996 1983.580000 -0.730425 1983.670000 -2.860272 1983.750000 -2.875693 1983.830000 -1.791113 1983.920000 -0.320960 1984.000000 0.163619 1984.080000 0.948199 1984.170000 1.418351 1984.250000 2.202931 1984.330000 3.387511 1984.420000 2.557663 1984.500000 0.842243 1984.580000 -2.273177 1984.670000 -3.503025 1984.750000 -3.418445 1984.830000 -1.833865 1984.920000 -0.463713 1985.000000 0.020867 1985.080000 0.605447 1985.170000 2.075599 1985.250000 2.360179 1985.330000 3.144758 1985.420000 2.414911 1985.500000 0.399490 1985.580000 -1.815930 1985.670000 -3.245778 1985.750000 -3.361198 1985.830000 -1.976618 1985.920000 -0.706466 & @WITH G4 @G4 ON 141.000000 0.000000 140.000000 0.256379 70.000000 0.124005 46.666667 0.056247 35.000000 0.224726 28.000000 0.091017 23.333333 0.147818 20.000000 0.191401 17.500000 0.167291 15.555556 0.182486 14.000000 0.436466 12.727273 1.131136 11.666667 2.459876 10.769231 0.626766 10.000000 0.387681 9.333333 0.253768 8.750000 0.174489 8.235294 0.205603 7.777778 0.160791 7.368421 0.151346 7.000000 0.187679 6.666667 0.188149 6.363636 0.264795 6.086957 0.693243 5.833333 0.275780 5.600000 0.125046 5.384615 0.098019 5.185185 0.043767 5.000000 0.093435 4.827586 0.032283 4.666667 0.015058 4.516129 0.065529 4.375000 0.020564 4.242424 0.038040 4.117647 0.046536 4.000000 0.095264 3.888889 0.076340 3.783784 0.070009 3.684211 0.055320 3.589744 0.035708 3.500000 0.010167 3.414634 0.024468 3.333333 0.033705 3.255814 0.046586 3.181818 0.069643 3.111111 0.028676 3.043478 0.016229 2.978723 0.029572 2.916667 0.068026 2.857143 0.018916 2.800000 0.051218 2.745098 0.041471 2.692308 0.056896 2.641509 0.020496 2.592593 0.057521 2.545455 0.057309 2.500000 0.049409 2.456140 0.065583 2.413793 0.036089 2.372881 0.029567 2.333333 0.094715 2.295082 0.019895 2.258065 0.046396 2.222222 0.032832 2.187500 0.038346 2.153846 0.037875 2.121212 0.031139 2.089552 0.090630 2.058824 0.045286 2.028986 0.050636 2.000000 0.028938 1.971831 0.050636 1.944444 0.045286 1.917808 0.090630 1.891892 0.031139 1.866667 0.037875 1.842105 0.038346 1.818182 0.032832 1.794872 0.046396 1.772152 0.019895 1.750000 0.094715 1.728395 0.029567 1.707317 0.036089 1.686747 0.065583 1.666667 0.049409 1.647059 0.057309 1.627907 0.057521 1.609195 0.020496 1.590909 0.056896 1.573034 0.041471 1.555556 0.051218 1.538462 0.018916 1.521739 0.068026 1.505376 0.029572 1.489362 0.016229 1.473684 0.028676 1.458333 0.069643 1.443299 0.046586 1.428571 0.033705 1.414141 0.024468 1.400000 0.010167 1.386139 0.035708 1.372549 0.055320 1.359223 0.070009 1.346154 0.076340 1.333333 0.095264 1.320755 0.046536 1.308411 0.038040 1.296296 0.020564 1.284404 0.065529 1.272727 0.015058 1.261261 0.032283 1.250000 0.093435 1.238938 0.043767 1.228070 0.098019 1.217391 0.125046 1.206897 0.275780 1.196581 0.693243 1.186441 0.264795 1.176471 0.188149 1.166667 0.187679 1.157025 0.151346 1.147541 0.160791 1.138211 0.205603 1.129032 0.174489 1.120000 0.253768 1.111111 0.387681 1.102362 0.626766 1.093750 2.459876 1.085271 1.131136 1.076923 0.436466 1.068702 0.182486 1.060606 0.167291 1.052632 0.191401 1.044776 0.147818 1.037037 0.091017 1.029412 0.224726 1.021898 0.056247 1.014493 0.124005 1.007194 0.256379 & grace-5.1.23/examples/axes.agr0000644000076500001440000002774407430037203015715 0ustar fnevgenyusers# Grace project file # @version 50000 @page size 600 600 @page scroll 5% @page inout 5% @link page off @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 4 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Thu Sep 10 03:12:14 1998" @with line @ line on @ line loctype view @ line 0.6, 0.51, 0.75, 0.26 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.66792, 0.155089, 0.716792, 0.108239 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.152882, 0.714055, 0.053885, 0.852989 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.320802, 0.907916, 0.367168, 0.849758 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.462406, 0.634895, 0.258145, 0.765751 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.339599, 0.35, 0.107769, 0.187399 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.66, 0.71, 0.713033, 0.84168 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with string @ string on @ string loctype view @ string 0.750627, 0.253635 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Zero X-axis" @with string @ string on @ string loctype view @ string 0.733083, 0.105008 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "X-axis" @with string @ string on @ string loctype view @ string 0.254386, 0.781906 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Zero Y-axis" @with string @ string on @ string loctype view @ string 0.032581, 0.878837 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Y-axis" @with string @ string on @ string loctype view @ string 0.042607, 0.150242 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Graph frame" @with string @ string on @ string loctype view @ string 0.719298, 0.843296 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Graph focus markers" @with string @ string on @ string loctype view @ string 0.230576, 0.919225 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Axis bar" @with string @ string on @ string loctype view @ string 0.431078, 0.936995 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "A brief tour of axes properties" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin -1 @ world xmax 1 @ world ymin -1 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.650000 @ view ymin 0.350000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.150000 , 0.150000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "Axis label" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 4 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.150000 , 0.150000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Axis label" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 4 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis on @ altxaxis type zero true @ altxaxis offset 0.000000 , 0.000000 @ altxaxis bar on @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label place auto @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label op bottom @ altxaxis tick on @ altxaxis tick major 0.5 @ altxaxis tick minor ticks 4 @ altxaxis tick default 6 @ altxaxis tick place rounded true @ altxaxis tick in @ altxaxis tick major size 1.000000 @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick major grid off @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick minor grid off @ altxaxis tick minor size 0.500000 @ altxaxis ticklabel on @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel append "" @ altxaxis ticklabel prepend "" @ altxaxis ticklabel angle 0 @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel offset auto @ altxaxis ticklabel offset 0.000000 , 0.010000 @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis tick op both @ altxaxis ticklabel type auto @ altxaxis tick type auto @ altyaxis on @ altyaxis type zero true @ altyaxis offset 0.000000 , 0.000000 @ altyaxis bar on @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label place auto @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label op left @ altyaxis tick on @ altyaxis tick major 0.5 @ altyaxis tick minor ticks 4 @ altyaxis tick default 6 @ altyaxis tick place rounded true @ altyaxis tick in @ altyaxis tick major size 1.000000 @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick major grid off @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick minor grid off @ altyaxis tick minor size 0.500000 @ altyaxis ticklabel on @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel append "" @ altyaxis ticklabel prepend "" @ altyaxis ticklabel angle 0 @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel offset auto @ altyaxis ticklabel offset 0.000000 , 0.010000 @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis tick op both @ altyaxis ticklabel type auto @ altyaxis tick type auto @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @WITH G0 @G0 ON grace-5.1.23/examples/tforms.par0000644000076500001440000013274306626627163016314 0ustar fnevgenyusers# xvgr parameter file # with string string on string loctype view string 0.649123, 0.621971 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Ticks drawn on both" with string string on string loctype view string 0.649123, 0.589661 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "sides, Y-axis tick labels" with string string on string loctype view string 0.649123, 0.557351 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "are vertical" with string string on string loctype view string 0.650376, 0.247173 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Y-axis labels are absolute" with string string on string loctype view string 0.650376, 0.214863 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "value, X-axis labels are" with string string on string loctype view string 0.650376, 0.182553 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "negated." with string string on string loctype view string 0.258145, 0.869144 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Various tick label formats and properties" with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type XY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 0 world xmax 10 world ymin 0 world ymax 10 view xmin 0.100000 view xmax 0.450000 view ymin 0.100000 view ymax 0.300000 title "" title font 4 title size 1.500000 title color 1 subtitle "Tick label format exponential, stagger = 1" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 2.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format EXPONENTIAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel stagger 1 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 4 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 2.000000 yaxis tick minor 1.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel stagger 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 4 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick OFF altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel stagger 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 4 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick OFF altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel stagger 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 4 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick OFF zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel stagger 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 4 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick OFF zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel stagger 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 4 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g1 g1 ON g1 label OFF g1 hidden FALSE g1 type XY g1 autoscale type AUTO g1 fixedpoint OFF g1 fixedpoint xy 0.000000 , 0.000000 g1 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 0 world xmax 10 world ymin 0 world ymax 10 view xmin 0.100000 view xmax 0.450000 view ymin 0.500000 view ymax 0.700000 title "" title font 4 title size 1.500000 title color 1 subtitle "Tick labels at an angle" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 2.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout spec xaxis ticklabel angle 46 xaxis ticklabel skip 0 xaxis ticklabel stagger 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 4 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 2.000000 yaxis tick minor 1.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout spec yaxis ticklabel angle 43 yaxis ticklabel skip 0 yaxis ticklabel stagger 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 4 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick OFF altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel stagger 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 4 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick OFF altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel stagger 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 4 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick OFF zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel stagger 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 4 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick OFF zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel stagger 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 4 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g2 g2 ON g2 label OFF g2 hidden FALSE g2 type XY g2 autoscale type AUTO g2 fixedpoint OFF g2 fixedpoint xy 0.000000 , 0.000000 g2 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin -10 world xmax 10 world ymin -10 world ymax 10 view xmin 0.610000 view xmax 0.960000 view ymin 0.100000 view ymax 0.300000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 5.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel stagger 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NEGATE xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 4 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 5.000000 yaxis tick minor 1.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel stagger 0 yaxis ticklabel op LEFT yaxis ticklabel sign ABSOLUTE yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 4 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick OFF altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel stagger 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 4 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick OFF altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel stagger 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 4 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick OFF zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel stagger 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 4 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick OFF zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel stagger 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 4 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g3 g3 ON g3 label OFF g3 hidden FALSE g3 type XY g3 autoscale type AUTO g3 fixedpoint OFF g3 fixedpoint xy 0.000000 , 0.000000 g3 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 0 world xmax 10 world ymin 0 world ymax 10 view xmin 0.610000 view xmax 0.960000 view ymin 0.500000 view ymax 0.700000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 2.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel stagger 0 xaxis ticklabel op BOTH xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 4 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 2.000000 yaxis tick minor 1.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 0 yaxis ticklabel format DECIMAL yaxis ticklabel layout vertical yaxis ticklabel skip 0 yaxis ticklabel stagger 0 yaxis ticklabel op BOTH yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 4 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick OFF altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel stagger 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 4 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick OFF altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel stagger 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 4 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick OFF zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel stagger 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 4 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick OFF zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel stagger 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 4 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/tstack.agr0000644000076500001440000004736107156546310016254 0ustar fnevgenyusers# Grace project file # @version 50101 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1900 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Sep 10 02:25:42 2000" @with line @ line on @ line loctype view @ line 0.01, 0.54, 0.25, 0.75 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow type 1 @ line arrow length 2.000000 @ line arrow layout 0.800000, 0.400000 @line def @with string @ string on @ string loctype view @ string 0.115, 0.075 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\f{ZapfDingbats}\R{orange}*\R{}\f{} In this example, the stack depth is 4, indicating 4 different settings for the axis scaling.\n Use the \R{red}Cy\R{} button to cycle through them." @with string @ string on @ string loctype view @ string 0.277851476614, 0.764365826258 @ string color 1 @ string rot 0 @ string font 4 @ string just 2 @ string char size 1.000000 @ string def "\uUse these buttons for stack manipulations\U" @with string @ string on @ string loctype view @ string 0.6, 0.935 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\R{red}Pu\R{} = \R{red}Pu\R{}sh the current world" @with string @ string on @ string loctype view @ string 0.6, 0.895 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\R{red}PZ\R{} = \R{red}P\R{}ush the current world and pick a \R{red}z\R{}oom area" @with string @ string on @ string loctype view @ string 0.6, 0.855 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\R{red}Po\R{} = \R{red}Po\R{}p the top of the stack and make the new\n\h{2.45}stack top the current setting" @with string @ string on @ string loctype view @ string 0.6, 0.785 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\R{red}Cy\R{} = \R{red}Cy\R{}cle through the world stack" @with string @ string on @ string loctype view @ string 0.4, 0.67 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "The \R{red}SD\R{}: item indicates the current \R{red}s\R{}tack \R{red}d\R{}epth" @with string @ string on @ string loctype view @ string 0.4, 0.63 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "The \R{red}CW\R{}: item indicates the stack entry with the \R{red}c\R{}urrent \R{red}w\R{}orld settings" @with string @ string on @ string loctype view @ string 0.05, 0.93 @ string color 4 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.200000 @ string def "Each graph allows up to\n20 different world and\ntick settings to be pushed\nonto the world stack." @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 1970 @ world xmax 1990 @ world ymin 320 @ world ymax 350 @ stack world 1970, 1990, 320, 350 @ stack world 1972, 1980, 325, 340 @ stack world 1973, 1977, 326, 336 @ stack world 1974, 1975.5, 326, 334 @ znorm 1 @ view xmin 0.227039 @ view xmax 1.063836 @ view ymin 0.155089 @ view ymax 0.576737 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format decimal @ xaxis ticklabel prec 1 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format decimal @ yaxis ticklabel prec 1 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend 1.03529411765, 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 2 @ s0 symbol pattern 1 @ s0 symbol fill color 2 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 3 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 7 @ s0 fill pattern 6 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 2 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "Editor" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 3 @ s1 line linewidth 1.0 @ s1 line color 4 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 1 @ s1 fill rule 0 @ s1 fill color 14 @ s1 fill pattern 6 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 2 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "copy of set G0.S1" @ s1 legend "" @ s2 hidden false @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 2 @ s2 symbol pattern 1 @ s2 symbol fill color 2 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 2 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 3 @ s2 line linewidth 1.0 @ s2 line color 15 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 1 @ s2 fill rule 0 @ s2 fill color 3 @ s2 fill pattern 6 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 2 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 2 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "copy of set G0.S2" @ s2 legend "" @ s3 hidden false @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol color 1 @ s3 symbol pattern 1 @ s3 symbol fill color 1 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 0 @ s3 symbol char font 2 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 2.0 @ s3 line color 2 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 0 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 2 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 1 @ s3 errorbar pattern 1 @ s3 errorbar size 2.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "tstack.dat" @ s3 legend "" @target G0.S0 @type xy 1972 325 1972 340 1980 340 1980 325 1972 325 & @target G0.S1 @type xy 1973 326 1973 336 1977 336 1977 326 1973 326 & @target G0.S2 @type xy 1974 326 1974 334 1975.5 334 1975.5 326 1973 326 & @target G0.S3 @type xy 1974.33 333.1 1974.42 332.1 1974.5 331.1 1974.58 329.1 1974.67 327.4 1974.75 327.3 1974.83 328.2 1974.92 329.6 1975 330.6 1975.08 331.4 1975.17 331.9 1975.25 333.2 1975.33 333.9 1975.42 333.4 1975.5 331.9 1975.58 330 1975.67 328.5 1975.75 328.4 1975.83 329.3 1975.92 331 1976 331.6 1976.08 332.6 1976.17 333.6 1976.25 334.7 1976.33 334.7 1976.42 334.2 1976.5 333 1976.58 330.8 1976.67 329 1976.75 328.6 1976.83 330.2 1976.92 331.6 1977 332.7 1977.08 333.2 1977.17 334.9 1977.25 336.1 1977.33 336.8 1977.42 336.1 1977.5 334.8 1977.58 332.6 1977.67 331.3 1977.75 331.2 1977.83 332.4 1977.92 333.5 1978 334.7 1978.08 335.2 1978.17 336.5 1978.25 337.8 1978.33 338 1978.42 338 1978.5 336.4 1978.58 334.5 1978.67 332.5 1978.75 332.3 1978.83 333.8 1978.92 334.8 1979 336 1979.08 336.6 1979.17 337.9 1979.25 339 1979.33 339.1 1979.42 339.3 1979.5 337.6 1979.58 335.7 1979.67 333.8 1979.75 334.1 1979.83 335.3 1979.92 336.8 1980 337.8 1980.08 338.3 1980.17 340.1 1980.25 340.9 1980.33 341.5 1980.42 341.3 1980.5 339.4 1980.58 337.7 1980.67 336.1 1980.75 336.1 1980.83 337.2 1980.92 338.4 1981 339.3 1981.08 340.4 1981.17 341.7 1981.25 342.5 1981.33 343 1981.42 342.5 1981.5 340.9 1981.58 338.8 1981.67 337.1 1981.75 337.1 1981.83 338.5 1981.92 339.9 1982 340.9 1982.08 341.7 1982.17 342.7 1982.25 343.7 1982.33 344.3 1982.42 343.4 1982.5 342 1982.58 340 1982.67 337.8 1982.75 338 1982.83 339.2 1982.92 340.6 1983 341.4 1983.08 342.7 1983.17 343 1983.25 345.3 1983.33 345.9 1983.42 345.4 1983.5 344.2 1983.58 342.1 1983.67 340.1 1983.75 340.2 1983.83 341.4 1983.92 343 1984 343.6 1984.08 344.5 1984.17 345.1 1984.25 346 1984.33 347.3 1984.42 346.6 1984.5 345 1984.58 342 1984.67 340.9 1984.75 341.1 1984.83 342.8 1984.92 344.3 1985 344.9 1985.08 345.6 1985.17 347.2 1985.25 347.6 1985.33 348.5 1985.42 347.9 1985.5 346 1985.58 343.9 1985.67 342.6 1985.75 342.6 1985.83 344.1 1985.92 345.5 & grace-5.1.23/examples/chartebar.agr0000644000076500001440000006571607052641442016717 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @description "This sample was prepared by Keith Stribley." @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Wed Feb 16 01:20:43 2000" @with string @ string on @ string loctype view @ string 0.50816993464, 0.820261437909 @ string color 1 @ string rot 0 @ string font 0 @ string just 12 @ string char size 1.490000 @ string def "55C" @with string @ string on @ string loctype view @ string 0.509803921569, 0.568627450981 @ string color 1 @ string rot 0 @ string font 0 @ string just 12 @ string char size 1.490000 @ string def "25CI" @with string @ string on @ string loctype view @ string 0.511437908497, 0.315359477124 @ string color 1 @ string rot 0 @ string font 0 @ string just 12 @ string char size 1.490000 @ string def "25CII" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Chart @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 86 @ world xmax 97 @ world ymin 0 @ world ymax 60 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 1.000000 @ view ymin 0.100000 @ view ymax 0.350000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "Year" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick off @ xaxis tick major 1 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type spec @ xaxis ticklabel start 87.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 96.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type spec @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 50.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type bardy @ s0 symbol 0 @ s0 symbol size 1.490000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 0.480000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "/home/keith/data/ghs/beech/xmgrace/sd25c212.txt" @ s0 legend "" @ s1 hidden false @ s1 type bardy @ s1 symbol 0 @ s1 symbol size 1.490000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 7 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 0.480000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "/home/keith/data/ghs/beech/xmgrace/sd25c212.txt" @ s1 legend "" @g1 on @g1 hidden false @g1 type Chart @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 86 @ world xmax 97 @ world ymin 0 @ world ymax 60 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 1.000000 @ view ymin 0.350000 @ view ymax 0.600000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick off @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel off @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 50.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "Growth (cm)" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 50.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.5 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type bardy @ s0 symbol 0 @ s0 symbol size 1.490000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 2 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 2 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 0.480000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "/home/keith/data/ghs/beech/xmgrace/sd25ci12.txt" @ s0 legend "" @ s1 hidden false @ s1 type bardy @ s1 symbol 0 @ s1 symbol size 1.490000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 7 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 0.480000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "/home/keith/data/ghs/beech/xmgrace/sd25ci12.txt" @ s1 legend "" @g2 on @g2 hidden false @g2 type Chart @g2 stacked false @g2 bar hgap 0.000000 @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format general general @g2 fixedpoint prec 6, 6 @with g2 @ world xmin 86 @ world xmax 97 @ world ymin 0 @ world ymax 60 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 1.000000 @ view ymin 0.600000 @ view ymax 0.850000 @ title "Mean yearly growth of beech tree shoots" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "(sets of the \f{Courier-Bold}BarDY\f{} type)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick off @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel off @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 50.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.34 @ legend y1 0.79 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 0.790000 @ legend color 1 @ legend length 0 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type bardy @ s0 symbol 2 @ s0 symbol size 1.490000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 0.480000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "/home/keith/data/ghs/beech/xmgrace/sd55c12.txt" @ s0 legend "Primary shoots" @ s1 hidden false @ s1 type bardy @ s1 symbol 2 @ s1 symbol size 1.490000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 7 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 1 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 0.480000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "/home/keith/data/ghs/beech/xmgrace/sd55c12.txt" @ s1 legend "Secondary shoots" @target G0.S0 @type bardy 87 37.04 6.5337906 88 43.68 5.1519006 89 42.85 2.0124612 90 44.7 2.4060091 91 44.61 5.4783665 92 39.87 3.1796887 93 43.08 2.7548357 94 33.29 1.6815231 95 31.02 6.3325445 96 31.8 4.0383388 & @target G0.S1 @type bardy 87 32.17 3.4480168 88 40.13 3.4837939 89 37 4.6510214 90 37.78 8.8771899 91 33 3.7476499 92 30.3 1.6859953 93 27.74 4.5839394 94 15.63 4.472136 95 21.19 4.2082799 96 18.39 2.9247769 & @target G1.S0 @type bardy 87 46.93 6.52 88 50.64 3.05 89 39.96 3.83 90 32.89 6.91 91 38.96 7.69 92 34.05 5.135 93 36.46 6.33 94 33.79 3.86 95 37.38 7.945 96 37.6 7.4 & @target G1.S1 @type bardy 87 34.15 6.365 88 32.54 1.995 89 21.48 6.44 90 20.68 2.255 91 27.19 4.65 92 26.35 1.95 93 24.14 2.135 94 19.18 2.75 95 18.8 4.335 96 20.19 4.47 & @target G2.S0 @type bardy 87 50.48 5.2466667 88 45.61 3.8733333 89 20.44 4.4233333 90 15.81 4.7566667 91 15.81 2.67 92 24.36 3.3433333 93 35.24 5.0966667 94 41.63 3.4066667 95 49.97 5.03 96 47.45 4.1633333 & @target G2.S1 @type bardy 87 40.47 3.56 88 39.49 2.4266667 89 12.77 3.65 90 5.38 1.1666667 91 7.17 1.57 92 18.61 2.1066667 93 25.48 3.82 94 32.34 3.37 95 28.46 3.6633333 96 20.32 2.2333333 & grace-5.1.23/examples/times.agr0000644000076500001440000056711606626627163016120 0ustar fnevgenyusers# xvgr parameter file # @version 20100 @with g0 @g0 on @g0 label off @g0 hidden false @g0 type xy @g0 autoscale type AUTO @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format mmddyy decimal @g0 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 2448000 @ world xmax 2449500 @ world ymin -1 @ world ymax 1 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.100000 @ view ymax 0.200000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tt.d" @ xaxis tick on @ xaxis tick major 500.000000 @ xaxis tick minor 250.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format dayofweekl @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 0.500000 @ yaxis tick minor 0.250000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 500.000000 @ zeroxaxis tick minor 250.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 0.500000 @ zeroyaxis tick minor 0.250000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @with g1 @g1 on @g1 label off @g1 hidden false @g1 type xy @g1 autoscale type AUTO @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format hms decimal @g1 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 2448304 @ world xmax 2448304.4 @ world ymin -5 @ world ymax -0 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.280000 @ view ymax 0.380000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tt.d" @ xaxis tick on @ xaxis tick major 0.100000 @ xaxis tick minor 0.050000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 2 @ xaxis ticklabel format hms @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 1.000000 @ yaxis tick minor 0.500000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 0.100000 @ zeroxaxis tick minor 0.050000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 2 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 1.000000 @ zeroyaxis tick minor 0.500000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @with g2 @g2 on @g2 label off @g2 hidden false @g2 type xy @g2 autoscale type AUTO @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format dayofweekl decimal @g2 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 2448400 @ world xmax 2448800 @ world ymin -2 @ world ymax 2 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.460000 @ view ymax 0.560000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tt.d" @ xaxis tick on @ xaxis tick major 100.000000 @ xaxis tick minor 50.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format monthday @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 1.000000 @ yaxis tick minor 0.500000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 100.000000 @ zeroxaxis tick minor 50.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 1.000000 @ zeroyaxis tick minor 0.500000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @with g3 @g3 on @g3 label off @g3 hidden false @g3 type xy @g3 autoscale type AUTO @g3 fixedpoint off @g3 fixedpoint type 0 @g3 fixedpoint xy 0.000000, 0.000000 @g3 fixedpoint format monthday decimal @g3 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 2448300 @ world xmax 2448800 @ world ymin -1 @ world ymax 1 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.640000 @ view ymax 0.740000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tt.d" @ xaxis tick on @ xaxis tick major 100.000000 @ xaxis tick minor 50.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format dayofyear @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 0.500000 @ yaxis tick minor 0.250000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 100.000000 @ zeroxaxis tick minor 50.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 0.500000 @ zeroyaxis tick minor 0.250000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @with g4 @g4 on @g4 label off @g4 hidden false @g4 type xy @g4 autoscale type AUTO @g4 fixedpoint off @g4 fixedpoint type 0 @g4 fixedpoint xy 0.000000, 0.000000 @g4 fixedpoint format dayofyear decimal @g4 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 2447893 @ world xmax 2449500 @ world ymin -1 @ world ymax 1 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.820000 @ view ymax 0.920000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "Time date formats" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tt.d" @ xaxis tick on @ xaxis tick major 365.250000 @ xaxis tick minor 30.437500 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format mmddyy @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 0.500000 @ yaxis tick minor 0.250000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 500.000000 @ zeroxaxis tick minor 250.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 0.500000 @ zeroyaxis tick minor 0.250000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @WITH G0 @G0 ON 2448161.000000 0.999852 2448162.000000 0.999408 2448163.000000 0.998669 2448164.000000 0.997634 2448165.000000 0.996303 2448166.000000 0.994678 2448167.000000 0.992759 2448168.000000 0.990545 2448169.000000 0.988039 2448170.000000 0.985240 2448171.000000 0.982150 2448172.000000 0.978769 2448173.000000 0.975099 2448174.000000 0.971139 2448175.000000 0.966893 2448176.000000 0.962360 2448177.000000 0.957543 2448178.000000 0.952442 2448179.000000 0.947060 2448180.000000 0.941397 2448181.000000 0.935455 2448182.000000 0.929237 2448183.000000 0.922744 2448184.000000 0.915978 2448185.000000 0.908940 2448186.000000 0.901634 2448187.000000 0.894061 2448188.000000 0.886224 2448189.000000 0.878124 2448190.000000 0.869764 2448191.000000 0.861147 2448192.000000 0.852275 2448193.000000 0.843151 2448194.000000 0.833777 2448195.000000 0.824157 2448196.000000 0.814292 2448197.000000 0.804187 2448198.000000 0.793844 2448199.000000 0.783266 2448200.000000 0.772456 2448201.000000 0.761418 2448202.000000 0.750154 2448203.000000 0.738668 2448204.000000 0.726964 2448205.000000 0.715044 2448206.000000 0.702913 2448207.000000 0.690574 2448208.000000 0.678031 2448209.000000 0.665287 2448210.000000 0.652346 2448211.000000 0.639212 2448212.000000 0.625889 2448213.000000 0.612380 2448214.000000 0.598691 2448215.000000 0.584824 2448216.000000 0.570784 2448217.000000 0.556576 2448218.000000 0.542202 2448219.000000 0.527668 2448220.000000 0.512978 2448221.000000 0.498137 2448222.000000 0.483147 2448223.000000 0.468015 2448224.000000 0.452745 2448225.000000 0.437340 2448226.000000 0.421806 2448227.000000 0.406147 2448228.000000 0.390368 2448229.000000 0.374474 2448230.000000 0.358468 2448231.000000 0.342357 2448232.000000 0.326144 2448233.000000 0.309835 2448234.000000 0.293434 2448235.000000 0.276946 2448236.000000 0.260376 2448237.000000 0.243730 2448238.000000 0.227011 2448239.000000 0.210225 2448240.000000 0.193376 2448241.000000 0.176471 2448242.000000 0.159513 2448243.000000 0.142508 2448244.000000 0.125461 2448245.000000 0.108377 2448246.000000 0.091261 2448247.000000 0.074117 2448248.000000 0.056952 2448249.000000 0.039770 2448250.000000 0.022576 2448251.000000 0.005376 2448252.000000 -0.011826 2448253.000000 -0.029025 2448254.000000 -0.046215 2448255.000000 -0.063391 2448256.000000 -0.080549 2448257.000000 -0.097683 2448258.000000 -0.114788 2448259.000000 -0.131859 2448260.000000 -0.148890 2448261.000000 -0.165878 2448262.000000 -0.182817 2448263.000000 -0.199702 2448264.000000 -0.216527 2448265.000000 -0.233289 2448266.000000 -0.249981 2448267.000000 -0.266599 2448268.000000 -0.283139 2448269.000000 -0.299595 2448270.000000 -0.315962 2448271.000000 -0.332235 2448272.000000 -0.348411 2448273.000000 -0.364483 2448274.000000 -0.380447 2448275.000000 -0.396299 2448276.000000 -0.412034 2448277.000000 -0.427646 2448278.000000 -0.443132 2448279.000000 -0.458487 2448280.000000 -0.473706 2448281.000000 -0.488785 2448282.000000 -0.503720 2448283.000000 -0.518505 2448284.000000 -0.533137 2448285.000000 -0.547611 2448286.000000 -0.561923 2448287.000000 -0.576069 2448288.000000 -0.590044 2448289.000000 -0.603845 2448290.000000 -0.617467 2448291.000000 -0.630907 2448292.000000 -0.644159 2448293.000000 -0.657221 2448294.000000 -0.670089 2448295.000000 -0.682758 2448296.000000 -0.695225 2448297.000000 -0.707487 2448298.000000 -0.719539 2448299.000000 -0.731378 2448300.000000 -0.743001 2448301.000000 -0.754404 2448302.000000 -0.765584 2448303.000000 -0.776537 2448304.000000 -0.787260 2448305.000000 -0.797750 2448306.000000 -0.808005 2448307.000000 -0.818020 2448308.000000 -0.827793 2448309.000000 -0.837321 2448310.000000 -0.846602 2448311.000000 -0.855631 2448312.000000 -0.864408 2448313.000000 -0.872929 2448314.000000 -0.881192 2448315.000000 -0.889193 2448316.000000 -0.896932 2448317.000000 -0.904405 2448318.000000 -0.911611 2448319.000000 -0.918547 2448320.000000 -0.925211 2448321.000000 -0.931601 2448322.000000 -0.937716 2448323.000000 -0.943553 2448324.000000 -0.949111 2448325.000000 -0.954388 2448326.000000 -0.959383 2448327.000000 -0.964094 2448328.000000 -0.968519 2448329.000000 -0.972658 2448330.000000 -0.976509 2448331.000000 -0.980071 2448332.000000 -0.983343 2448333.000000 -0.986324 2448334.000000 -0.989013 2448335.000000 -0.991410 2448336.000000 -0.993513 2448337.000000 -0.995322 2448338.000000 -0.996837 2448339.000000 -0.998056 2448340.000000 -0.998981 2448341.000000 -0.999609 2448342.000000 -0.999942 2448343.000000 -0.999979 2448344.000000 -0.999720 2448345.000000 -0.999166 2448346.000000 -0.998315 2448347.000000 -0.997169 2448348.000000 -0.995728 2448349.000000 -0.993993 2448350.000000 -0.991963 2448351.000000 -0.989640 2448352.000000 -0.987024 2448353.000000 -0.984116 2448354.000000 -0.980916 2448355.000000 -0.977426 2448356.000000 -0.973648 2448357.000000 -0.969581 2448358.000000 -0.965227 2448359.000000 -0.960587 2448360.000000 -0.955663 2448361.000000 -0.950457 2448362.000000 -0.944969 2448363.000000 -0.939201 2448364.000000 -0.933156 2448365.000000 -0.926834 2448366.000000 -0.920239 2448367.000000 -0.913370 2448368.000000 -0.906232 2448369.000000 -0.898825 2448370.000000 -0.891153 2448371.000000 -0.883217 2448372.000000 -0.875019 2448373.000000 -0.866562 2448374.000000 -0.857849 2448375.000000 -0.848883 2448376.000000 -0.839665 2448377.000000 -0.830198 2448378.000000 -0.820486 2448379.000000 -0.810531 2448380.000000 -0.800336 2448381.000000 -0.789905 2448382.000000 -0.779239 2448383.000000 -0.768343 2448384.000000 -0.757220 2448385.000000 -0.745872 2448386.000000 -0.734304 2448387.000000 -0.722519 2448388.000000 -0.710520 2448389.000000 -0.698310 2448390.000000 -0.685894 2448391.000000 -0.673275 2448392.000000 -0.660457 2448393.000000 -0.647443 2448394.000000 -0.634237 2448395.000000 -0.620844 2448396.000000 -0.607268 2448397.000000 -0.593511 2448398.000000 -0.579579 2448399.000000 -0.565476 2448400.000000 -0.551205 2448401.000000 -0.536771 2448402.000000 -0.522178 2448403.000000 -0.507430 2448404.000000 -0.492533 2448405.000000 -0.477489 2448406.000000 -0.462305 2448407.000000 -0.446983 2448408.000000 -0.431530 2448409.000000 -0.415948 2448410.000000 -0.400244 2448411.000000 -0.384421 2448412.000000 -0.368484 2448413.000000 -0.352439 2448414.000000 -0.336289 2448415.000000 -0.320039 2448416.000000 -0.303695 2448417.000000 -0.287261 2448418.000000 -0.270742 2448419.000000 -0.254143 2448420.000000 -0.237468 2448421.000000 -0.220724 2448422.000000 -0.203914 2448423.000000 -0.187043 2448424.000000 -0.170118 2448425.000000 -0.153142 2448426.000000 -0.136120 2448427.000000 -0.119059 2448428.000000 -0.101962 2448429.000000 -0.084835 2448430.000000 -0.067683 2448431.000000 -0.050511 2448432.000000 -0.033324 2448433.000000 -0.016127 2448434.000000 0.001075 2448435.000000 0.018277 2448436.000000 0.035473 2448437.000000 0.052658 2448438.000000 0.069828 2448439.000000 0.086977 2448440.000000 0.104101 2448441.000000 0.121193 2448442.000000 0.138250 2448443.000000 0.155266 2448444.000000 0.172236 2448445.000000 0.189155 2448446.000000 0.206018 2448447.000000 0.222820 2448448.000000 0.239557 2448449.000000 0.256222 2448450.000000 0.272811 2448451.000000 0.289320 2448452.000000 0.305743 2448453.000000 0.322076 2448454.000000 0.338313 2448455.000000 0.354450 2448456.000000 0.370483 2448457.000000 0.386405 2448458.000000 0.402214 2448459.000000 0.417903 2448460.000000 0.433469 2448461.000000 0.448906 2448462.000000 0.464210 2448463.000000 0.479378 2448464.000000 0.494403 2448465.000000 0.509282 2448466.000000 0.524010 2448467.000000 0.538584 2448468.000000 0.552997 2448469.000000 0.567248 2448470.000000 0.581330 2448471.000000 0.595240 2448472.000000 0.608975 2448473.000000 0.622529 2448474.000000 0.635898 2448475.000000 0.649080 2448476.000000 0.662070 2448477.000000 0.674863 2448478.000000 0.687457 2448479.000000 0.699848 2448480.000000 0.712031 2448481.000000 0.724004 2448482.000000 0.735762 2448483.000000 0.747303 2448484.000000 0.758623 2448485.000000 0.769718 2448486.000000 0.780585 2448487.000000 0.791221 2448488.000000 0.801624 2448489.000000 0.811789 2448490.000000 0.821713 2448491.000000 0.831395 2448492.000000 0.840831 2448493.000000 0.850017 2448494.000000 0.858953 2448495.000000 0.867634 2448496.000000 0.876058 2448497.000000 0.884223 2448498.000000 0.892126 2448499.000000 0.899766 2448500.000000 0.907139 2448501.000000 0.914244 2448502.000000 0.921078 2448503.000000 0.927640 2448504.000000 0.933927 2448505.000000 0.939938 2448506.000000 0.945670 2448507.000000 0.951123 2448508.000000 0.956294 2448509.000000 0.961183 2448510.000000 0.965787 2448511.000000 0.970105 2448512.000000 0.974136 2448513.000000 0.977879 2448514.000000 0.981332 2448515.000000 0.984495 2448516.000000 0.987367 2448517.000000 0.989946 2448518.000000 0.992233 2448519.000000 0.994226 2448520.000000 0.995925 2448521.000000 0.997329 2448522.000000 0.998438 2448523.000000 0.999251 2448524.000000 0.999769 2448525.000000 0.999991 2448526.000000 0.999917 2448527.000000 0.999547 2448528.000000 0.998881 2448529.000000 0.997920 2448530.000000 0.996663 2448531.000000 0.995112 2448532.000000 0.993266 2448533.000000 0.991126 2448534.000000 0.988693 2448535.000000 0.985967 2448536.000000 0.982950 2448537.000000 0.979641 2448538.000000 0.976043 2448539.000000 0.972156 2448540.000000 0.967981 2448541.000000 0.963520 2448542.000000 0.958774 2448543.000000 0.953744 2448544.000000 0.948432 2448545.000000 0.942839 2448546.000000 0.936967 2448547.000000 0.930818 2448548.000000 0.924393 2448549.000000 0.917695 2448550.000000 0.910725 2448551.000000 0.903486 2448552.000000 0.895979 2448553.000000 0.888208 2448554.000000 0.880173 2448555.000000 0.871878 2448556.000000 0.863325 2448557.000000 0.854517 2448558.000000 0.845455 2448559.000000 0.836144 2448560.000000 0.826585 2448561.000000 0.816781 2448562.000000 0.806736 2448563.000000 0.796452 2448564.000000 0.785932 2448565.000000 0.775180 2448566.000000 0.764198 2448567.000000 0.752991 2448568.000000 0.741560 2448569.000000 0.729910 2448570.000000 0.718044 2448571.000000 0.705965 2448572.000000 0.693678 2448573.000000 0.681185 2448574.000000 0.668491 2448575.000000 0.655599 2448576.000000 0.642513 2448577.000000 0.629237 2448578.000000 0.615774 2448579.000000 0.602130 2448580.000000 0.588307 2448581.000000 0.574310 2448582.000000 0.560143 2448583.000000 0.545811 2448584.000000 0.531317 2448585.000000 0.516665 2448586.000000 0.501861 2448587.000000 0.486908 2448588.000000 0.471812 2448589.000000 0.456575 2448590.000000 0.441204 2448591.000000 0.425701 2448592.000000 0.410073 2448593.000000 0.394324 2448594.000000 0.378458 2448595.000000 0.362480 2448596.000000 0.346394 2448597.000000 0.330207 2448598.000000 0.313921 2448599.000000 0.297543 2448600.000000 0.281076 2448601.000000 0.264526 2448602.000000 0.247898 2448603.000000 0.231197 2448604.000000 0.214427 2448605.000000 0.197594 2448606.000000 0.180702 2448607.000000 0.163757 2448608.000000 0.146764 2448609.000000 0.129727 2448610.000000 0.112651 2448611.000000 0.095543 2448612.000000 0.078406 2448613.000000 0.061245 2448614.000000 0.044067 2448615.000000 0.026876 2448616.000000 0.009676 2448617.000000 -0.007526 2448618.000000 -0.024726 2448619.000000 -0.041919 2448620.000000 -0.059099 2448621.000000 -0.076262 2448622.000000 -0.093402 2448623.000000 -0.110514 2448624.000000 -0.127594 2448625.000000 -0.144636 2448626.000000 -0.161636 2448627.000000 -0.178587 2448628.000000 -0.195486 2448629.000000 -0.212327 2448630.000000 -0.229104 2448631.000000 -0.245815 2448632.000000 -0.262452 2448633.000000 -0.279012 2448634.000000 -0.295489 2448635.000000 -0.311879 2448636.000000 -0.328176 2448637.000000 -0.344376 2448638.000000 -0.360475 2448639.000000 -0.376467 2448640.000000 -0.392347 2448641.000000 -0.408111 2448642.000000 -0.423755 2448643.000000 -0.439273 2448644.000000 -0.454661 2448645.000000 -0.469915 2448646.000000 -0.485029 2448647.000000 -0.500000 2448648.000000 -0.514823 2448649.000000 -0.529494 2448650.000000 -0.544008 2448651.000000 -0.558361 2448652.000000 -0.572548 2448653.000000 -0.586567 2448654.000000 -0.600412 2448655.000000 -0.614079 2448656.000000 -0.627564 2448657.000000 -0.640864 2448658.000000 -0.653974 2448659.000000 -0.666890 2448660.000000 -0.679610 2448661.000000 -0.692128 2448662.000000 -0.704441 2448663.000000 -0.716546 2448664.000000 -0.728438 2448665.000000 -0.740116 2448666.000000 -0.751574 2448667.000000 -0.762810 2448668.000000 -0.773820 2448669.000000 -0.784601 2448670.000000 -0.795150 2448671.000000 -0.805463 2448672.000000 -0.815539 2448673.000000 -0.825373 2448674.000000 -0.834962 2448675.000000 -0.844305 2448676.000000 -0.853398 2448677.000000 -0.862238 2448678.000000 -0.870823 2448679.000000 -0.879150 2448680.000000 -0.887218 2448681.000000 -0.895022 2448682.000000 -0.902562 2448683.000000 -0.909835 2448684.000000 -0.916838 2448685.000000 -0.923571 2448686.000000 -0.930030 2448687.000000 -0.936213 2448688.000000 -0.942120 2448689.000000 -0.947748 2448690.000000 -0.953095 2448691.000000 -0.958161 2448692.000000 -0.962943 2448693.000000 -0.967439 2448694.000000 -0.971650 2448695.000000 -0.975573 2448696.000000 -0.979208 2448697.000000 -0.982552 2448698.000000 -0.985606 2448699.000000 -0.988368 2448700.000000 -0.990838 2448701.000000 -0.993015 2448702.000000 -0.994897 2448703.000000 -0.996486 2448704.000000 -0.997779 2448705.000000 -0.998777 2448706.000000 -0.999480 2448707.000000 -0.999887 2448708.000000 -0.999998 2448709.000000 -0.999813 2448710.000000 -0.999332 2448711.000000 -0.998555 2448712.000000 -0.997483 2448713.000000 -0.996116 2448714.000000 -0.994454 2448715.000000 -0.992498 2448716.000000 -0.990248 2448717.000000 -0.987705 2448718.000000 -0.984870 2448719.000000 -0.981743 2448720.000000 -0.978326 2448721.000000 -0.974619 2448722.000000 -0.970624 2448723.000000 -0.966342 2448724.000000 -0.961774 2448725.000000 -0.956921 2448726.000000 -0.951785 2448727.000000 -0.946367 2448728.000000 -0.940669 2448729.000000 -0.934693 2448730.000000 -0.928441 2448731.000000 -0.921913 2448732.000000 -0.915113 2448733.000000 -0.908042 2448734.000000 -0.900702 2448735.000000 -0.893096 2448736.000000 -0.885225 2448737.000000 -0.877093 2448738.000000 -0.868701 2448739.000000 -0.860052 2448740.000000 -0.851148 2448741.000000 -0.841993 2448742.000000 -0.832588 2448743.000000 -0.822937 2448744.000000 -0.813042 2448745.000000 -0.802907 2448746.000000 -0.792534 2448747.000000 -0.781927 2448748.000000 -0.771089 2448749.000000 -0.760022 2448750.000000 -0.748730 2448751.000000 -0.737217 2448752.000000 -0.725485 2448753.000000 -0.713539 2448754.000000 -0.701382 2448755.000000 -0.689017 2448756.000000 -0.676448 2448757.000000 -0.663680 2448758.000000 -0.650714 2448759.000000 -0.637557 2448760.000000 -0.624210 2448761.000000 -0.610679 2448762.000000 -0.596967 2448763.000000 -0.583078 2448764.000000 -0.569017 2448765.000000 -0.554788 2448766.000000 -0.540394 2448767.000000 -0.525841 2448768.000000 -0.511131 2448769.000000 -0.496271 2448770.000000 -0.481264 2448771.000000 -0.466114 2448772.000000 -0.450826 2448773.000000 -0.435405 2448774.000000 -0.419855 2448775.000000 -0.404181 2448776.000000 -0.388388 2448777.000000 -0.372479 2448778.000000 -0.356460 2448779.000000 -0.340336 2448780.000000 -0.324111 2448781.000000 -0.307790 2448782.000000 -0.291378 2448783.000000 -0.274879 2448784.000000 -0.258300 2448785.000000 -0.241644 2448786.000000 -0.224916 2448787.000000 -0.208122 2448788.000000 -0.191266 2448789.000000 -0.174354 2448790.000000 -0.157390 2448791.000000 -0.140380 2448792.000000 -0.123328 2448793.000000 -0.106239 2448794.000000 -0.089119 2448795.000000 -0.071973 2448796.000000 -0.054805 2448797.000000 -0.037621 2448798.000000 -0.020426 2448799.000000 -0.003225 2448800.000000 0.013977 2448801.000000 0.031174 2448802.000000 0.048363 2448803.000000 0.065537 2448804.000000 0.082692 2448805.000000 0.099823 2448806.000000 0.116923 2448807.000000 0.133990 2448808.000000 0.151016 2448809.000000 0.167998 2448810.000000 0.184931 2448811.000000 0.201808 2448812.000000 0.218626 2448813.000000 0.235379 2448814.000000 0.252062 2448815.000000 0.268671 2448816.000000 0.285201 2448817.000000 0.301646 2448818.000000 0.318001 2448819.000000 0.334263 2448820.000000 0.350426 2448821.000000 0.366485 2448822.000000 0.382435 2448823.000000 0.398272 2448824.000000 0.413992 2448825.000000 0.429589 2448826.000000 0.445059 2448827.000000 0.460397 2448828.000000 0.475599 2448829.000000 0.490660 2448830.000000 0.505576 2448831.000000 0.520343 2448832.000000 0.534955 2448833.000000 0.549409 2448834.000000 0.563701 2448835.000000 0.577825 2448836.000000 0.591779 2448837.000000 0.605558 2448838.000000 0.619157 2448839.000000 0.632573 2448840.000000 0.645803 2448841.000000 0.658840 2448842.000000 0.671683 2448843.000000 0.684328 2448844.000000 0.696769 2448845.000000 0.709005 2448846.000000 0.721031 2448847.000000 0.732843 2448848.000000 0.744438 2448849.000000 0.755814 2448850.000000 0.766965 2448851.000000 0.777890 2448852.000000 0.788584 2448853.000000 0.799045 2448854.000000 0.809270 2448855.000000 0.819255 2448856.000000 0.828997 2448857.000000 0.838495 2448858.000000 0.847744 2448859.000000 0.856742 2448860.000000 0.865487 2448861.000000 0.873976 2448862.000000 0.882206 2448863.000000 0.890175 2448864.000000 0.897881 2448865.000000 0.905321 2448866.000000 0.912493 2448867.000000 0.919395 2448868.000000 0.926025 2448869.000000 0.932381 2448870.000000 0.938461 2448871.000000 0.944263 2448872.000000 0.949786 2448873.000000 0.955028 2448874.000000 0.959987 2448875.000000 0.964662 2448876.000000 0.969052 2448877.000000 0.973155 2448878.000000 0.976970 2448879.000000 0.980496 2448880.000000 0.983732 2448881.000000 0.986676 2448882.000000 0.989329 2448883.000000 0.991689 2448884.000000 0.993755 2448885.000000 0.995527 2448886.000000 0.997005 2448887.000000 0.998188 2448888.000000 0.999075 2448889.000000 0.999667 2448890.000000 0.999963 2448891.000000 0.999963 2448892.000000 0.999667 2448893.000000 0.999075 2448894.000000 0.998188 2448895.000000 0.997005 2448896.000000 0.995527 2448897.000000 0.993755 2448898.000000 0.991689 2448899.000000 0.989329 2448900.000000 0.986676 2448901.000000 0.983732 2448902.000000 0.980496 2448903.000000 0.976970 2448904.000000 0.973155 2448905.000000 0.969052 2448906.000000 0.964662 2448907.000000 0.959987 2448908.000000 0.955028 2448909.000000 0.949786 2448910.000000 0.944263 2448911.000000 0.938461 2448912.000000 0.932381 2448913.000000 0.926025 2448914.000000 0.919395 2448915.000000 0.912493 2448916.000000 0.905321 2448917.000000 0.897881 2448918.000000 0.890175 2448919.000000 0.882206 2448920.000000 0.873976 2448921.000000 0.865487 2448922.000000 0.856742 2448923.000000 0.847744 2448924.000000 0.838495 2448925.000000 0.828997 2448926.000000 0.819255 2448927.000000 0.809270 2448928.000000 0.799045 2448929.000000 0.788584 2448930.000000 0.777890 2448931.000000 0.766965 2448932.000000 0.755814 2448933.000000 0.744438 2448934.000000 0.732843 2448935.000000 0.721031 2448936.000000 0.709005 2448937.000000 0.696769 2448938.000000 0.684328 2448939.000000 0.671683 2448940.000000 0.658840 2448941.000000 0.645803 2448942.000000 0.632573 2448943.000000 0.619157 2448944.000000 0.605558 2448945.000000 0.591779 2448946.000000 0.577825 2448947.000000 0.563701 2448948.000000 0.549409 2448949.000000 0.534955 2448950.000000 0.520343 2448951.000000 0.505576 2448952.000000 0.490660 2448953.000000 0.475599 2448954.000000 0.460397 2448955.000000 0.445059 2448956.000000 0.429589 2448957.000000 0.413992 2448958.000000 0.398272 2448959.000000 0.382435 2448960.000000 0.366485 2448961.000000 0.350426 2448962.000000 0.334263 2448963.000000 0.318001 2448964.000000 0.301646 2448965.000000 0.285201 2448966.000000 0.268671 2448967.000000 0.252062 2448968.000000 0.235379 2448969.000000 0.218626 2448970.000000 0.201808 2448971.000000 0.184931 2448972.000000 0.167998 2448973.000000 0.151016 2448974.000000 0.133990 2448975.000000 0.116923 2448976.000000 0.099823 2448977.000000 0.082692 2448978.000000 0.065537 2448979.000000 0.048363 2448980.000000 0.031174 2448981.000000 0.013977 2448982.000000 -0.003225 2448983.000000 -0.020426 2448984.000000 -0.037621 2448985.000000 -0.054805 2448986.000000 -0.071973 2448987.000000 -0.089119 2448988.000000 -0.106239 2448989.000000 -0.123328 2448990.000000 -0.140380 2448991.000000 -0.157390 2448992.000000 -0.174354 2448993.000000 -0.191266 2448994.000000 -0.208122 2448995.000000 -0.224916 2448996.000000 -0.241644 2448997.000000 -0.258300 2448998.000000 -0.274879 2448999.000000 -0.291378 2449000.000000 -0.307790 2449001.000000 -0.324111 2449002.000000 -0.340336 2449003.000000 -0.356460 2449004.000000 -0.372479 2449005.000000 -0.388388 2449006.000000 -0.404181 2449007.000000 -0.419855 2449008.000000 -0.435405 2449009.000000 -0.450826 2449010.000000 -0.466114 2449011.000000 -0.481264 2449012.000000 -0.496271 2449013.000000 -0.511131 2449014.000000 -0.525841 2449015.000000 -0.540394 2449016.000000 -0.554788 2449017.000000 -0.569017 2449018.000000 -0.583078 2449019.000000 -0.596967 2449020.000000 -0.610679 2449021.000000 -0.624210 2449022.000000 -0.637557 2449023.000000 -0.650714 2449024.000000 -0.663680 2449025.000000 -0.676448 2449026.000000 -0.689017 2449027.000000 -0.701382 2449028.000000 -0.713539 2449029.000000 -0.725485 2449030.000000 -0.737217 2449031.000000 -0.748730 2449032.000000 -0.760022 2449033.000000 -0.771089 2449034.000000 -0.781927 2449035.000000 -0.792534 2449036.000000 -0.802907 2449037.000000 -0.813042 2449038.000000 -0.822937 2449039.000000 -0.832588 2449040.000000 -0.841993 2449041.000000 -0.851148 2449042.000000 -0.860052 2449043.000000 -0.868701 2449044.000000 -0.877093 2449045.000000 -0.885225 2449046.000000 -0.893096 2449047.000000 -0.900702 2449048.000000 -0.908042 2449049.000000 -0.915113 2449050.000000 -0.921913 2449051.000000 -0.928441 2449052.000000 -0.934693 2449053.000000 -0.940669 2449054.000000 -0.946367 2449055.000000 -0.951785 2449056.000000 -0.956921 2449057.000000 -0.961774 2449058.000000 -0.966342 2449059.000000 -0.970624 2449060.000000 -0.974619 2449061.000000 -0.978326 2449062.000000 -0.981743 2449063.000000 -0.984870 2449064.000000 -0.987705 2449065.000000 -0.990248 2449066.000000 -0.992498 2449067.000000 -0.994454 2449068.000000 -0.996116 2449069.000000 -0.997483 2449070.000000 -0.998555 2449071.000000 -0.999332 2449072.000000 -0.999813 2449073.000000 -0.999998 2449074.000000 -0.999887 2449075.000000 -0.999480 2449076.000000 -0.998777 2449077.000000 -0.997779 2449078.000000 -0.996486 2449079.000000 -0.994897 2449080.000000 -0.993015 2449081.000000 -0.990838 2449082.000000 -0.988368 2449083.000000 -0.985606 2449084.000000 -0.982552 2449085.000000 -0.979208 2449086.000000 -0.975573 2449087.000000 -0.971650 2449088.000000 -0.967439 2449089.000000 -0.962943 2449090.000000 -0.958161 2449091.000000 -0.953095 2449092.000000 -0.947748 2449093.000000 -0.942120 2449094.000000 -0.936213 2449095.000000 -0.930030 2449096.000000 -0.923571 2449097.000000 -0.916838 2449098.000000 -0.909835 2449099.000000 -0.902562 2449100.000000 -0.895022 2449101.000000 -0.887218 2449102.000000 -0.879150 2449103.000000 -0.870823 2449104.000000 -0.862238 2449105.000000 -0.853398 2449106.000000 -0.844305 2449107.000000 -0.834962 2449108.000000 -0.825373 2449109.000000 -0.815539 2449110.000000 -0.805463 2449111.000000 -0.795150 2449112.000000 -0.784601 2449113.000000 -0.773820 2449114.000000 -0.762810 2449115.000000 -0.751574 2449116.000000 -0.740116 2449117.000000 -0.728438 2449118.000000 -0.716546 2449119.000000 -0.704441 2449120.000000 -0.692128 2449121.000000 -0.679610 2449122.000000 -0.666890 2449123.000000 -0.653974 2449124.000000 -0.640864 2449125.000000 -0.627564 2449126.000000 -0.614079 2449127.000000 -0.600412 2449128.000000 -0.586567 2449129.000000 -0.572548 2449130.000000 -0.558361 2449131.000000 -0.544008 2449132.000000 -0.529494 2449133.000000 -0.514823 2449134.000000 -0.500000 2449135.000000 -0.485029 2449136.000000 -0.469915 2449137.000000 -0.454661 2449138.000000 -0.439273 2449139.000000 -0.423755 2449140.000000 -0.408111 2449141.000000 -0.392347 2449142.000000 -0.376467 2449143.000000 -0.360475 2449144.000000 -0.344376 2449145.000000 -0.328176 2449146.000000 -0.311879 2449147.000000 -0.295489 2449148.000000 -0.279012 2449149.000000 -0.262452 2449150.000000 -0.245815 2449151.000000 -0.229104 2449152.000000 -0.212327 2449153.000000 -0.195486 2449154.000000 -0.178587 2449155.000000 -0.161636 2449156.000000 -0.144636 2449157.000000 -0.127594 2449158.000000 -0.110514 2449159.000000 -0.093402 2449160.000000 -0.076262 2449161.000000 -0.059099 2449162.000000 -0.041919 2449163.000000 -0.024726 2449164.000000 -0.007526 2449165.000000 0.009676 2449166.000000 0.026876 2449167.000000 0.044067 2449168.000000 0.061245 2449169.000000 0.078406 2449170.000000 0.095543 2449171.000000 0.112651 2449172.000000 0.129727 2449173.000000 0.146764 2449174.000000 0.163757 2449175.000000 0.180702 2449176.000000 0.197594 2449177.000000 0.214427 2449178.000000 0.231197 2449179.000000 0.247898 2449180.000000 0.264526 2449181.000000 0.281076 2449182.000000 0.297543 2449183.000000 0.313921 2449184.000000 0.330207 2449185.000000 0.346394 2449186.000000 0.362480 2449187.000000 0.378458 2449188.000000 0.394324 2449189.000000 0.410073 2449190.000000 0.425701 2449191.000000 0.441204 2449192.000000 0.456575 2449193.000000 0.471812 2449194.000000 0.486908 2449195.000000 0.501861 2449196.000000 0.516665 2449197.000000 0.531317 2449198.000000 0.545811 2449199.000000 0.560143 2449200.000000 0.574310 2449201.000000 0.588307 2449202.000000 0.602130 2449203.000000 0.615774 2449204.000000 0.629237 2449205.000000 0.642513 2449206.000000 0.655599 2449207.000000 0.668491 2449208.000000 0.681185 2449209.000000 0.693678 2449210.000000 0.705965 2449211.000000 0.718044 2449212.000000 0.729910 2449213.000000 0.741560 2449214.000000 0.752991 2449215.000000 0.764198 2449216.000000 0.775180 2449217.000000 0.785932 2449218.000000 0.796452 2449219.000000 0.806736 2449220.000000 0.816781 2449221.000000 0.826585 2449222.000000 0.836144 2449223.000000 0.845455 2449224.000000 0.854517 2449225.000000 0.863325 2449226.000000 0.871878 2449227.000000 0.880173 2449228.000000 0.888208 2449229.000000 0.895979 2449230.000000 0.903486 & @WITH G1 @G1 ON 2448161.000000 0.999852 2448162.000000 0.999408 2448163.000000 0.998669 2448164.000000 0.997634 2448165.000000 0.996303 2448166.000000 0.994678 2448167.000000 0.992759 2448168.000000 0.990545 2448169.000000 0.988039 2448170.000000 0.985240 2448171.000000 0.982150 2448172.000000 0.978769 2448173.000000 0.975099 2448174.000000 0.971139 2448175.000000 0.966893 2448176.000000 0.962360 2448177.000000 0.957543 2448178.000000 0.952442 2448179.000000 0.947060 2448180.000000 0.941397 2448181.000000 0.935455 2448182.000000 0.929237 2448183.000000 0.922744 2448184.000000 0.915978 2448185.000000 0.908940 2448186.000000 0.901634 2448187.000000 0.894061 2448188.000000 0.886224 2448189.000000 0.878124 2448190.000000 0.869764 2448191.000000 0.861147 2448192.000000 0.852275 2448193.000000 0.843151 2448194.000000 0.833777 2448195.000000 0.824157 2448196.000000 0.814292 2448197.000000 0.804187 2448198.000000 0.793844 2448199.000000 0.783266 2448200.000000 0.772456 2448201.000000 0.761418 2448202.000000 0.750154 2448203.000000 0.738668 2448204.000000 0.726964 2448205.000000 0.715044 2448206.000000 0.702913 2448207.000000 0.690574 2448208.000000 0.678031 2448209.000000 0.665287 2448210.000000 0.652346 2448211.000000 0.639212 2448212.000000 0.625889 2448213.000000 0.612380 2448214.000000 0.598691 2448215.000000 0.584824 2448216.000000 0.570784 2448217.000000 0.556576 2448218.000000 0.542202 2448219.000000 0.527668 2448220.000000 0.512978 2448221.000000 0.498137 2448222.000000 0.483147 2448223.000000 0.468015 2448224.000000 0.452745 2448225.000000 0.437340 2448226.000000 0.421806 2448227.000000 0.406147 2448228.000000 0.390368 2448229.000000 0.374474 2448230.000000 0.358468 2448231.000000 0.342357 2448232.000000 0.326144 2448233.000000 0.309835 2448234.000000 0.293434 2448235.000000 0.276946 2448236.000000 0.260376 2448237.000000 0.243730 2448238.000000 0.227011 2448239.000000 0.210225 2448240.000000 0.193376 2448241.000000 0.176471 2448242.000000 0.159513 2448243.000000 0.142508 2448244.000000 0.125461 2448245.000000 0.108377 2448246.000000 0.091261 2448247.000000 0.074117 2448248.000000 0.056952 2448249.000000 0.039770 2448250.000000 0.022576 2448251.000000 0.005376 2448252.000000 -0.011826 2448253.000000 -0.029025 2448254.000000 -0.046215 2448255.000000 -0.063391 2448256.000000 -0.080549 2448257.000000 -0.097683 2448258.000000 -0.114788 2448259.000000 -0.131859 2448260.000000 -0.148890 2448261.000000 -0.165878 2448262.000000 -0.182817 2448263.000000 -0.199702 2448264.000000 -0.216527 2448265.000000 -0.233289 2448266.000000 -0.249981 2448267.000000 -0.266599 2448268.000000 -0.283139 2448269.000000 -0.299595 2448270.000000 -0.315962 2448271.000000 -0.332235 2448272.000000 -0.348411 2448273.000000 -0.364483 2448274.000000 -0.380447 2448275.000000 -0.396299 2448276.000000 -0.412034 2448277.000000 -0.427646 2448278.000000 -0.443132 2448279.000000 -0.458487 2448280.000000 -0.473706 2448281.000000 -0.488785 2448282.000000 -0.503720 2448283.000000 -0.518505 2448284.000000 -0.533137 2448285.000000 -0.547611 2448286.000000 -0.561923 2448287.000000 -0.576069 2448288.000000 -0.590044 2448289.000000 -0.603845 2448290.000000 -0.617467 2448291.000000 -0.630907 2448292.000000 -0.644159 2448293.000000 -0.657221 2448294.000000 -0.670089 2448295.000000 -0.682758 2448296.000000 -0.695225 2448297.000000 -0.707487 2448298.000000 -0.719539 2448299.000000 -0.731378 2448300.000000 -0.743001 2448301.000000 -0.754404 2448302.000000 -0.765584 2448303.000000 -0.776537 2448304.000000 -0.787260 2448305.000000 -0.797750 2448306.000000 -0.808005 2448307.000000 -0.818020 2448308.000000 -0.827793 2448309.000000 -0.837321 2448310.000000 -0.846602 2448311.000000 -0.855631 2448312.000000 -0.864408 2448313.000000 -0.872929 2448314.000000 -0.881192 2448315.000000 -0.889193 2448316.000000 -0.896932 2448317.000000 -0.904405 2448318.000000 -0.911611 2448319.000000 -0.918547 2448320.000000 -0.925211 2448321.000000 -0.931601 2448322.000000 -0.937716 2448323.000000 -0.943553 2448324.000000 -0.949111 2448325.000000 -0.954388 2448326.000000 -0.959383 2448327.000000 -0.964094 2448328.000000 -0.968519 2448329.000000 -0.972658 2448330.000000 -0.976509 2448331.000000 -0.980071 2448332.000000 -0.983343 2448333.000000 -0.986324 2448334.000000 -0.989013 2448335.000000 -0.991410 2448336.000000 -0.993513 2448337.000000 -0.995322 2448338.000000 -0.996837 2448339.000000 -0.998056 2448340.000000 -0.998981 2448341.000000 -0.999609 2448342.000000 -0.999942 2448343.000000 -0.999979 2448344.000000 -0.999720 2448345.000000 -0.999166 2448346.000000 -0.998315 2448347.000000 -0.997169 2448348.000000 -0.995728 2448349.000000 -0.993993 2448350.000000 -0.991963 2448351.000000 -0.989640 2448352.000000 -0.987024 2448353.000000 -0.984116 2448354.000000 -0.980916 2448355.000000 -0.977426 2448356.000000 -0.973648 2448357.000000 -0.969581 2448358.000000 -0.965227 2448359.000000 -0.960587 2448360.000000 -0.955663 2448361.000000 -0.950457 2448362.000000 -0.944969 2448363.000000 -0.939201 2448364.000000 -0.933156 2448365.000000 -0.926834 2448366.000000 -0.920239 2448367.000000 -0.913370 2448368.000000 -0.906232 2448369.000000 -0.898825 2448370.000000 -0.891153 2448371.000000 -0.883217 2448372.000000 -0.875019 2448373.000000 -0.866562 2448374.000000 -0.857849 2448375.000000 -0.848883 2448376.000000 -0.839665 2448377.000000 -0.830198 2448378.000000 -0.820486 2448379.000000 -0.810531 2448380.000000 -0.800336 2448381.000000 -0.789905 2448382.000000 -0.779239 2448383.000000 -0.768343 2448384.000000 -0.757220 2448385.000000 -0.745872 2448386.000000 -0.734304 2448387.000000 -0.722519 2448388.000000 -0.710520 2448389.000000 -0.698310 2448390.000000 -0.685894 2448391.000000 -0.673275 2448392.000000 -0.660457 2448393.000000 -0.647443 2448394.000000 -0.634237 2448395.000000 -0.620844 2448396.000000 -0.607268 2448397.000000 -0.593511 2448398.000000 -0.579579 2448399.000000 -0.565476 2448400.000000 -0.551205 2448401.000000 -0.536771 2448402.000000 -0.522178 2448403.000000 -0.507430 2448404.000000 -0.492533 2448405.000000 -0.477489 2448406.000000 -0.462305 2448407.000000 -0.446983 2448408.000000 -0.431530 2448409.000000 -0.415948 2448410.000000 -0.400244 2448411.000000 -0.384421 2448412.000000 -0.368484 2448413.000000 -0.352439 2448414.000000 -0.336289 2448415.000000 -0.320039 2448416.000000 -0.303695 2448417.000000 -0.287261 2448418.000000 -0.270742 2448419.000000 -0.254143 2448420.000000 -0.237468 2448421.000000 -0.220724 2448422.000000 -0.203914 2448423.000000 -0.187043 2448424.000000 -0.170118 2448425.000000 -0.153142 2448426.000000 -0.136120 2448427.000000 -0.119059 2448428.000000 -0.101962 2448429.000000 -0.084835 2448430.000000 -0.067683 2448431.000000 -0.050511 2448432.000000 -0.033324 2448433.000000 -0.016127 2448434.000000 0.001075 2448435.000000 0.018277 2448436.000000 0.035473 2448437.000000 0.052658 2448438.000000 0.069828 2448439.000000 0.086977 2448440.000000 0.104101 2448441.000000 0.121193 2448442.000000 0.138250 2448443.000000 0.155266 2448444.000000 0.172236 2448445.000000 0.189155 2448446.000000 0.206018 2448447.000000 0.222820 2448448.000000 0.239557 2448449.000000 0.256222 2448450.000000 0.272811 2448451.000000 0.289320 2448452.000000 0.305743 2448453.000000 0.322076 2448454.000000 0.338313 2448455.000000 0.354450 2448456.000000 0.370483 2448457.000000 0.386405 2448458.000000 0.402214 2448459.000000 0.417903 2448460.000000 0.433469 2448461.000000 0.448906 2448462.000000 0.464210 2448463.000000 0.479378 2448464.000000 0.494403 2448465.000000 0.509282 2448466.000000 0.524010 2448467.000000 0.538584 2448468.000000 0.552997 2448469.000000 0.567248 2448470.000000 0.581330 2448471.000000 0.595240 2448472.000000 0.608975 2448473.000000 0.622529 2448474.000000 0.635898 2448475.000000 0.649080 2448476.000000 0.662070 2448477.000000 0.674863 2448478.000000 0.687457 2448479.000000 0.699848 2448480.000000 0.712031 2448481.000000 0.724004 2448482.000000 0.735762 2448483.000000 0.747303 2448484.000000 0.758623 2448485.000000 0.769718 2448486.000000 0.780585 2448487.000000 0.791221 2448488.000000 0.801624 2448489.000000 0.811789 2448490.000000 0.821713 2448491.000000 0.831395 2448492.000000 0.840831 2448493.000000 0.850017 2448494.000000 0.858953 2448495.000000 0.867634 2448496.000000 0.876058 2448497.000000 0.884223 2448498.000000 0.892126 2448499.000000 0.899766 2448500.000000 0.907139 2448501.000000 0.914244 2448502.000000 0.921078 2448503.000000 0.927640 2448504.000000 0.933927 2448505.000000 0.939938 2448506.000000 0.945670 2448507.000000 0.951123 2448508.000000 0.956294 2448509.000000 0.961183 2448510.000000 0.965787 2448511.000000 0.970105 2448512.000000 0.974136 2448513.000000 0.977879 2448514.000000 0.981332 2448515.000000 0.984495 2448516.000000 0.987367 2448517.000000 0.989946 2448518.000000 0.992233 2448519.000000 0.994226 2448520.000000 0.995925 2448521.000000 0.997329 2448522.000000 0.998438 2448523.000000 0.999251 2448524.000000 0.999769 2448525.000000 0.999991 2448526.000000 0.999917 2448527.000000 0.999547 2448528.000000 0.998881 2448529.000000 0.997920 2448530.000000 0.996663 2448531.000000 0.995112 2448532.000000 0.993266 2448533.000000 0.991126 2448534.000000 0.988693 2448535.000000 0.985967 2448536.000000 0.982950 2448537.000000 0.979641 2448538.000000 0.976043 2448539.000000 0.972156 2448540.000000 0.967981 2448541.000000 0.963520 2448542.000000 0.958774 2448543.000000 0.953744 2448544.000000 0.948432 2448545.000000 0.942839 2448546.000000 0.936967 2448547.000000 0.930818 2448548.000000 0.924393 2448549.000000 0.917695 2448550.000000 0.910725 2448551.000000 0.903486 2448552.000000 0.895979 2448553.000000 0.888208 2448554.000000 0.880173 2448555.000000 0.871878 2448556.000000 0.863325 2448557.000000 0.854517 2448558.000000 0.845455 2448559.000000 0.836144 2448560.000000 0.826585 2448561.000000 0.816781 2448562.000000 0.806736 2448563.000000 0.796452 2448564.000000 0.785932 2448565.000000 0.775180 2448566.000000 0.764198 2448567.000000 0.752991 2448568.000000 0.741560 2448569.000000 0.729910 2448570.000000 0.718044 2448571.000000 0.705965 2448572.000000 0.693678 2448573.000000 0.681185 2448574.000000 0.668491 2448575.000000 0.655599 2448576.000000 0.642513 2448577.000000 0.629237 2448578.000000 0.615774 2448579.000000 0.602130 2448580.000000 0.588307 2448581.000000 0.574310 2448582.000000 0.560143 2448583.000000 0.545811 2448584.000000 0.531317 2448585.000000 0.516665 2448586.000000 0.501861 2448587.000000 0.486908 2448588.000000 0.471812 2448589.000000 0.456575 2448590.000000 0.441204 2448591.000000 0.425701 2448592.000000 0.410073 2448593.000000 0.394324 2448594.000000 0.378458 2448595.000000 0.362480 2448596.000000 0.346394 2448597.000000 0.330207 2448598.000000 0.313921 2448599.000000 0.297543 2448600.000000 0.281076 2448601.000000 0.264526 2448602.000000 0.247898 2448603.000000 0.231197 2448604.000000 0.214427 2448605.000000 0.197594 2448606.000000 0.180702 2448607.000000 0.163757 2448608.000000 0.146764 2448609.000000 0.129727 2448610.000000 0.112651 2448611.000000 0.095543 2448612.000000 0.078406 2448613.000000 0.061245 2448614.000000 0.044067 2448615.000000 0.026876 2448616.000000 0.009676 2448617.000000 -0.007526 2448618.000000 -0.024726 2448619.000000 -0.041919 2448620.000000 -0.059099 2448621.000000 -0.076262 2448622.000000 -0.093402 2448623.000000 -0.110514 2448624.000000 -0.127594 2448625.000000 -0.144636 2448626.000000 -0.161636 2448627.000000 -0.178587 2448628.000000 -0.195486 2448629.000000 -0.212327 2448630.000000 -0.229104 2448631.000000 -0.245815 2448632.000000 -0.262452 2448633.000000 -0.279012 2448634.000000 -0.295489 2448635.000000 -0.311879 2448636.000000 -0.328176 2448637.000000 -0.344376 2448638.000000 -0.360475 2448639.000000 -0.376467 2448640.000000 -0.392347 2448641.000000 -0.408111 2448642.000000 -0.423755 2448643.000000 -0.439273 2448644.000000 -0.454661 2448645.000000 -0.469915 2448646.000000 -0.485029 2448647.000000 -0.500000 2448648.000000 -0.514823 2448649.000000 -0.529494 2448650.000000 -0.544008 2448651.000000 -0.558361 2448652.000000 -0.572548 2448653.000000 -0.586567 2448654.000000 -0.600412 2448655.000000 -0.614079 2448656.000000 -0.627564 2448657.000000 -0.640864 2448658.000000 -0.653974 2448659.000000 -0.666890 2448660.000000 -0.679610 2448661.000000 -0.692128 2448662.000000 -0.704441 2448663.000000 -0.716546 2448664.000000 -0.728438 2448665.000000 -0.740116 2448666.000000 -0.751574 2448667.000000 -0.762810 2448668.000000 -0.773820 2448669.000000 -0.784601 2448670.000000 -0.795150 2448671.000000 -0.805463 2448672.000000 -0.815539 2448673.000000 -0.825373 2448674.000000 -0.834962 2448675.000000 -0.844305 2448676.000000 -0.853398 2448677.000000 -0.862238 2448678.000000 -0.870823 2448679.000000 -0.879150 2448680.000000 -0.887218 2448681.000000 -0.895022 2448682.000000 -0.902562 2448683.000000 -0.909835 2448684.000000 -0.916838 2448685.000000 -0.923571 2448686.000000 -0.930030 2448687.000000 -0.936213 2448688.000000 -0.942120 2448689.000000 -0.947748 2448690.000000 -0.953095 2448691.000000 -0.958161 2448692.000000 -0.962943 2448693.000000 -0.967439 2448694.000000 -0.971650 2448695.000000 -0.975573 2448696.000000 -0.979208 2448697.000000 -0.982552 2448698.000000 -0.985606 2448699.000000 -0.988368 2448700.000000 -0.990838 2448701.000000 -0.993015 2448702.000000 -0.994897 2448703.000000 -0.996486 2448704.000000 -0.997779 2448705.000000 -0.998777 2448706.000000 -0.999480 2448707.000000 -0.999887 2448708.000000 -0.999998 2448709.000000 -0.999813 2448710.000000 -0.999332 2448711.000000 -0.998555 2448712.000000 -0.997483 2448713.000000 -0.996116 2448714.000000 -0.994454 2448715.000000 -0.992498 2448716.000000 -0.990248 2448717.000000 -0.987705 2448718.000000 -0.984870 2448719.000000 -0.981743 2448720.000000 -0.978326 2448721.000000 -0.974619 2448722.000000 -0.970624 2448723.000000 -0.966342 2448724.000000 -0.961774 2448725.000000 -0.956921 2448726.000000 -0.951785 2448727.000000 -0.946367 2448728.000000 -0.940669 2448729.000000 -0.934693 2448730.000000 -0.928441 2448731.000000 -0.921913 2448732.000000 -0.915113 2448733.000000 -0.908042 2448734.000000 -0.900702 2448735.000000 -0.893096 2448736.000000 -0.885225 2448737.000000 -0.877093 2448738.000000 -0.868701 2448739.000000 -0.860052 2448740.000000 -0.851148 2448741.000000 -0.841993 2448742.000000 -0.832588 2448743.000000 -0.822937 2448744.000000 -0.813042 2448745.000000 -0.802907 2448746.000000 -0.792534 2448747.000000 -0.781927 2448748.000000 -0.771089 2448749.000000 -0.760022 2448750.000000 -0.748730 2448751.000000 -0.737217 2448752.000000 -0.725485 2448753.000000 -0.713539 2448754.000000 -0.701382 2448755.000000 -0.689017 2448756.000000 -0.676448 2448757.000000 -0.663680 2448758.000000 -0.650714 2448759.000000 -0.637557 2448760.000000 -0.624210 2448761.000000 -0.610679 2448762.000000 -0.596967 2448763.000000 -0.583078 2448764.000000 -0.569017 2448765.000000 -0.554788 2448766.000000 -0.540394 2448767.000000 -0.525841 2448768.000000 -0.511131 2448769.000000 -0.496271 2448770.000000 -0.481264 2448771.000000 -0.466114 2448772.000000 -0.450826 2448773.000000 -0.435405 2448774.000000 -0.419855 2448775.000000 -0.404181 2448776.000000 -0.388388 2448777.000000 -0.372479 2448778.000000 -0.356460 2448779.000000 -0.340336 2448780.000000 -0.324111 2448781.000000 -0.307790 2448782.000000 -0.291378 2448783.000000 -0.274879 2448784.000000 -0.258300 2448785.000000 -0.241644 2448786.000000 -0.224916 2448787.000000 -0.208122 2448788.000000 -0.191266 2448789.000000 -0.174354 2448790.000000 -0.157390 2448791.000000 -0.140380 2448792.000000 -0.123328 2448793.000000 -0.106239 2448794.000000 -0.089119 2448795.000000 -0.071973 2448796.000000 -0.054805 2448797.000000 -0.037621 2448798.000000 -0.020426 2448799.000000 -0.003225 2448800.000000 0.013977 2448801.000000 0.031174 2448802.000000 0.048363 2448803.000000 0.065537 2448804.000000 0.082692 2448805.000000 0.099823 2448806.000000 0.116923 2448807.000000 0.133990 2448808.000000 0.151016 2448809.000000 0.167998 2448810.000000 0.184931 2448811.000000 0.201808 2448812.000000 0.218626 2448813.000000 0.235379 2448814.000000 0.252062 2448815.000000 0.268671 2448816.000000 0.285201 2448817.000000 0.301646 2448818.000000 0.318001 2448819.000000 0.334263 2448820.000000 0.350426 2448821.000000 0.366485 2448822.000000 0.382435 2448823.000000 0.398272 2448824.000000 0.413992 2448825.000000 0.429589 2448826.000000 0.445059 2448827.000000 0.460397 2448828.000000 0.475599 2448829.000000 0.490660 2448830.000000 0.505576 2448831.000000 0.520343 2448832.000000 0.534955 2448833.000000 0.549409 2448834.000000 0.563701 2448835.000000 0.577825 2448836.000000 0.591779 2448837.000000 0.605558 2448838.000000 0.619157 2448839.000000 0.632573 2448840.000000 0.645803 2448841.000000 0.658840 2448842.000000 0.671683 2448843.000000 0.684328 2448844.000000 0.696769 2448845.000000 0.709005 2448846.000000 0.721031 2448847.000000 0.732843 2448848.000000 0.744438 2448849.000000 0.755814 2448850.000000 0.766965 2448851.000000 0.777890 2448852.000000 0.788584 2448853.000000 0.799045 2448854.000000 0.809270 2448855.000000 0.819255 2448856.000000 0.828997 2448857.000000 0.838495 2448858.000000 0.847744 2448859.000000 0.856742 2448860.000000 0.865487 2448861.000000 0.873976 2448862.000000 0.882206 2448863.000000 0.890175 2448864.000000 0.897881 2448865.000000 0.905321 2448866.000000 0.912493 2448867.000000 0.919395 2448868.000000 0.926025 2448869.000000 0.932381 2448870.000000 0.938461 2448871.000000 0.944263 2448872.000000 0.949786 2448873.000000 0.955028 2448874.000000 0.959987 2448875.000000 0.964662 2448876.000000 0.969052 2448877.000000 0.973155 2448878.000000 0.976970 2448879.000000 0.980496 2448880.000000 0.983732 2448881.000000 0.986676 2448882.000000 0.989329 2448883.000000 0.991689 2448884.000000 0.993755 2448885.000000 0.995527 2448886.000000 0.997005 2448887.000000 0.998188 2448888.000000 0.999075 2448889.000000 0.999667 2448890.000000 0.999963 2448891.000000 0.999963 2448892.000000 0.999667 2448893.000000 0.999075 2448894.000000 0.998188 2448895.000000 0.997005 2448896.000000 0.995527 2448897.000000 0.993755 2448898.000000 0.991689 2448899.000000 0.989329 2448900.000000 0.986676 2448901.000000 0.983732 2448902.000000 0.980496 2448903.000000 0.976970 2448904.000000 0.973155 2448905.000000 0.969052 2448906.000000 0.964662 2448907.000000 0.959987 2448908.000000 0.955028 2448909.000000 0.949786 2448910.000000 0.944263 2448911.000000 0.938461 2448912.000000 0.932381 2448913.000000 0.926025 2448914.000000 0.919395 2448915.000000 0.912493 2448916.000000 0.905321 2448917.000000 0.897881 2448918.000000 0.890175 2448919.000000 0.882206 2448920.000000 0.873976 2448921.000000 0.865487 2448922.000000 0.856742 2448923.000000 0.847744 2448924.000000 0.838495 2448925.000000 0.828997 2448926.000000 0.819255 2448927.000000 0.809270 2448928.000000 0.799045 2448929.000000 0.788584 2448930.000000 0.777890 2448931.000000 0.766965 2448932.000000 0.755814 2448933.000000 0.744438 2448934.000000 0.732843 2448935.000000 0.721031 2448936.000000 0.709005 2448937.000000 0.696769 2448938.000000 0.684328 2448939.000000 0.671683 2448940.000000 0.658840 2448941.000000 0.645803 2448942.000000 0.632573 2448943.000000 0.619157 2448944.000000 0.605558 2448945.000000 0.591779 2448946.000000 0.577825 2448947.000000 0.563701 2448948.000000 0.549409 2448949.000000 0.534955 2448950.000000 0.520343 2448951.000000 0.505576 2448952.000000 0.490660 2448953.000000 0.475599 2448954.000000 0.460397 2448955.000000 0.445059 2448956.000000 0.429589 2448957.000000 0.413992 2448958.000000 0.398272 2448959.000000 0.382435 2448960.000000 0.366485 2448961.000000 0.350426 2448962.000000 0.334263 2448963.000000 0.318001 2448964.000000 0.301646 2448965.000000 0.285201 2448966.000000 0.268671 2448967.000000 0.252062 2448968.000000 0.235379 2448969.000000 0.218626 2448970.000000 0.201808 2448971.000000 0.184931 2448972.000000 0.167998 2448973.000000 0.151016 2448974.000000 0.133990 2448975.000000 0.116923 2448976.000000 0.099823 2448977.000000 0.082692 2448978.000000 0.065537 2448979.000000 0.048363 2448980.000000 0.031174 2448981.000000 0.013977 2448982.000000 -0.003225 2448983.000000 -0.020426 2448984.000000 -0.037621 2448985.000000 -0.054805 2448986.000000 -0.071973 2448987.000000 -0.089119 2448988.000000 -0.106239 2448989.000000 -0.123328 2448990.000000 -0.140380 2448991.000000 -0.157390 2448992.000000 -0.174354 2448993.000000 -0.191266 2448994.000000 -0.208122 2448995.000000 -0.224916 2448996.000000 -0.241644 2448997.000000 -0.258300 2448998.000000 -0.274879 2448999.000000 -0.291378 2449000.000000 -0.307790 2449001.000000 -0.324111 2449002.000000 -0.340336 2449003.000000 -0.356460 2449004.000000 -0.372479 2449005.000000 -0.388388 2449006.000000 -0.404181 2449007.000000 -0.419855 2449008.000000 -0.435405 2449009.000000 -0.450826 2449010.000000 -0.466114 2449011.000000 -0.481264 2449012.000000 -0.496271 2449013.000000 -0.511131 2449014.000000 -0.525841 2449015.000000 -0.540394 2449016.000000 -0.554788 2449017.000000 -0.569017 2449018.000000 -0.583078 2449019.000000 -0.596967 2449020.000000 -0.610679 2449021.000000 -0.624210 2449022.000000 -0.637557 2449023.000000 -0.650714 2449024.000000 -0.663680 2449025.000000 -0.676448 2449026.000000 -0.689017 2449027.000000 -0.701382 2449028.000000 -0.713539 2449029.000000 -0.725485 2449030.000000 -0.737217 2449031.000000 -0.748730 2449032.000000 -0.760022 2449033.000000 -0.771089 2449034.000000 -0.781927 2449035.000000 -0.792534 2449036.000000 -0.802907 2449037.000000 -0.813042 2449038.000000 -0.822937 2449039.000000 -0.832588 2449040.000000 -0.841993 2449041.000000 -0.851148 2449042.000000 -0.860052 2449043.000000 -0.868701 2449044.000000 -0.877093 2449045.000000 -0.885225 2449046.000000 -0.893096 2449047.000000 -0.900702 2449048.000000 -0.908042 2449049.000000 -0.915113 2449050.000000 -0.921913 2449051.000000 -0.928441 2449052.000000 -0.934693 2449053.000000 -0.940669 2449054.000000 -0.946367 2449055.000000 -0.951785 2449056.000000 -0.956921 2449057.000000 -0.961774 2449058.000000 -0.966342 2449059.000000 -0.970624 2449060.000000 -0.974619 2449061.000000 -0.978326 2449062.000000 -0.981743 2449063.000000 -0.984870 2449064.000000 -0.987705 2449065.000000 -0.990248 2449066.000000 -0.992498 2449067.000000 -0.994454 2449068.000000 -0.996116 2449069.000000 -0.997483 2449070.000000 -0.998555 2449071.000000 -0.999332 2449072.000000 -0.999813 2449073.000000 -0.999998 2449074.000000 -0.999887 2449075.000000 -0.999480 2449076.000000 -0.998777 2449077.000000 -0.997779 2449078.000000 -0.996486 2449079.000000 -0.994897 2449080.000000 -0.993015 2449081.000000 -0.990838 2449082.000000 -0.988368 2449083.000000 -0.985606 2449084.000000 -0.982552 2449085.000000 -0.979208 2449086.000000 -0.975573 2449087.000000 -0.971650 2449088.000000 -0.967439 2449089.000000 -0.962943 2449090.000000 -0.958161 2449091.000000 -0.953095 2449092.000000 -0.947748 2449093.000000 -0.942120 2449094.000000 -0.936213 2449095.000000 -0.930030 2449096.000000 -0.923571 2449097.000000 -0.916838 2449098.000000 -0.909835 2449099.000000 -0.902562 2449100.000000 -0.895022 2449101.000000 -0.887218 2449102.000000 -0.879150 2449103.000000 -0.870823 2449104.000000 -0.862238 2449105.000000 -0.853398 2449106.000000 -0.844305 2449107.000000 -0.834962 2449108.000000 -0.825373 2449109.000000 -0.815539 2449110.000000 -0.805463 2449111.000000 -0.795150 2449112.000000 -0.784601 2449113.000000 -0.773820 2449114.000000 -0.762810 2449115.000000 -0.751574 2449116.000000 -0.740116 2449117.000000 -0.728438 2449118.000000 -0.716546 2449119.000000 -0.704441 2449120.000000 -0.692128 2449121.000000 -0.679610 2449122.000000 -0.666890 2449123.000000 -0.653974 2449124.000000 -0.640864 2449125.000000 -0.627564 2449126.000000 -0.614079 2449127.000000 -0.600412 2449128.000000 -0.586567 2449129.000000 -0.572548 2449130.000000 -0.558361 2449131.000000 -0.544008 2449132.000000 -0.529494 2449133.000000 -0.514823 2449134.000000 -0.500000 2449135.000000 -0.485029 2449136.000000 -0.469915 2449137.000000 -0.454661 2449138.000000 -0.439273 2449139.000000 -0.423755 2449140.000000 -0.408111 2449141.000000 -0.392347 2449142.000000 -0.376467 2449143.000000 -0.360475 2449144.000000 -0.344376 2449145.000000 -0.328176 2449146.000000 -0.311879 2449147.000000 -0.295489 2449148.000000 -0.279012 2449149.000000 -0.262452 2449150.000000 -0.245815 2449151.000000 -0.229104 2449152.000000 -0.212327 2449153.000000 -0.195486 2449154.000000 -0.178587 2449155.000000 -0.161636 2449156.000000 -0.144636 2449157.000000 -0.127594 2449158.000000 -0.110514 2449159.000000 -0.093402 2449160.000000 -0.076262 2449161.000000 -0.059099 2449162.000000 -0.041919 2449163.000000 -0.024726 2449164.000000 -0.007526 2449165.000000 0.009676 2449166.000000 0.026876 2449167.000000 0.044067 2449168.000000 0.061245 2449169.000000 0.078406 2449170.000000 0.095543 2449171.000000 0.112651 2449172.000000 0.129727 2449173.000000 0.146764 2449174.000000 0.163757 2449175.000000 0.180702 2449176.000000 0.197594 2449177.000000 0.214427 2449178.000000 0.231197 2449179.000000 0.247898 2449180.000000 0.264526 2449181.000000 0.281076 2449182.000000 0.297543 2449183.000000 0.313921 2449184.000000 0.330207 2449185.000000 0.346394 2449186.000000 0.362480 2449187.000000 0.378458 2449188.000000 0.394324 2449189.000000 0.410073 2449190.000000 0.425701 2449191.000000 0.441204 2449192.000000 0.456575 2449193.000000 0.471812 2449194.000000 0.486908 2449195.000000 0.501861 2449196.000000 0.516665 2449197.000000 0.531317 2449198.000000 0.545811 2449199.000000 0.560143 2449200.000000 0.574310 2449201.000000 0.588307 2449202.000000 0.602130 2449203.000000 0.615774 2449204.000000 0.629237 2449205.000000 0.642513 2449206.000000 0.655599 2449207.000000 0.668491 2449208.000000 0.681185 2449209.000000 0.693678 2449210.000000 0.705965 2449211.000000 0.718044 2449212.000000 0.729910 2449213.000000 0.741560 2449214.000000 0.752991 2449215.000000 0.764198 2449216.000000 0.775180 2449217.000000 0.785932 2449218.000000 0.796452 2449219.000000 0.806736 2449220.000000 0.816781 2449221.000000 0.826585 2449222.000000 0.836144 2449223.000000 0.845455 2449224.000000 0.854517 2449225.000000 0.863325 2449226.000000 0.871878 2449227.000000 0.880173 2449228.000000 0.888208 2449229.000000 0.895979 2449230.000000 0.903486 & @WITH G2 @G2 ON 2448161.000000 0.999852 2448162.000000 0.999408 2448163.000000 0.998669 2448164.000000 0.997634 2448165.000000 0.996303 2448166.000000 0.994678 2448167.000000 0.992759 2448168.000000 0.990545 2448169.000000 0.988039 2448170.000000 0.985240 2448171.000000 0.982150 2448172.000000 0.978769 2448173.000000 0.975099 2448174.000000 0.971139 2448175.000000 0.966893 2448176.000000 0.962360 2448177.000000 0.957543 2448178.000000 0.952442 2448179.000000 0.947060 2448180.000000 0.941397 2448181.000000 0.935455 2448182.000000 0.929237 2448183.000000 0.922744 2448184.000000 0.915978 2448185.000000 0.908940 2448186.000000 0.901634 2448187.000000 0.894061 2448188.000000 0.886224 2448189.000000 0.878124 2448190.000000 0.869764 2448191.000000 0.861147 2448192.000000 0.852275 2448193.000000 0.843151 2448194.000000 0.833777 2448195.000000 0.824157 2448196.000000 0.814292 2448197.000000 0.804187 2448198.000000 0.793844 2448199.000000 0.783266 2448200.000000 0.772456 2448201.000000 0.761418 2448202.000000 0.750154 2448203.000000 0.738668 2448204.000000 0.726964 2448205.000000 0.715044 2448206.000000 0.702913 2448207.000000 0.690574 2448208.000000 0.678031 2448209.000000 0.665287 2448210.000000 0.652346 2448211.000000 0.639212 2448212.000000 0.625889 2448213.000000 0.612380 2448214.000000 0.598691 2448215.000000 0.584824 2448216.000000 0.570784 2448217.000000 0.556576 2448218.000000 0.542202 2448219.000000 0.527668 2448220.000000 0.512978 2448221.000000 0.498137 2448222.000000 0.483147 2448223.000000 0.468015 2448224.000000 0.452745 2448225.000000 0.437340 2448226.000000 0.421806 2448227.000000 0.406147 2448228.000000 0.390368 2448229.000000 0.374474 2448230.000000 0.358468 2448231.000000 0.342357 2448232.000000 0.326144 2448233.000000 0.309835 2448234.000000 0.293434 2448235.000000 0.276946 2448236.000000 0.260376 2448237.000000 0.243730 2448238.000000 0.227011 2448239.000000 0.210225 2448240.000000 0.193376 2448241.000000 0.176471 2448242.000000 0.159513 2448243.000000 0.142508 2448244.000000 0.125461 2448245.000000 0.108377 2448246.000000 0.091261 2448247.000000 0.074117 2448248.000000 0.056952 2448249.000000 0.039770 2448250.000000 0.022576 2448251.000000 0.005376 2448252.000000 -0.011826 2448253.000000 -0.029025 2448254.000000 -0.046215 2448255.000000 -0.063391 2448256.000000 -0.080549 2448257.000000 -0.097683 2448258.000000 -0.114788 2448259.000000 -0.131859 2448260.000000 -0.148890 2448261.000000 -0.165878 2448262.000000 -0.182817 2448263.000000 -0.199702 2448264.000000 -0.216527 2448265.000000 -0.233289 2448266.000000 -0.249981 2448267.000000 -0.266599 2448268.000000 -0.283139 2448269.000000 -0.299595 2448270.000000 -0.315962 2448271.000000 -0.332235 2448272.000000 -0.348411 2448273.000000 -0.364483 2448274.000000 -0.380447 2448275.000000 -0.396299 2448276.000000 -0.412034 2448277.000000 -0.427646 2448278.000000 -0.443132 2448279.000000 -0.458487 2448280.000000 -0.473706 2448281.000000 -0.488785 2448282.000000 -0.503720 2448283.000000 -0.518505 2448284.000000 -0.533137 2448285.000000 -0.547611 2448286.000000 -0.561923 2448287.000000 -0.576069 2448288.000000 -0.590044 2448289.000000 -0.603845 2448290.000000 -0.617467 2448291.000000 -0.630907 2448292.000000 -0.644159 2448293.000000 -0.657221 2448294.000000 -0.670089 2448295.000000 -0.682758 2448296.000000 -0.695225 2448297.000000 -0.707487 2448298.000000 -0.719539 2448299.000000 -0.731378 2448300.000000 -0.743001 2448301.000000 -0.754404 2448302.000000 -0.765584 2448303.000000 -0.776537 2448304.000000 -0.787260 2448305.000000 -0.797750 2448306.000000 -0.808005 2448307.000000 -0.818020 2448308.000000 -0.827793 2448309.000000 -0.837321 2448310.000000 -0.846602 2448311.000000 -0.855631 2448312.000000 -0.864408 2448313.000000 -0.872929 2448314.000000 -0.881192 2448315.000000 -0.889193 2448316.000000 -0.896932 2448317.000000 -0.904405 2448318.000000 -0.911611 2448319.000000 -0.918547 2448320.000000 -0.925211 2448321.000000 -0.931601 2448322.000000 -0.937716 2448323.000000 -0.943553 2448324.000000 -0.949111 2448325.000000 -0.954388 2448326.000000 -0.959383 2448327.000000 -0.964094 2448328.000000 -0.968519 2448329.000000 -0.972658 2448330.000000 -0.976509 2448331.000000 -0.980071 2448332.000000 -0.983343 2448333.000000 -0.986324 2448334.000000 -0.989013 2448335.000000 -0.991410 2448336.000000 -0.993513 2448337.000000 -0.995322 2448338.000000 -0.996837 2448339.000000 -0.998056 2448340.000000 -0.998981 2448341.000000 -0.999609 2448342.000000 -0.999942 2448343.000000 -0.999979 2448344.000000 -0.999720 2448345.000000 -0.999166 2448346.000000 -0.998315 2448347.000000 -0.997169 2448348.000000 -0.995728 2448349.000000 -0.993993 2448350.000000 -0.991963 2448351.000000 -0.989640 2448352.000000 -0.987024 2448353.000000 -0.984116 2448354.000000 -0.980916 2448355.000000 -0.977426 2448356.000000 -0.973648 2448357.000000 -0.969581 2448358.000000 -0.965227 2448359.000000 -0.960587 2448360.000000 -0.955663 2448361.000000 -0.950457 2448362.000000 -0.944969 2448363.000000 -0.939201 2448364.000000 -0.933156 2448365.000000 -0.926834 2448366.000000 -0.920239 2448367.000000 -0.913370 2448368.000000 -0.906232 2448369.000000 -0.898825 2448370.000000 -0.891153 2448371.000000 -0.883217 2448372.000000 -0.875019 2448373.000000 -0.866562 2448374.000000 -0.857849 2448375.000000 -0.848883 2448376.000000 -0.839665 2448377.000000 -0.830198 2448378.000000 -0.820486 2448379.000000 -0.810531 2448380.000000 -0.800336 2448381.000000 -0.789905 2448382.000000 -0.779239 2448383.000000 -0.768343 2448384.000000 -0.757220 2448385.000000 -0.745872 2448386.000000 -0.734304 2448387.000000 -0.722519 2448388.000000 -0.710520 2448389.000000 -0.698310 2448390.000000 -0.685894 2448391.000000 -0.673275 2448392.000000 -0.660457 2448393.000000 -0.647443 2448394.000000 -0.634237 2448395.000000 -0.620844 2448396.000000 -0.607268 2448397.000000 -0.593511 2448398.000000 -0.579579 2448399.000000 -0.565476 2448400.000000 -0.551205 2448401.000000 -0.536771 2448402.000000 -0.522178 2448403.000000 -0.507430 2448404.000000 -0.492533 2448405.000000 -0.477489 2448406.000000 -0.462305 2448407.000000 -0.446983 2448408.000000 -0.431530 2448409.000000 -0.415948 2448410.000000 -0.400244 2448411.000000 -0.384421 2448412.000000 -0.368484 2448413.000000 -0.352439 2448414.000000 -0.336289 2448415.000000 -0.320039 2448416.000000 -0.303695 2448417.000000 -0.287261 2448418.000000 -0.270742 2448419.000000 -0.254143 2448420.000000 -0.237468 2448421.000000 -0.220724 2448422.000000 -0.203914 2448423.000000 -0.187043 2448424.000000 -0.170118 2448425.000000 -0.153142 2448426.000000 -0.136120 2448427.000000 -0.119059 2448428.000000 -0.101962 2448429.000000 -0.084835 2448430.000000 -0.067683 2448431.000000 -0.050511 2448432.000000 -0.033324 2448433.000000 -0.016127 2448434.000000 0.001075 2448435.000000 0.018277 2448436.000000 0.035473 2448437.000000 0.052658 2448438.000000 0.069828 2448439.000000 0.086977 2448440.000000 0.104101 2448441.000000 0.121193 2448442.000000 0.138250 2448443.000000 0.155266 2448444.000000 0.172236 2448445.000000 0.189155 2448446.000000 0.206018 2448447.000000 0.222820 2448448.000000 0.239557 2448449.000000 0.256222 2448450.000000 0.272811 2448451.000000 0.289320 2448452.000000 0.305743 2448453.000000 0.322076 2448454.000000 0.338313 2448455.000000 0.354450 2448456.000000 0.370483 2448457.000000 0.386405 2448458.000000 0.402214 2448459.000000 0.417903 2448460.000000 0.433469 2448461.000000 0.448906 2448462.000000 0.464210 2448463.000000 0.479378 2448464.000000 0.494403 2448465.000000 0.509282 2448466.000000 0.524010 2448467.000000 0.538584 2448468.000000 0.552997 2448469.000000 0.567248 2448470.000000 0.581330 2448471.000000 0.595240 2448472.000000 0.608975 2448473.000000 0.622529 2448474.000000 0.635898 2448475.000000 0.649080 2448476.000000 0.662070 2448477.000000 0.674863 2448478.000000 0.687457 2448479.000000 0.699848 2448480.000000 0.712031 2448481.000000 0.724004 2448482.000000 0.735762 2448483.000000 0.747303 2448484.000000 0.758623 2448485.000000 0.769718 2448486.000000 0.780585 2448487.000000 0.791221 2448488.000000 0.801624 2448489.000000 0.811789 2448490.000000 0.821713 2448491.000000 0.831395 2448492.000000 0.840831 2448493.000000 0.850017 2448494.000000 0.858953 2448495.000000 0.867634 2448496.000000 0.876058 2448497.000000 0.884223 2448498.000000 0.892126 2448499.000000 0.899766 2448500.000000 0.907139 2448501.000000 0.914244 2448502.000000 0.921078 2448503.000000 0.927640 2448504.000000 0.933927 2448505.000000 0.939938 2448506.000000 0.945670 2448507.000000 0.951123 2448508.000000 0.956294 2448509.000000 0.961183 2448510.000000 0.965787 2448511.000000 0.970105 2448512.000000 0.974136 2448513.000000 0.977879 2448514.000000 0.981332 2448515.000000 0.984495 2448516.000000 0.987367 2448517.000000 0.989946 2448518.000000 0.992233 2448519.000000 0.994226 2448520.000000 0.995925 2448521.000000 0.997329 2448522.000000 0.998438 2448523.000000 0.999251 2448524.000000 0.999769 2448525.000000 0.999991 2448526.000000 0.999917 2448527.000000 0.999547 2448528.000000 0.998881 2448529.000000 0.997920 2448530.000000 0.996663 2448531.000000 0.995112 2448532.000000 0.993266 2448533.000000 0.991126 2448534.000000 0.988693 2448535.000000 0.985967 2448536.000000 0.982950 2448537.000000 0.979641 2448538.000000 0.976043 2448539.000000 0.972156 2448540.000000 0.967981 2448541.000000 0.963520 2448542.000000 0.958774 2448543.000000 0.953744 2448544.000000 0.948432 2448545.000000 0.942839 2448546.000000 0.936967 2448547.000000 0.930818 2448548.000000 0.924393 2448549.000000 0.917695 2448550.000000 0.910725 2448551.000000 0.903486 2448552.000000 0.895979 2448553.000000 0.888208 2448554.000000 0.880173 2448555.000000 0.871878 2448556.000000 0.863325 2448557.000000 0.854517 2448558.000000 0.845455 2448559.000000 0.836144 2448560.000000 0.826585 2448561.000000 0.816781 2448562.000000 0.806736 2448563.000000 0.796452 2448564.000000 0.785932 2448565.000000 0.775180 2448566.000000 0.764198 2448567.000000 0.752991 2448568.000000 0.741560 2448569.000000 0.729910 2448570.000000 0.718044 2448571.000000 0.705965 2448572.000000 0.693678 2448573.000000 0.681185 2448574.000000 0.668491 2448575.000000 0.655599 2448576.000000 0.642513 2448577.000000 0.629237 2448578.000000 0.615774 2448579.000000 0.602130 2448580.000000 0.588307 2448581.000000 0.574310 2448582.000000 0.560143 2448583.000000 0.545811 2448584.000000 0.531317 2448585.000000 0.516665 2448586.000000 0.501861 2448587.000000 0.486908 2448588.000000 0.471812 2448589.000000 0.456575 2448590.000000 0.441204 2448591.000000 0.425701 2448592.000000 0.410073 2448593.000000 0.394324 2448594.000000 0.378458 2448595.000000 0.362480 2448596.000000 0.346394 2448597.000000 0.330207 2448598.000000 0.313921 2448599.000000 0.297543 2448600.000000 0.281076 2448601.000000 0.264526 2448602.000000 0.247898 2448603.000000 0.231197 2448604.000000 0.214427 2448605.000000 0.197594 2448606.000000 0.180702 2448607.000000 0.163757 2448608.000000 0.146764 2448609.000000 0.129727 2448610.000000 0.112651 2448611.000000 0.095543 2448612.000000 0.078406 2448613.000000 0.061245 2448614.000000 0.044067 2448615.000000 0.026876 2448616.000000 0.009676 2448617.000000 -0.007526 2448618.000000 -0.024726 2448619.000000 -0.041919 2448620.000000 -0.059099 2448621.000000 -0.076262 2448622.000000 -0.093402 2448623.000000 -0.110514 2448624.000000 -0.127594 2448625.000000 -0.144636 2448626.000000 -0.161636 2448627.000000 -0.178587 2448628.000000 -0.195486 2448629.000000 -0.212327 2448630.000000 -0.229104 2448631.000000 -0.245815 2448632.000000 -0.262452 2448633.000000 -0.279012 2448634.000000 -0.295489 2448635.000000 -0.311879 2448636.000000 -0.328176 2448637.000000 -0.344376 2448638.000000 -0.360475 2448639.000000 -0.376467 2448640.000000 -0.392347 2448641.000000 -0.408111 2448642.000000 -0.423755 2448643.000000 -0.439273 2448644.000000 -0.454661 2448645.000000 -0.469915 2448646.000000 -0.485029 2448647.000000 -0.500000 2448648.000000 -0.514823 2448649.000000 -0.529494 2448650.000000 -0.544008 2448651.000000 -0.558361 2448652.000000 -0.572548 2448653.000000 -0.586567 2448654.000000 -0.600412 2448655.000000 -0.614079 2448656.000000 -0.627564 2448657.000000 -0.640864 2448658.000000 -0.653974 2448659.000000 -0.666890 2448660.000000 -0.679610 2448661.000000 -0.692128 2448662.000000 -0.704441 2448663.000000 -0.716546 2448664.000000 -0.728438 2448665.000000 -0.740116 2448666.000000 -0.751574 2448667.000000 -0.762810 2448668.000000 -0.773820 2448669.000000 -0.784601 2448670.000000 -0.795150 2448671.000000 -0.805463 2448672.000000 -0.815539 2448673.000000 -0.825373 2448674.000000 -0.834962 2448675.000000 -0.844305 2448676.000000 -0.853398 2448677.000000 -0.862238 2448678.000000 -0.870823 2448679.000000 -0.879150 2448680.000000 -0.887218 2448681.000000 -0.895022 2448682.000000 -0.902562 2448683.000000 -0.909835 2448684.000000 -0.916838 2448685.000000 -0.923571 2448686.000000 -0.930030 2448687.000000 -0.936213 2448688.000000 -0.942120 2448689.000000 -0.947748 2448690.000000 -0.953095 2448691.000000 -0.958161 2448692.000000 -0.962943 2448693.000000 -0.967439 2448694.000000 -0.971650 2448695.000000 -0.975573 2448696.000000 -0.979208 2448697.000000 -0.982552 2448698.000000 -0.985606 2448699.000000 -0.988368 2448700.000000 -0.990838 2448701.000000 -0.993015 2448702.000000 -0.994897 2448703.000000 -0.996486 2448704.000000 -0.997779 2448705.000000 -0.998777 2448706.000000 -0.999480 2448707.000000 -0.999887 2448708.000000 -0.999998 2448709.000000 -0.999813 2448710.000000 -0.999332 2448711.000000 -0.998555 2448712.000000 -0.997483 2448713.000000 -0.996116 2448714.000000 -0.994454 2448715.000000 -0.992498 2448716.000000 -0.990248 2448717.000000 -0.987705 2448718.000000 -0.984870 2448719.000000 -0.981743 2448720.000000 -0.978326 2448721.000000 -0.974619 2448722.000000 -0.970624 2448723.000000 -0.966342 2448724.000000 -0.961774 2448725.000000 -0.956921 2448726.000000 -0.951785 2448727.000000 -0.946367 2448728.000000 -0.940669 2448729.000000 -0.934693 2448730.000000 -0.928441 2448731.000000 -0.921913 2448732.000000 -0.915113 2448733.000000 -0.908042 2448734.000000 -0.900702 2448735.000000 -0.893096 2448736.000000 -0.885225 2448737.000000 -0.877093 2448738.000000 -0.868701 2448739.000000 -0.860052 2448740.000000 -0.851148 2448741.000000 -0.841993 2448742.000000 -0.832588 2448743.000000 -0.822937 2448744.000000 -0.813042 2448745.000000 -0.802907 2448746.000000 -0.792534 2448747.000000 -0.781927 2448748.000000 -0.771089 2448749.000000 -0.760022 2448750.000000 -0.748730 2448751.000000 -0.737217 2448752.000000 -0.725485 2448753.000000 -0.713539 2448754.000000 -0.701382 2448755.000000 -0.689017 2448756.000000 -0.676448 2448757.000000 -0.663680 2448758.000000 -0.650714 2448759.000000 -0.637557 2448760.000000 -0.624210 2448761.000000 -0.610679 2448762.000000 -0.596967 2448763.000000 -0.583078 2448764.000000 -0.569017 2448765.000000 -0.554788 2448766.000000 -0.540394 2448767.000000 -0.525841 2448768.000000 -0.511131 2448769.000000 -0.496271 2448770.000000 -0.481264 2448771.000000 -0.466114 2448772.000000 -0.450826 2448773.000000 -0.435405 2448774.000000 -0.419855 2448775.000000 -0.404181 2448776.000000 -0.388388 2448777.000000 -0.372479 2448778.000000 -0.356460 2448779.000000 -0.340336 2448780.000000 -0.324111 2448781.000000 -0.307790 2448782.000000 -0.291378 2448783.000000 -0.274879 2448784.000000 -0.258300 2448785.000000 -0.241644 2448786.000000 -0.224916 2448787.000000 -0.208122 2448788.000000 -0.191266 2448789.000000 -0.174354 2448790.000000 -0.157390 2448791.000000 -0.140380 2448792.000000 -0.123328 2448793.000000 -0.106239 2448794.000000 -0.089119 2448795.000000 -0.071973 2448796.000000 -0.054805 2448797.000000 -0.037621 2448798.000000 -0.020426 2448799.000000 -0.003225 2448800.000000 0.013977 2448801.000000 0.031174 2448802.000000 0.048363 2448803.000000 0.065537 2448804.000000 0.082692 2448805.000000 0.099823 2448806.000000 0.116923 2448807.000000 0.133990 2448808.000000 0.151016 2448809.000000 0.167998 2448810.000000 0.184931 2448811.000000 0.201808 2448812.000000 0.218626 2448813.000000 0.235379 2448814.000000 0.252062 2448815.000000 0.268671 2448816.000000 0.285201 2448817.000000 0.301646 2448818.000000 0.318001 2448819.000000 0.334263 2448820.000000 0.350426 2448821.000000 0.366485 2448822.000000 0.382435 2448823.000000 0.398272 2448824.000000 0.413992 2448825.000000 0.429589 2448826.000000 0.445059 2448827.000000 0.460397 2448828.000000 0.475599 2448829.000000 0.490660 2448830.000000 0.505576 2448831.000000 0.520343 2448832.000000 0.534955 2448833.000000 0.549409 2448834.000000 0.563701 2448835.000000 0.577825 2448836.000000 0.591779 2448837.000000 0.605558 2448838.000000 0.619157 2448839.000000 0.632573 2448840.000000 0.645803 2448841.000000 0.658840 2448842.000000 0.671683 2448843.000000 0.684328 2448844.000000 0.696769 2448845.000000 0.709005 2448846.000000 0.721031 2448847.000000 0.732843 2448848.000000 0.744438 2448849.000000 0.755814 2448850.000000 0.766965 2448851.000000 0.777890 2448852.000000 0.788584 2448853.000000 0.799045 2448854.000000 0.809270 2448855.000000 0.819255 2448856.000000 0.828997 2448857.000000 0.838495 2448858.000000 0.847744 2448859.000000 0.856742 2448860.000000 0.865487 2448861.000000 0.873976 2448862.000000 0.882206 2448863.000000 0.890175 2448864.000000 0.897881 2448865.000000 0.905321 2448866.000000 0.912493 2448867.000000 0.919395 2448868.000000 0.926025 2448869.000000 0.932381 2448870.000000 0.938461 2448871.000000 0.944263 2448872.000000 0.949786 2448873.000000 0.955028 2448874.000000 0.959987 2448875.000000 0.964662 2448876.000000 0.969052 2448877.000000 0.973155 2448878.000000 0.976970 2448879.000000 0.980496 2448880.000000 0.983732 2448881.000000 0.986676 2448882.000000 0.989329 2448883.000000 0.991689 2448884.000000 0.993755 2448885.000000 0.995527 2448886.000000 0.997005 2448887.000000 0.998188 2448888.000000 0.999075 2448889.000000 0.999667 2448890.000000 0.999963 2448891.000000 0.999963 2448892.000000 0.999667 2448893.000000 0.999075 2448894.000000 0.998188 2448895.000000 0.997005 2448896.000000 0.995527 2448897.000000 0.993755 2448898.000000 0.991689 2448899.000000 0.989329 2448900.000000 0.986676 2448901.000000 0.983732 2448902.000000 0.980496 2448903.000000 0.976970 2448904.000000 0.973155 2448905.000000 0.969052 2448906.000000 0.964662 2448907.000000 0.959987 2448908.000000 0.955028 2448909.000000 0.949786 2448910.000000 0.944263 2448911.000000 0.938461 2448912.000000 0.932381 2448913.000000 0.926025 2448914.000000 0.919395 2448915.000000 0.912493 2448916.000000 0.905321 2448917.000000 0.897881 2448918.000000 0.890175 2448919.000000 0.882206 2448920.000000 0.873976 2448921.000000 0.865487 2448922.000000 0.856742 2448923.000000 0.847744 2448924.000000 0.838495 2448925.000000 0.828997 2448926.000000 0.819255 2448927.000000 0.809270 2448928.000000 0.799045 2448929.000000 0.788584 2448930.000000 0.777890 2448931.000000 0.766965 2448932.000000 0.755814 2448933.000000 0.744438 2448934.000000 0.732843 2448935.000000 0.721031 2448936.000000 0.709005 2448937.000000 0.696769 2448938.000000 0.684328 2448939.000000 0.671683 2448940.000000 0.658840 2448941.000000 0.645803 2448942.000000 0.632573 2448943.000000 0.619157 2448944.000000 0.605558 2448945.000000 0.591779 2448946.000000 0.577825 2448947.000000 0.563701 2448948.000000 0.549409 2448949.000000 0.534955 2448950.000000 0.520343 2448951.000000 0.505576 2448952.000000 0.490660 2448953.000000 0.475599 2448954.000000 0.460397 2448955.000000 0.445059 2448956.000000 0.429589 2448957.000000 0.413992 2448958.000000 0.398272 2448959.000000 0.382435 2448960.000000 0.366485 2448961.000000 0.350426 2448962.000000 0.334263 2448963.000000 0.318001 2448964.000000 0.301646 2448965.000000 0.285201 2448966.000000 0.268671 2448967.000000 0.252062 2448968.000000 0.235379 2448969.000000 0.218626 2448970.000000 0.201808 2448971.000000 0.184931 2448972.000000 0.167998 2448973.000000 0.151016 2448974.000000 0.133990 2448975.000000 0.116923 2448976.000000 0.099823 2448977.000000 0.082692 2448978.000000 0.065537 2448979.000000 0.048363 2448980.000000 0.031174 2448981.000000 0.013977 2448982.000000 -0.003225 2448983.000000 -0.020426 2448984.000000 -0.037621 2448985.000000 -0.054805 2448986.000000 -0.071973 2448987.000000 -0.089119 2448988.000000 -0.106239 2448989.000000 -0.123328 2448990.000000 -0.140380 2448991.000000 -0.157390 2448992.000000 -0.174354 2448993.000000 -0.191266 2448994.000000 -0.208122 2448995.000000 -0.224916 2448996.000000 -0.241644 2448997.000000 -0.258300 2448998.000000 -0.274879 2448999.000000 -0.291378 2449000.000000 -0.307790 2449001.000000 -0.324111 2449002.000000 -0.340336 2449003.000000 -0.356460 2449004.000000 -0.372479 2449005.000000 -0.388388 2449006.000000 -0.404181 2449007.000000 -0.419855 2449008.000000 -0.435405 2449009.000000 -0.450826 2449010.000000 -0.466114 2449011.000000 -0.481264 2449012.000000 -0.496271 2449013.000000 -0.511131 2449014.000000 -0.525841 2449015.000000 -0.540394 2449016.000000 -0.554788 2449017.000000 -0.569017 2449018.000000 -0.583078 2449019.000000 -0.596967 2449020.000000 -0.610679 2449021.000000 -0.624210 2449022.000000 -0.637557 2449023.000000 -0.650714 2449024.000000 -0.663680 2449025.000000 -0.676448 2449026.000000 -0.689017 2449027.000000 -0.701382 2449028.000000 -0.713539 2449029.000000 -0.725485 2449030.000000 -0.737217 2449031.000000 -0.748730 2449032.000000 -0.760022 2449033.000000 -0.771089 2449034.000000 -0.781927 2449035.000000 -0.792534 2449036.000000 -0.802907 2449037.000000 -0.813042 2449038.000000 -0.822937 2449039.000000 -0.832588 2449040.000000 -0.841993 2449041.000000 -0.851148 2449042.000000 -0.860052 2449043.000000 -0.868701 2449044.000000 -0.877093 2449045.000000 -0.885225 2449046.000000 -0.893096 2449047.000000 -0.900702 2449048.000000 -0.908042 2449049.000000 -0.915113 2449050.000000 -0.921913 2449051.000000 -0.928441 2449052.000000 -0.934693 2449053.000000 -0.940669 2449054.000000 -0.946367 2449055.000000 -0.951785 2449056.000000 -0.956921 2449057.000000 -0.961774 2449058.000000 -0.966342 2449059.000000 -0.970624 2449060.000000 -0.974619 2449061.000000 -0.978326 2449062.000000 -0.981743 2449063.000000 -0.984870 2449064.000000 -0.987705 2449065.000000 -0.990248 2449066.000000 -0.992498 2449067.000000 -0.994454 2449068.000000 -0.996116 2449069.000000 -0.997483 2449070.000000 -0.998555 2449071.000000 -0.999332 2449072.000000 -0.999813 2449073.000000 -0.999998 2449074.000000 -0.999887 2449075.000000 -0.999480 2449076.000000 -0.998777 2449077.000000 -0.997779 2449078.000000 -0.996486 2449079.000000 -0.994897 2449080.000000 -0.993015 2449081.000000 -0.990838 2449082.000000 -0.988368 2449083.000000 -0.985606 2449084.000000 -0.982552 2449085.000000 -0.979208 2449086.000000 -0.975573 2449087.000000 -0.971650 2449088.000000 -0.967439 2449089.000000 -0.962943 2449090.000000 -0.958161 2449091.000000 -0.953095 2449092.000000 -0.947748 2449093.000000 -0.942120 2449094.000000 -0.936213 2449095.000000 -0.930030 2449096.000000 -0.923571 2449097.000000 -0.916838 2449098.000000 -0.909835 2449099.000000 -0.902562 2449100.000000 -0.895022 2449101.000000 -0.887218 2449102.000000 -0.879150 2449103.000000 -0.870823 2449104.000000 -0.862238 2449105.000000 -0.853398 2449106.000000 -0.844305 2449107.000000 -0.834962 2449108.000000 -0.825373 2449109.000000 -0.815539 2449110.000000 -0.805463 2449111.000000 -0.795150 2449112.000000 -0.784601 2449113.000000 -0.773820 2449114.000000 -0.762810 2449115.000000 -0.751574 2449116.000000 -0.740116 2449117.000000 -0.728438 2449118.000000 -0.716546 2449119.000000 -0.704441 2449120.000000 -0.692128 2449121.000000 -0.679610 2449122.000000 -0.666890 2449123.000000 -0.653974 2449124.000000 -0.640864 2449125.000000 -0.627564 2449126.000000 -0.614079 2449127.000000 -0.600412 2449128.000000 -0.586567 2449129.000000 -0.572548 2449130.000000 -0.558361 2449131.000000 -0.544008 2449132.000000 -0.529494 2449133.000000 -0.514823 2449134.000000 -0.500000 2449135.000000 -0.485029 2449136.000000 -0.469915 2449137.000000 -0.454661 2449138.000000 -0.439273 2449139.000000 -0.423755 2449140.000000 -0.408111 2449141.000000 -0.392347 2449142.000000 -0.376467 2449143.000000 -0.360475 2449144.000000 -0.344376 2449145.000000 -0.328176 2449146.000000 -0.311879 2449147.000000 -0.295489 2449148.000000 -0.279012 2449149.000000 -0.262452 2449150.000000 -0.245815 2449151.000000 -0.229104 2449152.000000 -0.212327 2449153.000000 -0.195486 2449154.000000 -0.178587 2449155.000000 -0.161636 2449156.000000 -0.144636 2449157.000000 -0.127594 2449158.000000 -0.110514 2449159.000000 -0.093402 2449160.000000 -0.076262 2449161.000000 -0.059099 2449162.000000 -0.041919 2449163.000000 -0.024726 2449164.000000 -0.007526 2449165.000000 0.009676 2449166.000000 0.026876 2449167.000000 0.044067 2449168.000000 0.061245 2449169.000000 0.078406 2449170.000000 0.095543 2449171.000000 0.112651 2449172.000000 0.129727 2449173.000000 0.146764 2449174.000000 0.163757 2449175.000000 0.180702 2449176.000000 0.197594 2449177.000000 0.214427 2449178.000000 0.231197 2449179.000000 0.247898 2449180.000000 0.264526 2449181.000000 0.281076 2449182.000000 0.297543 2449183.000000 0.313921 2449184.000000 0.330207 2449185.000000 0.346394 2449186.000000 0.362480 2449187.000000 0.378458 2449188.000000 0.394324 2449189.000000 0.410073 2449190.000000 0.425701 2449191.000000 0.441204 2449192.000000 0.456575 2449193.000000 0.471812 2449194.000000 0.486908 2449195.000000 0.501861 2449196.000000 0.516665 2449197.000000 0.531317 2449198.000000 0.545811 2449199.000000 0.560143 2449200.000000 0.574310 2449201.000000 0.588307 2449202.000000 0.602130 2449203.000000 0.615774 2449204.000000 0.629237 2449205.000000 0.642513 2449206.000000 0.655599 2449207.000000 0.668491 2449208.000000 0.681185 2449209.000000 0.693678 2449210.000000 0.705965 2449211.000000 0.718044 2449212.000000 0.729910 2449213.000000 0.741560 2449214.000000 0.752991 2449215.000000 0.764198 2449216.000000 0.775180 2449217.000000 0.785932 2449218.000000 0.796452 2449219.000000 0.806736 2449220.000000 0.816781 2449221.000000 0.826585 2449222.000000 0.836144 2449223.000000 0.845455 2449224.000000 0.854517 2449225.000000 0.863325 2449226.000000 0.871878 2449227.000000 0.880173 2449228.000000 0.888208 2449229.000000 0.895979 2449230.000000 0.903486 & @WITH G3 @G3 ON 2448161.000000 0.999852 2448162.000000 0.999408 2448163.000000 0.998669 2448164.000000 0.997634 2448165.000000 0.996303 2448166.000000 0.994678 2448167.000000 0.992759 2448168.000000 0.990545 2448169.000000 0.988039 2448170.000000 0.985240 2448171.000000 0.982150 2448172.000000 0.978769 2448173.000000 0.975099 2448174.000000 0.971139 2448175.000000 0.966893 2448176.000000 0.962360 2448177.000000 0.957543 2448178.000000 0.952442 2448179.000000 0.947060 2448180.000000 0.941397 2448181.000000 0.935455 2448182.000000 0.929237 2448183.000000 0.922744 2448184.000000 0.915978 2448185.000000 0.908940 2448186.000000 0.901634 2448187.000000 0.894061 2448188.000000 0.886224 2448189.000000 0.878124 2448190.000000 0.869764 2448191.000000 0.861147 2448192.000000 0.852275 2448193.000000 0.843151 2448194.000000 0.833777 2448195.000000 0.824157 2448196.000000 0.814292 2448197.000000 0.804187 2448198.000000 0.793844 2448199.000000 0.783266 2448200.000000 0.772456 2448201.000000 0.761418 2448202.000000 0.750154 2448203.000000 0.738668 2448204.000000 0.726964 2448205.000000 0.715044 2448206.000000 0.702913 2448207.000000 0.690574 2448208.000000 0.678031 2448209.000000 0.665287 2448210.000000 0.652346 2448211.000000 0.639212 2448212.000000 0.625889 2448213.000000 0.612380 2448214.000000 0.598691 2448215.000000 0.584824 2448216.000000 0.570784 2448217.000000 0.556576 2448218.000000 0.542202 2448219.000000 0.527668 2448220.000000 0.512978 2448221.000000 0.498137 2448222.000000 0.483147 2448223.000000 0.468015 2448224.000000 0.452745 2448225.000000 0.437340 2448226.000000 0.421806 2448227.000000 0.406147 2448228.000000 0.390368 2448229.000000 0.374474 2448230.000000 0.358468 2448231.000000 0.342357 2448232.000000 0.326144 2448233.000000 0.309835 2448234.000000 0.293434 2448235.000000 0.276946 2448236.000000 0.260376 2448237.000000 0.243730 2448238.000000 0.227011 2448239.000000 0.210225 2448240.000000 0.193376 2448241.000000 0.176471 2448242.000000 0.159513 2448243.000000 0.142508 2448244.000000 0.125461 2448245.000000 0.108377 2448246.000000 0.091261 2448247.000000 0.074117 2448248.000000 0.056952 2448249.000000 0.039770 2448250.000000 0.022576 2448251.000000 0.005376 2448252.000000 -0.011826 2448253.000000 -0.029025 2448254.000000 -0.046215 2448255.000000 -0.063391 2448256.000000 -0.080549 2448257.000000 -0.097683 2448258.000000 -0.114788 2448259.000000 -0.131859 2448260.000000 -0.148890 2448261.000000 -0.165878 2448262.000000 -0.182817 2448263.000000 -0.199702 2448264.000000 -0.216527 2448265.000000 -0.233289 2448266.000000 -0.249981 2448267.000000 -0.266599 2448268.000000 -0.283139 2448269.000000 -0.299595 2448270.000000 -0.315962 2448271.000000 -0.332235 2448272.000000 -0.348411 2448273.000000 -0.364483 2448274.000000 -0.380447 2448275.000000 -0.396299 2448276.000000 -0.412034 2448277.000000 -0.427646 2448278.000000 -0.443132 2448279.000000 -0.458487 2448280.000000 -0.473706 2448281.000000 -0.488785 2448282.000000 -0.503720 2448283.000000 -0.518505 2448284.000000 -0.533137 2448285.000000 -0.547611 2448286.000000 -0.561923 2448287.000000 -0.576069 2448288.000000 -0.590044 2448289.000000 -0.603845 2448290.000000 -0.617467 2448291.000000 -0.630907 2448292.000000 -0.644159 2448293.000000 -0.657221 2448294.000000 -0.670089 2448295.000000 -0.682758 2448296.000000 -0.695225 2448297.000000 -0.707487 2448298.000000 -0.719539 2448299.000000 -0.731378 2448300.000000 -0.743001 2448301.000000 -0.754404 2448302.000000 -0.765584 2448303.000000 -0.776537 2448304.000000 -0.787260 2448305.000000 -0.797750 2448306.000000 -0.808005 2448307.000000 -0.818020 2448308.000000 -0.827793 2448309.000000 -0.837321 2448310.000000 -0.846602 2448311.000000 -0.855631 2448312.000000 -0.864408 2448313.000000 -0.872929 2448314.000000 -0.881192 2448315.000000 -0.889193 2448316.000000 -0.896932 2448317.000000 -0.904405 2448318.000000 -0.911611 2448319.000000 -0.918547 2448320.000000 -0.925211 2448321.000000 -0.931601 2448322.000000 -0.937716 2448323.000000 -0.943553 2448324.000000 -0.949111 2448325.000000 -0.954388 2448326.000000 -0.959383 2448327.000000 -0.964094 2448328.000000 -0.968519 2448329.000000 -0.972658 2448330.000000 -0.976509 2448331.000000 -0.980071 2448332.000000 -0.983343 2448333.000000 -0.986324 2448334.000000 -0.989013 2448335.000000 -0.991410 2448336.000000 -0.993513 2448337.000000 -0.995322 2448338.000000 -0.996837 2448339.000000 -0.998056 2448340.000000 -0.998981 2448341.000000 -0.999609 2448342.000000 -0.999942 2448343.000000 -0.999979 2448344.000000 -0.999720 2448345.000000 -0.999166 2448346.000000 -0.998315 2448347.000000 -0.997169 2448348.000000 -0.995728 2448349.000000 -0.993993 2448350.000000 -0.991963 2448351.000000 -0.989640 2448352.000000 -0.987024 2448353.000000 -0.984116 2448354.000000 -0.980916 2448355.000000 -0.977426 2448356.000000 -0.973648 2448357.000000 -0.969581 2448358.000000 -0.965227 2448359.000000 -0.960587 2448360.000000 -0.955663 2448361.000000 -0.950457 2448362.000000 -0.944969 2448363.000000 -0.939201 2448364.000000 -0.933156 2448365.000000 -0.926834 2448366.000000 -0.920239 2448367.000000 -0.913370 2448368.000000 -0.906232 2448369.000000 -0.898825 2448370.000000 -0.891153 2448371.000000 -0.883217 2448372.000000 -0.875019 2448373.000000 -0.866562 2448374.000000 -0.857849 2448375.000000 -0.848883 2448376.000000 -0.839665 2448377.000000 -0.830198 2448378.000000 -0.820486 2448379.000000 -0.810531 2448380.000000 -0.800336 2448381.000000 -0.789905 2448382.000000 -0.779239 2448383.000000 -0.768343 2448384.000000 -0.757220 2448385.000000 -0.745872 2448386.000000 -0.734304 2448387.000000 -0.722519 2448388.000000 -0.710520 2448389.000000 -0.698310 2448390.000000 -0.685894 2448391.000000 -0.673275 2448392.000000 -0.660457 2448393.000000 -0.647443 2448394.000000 -0.634237 2448395.000000 -0.620844 2448396.000000 -0.607268 2448397.000000 -0.593511 2448398.000000 -0.579579 2448399.000000 -0.565476 2448400.000000 -0.551205 2448401.000000 -0.536771 2448402.000000 -0.522178 2448403.000000 -0.507430 2448404.000000 -0.492533 2448405.000000 -0.477489 2448406.000000 -0.462305 2448407.000000 -0.446983 2448408.000000 -0.431530 2448409.000000 -0.415948 2448410.000000 -0.400244 2448411.000000 -0.384421 2448412.000000 -0.368484 2448413.000000 -0.352439 2448414.000000 -0.336289 2448415.000000 -0.320039 2448416.000000 -0.303695 2448417.000000 -0.287261 2448418.000000 -0.270742 2448419.000000 -0.254143 2448420.000000 -0.237468 2448421.000000 -0.220724 2448422.000000 -0.203914 2448423.000000 -0.187043 2448424.000000 -0.170118 2448425.000000 -0.153142 2448426.000000 -0.136120 2448427.000000 -0.119059 2448428.000000 -0.101962 2448429.000000 -0.084835 2448430.000000 -0.067683 2448431.000000 -0.050511 2448432.000000 -0.033324 2448433.000000 -0.016127 2448434.000000 0.001075 2448435.000000 0.018277 2448436.000000 0.035473 2448437.000000 0.052658 2448438.000000 0.069828 2448439.000000 0.086977 2448440.000000 0.104101 2448441.000000 0.121193 2448442.000000 0.138250 2448443.000000 0.155266 2448444.000000 0.172236 2448445.000000 0.189155 2448446.000000 0.206018 2448447.000000 0.222820 2448448.000000 0.239557 2448449.000000 0.256222 2448450.000000 0.272811 2448451.000000 0.289320 2448452.000000 0.305743 2448453.000000 0.322076 2448454.000000 0.338313 2448455.000000 0.354450 2448456.000000 0.370483 2448457.000000 0.386405 2448458.000000 0.402214 2448459.000000 0.417903 2448460.000000 0.433469 2448461.000000 0.448906 2448462.000000 0.464210 2448463.000000 0.479378 2448464.000000 0.494403 2448465.000000 0.509282 2448466.000000 0.524010 2448467.000000 0.538584 2448468.000000 0.552997 2448469.000000 0.567248 2448470.000000 0.581330 2448471.000000 0.595240 2448472.000000 0.608975 2448473.000000 0.622529 2448474.000000 0.635898 2448475.000000 0.649080 2448476.000000 0.662070 2448477.000000 0.674863 2448478.000000 0.687457 2448479.000000 0.699848 2448480.000000 0.712031 2448481.000000 0.724004 2448482.000000 0.735762 2448483.000000 0.747303 2448484.000000 0.758623 2448485.000000 0.769718 2448486.000000 0.780585 2448487.000000 0.791221 2448488.000000 0.801624 2448489.000000 0.811789 2448490.000000 0.821713 2448491.000000 0.831395 2448492.000000 0.840831 2448493.000000 0.850017 2448494.000000 0.858953 2448495.000000 0.867634 2448496.000000 0.876058 2448497.000000 0.884223 2448498.000000 0.892126 2448499.000000 0.899766 2448500.000000 0.907139 2448501.000000 0.914244 2448502.000000 0.921078 2448503.000000 0.927640 2448504.000000 0.933927 2448505.000000 0.939938 2448506.000000 0.945670 2448507.000000 0.951123 2448508.000000 0.956294 2448509.000000 0.961183 2448510.000000 0.965787 2448511.000000 0.970105 2448512.000000 0.974136 2448513.000000 0.977879 2448514.000000 0.981332 2448515.000000 0.984495 2448516.000000 0.987367 2448517.000000 0.989946 2448518.000000 0.992233 2448519.000000 0.994226 2448520.000000 0.995925 2448521.000000 0.997329 2448522.000000 0.998438 2448523.000000 0.999251 2448524.000000 0.999769 2448525.000000 0.999991 2448526.000000 0.999917 2448527.000000 0.999547 2448528.000000 0.998881 2448529.000000 0.997920 2448530.000000 0.996663 2448531.000000 0.995112 2448532.000000 0.993266 2448533.000000 0.991126 2448534.000000 0.988693 2448535.000000 0.985967 2448536.000000 0.982950 2448537.000000 0.979641 2448538.000000 0.976043 2448539.000000 0.972156 2448540.000000 0.967981 2448541.000000 0.963520 2448542.000000 0.958774 2448543.000000 0.953744 2448544.000000 0.948432 2448545.000000 0.942839 2448546.000000 0.936967 2448547.000000 0.930818 2448548.000000 0.924393 2448549.000000 0.917695 2448550.000000 0.910725 2448551.000000 0.903486 2448552.000000 0.895979 2448553.000000 0.888208 2448554.000000 0.880173 2448555.000000 0.871878 2448556.000000 0.863325 2448557.000000 0.854517 2448558.000000 0.845455 2448559.000000 0.836144 2448560.000000 0.826585 2448561.000000 0.816781 2448562.000000 0.806736 2448563.000000 0.796452 2448564.000000 0.785932 2448565.000000 0.775180 2448566.000000 0.764198 2448567.000000 0.752991 2448568.000000 0.741560 2448569.000000 0.729910 2448570.000000 0.718044 2448571.000000 0.705965 2448572.000000 0.693678 2448573.000000 0.681185 2448574.000000 0.668491 2448575.000000 0.655599 2448576.000000 0.642513 2448577.000000 0.629237 2448578.000000 0.615774 2448579.000000 0.602130 2448580.000000 0.588307 2448581.000000 0.574310 2448582.000000 0.560143 2448583.000000 0.545811 2448584.000000 0.531317 2448585.000000 0.516665 2448586.000000 0.501861 2448587.000000 0.486908 2448588.000000 0.471812 2448589.000000 0.456575 2448590.000000 0.441204 2448591.000000 0.425701 2448592.000000 0.410073 2448593.000000 0.394324 2448594.000000 0.378458 2448595.000000 0.362480 2448596.000000 0.346394 2448597.000000 0.330207 2448598.000000 0.313921 2448599.000000 0.297543 2448600.000000 0.281076 2448601.000000 0.264526 2448602.000000 0.247898 2448603.000000 0.231197 2448604.000000 0.214427 2448605.000000 0.197594 2448606.000000 0.180702 2448607.000000 0.163757 2448608.000000 0.146764 2448609.000000 0.129727 2448610.000000 0.112651 2448611.000000 0.095543 2448612.000000 0.078406 2448613.000000 0.061245 2448614.000000 0.044067 2448615.000000 0.026876 2448616.000000 0.009676 2448617.000000 -0.007526 2448618.000000 -0.024726 2448619.000000 -0.041919 2448620.000000 -0.059099 2448621.000000 -0.076262 2448622.000000 -0.093402 2448623.000000 -0.110514 2448624.000000 -0.127594 2448625.000000 -0.144636 2448626.000000 -0.161636 2448627.000000 -0.178587 2448628.000000 -0.195486 2448629.000000 -0.212327 2448630.000000 -0.229104 2448631.000000 -0.245815 2448632.000000 -0.262452 2448633.000000 -0.279012 2448634.000000 -0.295489 2448635.000000 -0.311879 2448636.000000 -0.328176 2448637.000000 -0.344376 2448638.000000 -0.360475 2448639.000000 -0.376467 2448640.000000 -0.392347 2448641.000000 -0.408111 2448642.000000 -0.423755 2448643.000000 -0.439273 2448644.000000 -0.454661 2448645.000000 -0.469915 2448646.000000 -0.485029 2448647.000000 -0.500000 2448648.000000 -0.514823 2448649.000000 -0.529494 2448650.000000 -0.544008 2448651.000000 -0.558361 2448652.000000 -0.572548 2448653.000000 -0.586567 2448654.000000 -0.600412 2448655.000000 -0.614079 2448656.000000 -0.627564 2448657.000000 -0.640864 2448658.000000 -0.653974 2448659.000000 -0.666890 2448660.000000 -0.679610 2448661.000000 -0.692128 2448662.000000 -0.704441 2448663.000000 -0.716546 2448664.000000 -0.728438 2448665.000000 -0.740116 2448666.000000 -0.751574 2448667.000000 -0.762810 2448668.000000 -0.773820 2448669.000000 -0.784601 2448670.000000 -0.795150 2448671.000000 -0.805463 2448672.000000 -0.815539 2448673.000000 -0.825373 2448674.000000 -0.834962 2448675.000000 -0.844305 2448676.000000 -0.853398 2448677.000000 -0.862238 2448678.000000 -0.870823 2448679.000000 -0.879150 2448680.000000 -0.887218 2448681.000000 -0.895022 2448682.000000 -0.902562 2448683.000000 -0.909835 2448684.000000 -0.916838 2448685.000000 -0.923571 2448686.000000 -0.930030 2448687.000000 -0.936213 2448688.000000 -0.942120 2448689.000000 -0.947748 2448690.000000 -0.953095 2448691.000000 -0.958161 2448692.000000 -0.962943 2448693.000000 -0.967439 2448694.000000 -0.971650 2448695.000000 -0.975573 2448696.000000 -0.979208 2448697.000000 -0.982552 2448698.000000 -0.985606 2448699.000000 -0.988368 2448700.000000 -0.990838 2448701.000000 -0.993015 2448702.000000 -0.994897 2448703.000000 -0.996486 2448704.000000 -0.997779 2448705.000000 -0.998777 2448706.000000 -0.999480 2448707.000000 -0.999887 2448708.000000 -0.999998 2448709.000000 -0.999813 2448710.000000 -0.999332 2448711.000000 -0.998555 2448712.000000 -0.997483 2448713.000000 -0.996116 2448714.000000 -0.994454 2448715.000000 -0.992498 2448716.000000 -0.990248 2448717.000000 -0.987705 2448718.000000 -0.984870 2448719.000000 -0.981743 2448720.000000 -0.978326 2448721.000000 -0.974619 2448722.000000 -0.970624 2448723.000000 -0.966342 2448724.000000 -0.961774 2448725.000000 -0.956921 2448726.000000 -0.951785 2448727.000000 -0.946367 2448728.000000 -0.940669 2448729.000000 -0.934693 2448730.000000 -0.928441 2448731.000000 -0.921913 2448732.000000 -0.915113 2448733.000000 -0.908042 2448734.000000 -0.900702 2448735.000000 -0.893096 2448736.000000 -0.885225 2448737.000000 -0.877093 2448738.000000 -0.868701 2448739.000000 -0.860052 2448740.000000 -0.851148 2448741.000000 -0.841993 2448742.000000 -0.832588 2448743.000000 -0.822937 2448744.000000 -0.813042 2448745.000000 -0.802907 2448746.000000 -0.792534 2448747.000000 -0.781927 2448748.000000 -0.771089 2448749.000000 -0.760022 2448750.000000 -0.748730 2448751.000000 -0.737217 2448752.000000 -0.725485 2448753.000000 -0.713539 2448754.000000 -0.701382 2448755.000000 -0.689017 2448756.000000 -0.676448 2448757.000000 -0.663680 2448758.000000 -0.650714 2448759.000000 -0.637557 2448760.000000 -0.624210 2448761.000000 -0.610679 2448762.000000 -0.596967 2448763.000000 -0.583078 2448764.000000 -0.569017 2448765.000000 -0.554788 2448766.000000 -0.540394 2448767.000000 -0.525841 2448768.000000 -0.511131 2448769.000000 -0.496271 2448770.000000 -0.481264 2448771.000000 -0.466114 2448772.000000 -0.450826 2448773.000000 -0.435405 2448774.000000 -0.419855 2448775.000000 -0.404181 2448776.000000 -0.388388 2448777.000000 -0.372479 2448778.000000 -0.356460 2448779.000000 -0.340336 2448780.000000 -0.324111 2448781.000000 -0.307790 2448782.000000 -0.291378 2448783.000000 -0.274879 2448784.000000 -0.258300 2448785.000000 -0.241644 2448786.000000 -0.224916 2448787.000000 -0.208122 2448788.000000 -0.191266 2448789.000000 -0.174354 2448790.000000 -0.157390 2448791.000000 -0.140380 2448792.000000 -0.123328 2448793.000000 -0.106239 2448794.000000 -0.089119 2448795.000000 -0.071973 2448796.000000 -0.054805 2448797.000000 -0.037621 2448798.000000 -0.020426 2448799.000000 -0.003225 2448800.000000 0.013977 2448801.000000 0.031174 2448802.000000 0.048363 2448803.000000 0.065537 2448804.000000 0.082692 2448805.000000 0.099823 2448806.000000 0.116923 2448807.000000 0.133990 2448808.000000 0.151016 2448809.000000 0.167998 2448810.000000 0.184931 2448811.000000 0.201808 2448812.000000 0.218626 2448813.000000 0.235379 2448814.000000 0.252062 2448815.000000 0.268671 2448816.000000 0.285201 2448817.000000 0.301646 2448818.000000 0.318001 2448819.000000 0.334263 2448820.000000 0.350426 2448821.000000 0.366485 2448822.000000 0.382435 2448823.000000 0.398272 2448824.000000 0.413992 2448825.000000 0.429589 2448826.000000 0.445059 2448827.000000 0.460397 2448828.000000 0.475599 2448829.000000 0.490660 2448830.000000 0.505576 2448831.000000 0.520343 2448832.000000 0.534955 2448833.000000 0.549409 2448834.000000 0.563701 2448835.000000 0.577825 2448836.000000 0.591779 2448837.000000 0.605558 2448838.000000 0.619157 2448839.000000 0.632573 2448840.000000 0.645803 2448841.000000 0.658840 2448842.000000 0.671683 2448843.000000 0.684328 2448844.000000 0.696769 2448845.000000 0.709005 2448846.000000 0.721031 2448847.000000 0.732843 2448848.000000 0.744438 2448849.000000 0.755814 2448850.000000 0.766965 2448851.000000 0.777890 2448852.000000 0.788584 2448853.000000 0.799045 2448854.000000 0.809270 2448855.000000 0.819255 2448856.000000 0.828997 2448857.000000 0.838495 2448858.000000 0.847744 2448859.000000 0.856742 2448860.000000 0.865487 2448861.000000 0.873976 2448862.000000 0.882206 2448863.000000 0.890175 2448864.000000 0.897881 2448865.000000 0.905321 2448866.000000 0.912493 2448867.000000 0.919395 2448868.000000 0.926025 2448869.000000 0.932381 2448870.000000 0.938461 2448871.000000 0.944263 2448872.000000 0.949786 2448873.000000 0.955028 2448874.000000 0.959987 2448875.000000 0.964662 2448876.000000 0.969052 2448877.000000 0.973155 2448878.000000 0.976970 2448879.000000 0.980496 2448880.000000 0.983732 2448881.000000 0.986676 2448882.000000 0.989329 2448883.000000 0.991689 2448884.000000 0.993755 2448885.000000 0.995527 2448886.000000 0.997005 2448887.000000 0.998188 2448888.000000 0.999075 2448889.000000 0.999667 2448890.000000 0.999963 2448891.000000 0.999963 2448892.000000 0.999667 2448893.000000 0.999075 2448894.000000 0.998188 2448895.000000 0.997005 2448896.000000 0.995527 2448897.000000 0.993755 2448898.000000 0.991689 2448899.000000 0.989329 2448900.000000 0.986676 2448901.000000 0.983732 2448902.000000 0.980496 2448903.000000 0.976970 2448904.000000 0.973155 2448905.000000 0.969052 2448906.000000 0.964662 2448907.000000 0.959987 2448908.000000 0.955028 2448909.000000 0.949786 2448910.000000 0.944263 2448911.000000 0.938461 2448912.000000 0.932381 2448913.000000 0.926025 2448914.000000 0.919395 2448915.000000 0.912493 2448916.000000 0.905321 2448917.000000 0.897881 2448918.000000 0.890175 2448919.000000 0.882206 2448920.000000 0.873976 2448921.000000 0.865487 2448922.000000 0.856742 2448923.000000 0.847744 2448924.000000 0.838495 2448925.000000 0.828997 2448926.000000 0.819255 2448927.000000 0.809270 2448928.000000 0.799045 2448929.000000 0.788584 2448930.000000 0.777890 2448931.000000 0.766965 2448932.000000 0.755814 2448933.000000 0.744438 2448934.000000 0.732843 2448935.000000 0.721031 2448936.000000 0.709005 2448937.000000 0.696769 2448938.000000 0.684328 2448939.000000 0.671683 2448940.000000 0.658840 2448941.000000 0.645803 2448942.000000 0.632573 2448943.000000 0.619157 2448944.000000 0.605558 2448945.000000 0.591779 2448946.000000 0.577825 2448947.000000 0.563701 2448948.000000 0.549409 2448949.000000 0.534955 2448950.000000 0.520343 2448951.000000 0.505576 2448952.000000 0.490660 2448953.000000 0.475599 2448954.000000 0.460397 2448955.000000 0.445059 2448956.000000 0.429589 2448957.000000 0.413992 2448958.000000 0.398272 2448959.000000 0.382435 2448960.000000 0.366485 2448961.000000 0.350426 2448962.000000 0.334263 2448963.000000 0.318001 2448964.000000 0.301646 2448965.000000 0.285201 2448966.000000 0.268671 2448967.000000 0.252062 2448968.000000 0.235379 2448969.000000 0.218626 2448970.000000 0.201808 2448971.000000 0.184931 2448972.000000 0.167998 2448973.000000 0.151016 2448974.000000 0.133990 2448975.000000 0.116923 2448976.000000 0.099823 2448977.000000 0.082692 2448978.000000 0.065537 2448979.000000 0.048363 2448980.000000 0.031174 2448981.000000 0.013977 2448982.000000 -0.003225 2448983.000000 -0.020426 2448984.000000 -0.037621 2448985.000000 -0.054805 2448986.000000 -0.071973 2448987.000000 -0.089119 2448988.000000 -0.106239 2448989.000000 -0.123328 2448990.000000 -0.140380 2448991.000000 -0.157390 2448992.000000 -0.174354 2448993.000000 -0.191266 2448994.000000 -0.208122 2448995.000000 -0.224916 2448996.000000 -0.241644 2448997.000000 -0.258300 2448998.000000 -0.274879 2448999.000000 -0.291378 2449000.000000 -0.307790 2449001.000000 -0.324111 2449002.000000 -0.340336 2449003.000000 -0.356460 2449004.000000 -0.372479 2449005.000000 -0.388388 2449006.000000 -0.404181 2449007.000000 -0.419855 2449008.000000 -0.435405 2449009.000000 -0.450826 2449010.000000 -0.466114 2449011.000000 -0.481264 2449012.000000 -0.496271 2449013.000000 -0.511131 2449014.000000 -0.525841 2449015.000000 -0.540394 2449016.000000 -0.554788 2449017.000000 -0.569017 2449018.000000 -0.583078 2449019.000000 -0.596967 2449020.000000 -0.610679 2449021.000000 -0.624210 2449022.000000 -0.637557 2449023.000000 -0.650714 2449024.000000 -0.663680 2449025.000000 -0.676448 2449026.000000 -0.689017 2449027.000000 -0.701382 2449028.000000 -0.713539 2449029.000000 -0.725485 2449030.000000 -0.737217 2449031.000000 -0.748730 2449032.000000 -0.760022 2449033.000000 -0.771089 2449034.000000 -0.781927 2449035.000000 -0.792534 2449036.000000 -0.802907 2449037.000000 -0.813042 2449038.000000 -0.822937 2449039.000000 -0.832588 2449040.000000 -0.841993 2449041.000000 -0.851148 2449042.000000 -0.860052 2449043.000000 -0.868701 2449044.000000 -0.877093 2449045.000000 -0.885225 2449046.000000 -0.893096 2449047.000000 -0.900702 2449048.000000 -0.908042 2449049.000000 -0.915113 2449050.000000 -0.921913 2449051.000000 -0.928441 2449052.000000 -0.934693 2449053.000000 -0.940669 2449054.000000 -0.946367 2449055.000000 -0.951785 2449056.000000 -0.956921 2449057.000000 -0.961774 2449058.000000 -0.966342 2449059.000000 -0.970624 2449060.000000 -0.974619 2449061.000000 -0.978326 2449062.000000 -0.981743 2449063.000000 -0.984870 2449064.000000 -0.987705 2449065.000000 -0.990248 2449066.000000 -0.992498 2449067.000000 -0.994454 2449068.000000 -0.996116 2449069.000000 -0.997483 2449070.000000 -0.998555 2449071.000000 -0.999332 2449072.000000 -0.999813 2449073.000000 -0.999998 2449074.000000 -0.999887 2449075.000000 -0.999480 2449076.000000 -0.998777 2449077.000000 -0.997779 2449078.000000 -0.996486 2449079.000000 -0.994897 2449080.000000 -0.993015 2449081.000000 -0.990838 2449082.000000 -0.988368 2449083.000000 -0.985606 2449084.000000 -0.982552 2449085.000000 -0.979208 2449086.000000 -0.975573 2449087.000000 -0.971650 2449088.000000 -0.967439 2449089.000000 -0.962943 2449090.000000 -0.958161 2449091.000000 -0.953095 2449092.000000 -0.947748 2449093.000000 -0.942120 2449094.000000 -0.936213 2449095.000000 -0.930030 2449096.000000 -0.923571 2449097.000000 -0.916838 2449098.000000 -0.909835 2449099.000000 -0.902562 2449100.000000 -0.895022 2449101.000000 -0.887218 2449102.000000 -0.879150 2449103.000000 -0.870823 2449104.000000 -0.862238 2449105.000000 -0.853398 2449106.000000 -0.844305 2449107.000000 -0.834962 2449108.000000 -0.825373 2449109.000000 -0.815539 2449110.000000 -0.805463 2449111.000000 -0.795150 2449112.000000 -0.784601 2449113.000000 -0.773820 2449114.000000 -0.762810 2449115.000000 -0.751574 2449116.000000 -0.740116 2449117.000000 -0.728438 2449118.000000 -0.716546 2449119.000000 -0.704441 2449120.000000 -0.692128 2449121.000000 -0.679610 2449122.000000 -0.666890 2449123.000000 -0.653974 2449124.000000 -0.640864 2449125.000000 -0.627564 2449126.000000 -0.614079 2449127.000000 -0.600412 2449128.000000 -0.586567 2449129.000000 -0.572548 2449130.000000 -0.558361 2449131.000000 -0.544008 2449132.000000 -0.529494 2449133.000000 -0.514823 2449134.000000 -0.500000 2449135.000000 -0.485029 2449136.000000 -0.469915 2449137.000000 -0.454661 2449138.000000 -0.439273 2449139.000000 -0.423755 2449140.000000 -0.408111 2449141.000000 -0.392347 2449142.000000 -0.376467 2449143.000000 -0.360475 2449144.000000 -0.344376 2449145.000000 -0.328176 2449146.000000 -0.311879 2449147.000000 -0.295489 2449148.000000 -0.279012 2449149.000000 -0.262452 2449150.000000 -0.245815 2449151.000000 -0.229104 2449152.000000 -0.212327 2449153.000000 -0.195486 2449154.000000 -0.178587 2449155.000000 -0.161636 2449156.000000 -0.144636 2449157.000000 -0.127594 2449158.000000 -0.110514 2449159.000000 -0.093402 2449160.000000 -0.076262 2449161.000000 -0.059099 2449162.000000 -0.041919 2449163.000000 -0.024726 2449164.000000 -0.007526 2449165.000000 0.009676 2449166.000000 0.026876 2449167.000000 0.044067 2449168.000000 0.061245 2449169.000000 0.078406 2449170.000000 0.095543 2449171.000000 0.112651 2449172.000000 0.129727 2449173.000000 0.146764 2449174.000000 0.163757 2449175.000000 0.180702 2449176.000000 0.197594 2449177.000000 0.214427 2449178.000000 0.231197 2449179.000000 0.247898 2449180.000000 0.264526 2449181.000000 0.281076 2449182.000000 0.297543 2449183.000000 0.313921 2449184.000000 0.330207 2449185.000000 0.346394 2449186.000000 0.362480 2449187.000000 0.378458 2449188.000000 0.394324 2449189.000000 0.410073 2449190.000000 0.425701 2449191.000000 0.441204 2449192.000000 0.456575 2449193.000000 0.471812 2449194.000000 0.486908 2449195.000000 0.501861 2449196.000000 0.516665 2449197.000000 0.531317 2449198.000000 0.545811 2449199.000000 0.560143 2449200.000000 0.574310 2449201.000000 0.588307 2449202.000000 0.602130 2449203.000000 0.615774 2449204.000000 0.629237 2449205.000000 0.642513 2449206.000000 0.655599 2449207.000000 0.668491 2449208.000000 0.681185 2449209.000000 0.693678 2449210.000000 0.705965 2449211.000000 0.718044 2449212.000000 0.729910 2449213.000000 0.741560 2449214.000000 0.752991 2449215.000000 0.764198 2449216.000000 0.775180 2449217.000000 0.785932 2449218.000000 0.796452 2449219.000000 0.806736 2449220.000000 0.816781 2449221.000000 0.826585 2449222.000000 0.836144 2449223.000000 0.845455 2449224.000000 0.854517 2449225.000000 0.863325 2449226.000000 0.871878 2449227.000000 0.880173 2449228.000000 0.888208 2449229.000000 0.895979 2449230.000000 0.903486 & @WITH G4 @G4 ON 2448161.000000 0.999852 2448162.000000 0.999408 2448163.000000 0.998669 2448164.000000 0.997634 2448165.000000 0.996303 2448166.000000 0.994678 2448167.000000 0.992759 2448168.000000 0.990545 2448169.000000 0.988039 2448170.000000 0.985240 2448171.000000 0.982150 2448172.000000 0.978769 2448173.000000 0.975099 2448174.000000 0.971139 2448175.000000 0.966893 2448176.000000 0.962360 2448177.000000 0.957543 2448178.000000 0.952442 2448179.000000 0.947060 2448180.000000 0.941397 2448181.000000 0.935455 2448182.000000 0.929237 2448183.000000 0.922744 2448184.000000 0.915978 2448185.000000 0.908940 2448186.000000 0.901634 2448187.000000 0.894061 2448188.000000 0.886224 2448189.000000 0.878124 2448190.000000 0.869764 2448191.000000 0.861147 2448192.000000 0.852275 2448193.000000 0.843151 2448194.000000 0.833777 2448195.000000 0.824157 2448196.000000 0.814292 2448197.000000 0.804187 2448198.000000 0.793844 2448199.000000 0.783266 2448200.000000 0.772456 2448201.000000 0.761418 2448202.000000 0.750154 2448203.000000 0.738668 2448204.000000 0.726964 2448205.000000 0.715044 2448206.000000 0.702913 2448207.000000 0.690574 2448208.000000 0.678031 2448209.000000 0.665287 2448210.000000 0.652346 2448211.000000 0.639212 2448212.000000 0.625889 2448213.000000 0.612380 2448214.000000 0.598691 2448215.000000 0.584824 2448216.000000 0.570784 2448217.000000 0.556576 2448218.000000 0.542202 2448219.000000 0.527668 2448220.000000 0.512978 2448221.000000 0.498137 2448222.000000 0.483147 2448223.000000 0.468015 2448224.000000 0.452745 2448225.000000 0.437340 2448226.000000 0.421806 2448227.000000 0.406147 2448228.000000 0.390368 2448229.000000 0.374474 2448230.000000 0.358468 2448231.000000 0.342357 2448232.000000 0.326144 2448233.000000 0.309835 2448234.000000 0.293434 2448235.000000 0.276946 2448236.000000 0.260376 2448237.000000 0.243730 2448238.000000 0.227011 2448239.000000 0.210225 2448240.000000 0.193376 2448241.000000 0.176471 2448242.000000 0.159513 2448243.000000 0.142508 2448244.000000 0.125461 2448245.000000 0.108377 2448246.000000 0.091261 2448247.000000 0.074117 2448248.000000 0.056952 2448249.000000 0.039770 2448250.000000 0.022576 2448251.000000 0.005376 2448252.000000 -0.011826 2448253.000000 -0.029025 2448254.000000 -0.046215 2448255.000000 -0.063391 2448256.000000 -0.080549 2448257.000000 -0.097683 2448258.000000 -0.114788 2448259.000000 -0.131859 2448260.000000 -0.148890 2448261.000000 -0.165878 2448262.000000 -0.182817 2448263.000000 -0.199702 2448264.000000 -0.216527 2448265.000000 -0.233289 2448266.000000 -0.249981 2448267.000000 -0.266599 2448268.000000 -0.283139 2448269.000000 -0.299595 2448270.000000 -0.315962 2448271.000000 -0.332235 2448272.000000 -0.348411 2448273.000000 -0.364483 2448274.000000 -0.380447 2448275.000000 -0.396299 2448276.000000 -0.412034 2448277.000000 -0.427646 2448278.000000 -0.443132 2448279.000000 -0.458487 2448280.000000 -0.473706 2448281.000000 -0.488785 2448282.000000 -0.503720 2448283.000000 -0.518505 2448284.000000 -0.533137 2448285.000000 -0.547611 2448286.000000 -0.561923 2448287.000000 -0.576069 2448288.000000 -0.590044 2448289.000000 -0.603845 2448290.000000 -0.617467 2448291.000000 -0.630907 2448292.000000 -0.644159 2448293.000000 -0.657221 2448294.000000 -0.670089 2448295.000000 -0.682758 2448296.000000 -0.695225 2448297.000000 -0.707487 2448298.000000 -0.719539 2448299.000000 -0.731378 2448300.000000 -0.743001 2448301.000000 -0.754404 2448302.000000 -0.765584 2448303.000000 -0.776537 2448304.000000 -0.787260 2448305.000000 -0.797750 2448306.000000 -0.808005 2448307.000000 -0.818020 2448308.000000 -0.827793 2448309.000000 -0.837321 2448310.000000 -0.846602 2448311.000000 -0.855631 2448312.000000 -0.864408 2448313.000000 -0.872929 2448314.000000 -0.881192 2448315.000000 -0.889193 2448316.000000 -0.896932 2448317.000000 -0.904405 2448318.000000 -0.911611 2448319.000000 -0.918547 2448320.000000 -0.925211 2448321.000000 -0.931601 2448322.000000 -0.937716 2448323.000000 -0.943553 2448324.000000 -0.949111 2448325.000000 -0.954388 2448326.000000 -0.959383 2448327.000000 -0.964094 2448328.000000 -0.968519 2448329.000000 -0.972658 2448330.000000 -0.976509 2448331.000000 -0.980071 2448332.000000 -0.983343 2448333.000000 -0.986324 2448334.000000 -0.989013 2448335.000000 -0.991410 2448336.000000 -0.993513 2448337.000000 -0.995322 2448338.000000 -0.996837 2448339.000000 -0.998056 2448340.000000 -0.998981 2448341.000000 -0.999609 2448342.000000 -0.999942 2448343.000000 -0.999979 2448344.000000 -0.999720 2448345.000000 -0.999166 2448346.000000 -0.998315 2448347.000000 -0.997169 2448348.000000 -0.995728 2448349.000000 -0.993993 2448350.000000 -0.991963 2448351.000000 -0.989640 2448352.000000 -0.987024 2448353.000000 -0.984116 2448354.000000 -0.980916 2448355.000000 -0.977426 2448356.000000 -0.973648 2448357.000000 -0.969581 2448358.000000 -0.965227 2448359.000000 -0.960587 2448360.000000 -0.955663 2448361.000000 -0.950457 2448362.000000 -0.944969 2448363.000000 -0.939201 2448364.000000 -0.933156 2448365.000000 -0.926834 2448366.000000 -0.920239 2448367.000000 -0.913370 2448368.000000 -0.906232 2448369.000000 -0.898825 2448370.000000 -0.891153 2448371.000000 -0.883217 2448372.000000 -0.875019 2448373.000000 -0.866562 2448374.000000 -0.857849 2448375.000000 -0.848883 2448376.000000 -0.839665 2448377.000000 -0.830198 2448378.000000 -0.820486 2448379.000000 -0.810531 2448380.000000 -0.800336 2448381.000000 -0.789905 2448382.000000 -0.779239 2448383.000000 -0.768343 2448384.000000 -0.757220 2448385.000000 -0.745872 2448386.000000 -0.734304 2448387.000000 -0.722519 2448388.000000 -0.710520 2448389.000000 -0.698310 2448390.000000 -0.685894 2448391.000000 -0.673275 2448392.000000 -0.660457 2448393.000000 -0.647443 2448394.000000 -0.634237 2448395.000000 -0.620844 2448396.000000 -0.607268 2448397.000000 -0.593511 2448398.000000 -0.579579 2448399.000000 -0.565476 2448400.000000 -0.551205 2448401.000000 -0.536771 2448402.000000 -0.522178 2448403.000000 -0.507430 2448404.000000 -0.492533 2448405.000000 -0.477489 2448406.000000 -0.462305 2448407.000000 -0.446983 2448408.000000 -0.431530 2448409.000000 -0.415948 2448410.000000 -0.400244 2448411.000000 -0.384421 2448412.000000 -0.368484 2448413.000000 -0.352439 2448414.000000 -0.336289 2448415.000000 -0.320039 2448416.000000 -0.303695 2448417.000000 -0.287261 2448418.000000 -0.270742 2448419.000000 -0.254143 2448420.000000 -0.237468 2448421.000000 -0.220724 2448422.000000 -0.203914 2448423.000000 -0.187043 2448424.000000 -0.170118 2448425.000000 -0.153142 2448426.000000 -0.136120 2448427.000000 -0.119059 2448428.000000 -0.101962 2448429.000000 -0.084835 2448430.000000 -0.067683 2448431.000000 -0.050511 2448432.000000 -0.033324 2448433.000000 -0.016127 2448434.000000 0.001075 2448435.000000 0.018277 2448436.000000 0.035473 2448437.000000 0.052658 2448438.000000 0.069828 2448439.000000 0.086977 2448440.000000 0.104101 2448441.000000 0.121193 2448442.000000 0.138250 2448443.000000 0.155266 2448444.000000 0.172236 2448445.000000 0.189155 2448446.000000 0.206018 2448447.000000 0.222820 2448448.000000 0.239557 2448449.000000 0.256222 2448450.000000 0.272811 2448451.000000 0.289320 2448452.000000 0.305743 2448453.000000 0.322076 2448454.000000 0.338313 2448455.000000 0.354450 2448456.000000 0.370483 2448457.000000 0.386405 2448458.000000 0.402214 2448459.000000 0.417903 2448460.000000 0.433469 2448461.000000 0.448906 2448462.000000 0.464210 2448463.000000 0.479378 2448464.000000 0.494403 2448465.000000 0.509282 2448466.000000 0.524010 2448467.000000 0.538584 2448468.000000 0.552997 2448469.000000 0.567248 2448470.000000 0.581330 2448471.000000 0.595240 2448472.000000 0.608975 2448473.000000 0.622529 2448474.000000 0.635898 2448475.000000 0.649080 2448476.000000 0.662070 2448477.000000 0.674863 2448478.000000 0.687457 2448479.000000 0.699848 2448480.000000 0.712031 2448481.000000 0.724004 2448482.000000 0.735762 2448483.000000 0.747303 2448484.000000 0.758623 2448485.000000 0.769718 2448486.000000 0.780585 2448487.000000 0.791221 2448488.000000 0.801624 2448489.000000 0.811789 2448490.000000 0.821713 2448491.000000 0.831395 2448492.000000 0.840831 2448493.000000 0.850017 2448494.000000 0.858953 2448495.000000 0.867634 2448496.000000 0.876058 2448497.000000 0.884223 2448498.000000 0.892126 2448499.000000 0.899766 2448500.000000 0.907139 2448501.000000 0.914244 2448502.000000 0.921078 2448503.000000 0.927640 2448504.000000 0.933927 2448505.000000 0.939938 2448506.000000 0.945670 2448507.000000 0.951123 2448508.000000 0.956294 2448509.000000 0.961183 2448510.000000 0.965787 2448511.000000 0.970105 2448512.000000 0.974136 2448513.000000 0.977879 2448514.000000 0.981332 2448515.000000 0.984495 2448516.000000 0.987367 2448517.000000 0.989946 2448518.000000 0.992233 2448519.000000 0.994226 2448520.000000 0.995925 2448521.000000 0.997329 2448522.000000 0.998438 2448523.000000 0.999251 2448524.000000 0.999769 2448525.000000 0.999991 2448526.000000 0.999917 2448527.000000 0.999547 2448528.000000 0.998881 2448529.000000 0.997920 2448530.000000 0.996663 2448531.000000 0.995112 2448532.000000 0.993266 2448533.000000 0.991126 2448534.000000 0.988693 2448535.000000 0.985967 2448536.000000 0.982950 2448537.000000 0.979641 2448538.000000 0.976043 2448539.000000 0.972156 2448540.000000 0.967981 2448541.000000 0.963520 2448542.000000 0.958774 2448543.000000 0.953744 2448544.000000 0.948432 2448545.000000 0.942839 2448546.000000 0.936967 2448547.000000 0.930818 2448548.000000 0.924393 2448549.000000 0.917695 2448550.000000 0.910725 2448551.000000 0.903486 2448552.000000 0.895979 2448553.000000 0.888208 2448554.000000 0.880173 2448555.000000 0.871878 2448556.000000 0.863325 2448557.000000 0.854517 2448558.000000 0.845455 2448559.000000 0.836144 2448560.000000 0.826585 2448561.000000 0.816781 2448562.000000 0.806736 2448563.000000 0.796452 2448564.000000 0.785932 2448565.000000 0.775180 2448566.000000 0.764198 2448567.000000 0.752991 2448568.000000 0.741560 2448569.000000 0.729910 2448570.000000 0.718044 2448571.000000 0.705965 2448572.000000 0.693678 2448573.000000 0.681185 2448574.000000 0.668491 2448575.000000 0.655599 2448576.000000 0.642513 2448577.000000 0.629237 2448578.000000 0.615774 2448579.000000 0.602130 2448580.000000 0.588307 2448581.000000 0.574310 2448582.000000 0.560143 2448583.000000 0.545811 2448584.000000 0.531317 2448585.000000 0.516665 2448586.000000 0.501861 2448587.000000 0.486908 2448588.000000 0.471812 2448589.000000 0.456575 2448590.000000 0.441204 2448591.000000 0.425701 2448592.000000 0.410073 2448593.000000 0.394324 2448594.000000 0.378458 2448595.000000 0.362480 2448596.000000 0.346394 2448597.000000 0.330207 2448598.000000 0.313921 2448599.000000 0.297543 2448600.000000 0.281076 2448601.000000 0.264526 2448602.000000 0.247898 2448603.000000 0.231197 2448604.000000 0.214427 2448605.000000 0.197594 2448606.000000 0.180702 2448607.000000 0.163757 2448608.000000 0.146764 2448609.000000 0.129727 2448610.000000 0.112651 2448611.000000 0.095543 2448612.000000 0.078406 2448613.000000 0.061245 2448614.000000 0.044067 2448615.000000 0.026876 2448616.000000 0.009676 2448617.000000 -0.007526 2448618.000000 -0.024726 2448619.000000 -0.041919 2448620.000000 -0.059099 2448621.000000 -0.076262 2448622.000000 -0.093402 2448623.000000 -0.110514 2448624.000000 -0.127594 2448625.000000 -0.144636 2448626.000000 -0.161636 2448627.000000 -0.178587 2448628.000000 -0.195486 2448629.000000 -0.212327 2448630.000000 -0.229104 2448631.000000 -0.245815 2448632.000000 -0.262452 2448633.000000 -0.279012 2448634.000000 -0.295489 2448635.000000 -0.311879 2448636.000000 -0.328176 2448637.000000 -0.344376 2448638.000000 -0.360475 2448639.000000 -0.376467 2448640.000000 -0.392347 2448641.000000 -0.408111 2448642.000000 -0.423755 2448643.000000 -0.439273 2448644.000000 -0.454661 2448645.000000 -0.469915 2448646.000000 -0.485029 2448647.000000 -0.500000 2448648.000000 -0.514823 2448649.000000 -0.529494 2448650.000000 -0.544008 2448651.000000 -0.558361 2448652.000000 -0.572548 2448653.000000 -0.586567 2448654.000000 -0.600412 2448655.000000 -0.614079 2448656.000000 -0.627564 2448657.000000 -0.640864 2448658.000000 -0.653974 2448659.000000 -0.666890 2448660.000000 -0.679610 2448661.000000 -0.692128 2448662.000000 -0.704441 2448663.000000 -0.716546 2448664.000000 -0.728438 2448665.000000 -0.740116 2448666.000000 -0.751574 2448667.000000 -0.762810 2448668.000000 -0.773820 2448669.000000 -0.784601 2448670.000000 -0.795150 2448671.000000 -0.805463 2448672.000000 -0.815539 2448673.000000 -0.825373 2448674.000000 -0.834962 2448675.000000 -0.844305 2448676.000000 -0.853398 2448677.000000 -0.862238 2448678.000000 -0.870823 2448679.000000 -0.879150 2448680.000000 -0.887218 2448681.000000 -0.895022 2448682.000000 -0.902562 2448683.000000 -0.909835 2448684.000000 -0.916838 2448685.000000 -0.923571 2448686.000000 -0.930030 2448687.000000 -0.936213 2448688.000000 -0.942120 2448689.000000 -0.947748 2448690.000000 -0.953095 2448691.000000 -0.958161 2448692.000000 -0.962943 2448693.000000 -0.967439 2448694.000000 -0.971650 2448695.000000 -0.975573 2448696.000000 -0.979208 2448697.000000 -0.982552 2448698.000000 -0.985606 2448699.000000 -0.988368 2448700.000000 -0.990838 2448701.000000 -0.993015 2448702.000000 -0.994897 2448703.000000 -0.996486 2448704.000000 -0.997779 2448705.000000 -0.998777 2448706.000000 -0.999480 2448707.000000 -0.999887 2448708.000000 -0.999998 2448709.000000 -0.999813 2448710.000000 -0.999332 2448711.000000 -0.998555 2448712.000000 -0.997483 2448713.000000 -0.996116 2448714.000000 -0.994454 2448715.000000 -0.992498 2448716.000000 -0.990248 2448717.000000 -0.987705 2448718.000000 -0.984870 2448719.000000 -0.981743 2448720.000000 -0.978326 2448721.000000 -0.974619 2448722.000000 -0.970624 2448723.000000 -0.966342 2448724.000000 -0.961774 2448725.000000 -0.956921 2448726.000000 -0.951785 2448727.000000 -0.946367 2448728.000000 -0.940669 2448729.000000 -0.934693 2448730.000000 -0.928441 2448731.000000 -0.921913 2448732.000000 -0.915113 2448733.000000 -0.908042 2448734.000000 -0.900702 2448735.000000 -0.893096 2448736.000000 -0.885225 2448737.000000 -0.877093 2448738.000000 -0.868701 2448739.000000 -0.860052 2448740.000000 -0.851148 2448741.000000 -0.841993 2448742.000000 -0.832588 2448743.000000 -0.822937 2448744.000000 -0.813042 2448745.000000 -0.802907 2448746.000000 -0.792534 2448747.000000 -0.781927 2448748.000000 -0.771089 2448749.000000 -0.760022 2448750.000000 -0.748730 2448751.000000 -0.737217 2448752.000000 -0.725485 2448753.000000 -0.713539 2448754.000000 -0.701382 2448755.000000 -0.689017 2448756.000000 -0.676448 2448757.000000 -0.663680 2448758.000000 -0.650714 2448759.000000 -0.637557 2448760.000000 -0.624210 2448761.000000 -0.610679 2448762.000000 -0.596967 2448763.000000 -0.583078 2448764.000000 -0.569017 2448765.000000 -0.554788 2448766.000000 -0.540394 2448767.000000 -0.525841 2448768.000000 -0.511131 2448769.000000 -0.496271 2448770.000000 -0.481264 2448771.000000 -0.466114 2448772.000000 -0.450826 2448773.000000 -0.435405 2448774.000000 -0.419855 2448775.000000 -0.404181 2448776.000000 -0.388388 2448777.000000 -0.372479 2448778.000000 -0.356460 2448779.000000 -0.340336 2448780.000000 -0.324111 2448781.000000 -0.307790 2448782.000000 -0.291378 2448783.000000 -0.274879 2448784.000000 -0.258300 2448785.000000 -0.241644 2448786.000000 -0.224916 2448787.000000 -0.208122 2448788.000000 -0.191266 2448789.000000 -0.174354 2448790.000000 -0.157390 2448791.000000 -0.140380 2448792.000000 -0.123328 2448793.000000 -0.106239 2448794.000000 -0.089119 2448795.000000 -0.071973 2448796.000000 -0.054805 2448797.000000 -0.037621 2448798.000000 -0.020426 2448799.000000 -0.003225 2448800.000000 0.013977 2448801.000000 0.031174 2448802.000000 0.048363 2448803.000000 0.065537 2448804.000000 0.082692 2448805.000000 0.099823 2448806.000000 0.116923 2448807.000000 0.133990 2448808.000000 0.151016 2448809.000000 0.167998 2448810.000000 0.184931 2448811.000000 0.201808 2448812.000000 0.218626 2448813.000000 0.235379 2448814.000000 0.252062 2448815.000000 0.268671 2448816.000000 0.285201 2448817.000000 0.301646 2448818.000000 0.318001 2448819.000000 0.334263 2448820.000000 0.350426 2448821.000000 0.366485 2448822.000000 0.382435 2448823.000000 0.398272 2448824.000000 0.413992 2448825.000000 0.429589 2448826.000000 0.445059 2448827.000000 0.460397 2448828.000000 0.475599 2448829.000000 0.490660 2448830.000000 0.505576 2448831.000000 0.520343 2448832.000000 0.534955 2448833.000000 0.549409 2448834.000000 0.563701 2448835.000000 0.577825 2448836.000000 0.591779 2448837.000000 0.605558 2448838.000000 0.619157 2448839.000000 0.632573 2448840.000000 0.645803 2448841.000000 0.658840 2448842.000000 0.671683 2448843.000000 0.684328 2448844.000000 0.696769 2448845.000000 0.709005 2448846.000000 0.721031 2448847.000000 0.732843 2448848.000000 0.744438 2448849.000000 0.755814 2448850.000000 0.766965 2448851.000000 0.777890 2448852.000000 0.788584 2448853.000000 0.799045 2448854.000000 0.809270 2448855.000000 0.819255 2448856.000000 0.828997 2448857.000000 0.838495 2448858.000000 0.847744 2448859.000000 0.856742 2448860.000000 0.865487 2448861.000000 0.873976 2448862.000000 0.882206 2448863.000000 0.890175 2448864.000000 0.897881 2448865.000000 0.905321 2448866.000000 0.912493 2448867.000000 0.919395 2448868.000000 0.926025 2448869.000000 0.932381 2448870.000000 0.938461 2448871.000000 0.944263 2448872.000000 0.949786 2448873.000000 0.955028 2448874.000000 0.959987 2448875.000000 0.964662 2448876.000000 0.969052 2448877.000000 0.973155 2448878.000000 0.976970 2448879.000000 0.980496 2448880.000000 0.983732 2448881.000000 0.986676 2448882.000000 0.989329 2448883.000000 0.991689 2448884.000000 0.993755 2448885.000000 0.995527 2448886.000000 0.997005 2448887.000000 0.998188 2448888.000000 0.999075 2448889.000000 0.999667 2448890.000000 0.999963 2448891.000000 0.999963 2448892.000000 0.999667 2448893.000000 0.999075 2448894.000000 0.998188 2448895.000000 0.997005 2448896.000000 0.995527 2448897.000000 0.993755 2448898.000000 0.991689 2448899.000000 0.989329 2448900.000000 0.986676 2448901.000000 0.983732 2448902.000000 0.980496 2448903.000000 0.976970 2448904.000000 0.973155 2448905.000000 0.969052 2448906.000000 0.964662 2448907.000000 0.959987 2448908.000000 0.955028 2448909.000000 0.949786 2448910.000000 0.944263 2448911.000000 0.938461 2448912.000000 0.932381 2448913.000000 0.926025 2448914.000000 0.919395 2448915.000000 0.912493 2448916.000000 0.905321 2448917.000000 0.897881 2448918.000000 0.890175 2448919.000000 0.882206 2448920.000000 0.873976 2448921.000000 0.865487 2448922.000000 0.856742 2448923.000000 0.847744 2448924.000000 0.838495 2448925.000000 0.828997 2448926.000000 0.819255 2448927.000000 0.809270 2448928.000000 0.799045 2448929.000000 0.788584 2448930.000000 0.777890 2448931.000000 0.766965 2448932.000000 0.755814 2448933.000000 0.744438 2448934.000000 0.732843 2448935.000000 0.721031 2448936.000000 0.709005 2448937.000000 0.696769 2448938.000000 0.684328 2448939.000000 0.671683 2448940.000000 0.658840 2448941.000000 0.645803 2448942.000000 0.632573 2448943.000000 0.619157 2448944.000000 0.605558 2448945.000000 0.591779 2448946.000000 0.577825 2448947.000000 0.563701 2448948.000000 0.549409 2448949.000000 0.534955 2448950.000000 0.520343 2448951.000000 0.505576 2448952.000000 0.490660 2448953.000000 0.475599 2448954.000000 0.460397 2448955.000000 0.445059 2448956.000000 0.429589 2448957.000000 0.413992 2448958.000000 0.398272 2448959.000000 0.382435 2448960.000000 0.366485 2448961.000000 0.350426 2448962.000000 0.334263 2448963.000000 0.318001 2448964.000000 0.301646 2448965.000000 0.285201 2448966.000000 0.268671 2448967.000000 0.252062 2448968.000000 0.235379 2448969.000000 0.218626 2448970.000000 0.201808 2448971.000000 0.184931 2448972.000000 0.167998 2448973.000000 0.151016 2448974.000000 0.133990 2448975.000000 0.116923 2448976.000000 0.099823 2448977.000000 0.082692 2448978.000000 0.065537 2448979.000000 0.048363 2448980.000000 0.031174 2448981.000000 0.013977 2448982.000000 -0.003225 2448983.000000 -0.020426 2448984.000000 -0.037621 2448985.000000 -0.054805 2448986.000000 -0.071973 2448987.000000 -0.089119 2448988.000000 -0.106239 2448989.000000 -0.123328 2448990.000000 -0.140380 2448991.000000 -0.157390 2448992.000000 -0.174354 2448993.000000 -0.191266 2448994.000000 -0.208122 2448995.000000 -0.224916 2448996.000000 -0.241644 2448997.000000 -0.258300 2448998.000000 -0.274879 2448999.000000 -0.291378 2449000.000000 -0.307790 2449001.000000 -0.324111 2449002.000000 -0.340336 2449003.000000 -0.356460 2449004.000000 -0.372479 2449005.000000 -0.388388 2449006.000000 -0.404181 2449007.000000 -0.419855 2449008.000000 -0.435405 2449009.000000 -0.450826 2449010.000000 -0.466114 2449011.000000 -0.481264 2449012.000000 -0.496271 2449013.000000 -0.511131 2449014.000000 -0.525841 2449015.000000 -0.540394 2449016.000000 -0.554788 2449017.000000 -0.569017 2449018.000000 -0.583078 2449019.000000 -0.596967 2449020.000000 -0.610679 2449021.000000 -0.624210 2449022.000000 -0.637557 2449023.000000 -0.650714 2449024.000000 -0.663680 2449025.000000 -0.676448 2449026.000000 -0.689017 2449027.000000 -0.701382 2449028.000000 -0.713539 2449029.000000 -0.725485 2449030.000000 -0.737217 2449031.000000 -0.748730 2449032.000000 -0.760022 2449033.000000 -0.771089 2449034.000000 -0.781927 2449035.000000 -0.792534 2449036.000000 -0.802907 2449037.000000 -0.813042 2449038.000000 -0.822937 2449039.000000 -0.832588 2449040.000000 -0.841993 2449041.000000 -0.851148 2449042.000000 -0.860052 2449043.000000 -0.868701 2449044.000000 -0.877093 2449045.000000 -0.885225 2449046.000000 -0.893096 2449047.000000 -0.900702 2449048.000000 -0.908042 2449049.000000 -0.915113 2449050.000000 -0.921913 2449051.000000 -0.928441 2449052.000000 -0.934693 2449053.000000 -0.940669 2449054.000000 -0.946367 2449055.000000 -0.951785 2449056.000000 -0.956921 2449057.000000 -0.961774 2449058.000000 -0.966342 2449059.000000 -0.970624 2449060.000000 -0.974619 2449061.000000 -0.978326 2449062.000000 -0.981743 2449063.000000 -0.984870 2449064.000000 -0.987705 2449065.000000 -0.990248 2449066.000000 -0.992498 2449067.000000 -0.994454 2449068.000000 -0.996116 2449069.000000 -0.997483 2449070.000000 -0.998555 2449071.000000 -0.999332 2449072.000000 -0.999813 2449073.000000 -0.999998 2449074.000000 -0.999887 2449075.000000 -0.999480 2449076.000000 -0.998777 2449077.000000 -0.997779 2449078.000000 -0.996486 2449079.000000 -0.994897 2449080.000000 -0.993015 2449081.000000 -0.990838 2449082.000000 -0.988368 2449083.000000 -0.985606 2449084.000000 -0.982552 2449085.000000 -0.979208 2449086.000000 -0.975573 2449087.000000 -0.971650 2449088.000000 -0.967439 2449089.000000 -0.962943 2449090.000000 -0.958161 2449091.000000 -0.953095 2449092.000000 -0.947748 2449093.000000 -0.942120 2449094.000000 -0.936213 2449095.000000 -0.930030 2449096.000000 -0.923571 2449097.000000 -0.916838 2449098.000000 -0.909835 2449099.000000 -0.902562 2449100.000000 -0.895022 2449101.000000 -0.887218 2449102.000000 -0.879150 2449103.000000 -0.870823 2449104.000000 -0.862238 2449105.000000 -0.853398 2449106.000000 -0.844305 2449107.000000 -0.834962 2449108.000000 -0.825373 2449109.000000 -0.815539 2449110.000000 -0.805463 2449111.000000 -0.795150 2449112.000000 -0.784601 2449113.000000 -0.773820 2449114.000000 -0.762810 2449115.000000 -0.751574 2449116.000000 -0.740116 2449117.000000 -0.728438 2449118.000000 -0.716546 2449119.000000 -0.704441 2449120.000000 -0.692128 2449121.000000 -0.679610 2449122.000000 -0.666890 2449123.000000 -0.653974 2449124.000000 -0.640864 2449125.000000 -0.627564 2449126.000000 -0.614079 2449127.000000 -0.600412 2449128.000000 -0.586567 2449129.000000 -0.572548 2449130.000000 -0.558361 2449131.000000 -0.544008 2449132.000000 -0.529494 2449133.000000 -0.514823 2449134.000000 -0.500000 2449135.000000 -0.485029 2449136.000000 -0.469915 2449137.000000 -0.454661 2449138.000000 -0.439273 2449139.000000 -0.423755 2449140.000000 -0.408111 2449141.000000 -0.392347 2449142.000000 -0.376467 2449143.000000 -0.360475 2449144.000000 -0.344376 2449145.000000 -0.328176 2449146.000000 -0.311879 2449147.000000 -0.295489 2449148.000000 -0.279012 2449149.000000 -0.262452 2449150.000000 -0.245815 2449151.000000 -0.229104 2449152.000000 -0.212327 2449153.000000 -0.195486 2449154.000000 -0.178587 2449155.000000 -0.161636 2449156.000000 -0.144636 2449157.000000 -0.127594 2449158.000000 -0.110514 2449159.000000 -0.093402 2449160.000000 -0.076262 2449161.000000 -0.059099 2449162.000000 -0.041919 2449163.000000 -0.024726 2449164.000000 -0.007526 2449165.000000 0.009676 2449166.000000 0.026876 2449167.000000 0.044067 2449168.000000 0.061245 2449169.000000 0.078406 2449170.000000 0.095543 2449171.000000 0.112651 2449172.000000 0.129727 2449173.000000 0.146764 2449174.000000 0.163757 2449175.000000 0.180702 2449176.000000 0.197594 2449177.000000 0.214427 2449178.000000 0.231197 2449179.000000 0.247898 2449180.000000 0.264526 2449181.000000 0.281076 2449182.000000 0.297543 2449183.000000 0.313921 2449184.000000 0.330207 2449185.000000 0.346394 2449186.000000 0.362480 2449187.000000 0.378458 2449188.000000 0.394324 2449189.000000 0.410073 2449190.000000 0.425701 2449191.000000 0.441204 2449192.000000 0.456575 2449193.000000 0.471812 2449194.000000 0.486908 2449195.000000 0.501861 2449196.000000 0.516665 2449197.000000 0.531317 2449198.000000 0.545811 2449199.000000 0.560143 2449200.000000 0.574310 2449201.000000 0.588307 2449202.000000 0.602130 2449203.000000 0.615774 2449204.000000 0.629237 2449205.000000 0.642513 2449206.000000 0.655599 2449207.000000 0.668491 2449208.000000 0.681185 2449209.000000 0.693678 2449210.000000 0.705965 2449211.000000 0.718044 2449212.000000 0.729910 2449213.000000 0.741560 2449214.000000 0.752991 2449215.000000 0.764198 2449216.000000 0.775180 2449217.000000 0.785932 2449218.000000 0.796452 2449219.000000 0.806736 2449220.000000 0.816781 2449221.000000 0.826585 2449222.000000 0.836144 2449223.000000 0.845455 2449224.000000 0.854517 2449225.000000 0.863325 2449226.000000 0.871878 2449227.000000 0.880173 2449228.000000 0.888208 2449229.000000 0.895979 2449230.000000 0.903486 & grace-5.1.23/examples/logit.agr0000644000076500001440000013146507125744305016100 0ustar fnevgenyusers# Grace project file # @version 50101 @page size 612, 792 @description "6V tumor results (raw data)" @description "no correction for body weight effects" @description "" @description "by Ulrich Harttig 6/21/2000" @description "Department of Environmental & Molecular Toxicology" @description "Wiegand Hall 100, Oregon State University, Corvallis, 97331, OR, U.S.A." @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Mon Jun 26 23:45:35 2000" @with string @ string on @ string loctype world @ string g1 @ string 12.175727801, 0.992890122987 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "Liver" @with string @ string on @ string loctype world @ string g1 @ string 11.551882784, 0.0672316014515 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "Stomach" @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 10 @ world xmax 250 @ world ymin 0.001 @ world ymax 0.3 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.200000 @ view xmax 0.900000 @ view ymin 0.140000 @ view ymax 0.590000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Logit @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "ppm DBP (log)" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 0.900000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 40 @ xaxis tick minor ticks 5 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick out @ xaxis tick major size 0.800000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.400000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.790000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type both @ xaxis tick spec 13 @ xaxis tick major 0, 1 @ xaxis ticklabel 0, "1" @ xaxis tick minor 1, 2 @ xaxis tick minor 2, 3 @ xaxis tick minor 3, 4 @ xaxis tick major 4, 10 @ xaxis ticklabel 4, "10" @ xaxis tick major 5, 20 @ xaxis ticklabel 5, "20" @ xaxis tick major 6, 40 @ xaxis ticklabel 6, "40" @ xaxis tick major 7, 80 @ xaxis ticklabel 7, "80" @ xaxis tick minor 8, 120 @ xaxis tick major 9, 160 @ xaxis ticklabel 9, "160" @ xaxis tick major 10, 200 @ xaxis ticklabel 10, "200" @ xaxis tick minor 11, 240 @ xaxis tick major 12, 1600 @ xaxis ticklabel 12, "1600" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "% tumor incidence (logit)" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.1 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick out @ yaxis tick major size 0.800000 @ yaxis tick major color 7 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 7 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 2 @ yaxis tick minor grid on @ yaxis tick minor size 0.400000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 2 @ yaxis ticklabel formula "$t*100" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 0.790000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type ticks @ yaxis tick spec 8 @ yaxis tick major 0, 0.001 @ yaxis tick major 1, 0.005 @ yaxis tick major 2, 0.01 @ yaxis tick major 3, 0.02 @ yaxis tick major 4, 0.05 @ yaxis tick major 5, 0.1 @ yaxis tick major 6, 0.2 @ yaxis tick major 7, 0.3 @ altxaxis off @ altyaxis off @ legend on @ legend loctype world @ legend 11, 0.26 @ legend box color 7 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 0.700000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 1 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s1 hidden false @ s1 type xydy @ s1 symbol 1 @ s1 symbol size 0.800000 @ s1 symbol color 11 @ s1 symbol pattern 1 @ s1 symbol fill color 11 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 11 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 11 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "Cols 2:7:8" @ s1 legend "DBP only" @ s2 hidden false @ s2 type xydy @ s2 symbol 1 @ s2 symbol size 0.800000 @ s2 symbol color 15 @ s2 symbol pattern 1 @ s2 symbol fill color 15 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 0 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 15 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 15 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip on @ s2 errorbar riser clip length 0.100000 @ s2 comment "copy of set G0.S0" @ s2 legend "700 ppm I3C" @ s3 hidden false @ s3 type xydy @ s3 symbol 3 @ s3 symbol size 0.900000 @ s3 symbol color 2 @ s3 symbol pattern 1 @ s3 symbol fill color 2 @ s3 symbol fill pattern 1 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 0 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 2 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 1 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 2 @ s3 errorbar pattern 1 @ s3 errorbar size 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip on @ s3 errorbar riser clip length 0.100000 @ s3 comment "copy of set G0.S0" @ s3 legend "1400 ppm I3C" @ s4 hidden false @ s4 type xydy @ s4 symbol 4 @ s4 symbol size 0.800000 @ s4 symbol color 4 @ s4 symbol pattern 1 @ s4 symbol fill color 4 @ s4 symbol fill pattern 1 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 0 @ s4 symbol skip 0 @ s4 line type 0 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 4 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill rule 0 @ s4 fill color 1 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar on @ s4 errorbar place both @ s4 errorbar color 4 @ s4 errorbar pattern 1 @ s4 errorbar size 1.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 errorbar riser clip on @ s4 errorbar riser clip length 0.100000 @ s4 comment "Cols 2:7:8" @ s4 legend "2100 ppm I3C" @ s5 hidden false @ s5 type xydy @ s5 symbol 6 @ s5 symbol size 0.800000 @ s5 symbol color 14 @ s5 symbol pattern 1 @ s5 symbol fill color 14 @ s5 symbol fill pattern 1 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 0 @ s5 symbol skip 0 @ s5 line type 0 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 14 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill rule 0 @ s5 fill color 1 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar on @ s5 errorbar place both @ s5 errorbar color 14 @ s5 errorbar pattern 1 @ s5 errorbar size 1.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 errorbar riser clip on @ s5 errorbar riser clip length 0.100000 @ s5 comment "copy of set G0.S3" @ s5 legend "2800 ppm I3C" @ s6 hidden false @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol color 11 @ s6 symbol pattern 1 @ s6 symbol fill color 11 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1.0 @ s6 symbol linestyle 1 @ s6 symbol char 65 @ s6 symbol char font 0 @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 1.0 @ s6 line color 11 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 0 @ s6 fill rule 0 @ s6 fill color 1 @ s6 fill pattern 1 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar on @ s6 errorbar place both @ s6 errorbar color 11 @ s6 errorbar pattern 1 @ s6 errorbar size 1.000000 @ s6 errorbar linewidth 1.0 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1.0 @ s6 errorbar riser linestyle 1 @ s6 errorbar riser clip off @ s6 errorbar riser clip length 0.100000 @ s6 comment "Cols 2:14" @ s6 legend "" @ s7 hidden false @ s7 type xy @ s7 symbol 0 @ s7 symbol size 1.000000 @ s7 symbol color 15 @ s7 symbol pattern 1 @ s7 symbol fill color 15 @ s7 symbol fill pattern 0 @ s7 symbol linewidth 1.0 @ s7 symbol linestyle 1 @ s7 symbol char 65 @ s7 symbol char font 0 @ s7 symbol skip 0 @ s7 line type 1 @ s7 line linestyle 1 @ s7 line linewidth 1.0 @ s7 line color 15 @ s7 line pattern 1 @ s7 baseline type 0 @ s7 baseline off @ s7 dropline off @ s7 fill type 0 @ s7 fill rule 0 @ s7 fill color 1 @ s7 fill pattern 1 @ s7 avalue off @ s7 avalue type 2 @ s7 avalue char size 1.000000 @ s7 avalue font 0 @ s7 avalue color 1 @ s7 avalue rot 0 @ s7 avalue format general @ s7 avalue prec 3 @ s7 avalue prepend "" @ s7 avalue append "" @ s7 avalue offset 0.000000 , 0.000000 @ s7 errorbar on @ s7 errorbar place both @ s7 errorbar color 15 @ s7 errorbar pattern 1 @ s7 errorbar size 1.000000 @ s7 errorbar linewidth 1.0 @ s7 errorbar linestyle 1 @ s7 errorbar riser linewidth 1.0 @ s7 errorbar riser linestyle 1 @ s7 errorbar riser clip off @ s7 errorbar riser clip length 0.100000 @ s7 comment "copy of set G0.S6" @ s7 legend "" @ s8 hidden false @ s8 type xy @ s8 symbol 0 @ s8 symbol size 1.000000 @ s8 symbol color 2 @ s8 symbol pattern 1 @ s8 symbol fill color 2 @ s8 symbol fill pattern 0 @ s8 symbol linewidth 1.0 @ s8 symbol linestyle 1 @ s8 symbol char 65 @ s8 symbol char font 0 @ s8 symbol skip 0 @ s8 line type 1 @ s8 line linestyle 1 @ s8 line linewidth 1.0 @ s8 line color 2 @ s8 line pattern 1 @ s8 baseline type 0 @ s8 baseline off @ s8 dropline off @ s8 fill type 0 @ s8 fill rule 0 @ s8 fill color 1 @ s8 fill pattern 1 @ s8 avalue off @ s8 avalue type 2 @ s8 avalue char size 1.000000 @ s8 avalue font 0 @ s8 avalue color 1 @ s8 avalue rot 0 @ s8 avalue format general @ s8 avalue prec 3 @ s8 avalue prepend "" @ s8 avalue append "" @ s8 avalue offset 0.000000 , 0.000000 @ s8 errorbar on @ s8 errorbar place both @ s8 errorbar color 2 @ s8 errorbar pattern 1 @ s8 errorbar size 1.000000 @ s8 errorbar linewidth 1.0 @ s8 errorbar linestyle 1 @ s8 errorbar riser linewidth 1.0 @ s8 errorbar riser linestyle 1 @ s8 errorbar riser clip off @ s8 errorbar riser clip length 0.100000 @ s8 comment "copy of set G0.S7" @ s8 legend "" @ s9 hidden false @ s9 type xy @ s9 symbol 0 @ s9 symbol size 1.000000 @ s9 symbol color 4 @ s9 symbol pattern 1 @ s9 symbol fill color 4 @ s9 symbol fill pattern 0 @ s9 symbol linewidth 1.0 @ s9 symbol linestyle 1 @ s9 symbol char 65 @ s9 symbol char font 0 @ s9 symbol skip 0 @ s9 line type 1 @ s9 line linestyle 1 @ s9 line linewidth 1.0 @ s9 line color 4 @ s9 line pattern 1 @ s9 baseline type 0 @ s9 baseline off @ s9 dropline off @ s9 fill type 0 @ s9 fill rule 0 @ s9 fill color 1 @ s9 fill pattern 1 @ s9 avalue off @ s9 avalue type 2 @ s9 avalue char size 1.000000 @ s9 avalue font 0 @ s9 avalue color 1 @ s9 avalue rot 0 @ s9 avalue format general @ s9 avalue prec 3 @ s9 avalue prepend "" @ s9 avalue append "" @ s9 avalue offset 0.000000 , 0.000000 @ s9 errorbar on @ s9 errorbar place both @ s9 errorbar color 4 @ s9 errorbar pattern 1 @ s9 errorbar size 1.000000 @ s9 errorbar linewidth 1.0 @ s9 errorbar linestyle 1 @ s9 errorbar riser linewidth 1.0 @ s9 errorbar riser linestyle 1 @ s9 errorbar riser clip off @ s9 errorbar riser clip length 0.100000 @ s9 comment "copy of set G0.S7" @ s9 legend "" @ s10 hidden false @ s10 type xy @ s10 symbol 0 @ s10 symbol size 1.000000 @ s10 symbol color 14 @ s10 symbol pattern 1 @ s10 symbol fill color 14 @ s10 symbol fill pattern 0 @ s10 symbol linewidth 1.0 @ s10 symbol linestyle 1 @ s10 symbol char 65 @ s10 symbol char font 0 @ s10 symbol skip 0 @ s10 line type 1 @ s10 line linestyle 1 @ s10 line linewidth 1.0 @ s10 line color 14 @ s10 line pattern 1 @ s10 baseline type 0 @ s10 baseline off @ s10 dropline off @ s10 fill type 0 @ s10 fill rule 0 @ s10 fill color 1 @ s10 fill pattern 1 @ s10 avalue off @ s10 avalue type 2 @ s10 avalue char size 1.000000 @ s10 avalue font 0 @ s10 avalue color 1 @ s10 avalue rot 0 @ s10 avalue format general @ s10 avalue prec 3 @ s10 avalue prepend "" @ s10 avalue append "" @ s10 avalue offset 0.000000 , 0.000000 @ s10 errorbar on @ s10 errorbar place both @ s10 errorbar color 14 @ s10 errorbar pattern 1 @ s10 errorbar size 1.000000 @ s10 errorbar linewidth 1.0 @ s10 errorbar linestyle 1 @ s10 errorbar riser linewidth 1.0 @ s10 errorbar riser linestyle 1 @ s10 errorbar riser clip off @ s10 errorbar riser clip length 0.100000 @ s10 comment "copy of set G0.S9" @ s10 legend "" @g1 on @g1 hidden false @g1 type XY @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 10 @ world xmax 250 @ world ymin 0.2 @ world ymax 0.992 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.200000 @ view xmax 0.900000 @ view ymin 0.690000 @ view ymax 1.140000 @ title "6V: Modulation of DBP carcinogenicity by dietary I3C" @ title font 0 @ title size 1.050000 @ title color 1 @ subtitle "Logistic regression models" @ subtitle font 0 @ subtitle size 0.950000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Logit @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 40 @ xaxis tick minor ticks 5 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick out @ xaxis tick major size 0.800000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.400000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.790000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type both @ xaxis tick spec 13 @ xaxis tick major 0, 1 @ xaxis ticklabel 0, "1" @ xaxis tick minor 1, 2 @ xaxis tick minor 2, 3 @ xaxis tick minor 3, 4 @ xaxis tick major 4, 10 @ xaxis ticklabel 4, "10" @ xaxis tick major 5, 20 @ xaxis ticklabel 5, "20" @ xaxis tick major 6, 40 @ xaxis ticklabel 6, "40" @ xaxis tick major 7, 80 @ xaxis ticklabel 7, "80" @ xaxis tick minor 8, 120 @ xaxis tick major 9, 160 @ xaxis ticklabel 9, "160" @ xaxis tick major 10, 200 @ xaxis ticklabel 10, "200" @ xaxis tick minor 11, 240 @ xaxis tick major 12, 1600 @ xaxis ticklabel 12, "1600" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "% tumor incidence (logit)" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.1 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick out @ yaxis tick major size 0.800000 @ yaxis tick major color 7 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 7 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 2 @ yaxis tick minor grid on @ yaxis tick minor size 0.400000 @ yaxis ticklabel on @ yaxis ticklabel format decimal @ yaxis ticklabel prec 0 @ yaxis ticklabel formula "100*$t" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 0.790000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type ticks @ yaxis tick spec 19 @ yaxis tick major 0, 0.1 @ yaxis tick minor 1, 0.15 @ yaxis tick major 2, 0.2 @ yaxis tick minor 3, 0.25 @ yaxis tick major 4, 0.3 @ yaxis tick minor 5, 0.35 @ yaxis tick major 6, 0.4 @ yaxis tick minor 7, 0.45 @ yaxis tick major 8, 0.5 @ yaxis tick minor 9, 0.55 @ yaxis tick major 10, 0.6 @ yaxis tick minor 11, 0.65 @ yaxis tick major 12, 0.7 @ yaxis tick minor 13, 0.75 @ yaxis tick major 14, 0.8 @ yaxis tick minor 15, 0.85 @ yaxis tick major 16, 0.9 @ yaxis tick major 17, 0.95 @ yaxis tick major 18, 0.99 @ altxaxis off @ altyaxis off @ legend on @ legend loctype world @ legend 11, 0.99 @ legend box color 7 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 8 @ legend font 0 @ legend char size 0.700000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 1 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 6 @ frame background pattern 0 @ s0 hidden false @ s0 type xydy @ s0 symbol 1 @ s0 symbol size 0.800000 @ s0 symbol color 11 @ s0 symbol pattern 1 @ s0 symbol fill color 11 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 11 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 11 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "copy of set G0.S0" @ s0 legend "DBP only" @ s1 hidden false @ s1 type xydy @ s1 symbol 1 @ s1 symbol size 0.800000 @ s1 symbol color 15 @ s1 symbol pattern 1 @ s1 symbol fill color 15 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 15 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 15 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "copy of set G0.S1" @ s1 legend "700 ppm I3C" @ s2 hidden false @ s2 type xydy @ s2 symbol 3 @ s2 symbol size 0.900000 @ s2 symbol color 2 @ s2 symbol pattern 1 @ s2 symbol fill color 2 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 0 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 2 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 2 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "copy of set G0.S2" @ s2 legend "1400 ppm I3C" @ s3 hidden false @ s3 type xydy @ s3 symbol 4 @ s3 symbol size 0.800000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 1 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 0 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 4 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 1 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 4 @ s3 errorbar pattern 1 @ s3 errorbar size 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "copy of set G0.S3" @ s3 legend "2100 ppm I3C" @ s4 hidden false @ s4 type xydy @ s4 symbol 6 @ s4 symbol size 0.800000 @ s4 symbol color 14 @ s4 symbol pattern 1 @ s4 symbol fill color 14 @ s4 symbol fill pattern 1 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 0 @ s4 symbol skip 0 @ s4 line type 0 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 14 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill rule 0 @ s4 fill color 1 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar on @ s4 errorbar place both @ s4 errorbar color 14 @ s4 errorbar pattern 1 @ s4 errorbar size 1.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 errorbar riser clip off @ s4 errorbar riser clip length 0.100000 @ s4 comment "copy of set G0.S4" @ s4 legend "2800 ppm I3C" @ s5 hidden false @ s5 type xydy @ s5 symbol 1 @ s5 symbol size 0.800000 @ s5 symbol color 15 @ s5 symbol pattern 1 @ s5 symbol fill color 15 @ s5 symbol fill pattern 1 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 0 @ s5 symbol skip 0 @ s5 line type 0 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 15 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill rule 0 @ s5 fill color 1 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar on @ s5 errorbar place opposite @ s5 errorbar color 15 @ s5 errorbar pattern 1 @ s5 errorbar size 1.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 errorbar riser clip off @ s5 errorbar riser clip length 0.100000 @ s5 comment "copy of set G0.S5" @ s5 legend "" @ s6 hidden false @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol color 11 @ s6 symbol pattern 1 @ s6 symbol fill color 11 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1.0 @ s6 symbol linestyle 1 @ s6 symbol char 65 @ s6 symbol char font 0 @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 1.0 @ s6 line color 11 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 0 @ s6 fill rule 0 @ s6 fill color 1 @ s6 fill pattern 1 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar on @ s6 errorbar place both @ s6 errorbar color 11 @ s6 errorbar pattern 1 @ s6 errorbar size 1.000000 @ s6 errorbar linewidth 1.0 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1.0 @ s6 errorbar riser linestyle 1 @ s6 errorbar riser clip off @ s6 errorbar riser clip length 0.100000 @ s6 comment "Cols 2:13" @ s6 legend "" @ s7 hidden false @ s7 type xy @ s7 symbol 0 @ s7 symbol size 1.000000 @ s7 symbol color 15 @ s7 symbol pattern 1 @ s7 symbol fill color 15 @ s7 symbol fill pattern 0 @ s7 symbol linewidth 1.0 @ s7 symbol linestyle 1 @ s7 symbol char 65 @ s7 symbol char font 0 @ s7 symbol skip 0 @ s7 line type 1 @ s7 line linestyle 1 @ s7 line linewidth 1.0 @ s7 line color 15 @ s7 line pattern 1 @ s7 baseline type 0 @ s7 baseline off @ s7 dropline off @ s7 fill type 0 @ s7 fill rule 0 @ s7 fill color 1 @ s7 fill pattern 1 @ s7 avalue off @ s7 avalue type 2 @ s7 avalue char size 1.000000 @ s7 avalue font 0 @ s7 avalue color 1 @ s7 avalue rot 0 @ s7 avalue format general @ s7 avalue prec 3 @ s7 avalue prepend "" @ s7 avalue append "" @ s7 avalue offset 0.000000 , 0.000000 @ s7 errorbar on @ s7 errorbar place both @ s7 errorbar color 15 @ s7 errorbar pattern 1 @ s7 errorbar size 1.000000 @ s7 errorbar linewidth 1.0 @ s7 errorbar linestyle 1 @ s7 errorbar riser linewidth 1.0 @ s7 errorbar riser linestyle 1 @ s7 errorbar riser clip off @ s7 errorbar riser clip length 0.100000 @ s7 comment "Cols 2:13" @ s7 legend "" @ s8 hidden false @ s8 type xy @ s8 symbol 0 @ s8 symbol size 1.000000 @ s8 symbol color 2 @ s8 symbol pattern 1 @ s8 symbol fill color 2 @ s8 symbol fill pattern 0 @ s8 symbol linewidth 1.0 @ s8 symbol linestyle 1 @ s8 symbol char 65 @ s8 symbol char font 0 @ s8 symbol skip 0 @ s8 line type 1 @ s8 line linestyle 1 @ s8 line linewidth 1.0 @ s8 line color 2 @ s8 line pattern 1 @ s8 baseline type 0 @ s8 baseline off @ s8 dropline off @ s8 fill type 0 @ s8 fill rule 0 @ s8 fill color 1 @ s8 fill pattern 1 @ s8 avalue off @ s8 avalue type 2 @ s8 avalue char size 1.000000 @ s8 avalue font 0 @ s8 avalue color 1 @ s8 avalue rot 0 @ s8 avalue format general @ s8 avalue prec 3 @ s8 avalue prepend "" @ s8 avalue append "" @ s8 avalue offset 0.000000 , 0.000000 @ s8 errorbar on @ s8 errorbar place both @ s8 errorbar color 2 @ s8 errorbar pattern 1 @ s8 errorbar size 1.000000 @ s8 errorbar linewidth 1.0 @ s8 errorbar linestyle 1 @ s8 errorbar riser linewidth 1.0 @ s8 errorbar riser linestyle 1 @ s8 errorbar riser clip off @ s8 errorbar riser clip length 0.100000 @ s8 comment "copy of set G1.S6" @ s8 legend "" @ s9 hidden false @ s9 type xy @ s9 symbol 0 @ s9 symbol size 1.000000 @ s9 symbol color 4 @ s9 symbol pattern 1 @ s9 symbol fill color 4 @ s9 symbol fill pattern 0 @ s9 symbol linewidth 1.0 @ s9 symbol linestyle 1 @ s9 symbol char 65 @ s9 symbol char font 0 @ s9 symbol skip 0 @ s9 line type 1 @ s9 line linestyle 1 @ s9 line linewidth 1.0 @ s9 line color 4 @ s9 line pattern 1 @ s9 baseline type 0 @ s9 baseline off @ s9 dropline off @ s9 fill type 0 @ s9 fill rule 0 @ s9 fill color 1 @ s9 fill pattern 1 @ s9 avalue off @ s9 avalue type 2 @ s9 avalue char size 1.000000 @ s9 avalue font 0 @ s9 avalue color 1 @ s9 avalue rot 0 @ s9 avalue format general @ s9 avalue prec 3 @ s9 avalue prepend "" @ s9 avalue append "" @ s9 avalue offset 0.000000 , 0.000000 @ s9 errorbar on @ s9 errorbar place both @ s9 errorbar color 4 @ s9 errorbar pattern 1 @ s9 errorbar size 1.000000 @ s9 errorbar linewidth 1.0 @ s9 errorbar linestyle 1 @ s9 errorbar riser linewidth 1.0 @ s9 errorbar riser linestyle 1 @ s9 errorbar riser clip off @ s9 errorbar riser clip length 0.100000 @ s9 comment "copy of set G1.S6" @ s9 legend "" @ s10 hidden false @ s10 type xy @ s10 symbol 0 @ s10 symbol size 1.000000 @ s10 symbol color 14 @ s10 symbol pattern 1 @ s10 symbol fill color 14 @ s10 symbol fill pattern 0 @ s10 symbol linewidth 1.0 @ s10 symbol linestyle 1 @ s10 symbol char 65 @ s10 symbol char font 0 @ s10 symbol skip 0 @ s10 line type 1 @ s10 line linestyle 1 @ s10 line linewidth 1.0 @ s10 line color 14 @ s10 line pattern 1 @ s10 baseline type 0 @ s10 baseline off @ s10 dropline off @ s10 fill type 0 @ s10 fill rule 0 @ s10 fill color 1 @ s10 fill pattern 1 @ s10 avalue off @ s10 avalue type 2 @ s10 avalue char size 1.000000 @ s10 avalue font 0 @ s10 avalue color 1 @ s10 avalue rot 0 @ s10 avalue format general @ s10 avalue prec 3 @ s10 avalue prepend "" @ s10 avalue append "" @ s10 avalue offset 0.000000 , 0.000000 @ s10 errorbar on @ s10 errorbar place both @ s10 errorbar color 14 @ s10 errorbar pattern 1 @ s10 errorbar size 1.000000 @ s10 errorbar linewidth 1.0 @ s10 errorbar linestyle 1 @ s10 errorbar riser linewidth 1.0 @ s10 errorbar riser linestyle 1 @ s10 errorbar riser clip off @ s10 errorbar riser clip length 0.100000 @ s10 comment "copy of set G1.S6" @ s10 legend "" @target G0.S1 @type xydy 20 0 0 40 0 0 80 0.10897436 0.02502888 160 0.22727273 0.036614334 & @target G0.S2 @type xydy 20 0.003649635 0.003649635 40 0.007246377 0.007246377 80 0.030769231 0.015204672 160 0.11009174 0.030118831 & @target G0.S3 @type xydy 20 0.004950495 0.004950495 40 0 0 80 0.008928571 0.008928571 160 0.037209302 0.012938527 & @target G0.S4 @type xydy 20 0.004739337 0.004739337 40 0 0 80 0.018518519 0.013033237 160 0.05 0.024520722 & @target G0.S5 @type xydy 20 0.007326007 0.005170738 40 0 0 80 0 0 160 0.079207921 0.0270063 & @target G0.S6 @type xy 20 0.006684801 40 0.023495829 80 0.079212104 160 0.23522394 & @target G0.S7 @type xy 20 0.00263443 40 0.009355465 80 0.032661876 160 0.10771622 & @target G0.S8 @type xy 20 0.000860029 40 0.003068084 80 0.010883399 160 0.037850775 & @target G0.S9 @type xy 20 0.001277652 40 0.004553037 80 0.016089916 160 0.055237773 & @target G0.S10 @type xy 20 0.001520682 40 0.005415721 80 0.019096608 160 0.065076105 & @target G1.S0 @type xydy 20 0.6627907 0.036152632 40 0.86538462 0.0336305 80 0.92948718 0.020563162 160 0.97727273 0.013021047 & @target G1.S1 @type xydy 20 0.51459854 0.030248475 40 0.72463768 0.038163872 80 0.82307692 0.033598323 & @target G1.S2 @type xydy 20 0.32673267 0.03308202 40 0.54248366 0.040408697 80 0.75 0.041099747 160 0.85116279 0.024330733 & @target G1.S3 @type xydy 20 0.28909953 0.031283724 40 0.50793651 0.044715725 80 0.78703704 0.039578355 160 0.8625 0.038745151 & @target G1.S4 @type xydy 20 0.28205128 0.027285147 40 0.51587302 0.044698819 80 0.81967213 0.034950937 160 0.88118812 0.032356702 & @target G1.S5 @type xydy 160 0.99082569 0.009174312 & @target G1.S6 @type xy 20 0.67445114 40 0.84403977 80 0.93393764 160 0.9736356 & @target G1.S7 @type xy 20 0.50563347 40 0.72765289 80 0.87467682 160 0.94800295 & @target G1.S8 @type xy 20 0.30171611 40 0.53023126 80 0.74673701 160 0.88508556 & @target G1.S9 @type xy 20 0.29584529 40 0.52324584 80 0.74140087 160 0.88220455 & @target G1.S10 @type xy 20 0.3040075 40 0.53293359 80 0.74878397 160 0.88618477 & grace-5.1.23/examples/au.agr0000644000076500001440000023534506626627163015400 0ustar fnevgenyusers# ACE/gr parameter file # @version 40000 @with g0 @g0 on @g0 label off @g0 hidden false @g0 type xy @g0 autoscale type AUTO @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format degreesmmsslon degreesmmsslat @g0 fixedpoint prec 0, 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 2 @ default font source 0 @ default symbol size 1.000000 @ world xmin 110 @ world xmax 180 @ world ymin -55 @ world ymax -10 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 3 @ s0 color 2 @ s0 fill 1 @ s0 fill with color @ s0 fill color 8 @ s0 fill pattern 1 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "examples/au.d" @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol fill 0 @ s1 symbol center false @ s1 skip 0 @ s1 linestyle 1 @ s1 linewidth 3 @ s1 color 2 @ s1 fill 1 @ s1 fill with color @ s1 fill color 8 @ s1 fill pattern 1 @ s1 errorbar type BOTH @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser on @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "examples/au.d" @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol fill 0 @ s2 symbol center false @ s2 skip 0 @ s2 linestyle 1 @ s2 linewidth 3 @ s2 color 2 @ s2 fill 1 @ s2 fill with color @ s2 fill color 8 @ s2 fill pattern 1 @ s2 errorbar type BOTH @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1 @ s2 errorbar linestyle 1 @ s2 errorbar riser on @ s2 errorbar riser linewidth 1 @ s2 errorbar riser linestyle 1 @ s2 comment "examples/au.d" @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol fill 0 @ s3 symbol center false @ s3 skip 0 @ s3 linestyle 1 @ s3 linewidth 3 @ s3 color 2 @ s3 fill 1 @ s3 fill with color @ s3 fill color 8 @ s3 fill pattern 1 @ s3 errorbar type BOTH @ s3 errorbar length 1.000000 @ s3 errorbar linewidth 1 @ s3 errorbar linestyle 1 @ s3 errorbar riser on @ s3 errorbar riser linewidth 1 @ s3 errorbar riser linestyle 1 @ s3 comment "examples/au.d" @ s4 type xy @ s4 symbol 0 @ s4 symbol size 1.000000 @ s4 symbol fill 0 @ s4 symbol center false @ s4 skip 0 @ s4 linestyle 1 @ s4 linewidth 3 @ s4 color 2 @ s4 fill 1 @ s4 fill with color @ s4 fill color 8 @ s4 fill pattern 1 @ s4 errorbar type BOTH @ s4 errorbar length 1.000000 @ s4 errorbar linewidth 1 @ s4 errorbar linestyle 1 @ s4 errorbar riser on @ s4 errorbar riser linewidth 1 @ s4 errorbar riser linestyle 1 @ s4 comment "examples/au.d" @ s5 type xy @ s5 symbol 0 @ s5 symbol size 1.000000 @ s5 symbol fill 0 @ s5 symbol center false @ s5 skip 0 @ s5 linestyle 1 @ s5 linewidth 3 @ s5 color 2 @ s5 fill 1 @ s5 fill with color @ s5 fill color 8 @ s5 fill pattern 1 @ s5 errorbar type BOTH @ s5 errorbar length 1.000000 @ s5 errorbar linewidth 1 @ s5 errorbar linestyle 1 @ s5 errorbar riser on @ s5 errorbar riser linewidth 1 @ s5 errorbar riser linestyle 1 @ s5 comment "examples/au.d" @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol fill 0 @ s6 symbol center false @ s6 skip 0 @ s6 linestyle 1 @ s6 linewidth 3 @ s6 color 2 @ s6 fill 1 @ s6 fill with color @ s6 fill color 8 @ s6 fill pattern 1 @ s6 errorbar type BOTH @ s6 errorbar length 1.000000 @ s6 errorbar linewidth 1 @ s6 errorbar linestyle 1 @ s6 errorbar riser on @ s6 errorbar riser linewidth 1 @ s6 errorbar riser linestyle 1 @ s6 comment "examples/au.d" @ s7 type xy @ s7 symbol 0 @ s7 symbol size 1.000000 @ s7 symbol fill 0 @ s7 symbol center false @ s7 skip 0 @ s7 linestyle 1 @ s7 linewidth 3 @ s7 color 2 @ s7 fill 1 @ s7 fill with color @ s7 fill color 8 @ s7 fill pattern 1 @ s7 errorbar type BOTH @ s7 errorbar length 1.000000 @ s7 errorbar linewidth 1 @ s7 errorbar linestyle 1 @ s7 errorbar riser on @ s7 errorbar riser linewidth 1 @ s7 errorbar riser linestyle 1 @ s7 comment "examples/au.d" @ s8 type xy @ s8 symbol 0 @ s8 symbol size 1.000000 @ s8 symbol fill 0 @ s8 symbol center false @ s8 skip 0 @ s8 linestyle 1 @ s8 linewidth 3 @ s8 color 2 @ s8 fill 1 @ s8 fill with color @ s8 fill color 8 @ s8 fill pattern 1 @ s8 errorbar type BOTH @ s8 errorbar length 1.000000 @ s8 errorbar linewidth 1 @ s8 errorbar linestyle 1 @ s8 errorbar riser on @ s8 errorbar riser linewidth 1 @ s8 errorbar riser linestyle 1 @ s8 comment "examples/au.d" @ s9 type xy @ s9 symbol 0 @ s9 symbol size 1.000000 @ s9 symbol fill 0 @ s9 symbol center false @ s9 skip 0 @ s9 linestyle 1 @ s9 linewidth 3 @ s9 color 2 @ s9 fill 1 @ s9 fill with color @ s9 fill color 8 @ s9 fill pattern 1 @ s9 errorbar type BOTH @ s9 errorbar length 1.000000 @ s9 errorbar linewidth 1 @ s9 errorbar linestyle 1 @ s9 errorbar riser on @ s9 errorbar riser linewidth 1 @ s9 errorbar riser linestyle 1 @ s9 comment "examples/au.d" @ xaxis tick on @ xaxis tick major 10.000000 @ xaxis tick minor 10.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 0 @ xaxis ticklabel format degreeslon @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 50.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 10.000000 @ yaxis tick minor 5.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 0 @ yaxis ticklabel format degreeslat @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type spec @ yaxis ticklabel start -50.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 20.000000 @ zeroxaxis tick minor 10.000000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 2 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 4 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @TYPE xy 144.912000 -40.723000 144.891000 -40.781000 144.896000 -40.801000 144.891000 -40.835000 144.896000 -40.888000 144.902000 -40.909000 144.902000 -40.959000 144.912000 -41.041000 144.950000 -41.231000 145.030000 -41.403000 145.036000 -41.432000 145.100000 -41.551000 145.159000 -41.625000 145.175000 -41.657000 145.202000 -41.670000 145.235000 -41.698000 145.256000 -41.731000 145.278000 -41.784000 145.315000 -41.813000 145.347000 -41.853000 145.364000 -41.894000 145.535000 -42.032000 145.611000 -42.114000 145.627000 -42.158000 145.648000 -42.183000 145.648000 -42.199000 145.664000 -42.219000 145.670000 -42.252000 145.648000 -42.300000 145.632000 -42.333000 145.616000 -42.417000 145.675000 -42.611000 145.740000 -42.708000 145.938000 -42.989000 146.019000 -43.081000 146.062000 -43.120000 146.132000 -43.168000 146.320000 -43.304000 146.357000 -43.316000 146.411000 -43.352000 146.460000 -43.376000 146.476000 -43.395000 146.513000 -43.403000 146.540000 -43.423000 146.594000 -43.431000 146.669000 -43.479000 146.771000 -43.507000 146.819000 -43.499000 146.857000 -43.471000 146.884000 -43.439000 146.922000 -43.344000 147.029000 -43.240000 147.067000 -43.232000 147.083000 -43.220000 147.115000 -43.212000 147.212000 -43.184000 147.239000 -43.156000 147.410000 -43.089000 147.437000 -42.993000 147.480000 -42.993000 147.496000 -43.005000 147.545000 -43.013000 147.604000 -43.021000 147.663000 -42.997000 147.754000 -42.916000 147.819000 -42.932000 147.840000 -42.948000 147.905000 -42.952000 147.980000 -42.940000 147.980000 -42.852000 147.969000 -42.828000 147.996000 -42.716000 148.007000 -42.680000 148.023000 -42.647000 148.007000 -42.587000 147.996000 -42.526000 147.975000 -42.454000 147.991000 -42.369000 148.012000 -42.324000 148.050000 -42.304000 148.093000 -42.276000 148.130000 -42.260000 148.141000 -42.235000 148.173000 -42.207000 148.222000 -42.065000 148.254000 -42.032000 148.302000 -41.963000 148.351000 -41.902000 148.388000 -41.796000 148.394000 -41.715000 148.420000 -41.584000 148.415000 -41.498000 148.410000 -41.444000 148.394000 -41.412000 148.340000 -41.132000 148.351000 -41.115000 148.335000 -41.087000 148.335000 -41.058000 148.313000 -41.025000 148.270000 -40.959000 148.227000 -40.917000 148.189000 -40.901000 148.163000 -40.868000 148.146000 -40.876000 148.114000 -40.863000 148.018000 -40.880000 147.937000 -40.901000 147.926000 -40.926000 147.840000 -40.971000 147.663000 -40.971000 147.513000 -41.016000 147.330000 -41.078000 147.281000 -41.066000 147.239000 -41.066000 147.222000 -41.078000 147.126000 -41.091000 147.099000 -41.103000 147.056000 -41.099000 147.050000 -41.153000 147.050000 -41.177000 147.045000 -41.194000 147.072000 -41.247000 147.040000 -41.256000 147.002000 -41.247000 146.970000 -41.218000 146.911000 -41.186000 146.814000 -41.165000 146.540000 -41.218000 146.486000 -41.202000 146.438000 -41.190000 146.234000 -41.148000 145.971000 -41.132000 145.917000 -41.107000 145.745000 -41.054000 145.713000 -41.025000 145.648000 -41.000000 145.600000 -40.975000 145.519000 -40.901000 145.460000 -40.847000 145.423000 -40.785000 145.380000 -40.768000 145.358000 -40.793000 145.294000 -40.801000 145.261000 -40.835000 145.224000 -40.843000 145.186000 -40.835000 145.095000 -40.789000 145.052000 -40.764000 145.030000 -40.752000 144.993000 -40.768000 144.977000 -40.760000 144.955000 -40.756000 & @TYPE xy 173.043000 -34.382000 173.026000 -34.382000 173.000000 -34.387000 172.973000 -34.401000 172.935000 -34.405000 172.930000 -34.419000 172.892000 -34.423000 172.838000 -34.477000 172.812000 -34.531000 172.865000 -34.603000 173.000000 -34.698000 173.059000 -34.779000 173.069000 -34.797000 173.096000 -34.806000 173.123000 -34.837000 173.139000 -34.891000 173.193000 -35.012000 173.198000 -35.241000 173.215000 -35.272000 173.236000 -35.285000 173.252000 -35.325000 173.376000 -35.419000 173.472000 -35.491000 173.483000 -35.504000 173.510000 -35.513000 173.521000 -35.553000 173.542000 -35.620000 173.548000 -35.651000 173.682000 -35.859000 173.703000 -35.877000 173.779000 -35.953000 173.795000 -35.970000 173.897000 -36.037000 174.004000 -36.059000 174.122000 -36.081000 174.235000 -36.116000 174.251000 -36.165000 174.235000 -36.183000 174.192000 -36.231000 174.203000 -36.275000 174.278000 -36.328000 174.300000 -36.408000 174.311000 -36.443000 174.375000 -36.592000 174.402000 -36.636000 174.418000 -36.693000 174.407000 -36.711000 174.423000 -36.742000 174.461000 -36.794000 174.402000 -36.930000 174.434000 -36.939000 174.482000 -36.939000 174.482000 -36.956000 174.531000 -37.004000 174.585000 -37.113000 174.633000 -37.144000 174.670000 -37.170000 174.713000 -37.188000 174.756000 -37.340000 174.842000 -37.457000 174.859000 -37.518000 174.885000 -37.700000 174.869000 -37.813000 174.891000 -37.890000 174.848000 -38.175000 174.638000 -38.630000 174.579000 -38.788000 174.493000 -38.945000 174.396000 -39.013000 174.359000 -39.035000 174.273000 -39.077000 174.225000 -39.103000 174.192000 -39.149000 174.187000 -39.179000 174.165000 -39.247000 174.149000 -39.264000 174.149000 -39.289000 174.085000 -39.310000 173.972000 -39.374000 173.994000 -39.458000 174.047000 -39.555000 174.058000 -39.581000 174.090000 -39.619000 174.096000 -39.665000 174.192000 -39.703000 174.429000 -39.787000 174.450000 -39.808000 174.493000 -39.804000 174.525000 -39.825000 174.703000 -39.863000 174.816000 -39.884000 174.923000 -39.905000 174.966000 -39.922000 175.009000 -39.926000 175.041000 -39.943000 175.127000 -39.980000 175.256000 -40.102000 175.310000 -40.198000 175.310000 -40.282000 175.299000 -40.348000 175.278000 -40.403000 175.095000 -40.669000 175.025000 -40.756000 174.998000 -40.772000 174.961000 -40.781000 174.896000 -40.822000 174.762000 -40.913000 175.084000 -40.843000 175.084000 -40.876000 175.068000 -40.905000 175.073000 -40.926000 175.057000 -40.954000 175.047000 -40.988000 175.025000 -41.132000 175.041000 -41.173000 175.090000 -41.181000 175.138000 -41.202000 175.175000 -41.190000 175.272000 -41.198000 175.326000 -41.190000 175.347000 -41.214000 175.369000 -41.350000 175.380000 -41.461000 175.380000 -41.477000 175.412000 -41.510000 175.444000 -41.547000 175.471000 -41.567000 175.632000 -41.559000 175.632000 -41.543000 175.675000 -41.543000 175.718000 -41.522000 175.761000 -41.494000 175.804000 -41.457000 175.906000 -41.371000 176.035000 -41.256000 176.057000 -41.186000 176.116000 -41.173000 176.153000 -41.144000 176.191000 -41.099000 176.288000 -41.016000 176.288000 -40.996000 176.331000 -40.963000 176.384000 -40.901000 176.395000 -40.843000 176.411000 -40.818000 176.470000 -40.652000 176.492000 -40.644000 176.492000 -40.615000 176.674000 -40.394000 176.755000 -40.340000 176.771000 -40.344000 176.889000 -40.244000 176.905000 -40.223000 176.938000 -40.194000 176.954000 -40.181000 177.029000 -40.081000 177.061000 -39.997000 177.077000 -39.980000 177.094000 -39.909000 177.099000 -39.863000 177.147000 -39.833000 177.185000 -39.817000 177.222000 -39.766000 177.206000 -39.745000 177.185000 -39.699000 177.104000 -39.695000 177.040000 -39.623000 177.040000 -39.564000 177.083000 -39.454000 177.190000 -39.285000 177.255000 -39.217000 177.561000 -39.086000 177.781000 -39.090000 177.824000 -39.107000 177.905000 -39.153000 177.921000 -39.192000 177.899000 -39.230000 177.905000 -39.247000 177.883000 -39.272000 177.872000 -39.323000 178.050000 -39.281000 178.216000 -39.149000 178.243000 -39.103000 178.179000 -39.073000 178.044000 -38.941000 178.039000 -38.920000 178.061000 -38.860000 178.114000 -38.809000 178.146000 -38.788000 178.168000 -38.745000 178.232000 -38.724000 178.249000 -38.706000 178.313000 -38.600000 178.335000 -38.467000 178.345000 -38.446000 178.345000 -38.407000 178.372000 -38.360000 178.372000 -38.321000 178.480000 -38.076000 178.490000 -38.054000 178.480000 -38.020000 178.501000 -38.011000 178.512000 -37.968000 178.673000 -37.826000 178.721000 -37.800000 178.727000 -37.765000 178.641000 -37.765000 178.657000 -37.713000 178.582000 -37.609000 178.566000 -37.601000 178.544000 -37.562000 178.463000 -37.522000 178.426000 -37.522000 178.329000 -37.501000 178.104000 -37.470000 177.985000 -37.496000 177.942000 -37.522000 177.760000 -37.635000 177.706000 -37.692000 177.625000 -37.696000 177.179000 -37.852000 176.986000 -37.882000 176.723000 -37.834000 176.691000 -37.817000 176.578000 -37.791000 176.465000 -37.761000 176.384000 -37.752000 176.314000 -37.726000 176.282000 -37.726000 176.126000 -37.670000 176.094000 -37.670000 176.040000 -37.644000 176.008000 -37.618000 175.955000 -37.536000 175.960000 -37.505000 175.933000 -37.418000 175.955000 -37.109000 175.949000 -37.070000 175.981000 -36.965000 175.976000 -36.895000 175.938000 -36.812000 175.895000 -36.742000 175.858000 -36.680000 175.831000 -36.663000 175.815000 -36.605000 175.777000 -36.553000 175.734000 -36.535000 175.675000 -36.513000 175.654000 -36.487000 175.616000 -36.478000 175.509000 -36.465000 175.449000 -36.460000 175.417000 -36.478000 175.390000 -36.540000 175.449000 -36.680000 175.455000 -36.715000 175.503000 -36.746000 175.514000 -36.785000 175.503000 -36.912000 175.433000 -36.904000 175.326000 -36.816000 175.224000 -36.698000 175.186000 -36.676000 175.127000 -36.645000 175.090000 -36.636000 175.047000 -36.623000 175.004000 -36.601000 174.955000 -36.579000 174.901000 -36.570000 174.864000 -36.548000 174.842000 -36.522000 174.708000 -36.416000 174.676000 -36.386000 174.654000 -36.324000 174.617000 -36.275000 174.585000 -36.214000 174.525000 -36.059000 174.488000 -35.939000 174.488000 -35.922000 174.482000 -35.846000 174.354000 -35.811000 174.321000 -35.762000 174.284000 -35.717000 174.268000 -35.700000 174.262000 -35.677000 174.230000 -35.669000 174.208000 -35.642000 174.241000 -35.642000 174.396000 -35.660000 174.499000 -35.669000 174.525000 -35.499000 174.525000 -35.477000 174.515000 -35.450000 174.386000 -35.357000 174.364000 -35.303000 174.289000 -35.241000 174.133000 -35.120000 173.999000 -35.021000 173.908000 -34.837000 173.881000 -34.828000 173.832000 -34.792000 173.779000 -34.779000 173.763000 -34.761000 173.736000 -34.752000 173.703000 -34.743000 173.687000 -34.729000 173.628000 -34.711000 173.601000 -34.720000 173.580000 -34.716000 173.553000 -34.774000 173.542000 -34.824000 173.526000 -34.860000 173.510000 -34.900000 173.489000 -34.972000 173.343000 -34.734000 173.317000 -34.720000 173.306000 -34.689000 173.284000 -34.693000 173.080000 -34.594000 173.043000 -34.536000 173.037000 -34.495000 173.043000 -34.468000 173.053000 -34.423000 173.048000 -34.387000 173.043000 -34.364000 & @TYPE xy 173.069000 -40.627000 173.037000 -40.586000 172.924000 -40.557000 172.908000 -40.573000 172.618000 -40.573000 172.597000 -40.573000 172.500000 -40.594000 172.457000 -40.631000 172.409000 -40.681000 172.387000 -40.731000 172.366000 -40.752000 172.355000 -40.789000 172.328000 -40.859000 172.296000 -40.983000 172.269000 -41.041000 172.269000 -41.082000 172.253000 -41.115000 172.156000 -41.309000 172.145000 -41.375000 172.119000 -41.465000 172.124000 -41.518000 172.097000 -41.531000 172.092000 -41.547000 172.049000 -41.572000 171.963000 -41.617000 171.866000 -41.662000 171.828000 -41.694000 171.796000 -41.715000 171.775000 -41.723000 171.726000 -41.747000 171.710000 -41.776000 171.678000 -41.825000 171.565000 -41.935000 171.468000 -42.081000 171.350000 -42.284000 171.280000 -42.389000 171.227000 -42.518000 171.194000 -42.547000 171.092000 -42.684000 171.017000 -42.764000 170.980000 -42.808000 170.969000 -42.840000 170.920000 -42.860000 170.920000 -42.876000 170.861000 -42.924000 170.840000 -42.965000 170.749000 -43.045000 170.695000 -43.073000 170.652000 -43.152000 170.561000 -43.168000 170.475000 -43.220000 170.276000 -43.340000 170.163000 -43.380000 170.104000 -43.427000 170.056000 -43.451000 169.991000 -43.495000 169.932000 -43.546000 169.905000 -43.554000 169.862000 -43.586000 169.717000 -43.653000 169.674000 -43.657000 169.454000 -43.729000 169.164000 -43.871000 169.110000 -43.910000 169.078000 -43.946000 169.035000 -43.961000 169.008000 -43.981000 168.519000 -44.103000 168.481000 -44.127000 168.471000 -44.115000 168.471000 -44.135000 168.417000 -44.142000 168.234000 -44.240000 168.207000 -44.272000 168.073000 -44.370000 168.078000 -44.397000 168.009000 -44.428000 167.998000 -44.452000 167.933000 -44.499000 167.702000 -44.732000 167.504000 -44.884000 167.482000 -44.903000 167.407000 -45.043000 167.380000 -45.116000 167.359000 -45.131000 167.342000 -45.170000 167.348000 -45.232000 167.326000 -45.289000 167.348000 -45.316000 167.412000 -45.343000 167.514000 -45.378000 167.504000 -45.439000 167.348000 -45.424000 167.267000 -45.447000 167.165000 -45.585000 167.149000 -45.631000 167.063000 -45.742000 166.966000 -45.875000 166.950000 -45.944000 166.934000 -45.997000 166.923000 -46.092000 166.913000 -46.111000 166.939000 -46.187000 167.015000 -46.225000 167.042000 -46.229000 167.063000 -46.221000 167.122000 -46.217000 167.154000 -46.206000 167.504000 -46.145000 167.595000 -46.130000 167.686000 -46.138000 167.745000 -46.142000 167.950000 -46.130000 168.030000 -46.134000 168.095000 -46.164000 168.159000 -46.187000 168.186000 -46.202000 168.213000 -46.232000 168.234000 -46.251000 168.261000 -46.282000 168.320000 -46.335000 168.293000 -46.410000 168.245000 -46.433000 168.245000 -46.455000 168.406000 -46.489000 168.514000 -46.463000 168.605000 -46.455000 168.707000 -46.470000 168.723000 -46.482000 168.809000 -46.501000 168.933000 -46.493000 169.046000 -46.516000 169.169000 -46.572000 169.212000 -46.576000 169.255000 -46.580000 169.427000 -46.625000 169.561000 -46.647000 169.690000 -46.640000 169.749000 -46.602000 169.884000 -46.486000 169.905000 -46.452000 170.018000 -46.327000 170.045000 -46.263000 170.125000 -46.263000 170.195000 -46.267000 170.238000 -46.278000 170.324000 -46.259000 170.351000 -46.198000 170.378000 -46.153000 170.448000 -46.104000 170.480000 -46.088000 170.512000 -46.085000 170.544000 -46.062000 170.620000 -46.024000 170.657000 -45.993000 170.695000 -45.978000 170.716000 -45.959000 170.781000 -45.917000 170.797000 -45.887000 170.872000 -45.853000 170.996000 -45.753000 171.033000 -45.677000 171.071000 -45.646000 171.071000 -45.608000 170.894000 -45.631000 170.818000 -45.681000 170.732000 -45.731000 170.700000 -45.765000 170.953000 -45.424000 170.958000 -45.397000 170.990000 -45.351000 171.114000 -45.070000 171.141000 -44.961000 171.173000 -44.965000 171.221000 -44.868000 171.533000 -44.428000 171.565000 -44.397000 171.587000 -44.362000 171.624000 -44.338000 171.828000 -44.158000 172.070000 -44.028000 172.242000 -43.859000 172.280000 -43.835000 172.285000 -43.819000 172.317000 -43.800000 172.366000 -43.796000 172.419000 -43.835000 172.436000 -43.831000 172.704000 -43.922000 172.785000 -43.922000 172.908000 -43.883000 172.957000 -43.827000 173.053000 -43.701000 173.155000 -43.586000 173.134000 -43.562000 173.102000 -43.542000 173.064000 -43.534000 173.005000 -43.523000 172.946000 -43.491000 172.924000 -43.447000 172.935000 -43.368000 172.941000 -43.344000 173.102000 -43.168000 173.252000 -43.061000 173.284000 -43.021000 173.317000 -43.009000 173.403000 -42.944000 173.472000 -42.868000 173.553000 -42.744000 173.574000 -42.704000 173.574000 -42.663000 173.650000 -42.526000 173.671000 -42.510000 173.827000 -42.341000 173.870000 -42.280000 173.881000 -42.235000 173.994000 -42.175000 174.198000 -41.996000 174.230000 -41.951000 174.289000 -41.800000 174.305000 -41.719000 174.327000 -41.621000 174.300000 -41.547000 174.273000 -41.506000 174.262000 -41.444000 174.165000 -41.284000 174.133000 -41.202000 174.079000 -41.136000 174.106000 -41.054000 174.079000 -40.996000 174.063000 -40.979000 174.037000 -40.967000 173.999000 -40.946000 173.961000 -40.938000 173.945000 -40.930000 173.822000 -40.959000 173.773000 -41.000000 173.768000 -41.016000 173.752000 -41.029000 173.736000 -41.029000 173.660000 -41.078000 173.677000 -41.078000 173.650000 -41.095000 173.451000 -41.124000 173.408000 -41.148000 173.376000 -41.161000 173.279000 -41.181000 173.258000 -41.165000 173.247000 -41.144000 173.204000 -41.124000 173.198000 -41.099000 173.188000 -41.058000 173.198000 -41.021000 173.177000 -40.979000 173.172000 -40.942000 173.150000 -40.917000 173.129000 -40.884000 173.123000 -40.868000 173.139000 -40.835000 173.064000 -40.843000 172.978000 -40.822000 172.881000 -40.739000 172.865000 -40.718000 172.908000 -40.710000 172.962000 -40.689000 172.989000 -40.681000 173.043000 -40.665000 173.053000 -40.640000 173.048000 -40.623000 173.026000 -40.602000 & @TYPE xy 166.316000 -50.564000 166.300000 -50.570000 166.279000 -50.574000 166.241000 -50.602000 166.230000 -50.640000 166.214000 -50.647000 166.203000 -50.682000 166.177000 -50.706000 166.139000 -50.713000 166.128000 -50.737000 166.117000 -50.761000 166.128000 -50.782000 166.155000 -50.820000 166.203000 -50.824000 166.268000 -50.796000 166.295000 -50.747000 166.300000 -50.709000 166.327000 -50.636000 166.343000 -50.609000 166.359000 -50.570000 166.348000 -50.557000 166.332000 -50.543000 & @TYPE xy 166.300000 -50.920000 166.257000 -50.948000 166.230000 -50.986000 166.241000 -50.999000 166.263000 -50.996000 166.300000 -50.986000 166.322000 -50.996000 166.348000 -50.979000 166.338000 -50.958000 166.311000 -50.934000 & @TYPE xy 167.966000 -46.726000 167.923000 -46.775000 167.901000 -46.801000 167.869000 -46.816000 167.799000 -46.872000 167.724000 -47.007000 167.600000 -47.193000 167.654000 -47.226000 167.676000 -47.212000 167.718000 -47.208000 167.810000 -47.197000 167.858000 -47.215000 167.998000 -47.212000 168.035000 -47.197000 168.089000 -47.189000 168.100000 -47.163000 168.121000 -47.145000 168.116000 -47.078000 168.132000 -47.037000 168.111000 -47.029000 168.138000 -46.988000 168.143000 -46.954000 168.159000 -46.936000 168.181000 -46.805000 168.132000 -46.779000 168.095000 -46.760000 168.035000 -46.741000 168.003000 -46.741000 167.992000 -46.726000 167.960000 -46.722000 & @TYPE xy 184.019000 -43.657000 184.040000 -43.669000 184.056000 -43.677000 184.105000 -43.752000 184.131000 -43.831000 184.121000 -43.851000 184.158000 -43.969000 184.191000 -44.005000 184.228000 -44.017000 184.266000 -44.040000 184.357000 -44.032000 184.389000 -44.028000 184.416000 -44.020000 184.448000 -43.997000 184.529000 -43.760000 184.497000 -43.657000 184.454000 -43.649000 184.362000 -43.590000 184.309000 -43.562000 184.293000 -43.566000 184.191000 -43.515000 184.131000 -43.550000 184.142000 -43.566000 184.094000 -43.598000 184.067000 -43.622000 184.051000 -43.630000 184.040000 -43.677000 & @TYPE xy 142.742839 -10.828687 142.677000 -10.846000 142.511000 -10.873000 142.495000 -10.894000 142.457000 -10.927000 142.425000 -10.991000 142.360000 -11.045000 142.344000 -11.061000 142.258000 -11.437000 142.264000 -11.522000 142.269000 -11.544000 142.274000 -11.597000 142.264000 -11.619000 142.253000 -11.705000 142.221000 -11.801000 142.188000 -11.855000 142.188000 -11.876000 142.162000 -11.897000 142.065000 -12.074000 141.904000 -12.363000 141.877000 -12.507000 141.893000 -12.555000 141.925000 -12.593000 141.936000 -12.806000 141.952000 -12.828000 141.963000 -12.854000 141.990000 -12.886000 141.974000 -12.897000 141.920000 -12.956000 141.855000 -13.009000 141.861000 -13.041000 141.834000 -13.105000 141.823000 -13.148000 141.823000 -13.195000 141.807000 -13.243000 141.818000 -13.361000 141.807000 -13.653000 141.737000 -13.882000 141.705000 -14.195000 141.710000 -14.285000 141.705000 -14.471000 141.710000 -14.492000 141.753000 -14.593000 141.742000 -14.799000 141.742000 -14.836000 141.748000 -14.889000 141.678000 -15.259000 141.689000 -15.391000 141.678000 -15.412000 141.646000 -15.575000 141.635000 -15.639000 141.624000 -15.702000 141.608000 -15.702000 141.576000 -15.834000 141.587000 -15.870000 141.533000 -16.023000 141.506000 -16.186000 141.495000 -16.265000 141.474000 -16.286000 141.442000 -16.354000 141.420000 -16.375000 141.404000 -16.428000 141.372000 -16.464000 141.366000 -16.491000 141.340000 -16.533000 141.329000 -16.574000 141.221000 -16.763000 141.157000 -16.847000 141.141000 -16.868000 141.114000 -16.957000 141.082000 -17.046000 141.055000 -17.083000 141.060000 -17.098000 141.023000 -17.166000 141.012000 -17.224000 140.937000 -17.401000 140.910000 -17.443000 140.872000 -17.469000 140.813000 -17.537000 140.754000 -17.558000 140.620000 -17.579000 140.587000 -17.563000 140.399000 -17.600000 140.372000 -17.626000 140.303000 -17.647000 140.292000 -17.662000 140.179000 -17.668000 139.991000 -17.537000 139.830000 -17.532000 139.739000 -17.521000 139.615000 -17.474000 139.481000 -17.349000 139.432000 -17.229000 139.416000 -17.208000 139.325000 -17.072000 139.309000 -17.035000 139.266000 -16.999000 139.260000 -16.983000 139.217000 -16.931000 139.212000 -16.894000 139.191000 -16.863000 139.137000 -16.774000 139.078000 -16.716000 139.019000 -16.690000 139.008000 -16.674000 138.836000 -16.601000 138.750000 -16.580000 138.643000 -16.548000 138.616000 -16.543000 138.524000 -16.548000 138.497000 -16.548000 138.395000 -16.548000 138.326000 -16.548000 138.283000 -16.538000 138.240000 -16.554000 138.181000 -16.538000 138.116000 -16.512000 138.100000 -16.480000 138.041000 -16.459000 137.992000 -16.428000 137.907000 -16.365000 137.847000 -16.296000 137.810000 -16.286000 137.783000 -16.254000 137.783000 -16.270000 137.595000 -16.076000 137.530000 -16.002000 137.520000 -15.986000 137.477000 -15.944000 137.461000 -15.939000 137.359000 -15.897000 137.305000 -15.902000 137.294000 -15.881000 136.875000 -15.844000 136.848000 -15.844000 136.741000 -15.828000 136.655000 -15.802000 136.633000 -15.807000 136.563000 -15.739000 136.547000 -15.676000 136.483000 -15.544000 136.434000 -15.475000 136.391000 -15.449000 136.386000 -15.428000 136.096000 -15.275000 136.058000 -15.264000 136.005000 -15.211000 135.935000 -15.201000 135.870000 -15.174000 135.806000 -15.137000 135.774000 -15.122000 135.698000 -15.011000 135.645000 -14.968000 135.602000 -14.873000 135.559000 -14.804000 135.548000 -14.773000 135.586000 -14.503000 135.607000 -14.450000 135.655000 -14.391000 135.693000 -14.344000 135.731000 -14.317000 135.731000 -14.301000 135.774000 -14.253000 135.870000 -14.169000 135.913000 -14.105000 135.940000 -13.999000 135.929000 -13.951000 135.929000 -13.903000 135.940000 -13.823000 135.951000 -13.781000 135.946000 -13.733000 135.956000 -13.712000 135.946000 -13.616000 135.983000 -13.361000 135.999000 -13.307000 136.010000 -13.281000 136.042000 -13.222000 136.101000 -13.185000 136.193000 -13.105000 136.236000 -13.105000 136.257000 -13.073000 136.397000 -13.009000 136.397000 -12.993000 136.467000 -12.945000 136.488000 -12.918000 136.563000 -12.870000 136.563000 -12.854000 136.590000 -12.812000 136.606000 -12.817000 136.649000 -12.726000 136.671000 -12.651000 136.687000 -12.646000 136.703000 -12.598000 136.751000 -12.545000 136.832000 -12.507000 136.891000 -12.497000 136.913000 -12.475000 136.972000 -12.454000 137.004000 -12.411000 137.025000 -12.374000 137.009000 -12.368000 137.009000 -12.347000 136.972000 -12.315000 136.945000 -12.320000 136.918000 -12.304000 136.907000 -12.283000 136.886000 -12.293000 136.843000 -12.315000 136.811000 -12.320000 136.789000 -12.309000 136.773000 -12.320000 136.751000 -12.315000 136.703000 -12.326000 136.687000 -12.315000 136.644000 -12.309000 136.622000 -12.256000 136.622000 -12.229000 136.655000 -12.170000 136.644000 -12.138000 136.676000 -12.042000 136.746000 -11.924000 136.682000 -11.983000 136.606000 -12.005000 136.526000 -11.994000 136.510000 -12.010000 136.477000 -12.031000 136.472000 -12.074000 136.429000 -12.186000 136.408000 -12.224000 136.408000 -12.208000 136.365000 -12.267000 136.316000 -12.336000 136.263000 -12.358000 136.225000 -12.395000 136.177000 -12.395000 136.171000 -12.416000 136.155000 -12.395000 136.117000 -12.422000 136.080000 -12.368000 136.058000 -12.288000 136.058000 -12.261000 136.048000 -12.160000 136.048000 -12.096000 136.048000 -12.069000 136.048000 -12.005000 136.042000 -11.881000 136.026000 -11.812000 136.015000 -11.833000 135.983000 -11.833000 135.983000 -11.849000 135.935000 -11.876000 135.817000 -11.978000 135.768000 -12.047000 135.666000 -12.106000 135.612000 -12.122000 135.355000 -12.224000 135.269000 -12.251000 135.226000 -12.235000 135.145000 -12.219000 135.102000 -12.219000 135.059000 -12.203000 134.930000 -12.197000 134.769000 -12.160000 134.678000 -12.165000 134.468000 -12.079000 134.366000 -12.042000 134.242000 -12.010000 134.103000 -11.940000 134.054000 -11.914000 133.990000 -11.865000 133.952000 -11.855000 133.931000 -11.839000 133.877000 -11.823000 133.775000 -11.833000 133.721000 -11.844000 133.652000 -11.865000 133.592000 -11.828000 133.469000 -11.812000 133.313000 -11.683000 133.281000 -11.667000 133.249000 -11.555000 133.189000 -11.506000 133.168000 -11.479000 133.125000 -11.469000 133.082000 -11.479000 133.034000 -11.474000 132.937000 -11.512000 132.905000 -11.506000 132.867000 -11.522000 132.803000 -11.533000 132.760000 -11.555000 132.760000 -11.533000 132.711000 -11.538000 132.695000 -11.517000 132.572000 -11.442000 132.539000 -11.404000 132.480000 -11.388000 132.475000 -11.367000 132.427000 -11.324000 132.416000 -11.308000 132.335000 -11.254000 132.276000 -11.238000 132.142000 -11.168000 132.126000 -11.222000 132.115000 -11.206000 132.077000 -11.184000 132.002000 -11.158000 131.943000 -11.190000 131.895000 -11.211000 131.868000 -11.286000 131.868000 -11.319000 132.830000 -11.989000 132.819000 -12.010000 132.824000 -12.037000 132.813000 -12.063000 132.652000 -12.277000 131.965000 -12.411000 131.787000 -12.406000 131.701000 -12.406000 131.653000 -12.395000 131.605000 -12.400000 131.524000 -12.347000 131.422000 -12.331000 131.390000 -12.352000 131.368000 -12.363000 131.379000 -12.240000 131.368000 -12.251000 131.352000 -12.224000 131.336000 -12.213000 131.255000 -12.245000 131.046000 -12.245000 131.035000 -12.320000 131.019000 -12.395000 131.024000 -12.502000 131.003000 -12.502000 130.852000 -12.507000 130.788000 -12.523000 130.777000 -12.502000 130.750000 -12.523000 130.718000 -12.523000 130.638000 -12.523000 130.632000 -12.614000 130.600000 -12.726000 130.573000 -12.854000 130.557000 -12.860000 130.401000 -12.972000 130.353000 -12.982000 130.326000 -13.014000 130.294000 -13.052000 130.272000 -13.148000 130.261000 -13.281000 130.251000 -13.483000 130.202000 -13.515000 130.154000 -13.573000 130.057000 -13.680000 129.998000 -13.706000 129.923000 -13.744000 129.799000 -13.866000 129.670000 -14.025000 129.649000 -14.062000 129.638000 -14.105000 129.563000 -14.232000 129.536000 -14.312000 129.504000 -14.370000 129.488000 -14.418000 129.488000 -14.471000 129.504000 -14.503000 129.536000 -14.518000 129.670000 -14.582000 129.713000 -14.624000 129.730000 -14.640000 129.756000 -14.720000 129.756000 -14.794000 129.746000 -14.905000 129.756000 -14.968000 129.789000 -15.011000 129.783000 -15.032000 129.789000 -15.111000 129.773000 -15.180000 129.735000 -15.248000 129.713000 -15.248000 129.697000 -15.301000 129.687000 -15.317000 129.638000 -15.333000 129.628000 -15.306000 129.509000 -15.222000 129.477000 -15.164000 129.423000 -15.137000 129.396000 -15.069000 129.359000 -15.021000 129.337000 -14.905000 129.241000 -14.773000 129.203000 -14.683000 129.155000 -14.640000 129.096000 -14.667000 129.053000 -14.661000 128.983000 -14.672000 128.934000 -14.693000 128.875000 -14.698000 128.736000 -14.640000 128.709000 -14.619000 128.655000 -14.598000 128.628000 -14.587000 128.456000 -14.577000 128.451000 -14.619000 128.451000 -14.656000 128.456000 -14.672000 128.489000 -14.757000 128.462000 -14.751000 128.392000 -14.736000 128.365000 -14.720000 128.338000 -14.714000 128.295000 -14.746000 128.258000 -14.778000 128.252000 -14.857000 128.301000 -14.884000 128.306000 -14.958000 128.322000 -14.974000 128.333000 -15.016000 128.322000 -15.074000 128.338000 -15.090000 128.354000 -15.143000 128.354000 -15.122000 128.360000 -15.222000 128.349000 -15.238000 128.236000 -15.164000 128.193000 -15.164000 128.161000 -15.264000 128.155000 -15.296000 128.123000 -15.412000 128.123000 -15.428000 128.059000 -15.602000 128.032000 -15.676000 128.016000 -15.676000 127.919000 -15.654000 127.919000 -15.549000 127.935000 -15.512000 127.967000 -15.312000 127.962000 -14.968000 127.984000 -14.921000 127.994000 -14.873000 127.989000 -14.635000 127.962000 -14.587000 127.946000 -14.508000 127.914000 -14.487000 127.860000 -14.418000 127.661000 -14.232000 127.613000 -14.084000 127.564000 -14.025000 127.532000 -14.004000 127.360000 -13.946000 127.328000 -13.914000 127.264000 -13.882000 127.097000 -13.882000 126.936000 -13.930000 126.909000 -13.946000 126.818000 -13.999000 126.640000 -14.062000 126.608000 -14.084000 126.452000 -14.100000 126.377000 -14.137000 126.264000 -14.174000 126.184000 -14.153000 126.049000 -14.094000 126.044000 -14.184000 126.049000 -14.216000 126.039000 -14.269000 125.985000 -14.460000 125.920000 -14.593000 125.883000 -14.635000 125.851000 -14.640000 125.775000 -14.614000 125.571000 -14.624000 125.448000 -14.661000 125.405000 -14.688000 125.367000 -14.714000 125.378000 -14.736000 125.367000 -14.757000 125.399000 -14.794000 125.415000 -14.836000 125.442000 -14.915000 125.448000 -14.974000 125.480000 -15.021000 125.480000 -15.127000 125.464000 -15.148000 125.448000 -15.143000 125.410000 -15.169000 125.383000 -15.190000 125.383000 -15.206000 125.238000 -15.206000 125.158000 -15.159000 125.136000 -15.137000 125.125000 -15.079000 125.115000 -15.058000 125.125000 -14.974000 125.093000 -14.942000 125.077000 -14.958000 125.007000 -15.026000 124.986000 -15.032000 124.953000 -15.042000 124.937000 -15.069000 124.948000 -15.095000 124.964000 -15.111000 124.980000 -15.132000 125.007000 -15.164000 125.045000 -15.201000 125.077000 -15.211000 125.115000 -15.243000 125.109000 -15.259000 125.104000 -15.312000 125.120000 -15.333000 125.109000 -15.428000 125.093000 -15.444000 125.082000 -15.486000 125.056000 -15.475000 125.045000 -15.486000 124.798000 -15.438000 124.749000 -15.438000 124.717000 -15.417000 124.690000 -15.407000 124.669000 -15.407000 124.647000 -15.523000 124.636000 -15.586000 124.588000 -15.765000 124.556000 -15.823000 124.534000 -15.876000 124.497000 -15.907000 124.465000 -15.986000 124.400000 -16.070000 124.330000 -16.112000 124.319000 -16.133000 124.271000 -16.154000 124.244000 -16.191000 124.185000 -16.223000 124.153000 -16.223000 124.072000 -16.191000 124.035000 -16.160000 124.013000 -16.091000 123.970000 -16.091000 123.954000 -16.065000 123.917000 -16.060000 123.836000 -16.002000 123.782000 -15.970000 123.777000 -15.986000 123.729000 -16.033000 123.691000 -16.055000 123.675000 -16.049000 123.610000 -16.091000 123.524000 -16.133000 123.497000 -16.165000 123.395000 -16.223000 123.336000 -16.275000 123.336000 -16.296000 123.309000 -16.333000 123.320000 -16.349000 123.342000 -16.380000 123.369000 -16.380000 123.379000 -16.396000 123.406000 -16.396000 123.438000 -16.428000 123.540000 -16.501000 123.578000 -16.512000 123.653000 -16.590000 123.675000 -16.606000 123.718000 -16.622000 123.836000 -16.789000 123.863000 -16.905000 123.814000 -17.051000 123.804000 -17.004000 123.771000 -16.978000 123.669000 -16.915000 123.621000 -16.863000 123.589000 -16.842000 123.487000 -16.753000 123.487000 -16.826000 123.514000 -16.920000 123.530000 -16.967000 123.508000 -17.015000 123.497000 -17.067000 123.412000 -17.067000 123.363000 -17.046000 123.261000 -16.967000 123.229000 -16.915000 123.181000 -16.805000 123.143000 -16.732000 123.089000 -16.606000 123.073000 -16.590000 123.089000 -16.569000 123.068000 -16.517000 123.052000 -16.359000 123.062000 -16.286000 123.073000 -16.238000 123.068000 -16.260000 123.073000 -16.244000 122.901000 -16.328000 122.606000 -16.333000 122.665000 -16.375000 122.654000 -16.391000 122.670000 -16.401000 122.654000 -16.512000 122.520000 -16.601000 122.466000 -16.664000 122.412000 -16.737000 122.348000 -16.831000 122.305000 -16.878000 122.305000 -16.926000 122.230000 -16.962000 122.192000 -17.025000 122.122000 -17.313000 122.111000 -17.428000 122.095000 -17.511000 122.090000 -17.626000 122.106000 -17.641000 122.122000 -17.673000 122.149000 -17.699000 122.149000 -17.720000 122.176000 -17.746000 122.203000 -17.845000 122.230000 -17.866000 122.224000 -17.933000 122.240000 -17.954000 122.203000 -18.063000 122.047000 -18.271000 121.988000 -18.344000 121.961000 -18.344000 121.811000 -18.526000 121.725000 -18.593000 121.655000 -18.733000 121.601000 -18.790000 121.488000 -18.946000 121.273000 -19.137000 121.257000 -19.158000 121.193000 -19.220000 121.160000 -19.225000 121.112000 -19.256000 121.101000 -19.287000 121.080000 -19.292000 121.015000 -19.421000 120.956000 -19.406000 120.929000 -19.478000 120.860000 -19.555000 120.774000 -19.648000 120.720000 -19.648000 120.709000 -19.669000 120.586000 -19.663000 120.441000 -19.710000 120.344000 -19.725000 120.220000 -19.782000 120.150000 -19.787000 120.097000 -19.808000 119.860000 -19.869000 119.662000 -19.926000 119.559000 -19.926000 119.549000 -19.911000 119.441000 -19.921000 119.388000 -19.942000 119.328000 -19.983000 119.285000 -20.039000 119.242000 -20.034000 119.060000 -19.952000 119.011000 -19.952000 118.995000 -19.972000 118.963000 -19.978000 118.899000 -20.075000 118.797000 -20.111000 118.571000 -20.183000 118.453000 -20.219000 118.265000 -20.229000 118.120000 -20.219000 117.996000 -20.219000 117.985000 -20.240000 117.964000 -20.281000 117.932000 -20.296000 117.932000 -20.311000 117.899000 -20.353000 117.760000 -20.476000 117.706000 -20.496000 117.588000 -20.517000 117.513000 -20.558000 117.367000 -20.619000 117.276000 -20.645000 117.222000 -20.629000 117.153000 -20.634000 117.115000 -20.614000 117.040000 -20.588000 116.986000 -20.563000 116.975000 -20.547000 116.954000 -20.476000 116.948000 -20.460000 116.809000 -20.517000 116.760000 -20.558000 116.674000 -20.527000 116.588000 -20.435000 116.529000 -20.465000 116.519000 -20.563000 116.492000 -20.670000 116.460000 -20.701000 116.454000 -20.721000 116.363000 -20.742000 116.255000 -20.849000 116.223000 -20.895000 116.094000 -21.033000 116.008000 -21.084000 115.944000 -21.105000 115.793000 -21.253000 115.750000 -21.289000 115.691000 -21.324000 115.675000 -21.345000 115.654000 -21.350000 115.632000 -21.411000 115.552000 -21.482000 115.471000 -21.538000 115.331000 -21.584000 115.283000 -21.620000 115.229000 -21.625000 115.208000 -21.650000 115.175000 -21.655000 115.165000 -21.676000 115.095000 -21.711000 115.068000 -21.742000 115.004000 -21.767000 114.955000 -21.803000 114.885000 -21.859000 114.885000 -21.874000 114.837000 -21.909000 114.821000 -21.940000 114.703000 -22.046000 114.595000 -22.219000 114.509000 -22.325000 114.439000 -22.366000 114.418000 -22.411000 114.359000 -22.436000 114.311000 -22.446000 114.273000 -22.431000 114.273000 -22.411000 114.235000 -22.239000 114.235000 -22.188000 114.219000 -22.138000 114.214000 -21.899000 114.198000 -21.848000 114.106000 -22.051000 114.090000 -22.203000 114.069000 -22.203000 114.063000 -22.239000 114.047000 -22.269000 113.977000 -22.335000 113.843000 -22.588000 113.816000 -22.659000 113.800000 -22.750000 113.795000 -22.881000 113.789000 -22.971000 113.789000 -23.007000 113.789000 -23.143000 113.768000 -23.163000 113.806000 -23.273000 113.832000 -23.299000 113.838000 -23.319000 113.865000 -23.344000 113.924000 -23.439000 113.918000 -23.494000 113.929000 -23.515000 113.897000 -23.670000 113.859000 -23.740000 113.848000 -23.770000 113.768000 -23.855000 113.709000 -23.990000 113.709000 -24.045000 113.682000 -24.165000 113.687000 -24.200000 113.677000 -24.260000 113.660000 -24.340000 113.671000 -24.539000 113.703000 -24.619000 113.703000 -24.678000 113.763000 -24.778000 113.859000 -24.947000 113.988000 -25.130000 114.096000 -25.244000 114.182000 -25.437000 114.198000 -25.486000 114.219000 -25.496000 114.294000 -25.664000 114.364000 -25.777000 114.354000 -26.122000 114.332000 -26.171000 114.343000 -26.225000 114.327000 -26.259000 114.321000 -26.279000 114.305000 -26.313000 114.300000 -26.343000 114.300000 -26.377000 114.273000 -26.426000 114.214000 -26.431000 114.144000 -26.387000 114.085000 -26.308000 114.053000 -26.294000 114.042000 -26.274000 113.967000 -26.196000 113.940000 -26.176000 113.929000 -26.156000 113.886000 -26.132000 113.891000 -26.146000 113.891000 -26.186000 113.891000 -26.220000 113.945000 -26.367000 113.945000 -26.490000 113.929000 -26.514000 113.908000 -26.544000 113.789000 -26.500000 113.736000 -26.402000 113.736000 -26.382000 113.720000 -26.367000 113.682000 -26.304000 113.634000 -26.259000 113.628000 -26.225000 113.575000 -26.161000 113.548000 -26.132000 113.494000 -26.161000 113.515000 -26.259000 113.532000 -26.294000 113.537000 -26.333000 113.612000 -26.465000 113.720000 -26.637000 113.768000 -26.681000 113.789000 -26.720000 113.816000 -26.769000 113.838000 -26.783000 113.918000 -26.901000 114.004000 -26.949000 114.112000 -27.052000 114.203000 -27.193000 114.214000 -27.247000 114.241000 -27.324000 114.246000 -27.353000 114.294000 -27.451000 114.354000 -27.640000 114.348000 -27.717000 114.359000 -27.756000 114.391000 -27.829000 114.391000 -27.843000 114.413000 -27.877000 114.402000 -27.964000 114.488000 -28.051000 114.568000 -28.191000 114.644000 -28.350000 114.708000 -28.499000 114.762000 -28.547000 114.832000 -28.788000 115.090000 -29.147000 115.106000 -29.295000 115.127000 -29.366000 115.116000 -29.395000 115.106000 -29.619000 115.111000 -29.662000 115.100000 -29.890000 115.095000 -29.951000 115.116000 -30.013000 115.143000 -30.202000 115.224000 -30.335000 115.272000 -30.806000 115.304000 -30.923000 115.337000 -30.956000 115.364000 -31.064000 115.358000 -31.162000 115.374000 -31.176000 115.401000 -31.335000 115.428000 -31.382000 115.541000 -31.611000 115.557000 -31.634000 115.621000 -31.681000 115.664000 -31.746000 115.707000 -31.764000 115.766000 -31.843000 115.788000 -31.890000 115.804000 -31.904000 115.809000 -31.969000 115.842000 -32.006000 115.852000 -32.025000 115.879000 -32.043000 115.885000 -32.066000 115.901000 -32.085000 115.922000 -32.127000 115.949000 -32.266000 115.960000 -32.478000 115.965000 -32.510000 115.955000 -32.529000 115.965000 -32.570000 115.938000 -32.695000 115.869000 -32.667000 115.842000 -32.640000 115.820000 -32.672000 115.809000 -32.939000 115.766000 -33.250000 115.729000 -33.342000 115.729000 -33.365000 115.707000 -33.415000 115.670000 -33.470000 115.664000 -33.497000 115.605000 -33.556000 115.541000 -33.566000 115.466000 -33.552000 115.380000 -33.511000 115.304000 -33.511000 115.235000 -33.529000 115.229000 -33.529000 115.240000 -33.547000 115.235000 -33.584000 115.245000 -33.616000 115.390000 -34.224000 115.412000 -34.224000 115.455000 -34.242000 115.514000 -34.220000 115.519000 -34.206000 115.611000 -34.161000 115.654000 -34.165000 115.756000 -34.188000 115.783000 -34.202000 115.906000 -34.238000 115.987000 -34.283000 116.030000 -34.337000 116.148000 -34.405000 116.207000 -34.459000 116.271000 -34.486000 116.390000 -34.581000 116.460000 -34.617000 116.766000 -34.626000 117.174000 -34.720000 117.448000 -34.747000 117.561000 -34.756000 117.631000 -34.747000 117.776000 -34.752000 117.862000 -34.743000 117.932000 -34.725000 117.948000 -34.716000 118.007000 -34.720000 118.044000 -34.711000 118.130000 -34.720000 118.168000 -34.707000 118.206000 -34.675000 118.227000 -34.635000 118.329000 -34.585000 118.388000 -34.531000 118.437000 -34.495000 118.485000 -34.495000 118.496000 -34.468000 118.641000 -34.396000 118.684000 -34.369000 118.721000 -34.378000 118.813000 -34.355000 118.995000 -34.310000 119.038000 -34.274000 119.065000 -34.224000 119.097000 -34.238000 119.097000 -34.220000 119.264000 -34.256000 119.307000 -34.251000 119.312000 -34.265000 119.339000 -34.269000 119.377000 -34.310000 119.490000 -34.319000 119.576000 -34.279000 119.602000 -34.251000 119.624000 -34.179000 119.656000 -34.134000 119.662000 -34.106000 119.790000 -33.848000 119.817000 -33.789000 119.839000 -33.748000 119.893000 -33.698000 120.048000 -33.666000 120.107000 -33.634000 120.161000 -33.634000 120.328000 -33.648000 120.462000 -33.661000 120.532000 -33.661000 120.580000 -33.661000 120.688000 -33.675000 120.741000 -33.684000 120.940000 -33.693000 120.972000 -33.702000 121.042000 -33.693000 121.375000 -33.684000 121.418000 -33.689000 121.622000 -33.730000 121.692000 -33.743000 121.794000 -33.743000 121.870000 -33.757000 121.902000 -33.748000 121.945000 -33.716000 121.972000 -33.693000 122.025000 -33.698000 122.101000 -33.752000 122.128000 -33.780000 122.160000 -33.780000 122.197000 -33.789000 122.278000 -33.784000 122.391000 -33.748000 122.418000 -33.748000 122.450000 -33.730000 122.686000 -33.698000 122.826000 -33.743000 122.874000 -33.752000 122.896000 -33.761000 122.976000 -33.771000 123.041000 -33.793000 123.116000 -33.789000 123.186000 -33.807000 123.272000 -33.780000 123.320000 -33.730000 123.487000 -33.698000 123.562000 -33.711000 123.616000 -33.684000 123.659000 -33.638000 123.675000 -33.607000 123.718000 -33.552000 123.734000 -33.456000 123.771000 -33.392000 123.814000 -33.360000 123.917000 -33.250000 123.954000 -33.195000 124.008000 -33.145000 124.035000 -33.095000 124.153000 -33.003000 124.244000 -32.860000 124.293000 -32.815000 124.389000 -32.750000 124.454000 -32.745000 124.733000 -32.686000 124.814000 -32.649000 125.013000 -32.570000 125.093000 -32.520000 125.201000 -32.478000 125.351000 -32.446000 125.582000 -32.330000 125.759000 -32.261000 125.835000 -32.242000 126.033000 -32.238000 126.109000 -32.215000 126.184000 -32.219000 126.237000 -32.205000 126.270000 -32.210000 126.426000 -32.191000 126.775000 -32.164000 126.845000 -32.168000 126.952000 -32.196000 127.070000 -32.233000 127.108000 -32.233000 127.135000 -32.219000 127.188000 -32.224000 127.237000 -32.215000 127.280000 -32.196000 127.366000 -32.178000 127.376000 -32.159000 127.441000 -32.131000 127.575000 -32.090000 127.597000 -32.071000 127.699000 -32.062000 127.967000 -31.974000 128.053000 -31.936000 128.204000 -31.904000 128.349000 -31.862000 128.660000 -31.806000 128.746000 -31.783000 128.827000 -31.741000 129.321000 -31.634000 129.504000 -31.615000 129.670000 -31.569000 130.025000 -31.564000 130.111000 -31.555000 130.278000 -31.559000 130.331000 -31.550000 130.417000 -31.550000 130.498000 -31.536000 130.740000 -31.536000 130.831000 -31.517000 130.863000 -31.522000 130.922000 -31.503000 131.073000 -31.522000 131.223000 -31.513000 131.277000 -31.489000 131.379000 -31.499000 131.524000 -31.517000 131.631000 -31.555000 131.728000 -31.592000 131.814000 -31.657000 131.948000 -31.760000 132.153000 -31.909000 132.179000 -31.918000 132.217000 -31.946000 132.239000 -31.946000 132.249000 -31.932000 132.324000 -31.964000 132.362000 -31.983000 132.378000 -31.974000 132.394000 -31.983000 132.566000 -31.936000 132.582000 -31.918000 132.647000 -31.899000 132.727000 -31.904000 132.813000 -31.946000 132.905000 -32.011000 132.964000 -32.034000 133.018000 -32.043000 133.114000 -32.076000 133.184000 -32.094000 133.329000 -32.090000 133.463000 -32.071000 133.539000 -32.076000 133.614000 -32.094000 133.705000 -32.141000 133.737000 -32.187000 133.775000 -32.205000 133.866000 -32.279000 133.995000 -32.363000 134.071000 -32.460000 134.108000 -32.510000 134.253000 -32.630000 134.339000 -32.713000 134.361000 -32.736000 134.361000 -32.759000 134.377000 -32.856000 134.377000 -32.906000 134.323000 -32.939000 134.328000 -32.985000 134.382000 -33.017000 134.447000 -33.053000 134.473000 -33.072000 134.511000 -33.099000 134.570000 -33.159000 134.624000 -33.209000 134.667000 -33.292000 134.715000 -33.369000 134.737000 -33.406000 134.769000 -33.420000 134.807000 -33.438000 134.876000 -33.461000 134.973000 -33.511000 135.091000 -33.588000 135.102000 -33.611000 135.124000 -33.625000 135.199000 -33.693000 135.279000 -33.811000 135.290000 -33.852000 135.312000 -33.889000 135.322000 -33.930000 135.338000 -33.966000 135.376000 -34.129000 135.333000 -34.306000 135.328000 -34.486000 135.349000 -34.504000 135.355000 -34.540000 135.500000 -34.617000 135.612000 -34.635000 135.806000 -34.617000 135.854000 -34.621000 135.956000 -34.648000 136.037000 -34.653000 136.128000 -34.608000 136.171000 -34.536000 136.214000 -34.450000 136.230000 -34.441000 136.246000 -34.414000 136.214000 -34.360000 136.160000 -34.310000 136.150000 -34.265000 136.160000 -34.206000 136.203000 -34.061000 136.241000 -34.020000 136.268000 -34.007000 136.370000 -33.921000 136.413000 -33.898000 136.499000 -33.830000 136.703000 -33.702000 136.725000 -33.670000 136.794000 -33.657000 136.891000 -33.625000 136.977000 -33.556000 137.074000 -33.520000 137.160000 -33.465000 137.208000 -33.438000 137.235000 -33.406000 137.267000 -33.346000 137.369000 -33.250000 137.402000 -33.205000 137.471000 -33.154000 137.487000 -33.118000 137.557000 -33.072000 137.595000 -33.017000 137.616000 -32.962000 137.638000 -32.939000 137.638000 -32.902000 137.783000 -32.699000 137.804000 -32.686000 137.810000 -32.663000 137.837000 -32.635000 137.864000 -32.612000 137.944000 -32.506000 137.982000 -32.506000 137.992000 -32.534000 138.025000 -32.570000 138.025000 -32.603000 138.041000 -32.630000 138.041000 -32.778000 138.057000 -32.847000 138.046000 -32.883000 138.057000 -32.920000 138.041000 -33.081000 138.019000 -33.145000 138.030000 -33.191000 138.025000 -33.223000 138.052000 -33.369000 138.046000 -33.433000 138.062000 -33.511000 138.046000 -33.570000 137.971000 -33.702000 137.912000 -33.720000 137.772000 -33.871000 137.735000 -33.880000 137.729000 -33.907000 137.697000 -33.948000 137.675000 -34.002000 137.665000 -34.061000 137.611000 -34.233000 137.616000 -34.269000 137.606000 -34.364000 137.568000 -34.441000 137.579000 -34.455000 137.590000 -34.563000 137.584000 -34.594000 137.557000 -34.635000 137.552000 -34.693000 137.498000 -34.716000 137.455000 -34.720000 137.423000 -34.734000 137.240000 -34.743000 137.170000 -34.756000 137.101000 -34.761000 137.079000 -34.765000 137.052000 -34.774000 137.036000 -34.842000 137.042000 -34.878000 137.031000 -35.062000 137.042000 -35.088000 137.907000 -34.810000 137.917000 -34.734000 137.944000 -34.702000 137.960000 -34.540000 138.052000 -34.215000 138.073000 -34.165000 138.116000 -34.143000 138.127000 -34.097000 138.159000 -34.084000 138.175000 -34.088000 138.207000 -34.079000 138.234000 -34.088000 138.283000 -34.134000 138.422000 -34.292000 138.449000 -34.310000 138.481000 -34.355000 138.524000 -34.382000 138.600000 -34.455000 138.669000 -34.486000 138.686000 -34.491000 138.723000 -34.500000 138.745000 -34.513000 138.745000 -34.531000 138.761000 -34.527000 138.777000 -34.536000 138.771000 -34.554000 138.820000 -34.594000 138.831000 -34.608000 138.814000 -34.707000 138.836000 -34.842000 138.804000 -35.039000 138.788000 -35.048000 138.793000 -35.066000 138.734000 -35.097000 138.664000 -35.142000 138.659000 -35.160000 138.573000 -35.196000 138.465000 -35.250000 138.374000 -35.308000 138.309000 -35.388000 138.309000 -35.406000 138.336000 -35.428000 138.401000 -35.482000 138.438000 -35.486000 138.481000 -35.499000 138.551000 -35.482000 138.605000 -35.477000 138.626000 -35.464000 138.675000 -35.455000 138.702000 -35.433000 138.739000 -35.428000 138.777000 -35.406000 138.825000 -35.397000 138.874000 -35.366000 138.938000 -35.352000 138.992000 -35.348000 139.083000 -35.303000 139.126000 -35.276000 139.234000 -35.272000 139.309000 -35.272000 139.319000 -35.285000 139.384000 -35.294000 139.411000 -35.330000 139.438000 -35.433000 139.534000 -35.588000 139.545000 -35.646000 139.556000 -35.802000 139.647000 -35.984000 139.636000 -36.046000 139.696000 -36.068000 139.776000 -36.112000 139.787000 -36.143000 139.867000 -36.258000 139.894000 -36.302000 139.910000 -36.333000 139.948000 -36.372000 139.948000 -36.412000 139.964000 -36.460000 139.996000 -36.491000 139.991000 -36.513000 140.023000 -36.610000 140.029000 -36.632000 140.013000 -36.698000 140.018000 -36.742000 139.991000 -36.794000 139.916000 -36.873000 139.927000 -36.921000 139.943000 -36.956000 139.964000 -36.974000 139.964000 -36.991000 140.066000 -37.105000 140.136000 -37.179000 140.168000 -37.231000 140.227000 -37.279000 140.276000 -37.366000 140.313000 -37.405000 140.464000 -37.644000 140.485000 -37.657000 140.507000 -37.683000 140.614000 -37.705000 140.620000 -37.726000 140.689000 -37.752000 140.749000 -37.782000 140.792000 -37.800000 140.856000 -37.852000 140.910000 -37.873000 141.023000 -37.925000 141.060000 -37.925000 141.092000 -37.938000 141.141000 -37.968000 141.152000 -37.990000 141.232000 -38.033000 141.243000 -38.050000 141.318000 -38.089000 141.345000 -38.119000 141.442000 -38.179000 141.544000 -38.196000 141.603000 -38.196000 141.635000 -38.209000 141.651000 -38.201000 141.667000 -38.214000 141.694000 -38.205000 141.764000 -38.201000 141.812000 -38.218000 141.904000 -38.227000 141.979000 -38.248000 142.366000 -38.347000 142.409000 -38.373000 142.489000 -38.394000 142.521000 -38.411000 142.607000 -38.433000 142.634000 -38.424000 142.645000 -38.437000 142.758000 -38.433000 142.871000 -38.471000 142.914000 -38.484000 142.951000 -38.514000 142.973000 -38.514000 143.032000 -38.608000 143.064000 -38.655000 143.064000 -38.681000 143.129000 -38.715000 143.166000 -38.706000 143.360000 -38.698000 143.424000 -38.677000 143.489000 -38.638000 143.537000 -38.634000 143.558000 -38.612000 143.655000 -38.587000 143.720000 -38.544000 143.806000 -38.510000 143.865000 -38.501000 144.020000 -38.420000 144.063000 -38.420000 144.123000 -38.398000 144.192000 -38.390000 144.268000 -38.364000 144.396000 -38.347000 144.445000 -38.317000 144.461000 -38.295000 144.536000 -38.257000 144.520000 -38.205000 144.445000 -38.072000 144.402000 -38.054000 144.364000 -38.003000 144.386000 -38.011000 144.375000 -37.981000 144.391000 -37.947000 144.429000 -37.908000 144.493000 -37.899000 144.509000 -37.873000 144.531000 -37.882000 144.552000 -37.869000 144.585000 -37.865000 144.649000 -37.839000 144.687000 -37.839000 144.708000 -37.826000 144.826000 -37.817000 144.902000 -37.817000 144.928000 -37.817000 144.987000 -37.826000 144.987000 -37.843000 145.014000 -37.843000 145.041000 -37.860000 145.116000 -37.921000 145.143000 -37.973000 145.116000 -38.054000 145.100000 -38.054000 145.057000 -38.085000 144.982000 -38.128000 144.966000 -38.141000 144.918000 -38.158000 144.810000 -38.175000 144.767000 -38.205000 144.805000 -38.227000 144.864000 -38.265000 144.891000 -38.295000 144.934000 -38.308000 144.928000 -38.330000 144.950000 -38.325000 144.950000 -38.343000 144.977000 -38.351000 145.025000 -38.347000 145.041000 -38.304000 145.127000 -38.278000 145.154000 -38.287000 145.192000 -38.278000 145.208000 -38.291000 145.272000 -38.304000 145.347000 -38.304000 145.385000 -38.308000 145.444000 -38.343000 145.433000 -38.373000 145.433000 -38.411000 145.449000 -38.424000 145.471000 -38.458000 145.492000 -38.463000 145.514000 -38.480000 145.552000 -38.493000 145.573000 -38.510000 145.605000 -38.523000 145.691000 -38.578000 145.713000 -38.595000 145.745000 -38.608000 145.799000 -38.612000 145.874000 -38.655000 145.906000 -38.668000 145.922000 -38.685000 145.997000 -38.711000 146.110000 -38.732000 146.191000 -38.779000 146.239000 -38.826000 146.352000 -38.873000 146.368000 -38.834000 146.384000 -38.817000 146.443000 -38.698000 146.422000 -38.587000 146.427000 -38.548000 146.519000 -38.583000 146.535000 -38.595000 146.599000 -38.574000 146.685000 -38.531000 146.782000 -38.480000 146.825000 -38.450000 146.889000 -38.424000 147.013000 -38.360000 147.072000 -38.321000 147.126000 -38.295000 147.217000 -38.222000 147.265000 -38.175000 147.271000 -38.153000 147.292000 -38.145000 147.303000 -38.119000 147.341000 -38.067000 147.405000 -37.951000 147.464000 -37.886000 147.486000 -37.865000 147.491000 -37.830000 147.513000 -37.800000 147.518000 -37.765000 147.534000 -37.744000 147.550000 -37.748000 147.555000 -37.731000 147.733000 -37.687000 147.803000 -37.700000 147.905000 -37.718000 147.953000 -37.713000 147.985000 -37.722000 148.216000 -37.731000 148.243000 -37.731000 148.275000 -37.739000 148.426000 -37.752000 148.480000 -37.735000 148.506000 -37.713000 148.603000 -37.679000 148.780000 -37.670000 148.807000 -37.657000 148.861000 -37.657000 148.904000 -37.648000 148.952000 -37.666000 149.001000 -37.657000 149.189000 -37.674000 149.205000 -37.666000 149.237000 -37.674000 149.221000 -37.674000 149.269000 -37.683000 149.296000 -37.687000 149.334000 -37.705000 149.377000 -37.705000 149.441000 -37.692000 149.527000 -37.627000 149.613000 -37.527000 149.645000 -37.518000 149.705000 -37.475000 149.871000 -37.410000 149.952000 -37.344000 150.005000 -37.253000 150.038000 -37.249000 150.043000 -37.222000 150.064000 -37.205000 150.097000 -37.192000 150.102000 -37.174000 150.118000 -37.166000 150.134000 -37.100000 150.113000 -37.065000 150.086000 -37.048000 150.070000 -37.026000 150.043000 -37.017000 149.898000 -36.838000 149.860000 -36.759000 149.839000 -36.706000 149.850000 -36.685000 149.887000 -36.592000 149.941000 -36.522000 149.957000 -36.491000 150.000000 -36.452000 150.118000 -36.306000 150.145000 -36.240000 150.193000 -36.090000 150.199000 -35.992000 150.177000 -35.970000 150.091000 -35.704000 150.081000 -35.664000 150.075000 -35.642000 150.075000 -35.535000 150.086000 -35.517000 150.097000 -35.477000 150.118000 -35.446000 150.150000 -35.366000 150.183000 -35.334000 150.312000 -35.272000 150.338000 -35.258000 150.355000 -35.223000 150.435000 -35.138000 150.467000 -35.071000 150.494000 -35.053000 150.516000 -35.026000 150.569000 -34.990000 150.602000 -34.927000 150.618000 -34.923000 150.655000 -34.842000 150.639000 -34.788000 150.645000 -34.725000 150.677000 -34.675000 150.725000 -34.513000 150.752000 -34.455000 150.784000 -34.419000 150.876000 -34.283000 151.010000 -34.147000 151.032000 -34.125000 151.037000 -34.070000 151.048000 -33.857000 151.075000 -33.816000 151.107000 -33.798000 151.144000 -33.766000 151.225000 -33.748000 151.246000 -33.757000 151.273000 -33.730000 151.386000 -33.648000 151.418000 -33.579000 151.429000 -33.461000 151.451000 -33.433000 151.488000 -33.241000 151.542000 -33.223000 151.574000 -33.191000 151.585000 -33.150000 151.580000 -33.063000 151.537000 -32.994000 151.499000 -32.916000 151.526000 -32.805000 151.644000 -32.778000 151.746000 -32.745000 151.886000 -32.676000 151.939000 -32.658000 152.036000 -32.598000 152.009000 -32.580000 151.977000 -32.561000 151.896000 -32.483000 151.875000 -32.432000 151.918000 -32.404000 151.956000 -32.367000 151.999000 -32.367000 152.020000 -32.381000 152.085000 -32.400000 152.154000 -32.418000 152.181000 -32.404000 152.278000 -32.363000 152.364000 -32.261000 152.418000 -32.141000 152.633000 -31.811000 152.718000 -31.587000 152.740000 -31.480000 152.939000 -31.092000 152.944000 -31.064000 152.987000 -31.017000 153.046000 -30.923000 153.073000 -30.853000 153.073000 -30.707000 153.062000 -30.674000 153.035000 -30.632000 153.035000 -30.561000 153.019000 -30.438000 153.046000 -30.405000 153.078000 -30.311000 153.121000 -30.221000 153.202000 -30.093000 153.229000 -30.041000 153.277000 -29.823000 153.304000 -29.761000 153.347000 -29.547000 153.342000 -29.528000 153.358000 -29.419000 153.395000 -29.199000 153.406000 -29.128000 153.438000 -29.027000 153.460000 -29.013000 153.476000 -28.965000 153.578000 -28.740000 153.594000 -28.692000 153.589000 -28.600000 153.573000 -28.523000 153.583000 -28.461000 153.562000 -28.389000 153.562000 -28.341000 153.514000 -28.230000 153.519000 -28.215000 153.487000 -28.191000 153.460000 -28.066000 153.428000 -27.998000 153.406000 -27.935000 153.374000 -27.911000 153.358000 -27.863000 153.326000 -27.824000 153.320000 -27.776000 153.277000 -27.717000 153.250000 -27.688000 153.213000 -27.630000 153.213000 -27.616000 153.181000 -27.582000 153.186000 -27.557000 153.154000 -27.509000 153.111000 -27.494000 153.105000 -27.480000 153.084000 -27.402000 153.078000 -27.363000 153.009000 -27.251000 153.003000 -27.212000 152.982000 -27.159000 153.052000 -27.125000 153.084000 -27.135000 153.121000 -27.173000 153.186000 -27.247000 153.240000 -27.193000 153.261000 -27.115000 153.256000 -27.066000 153.240000 -27.032000 153.250000 -26.881000 153.304000 -26.505000 153.390000 -26.161000 153.395000 -25.965000 153.412000 -25.925000 153.390000 -25.856000 153.358000 -25.782000 153.336000 -25.773000 153.315000 -25.699000 153.288000 -25.536000 153.283000 -25.462000 153.299000 -25.462000 153.293000 -25.407000 153.320000 -25.348000 153.326000 -25.328000 153.336000 -25.303000 153.347000 -25.279000 153.374000 -25.239000 153.406000 -25.234000 153.401000 -25.214000 153.438000 -25.155000 153.438000 -25.051000 153.412000 -25.021000 153.374000 -24.942000 153.358000 -24.917000 153.352000 -24.892000 153.331000 -24.882000 153.336000 -24.867000 153.272000 -24.748000 153.234000 -24.753000 153.245000 -24.768000 153.224000 -24.783000 153.207000 -24.838000 153.154000 -24.947000 153.105000 -24.981000 153.073000 -25.006000 153.068000 -25.026000 153.019000 -25.051000 153.041000 -25.185000 153.062000 -25.214000 153.057000 -25.234000 153.089000 -25.348000 153.095000 -25.496000 153.062000 -25.610000 153.052000 -25.625000 152.966000 -25.630000 152.950000 -25.605000 152.928000 -25.541000 152.928000 -25.521000 152.912000 -25.496000 152.917000 -25.457000 152.896000 -25.392000 152.880000 -25.373000 152.826000 -25.353000 152.772000 -25.343000 152.751000 -25.328000 152.735000 -25.294000 152.718000 -25.294000 152.708000 -25.279000 152.627000 -25.219000 152.611000 -25.200000 152.568000 -25.041000 152.450000 -24.942000 152.428000 -24.922000 152.407000 -24.842000 152.391000 -24.828000 152.359000 -24.773000 152.337000 -24.748000 152.321000 -24.748000 152.246000 -24.644000 152.203000 -24.534000 152.181000 -24.445000 152.101000 -24.325000 152.068000 -24.300000 151.966000 -24.130000 151.961000 -24.105000 151.891000 -24.050000 151.735000 -23.970000 151.687000 -23.925000 151.639000 -23.895000 151.515000 -23.835000 151.391000 -23.780000 151.268000 -23.655000 151.257000 -23.620000 151.160000 -23.510000 151.144000 -23.474000 151.048000 -23.384000 150.849000 -23.273000 150.811000 -23.258000 150.784000 -23.193000 150.779000 -23.027000 150.768000 -22.901000 150.774000 -22.876000 150.720000 -22.492000 150.720000 -22.477000 150.693000 -22.396000 150.682000 -22.285000 150.693000 -22.259000 150.650000 -22.259000 150.666000 -22.269000 150.655000 -22.310000 150.650000 -22.345000 150.672000 -22.371000 150.661000 -22.426000 150.666000 -22.477000 150.645000 -22.492000 150.629000 -22.522000 150.451000 -22.457000 150.435000 -22.436000 150.306000 -22.355000 150.215000 -22.269000 150.177000 -22.239000 150.150000 -22.239000 150.140000 -22.224000 150.113000 -22.178000 150.097000 -22.249000 150.075000 -22.274000 150.081000 -22.290000 150.070000 -22.325000 150.005000 -22.426000 149.973000 -22.416000 149.903000 -22.376000 149.844000 -22.295000 149.780000 -22.209000 149.576000 -21.935000 149.559000 -21.899000 149.463000 -21.757000 149.441000 -21.670000 149.398000 -21.564000 149.371000 -21.416000 149.361000 -21.299000 149.339000 -21.253000 149.285000 -21.222000 149.285000 -21.161000 149.296000 -21.125000 149.296000 -21.146000 149.312000 -21.110000 149.318000 -21.049000 149.307000 -21.008000 149.275000 -21.079000 149.248000 -21.064000 149.205000 -21.074000 149.178000 -21.054000 149.178000 -21.033000 149.060000 -20.906000 149.033000 -20.880000 148.920000 -20.814000 148.893000 -20.747000 148.893000 -20.732000 148.877000 -20.716000 148.877000 -20.701000 148.823000 -20.614000 148.829000 -20.583000 148.829000 -20.537000 148.974000 -20.486000 148.952000 -20.394000 148.657000 -20.204000 148.630000 -20.168000 148.549000 -20.096000 148.463000 -20.050000 148.463000 -20.070000 148.415000 -20.055000 148.361000 -20.075000 148.281000 -20.091000 148.130000 -20.034000 148.050000 -19.998000 147.985000 -19.926000 147.942000 -19.911000 147.926000 -19.880000 147.862000 -19.792000 147.846000 -19.663000 147.851000 -19.627000 147.829000 -19.602000 147.819000 -19.524000 147.803000 -19.498000 147.792000 -19.540000 147.760000 -19.550000 147.690000 -19.545000 147.668000 -19.514000 147.641000 -19.498000 147.609000 -19.447000 147.566000 -19.447000 147.507000 -19.462000 147.378000 -19.457000 147.319000 -19.416000 147.319000 -19.395000 147.303000 -19.359000 147.292000 -19.246000 147.222000 -19.277000 147.201000 -19.277000 147.120000 -19.235000 147.099000 -19.225000 146.986000 -19.225000 146.819000 -19.189000 146.691000 -19.147000 146.653000 -19.116000 146.583000 -19.090000 146.502000 -19.039000 146.486000 -18.987000 146.454000 -18.977000 146.374000 -18.909000 146.309000 -18.806000 146.266000 -18.697000 146.250000 -18.702000 146.212000 -18.614000 146.121000 -18.474000 146.094000 -18.417000 146.100000 -18.349000 146.089000 -18.329000 146.094000 -18.277000 146.078000 -18.219000 146.078000 -18.167000 146.067000 -18.011000 146.046000 -17.923000 146.040000 -17.860000 145.987000 -17.730000 145.971000 -17.605000 145.971000 -17.511000 145.933000 -17.412000 145.933000 -17.307000 145.917000 -17.281000 145.928000 -17.145000 145.955000 -16.936000 145.960000 -16.857000 145.938000 -16.805000 145.906000 -16.800000 145.885000 -16.816000 145.852000 -16.842000 145.809000 -16.878000 145.707000 -16.831000 145.638000 -16.826000 145.627000 -16.789000 145.595000 -16.763000 145.573000 -16.700000 145.492000 -16.585000 145.487000 -16.533000 145.460000 -16.485000 145.455000 -16.428000 145.433000 -16.370000 145.412000 -16.286000 145.417000 -16.254000 145.412000 -16.202000 145.423000 -16.091000 145.423000 -15.849000 145.407000 -15.765000 145.380000 -15.718000 145.347000 -15.654000 145.337000 -15.486000 145.283000 -15.122000 145.261000 -15.048000 145.229000 -14.889000 145.149000 -14.767000 145.068000 -14.656000 145.030000 -14.619000 145.020000 -14.571000 145.004000 -14.518000 144.859000 -14.386000 144.794000 -14.338000 144.644000 -14.312000 144.633000 -14.328000 144.493000 -14.322000 144.359000 -14.291000 144.284000 -14.338000 144.246000 -14.365000 144.203000 -14.397000 144.080000 -14.386000 143.822000 -14.243000 143.768000 -14.174000 143.720000 -14.073000 143.693000 -13.972000 143.682000 -13.861000 143.666000 -13.829000 143.666000 -13.802000 143.655000 -13.728000 143.601000 -13.643000 143.612000 -13.504000 143.601000 -13.323000 143.591000 -13.148000 143.612000 -12.934000 143.612000 -12.913000 143.628000 -12.854000 143.618000 -12.838000 143.618000 -12.758000 143.634000 -12.753000 143.607000 -12.732000 143.553000 -12.721000 143.472000 -12.593000 143.413000 -12.539000 143.392000 -12.529000 143.327000 -12.240000 143.338000 -12.224000 143.344000 -12.128000 143.349000 -12.053000 143.344000 -12.026000 143.354000 -12.005000 143.306000 -11.951000 143.263000 -11.946000 143.193000 -11.908000 143.188000 -11.881000 143.129000 -11.849000 143.112000 -11.806000 143.059000 -11.726000 143.037000 -11.721000 143.016000 -11.667000 143.000000 -11.651000 143.000000 -11.555000 142.967000 -11.538000 142.973000 -11.474000 142.967000 -11.399000 142.989000 -11.383000 143.016000 -11.179000 143.016000 -11.136000 143.021000 -11.115000 142.935000 -11.104000 142.871000 -11.013000 142.871000 -11.029000 142.838000 -10.862000 142.822000 -10.846000 142.817000 -10.819000 142.761636 -10.828687 & @TYPE xy 147.792000 -39.804000 147.797000 -39.821000 147.813000 -39.846000 147.824000 -39.871000 147.840000 -39.884000 147.899000 -39.896000 147.910000 -39.913000 147.921000 -40.018000 147.937000 -40.047000 147.969000 -40.119000 148.050000 -40.173000 148.082000 -40.177000 148.141000 -40.181000 148.184000 -40.169000 148.222000 -40.119000 148.184000 -40.018000 148.200000 -39.984000 148.222000 -39.896000 148.200000 -39.829000 148.168000 -39.817000 148.028000 -39.787000 147.991000 -39.766000 147.889000 -39.770000 147.862000 -39.758000 147.835000 -39.745000 147.792000 -39.758000 147.787000 -39.787000 & @TYPE xy 148.093000 -40.398000 148.200000 -40.411000 148.394000 -40.398000 148.415000 -40.361000 148.404000 -40.348000 148.367000 -40.323000 148.318000 -40.340000 148.254000 -40.332000 148.238000 -40.323000 148.173000 -40.336000 148.120000 -40.369000 & grace-5.1.23/examples/regions.par0000644000076500001440000003476306661417047016450 0ustar fnevgenyusers# xvgr parameter file # version 30000 with string string on string loctype view string 0.150376, 0.851373 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Regions are defined to be inside/outside a polygonal area," with string string on string loctype view string 0.150376, 0.819063 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "or half-planes formed by lines. " with string string on string loctype view string 0.768170, 0.460420 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Above line" with string string on string loctype view string 0.735589, 0.290792 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Below line" with string string on string loctype view string 0.444862, 0.486268 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Left of line" with string string on string loctype view string 0.249373, 0.432956 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Inside poly" with string string on string loctype view string 0.562657, 0.319871 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Outside poly" with string string on string loctype view string 0.156642, 0.762520 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "See Data/Region operations for operations based on regions," with string string on string loctype view string 0.156642, 0.730210 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "e.g., Extract, Delete, and Evaluate." r0 ON r0 type polyi r0 linestyle 1 r0 linewidth 1 r0 color 1 r0 xy 1974.000000, 342.741117 r0 xy 1972.464646, 338.477157 r0 xy 1972.909091, 332.385787 r0 xy 1973.313131, 327.512690 r0 xy 1974.282828, 322.233503 r0 xy 1975.373737, 320.609137 r0 xy 1976.222222, 322.436548 r0 xy 1976.989899, 323.451777 r0 xy 1977.111111, 328.324873 r0 xy 1977.030303, 335.228426 r0 xy 1976.666667, 342.741117 link r0 to g0 r1 ON r1 type polyo r1 linestyle 1 r1 linewidth 1 r1 color 1 r1 xy 1979.131313, 346.395939 r1 xy 1978.686869, 340.507614 r1 xy 1979.010101, 330.558376 r1 xy 1979.696970, 326.903553 r1 xy 1980.787879, 326.294416 r1 xy 1981.555556, 329.746193 r1 xy 1981.919192, 332.182741 r1 xy 1981.797980, 337.055838 r1 xy 1981.191919, 348.426396 r1 xy 1979.777778, 350.253807 link r1 to g0 r2 ON r2 type below r2 linestyle 1 r2 linewidth 1 r2 color 1 r2 line 1981.393939, 354.517766, 1986.565657, 332.385787 link r2 to g0 r3 ON r3 type above r3 linestyle 1 r3 linewidth 1 r3 color 1 r3 line 1982.808081, 355.939086, 1987.212121, 336.446701 link r3 to g0 r4 ON r4 type left r4 linestyle 1 r4 linewidth 1 r4 color 1 r4 line 1977.636364, 354.923858, 1978.242424, 324.263959 link r4 to g0 with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type XY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 1970 world xmax 1990 world ymin 320 world ymax 360 view xmin 0.156642 view xmax 0.889724 view ymin 0.281099 view ymax 0.531502 title "Regions" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 s0 type XY s0 symbol 0 s0 symbol size 1.000000 s0 skip 0 s0 linestyle 1 s0 linewidth 1 s0 color 1 s0 fill 0 s0 fill color 0 s0 errorbar type BOTH s0 errorbar length 1.000000 s0 errorbar linewidth 1 s0 errorbar linestyle 1 s0 errorbar riser ON s0 errorbar riser linewidth 1 s0 errorbar riser linestyle 1 s0 comment "brw.dat" xaxis tick ON xaxis tick major 5.000000 xaxis tick minor 2.500000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 10.000000 yaxis tick minor 5.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 5.000000 zeroxaxis tick minor 2.500000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 10.000000 zeroyaxis tick minor 5.000000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 legend string 0 "" frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/altaxis.par0000644000076500001440000000106006626627163016432 0ustar fnevgenyusersaltxaxis on altxaxis tick on altxaxis ticklabel on altxaxis tick alt on altxaxis tick min 1 altxaxis tick max 10 altxaxis tick major 1 altxaxis tick minor .1 xaxis bar on xaxis tick offsetx 0.07 yaxis tick offsetx 0.07 xaxis tick op bottom yaxis tick op left xaxis bar on yaxis bar on xaxis tick out yaxis ticklabel layout vertical altyaxis on altyaxis tick on altyaxis ticklabel on altyaxis tick alt on altyaxis tick min 100 altyaxis tick max 500 altyaxis tick major 100 altyaxis tick minor 25 altyaxis ticklabel layout vertical title "Test of multiple axes" grace-5.1.23/examples/txttrans.agr0000644000076500001440000002150207025566100016631 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 600, 600 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Dec 12 23:46:20 1999" @with string @ string on @ string loctype view @ string 0.307189542484, 0.616013071895 @ string color 4 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\T{1 0 0 -1}V-Mirror" @with string @ string on @ string loctype view @ string 0.255490196079, 0.465392156862 @ string color 4 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\T{-1 0 0 1}H-Mirror" @with string @ string on @ string loctype view @ string 0.191993464052, 0.703300653595 @ string color 2 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\T{1 0 0 2}V-Extent" @with string @ string on @ string loctype view @ string 0.452581699346, 0.474901960784 @ string color 2 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\T{3 0 0 1}H-Extent" @with string @ string on @ string loctype view @ string 0.191013071896, 0.313137254901 @ string color 11 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\l{.5}Slant" @with string @ string on @ string loctype view @ string 0.612124183008, 0.170522875817 @ string color 11 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\l{-1}Another Slant" @with string @ string on @ string loctype view @ string 0.5, 0.9 @ string color 15 @ string rot 0 @ string font 5 @ string just 2 @ string char size 3.000000 @ string def "\m{0}\uText transformations\M{0}\v{-.4}\t{1 0 0 -1}\R{turquoise}Text transformations\U" @with string @ string on @ string loctype view @ string 0.576993464052, 0.634967320262 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "\T{1 0 0 1}Normal" @with string @ string on @ string loctype view @ string 0.145, 0.124967320262 @ string color 3 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.500000 @ string def "A to\r{10}tally s\r{10}illy\r{10} and \r{10}c\z{1.2}ra\z{1.2}zy \r{-10}tra\r{-10}n\qsf\r{-10}o\qr\r{-10}mat\r{-10}ion!" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden true @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 grace-5.1.23/examples/graphs.par0000644000076500001440000020643706626627163016270 0ustar fnevgenyusers# xvgr parameter file # with line line on line loctype view line 0.604010, 0.833603, 0.645363, 0.841680 line linewidth 1 line linestyle 1 line color 1 line arrow 0 line arrow size 1.000000 line def with string string on string loctype view string 0.159148, 0.234249 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 0" with string string on string loctype view string 0.157895, 0.474960 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 1" with string string on string loctype view string 0.413534, 0.231018 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 2" with string string on string loctype view string 0.411028, 0.466882 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 3" with string string on string loctype view string 0.231830, 0.917609 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 4" with string string on string loctype view string 0.701754, 0.665590 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Graph 5" with string string on string loctype view string 0.655388, 0.846527 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Tick marks as grid lines" with string string on string loctype view string 0.711779, 0.453958 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Tick marks" with string string on string loctype view string 0.711779, 0.421648 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "in and out" with string string on string loctype view string 0.392231, 0.403877 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "No tick labels" with string string on string loctype view string 0.404762, 0.163166 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Has tick labels" with string string on string loctype view string 0.442356, 0.940226 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "Click on a graph to change the focus" with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type XY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin -1 world xmax 1 world ymin -1 world ymax 1 view xmin 0.100000 view xmax 0.350000 view ymin 0.100000 view ymax 0.350000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.100000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.100000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g1 g1 ON g1 label OFF g1 hidden FALSE g1 type XY g1 autoscale type AUTO g1 fixedpoint OFF g1 fixedpoint xy 0.000000 , 0.000000 g1 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin -1 world xmax 1 world ymin -1 world ymax 1 view xmin 0.100000 view xmax 0.350000 view ymin 0.350000 view ymax 0.600000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.100000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel OFF xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.100000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g2 g2 ON g2 label OFF g2 hidden FALSE g2 type XY g2 autoscale type AUTO g2 fixedpoint OFF g2 fixedpoint xy 0.000000 , 0.000000 g2 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin -1 world xmax 1 world ymin -1 world ymax 1 view xmin 0.350000 view xmax 0.600000 view ymin 0.100000 view ymax 0.350000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.100000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.100000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel OFF yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g3 g3 ON g3 label OFF g3 hidden FALSE g3 type XY g3 autoscale type AUTO g3 fixedpoint OFF g3 fixedpoint xy 0.000000 , 0.000000 g3 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin -1 world xmax 1 world ymin -1 world ymax 1 view xmin 0.350000 view xmax 0.600000 view ymin 0.350000 view ymax 0.600000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.100000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel OFF xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.100000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel OFF yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g4 g4 ON g4 label OFF g4 hidden FALSE g4 type XY g4 autoscale type AUTO g4 fixedpoint OFF g4 fixedpoint xy 0.000000 , 0.000000 g4 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 0 world xmax 1 world ymin 0 world ymax 1 view xmin 0.097744 view xmax 0.592732 view ymin 0.681745 view ymax 0.883683 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.250000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick BOTH xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 3 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 3 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid ON xaxis tick minor grid ON xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.250000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick BOTH yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 3 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 3 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid ON yaxis tick minor grid ON yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick BOTH altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 3 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 3 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid ON altxaxis tick minor grid ON altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick BOTH altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 3 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 3 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid ON altyaxis tick minor grid ON altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick BOTH zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 3 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 3 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid ON zeroxaxis tick minor grid ON zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick BOTH zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 3 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 3 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid ON zeroyaxis tick minor grid ON zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g5 g5 ON g5 label OFF g5 hidden FALSE g5 type XY g5 autoscale type AUTO g5 fixedpoint OFF g5 fixedpoint xy 0.000000 , 0.000000 g5 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 0 world xmax 1 world ymin 0 world ymax 1 view xmin 0.680451 view xmax 0.863409 view ymin 0.101777 view ymax 0.602585 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 0.500000 xaxis tick minor 0.250000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick BOTH xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.500000 yaxis tick minor 0.250000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick BOTH yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick BOTH altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick BOTH altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 0.250000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick BOTH zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.500000 zeroyaxis tick minor 0.250000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick BOTH zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/terr.agr0000644000076500001440000003356306757314210015734 0ustar fnevgenyusers# Grace project file # @version 50003 @page size 792, 612 @page scroll 10% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1900 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 4 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Aug 20 20:53:39 1999" @with line @ line on @ line loctype world @ line g0 @ line 3.86019946926, -12.1127528534, 4.63422323846, -12.5658940414 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow type 0 @ line arrow length 1.500000 @ line arrow layout 1.000000, 1.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 2.2349171269, -12.4690652497, 2.52850133302, -15.6412218734 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow type 0 @ line arrow length 1.500000 @ line arrow layout 1.000000, 1.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.75, -12.8, 0, -16 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow type 0 @ line arrow length 1.500000 @ line arrow layout 1.000000, 1.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 7, 7.8, 8.2, 9 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 2 @ line arrow type 0 @ line arrow length 1.500000 @ line arrow layout 1.000000, 1.000000 @line def @with string @ string on @ string loctype world @ string g0 @ string 2.4, -17 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Riser" @with string @ string on @ string loctype world @ string g0 @ string 4.79537360518, -12.9305037645 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Error bar" @with string @ string on @ string loctype view @ string 0.199468823529, 0.221325 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Error bars can be drawn along either X or Y or both, with differing" @with string @ string on @ string loctype view @ string 0.199468823529, 0.189015 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "values on either side of the datum. Setting the properties" @with string @ string on @ string loctype view @ string 0.199468823529, 0.156704 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "of error bars is done in Plot/Set appearance (error bars tab). " @with string @ string on @ string loctype world @ string g0 @ string -1.3, -17 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Symbol" @with string @ string on @ string loctype world @ string g0 @ string -4.5, 7.6 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Too large error bars are (optionally) clipped with arrows" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin -5 @ world xmax 10 @ world ymin -20 @ world ymax 10 @ stack world 0, 0, 0, 0 @ view xmin 0.194604 @ view xmax 1.106001 @ view ymin 0.315024 @ view ymax 0.849758 @ title "Test of error bars" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 5 @ xaxis tick minor ticks 1 @ xaxis tick default 3 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 3 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 1.03529411765 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 0 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xydy @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 2 @ s0 symbol fill pattern 12 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 4 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 0 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 0 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 4 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.250000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 1.000000 @ s0 comment "terr2.d" @ s0 legend "" @ s1 hidden false @ s1 type xydx @ s1 symbol 2 @ s1 symbol size 1.000000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 5 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 4 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 0 @ s1 line linewidth 1.0 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 0 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 4 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 1.250000 @ s1 errorbar linewidth 3.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 3 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 1.000000 @ s1 comment "terr2.d" @ s1 legend "" @ s2 hidden false @ s2 type xydxdxdydy @ s2 symbol 3 @ s2 symbol size 1.000000 @ s2 symbol color 4 @ s2 symbol pattern 1 @ s2 symbol fill color 7 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 2.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 4 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 0 @ s2 line linewidth 1.0 @ s2 line color 1 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 0 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 4 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place normal @ s2 errorbar color 14 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip on @ s2 errorbar riser clip length 0.100000 @ s2 comment "terr2.d" @ s2 legend "" @target G0.S0 @type xydy -4 -3 3.5 -3 -2 2.5 -2 -1 1 & @target G0.S1 @type xydx -2 2 0.7 -1 -3 0.5 1 -12 2.7 & @target G0.S2 @type xydxdxdydy 6 -7 2.7 1 2 3 7 -2 0.5 2 3 1 8.5 4 1 2.5 10 2 & grace-5.1.23/examples/props.agr0000644000076500001440000002544406626627163016133 0ustar fnevgenyusers# Grace project file # @version 50001 @page size 792 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 2 to "Times-Italic" , "Times-Italic" @map font 1 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 6 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 5 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 8 to "Symbol" , "Symbol" @map font 9 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 4 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp on @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 90 @timestamp font 4 @timestamp char size 1.000000 @timestamp def "Sun Sep 13 23:55:10 1998" @with box @ box on @ box loctype view @ box 0.067669, 0.129241, 0.185464, 0.245557 @ box linestyle 1 @ box linewidth 1 @ box color 1 @ box fill color 1 @ box fill pattern 0 @box def @with box @ box on @ box loctype view @ box 0.219298, 0.037157, 0.513784, 0.135703 @ box linestyle 3 @ box linewidth 3 @ box color 1 @ box fill color 8 @ box fill pattern 1 @box def @with line @ line on @ line loctype view @ line 0.075188, 0.282714, 0.176692, 0.282714 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.8, 0.534733, 0.89, 0.542811 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.8, 0.185, 0.8, 0.25 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.12782, 0.7, 0.241855, 0.516963 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with line @ line on @ line loctype view @ line 0.082417582418, 0.512355848435, 0.025, 0.38 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 0 @line def @with string @ string on @ string loctype view @ string 0.077694, 0.369952 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "A text string" @with string @ string on @ string loctype view @ string 0.085213, 0.311793 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "A line" @with string @ string on @ string loctype view @ string 0.091479, 0.185784 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "A box" @with string @ string on @ string loctype view @ string 0.9, 0.547658 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Properties of the graph" @with string @ string on @ string loctype view @ string 0.9, 0.52 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Frame are set in" @with string @ string on @ string loctype view @ string 0.9, 0.48 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Plot/Graph appearance" @with string @ string on @ string loctype view @ string 0.743108, 0.17 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Properties of the tick" @with string @ string on @ string loctype view @ string 0.743108, 0.135 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "labels are set in" @with string @ string on @ string loctype view @ string 0.743108, 0.1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Plot/Axis properties" @with string @ string on @ string loctype view @ string 0.235, 0.085 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "A string in a filled box" @with string @ string on @ string loctype view @ string 0.028822, 0.756058 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Axis labels are defined" @with string @ string on @ string loctype view @ string 0.028, 0.725 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "in Plot/Axis properties" @with string @ string on @ string loctype view @ string 0.383459, 0.575121 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "The scaling of the axes" @with string @ string on @ string loctype view @ string 0.383459, 0.545 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "and tick mark spacing" @with string @ string on @ string loctype view @ string 0.383459, 0.515 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "are set in Plot/Axis properties" @with string @ string on @ string loctype view @ string 0.0206043956044, 0.532125205931 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Time stamp" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.344771 @ view xmax 0.800654 @ view ymin 0.281046 @ view ymax 0.689542 @ title "Title" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Subtitle" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "X-axis" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Y-axis" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 0 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @WITH G0 @G0 ON grace-5.1.23/examples/tinset.agr0000644000076500001440000007642506661417047016300 0ustar fnevgenyusers# ACE/gr parameter file # @version 30000 @with string @ string on @ string loctype view @ string 0.165414, 0.109855 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "To make a graph within a graph, simply activate a graph and set the" @with string @ string on @ string loctype view @ string 0.165414, 0.077544 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "viewport to the desired location. Some problems may arise with" @with string @ string on @ string loctype view @ string 0.165414, 0.045234 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "getting/setting the graph focus, use the popup menu of any graph" @with string @ string on @ string loctype view @ string 0.168734, 0.016975 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "selector (e.g. in Plot/Graph appearance) to set the focus to a particular graph." @with g0 @g0 on @g0 label off @g0 hidden false @g0 type xy @g0 autoscale type AUTO @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 2 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1973 @ world xmax 1978 @ world ymin 325 @ world ymax 340 @ view xmin 0.506266 @ view xmax 0.764411 @ view ymin 0.239095 @ view ymax 0.423263 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "Inset graph" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tinset.d" @ xaxis tick on @ xaxis tick major 1.000000 @ xaxis tick minor 0.500000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel off @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 5.000000 @ yaxis tick minor 2.500000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel off @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 1.000000 @ zeroxaxis tick minor 0.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 5.000000 @ zeroyaxis tick minor 2.500000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 2 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 4 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @with g1 @g1 on @g1 label off @g1 hidden false @g1 type xy @g1 autoscale type AUTO @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 2 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1970 @ world xmax 1990 @ world ymin 320 @ world ymax 350 @ view xmin 0.162907 @ view xmax 0.809524 @ view ymin 0.197092 @ view ymax 0.807754 @ title "Test of inset graphs" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tinset.d" @ xaxis tick on @ xaxis tick major 5.000000 @ xaxis tick minor 2.500000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 10.000000 @ yaxis tick minor 5.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 2 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 4 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @WITH G0 @G0 ON @TYPE xy 1974.330000 333.100000 1974.420000 332.100000 1974.500000 331.100000 1974.580000 329.100000 1974.670000 327.400000 1974.750000 327.300000 1974.830000 328.200000 1974.920000 329.600000 1975.000000 330.600000 1975.080000 331.400000 1975.170000 331.900000 1975.250000 333.200000 1975.330000 333.900000 1975.420000 333.400000 1975.500000 331.900000 1975.580000 330.000000 1975.670000 328.500000 1975.750000 328.400000 1975.830000 329.300000 1975.920000 331.000000 1976.000000 331.600000 1976.080000 332.600000 1976.170000 333.600000 1976.250000 334.700000 1976.330000 334.700000 1976.420000 334.200000 1976.500000 333.000000 1976.580000 330.800000 1976.670000 329.000000 1976.750000 328.600000 1976.830000 330.200000 1976.920000 331.600000 1977.000000 332.700000 1977.080000 333.200000 1977.170000 334.900000 1977.250000 336.100000 1977.330000 336.800000 1977.420000 336.100000 1977.500000 334.800000 1977.580000 332.600000 1977.670000 331.300000 1977.750000 331.200000 1977.830000 332.400000 1977.920000 333.500000 1978.000000 334.700000 1978.080000 335.200000 1978.170000 336.500000 1978.250000 337.800000 1978.330000 338.000000 1978.420000 338.000000 1978.500000 336.400000 1978.580000 334.500000 1978.670000 332.500000 1978.750000 332.300000 1978.830000 333.800000 1978.920000 334.800000 1979.000000 336.000000 1979.080000 336.600000 1979.170000 337.900000 1979.250000 339.000000 1979.330000 339.100000 1979.420000 339.300000 1979.500000 337.600000 1979.580000 335.700000 1979.670000 333.800000 1979.750000 334.100000 1979.830000 335.300000 1979.920000 336.800000 1980.000000 337.800000 1980.080000 338.300000 1980.170000 340.100000 1980.250000 340.900000 1980.330000 341.500000 1980.420000 341.300000 1980.500000 339.400000 1980.580000 337.700000 1980.670000 336.100000 1980.750000 336.100000 1980.830000 337.200000 1980.920000 338.400000 1981.000000 339.300000 1981.080000 340.400000 1981.170000 341.700000 1981.250000 342.500000 1981.330000 343.000000 1981.420000 342.500000 1981.500000 340.900000 1981.580000 338.800000 1981.670000 337.100000 1981.750000 337.100000 1981.830000 338.500000 1981.920000 339.900000 1982.000000 340.900000 1982.080000 341.700000 1982.170000 342.700000 1982.250000 343.700000 1982.330000 344.300000 1982.420000 343.400000 1982.500000 342.000000 1982.580000 340.000000 1982.670000 337.800000 1982.750000 338.000000 1982.830000 339.200000 1982.920000 340.600000 1983.000000 341.400000 1983.080000 342.700000 1983.170000 343.000000 1983.250000 345.300000 1983.330000 345.900000 1983.420000 345.400000 1983.500000 344.200000 1983.580000 342.100000 1983.670000 340.100000 1983.750000 340.200000 1983.830000 341.400000 1983.920000 343.000000 1984.000000 343.600000 1984.080000 344.500000 1984.170000 345.100000 1984.250000 346.000000 1984.330000 347.300000 1984.420000 346.600000 1984.500000 345.000000 1984.580000 342.000000 1984.670000 340.900000 1984.750000 341.100000 1984.830000 342.800000 1984.920000 344.300000 1985.000000 344.900000 1985.080000 345.600000 1985.170000 347.200000 1985.250000 347.600000 1985.330000 348.500000 1985.420000 347.900000 1985.500000 346.000000 1985.580000 343.900000 1985.670000 342.600000 1985.750000 342.600000 1985.830000 344.100000 1985.920000 345.500000 & @WITH G1 @G1 ON @TYPE xy 1974.330000 333.100000 1974.420000 332.100000 1974.500000 331.100000 1974.580000 329.100000 1974.670000 327.400000 1974.750000 327.300000 1974.830000 328.200000 1974.920000 329.600000 1975.000000 330.600000 1975.080000 331.400000 1975.170000 331.900000 1975.250000 333.200000 1975.330000 333.900000 1975.420000 333.400000 1975.500000 331.900000 1975.580000 330.000000 1975.670000 328.500000 1975.750000 328.400000 1975.830000 329.300000 1975.920000 331.000000 1976.000000 331.600000 1976.080000 332.600000 1976.170000 333.600000 1976.250000 334.700000 1976.330000 334.700000 1976.420000 334.200000 1976.500000 333.000000 1976.580000 330.800000 1976.670000 329.000000 1976.750000 328.600000 1976.830000 330.200000 1976.920000 331.600000 1977.000000 332.700000 1977.080000 333.200000 1977.170000 334.900000 1977.250000 336.100000 1977.330000 336.800000 1977.420000 336.100000 1977.500000 334.800000 1977.580000 332.600000 1977.670000 331.300000 1977.750000 331.200000 1977.830000 332.400000 1977.920000 333.500000 1978.000000 334.700000 1978.080000 335.200000 1978.170000 336.500000 1978.250000 337.800000 1978.330000 338.000000 1978.420000 338.000000 1978.500000 336.400000 1978.580000 334.500000 1978.670000 332.500000 1978.750000 332.300000 1978.830000 333.800000 1978.920000 334.800000 1979.000000 336.000000 1979.080000 336.600000 1979.170000 337.900000 1979.250000 339.000000 1979.330000 339.100000 1979.420000 339.300000 1979.500000 337.600000 1979.580000 335.700000 1979.670000 333.800000 1979.750000 334.100000 1979.830000 335.300000 1979.920000 336.800000 1980.000000 337.800000 1980.080000 338.300000 1980.170000 340.100000 1980.250000 340.900000 1980.330000 341.500000 1980.420000 341.300000 1980.500000 339.400000 1980.580000 337.700000 1980.670000 336.100000 1980.750000 336.100000 1980.830000 337.200000 1980.920000 338.400000 1981.000000 339.300000 1981.080000 340.400000 1981.170000 341.700000 1981.250000 342.500000 1981.330000 343.000000 1981.420000 342.500000 1981.500000 340.900000 1981.580000 338.800000 1981.670000 337.100000 1981.750000 337.100000 1981.830000 338.500000 1981.920000 339.900000 1982.000000 340.900000 1982.080000 341.700000 1982.170000 342.700000 1982.250000 343.700000 1982.330000 344.300000 1982.420000 343.400000 1982.500000 342.000000 1982.580000 340.000000 1982.670000 337.800000 1982.750000 338.000000 1982.830000 339.200000 1982.920000 340.600000 1983.000000 341.400000 1983.080000 342.700000 1983.170000 343.000000 1983.250000 345.300000 1983.330000 345.900000 1983.420000 345.400000 1983.500000 344.200000 1983.580000 342.100000 1983.670000 340.100000 1983.750000 340.200000 1983.830000 341.400000 1983.920000 343.000000 1984.000000 343.600000 1984.080000 344.500000 1984.170000 345.100000 1984.250000 346.000000 1984.330000 347.300000 1984.420000 346.600000 1984.500000 345.000000 1984.580000 342.000000 1984.670000 340.900000 1984.750000 341.100000 1984.830000 342.800000 1984.920000 344.300000 1985.000000 344.900000 1985.080000 345.600000 1985.170000 347.200000 1985.250000 347.600000 1985.330000 348.500000 1985.420000 347.900000 1985.500000 346.000000 1985.580000 343.900000 1985.670000 342.600000 1985.750000 342.600000 1985.830000 344.100000 1985.920000 345.500000 & grace-5.1.23/examples/txyr.agr0000644000076500001440000004154306701752044015763 0ustar fnevgenyusers# Grace project file # @version 50003 @page size 612 792 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sat Apr 3 01:39:53 1999" @with string @ string on @ string loctype view @ string 0.176764823529, 0.268174 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Example of data set type XY RADIUS. The file format is" @with string @ string on @ string loctype view @ string 0.176764823529, 0.203554 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "x y r" @with string @ string on @ string loctype view @ string 0.176764823529, 0.171244 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def " ." @with string @ string on @ string loctype view @ string 0.176764823529, 0.138934 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def " ." @with string @ string on @ string loctype view @ string 0.176764823529, 0.074313 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Where r is the radius of a circle with center at x, y." @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Fixed @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin -1 @ world xmax 2 @ world ymin -1 @ world ymax 3 @ stack world 0, 0, 0, 0 @ view xmin 0.125000 @ view xmax 0.875000 @ view ymin 0.350000 @ view ymax 1.150000 @ title "A sample of \f{Courier}Fixed\f{} graph type" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "(X and Y axis scales are always identical)" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 1 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 1 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 1.03529412 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 0 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xyr @ s0 symbol 0 @ s0 symbol size 0.760000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 3.0 @ s0 line color 15 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 14 @ s0 fill pattern 20 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 2.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 comment "xyr.dat" @ s0 legend "" @target G0.S0 @type xyr 0.396465 0.840485 0.2 0.353336 0.446583 0.2 0.318693 0.886428 0.2 0.015583 0.58409 0.2 0.159369 0.383716 0.2 0.691004 0.058859 0.2 0.899854 0.163546 0.2 0.159072 0.533065 0.2 0.604144 0.582699 0.2 0.269971 0.390478 0.2 0.293401 0.742377 0.2 0.298526 0.075538 0.2 0.404983 0.857378 0.2 0.941968 0.662831 0.2 0.846476 0.002755 0.2 0.462379 0.532596 0.2 0.787877 0.265612 0.2 0.982752 0.306785 0.2 0.600855 0.608716 0.2 0.212439 0.885895 0.2 0.304657 0.15186 0.2 0.337662 0.387477 0.2 0.64361 0.753553 0.2 0.603616 0.531628 0.2 0.45936 0.652488 0.2 0.327181 0.94637 0.2 0.36804 0.94389 0.2 0.007428 0.5166 0.2 0.272771 0.024299 0.2 0.591955 0.204964 0.2 0.877693 0.059369 0.2 0.260843 0.302829 0.2 0.891495 0.498198 0.2 0.710026 0.286414 0.2 0.864924 0.675541 0.2 0.45849 0.959636 0.2 0.774675 0.376551 0.2 0.228639 0.354534 0.2 0.300318 0.669766 0.2 0.718967 0.565955 0.2 0.824465 0.390612 0.2 0.818766 0.844008 0.2 0.180468 0.943396 0.2 0.424887 0.520666 0.2 0.065644 0.913508 0.2 0.882585 0.761364 0.2 0.398923 0.688257 0.2 0.761548 0.405009 0.2 0.125251 0.484634 0.2 0.222463 0.873121 0.2 0.528822 0.001414 0.2 0.860514 0.018697 0.2 0.814892 0.242884 0.2 0.314572 0.965733 0.2 0.93556 0.809432 0.2 0.492109 0.220136 0.2 0.576354 0.289029 0.2 0.321067 0.261323 0.2 0.173988 0.001817 0.2 0.044784 0.241175 0.2 0.415451 0.701625 0.2 0.221846 0.50391 0.2 0.06703 0.393063 0.2 0.479477 0.218142 0.2 0.219511 0.916203 0.2 0.350222 0.192694 0.2 0.211235 0.633682 0.2 0.053565 0.783411 0.2 0.030674 0.444097 0.2 0.176413 0.93218 0.2 0.909648 0.472845 0.2 0.871695 0.695567 0.2 0.93019 0.455091 0.2 0.398567 0.893304 0.2 0.693547 0.838734 0.2 0.739699 0.65127 0.2 0.678154 0.577212 0.2 0.273118 0.935388 0.2 0.661939 0.047413 0.2 0.373038 0.618195 0.2 0.148628 0.377306 0.2 0.644591 0.025688 0.2 0.841381 0.077019 0.2 0.742634 0.255986 0.2 0.901844 0.377648 0.2 0.31953 0.211435 0.2 0.648532 0.251315 0.2 0.228644 0.250922 0.2 0.943221 0.136715 0.2 0.270061 0.548707 0.2 0.324021 0.86508 0.2 0.296703 0.680059 0.2 0.833147 0.876308 0.2 0.649665 0.073115 0.2 0.898547 0.253581 0.2 0.611319 0.84189 0.2 0.832019 0.372587 0.2 0.757048 0.109215 0.2 0.850812 0.559329 0.2 0.85758 0.343097 0.2 -0.195756 1.772239 0.2 -0.431242 1.625442 0.2 -0.602505 1.441946 0.2 -0.720248 1.295149 0.2 -0.741656 1.148353 0.2 -0.763064 1.074954 0.2 -0.677433 0.854759 0.2 -0.516874 0.561165 0.2 -0.420538 0.389902 0.2 -0.302795 0.230873 0.2 -0.163644 0.05961 0.2 -0.003085 -0.09942 0.2 0.168178 -0.172819 0.2 0.296625 -0.246217 0.2 0.403665 -0.295149 0.2 0.521408 -0.282916 0.2 0.639151 -0.25845 0.2 0.756894 -0.197285 0.2 0.863934 -0.123886 0.2 0.928157 -0.001556 0.2 0.928157 0.169707 0.2 0.885342 0.279805 0.2 0.831822 0.414369 0.2 0.821118 0.610098 0.2 0.756894 0.830293 0.2 0.85323 1.050488 0.2 0.960269 1.123886 0.2 1.045901 1.148353 0.2 1.131532 1.160586 0.2 1.259979 1.209518 0.2 1.356315 1.319615 0.2 1.602505 1.674374 0.2 1.591801 1.821171 0.2 1.50617 2.139231 0.2 1.420538 2.212629 0.2 1.292091 2.188163 0.2 1.270683 2.041366 0.2 1.259979 1.870103 0.2 1.185052 1.747773 0.2 1.013789 1.723307 0.2 0.85323 1.723307 0.2 0.681967 1.796705 0.2 0.542816 1.955735 0.2 0.457184 2.114765 0.2 0.318033 2.224862 0.2 0.232402 2.065832 0.2 0.25381 1.89457 0.2 0.221698 1.747773 0.2 0.14677 1.625442 0.2 0.050435 1.527578 0.2 -0.024493 1.454179 0.2 -0.142236 1.380781 0.2 -0.217164 1.221751 0.2 -0.131532 0.989323 0.2 -0.024493 0.81806 0.2 -0.20646 0.781361 0.2 -0.345611 0.964857 0.2 -0.420538 1.185052 0.2 -0.377723 1.356315 0.2 -0.292091 1.478645 0.2 -0.217164 1.552044 0.2 & grace-5.1.23/examples/polar.agr0000644000076500001440000002377306626627163016110 0ustar fnevgenyusers# Grace project file # @version 50000 @page size 600 600 @page scroll 5% @page inout 5% @link page off @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Sep 6 03:03:17 1998" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Polar @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0.785398163 @ world xmax 5.49778714 @ world ymin 2 @ world ymax 10 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "A polar plot" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 0 @ xaxis bar linestyle 1 @ xaxis bar linewidth 2 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.785398 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 3 @ xaxis tick minor grid on @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 0 @ yaxis bar linestyle 1 @ yaxis bar linewidth 2 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 3 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.010000 , 0.000000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.5 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 2 @ frame color 1 @ frame pattern 1 @ frame background color 14 @ frame background pattern 1 @ s0 type xy @ s0 symbol 1 @ s0 symbol size 0.500000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 10 @ s0 line type 4 @ s0 line linestyle 1 @ s0 line linewidth 2 @ s0 line color 2 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 2 @ s0 fill rule 1 @ s0 fill color 7 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 1 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 4 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.010000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "X=x, Y=x" @ s0 legend "" @WITH G0 @G0 ON @TARGET S0 @TYPE xy 0 0 0.0909091 0.0909091 0.181818 0.181818 0.272727 0.272727 0.363636 0.363636 0.454545 0.454545 0.545455 0.545455 0.636364 0.636364 0.727273 0.727273 0.818182 0.818182 0.909091 0.909091 1 1 1.09091 1.09091 1.18182 1.18182 1.27273 1.27273 1.36364 1.36364 1.45455 1.45455 1.54545 1.54545 1.63636 1.63636 1.72727 1.72727 1.81818 1.81818 1.90909 1.90909 2 2 2.09091 2.09091 2.18182 2.18182 2.27273 2.27273 2.36364 2.36364 2.45455 2.45455 2.54545 2.54545 2.63636 2.63636 2.72727 2.72727 2.81818 2.81818 2.90909 2.90909 3 3 3.09091 3.09091 3.18182 3.18182 3.27273 3.27273 3.36364 3.36364 3.45455 3.45455 3.54545 3.54545 3.63636 3.63636 3.72727 3.72727 3.81818 3.81818 3.90909 3.90909 4 4 4.09091 4.09091 4.18182 4.18182 4.27273 4.27273 4.36364 4.36364 4.45455 4.45455 4.54545 4.54545 4.63636 4.63636 4.72727 4.72727 4.81818 4.81818 4.90909 4.90909 5 5 5.09091 5.09091 5.18182 5.18182 5.27273 5.27273 5.36364 5.36364 5.45455 5.45455 5.54545 5.54545 5.63636 5.63636 5.72727 5.72727 5.81818 5.81818 5.90909 5.90909 6 6 6.09091 6.09091 6.18182 6.18182 6.27273 6.27273 6.36364 6.36364 6.45455 6.45455 6.54545 6.54545 6.63636 6.63636 6.72727 6.72727 6.81818 6.81818 6.90909 6.90909 7 7 7.09091 7.09091 7.18182 7.18182 7.27273 7.27273 7.36364 7.36364 7.45455 7.45455 7.54545 7.54545 7.63636 7.63636 7.72727 7.72727 7.81818 7.81818 7.90909 7.90909 8 8 8.09091 8.09091 8.18182 8.18182 8.27273 8.27273 8.36364 8.36364 8.45455 8.45455 8.54545 8.54545 8.63636 8.63636 8.72727 8.72727 8.81818 8.81818 8.90909 8.90909 9 9 9.09091 9.09091 9.18182 9.18182 9.27273 9.27273 9.36364 9.36364 9.45455 9.45455 9.54545 9.54545 9.63636 9.63636 9.72727 9.72727 9.81818 9.81818 9.90909 9.90909 10 10 & grace-5.1.23/examples/symslines.agr0000644000076500001440000015645106626627163017021 0ustar fnevgenyusers# Grace project file # @version 40200 @page size 670 600 @page layout fixed @page 5 @page inout 5 @link page off @default linestyle 1 @default linewidth 1 @default color 1 @default char size 1.000000 @default font 4 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sat Jun 13 20:18:42 1998" @with string @ string on @ string loctype view @ string 0.399749, 0.917609 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Graph legend" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 10 @ world ymin 0 @ world ymax 400 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.117794 @ view xmax 0.339599 @ view ymin 0.176090 @ view ymax 0.865913 @ title "Symbols" @ title font 4 @ title size 1.000000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis offset 0.000000 , 0.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel place on ticks @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick op both @ xaxis tick type auto @ yaxis tick on @ yaxis tick major 100 @ yaxis tick minor ticks 1 @ yaxis offset 0.000000 , 0.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel place on ticks @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick op both @ yaxis tick type auto @ altxaxis tick on @ altxaxis tick major 2 @ altxaxis tick minor ticks 1 @ altxaxis offset 0.000000 , 0.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label place auto @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel append "" @ altxaxis ticklabel prepend "" @ altxaxis ticklabel angle 0 @ altxaxis ticklabel place on ticks @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major size 1.000000 @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick major grid off @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick minor grid off @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick op both @ altxaxis tick type auto @ altyaxis tick on @ altyaxis tick major 100 @ altyaxis tick minor ticks 1 @ altyaxis offset 0.000000 , 0.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label place auto @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel append "" @ altyaxis ticklabel prepend "" @ altyaxis ticklabel angle 0 @ altyaxis ticklabel place on ticks @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major size 1.000000 @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick major grid off @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick minor grid off @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick op both @ altyaxis tick type auto @ legend on @ legend loctype view @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend box fill off @ legend box linewidth 1 @ legend box linestyle 0 @ legend x1 0.364662 @ legend y1 0.869144 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 2 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 0 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill color 0 @ s0 fill pattern 0 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "symslines.dat" @ s0 legend "Circle" @ s1 type xy @ s1 symbol 3 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 0 @ s1 symbol char font 0 @ s1 symbol center false @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill color 0 @ s1 fill pattern 0 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "symslines.dat" @ s1 legend "Square" @ s2 type xy @ s2 symbol 4 @ s2 symbol size 1.000000 @ s2 symbol color 3 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1 @ s2 symbol linestyle 1 @ s2 symbol char 0 @ s2 symbol char font 0 @ s2 symbol center false @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1 @ s2 line color 3 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill color 0 @ s2 fill pattern 0 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar off @ s2 errorbar type both @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1 @ s2 errorbar riser linestyle 1 @ s2 comment "symslines.dat" @ s2 legend "Diamond" @ s3 type xy @ s3 symbol 5 @ s3 symbol size 1.000000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1 @ s3 symbol linestyle 1 @ s3 symbol char 0 @ s3 symbol char font 0 @ s3 symbol center false @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1 @ s3 line color 4 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill color 0 @ s3 fill pattern 0 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar off @ s3 errorbar type both @ s3 errorbar length 1.000000 @ s3 errorbar linewidth 1 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1 @ s3 errorbar riser linestyle 1 @ s3 comment "symslines.dat" @ s3 legend "Triangle up" @ s4 type xy @ s4 symbol 6 @ s4 symbol size 1.000000 @ s4 symbol color 5 @ s4 symbol pattern 1 @ s4 symbol fill color 5 @ s4 symbol fill pattern 0 @ s4 symbol linewidth 1 @ s4 symbol linestyle 1 @ s4 symbol char 0 @ s4 symbol char font 0 @ s4 symbol center false @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 1 @ s4 line linewidth 1 @ s4 line color 5 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill color 0 @ s4 fill pattern 0 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar off @ s4 errorbar type both @ s4 errorbar length 1.000000 @ s4 errorbar linewidth 1 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1 @ s4 errorbar riser linestyle 1 @ s4 comment "symslines.dat" @ s4 legend "Triangle left" @ s5 type xy @ s5 symbol 7 @ s5 symbol size 1.000000 @ s5 symbol color 6 @ s5 symbol pattern 1 @ s5 symbol fill color 6 @ s5 symbol fill pattern 0 @ s5 symbol linewidth 1 @ s5 symbol linestyle 1 @ s5 symbol char 0 @ s5 symbol char font 0 @ s5 symbol center false @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1 @ s5 line color 6 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill color 0 @ s5 fill pattern 0 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar off @ s5 errorbar type both @ s5 errorbar length 1.000000 @ s5 errorbar linewidth 1 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1 @ s5 errorbar riser linestyle 1 @ s5 comment "symslines.dat" @ s5 legend "Triangle down" @ s6 type xy @ s6 symbol 8 @ s6 symbol size 1.000000 @ s6 symbol color 7 @ s6 symbol pattern 1 @ s6 symbol fill color 7 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1 @ s6 symbol linestyle 1 @ s6 symbol char 0 @ s6 symbol char font 0 @ s6 symbol center false @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 1 @ s6 line color 7 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 0 @ s6 fill color 0 @ s6 fill pattern 0 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar off @ s6 errorbar type both @ s6 errorbar length 1.000000 @ s6 errorbar linewidth 1 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1 @ s6 errorbar riser linestyle 1 @ s6 comment "symslines.dat" @ s6 legend "Triangle right" @ s7 type xy @ s7 symbol 9 @ s7 symbol size 1.000000 @ s7 symbol color 8 @ s7 symbol pattern 1 @ s7 symbol fill color 8 @ s7 symbol fill pattern 0 @ s7 symbol linewidth 1 @ s7 symbol linestyle 1 @ s7 symbol char 0 @ s7 symbol char font 0 @ s7 symbol center false @ s7 symbol skip 0 @ s7 line type 1 @ s7 line linestyle 1 @ s7 line linewidth 1 @ s7 line color 8 @ s7 line pattern 1 @ s7 baseline type 0 @ s7 baseline off @ s7 dropline off @ s7 fill type 0 @ s7 fill color 0 @ s7 fill pattern 0 @ s7 avalue off @ s7 avalue type 2 @ s7 avalue char size 1.000000 @ s7 avalue font 0 @ s7 avalue color 1 @ s7 avalue rot 0 @ s7 avalue format general @ s7 avalue prec 3 @ s7 avalue prepend "" @ s7 avalue append "" @ s7 avalue offset 0.000000 , 0.000000 @ s7 errorbar off @ s7 errorbar type both @ s7 errorbar length 1.000000 @ s7 errorbar linewidth 1 @ s7 errorbar linestyle 1 @ s7 errorbar riser linewidth 1 @ s7 errorbar riser linestyle 1 @ s7 comment "symslines.dat" @ s7 legend "Plus" @ s8 type xy @ s8 symbol 10 @ s8 symbol size 1.000000 @ s8 symbol color 9 @ s8 symbol pattern 1 @ s8 symbol fill color 9 @ s8 symbol fill pattern 0 @ s8 symbol linewidth 1 @ s8 symbol linestyle 1 @ s8 symbol char 0 @ s8 symbol char font 0 @ s8 symbol center false @ s8 symbol skip 0 @ s8 line type 1 @ s8 line linestyle 1 @ s8 line linewidth 1 @ s8 line color 9 @ s8 line pattern 1 @ s8 baseline type 0 @ s8 baseline off @ s8 dropline off @ s8 fill type 0 @ s8 fill color 0 @ s8 fill pattern 0 @ s8 avalue off @ s8 avalue type 2 @ s8 avalue char size 1.000000 @ s8 avalue font 0 @ s8 avalue color 1 @ s8 avalue rot 0 @ s8 avalue format general @ s8 avalue prec 3 @ s8 avalue prepend "" @ s8 avalue append "" @ s8 avalue offset 0.000000 , 0.000000 @ s8 errorbar off @ s8 errorbar type both @ s8 errorbar length 1.000000 @ s8 errorbar linewidth 1 @ s8 errorbar linestyle 1 @ s8 errorbar riser linewidth 1 @ s8 errorbar riser linestyle 1 @ s8 comment "symslines.dat" @ s8 legend "X" @ s9 type xy @ s9 symbol 11 @ s9 symbol size 1.000000 @ s9 symbol color 10 @ s9 symbol pattern 1 @ s9 symbol fill color 10 @ s9 symbol fill pattern 0 @ s9 symbol linewidth 1 @ s9 symbol linestyle 1 @ s9 symbol char 0 @ s9 symbol char font 0 @ s9 symbol center false @ s9 symbol skip 0 @ s9 line type 1 @ s9 line linestyle 1 @ s9 line linewidth 1 @ s9 line color 10 @ s9 line pattern 1 @ s9 baseline type 0 @ s9 baseline off @ s9 dropline off @ s9 fill type 0 @ s9 fill color 0 @ s9 fill pattern 0 @ s9 avalue off @ s9 avalue type 2 @ s9 avalue char size 1.000000 @ s9 avalue font 0 @ s9 avalue color 1 @ s9 avalue rot 0 @ s9 avalue format general @ s9 avalue prec 3 @ s9 avalue prepend "" @ s9 avalue append "" @ s9 avalue offset 0.000000 , 0.000000 @ s9 errorbar off @ s9 errorbar type both @ s9 errorbar length 1.000000 @ s9 errorbar linewidth 1 @ s9 errorbar linestyle 1 @ s9 errorbar riser linewidth 1 @ s9 errorbar riser linestyle 1 @ s9 comment "symslines.dat" @ s9 legend "Splat" @ s10 type xy @ s10 symbol 2 @ s10 symbol size 1.000000 @ s10 symbol color 11 @ s10 symbol pattern 1 @ s10 symbol fill color 11 @ s10 symbol fill pattern 1 @ s10 symbol linewidth 1 @ s10 symbol linestyle 1 @ s10 symbol char 0 @ s10 symbol char font 0 @ s10 symbol center false @ s10 symbol skip 0 @ s10 line type 1 @ s10 line linestyle 1 @ s10 line linewidth 1 @ s10 line color 11 @ s10 line pattern 1 @ s10 baseline type 0 @ s10 baseline off @ s10 dropline off @ s10 fill type 0 @ s10 fill color 0 @ s10 fill pattern 0 @ s10 avalue off @ s10 avalue type 2 @ s10 avalue char size 1.000000 @ s10 avalue font 0 @ s10 avalue color 1 @ s10 avalue rot 0 @ s10 avalue format general @ s10 avalue prec 3 @ s10 avalue prepend "" @ s10 avalue append "" @ s10 avalue offset 0.000000 , 0.000000 @ s10 errorbar off @ s10 errorbar type both @ s10 errorbar length 1.000000 @ s10 errorbar linewidth 1 @ s10 errorbar linestyle 1 @ s10 errorbar riser linewidth 1 @ s10 errorbar riser linestyle 1 @ s10 comment "symslines.dat" @ s10 legend "Filled Circle" @ s11 type xy @ s11 symbol 3 @ s11 symbol size 1.000000 @ s11 symbol color 12 @ s11 symbol pattern 1 @ s11 symbol fill color 12 @ s11 symbol fill pattern 1 @ s11 symbol linewidth 1 @ s11 symbol linestyle 1 @ s11 symbol char 0 @ s11 symbol char font 0 @ s11 symbol center false @ s11 symbol skip 0 @ s11 line type 1 @ s11 line linestyle 1 @ s11 line linewidth 1 @ s11 line color 12 @ s11 line pattern 1 @ s11 baseline type 0 @ s11 baseline off @ s11 dropline off @ s11 fill type 0 @ s11 fill color 0 @ s11 fill pattern 0 @ s11 avalue off @ s11 avalue type 2 @ s11 avalue char size 1.000000 @ s11 avalue font 0 @ s11 avalue color 1 @ s11 avalue rot 0 @ s11 avalue format general @ s11 avalue prec 3 @ s11 avalue prepend "" @ s11 avalue append "" @ s11 avalue offset 0.000000 , 0.000000 @ s11 errorbar off @ s11 errorbar type both @ s11 errorbar length 1.000000 @ s11 errorbar linewidth 1 @ s11 errorbar linestyle 1 @ s11 errorbar riser linewidth 1 @ s11 errorbar riser linestyle 1 @ s11 comment "symslines.dat" @ s11 legend "Filled Square" @ s12 type xy @ s12 symbol 4 @ s12 symbol size 1.000000 @ s12 symbol color 13 @ s12 symbol pattern 1 @ s12 symbol fill color 13 @ s12 symbol fill pattern 1 @ s12 symbol linewidth 1 @ s12 symbol linestyle 1 @ s12 symbol char 0 @ s12 symbol char font 0 @ s12 symbol center false @ s12 symbol skip 0 @ s12 line type 1 @ s12 line linestyle 1 @ s12 line linewidth 1 @ s12 line color 13 @ s12 line pattern 1 @ s12 baseline type 0 @ s12 baseline off @ s12 dropline off @ s12 fill type 0 @ s12 fill color 0 @ s12 fill pattern 0 @ s12 avalue off @ s12 avalue type 2 @ s12 avalue char size 1.000000 @ s12 avalue font 0 @ s12 avalue color 1 @ s12 avalue rot 0 @ s12 avalue format general @ s12 avalue prec 3 @ s12 avalue prepend "" @ s12 avalue append "" @ s12 avalue offset 0.000000 , 0.000000 @ s12 errorbar off @ s12 errorbar type both @ s12 errorbar length 1.000000 @ s12 errorbar linewidth 1 @ s12 errorbar linestyle 1 @ s12 errorbar riser linewidth 1 @ s12 errorbar riser linestyle 1 @ s12 comment "symslines.dat" @ s12 legend "Filled Diamond" @ s13 type xy @ s13 symbol 5 @ s13 symbol size 1.000000 @ s13 symbol color 14 @ s13 symbol pattern 1 @ s13 symbol fill color 14 @ s13 symbol fill pattern 1 @ s13 symbol linewidth 1 @ s13 symbol linestyle 1 @ s13 symbol char 0 @ s13 symbol char font 0 @ s13 symbol center false @ s13 symbol skip 0 @ s13 line type 1 @ s13 line linestyle 1 @ s13 line linewidth 1 @ s13 line color 14 @ s13 line pattern 1 @ s13 baseline type 0 @ s13 baseline off @ s13 dropline off @ s13 fill type 0 @ s13 fill color 0 @ s13 fill pattern 0 @ s13 avalue off @ s13 avalue type 2 @ s13 avalue char size 1.000000 @ s13 avalue font 0 @ s13 avalue color 1 @ s13 avalue rot 0 @ s13 avalue format general @ s13 avalue prec 3 @ s13 avalue prepend "" @ s13 avalue append "" @ s13 avalue offset 0.000000 , 0.000000 @ s13 errorbar off @ s13 errorbar type both @ s13 errorbar length 1.000000 @ s13 errorbar linewidth 1 @ s13 errorbar linestyle 1 @ s13 errorbar riser linewidth 1 @ s13 errorbar riser linestyle 1 @ s13 comment "symslines.dat" @ s13 legend "Filled Triangle up" @ s14 type xy @ s14 symbol 6 @ s14 symbol size 1.000000 @ s14 symbol color 15 @ s14 symbol pattern 1 @ s14 symbol fill color 15 @ s14 symbol fill pattern 1 @ s14 symbol linewidth 1 @ s14 symbol linestyle 1 @ s14 symbol char 0 @ s14 symbol char font 0 @ s14 symbol center false @ s14 symbol skip 0 @ s14 line type 1 @ s14 line linestyle 1 @ s14 line linewidth 1 @ s14 line color 15 @ s14 line pattern 1 @ s14 baseline type 0 @ s14 baseline off @ s14 dropline off @ s14 fill type 0 @ s14 fill color 0 @ s14 fill pattern 0 @ s14 avalue off @ s14 avalue type 2 @ s14 avalue char size 1.000000 @ s14 avalue font 0 @ s14 avalue color 1 @ s14 avalue rot 0 @ s14 avalue format general @ s14 avalue prec 3 @ s14 avalue prepend "" @ s14 avalue append "" @ s14 avalue offset 0.000000 , 0.000000 @ s14 errorbar off @ s14 errorbar type both @ s14 errorbar length 1.000000 @ s14 errorbar linewidth 1 @ s14 errorbar linestyle 1 @ s14 errorbar riser linewidth 1 @ s14 errorbar riser linestyle 1 @ s14 comment "symslines.dat" @ s14 legend "Filled Triangle left" @ s15 type xy @ s15 symbol 7 @ s15 symbol size 1.000000 @ s15 symbol color 1 @ s15 symbol pattern 1 @ s15 symbol fill color 1 @ s15 symbol fill pattern 1 @ s15 symbol linewidth 1 @ s15 symbol linestyle 1 @ s15 symbol char 0 @ s15 symbol char font 0 @ s15 symbol center false @ s15 symbol skip 0 @ s15 line type 1 @ s15 line linestyle 1 @ s15 line linewidth 1 @ s15 line color 1 @ s15 line pattern 1 @ s15 baseline type 0 @ s15 baseline off @ s15 dropline off @ s15 fill type 0 @ s15 fill color 0 @ s15 fill pattern 0 @ s15 avalue off @ s15 avalue type 2 @ s15 avalue char size 1.000000 @ s15 avalue font 0 @ s15 avalue color 1 @ s15 avalue rot 0 @ s15 avalue format general @ s15 avalue prec 3 @ s15 avalue prepend "" @ s15 avalue append "" @ s15 avalue offset 0.000000 , 0.000000 @ s15 errorbar off @ s15 errorbar type both @ s15 errorbar length 1.000000 @ s15 errorbar linewidth 1 @ s15 errorbar linestyle 1 @ s15 errorbar riser linewidth 1 @ s15 errorbar riser linestyle 1 @ s15 comment "symslines.dat" @ s15 legend "Filled Triangle down" @ s16 type xy @ s16 symbol 8 @ s16 symbol size 1.000000 @ s16 symbol color 2 @ s16 symbol pattern 1 @ s16 symbol fill color 2 @ s16 symbol fill pattern 1 @ s16 symbol linewidth 1 @ s16 symbol linestyle 1 @ s16 symbol char 0 @ s16 symbol char font 0 @ s16 symbol center false @ s16 symbol skip 0 @ s16 line type 1 @ s16 line linestyle 1 @ s16 line linewidth 1 @ s16 line color 2 @ s16 line pattern 1 @ s16 baseline type 0 @ s16 baseline off @ s16 dropline off @ s16 fill type 0 @ s16 fill color 0 @ s16 fill pattern 0 @ s16 avalue off @ s16 avalue type 2 @ s16 avalue char size 1.000000 @ s16 avalue font 0 @ s16 avalue color 1 @ s16 avalue rot 0 @ s16 avalue format general @ s16 avalue prec 3 @ s16 avalue prepend "" @ s16 avalue append "" @ s16 avalue offset 0.000000 , 0.000000 @ s16 errorbar off @ s16 errorbar type both @ s16 errorbar length 1.000000 @ s16 errorbar linewidth 1 @ s16 errorbar linestyle 1 @ s16 errorbar riser linewidth 1 @ s16 errorbar riser linestyle 1 @ s16 comment "symslines.dat" @ s16 legend "Filled Triangle right" @ s17 type xy @ s17 symbol 2 @ s17 symbol size 1.000000 @ s17 symbol color 3 @ s17 symbol pattern 1 @ s17 symbol fill color 0 @ s17 symbol fill pattern 1 @ s17 symbol linewidth 1 @ s17 symbol linestyle 1 @ s17 symbol char 0 @ s17 symbol char font 0 @ s17 symbol center false @ s17 symbol skip 0 @ s17 line type 1 @ s17 line linestyle 1 @ s17 line linewidth 1 @ s17 line color 3 @ s17 line pattern 1 @ s17 baseline type 0 @ s17 baseline off @ s17 dropline off @ s17 fill type 0 @ s17 fill color 0 @ s17 fill pattern 0 @ s17 avalue off @ s17 avalue type 2 @ s17 avalue char size 1.000000 @ s17 avalue font 0 @ s17 avalue color 1 @ s17 avalue rot 0 @ s17 avalue format general @ s17 avalue prec 3 @ s17 avalue prepend "" @ s17 avalue append "" @ s17 avalue offset 0.000000 , 0.000000 @ s17 errorbar off @ s17 errorbar type both @ s17 errorbar length 1.000000 @ s17 errorbar linewidth 1 @ s17 errorbar linestyle 1 @ s17 errorbar riser linewidth 1 @ s17 errorbar riser linestyle 1 @ s17 comment "symslines.dat" @ s17 legend "Opaque Circle" @ s18 type xy @ s18 symbol 3 @ s18 symbol size 1.000000 @ s18 symbol color 4 @ s18 symbol pattern 1 @ s18 symbol fill color 0 @ s18 symbol fill pattern 1 @ s18 symbol linewidth 1 @ s18 symbol linestyle 1 @ s18 symbol char 0 @ s18 symbol char font 0 @ s18 symbol center false @ s18 symbol skip 0 @ s18 line type 1 @ s18 line linestyle 1 @ s18 line linewidth 1 @ s18 line color 4 @ s18 line pattern 1 @ s18 baseline type 0 @ s18 baseline off @ s18 dropline off @ s18 fill type 0 @ s18 fill color 0 @ s18 fill pattern 0 @ s18 avalue off @ s18 avalue type 2 @ s18 avalue char size 1.000000 @ s18 avalue font 0 @ s18 avalue color 1 @ s18 avalue rot 0 @ s18 avalue format general @ s18 avalue prec 3 @ s18 avalue prepend "" @ s18 avalue append "" @ s18 avalue offset 0.000000 , 0.000000 @ s18 errorbar off @ s18 errorbar type both @ s18 errorbar length 1.000000 @ s18 errorbar linewidth 1 @ s18 errorbar linestyle 1 @ s18 errorbar riser linewidth 1 @ s18 errorbar riser linestyle 1 @ s18 comment "symslines.dat" @ s18 legend "Opaque Square" @g1 on @g1 hidden false @g1 type XY @g1 autoscale type auto @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 10 @ world ymin 0 @ world ymax 400 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.780451 @ view xmax 1.041103 @ view ymin 0.151858 @ view ymax 0.862682 @ title "Line styles" @ title font 4 @ title size 1.000000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis offset 0.000000 , 0.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel place on ticks @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick op both @ xaxis tick type auto @ yaxis tick on @ yaxis tick major 100 @ yaxis tick minor ticks 3 @ yaxis offset 0.000000 , 0.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel place on ticks @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick op both @ yaxis tick type auto @ altxaxis tick on @ altxaxis tick major 2 @ altxaxis tick minor ticks 1 @ altxaxis offset 0.000000 , 0.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label place auto @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel append "" @ altxaxis ticklabel prepend "" @ altxaxis ticklabel angle 0 @ altxaxis ticklabel place on ticks @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 1 @ altxaxis ticklabel color 1 @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major size 1.000000 @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick major grid off @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick minor grid off @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick op both @ altxaxis tick type auto @ altyaxis tick on @ altyaxis tick major 50 @ altyaxis tick minor ticks 1 @ altyaxis offset 0.000000 , 0.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label place auto @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel append "" @ altyaxis ticklabel prepend "" @ altyaxis ticklabel angle 0 @ altyaxis ticklabel place on ticks @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 1 @ altyaxis ticklabel color 1 @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major size 1.000000 @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick major grid off @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick minor grid off @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick op both @ altyaxis tick type auto @ legend on @ legend loctype view @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box off @ legend box fill off @ legend box linewidth 1 @ legend box linestyle 0 @ legend x1 0.800501 @ legend y1 0.825525 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 0 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill color 0 @ s0 fill pattern 0 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "symslines.dat" @ s0 legend "Solid" @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 1 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 0 @ s1 symbol char font 0 @ s1 symbol center false @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 2 @ s1 line linewidth 1 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill color 0 @ s1 fill pattern 0 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "symslines.dat" @ s1 legend "Dotted" @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 1 @ s2 symbol pattern 1 @ s2 symbol fill color 1 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1 @ s2 symbol linestyle 1 @ s2 symbol char 0 @ s2 symbol char font 0 @ s2 symbol center false @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 3 @ s2 line linewidth 1 @ s2 line color 1 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill color 0 @ s2 fill pattern 0 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar off @ s2 errorbar type both @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1 @ s2 errorbar riser linestyle 1 @ s2 comment "symslines.dat" @ s2 legend "Dashed" @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol color 1 @ s3 symbol pattern 1 @ s3 symbol fill color 1 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1 @ s3 symbol linestyle 1 @ s3 symbol char 0 @ s3 symbol char font 0 @ s3 symbol center false @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 4 @ s3 line linewidth 1 @ s3 line color 1 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill color 0 @ s3 fill pattern 0 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar off @ s3 errorbar type both @ s3 errorbar length 1.000000 @ s3 errorbar linewidth 1 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1 @ s3 errorbar riser linestyle 1 @ s3 comment "symslines.dat" @ s3 legend "Long dashed" @ s4 type xy @ s4 symbol 0 @ s4 symbol size 1.000000 @ s4 symbol color 1 @ s4 symbol pattern 1 @ s4 symbol fill color 1 @ s4 symbol fill pattern 0 @ s4 symbol linewidth 1 @ s4 symbol linestyle 1 @ s4 symbol char 0 @ s4 symbol char font 0 @ s4 symbol center false @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 5 @ s4 line linewidth 1 @ s4 line color 1 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill color 0 @ s4 fill pattern 0 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar off @ s4 errorbar type both @ s4 errorbar length 1.000000 @ s4 errorbar linewidth 1 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1 @ s4 errorbar riser linestyle 1 @ s4 comment "symslines.dat" @ s4 legend "Dot-dashed" @ s5 type xy @ s5 symbol 0 @ s5 symbol size 1.000000 @ s5 symbol color 1 @ s5 symbol pattern 1 @ s5 symbol fill color 1 @ s5 symbol fill pattern 0 @ s5 symbol linewidth 1 @ s5 symbol linestyle 1 @ s5 symbol char 0 @ s5 symbol char font 0 @ s5 symbol center false @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1 @ s5 line color 1 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill color 0 @ s5 fill pattern 0 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar off @ s5 errorbar type both @ s5 errorbar length 1.000000 @ s5 errorbar linewidth 1 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1 @ s5 errorbar riser linestyle 1 @ s5 comment "symslines.dat" @ s5 legend "Width 1" @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol color 1 @ s6 symbol pattern 1 @ s6 symbol fill color 1 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1 @ s6 symbol linestyle 1 @ s6 symbol char 0 @ s6 symbol char font 0 @ s6 symbol center false @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 2 @ s6 line color 1 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 0 @ s6 fill color 0 @ s6 fill pattern 0 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar off @ s6 errorbar type both @ s6 errorbar length 1.000000 @ s6 errorbar linewidth 1 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1 @ s6 errorbar riser linestyle 1 @ s6 comment "symslines.dat" @ s6 legend "Width 2" @ s7 type xy @ s7 symbol 0 @ s7 symbol size 1.000000 @ s7 symbol color 1 @ s7 symbol pattern 1 @ s7 symbol fill color 1 @ s7 symbol fill pattern 0 @ s7 symbol linewidth 1 @ s7 symbol linestyle 1 @ s7 symbol char 0 @ s7 symbol char font 0 @ s7 symbol center false @ s7 symbol skip 0 @ s7 line type 1 @ s7 line linestyle 1 @ s7 line linewidth 4 @ s7 line color 1 @ s7 line pattern 1 @ s7 baseline type 0 @ s7 baseline off @ s7 dropline off @ s7 fill type 0 @ s7 fill color 0 @ s7 fill pattern 0 @ s7 avalue off @ s7 avalue type 2 @ s7 avalue char size 1.000000 @ s7 avalue font 0 @ s7 avalue color 1 @ s7 avalue rot 0 @ s7 avalue format general @ s7 avalue prec 3 @ s7 avalue prepend "" @ s7 avalue append "" @ s7 avalue offset 0.000000 , 0.000000 @ s7 errorbar off @ s7 errorbar type both @ s7 errorbar length 1.000000 @ s7 errorbar linewidth 1 @ s7 errorbar linestyle 1 @ s7 errorbar riser linewidth 1 @ s7 errorbar riser linestyle 1 @ s7 comment "symslines.dat" @ s7 legend "Width 4" @ s8 type xy @ s8 symbol 0 @ s8 symbol size 1.000000 @ s8 symbol color 1 @ s8 symbol pattern 1 @ s8 symbol fill color 1 @ s8 symbol fill pattern 0 @ s8 symbol linewidth 1 @ s8 symbol linestyle 1 @ s8 symbol char 0 @ s8 symbol char font 0 @ s8 symbol center false @ s8 symbol skip 0 @ s8 line type 1 @ s8 line linestyle 1 @ s8 line linewidth 6 @ s8 line color 1 @ s8 line pattern 1 @ s8 baseline type 0 @ s8 baseline off @ s8 dropline off @ s8 fill type 0 @ s8 fill color 0 @ s8 fill pattern 0 @ s8 avalue off @ s8 avalue type 2 @ s8 avalue char size 1.000000 @ s8 avalue font 0 @ s8 avalue color 1 @ s8 avalue rot 0 @ s8 avalue format general @ s8 avalue prec 3 @ s8 avalue prepend "" @ s8 avalue append "" @ s8 avalue offset 0.000000 , 0.000000 @ s8 errorbar off @ s8 errorbar type both @ s8 errorbar length 1.000000 @ s8 errorbar linewidth 1 @ s8 errorbar linestyle 1 @ s8 errorbar riser linewidth 1 @ s8 errorbar riser linestyle 1 @ s8 comment "symslines.dat" @ s8 legend "Width 6" @WITH G0 @G0 ON @TARGET S0 @TYPE xy 1 3.61803 2 4.61803 3 5.38197 4 6.38197 5 8 6 10.382 7 13.382 8 16.618 9 19.618 & @TARGET S1 @TYPE xy 1 23.618 2 24.618 3 25.382 4 26.382 5 28 6 30.382 7 33.382 8 36.618 9 39.618 & @TARGET S2 @TYPE xy 1 43.618 2 44.618 3 45.382 4 46.382 5 48 6 50.382 7 53.382 8 56.618 9 59.618 & @TARGET S3 @TYPE xy 1 63.618 2 64.618 3 65.382 4 66.382 5 68 6 70.382 7 73.382 8 76.618 9 79.618 & @TARGET S4 @TYPE xy 1 83.618 2 84.618 3 85.382 4 86.382 5 88 6 90.382 7 93.382 8 96.618 9 99.618 & @TARGET S5 @TYPE xy 1 103.618 2 104.618 3 105.382 4 106.382 5 108 6 110.382 7 113.382 8 116.618 9 119.618 & @TARGET S6 @TYPE xy 1 123.618 2 124.618 3 125.382 4 126.382 5 128 6 130.382 7 133.382 8 136.618 9 139.618 & @TARGET S7 @TYPE xy 1 143.618 2 144.618 3 145.382 4 146.382 5 148 6 150.382 7 153.382 8 156.618 9 159.618 & @TARGET S8 @TYPE xy 1 163.618 2 164.618 3 165.382 4 166.382 5 168 6 170.382 7 173.382 8 176.618 9 179.618 & @TARGET S9 @TYPE xy 1 183.618 2 184.618 3 185.382 4 186.382 5 188 6 190.382 7 193.382 8 196.618 9 199.618 & @TARGET S10 @TYPE xy 1 203.618 2 204.618 3 205.382 4 206.382 5 208 6 210.382 7 213.382 8 216.618 9 219.618 & @TARGET S11 @TYPE xy 1 223.618 2 224.618 3 225.382 4 226.382 5 228 6 230.382 7 233.382 8 236.618 9 239.618 & @TARGET S12 @TYPE xy 1 243.618 2 244.618 3 245.382 4 246.382 5 248 6 250.382 7 253.382 8 256.618 9 259.618 & @TARGET S13 @TYPE xy 1 263.618 2 264.618 3 265.382 4 266.382 5 268 6 270.382 7 273.382 8 276.618 9 279.618 & @TARGET S14 @TYPE xy 1 283.618 2 284.618 3 285.382 4 286.382 5 288 6 290.382 7 293.382 8 296.618 9 299.618 & @TARGET S15 @TYPE xy 1 303.618 2 304.618 3 305.382 4 306.382 5 308 6 310.382 7 313.382 8 316.618 9 319.618 & @TARGET S16 @TYPE xy 1 323.618 2 324.618 3 325.382 4 326.382 5 328 6 330.382 7 333.382 8 336.618 9 339.618 & @TARGET S17 @TYPE xy 1 343.618 2 344.618 3 345.382 4 346.382 5 348 6 350.382 7 353.382 8 356.618 9 359.618 & @TARGET S18 @TYPE xy 1 363.618 2 364.618 3 365.382 4 366.382 5 368 6 370.382 7 373.382 8 376.618 9 379.618 & @WITH G1 @G1 ON @TARGET S0 @TYPE xy 1 3.61803 2 4.61803 3 5.38197 4 6.38197 5 8 6 10.382 7 13.382 8 16.618 9 19.618 & @TARGET S1 @TYPE xy 1 23.618 2 24.618 3 25.382 4 26.382 5 28 6 30.382 7 33.382 8 36.618 9 39.618 & @TARGET S2 @TYPE xy 1 43.618 2 44.618 3 45.382 4 46.382 5 48 6 50.382 7 53.382 8 56.618 9 59.618 & @TARGET S3 @TYPE xy 1 63.618 2 64.618 3 65.382 4 66.382 5 68 6 70.382 7 73.382 8 76.618 9 79.618 & @TARGET S4 @TYPE xy 1 83.618 2 84.618 3 85.382 4 86.382 5 88 6 90.382 7 93.382 8 96.618 9 99.618 & @TARGET S5 @TYPE xy 1 103.618 2 104.618 3 105.382 4 106.382 5 108 6 110.382 7 113.382 8 116.618 9 119.618 & @TARGET S6 @TYPE xy 1 123.618 2 124.618 3 125.382 4 126.382 5 128 6 130.382 7 133.382 8 136.618 9 139.618 & @TARGET S7 @TYPE xy 1 143.618 2 144.618 3 145.382 4 146.382 5 148 6 150.382 7 153.382 8 156.618 9 159.618 & @TARGET S8 @TYPE xy 1 163.618 2 164.618 3 165.382 4 166.382 5 168 6 170.382 7 173.382 8 176.618 9 179.618 & grace-5.1.23/examples/test1.par0000644000076500001440000002257306626627163016041 0ustar fnevgenyusers# xvgr parameter file # version 30000 with string string on string loctype view string 0.375000, 0.792857 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "Try a zoom, with the pointer on the drawing area, press Control-Z," with string string on string loctype view string 0.375000, 0.775714 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "or use the Zoom button. Press the left mouse button at one corner of" with string string on string loctype view string 0.375000, 0.758571 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "the area to zoom and move the pointer to the other corner of the" with string string on string loctype view string 0.375000, 0.741429 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "region to zoom and press the left mouse button again to register" with string string on string loctype view string 0.375000, 0.724286 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "the rectangle to use as the new plotting limits. Press the Autoscale" with string string on string loctype view string 0.375000, 0.707143 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 0.610000 string def "button (AS above) to restore the orginal graph scaling (or Control-A)." with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type XY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 282 world xmax 287 world ymin -.2 world ymax .2 view xmin 0.150000 view xmax 0.850000 view ymin 0.150000 view ymax 0.850000 title "This is a test plot" title font 4 title size 1.500000 title color 1 subtitle "This is a subtitle" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 1.000000 xaxis tick minor 0.500000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "This is the X-axis" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel angle 0 xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 0.100000 yaxis tick minor 0.050000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "This is the Y-axis" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 2 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel angle 0 yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis OFF altyaxis OFF zeroxaxis tick ON zeroxaxis tick major 1.000000 zeroxaxis tick minor 0.500000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel angle 0 zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op LEFT zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 0.100000 zeroyaxis tick minor 0.050000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 2 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel angle 0 zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/co2.par0000644000076500001440000005576006626627163015470 0ustar fnevgenyusers# xvgr parameter file # version 30000 with string string on string loctype view string 0.229323, 0.386107 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "MLO" with string string on string loctype view string 0.223058, 0.743134 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "BRW" with string string on string loctype view string 0.213033, 0.399031 string linewidth 1 string color 1 string rot 0 string font 4 string just 0 string char size 1.000000 string def "" with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type XY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 1973 world xmax 1986 world ymin 320 world ymax 359.999 view xmin 0.150000 view xmax 0.900000 view ymin 0.150000 view ymax 0.500000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 s0 type XY s0 symbol 0 s0 symbol size 1.000000 s0 skip 0 s0 linestyle 1 s0 linewidth 1 s0 color 1 s0 fill 0 s0 fill color 0 s0 errorbar type BOTH s0 errorbar length 1.000000 s0 errorbar linewidth 1 s0 errorbar linestyle 1 s0 errorbar riser ON s0 errorbar riser linewidth 1 s0 errorbar riser linestyle 1 s0 comment "mlo.dat" xaxis tick ON xaxis tick major 2.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 0 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel angle 0 xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 10.000000 yaxis tick minor 5.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "CO\s2\N ppm" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 0 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel angle 0 yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel angle 0 altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel angle 0 altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 5.000000 zeroxaxis tick minor 2.500000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel angle 0 zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 10.000000 zeroyaxis tick minor 5.000000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel angle 0 zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 legend string 0 "" frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g1 g1 ON g1 label OFF g1 hidden FALSE g1 type XY g1 autoscale type AUTO g1 fixedpoint OFF g1 fixedpoint xy 0.000000 , 0.000000 g1 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 1973 world xmax 1986 world ymin 320 world ymax 360 view xmin 0.150000 view xmax 0.900000 view ymin 0.500000 view ymax 0.850000 title "CO\s2\N concentrations from BRW and MLO" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 xaxis tick ON xaxis tick major 2.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 1.000000 xaxis label font 4 xaxis label color 1 xaxis label linewidth 1 xaxis ticklabel OFF xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format DECIMAL xaxis ticklabel layout horizontal xaxis ticklabel angle 0 xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 10.000000 yaxis tick minor 5.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "CO\s2\N ppm" yaxis label layout para yaxis label char size 1.000000 yaxis label font 4 yaxis label color 1 yaxis label linewidth 1 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 0 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel angle 0 yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis tick ON altxaxis tick major 0.500000 altxaxis tick minor 0.250000 altxaxis tick offsetx 0.000000 altxaxis tick offsety 0.000000 altxaxis tick alt OFF altxaxis tick min 0.000000 altxaxis tick max 1.000000 altxaxis label "" altxaxis label layout para altxaxis label char size 1.000000 altxaxis label font 4 altxaxis label color 1 altxaxis label linewidth 1 altxaxis ticklabel OFF altxaxis ticklabel type auto altxaxis ticklabel prec 1 altxaxis ticklabel format DECIMAL altxaxis ticklabel layout horizontal altxaxis ticklabel angle 0 altxaxis ticklabel skip 0 altxaxis ticklabel op BOTTOM altxaxis ticklabel sign NORMAL altxaxis ticklabel start type AUTO altxaxis ticklabel start 0.000000 altxaxis ticklabel stop type AUTO altxaxis ticklabel stop 0.000000 altxaxis ticklabel char size 1.000000 altxaxis ticklabel font 1 altxaxis ticklabel color 1 altxaxis ticklabel linewidth 1 altxaxis tick major OFF altxaxis tick minor ON altxaxis tick default 6 altxaxis tick IN altxaxis tick major color 1 altxaxis tick major linewidth 1 altxaxis tick major linestyle 1 altxaxis tick minor color 1 altxaxis tick minor linewidth 1 altxaxis tick minor linestyle 1 altxaxis tick log OFF altxaxis tick size 1.000000 altxaxis tick minor size 0.500000 altxaxis bar OFF altxaxis bar color 1 altxaxis bar linestyle 1 altxaxis bar linewidth 1 altxaxis tick major grid OFF altxaxis tick minor grid OFF altxaxis tick op BOTH altxaxis tick type auto altxaxis tick spec 0 altyaxis tick ON altyaxis tick major 0.500000 altyaxis tick minor 0.250000 altyaxis tick offsetx 0.000000 altyaxis tick offsety 0.000000 altyaxis tick alt OFF altyaxis tick min 0.000000 altyaxis tick max 1.000000 altyaxis label "" altyaxis label layout para altyaxis label char size 1.000000 altyaxis label font 4 altyaxis label color 1 altyaxis label linewidth 1 altyaxis ticklabel OFF altyaxis ticklabel type auto altyaxis ticklabel prec 1 altyaxis ticklabel format DECIMAL altyaxis ticklabel layout horizontal altyaxis ticklabel angle 0 altyaxis ticklabel skip 0 altyaxis ticklabel op LEFT altyaxis ticklabel sign NORMAL altyaxis ticklabel start type AUTO altyaxis ticklabel start 0.000000 altyaxis ticklabel stop type AUTO altyaxis ticklabel stop 0.000000 altyaxis ticklabel char size 1.000000 altyaxis ticklabel font 1 altyaxis ticklabel color 1 altyaxis ticklabel linewidth 1 altyaxis tick major OFF altyaxis tick minor ON altyaxis tick default 6 altyaxis tick IN altyaxis tick major color 1 altyaxis tick major linewidth 1 altyaxis tick major linestyle 1 altyaxis tick minor color 1 altyaxis tick minor linewidth 1 altyaxis tick minor linestyle 1 altyaxis tick log OFF altyaxis tick size 1.000000 altyaxis tick minor size 0.500000 altyaxis bar OFF altyaxis bar color 1 altyaxis bar linestyle 1 altyaxis bar linewidth 1 altyaxis tick major grid OFF altyaxis tick minor grid OFF altyaxis tick op BOTH altyaxis tick type auto altyaxis tick spec 0 zeroxaxis tick ON zeroxaxis tick major 5.000000 zeroxaxis tick minor 2.500000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 1.000000 zeroxaxis label font 4 zeroxaxis label color 1 zeroxaxis label linewidth 1 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel angle 0 zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op BOTTOM zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 10.000000 zeroyaxis tick minor 5.000000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 1.000000 zeroyaxis label font 4 zeroyaxis label color 1 zeroyaxis label linewidth 1 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel angle 0 zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/tlog.agr0000644000076500001440000004305206626627163015730 0ustar fnevgenyusers# Grace project file # @version 50000 @page size 600 600 @page scroll 5% @page inout 5% @link page off @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Jul 3 00:17:37 1998" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 10 @ world ymin 100 @ world ymax 10000000000 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.100000 @ view ymax 0.300000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Linear-log plot" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel place on ticks @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis tick on @ yaxis tick major 100 @ yaxis tick minor ticks 0 @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format power @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel place on ticks @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.176692 @ legend y1 0.23 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 3 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 0 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill color 0 @ s0 fill pattern 0 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tlog.demo" @ s0 legend "tlog.demo" @g1 on @g1 hidden false @g1 type XY @g1 autoscale type auto @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 1 @ world xmax 10 @ world ymin 100 @ world ymax 10000000000 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.390000 @ view ymax 0.590000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Log-log plot" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis tick on @ xaxis tick major 10 @ xaxis tick minor ticks 9 @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 0 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel place on ticks @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 0 @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format power @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel place on ticks @ yaxis ticklabel skip 1 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.184211 @ legend y1 0.5 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 1 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 0 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 0 @ s0 line linewidth 1 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill color 0 @ s0 fill pattern 0 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tlog.demo" @ s0 legend "tlog.demo" @g2 on @g2 hidden false @g2 type XY @g2 autoscale type auto @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format general general @g2 fixedpoint prec 6, 6 @with g2 @ world xmin 100 @ world xmax 10000000000 @ world ymin 0 @ world ymax 10 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.680000 @ view ymax 0.880000 @ title "Test of log plots" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "log-linear plot" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis tick on @ xaxis tick major 10 @ xaxis tick minor ticks 9 @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 2 @ xaxis tick major linestyle 1 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 2 @ xaxis tick minor grid on @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 0 @ xaxis ticklabel format power @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel place on ticks @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op left @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis tick on @ yaxis tick major 2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel place on ticks @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.169173 @ legend y1 0.82 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 2 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 2 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 0 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol center false @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 2 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill color 0 @ s0 fill pattern 0 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tlog.demo" @ s0 legend "tlog.demo" @WITH G0 @G0 ON @TARGET S0 @TYPE xy 1 100 2 1000 3 10000 4 100000 5 1e+06 6 1e+07 7 1e+08 8 1e+09 9 1e+10 & @WITH G1 @G1 ON @TARGET S0 @TYPE xy 1 100 2 1000 3 10000 4 100000 5 1e+06 6 1e+07 7 1e+08 8 1e+09 9 1e+10 & @WITH G2 @G2 ON @TARGET S0 @TYPE xy 100 1 1000 2 10000 3 100000 4 1e+06 5 1e+07 6 1e+08 7 1e+09 8 1e+10 9 & grace-5.1.23/examples/charts.agr0000644000076500001440000010034406626627163016245 0ustar fnevgenyusers# Grace project file # @version 50002 @page size 792 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 2 to "Times-Italic" , "Times-Italic" @map font 1 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 6 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 5 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 10 to "Courier-Bold" , "Courier-Bold" @map font 11 to "Courier-BoldOblique" , "Courier-BoldOblique" @map font 8 to "Symbol" , "Symbol" @map font 9 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Thu Nov 5 01:14:43 1998" @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Chart @g0 stacked false @g0 bar hgap 0.005000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 11 @ world ymin 0 @ world ymax 20 @ stack world 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.612059 @ view ymin 0.100000 @ view ymax 0.465000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Bar chart" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick off @ xaxis tick major 1 @ xaxis tick minor ticks 0 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 1 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.680000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op bottom @ xaxis ticklabel type spec @ xaxis tick type auto @ xaxis ticklabel 0, "" @ xaxis ticklabel 1, "Label 1" @ xaxis ticklabel 2, "Label 2" @ xaxis ticklabel 3, "Label 3" @ xaxis ticklabel 4, "Label 4" @ xaxis ticklabel 5, "Label 5" @ xaxis ticklabel 6, "Label 6" @ xaxis ticklabel 7, "Label 7" @ xaxis ticklabel 8, "Label 8" @ xaxis ticklabel 9, "Label 9" @ xaxis ticklabel 10, "Label 10" @ xaxis ticklabel 11, "" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Value" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op left @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.15 @ legend y1 0.4 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 1 @ frame linestyle 1 @ frame linewidth 3 @ frame color 1 @ frame pattern 1 @ frame background color 9 @ frame background pattern 0 @ s0 type bar @ s0 symbol 0 @ s0 symbol size 0.600000 @ s0 symbol color 7 @ s0 symbol pattern 1 @ s0 symbol fill color 2 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 2 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 3 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 2 @ s0 fill pattern 3 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "tbar3.dat" @ s0 legend "Data A" @ s1 type bar @ s1 symbol 0 @ s1 symbol size 0.600000 @ s1 symbol color 11 @ s1 symbol pattern 1 @ s1 symbol fill color 4 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 2 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 3 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 1 @ s1 fill rule 0 @ s1 fill color 4 @ s1 fill pattern 10 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 2 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "tbar3.dat" @ s1 legend "Data B" @g1 on @g1 hidden false @g1 type Chart @g1 stacked true @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 11 @ world ymin 0 @ world ymax 30 @ stack world 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.612059 @ view ymin 0.565000 @ view ymax 0.930000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Stacked bar chart" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick off @ xaxis tick major 1 @ xaxis tick minor ticks 0 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 1 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.680000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op bottom @ xaxis ticklabel type spec @ xaxis tick type auto @ xaxis ticklabel 0, "" @ xaxis ticklabel 1, "Label 1" @ xaxis ticklabel 2, "Label 2" @ xaxis ticklabel 3, "Label 3" @ xaxis ticklabel 4, "Label 4" @ xaxis ticklabel 5, "Label 5" @ xaxis ticklabel 6, "Label 6" @ xaxis ticklabel 7, "Label 7" @ xaxis ticklabel 8, "Label 8" @ xaxis ticklabel 9, "Label 9" @ xaxis ticklabel 10, "Label 10" @ xaxis ticklabel 11, "" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Value" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op left @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.15 @ legend y1 0.9 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 1 @ frame linestyle 1 @ frame linewidth 3 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type bar @ s0 symbol 0 @ s0 symbol size 1.200000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 4 @ s0 symbol fill pattern 24 @ s0 symbol linewidth 2 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 3 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 0 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 2 @ s0 avalue char size 0.750000 @ s0 avalue font 4 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.020000 , -0.010000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ s0 legend "Data A" @ s1 type bar @ s1 symbol 0 @ s1 symbol size 1.200000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 14 @ s1 symbol fill pattern 18 @ s1 symbol linewidth 2 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 3 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 0 @ s1 fill pattern 1 @ s1 avalue on @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 4 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.010000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "copy of set 1" @ s1 legend "Data B" @g2 on @g2 hidden false @g2 type Chart @g2 stacked false @g2 bar hgap 0.000000 @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format general general @g2 fixedpoint prec 6, 6 @with g2 @ world xmin 0 @ world xmax 11 @ world ymin 0 @ world ymax 20 @ stack world 0, 0, 0, 0 @ view xmin 0.712059 @ view xmax 1.224118 @ view ymin 0.100000 @ view ymax 0.465000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Scatter chart" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick off @ xaxis tick major 1 @ xaxis tick minor ticks 0 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 1 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.680000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op bottom @ xaxis ticklabel type spec @ xaxis tick type auto @ xaxis ticklabel 0, "" @ xaxis ticklabel 1, "Label 1" @ xaxis ticklabel 2, "Label 2" @ xaxis ticklabel 3, "Label 3" @ xaxis ticklabel 4, "Label 4" @ xaxis ticklabel 5, "Label 5" @ xaxis ticklabel 6, "Label 6" @ xaxis ticklabel 7, "Label 7" @ xaxis ticklabel 8, "Label 8" @ xaxis ticklabel 9, "Label 9" @ xaxis ticklabel 10, "Label 10" @ xaxis ticklabel 11, "" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Value" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op left @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.78 @ legend y1 0.4 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 1 @ frame linestyle 1 @ frame linewidth 3 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 type xy @ s0 symbol 6 @ s0 symbol size 0.750000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 4 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 2 @ s0 line color 5 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline on @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 2 @ s0 fill pattern 3 @ s0 avalue on @ s0 avalue type 2 @ s0 avalue char size 0.750000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.010000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ s0 legend "Data A" @ s1 type xy @ s1 symbol 4 @ s1 symbol size 0.750000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 7 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 2 @ s1 line color 3 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline on @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 4 @ s1 fill pattern 10 @ s1 avalue on @ s1 avalue type 2 @ s1 avalue char size 0.750000 @ s1 avalue font 2 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.010000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "copy of set 1" @ s1 legend "Data B" @g3 on @g3 hidden false @g3 type Chart @g3 stacked true @g3 bar hgap 0.000000 @g3 fixedpoint off @g3 fixedpoint type 0 @g3 fixedpoint xy 0.000000, 0.000000 @g3 fixedpoint format general general @g3 fixedpoint prec 6, 6 @with g3 @ world xmin 0 @ world xmax 11 @ world ymin 0 @ world ymax 30 @ stack world 0, 0, 0, 0 @ view xmin 0.712059 @ view xmax 1.224118 @ view ymin 0.565000 @ view ymax 0.930000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Stacked line chart" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick off @ xaxis tick major 1 @ xaxis tick minor ticks 0 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 1 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.680000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op bottom @ xaxis ticklabel type spec @ xaxis tick type auto @ xaxis ticklabel 0, "" @ xaxis ticklabel 1, "Label 1" @ xaxis ticklabel 2, "Label 2" @ xaxis ticklabel 3, "Label 3" @ xaxis ticklabel 4, "Label 4" @ xaxis ticklabel 5, "Label 5" @ xaxis ticklabel 6, "Label 6" @ xaxis ticklabel 7, "Label 7" @ xaxis ticklabel 8, "Label 8" @ xaxis ticklabel 9, "Label 9" @ xaxis ticklabel 10, "Label 10" @ xaxis ticklabel 11, "" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Value" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op left @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.77 @ legend y1 0.9 @ legend box on @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert true @ frame type 1 @ frame linestyle 1 @ frame linewidth 3 @ frame color 1 @ frame pattern 1 @ frame background color 7 @ frame background pattern 0 @ s0 type xy @ s0 symbol 2 @ s0 symbol size 0.850000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 10 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 2 @ s0 line color 4 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline on @ s0 fill type 2 @ s0 fill rule 0 @ s0 fill color 7 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 2 @ s0 avalue char size 0.750000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.007000 , 0.010000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ s0 legend "Data A" @ s1 type xy @ s1 symbol 1 @ s1 symbol size 0.850000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 2 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 2 @ s1 line color 15 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline on @ s1 fill type 2 @ s1 fill rule 0 @ s1 fill color 9 @ s1 fill pattern 1 @ s1 avalue on @ s1 avalue type 2 @ s1 avalue char size 0.900000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.015000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1 @ s1 errorbar riser linestyle 1 @ s1 comment "copy of set 1" @ s1 legend "Data B" @target G0.S0 @type bar 1 3 2 5 3 4 4 9 5 6 6 5 7 7 8 8 9 2 10 7 & @target G0.S1 @type bar 1 5 2 7 3 8 4 9 5 3 6 8 7 2 8 11 9 12 10 17 & @target G1.S0 @type bar 1 3 2 5 3 4 4 9 5 6 6 5 7 7 8 8 9 2 10 7 & @target G1.S1 @type bar 1 5 2 7 3 8 4 9 5 3 6 8 7 2 8 11 9 12 10 17 & @target G2.S0 @type xy 1 3 2 5 3 4 4 9 5 6 6 5 7 7 8 8 9 2 10 7 & @target G2.S1 @type xy 1 5 2 7 3 8 4 9 5 3 6 8 7 2 8 11 9 12 10 17 & @target G3.S0 @type xy 1 3 2 5 3 4 4 9 5 6 6 5 7 7 8 8 9 2 10 7 & @target G3.S1 @type xy 1 5 2 7 3 8 4 9 5 3 6 8 7 2 8 11 9 12 10 17 & grace-5.1.23/examples/tmc.c0000644000076500001440000000365310426216751015210 0ustar fnevgenyusers/* * test of -pipe option */ #include #include #include #ifndef M_PI # define M_PI 3.14 #endif int main(int argc, char **argv) { int i, j; double t; printf("@focus off\n"); /* turn of the focus markers (annoying) */ printf("@g0 on\n"); /* Activate graph 0 */ printf("@with g0\n"); /* reset the current graph to graph 0 */ printf("@view 0.1, 0.1, 0.9, 0.4\n"); /* set the viewport for this graph */ printf("@g1 on\n"); /* Activate graph 1 */ printf("@with g1\n"); /* reset the current graph to graph 1 */ printf("@view 0.1, 0.5, 0.9, 0.9\n"); /* set the viewport for graph 1 */ printf("@subtitle \"Spectrum\"\n"); /* set the subtitle */ for (j = 20; j > 0; j--) { printf("@with g0\n"); /* reset the current graph to graph 0 */ printf("@kill s0\n"); /* make sure s0 is available * (data will be read into this set) */ /* * write out a set */ for (i = 0; i < 101; i++) { t = 8.0 * i / (1.0 * j) * M_PI; printf("%d %f\n", i, cos(t) + sin(2.0 * t) + cos(t / 2.0) + sin(4 * t) + cos(t / 4.0)); } printf("&\n"); /* end of set marker */ printf("@subtitle \"Data %d\"\n", j); /* set the subtitle for graph 0 */ if (j == 20) { printf("@autoscale\n"); /* autoscale the first time through */ } printf("@dft(s0, 2)\n"); /* compute the spectrum of the first set */ printf("@move g0.s1 to g1.s0\n"); /* move the computed spectrum to graph 1 */ if (j == 20) { printf("@with g1\n"); /* set the focus on graph 1 */ printf("@autoscale\n"); /* autoscale graph 1 */ } printf("@redraw\n"); printf("@sleep 1\n"); /* let the graph sit for a sec */ } /* end for */ exit(0); } grace-5.1.23/examples/logistic.fit0000644000076500001440000000034106626627163016603 0ustar fnevgenyusers# ACE/gr fit description file # fit title "Logistic fit" fit formula "y = 1/(1+exp(-(x-a0)/a1))" fit with 2 parameters fit prec 0.01 a0 = 1 a0 constraints off a0min = 1 a0max = 1 a1 = 1 a1 constraints off a1min = 1 a1max = 1 grace-5.1.23/examples/log2.agr0000644000076500001440000004146106661671073015626 0ustar fnevgenyusers# Grace project file # @version 50002 @page size 792 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Mon Feb 15 02:50:14 1999" @with box @ box on @ box loctype view @ box 0.2, 0.19, 0.94, 0.35 @ box linestyle 1 @ box linewidth 2.0 @ box color 1 @ box fill color 7 @ box fill pattern 1 @box def @with string @ string on @ string loctype view @ string 1.12581699346, 0.313725490196 @ string color 10 @ string rot 90 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "An example of log\s2\N axis scale" @with string @ string on @ string loctype view @ string 0.24, 0.28 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "-------Sequential Output-------- ---Sequential Input-- --Random--" @with string @ string on @ string loctype view @ string 0.24, 0.26 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "-Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---" @with string @ string on @ string loctype view @ string 0.24, 0.22 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "12881 94.5 15140 17.8 5414 13.6 7249 84.6 13858 14.0 96.7 1.5 " @with string @ string on @ string loctype view @ string 0.24, 0.24 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU " @with string @ string on @ string loctype view @ string 0.57, 0.325163398693 @ string color 1 @ string rot 0 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "\uSingle disk benchmark\U" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 4 @ world xmax 513 @ world ymin 0 @ world ymax 3 @ stack world 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 1.000000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "RAID-0 performance (3 disks)" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "file size: 800MB; ext2fs flags:-b 4096" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "Chunk size" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 7 @ xaxis tick major linewidth 0.5 @ xaxis tick major linestyle 1 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "k" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "(RAID-0/Single disk) ratio" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 0 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 7 @ yaxis tick major linewidth 0.5 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 1.05 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 1 @ legend box fill pattern 0 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 6 @ s0 symbol size 0.800000 @ s0 symbol color 2 @ s0 symbol pattern 1 @ s0 symbol fill color 7 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 2 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 comment "2-pt. avg. on set 0 " @ s0 legend "Char write" @ s1 hidden false @ s1 type xy @ s1 symbol 4 @ s1 symbol size 0.800000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 7 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 comment "2-pt. avg. on set 3 " @ s1 legend "Char read" @ s2 hidden false @ s2 type xy @ s2 symbol 6 @ s2 symbol size 0.800000 @ s2 symbol color 4 @ s2 symbol pattern 1 @ s2 symbol fill color 9 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 4 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar off @ s2 errorbar type both @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 comment "2-pt. avg. on set 1 " @ s2 legend "Block write" @ s3 hidden false @ s3 type xy @ s3 symbol 4 @ s3 symbol size 0.800000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 9 @ s3 symbol fill pattern 1 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 4 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 1 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar off @ s3 errorbar type both @ s3 errorbar length 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 comment "2-pt. avg. on set 4 " @ s3 legend "Block read" @ s4 hidden false @ s4 type xy @ s4 symbol 3 @ s4 symbol size 0.800000 @ s4 symbol color 15 @ s4 symbol pattern 1 @ s4 symbol fill color 3 @ s4 symbol fill pattern 1 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 0 @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 15 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill rule 0 @ s4 fill color 1 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar off @ s4 errorbar type both @ s4 errorbar length 1.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 comment "2-pt. avg. on set 2 " @ s4 legend "Rewrite" @ s5 hidden false @ s5 type xy @ s5 symbol 7 @ s5 symbol size 0.800000 @ s5 symbol color 6 @ s5 symbol pattern 1 @ s5 symbol fill color 5 @ s5 symbol fill pattern 1 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 0 @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 6 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill rule 0 @ s5 fill color 1 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar off @ s5 errorbar type both @ s5 errorbar length 1.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 comment "2-pt. avg. on set 5 " @ s5 legend "Rand seeks" @target G0.S0 @type xy 4 1.04704 8 1.00585 16 1.04228 32 1.04466 64 1.03112 128 1.04594 256 1.03849 512 1.0429 & @target G0.S1 @type xy 4 1.12225 8 1.09444 16 1.09471 32 1.09134 64 1.09361 128 1.10139 256 1.06477 512 1.07936 & @target G0.S2 @type xy 4 2.32724 8 2.29688 16 2.33336 32 2.22777 64 2.42205 128 2.35876 256 2.33342 512 2.3812 & @target G0.S3 @type xy 4 2.01165 8 2.1407 16 2.14128 32 2.25308 64 2.23184 128 1.97938 256 1.55724 512 1.1343 & @target G0.S4 @type xy 4 2.26802 8 2.36995 16 2.32018 32 2.33687 64 2.22682 128 2.11816 256 1.853 512 1.64406 & @target G0.S5 @type xy 4 1.67322 8 2.05739 16 2.21044 32 2.33454 64 2.37694 128 2.46381 256 2.55377 512 2.38987 & grace-5.1.23/examples/Makefile0000644000076500001440000000241110565430266015713 0ustar fnevgenyusers##################################################### # Makefile for examples of Grace # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf DOTEST = dotest$(BAT) EXAMPLES = altaxis.par logtest.par times.agr \ au.agr manygraphs.agr terr.agr tinset.agr \ axes.agr mlo.dat tlog.agr log2.agr log2log.agr logit.agr reciprocal.agr \ bar.agr explain.agr test.com tmc.c \ fills.agr props.agr test.dat \ chartebar.agr charts.agr graphs.par regions.par test1.par tstack.agr \ brw.dat hilo.agr test2.agr arrows.agr txyr.agr \ co2.agr log.dat stackedb.agr tfonts.agr typeset.agr xyz.agr \ co2.par logistic.agr logistic.fit symslines.agr tforms.par polar.agr \ motif.agr spectrum.agr pie.agr txttrans.agr boxplot.agr vmap.agr \ xysize.agr xycolor.agr all : dummy clean : dummy distclean : dummy devclean : dummy install : $(EXAMPLES) $(DOTEST) $(MKINSTALLDIRS) $(DESTDIR)$(GRACE_HOME)/examples for i in $(EXAMPLES); do $(INSTALL_DATA) $$i $(DESTDIR)$(GRACE_HOME)/examples; done $(INSTALL_PROGRAM) $(DOTEST) $(DESTDIR)$(GRACE_HOME)/examples/$(DOTEST) links : dummy tests : $(EXAMPLES) $(DOTEST) ./$(DOTEST) dummy : grace-5.1.23/examples/xysize.agr0000644000076500001440000002103407064776014016307 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sat Mar 18 23:53:12 2000" @with string @ string on @ string loctype view @ string 0.45, 0.75 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "\m{0}The normalization of the symbol sizes\M{0}\v{-1}is defined in \"Plot/Graph app/Special\"" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 10 @ world ymin 0 @ world ymax 100 @ stack world 0, 0, 0, 0 @ znorm 50 @ view xmin 0.150000 @ view xmax 1.150000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "XYSize set presentation example" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format decimal @ xaxis ticklabel prec 1 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 20 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format decimal @ yaxis ticklabel prec 1 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 1.03529412 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 0 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xysize @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 9 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 3.0 @ s0 line color 15 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline on @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 14 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 2.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "xyr.dat" @ s0 legend "" @target G0.S0 @type xysize 1 50 50 2 55 55 3 50 50 4 26 26 5 41 41 6 36 36 7 49 49 8 64 64 9 81 81 & grace-5.1.23/examples/vmap.agr0000644000076500001440000003546307064766102015727 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sat Mar 18 22:44:16 2000" @with string @ string on @ string loctype view @ string 0.68, 0.75 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "\m{0}The normalization of the vector field\M{0}\v{-1}is defined in \"Plot/Graph app/Special\"" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin -0.2 @ world xmax 1.2 @ world ymin -1.2 @ world ymax 1.2 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.150000 @ view xmax 1.150000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "An example of vector map" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xyvmap @ s0 symbol 1 @ s0 symbol size 0.350000 @ s0 symbol color 8 @ s0 symbol pattern 1 @ s0 symbol fill color 9 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 0 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 10 @ s0 errorbar pattern 1 @ s0 errorbar size 0.440000 @ s0 errorbar linewidth 2.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "v.agr" @ s0 legend "" @target G0.S0 @type xyvmap 0 0 0 0 0.01 0.06342392 0.001010101 1.0203041e-05 0.02 0.12659245 0.002020202 4.0812162e-05 0.03 0.18925124 0.003030303 9.1827365e-05 0.04 0.25114799 0.004040404 0.00016324865 0.05 0.31203345 0.0050505051 0.00025507601 0.06 0.37166246 0.0060606061 0.00036730946 0.07 0.42979491 0.0070707071 0.00049994898 0.08 0.48619674 0.0080808081 0.00065299459 0.09 0.54064082 0.0090909091 0.00082644628 0.1 0.59290793 0.01010101 0.0010203041 0.11 0.64278761 0.011111111 0.0012345679 0.12 0.69007901 0.012121212 0.0014692378 0.13 0.73459171 0.013131313 0.0017243138 0.14 0.77614646 0.014141414 0.0019997959 0.15 0.81457595 0.015151515 0.0022956841 0.16 0.84972543 0.016161616 0.0026119784 0.17 0.88145336 0.017171717 0.0029486787 0.18 0.909632 0.018181818 0.0033057851 0.19 0.93414786 0.019191919 0.0036832976 0.2 0.95490224 0.02020202 0.0040812162 0.21 0.97181157 0.021212121 0.0044995409 0.22 0.98480775 0.022222222 0.0049382716 0.23 0.99383846 0.023232323 0.0053974084 0.24 0.99886734 0.024242424 0.0058769513 0.25 0.99987413 0.025252525 0.0063769003 0.26 0.99685478 0.026262626 0.0068972554 0.27 0.98982144 0.027272727 0.0074380165 0.28 0.97880245 0.028282828 0.0079991838 0.29 0.96384216 0.029292929 0.0085807571 0.3 0.94500082 0.03030303 0.0091827365 0.31 0.92235429 0.031313131 0.0098051219 0.32 0.89599377 0.032323232 0.010447913 0.33 0.8660254 0.033333333 0.011111111 0.34 0.83256985 0.034343434 0.011794715 0.35 0.79576184 0.035353535 0.012498725 0.36 0.75574957 0.036363636 0.01322314 0.37 0.71269417 0.037373737 0.013967962 0.38 0.666769 0.038383838 0.01473319 0.39 0.61815899 0.039393939 0.015518825 0.4 0.56705986 0.04040404 0.016324865 0.41 0.51367739 0.041414141 0.017151311 0.42 0.45822652 0.042424242 0.017998163 0.43 0.40093054 0.043434343 0.018865422 0.44 0.34202014 0.044444444 0.019753086 0.45 0.28173256 0.045454545 0.020661157 0.46 0.22031053 0.046464646 0.021589634 0.47 0.1580014 0.047474747 0.022538516 0.48 0.095056043 0.048484848 0.023507805 0.49 0.031727933 0.049494949 0.0244975 0.5 -0.031727933 0.050505051 0.025507601 0.51 -0.095056043 0.051515152 0.026538108 0.52 -0.1580014 0.052525253 0.027589022 0.53 -0.22031053 0.053535354 0.028660341 0.54 -0.28173256 0.054545455 0.029752066 0.55 -0.34202014 0.055555556 0.030864198 0.56 -0.40093054 0.056565657 0.031996735 0.57 -0.45822652 0.057575758 0.033149679 0.58 -0.51367739 0.058585859 0.034323028 0.59 -0.56705986 0.05959596 0.035516784 0.6 -0.61815899 0.060606061 0.036730946 0.61 -0.666769 0.061616162 0.037965514 0.62 -0.71269417 0.062626263 0.039220488 0.63 -0.75574957 0.063636364 0.040495868 0.64 -0.79576184 0.064646465 0.041791654 0.65 -0.83256985 0.065656566 0.043107846 0.66 -0.8660254 0.066666667 0.044444444 0.67 -0.89599377 0.067676768 0.045801449 0.68 -0.92235429 0.068686869 0.047178859 0.69 -0.94500082 0.06969697 0.048576676 0.7 -0.96384216 0.070707071 0.049994898 0.71 -0.97880245 0.071717172 0.051433527 0.72 -0.98982144 0.072727273 0.052892562 0.73 -0.99685478 0.073737374 0.054372003 0.74 -0.99987413 0.074747475 0.05587185 0.75 -0.99886734 0.075757576 0.057392103 0.76 -0.99383846 0.076767677 0.058932762 0.77 -0.98480775 0.077777778 0.060493827 0.78 -0.97181157 0.078787879 0.062075298 0.79 -0.95490224 0.07979798 0.063677176 0.8 -0.93414786 0.080808081 0.065299459 0.81 -0.909632 0.081818182 0.066942149 0.82 -0.88145336 0.082828283 0.068605244 0.83 -0.84972543 0.083838384 0.070288746 0.84 -0.81457595 0.084848485 0.071992654 0.85 -0.77614646 0.085858586 0.073716968 0.86 -0.73459171 0.086868687 0.075461688 0.87 -0.69007901 0.087878788 0.077226814 0.88 -0.64278761 0.088888889 0.079012346 0.89 -0.59290793 0.08989899 0.080818284 0.9 -0.54064082 0.090909091 0.082644628 0.91 -0.48619674 0.091919192 0.084491378 0.92 -0.42979491 0.092929293 0.086358535 0.93 -0.37166246 0.093939394 0.088246097 0.94 -0.31203345 0.094949495 0.090154066 0.95 -0.25114799 0.095959596 0.092082441 0.96 -0.18925124 0.096969697 0.094031221 0.97 -0.12659245 0.097979798 0.096000408 0.98 -0.06342392 0.098989899 0.097990001 0.99 -2.4492127e-16 0.1 0.1 & grace-5.1.23/examples/xyz.agr0000644000076500001440000002626306722626711015615 0ustar fnevgenyusers# Grace project file # @version 50003 @page size 792 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 4 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 4 @timestamp char size 0.450000 @timestamp def "Wed May 26 01:54:29 1999" @with string @ string on @ string loctype view @ string 0.179591836735, 0.113085621971 @ string color 1 @ string rot 0 @ string font 5 @ string just 1 @ string char size 1.000000 @ string def "C\sorg" @with string @ string on @ string loctype view @ string 0.672589035614, 0.87802907916 @ string color 1 @ string rot 0 @ string font 5 @ string just 2 @ string char size 1.000000 @ string def "Fe\sPyrit" @with string @ string on @ string loctype view @ string 1.15678271308, 0.124394184168 @ string color 1 @ string rot 0 @ string font 5 @ string just 1 @ string char size 1.000000 @ string def "S\s2" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 100 @ world ymin 0 @ world ymax 86.6 @ stack world 0, 0, 0, 0 @ view xmin 0.194118 @ view xmax 1.100000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "A test of the \f{Helvetica}XYZ\f{} set presentation" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis off @ yaxis off @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 1.03529412 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 0 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 4 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 0 @ s0 symbol char font 4 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 14 @ s0 fill pattern 6 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 4 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 2.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "/tmp/xmgra00692" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 0.990000 @ s1 symbol color 1 @ s1 symbol pattern 1 @ s1 symbol fill color 1 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 0 @ s1 symbol char font 4 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 0.5 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 4 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 2.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "/home/jake/DISS/Messungen/BGR/FID/Work/Ternary_Grid.txt" @ s1 legend "" @ s2 hidden false @ s2 type xy @ s2 symbol 0 @ s2 symbol size 0.990000 @ s2 symbol color 1 @ s2 symbol pattern 1 @ s2 symbol fill color 1 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 0 @ s2 symbol char font 4 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 2.0 @ s2 line color 1 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 4 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 1 @ s2 errorbar pattern 1 @ s2 errorbar size 2.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "/tmp/xmgra00442" @ s2 legend "" @ s3 hidden false @ s3 type xyz @ s3 symbol 2 @ s3 symbol size 0.560000 @ s3 symbol color 1 @ s3 symbol pattern 1 @ s3 symbol fill color 2 @ s3 symbol fill pattern 1 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 0 @ s3 symbol char font 4 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 0 @ s3 line linewidth 1.0 @ s3 line color 1 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 1 @ s3 fill pattern 1 @ s3 avalue on @ s3 avalue type 5 @ s3 avalue char size 0.500000 @ s3 avalue font 4 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.022000 , -0.002000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 1 @ s3 errorbar pattern 1 @ s3 errorbar size 2.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "/home/jake/DISS/Messungen/BGR/FID/Work/02/02_S_Fe_Pyrit_Corg_Tiefe_3Kplot.txt" @ s3 legend "" @target G0.S0 @type xy 0 0 76.7 40.36 100 0 0 0 & @target G0.S1 @type xy 25 0 62.5 64.95 37.5 64.95 75 0 87.5 21.65 12.5 21.65 25 0 50 0 75 43.3 25 43.3 50 0 & @target G0.S2 @type xy 0 0 100 0 50 86.6 0 0 & @target G0.S3 @type xyz 42.73 46.68 12.5 42.42 57.31 104 44.4 48.66 180 21.27 28.74 196.5 35.34 24.11 204 41.12 29.15 305 49.63923 29.553968 313.5 41.883094 31.777591 316.5 55.771989 30.564706 322 53.787861 28.543231 325.5 37.37 21.84 338 57.87 27.76 342 34.64 17.18 350.5 37.49 40.94 360.5 50.16 26.92 370 60.68 30.78 377 68.38 35.24 378.5 73 35.25 380.5 65.45 32.49 383 63.888875 34.607656 391 32.08 27.18 392.5 46.572851 50.981606 395.5 24.05 25.12 462 32.503581 31.575444 480.5 29.73 29.45 502.5 48.88 31.91 554 53.787861 32.586181 564 & grace-5.1.23/examples/bar.agr0000644000076500001440000003210106672055100015503 0ustar fnevgenyusers# Grace project file # @version 50002 @page size 700 595 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Mar 12 01:57:23 1999" @with box @ box on @ box loctype view @ box 0.193464052288, 0.0216993464052, 0.933464052288, 0.181699346405 @ box linestyle 1 @ box linewidth 2.0 @ box color 1 @ box fill color 7 @ box fill pattern 1 @box def @with string @ string on @ string loctype view @ string 1.05, 0.43 @ string color 10 @ string rot 90 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "A bar chart. Notice the usage of custom tick labels on the X axis." @with string @ string on @ string loctype view @ string 0.235, 0.11 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "-------Sequential Output-------- ---Sequential Input-- --Random--" @with string @ string on @ string loctype view @ string 0.235, 0.07 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "-Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---" @with string @ string on @ string loctype view @ string 0.235, 0.05 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "12881 94.5 15140 17.8 5414 13.6 7249 84.6 13858 14.0 96.7 1.5 " @with string @ string on @ string loctype view @ string 0.235, 0.09 @ string color 1 @ string rot 0 @ string font 10 @ string just 0 @ string char size 0.600000 @ string def "K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU /sec %CPU " @with string @ string on @ string loctype view @ string 0.573267973856, 0.150326797386 @ string color 1 @ string rot 0 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "\uSingle disk benchmark\U" @with string @ string on @ string loctype view @ string 1.1, 0.26 @ string color 10 @ string rot 90 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "(See Plot/Axis properties/Special)" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Chart @g0 stacked false @g0 bar hgap 0.010000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0.5 @ world xmax 6.5 @ world ymin 0 @ world ymax 3 @ stack world 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 1.000000 @ view ymin 0.240000 @ view ymax 0.850000 @ title "Software RAID performance (3 disks)" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "file size: 800MB; ext2fs block size: 4k" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick off @ xaxis tick major 2 @ xaxis tick minor ticks 0 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 7 @ xaxis tick major linewidth 0.5 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 0.800000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type spec @ xaxis tick type spec @ xaxis tick spec 6 @ xaxis tick major 0, 1 @ xaxis ticklabel 0, "Char read" @ xaxis tick major 1, 2 @ xaxis ticklabel 1, "Char write" @ xaxis tick major 2, 3 @ xaxis ticklabel 2, "Block read" @ xaxis tick major 3, 4 @ xaxis ticklabel 3, "Block write" @ xaxis tick major 4, 5 @ xaxis ticklabel 4, "Rewrite" @ xaxis tick major 5, 6 @ xaxis ticklabel 5, "Rand seeks" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "RAID/Single disk ratio" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label op left @ yaxis tick off @ yaxis tick major 0.5 @ yaxis tick minor ticks 0 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 7 @ yaxis tick major linewidth 0.5 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 3.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.212278245 @ legend y1 0.782679738 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 2.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type bar @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 2 @ s0 symbol pattern 1 @ s0 symbol fill color 7 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 3.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 comment "Cols 0 1" @ s0 legend "RAID-0" @ s1 hidden false @ s1 type bar @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 15 @ s1 symbol pattern 1 @ s1 symbol fill color 3 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 3.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar off @ s1 errorbar type both @ s1 errorbar length 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 comment "Cols 0 2" @ s1 legend "RAID-1" @ s2 hidden false @ s2 type bar @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 11 @ s2 symbol pattern 1 @ s2 symbol fill color 4 @ s2 symbol fill pattern 1 @ s2 symbol linewidth 3.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 0 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 3 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar off @ s2 errorbar type both @ s2 errorbar length 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 comment "Cols 0 3" @ s2 legend "RAID-5" @target G0.S0 @type bar 1 1.04466 2 1.09134 3 2.22777 4 2.25308 5 2.33687 6 2.33454 & @target G0.S1 @type bar 1 0.8161 2 0.9495 3 0.8341 4 0.9693 5 0.9631 6 1.969 & @target G0.S2 @type bar 1 0.82 2 1.0975 3 1.2185 4 1.632 5 1.4994 6 2.0579 & grace-5.1.23/examples/dotest0000755000076500001440000000641610565430266015514 0ustar fnevgenyusers#!/bin/sh # demos for Grace # export GRACE_HOME # define the location # if test -x ../src/xmgrace then GRACE=../src/xmgrace GRACE_HOME=`pwd`/.. else if test -x ../bin/xmgrace then GRACE=../bin/xmgrace GRACE_HOME=`pwd`/.. else GRACE=xmgrace fi fi # don't ask stupid questions :) # GRACE="$GRACE -noask" # # explain the row of single character buttons and a few other things $GRACE explain.agr # # display the various axes available $GRACE axes.agr # # display the symbols and line styles $GRACE symslines.agr # # display various fill styles $GRACE fills.agr # # some graph stuff and ticks $GRACE -p graphs.par # # some graph stuff and ticks $GRACE props.agr # # demonstration of many graphs $GRACE manygraphs.agr # # some graph stuff and ticks $GRACE brw.dat -p regions.par # # test of a graph inset $GRACE tinset.agr # # some time and date formats $GRACE times.agr # # some more tick label formats $GRACE -p tforms.par # # Australia map $GRACE au.agr # # log plots $GRACE -autoscale none -p logtest.par log.dat -graph 1 log.dat # # more log plots $GRACE tlog.agr # # a log2 example $GRACE log2.agr # # a log2/log example with engineering and computing tick labels $GRACE log2log.agr # # a logit scale sample $GRACE logit.agr # # a reciprocal scale sample $GRACE reciprocal.agr # # display fonts and font mappings $GRACE tfonts.agr # # text transforms $GRACE txttrans.agr # # advaned typesetting $GRACE typeset.agr # # example of world stack $GRACE tstack.agr # # a graph with a parameter file $GRACE -p test1.par -autoscale xy test.dat # # a graph with a parameter file in reverse video $GRACE -rvideo -p test1.par -autoscale xy test.dat # $GRACE test2.agr # # explanation of arrow shape parameters $GRACE arrows.agr # # multiple graphs with a parameter file $GRACE mlo.dat -graph 1 brw.dat -p co2.par # # multiple graphs created with arrange feature $GRACE co2.agr # # a nice sample $GRACE spectrum.agr # # a graph with alternate axes $GRACE -p altaxis.par test.dat -autoscale xy # # a graph with error bars $GRACE terr.agr # # a fixed graph with XY RADIUS format $GRACE txyr.agr # # string annotations $GRACE motif.agr # # a graph with an XYZ set $GRACE xyz.agr # # a graph with HILO data $GRACE hilo.agr # # a graph with BOXPLOT data $GRACE boxplot.agr # # polar plots $GRACE polar.agr # # bar charts # # a bar graph demonstrating specified ticks and tick labels $GRACE bar.agr # # a stacked bar chart $GRACE stackedb.agr # # a bar chart with error bars $GRACE chartebar.agr # # display all types of XY charts $GRACE charts.agr # # pie charts $GRACE pie.agr # # vector map $GRACE vmap.agr # # a bubble plot $GRACE xysize.agr # # an xycolor map $GRACE xycolor.agr # # non-linear curve fitting $GRACE logistic.agr # # some interesting stuff $GRACE -b test.com # # need a program # modified from previous versions, a thank you goes to Bruce Barnett # this modification allows others without write permission # to run the demos. # echo "" if test ! -f tmc then echo "" echo "Compiling a short program to test the -pipe option" echo "Executing 'cc tmc.c -o tmc -lm'" cc tmc.c -o tmc -lm echo "Done compilation" echo "" fi # # a graph with the -pipe option echo "Testing -pipe option, executing './tmc | $GRACE -pipe' " ./tmc | $GRACE -pipe rm -f tmc.o tmc grace-5.1.23/examples/xycolor.agr0000644000076500001440000003626507350734372016466 0ustar fnevgenyusers# Grace project file # @version 50103 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (0, 0, 255), "blue" @map color 3 to (103, 7, 72), "maroon" @map color 4 to (148, 0, 211), "violet" @map color 5 to (255, 0, 0), "red" @map color 6 to (255, 0, 255), "magenta" @map color 7 to (0, 255, 0), "green" @map color 8 to (64, 224, 208), "turquoise" @map color 9 to (255, 165, 0), "orange" @map color 10 to (0, 255, 255), "cyan" @map color 11 to (255, 255, 255), "white" @map color 12 to (220, 220, 220), "grey" @map color 13 to (255, 255, 0), "yellow" @map color 14 to (114, 33, 188), "indigo" @map color 15 to (0, 139, 0), "green4" @map color 16 to (188, 143, 143), "brown" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.15, 0.005 @timestamp color 1 @timestamp rot 0 @timestamp font 4 @timestamp char size 0.850000 @timestamp def "Thu Sep 13 14:29:01 2001" @with box @ box on @ box loctype view @ box 0.9, 0.82, 0.92, 0.8 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 1 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.76, 0.92, 0.74 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 2 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.7, 0.92, 0.68 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 3 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.64, 0.92, 0.62 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 4 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.58, 0.92, 0.56 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 5 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.52, 0.92, 0.5 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 6 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.46, 0.92, 0.44 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 7 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.4, 0.92, 0.38 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 8 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.34, 0.92, 0.32 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 9 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.28, 0.92, 0.26 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 10 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.9, 0.22, 0.92, 0.2 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 11 @ box fill pattern 1 @box def @with string @ string on @ string loctype view @ string 0.96, 0.81 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "0V \f{Symbol}£\f{Times-Roman} V\sBD\N < 1V" @with string @ string on @ string loctype view @ string 0.96, 0.75 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "1V \f{Symbol}£\f{Times-Roman} V\sBD\N < 2V" @with string @ string on @ string loctype view @ string 0.96, 0.69 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "2V \f{Symbol}£\f{Times-Roman} V\sBD\N < 3V" @with string @ string on @ string loctype view @ string 0.96, 0.63 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "3V \f{Symbol}£\f{Times-Roman} V\sBD\N < 4V" @with string @ string on @ string loctype view @ string 0.96, 0.57 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "4V \f{Symbol}£\f{Times-Roman} V\sBD\N < 5V" @with string @ string on @ string loctype view @ string 0.96, 0.51 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "5V \f{Symbol}£\f{Times-Roman} V\sBD\N < 6V" @with string @ string on @ string loctype view @ string 0.96, 0.45 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "6V \f{Symbol}£\f{Times-Roman} V\sBD\N < 7V" @with string @ string on @ string loctype view @ string 0.96, 0.39 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "7V \f{Symbol}£\f{Times-Roman} V\sBD\N < 8V" @with string @ string on @ string loctype view @ string 0.96, 0.33 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "8V \f{Symbol}£\f{Times-Roman} V\sBD\N < 9V" @with string @ string on @ string loctype view @ string 0.96, 0.27 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "9V \f{Symbol}£\f{Times-Roman} V\sBD\N < 10V" @with string @ string on @ string loctype view @ string 0.96, 0.21 @ string color 1 @ string rot 0 @ string font 4 @ string just 12 @ string char size 0.850000 @ string def "10V \f{Symbol}£\f{Times-Roman} V\sBD\N < 11V" @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0.5 @ world xmax 8.75 @ world ymin 0.5 @ world ymax 8.75 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "XYCOLOR Map" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Device Breakdown Voltages Across An 8-Inch Semiconductor Wafer" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "Notch" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel off @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place spec @ yaxis label place 0.000000, 0.120000 @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel off @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend 0.85, 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xycolor @ s0 symbol 2 @ s0 symbol size 1.920000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "stdin" @ s0 legend "" @target G0.S0 @type xycolor 1 3 10.21 1 4 10.09 1 5 10.18 1 6 10.11 2 7 10.23 2 6 10.11 2 5 9.93 2 4 9.11 2 3 10.1 2 2 10.36 3 2 9.95 3 3 10.07 3 4 10.11 3 5 10.07 3 6 10.11 3 7 10.42 4 8 10.16 4 7 10.23 4 6 10.14 4 5 10.04 4 4 9.95 4 3 10.14 4 2 10.09 4 1 9.81 5 1 9.9 5 3 10.09 5 2 10.27 5 4 10.18 5 5 10.21 5 6 10.18 5 7 10.16 5 8 10.14 6 7 7.06 6 6 10.16 6 5 10.11 6 4 10.11 6 3 10.11 6 2 10.04 7 2 6.04 7 3 6.43 7 4 10.16 7 5 10.02 7 6 7.08 7 7 7.06 8 6 7.11 8 5 8.39 8 4 6.66 8 3 8.72 & grace-5.1.23/examples/fills.agr0000644000076500001440000016635206667076563016114 0ustar fnevgenyusers# xvgr parameter file # @version 20100 @with string @ string on @ string loctype view @ string 0.03, 0.96 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.800000 @string def "See Plot/Set appearance (line tab) for fills" @with g0 @g0 ON @g0 label OFF @g0 hidden FALSE @g0 type XY @g0 autoscale type AUTO @g0 fixedpoint OFF @g0 fixedpoint xy 0.000000 , 0.000000 @g0 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1975 @ world xmax 1986 @ world ymin -6 @ world ymax 4 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.060000 @ view ymax 0.200000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Filled to World Y min" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center FALSE @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 6 @ s0 fill color 7 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "" @ xaxis tick ON @ xaxis tick major 2.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel ON @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 2.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 2.000000 @ zeroyaxis tick minor 1.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g1 @g1 ON @g1 label OFF @g1 hidden FALSE @g1 type XY @g1 autoscale type AUTO @g1 fixedpoint OFF @g1 fixedpoint xy 0.000000 , 0.000000 @g1 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1975 @ world xmax 1986 @ world ymin -6 @ world ymax 4 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.300000 @ view ymax 0.440000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Filled to World Y max" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center FALSE @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 7 @ s0 fill color 7 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ xaxis tick ON @ xaxis tick major 2.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel ON @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 2.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 2.000000 @ zeroyaxis tick minor 1.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g2 @g2 ON @g2 label OFF @g2 hidden FALSE @g2 type XY @g2 autoscale type AUTO @g2 fixedpoint OFF @g2 fixedpoint xy 0.000000 , 0.000000 @g2 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1975 @ world xmax 1986 @ world ymin -6 @ world ymax 4 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.540000 @ view ymax 0.680000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Filled to y = 0.0" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center FALSE @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 2 @ s0 fill color 6 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ xaxis tick ON @ xaxis tick major 2.000000 @ xaxis tick minor 1.000000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel ON @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 2.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 2.000000 @ zeroyaxis tick minor 1.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @with g3 @g3 ON @g3 label OFF @g3 hidden FALSE @g3 type XY @g3 autoscale type AUTO @g3 fixedpoint OFF @g3 fixedpoint xy 0.000000 , 0.000000 @g3 fixedpoint type 0 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 4 @ default font source 0 @ default symbol size 1.000000 @ world xmin 1976 @ world xmax 1979 @ world ymin 4 @ world ymax 14 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.780000 @ view ymax 0.920000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Filled as a polygon" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ s0 type XY @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center FALSE @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 1 @ s0 color 1 @ s0 fill 1 @ s0 fill color 6 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser ON @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "copy of set 0" @ xaxis tick ON @ xaxis tick major 1.000000 @ xaxis tick minor 0.500000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt OFF @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel ON @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format DECIMAL @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op BOTTOM @ xaxis ticklabel sign NORMAL @ xaxis ticklabel start type AUTO @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type AUTO @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major ON @ xaxis tick minor ON @ xaxis tick default 6 @ xaxis tick IN @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log OFF @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar OFF @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid OFF @ xaxis tick minor grid OFF @ xaxis tick op BOTH @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick ON @ yaxis tick major 2.000000 @ yaxis tick minor 1.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt OFF @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel ON @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format DECIMAL @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op LEFT @ yaxis ticklabel sign NORMAL @ yaxis ticklabel start type AUTO @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type AUTO @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major ON @ yaxis tick minor ON @ yaxis tick default 6 @ yaxis tick IN @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log OFF @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar OFF @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid OFF @ yaxis tick minor grid OFF @ yaxis tick op BOTH @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick ON @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt OFF @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel OFF @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format DECIMAL @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op BOTTOM @ altxaxis ticklabel sign NORMAL @ altxaxis ticklabel start type AUTO @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type AUTO @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major OFF @ altxaxis tick minor ON @ altxaxis tick default 6 @ altxaxis tick IN @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log OFF @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar OFF @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid OFF @ altxaxis tick minor grid OFF @ altxaxis tick op BOTH @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick ON @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt OFF @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel OFF @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format DECIMAL @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op LEFT @ altyaxis ticklabel sign NORMAL @ altyaxis ticklabel start type AUTO @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type AUTO @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major OFF @ altyaxis tick minor ON @ altyaxis tick default 6 @ altyaxis tick IN @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log OFF @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar OFF @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid OFF @ altyaxis tick minor grid OFF @ altyaxis tick op BOTH @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick ON @ zeroxaxis tick major 1.000000 @ zeroxaxis tick minor 0.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt OFF @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel OFF @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format DECIMAL @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op BOTTOM @ zeroxaxis ticklabel sign NORMAL @ zeroxaxis ticklabel start type AUTO @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type AUTO @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major OFF @ zeroxaxis tick minor ON @ zeroxaxis tick default 6 @ zeroxaxis tick IN @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log OFF @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar OFF @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid OFF @ zeroxaxis tick minor grid OFF @ zeroxaxis tick op BOTH @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick ON @ zeroyaxis tick major 2.000000 @ zeroyaxis tick minor 1.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt OFF @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel OFF @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format DECIMAL @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op LEFT @ zeroyaxis ticklabel sign NORMAL @ zeroyaxis ticklabel start type AUTO @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type AUTO @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major OFF @ zeroyaxis tick minor ON @ zeroyaxis tick default 6 @ zeroyaxis tick IN @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log OFF @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar OFF @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid OFF @ zeroyaxis tick minor grid OFF @ zeroyaxis tick op BOTH @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend OFF @ legend loctype view @ legend layout 0 @ legend vgap 1 @ legend hgap 1 @ legend length 4 @ legend box OFF @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 1 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ legend string 0 "" @ frame ON @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill OFF @ frame background color 0 @WITH G0 @G0 ON 1974.330000 3.615037 1974.420000 2.485189 1974.500000 1.369769 1974.580000 -0.745651 1974.670000 -2.575499 1974.750000 -2.790919 1974.830000 -2.006339 1974.920000 -0.736187 1975.000000 0.148393 1975.080000 0.832973 1975.170000 1.203125 1975.250000 2.387705 1975.330000 2.972284 1975.420000 2.342437 1975.500000 0.727017 1975.580000 -1.288404 1975.670000 -2.918251 1975.750000 -3.133672 1975.830000 -2.349092 1975.920000 -0.778940 1976.000000 -0.294360 1976.080000 0.590220 1976.170000 1.460372 1976.250000 2.444952 1976.330000 2.329532 1976.420000 1.699684 1976.500000 0.384264 1976.580000 -1.931156 1976.670000 -3.861004 1976.750000 -4.376424 1976.830000 -2.891844 1976.920000 -1.621692 1977.000000 -0.637112 1977.080000 -0.252533 1977.170000 1.317620 1977.250000 2.402199 1977.330000 2.986779 1977.420000 2.156932 1977.500000 0.741511 1977.580000 -1.573909 1977.670000 -3.003757 1977.750000 -3.219177 1977.830000 -2.134597 1977.920000 -1.164445 1978.000000 -0.079865 1978.080000 0.304715 1978.170000 1.474867 1978.250000 2.659447 1978.330000 2.744027 1978.420000 2.614179 1978.500000 0.898759 1978.580000 -1.116662 1978.670000 -3.246509 1978.750000 -3.561929 1978.830000 -2.177350 1978.920000 -1.307197 1979.000000 -0.222618 1979.080000 0.261962 1979.170000 1.432114 1979.250000 2.416694 1979.330000 2.401274 1979.420000 2.471426 1979.500000 0.656006 1979.580000 -1.359414 1979.670000 -3.389262 1979.750000 -3.204682 1979.830000 -2.120102 1979.920000 -0.749950 1980.000000 0.134630 1980.080000 0.519210 1980.170000 2.189362 1980.250000 2.873942 1980.330000 3.358521 1980.420000 3.028674 1980.500000 1.013253 1980.580000 -0.802167 1980.670000 -2.532014 1980.750000 -2.647435 1980.830000 -1.662855 1980.920000 -0.592703 1981.000000 0.191877 1981.080000 1.176457 1981.170000 2.346609 1981.250000 3.031189 1981.330000 3.415769 1981.420000 2.785921 1981.500000 1.070501 1981.580000 -1.144919 1981.670000 -2.974767 1981.750000 -3.090187 1981.830000 -1.805607 1981.920000 -0.535455 1982.000000 0.349125 1982.080000 1.033704 1982.170000 1.903857 1982.250000 2.788436 1982.330000 3.273016 1982.420000 2.243168 1982.500000 0.727748 1982.580000 -1.387672 1982.670000 -3.717520 1982.750000 -3.632940 1982.830000 -2.548360 1982.920000 -1.278208 1983.000000 -0.593628 1983.080000 0.590952 1983.170000 0.761104 1983.250000 2.945684 1983.330000 3.430264 1983.420000 2.800416 1983.500000 1.484996 1983.580000 -0.730425 1983.670000 -2.860272 1983.750000 -2.875693 1983.830000 -1.791113 1983.920000 -0.320960 1984.000000 0.163619 1984.080000 0.948199 1984.170000 1.418351 1984.250000 2.202931 1984.330000 3.387511 1984.420000 2.557663 1984.500000 0.842243 1984.580000 -2.273177 1984.670000 -3.503025 1984.750000 -3.418445 1984.830000 -1.833865 1984.920000 -0.463713 1985.000000 0.020867 1985.080000 0.605447 1985.170000 2.075599 1985.250000 2.360179 1985.330000 3.144758 1985.420000 2.414911 1985.500000 0.399490 1985.580000 -1.815930 1985.670000 -3.245778 1985.750000 -3.361198 1985.830000 -1.976618 1985.920000 -0.706466 & @WITH G1 @G1 ON 1974.330000 3.615037 1974.420000 2.485189 1974.500000 1.369769 1974.580000 -0.745651 1974.670000 -2.575499 1974.750000 -2.790919 1974.830000 -2.006339 1974.920000 -0.736187 1975.000000 0.148393 1975.080000 0.832973 1975.170000 1.203125 1975.250000 2.387705 1975.330000 2.972284 1975.420000 2.342437 1975.500000 0.727017 1975.580000 -1.288404 1975.670000 -2.918251 1975.750000 -3.133672 1975.830000 -2.349092 1975.920000 -0.778940 1976.000000 -0.294360 1976.080000 0.590220 1976.170000 1.460372 1976.250000 2.444952 1976.330000 2.329532 1976.420000 1.699684 1976.500000 0.384264 1976.580000 -1.931156 1976.670000 -3.861004 1976.750000 -4.376424 1976.830000 -2.891844 1976.920000 -1.621692 1977.000000 -0.637112 1977.080000 -0.252533 1977.170000 1.317620 1977.250000 2.402199 1977.330000 2.986779 1977.420000 2.156932 1977.500000 0.741511 1977.580000 -1.573909 1977.670000 -3.003757 1977.750000 -3.219177 1977.830000 -2.134597 1977.920000 -1.164445 1978.000000 -0.079865 1978.080000 0.304715 1978.170000 1.474867 1978.250000 2.659447 1978.330000 2.744027 1978.420000 2.614179 1978.500000 0.898759 1978.580000 -1.116662 1978.670000 -3.246509 1978.750000 -3.561929 1978.830000 -2.177350 1978.920000 -1.307197 1979.000000 -0.222618 1979.080000 0.261962 1979.170000 1.432114 1979.250000 2.416694 1979.330000 2.401274 1979.420000 2.471426 1979.500000 0.656006 1979.580000 -1.359414 1979.670000 -3.389262 1979.750000 -3.204682 1979.830000 -2.120102 1979.920000 -0.749950 1980.000000 0.134630 1980.080000 0.519210 1980.170000 2.189362 1980.250000 2.873942 1980.330000 3.358521 1980.420000 3.028674 1980.500000 1.013253 1980.580000 -0.802167 1980.670000 -2.532014 1980.750000 -2.647435 1980.830000 -1.662855 1980.920000 -0.592703 1981.000000 0.191877 1981.080000 1.176457 1981.170000 2.346609 1981.250000 3.031189 1981.330000 3.415769 1981.420000 2.785921 1981.500000 1.070501 1981.580000 -1.144919 1981.670000 -2.974767 1981.750000 -3.090187 1981.830000 -1.805607 1981.920000 -0.535455 1982.000000 0.349125 1982.080000 1.033704 1982.170000 1.903857 1982.250000 2.788436 1982.330000 3.273016 1982.420000 2.243168 1982.500000 0.727748 1982.580000 -1.387672 1982.670000 -3.717520 1982.750000 -3.632940 1982.830000 -2.548360 1982.920000 -1.278208 1983.000000 -0.593628 1983.080000 0.590952 1983.170000 0.761104 1983.250000 2.945684 1983.330000 3.430264 1983.420000 2.800416 1983.500000 1.484996 1983.580000 -0.730425 1983.670000 -2.860272 1983.750000 -2.875693 1983.830000 -1.791113 1983.920000 -0.320960 1984.000000 0.163619 1984.080000 0.948199 1984.170000 1.418351 1984.250000 2.202931 1984.330000 3.387511 1984.420000 2.557663 1984.500000 0.842243 1984.580000 -2.273177 1984.670000 -3.503025 1984.750000 -3.418445 1984.830000 -1.833865 1984.920000 -0.463713 1985.000000 0.020867 1985.080000 0.605447 1985.170000 2.075599 1985.250000 2.360179 1985.330000 3.144758 1985.420000 2.414911 1985.500000 0.399490 1985.580000 -1.815930 1985.670000 -3.245778 1985.750000 -3.361198 1985.830000 -1.976618 1985.920000 -0.706466 & @WITH G2 @G2 ON 1974.330000 3.615037 1974.420000 2.485189 1974.500000 1.369769 1974.580000 -0.745651 1974.670000 -2.575499 1974.750000 -2.790919 1974.830000 -2.006339 1974.920000 -0.736187 1975.000000 0.148393 1975.080000 0.832973 1975.170000 1.203125 1975.250000 2.387705 1975.330000 2.972284 1975.420000 2.342437 1975.500000 0.727017 1975.580000 -1.288404 1975.670000 -2.918251 1975.750000 -3.133672 1975.830000 -2.349092 1975.920000 -0.778940 1976.000000 -0.294360 1976.080000 0.590220 1976.170000 1.460372 1976.250000 2.444952 1976.330000 2.329532 1976.420000 1.699684 1976.500000 0.384264 1976.580000 -1.931156 1976.670000 -3.861004 1976.750000 -4.376424 1976.830000 -2.891844 1976.920000 -1.621692 1977.000000 -0.637112 1977.080000 -0.252533 1977.170000 1.317620 1977.250000 2.402199 1977.330000 2.986779 1977.420000 2.156932 1977.500000 0.741511 1977.580000 -1.573909 1977.670000 -3.003757 1977.750000 -3.219177 1977.830000 -2.134597 1977.920000 -1.164445 1978.000000 -0.079865 1978.080000 0.304715 1978.170000 1.474867 1978.250000 2.659447 1978.330000 2.744027 1978.420000 2.614179 1978.500000 0.898759 1978.580000 -1.116662 1978.670000 -3.246509 1978.750000 -3.561929 1978.830000 -2.177350 1978.920000 -1.307197 1979.000000 -0.222618 1979.080000 0.261962 1979.170000 1.432114 1979.250000 2.416694 1979.330000 2.401274 1979.420000 2.471426 1979.500000 0.656006 1979.580000 -1.359414 1979.670000 -3.389262 1979.750000 -3.204682 1979.830000 -2.120102 1979.920000 -0.749950 1980.000000 0.134630 1980.080000 0.519210 1980.170000 2.189362 1980.250000 2.873942 1980.330000 3.358521 1980.420000 3.028674 1980.500000 1.013253 1980.580000 -0.802167 1980.670000 -2.532014 1980.750000 -2.647435 1980.830000 -1.662855 1980.920000 -0.592703 1981.000000 0.191877 1981.080000 1.176457 1981.170000 2.346609 1981.250000 3.031189 1981.330000 3.415769 1981.420000 2.785921 1981.500000 1.070501 1981.580000 -1.144919 1981.670000 -2.974767 1981.750000 -3.090187 1981.830000 -1.805607 1981.920000 -0.535455 1982.000000 0.349125 1982.080000 1.033704 1982.170000 1.903857 1982.250000 2.788436 1982.330000 3.273016 1982.420000 2.243168 1982.500000 0.727748 1982.580000 -1.387672 1982.670000 -3.717520 1982.750000 -3.632940 1982.830000 -2.548360 1982.920000 -1.278208 1983.000000 -0.593628 1983.080000 0.590952 1983.170000 0.761104 1983.250000 2.945684 1983.330000 3.430264 1983.420000 2.800416 1983.500000 1.484996 1983.580000 -0.730425 1983.670000 -2.860272 1983.750000 -2.875693 1983.830000 -1.791113 1983.920000 -0.320960 1984.000000 0.163619 1984.080000 0.948199 1984.170000 1.418351 1984.250000 2.202931 1984.330000 3.387511 1984.420000 2.557663 1984.500000 0.842243 1984.580000 -2.273177 1984.670000 -3.503025 1984.750000 -3.418445 1984.830000 -1.833865 1984.920000 -0.463713 1985.000000 0.020867 1985.080000 0.605447 1985.170000 2.075599 1985.250000 2.360179 1985.330000 3.144758 1985.420000 2.414911 1985.500000 0.399490 1985.580000 -1.815930 1985.670000 -3.245778 1985.750000 -3.361198 1985.830000 -1.976618 1985.920000 -0.706466 & @WITH G3 @G3 ON 1974.330000 13.615037 1974.420000 12.485189 1974.500000 11.369769 1974.580000 9.254349 1974.670000 7.424501 1974.750000 7.209081 1974.830000 7.993661 1974.920000 9.263813 1975.000000 10.148393 1975.080000 10.832973 1975.170000 11.203125 1975.250000 12.387705 1975.330000 12.972284 1975.420000 12.342437 1975.500000 10.727017 1975.580000 8.711596 1975.670000 7.081749 1975.750000 6.866328 1975.830000 7.650908 1975.920000 9.221060 1976.000000 9.705640 1976.080000 10.590220 1976.170000 11.460372 1976.250000 12.444952 1976.330000 12.329532 1976.420000 11.699684 1976.500000 10.384264 1976.580000 8.068844 1976.670000 6.138996 1976.750000 5.623576 1976.830000 7.108156 1976.920000 8.378308 1977.000000 9.362888 1977.080000 9.747467 1977.170000 11.317620 1977.250000 12.402199 1977.330000 12.986779 1977.420000 12.156932 1977.500000 10.741511 1977.580000 8.426091 1977.670000 6.996243 1977.750000 6.780823 1977.830000 7.865403 1977.920000 8.835555 1978.000000 9.920135 1978.080000 10.304715 1978.170000 11.474867 1978.250000 12.659447 1978.330000 12.744027 1978.420000 12.614179 1978.500000 10.898759 1978.580000 8.883338 1978.670000 6.753491 1978.750000 6.438071 1978.830000 7.822650 1978.920000 8.692803 1979.000000 9.777382 1979.080000 10.261962 1979.170000 11.432114 1979.250000 12.416694 1979.330000 12.401274 1979.420000 12.471426 1979.500000 10.656006 1979.580000 8.640586 1979.670000 6.610738 1979.750000 6.795318 1979.830000 7.879898 1979.920000 9.250050 1980.000000 10.134630 1980.080000 10.519210 1980.170000 12.189362 1980.250000 12.873942 1980.330000 13.358521 1980.420000 13.028674 1980.500000 11.013253 1980.580000 9.197833 1980.670000 7.467986 1980.750000 7.352565 1980.830000 8.337145 1980.920000 9.407297 1981.000000 10.191877 1981.080000 11.176457 1981.170000 12.346609 1981.250000 13.031189 1981.330000 13.415769 1981.420000 12.785921 1981.500000 11.070501 1981.580000 8.855081 1981.670000 7.025233 1981.750000 6.909813 1981.830000 8.194393 1981.920000 9.464545 1982.000000 10.349125 1982.080000 11.033704 1982.170000 11.903857 1982.250000 12.788436 1982.330000 13.273016 1982.420000 12.243168 1982.500000 10.727748 1982.580000 8.612328 1982.670000 6.282480 1982.750000 6.367060 1982.830000 7.451640 1982.920000 8.721792 1983.000000 9.406372 1983.080000 10.590952 1983.170000 10.761104 1983.250000 12.945684 1983.330000 13.430264 1983.420000 12.800416 1983.500000 11.484996 1983.580000 9.269575 1983.670000 7.139728 1983.750000 7.124307 1983.830000 8.208887 1983.920000 9.679040 1984.000000 10.163619 1984.080000 10.948199 1984.170000 11.418351 1984.250000 12.202931 1984.330000 13.387511 1984.420000 12.557663 1984.500000 10.842243 1984.580000 7.726823 1984.670000 6.496975 1984.750000 6.581555 1984.830000 8.166135 1984.920000 9.536287 1985.000000 10.020867 1985.080000 10.605447 1985.170000 12.075599 1985.250000 12.360179 1985.330000 13.144758 1985.420000 12.414911 1985.500000 10.399490 1985.580000 8.184070 1985.670000 6.754222 1985.750000 6.638802 1985.830000 8.023382 1985.920000 9.293534 & grace-5.1.23/examples/brw.dat0000644000076500001440000000363006626627163015552 0ustar fnevgenyusers1974 336.5 1974.08 336 1974.17 336.7 1974.25 337.1 1974.33 336.9 1974.42 335.9 1974.5 328.7 1974.58 323.5 1974.67 324.2 1974.75 328.8 1974.83 332 1974.92 335.2 1975 336.8 1975.08 336.6 1975.17 337.1 1975.25 337.7 1975.33 337.9 1975.42 335.4 1975.5 330.1 1975.58 324.4 1975.67 324.6 1975.75 329.2 1975.83 334.3 1975.92 336.5 1976 337 1976.08 336.7 1976.17 337.7 1976.25 338 1976.33 337.8 1976.42 336.8 1976.5 331.0 1976.58 323.5 1976.67 325.1 1976.75 329.8 1976.83 334.1 1976.92 336.6 1977 336.8 1977.08 336.9 1977.17 338.2 1977.25 339.2 1977.33 339.4 1977.42 337.7 1977.5 330.1 1977.58 325.4 1977.67 326.8 1977.75 332 1977.83 334.7 1977.92 338.8 1978 339.1 1978.08 340.2 1978.17 341.5 1978.25 341.0 1978.33 340.8 1978.42 339.4 1978.5 332.6 1978.58 327.7 1978.67 327.4 1978.75 332.1 1978.83 338.8 1978.92 339.4 1979 340.1 1979.08 341.3 1979.17 342.5 1979.25 342.4 1979.33 342.9 1979.42 342 1979.5 333.6 1979.58 327.7 1979.67 329.3 1979.75 333.1 1979.83 338.1 1979.92 341.5 1980 341.9 1980.08 342.4 1980.17 343.4 1980.25 343.3 1980.33 343.3 1980.42 342.6 1980.5 337.3 1980.58 331.8 1980.67 331.4 1980.75 337.9 1980.83 340.5 1980.92 342.6 1981 344.3 1981.08 345.5 1981.17 344.6 1981.25 345.8 1981.33 346.8 1981.42 344.4 1981.5 338.2 1981.58 331.8 1981.67 333.3 1981.75 338.8 1981.83 342.2 1981.92 344.9 1982 345.8 1982.08 347.2 1982.17 348.3 1982.25 348.4 1982.33 348 1982.42 345.7 1982.5 339.2 1982.58 333.2 1982.67 333.2 1982.75 337.9 1982.83 342.1 1982.92 344.5 1983 347.5 1983.08 347 1983.17 348.1 1983.25 348.1 1983.33 348.3 1983.42 347 1983.5 340.4 1983.58 333.8 1983.67 335.5 1983.75 340.6 1983.83 346.5 1983.92 346.8 1984 351 1984.08 350.7 1984.17 350 1984.25 349.8 1984.33 350.7 1984.42 348.3 1984.5 341.3 1984.58 335.9 1984.67 338.3 1984.75 342.2 1984.83 345 1984.92 348.5 1985 349.8 1985.08 349.5 1985.17 350.5 1985.25 351.4 1985.33 352.5 1985.42 349.9 1985.5 343.4 1985.58 337.4 1985.67 338.2 1985.75 344.3 1985.83 347.7 1985.92 349.7 grace-5.1.23/examples/manygraphs.agr0000644000076500001440000050102206626627163017130 0ustar fnevgenyusers# Grace project file # @version 50000 @page size 600 600 @page scroll 5% @page inout 5% @link page off @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Sep 11 03:11:13 1998" @with string @ string on @ string loctype view @ string 0.353383458647, 0.951534733441 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Demo of many graphs" @with string @ string on @ string loctype view @ string 0.243107769424, 0.187399030695 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Grace no longer has limits on the number of graphs or" @with string @ string on @ string loctype view @ string 0.243107769424, 0.155088852989 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "the number of sets in a graph. This demo is a matrix of " @with string @ string on @ string loctype view @ string 0.243107769424, 0.121163166397 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "graphs 6x6 for a total of 36." @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @link r4 to g24 @link r4 to g25 @link r4 to g26 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g1 on @g1 hidden false @g1 type XY @g1 autoscale type auto @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g2 on @g2 hidden false @g2 type XY @g2 autoscale type auto @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format general general @g2 fixedpoint prec 6, 6 @with g2 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g3 on @g3 hidden false @g3 type XY @g3 autoscale type auto @g3 fixedpoint off @g3 fixedpoint type 0 @g3 fixedpoint xy 0.000000, 0.000000 @g3 fixedpoint format general general @g3 fixedpoint prec 6, 6 @with g3 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g4 on @g4 hidden false @g4 type XY @g4 autoscale type auto @g4 fixedpoint off @g4 fixedpoint type 0 @g4 fixedpoint xy 0.000000, 0.000000 @g4 fixedpoint format general general @g4 fixedpoint prec 6, 6 @with g4 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g5 on @g5 hidden false @g5 type XY @g5 autoscale type auto @g5 fixedpoint off @g5 fixedpoint type 0 @g5 fixedpoint xy 0.000000, 0.000000 @g5 fixedpoint format general general @g5 fixedpoint prec 6, 6 @with g5 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.300000 @ view xmax 0.400000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g6 on @g6 hidden false @g6 type XY @g6 autoscale type auto @g6 fixedpoint off @g6 fixedpoint type 0 @g6 fixedpoint xy 0.000000, 0.000000 @g6 fixedpoint format general general @g6 fixedpoint prec 6, 6 @with g6 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g7 on @g7 hidden false @g7 type XY @g7 autoscale type auto @g7 fixedpoint off @g7 fixedpoint type 0 @g7 fixedpoint xy 0.000000, 0.000000 @g7 fixedpoint format general general @g7 fixedpoint prec 6, 6 @with g7 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g8 on @g8 hidden false @g8 type XY @g8 autoscale type auto @g8 fixedpoint off @g8 fixedpoint type 0 @g8 fixedpoint xy 0.000000, 0.000000 @g8 fixedpoint format general general @g8 fixedpoint prec 6, 6 @with g8 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g9 on @g9 hidden false @g9 type XY @g9 autoscale type auto @g9 fixedpoint off @g9 fixedpoint type 0 @g9 fixedpoint xy 0.000000, 0.000000 @g9 fixedpoint format general general @g9 fixedpoint prec 6, 6 @with g9 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g10 on @g10 hidden false @g10 type XY @g10 autoscale type auto @g10 fixedpoint off @g10 fixedpoint type 0 @g10 fixedpoint xy 0.000000, 0.000000 @g10 fixedpoint format general general @g10 fixedpoint prec 6, 6 @with g10 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g11 on @g11 hidden false @g11 type XY @g11 autoscale type auto @g11 fixedpoint off @g11 fixedpoint type 0 @g11 fixedpoint xy 0.000000, 0.000000 @g11 fixedpoint format general general @g11 fixedpoint prec 6, 6 @with g11 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.400000 @ view xmax 0.500000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g12 on @g12 hidden false @g12 type XY @g12 autoscale type auto @g12 fixedpoint off @g12 fixedpoint type 0 @g12 fixedpoint xy 0.000000, 0.000000 @g12 fixedpoint format general general @g12 fixedpoint prec 6, 6 @with g12 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g13 on @g13 hidden false @g13 type XY @g13 autoscale type auto @g13 fixedpoint off @g13 fixedpoint type 0 @g13 fixedpoint xy 0.000000, 0.000000 @g13 fixedpoint format general general @g13 fixedpoint prec 6, 6 @with g13 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g14 on @g14 hidden false @g14 type XY @g14 autoscale type auto @g14 fixedpoint off @g14 fixedpoint type 0 @g14 fixedpoint xy 0.000000, 0.000000 @g14 fixedpoint format general general @g14 fixedpoint prec 6, 6 @with g14 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g15 on @g15 hidden false @g15 type XY @g15 autoscale type auto @g15 fixedpoint off @g15 fixedpoint type 0 @g15 fixedpoint xy 0.000000, 0.000000 @g15 fixedpoint format general general @g15 fixedpoint prec 6, 6 @with g15 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g16 on @g16 hidden false @g16 type XY @g16 autoscale type auto @g16 fixedpoint off @g16 fixedpoint type 0 @g16 fixedpoint xy 0.000000, 0.000000 @g16 fixedpoint format general general @g16 fixedpoint prec 6, 6 @with g16 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g17 on @g17 hidden false @g17 type XY @g17 autoscale type auto @g17 fixedpoint off @g17 fixedpoint type 0 @g17 fixedpoint xy 0.000000, 0.000000 @g17 fixedpoint format general general @g17 fixedpoint prec 6, 6 @with g17 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.500000 @ view xmax 0.600000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g18 on @g18 hidden false @g18 type XY @g18 autoscale type auto @g18 fixedpoint off @g18 fixedpoint type 0 @g18 fixedpoint xy 0.000000, 0.000000 @g18 fixedpoint format general general @g18 fixedpoint prec 6, 6 @with g18 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g19 on @g19 hidden false @g19 type XY @g19 autoscale type auto @g19 fixedpoint off @g19 fixedpoint type 0 @g19 fixedpoint xy 0.000000, 0.000000 @g19 fixedpoint format general general @g19 fixedpoint prec 6, 6 @with g19 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g20 on @g20 hidden false @g20 type XY @g20 autoscale type auto @g20 fixedpoint off @g20 fixedpoint type 0 @g20 fixedpoint xy 0.000000, 0.000000 @g20 fixedpoint format general general @g20 fixedpoint prec 6, 6 @with g20 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g21 on @g21 hidden false @g21 type XY @g21 autoscale type auto @g21 fixedpoint off @g21 fixedpoint type 0 @g21 fixedpoint xy 0.000000, 0.000000 @g21 fixedpoint format general general @g21 fixedpoint prec 6, 6 @with g21 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g22 on @g22 hidden false @g22 type XY @g22 autoscale type auto @g22 fixedpoint off @g22 fixedpoint type 0 @g22 fixedpoint xy 0.000000, 0.000000 @g22 fixedpoint format general general @g22 fixedpoint prec 6, 6 @with g22 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g23 on @g23 hidden false @g23 type XY @g23 autoscale type auto @g23 fixedpoint off @g23 fixedpoint type 0 @g23 fixedpoint xy 0.000000, 0.000000 @g23 fixedpoint format general general @g23 fixedpoint prec 6, 6 @with g23 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.600000 @ view xmax 0.700000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g24 on @g24 hidden false @g24 type XY @g24 autoscale type auto @g24 fixedpoint off @g24 fixedpoint type 0 @g24 fixedpoint xy 0.000000, 0.000000 @g24 fixedpoint format general general @g24 fixedpoint prec 6, 6 @with g24 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g25 on @g25 hidden false @g25 type XY @g25 autoscale type auto @g25 fixedpoint off @g25 fixedpoint type 0 @g25 fixedpoint xy 0.000000, 0.000000 @g25 fixedpoint format general general @g25 fixedpoint prec 6, 6 @with g25 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g26 on @g26 hidden false @g26 type XY @g26 autoscale type auto @g26 fixedpoint off @g26 fixedpoint type 0 @g26 fixedpoint xy 0.000000, 0.000000 @g26 fixedpoint format general general @g26 fixedpoint prec 6, 6 @with g26 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g27 on @g27 hidden false @g27 type XY @g27 autoscale type auto @g27 fixedpoint off @g27 fixedpoint type 0 @g27 fixedpoint xy 0.000000, 0.000000 @g27 fixedpoint format general general @g27 fixedpoint prec 6, 6 @with g27 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g28 on @g28 hidden false @g28 type XY @g28 autoscale type auto @g28 fixedpoint off @g28 fixedpoint type 0 @g28 fixedpoint xy 0.000000, 0.000000 @g28 fixedpoint format general general @g28 fixedpoint prec 6, 6 @with g28 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g29 on @g29 hidden false @g29 type XY @g29 autoscale type auto @g29 fixedpoint off @g29 fixedpoint type 0 @g29 fixedpoint xy 0.000000, 0.000000 @g29 fixedpoint format general general @g29 fixedpoint prec 6, 6 @with g29 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.700000 @ view xmax 0.800000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g30 on @g30 hidden false @g30 type XY @g30 autoscale type auto @g30 fixedpoint off @g30 fixedpoint type 0 @g30 fixedpoint xy 0.000000, 0.000000 @g30 fixedpoint format general general @g30 fixedpoint prec 6, 6 @with g30 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.300000 @ view ymax 0.400000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g31 on @g31 hidden false @g31 type XY @g31 autoscale type auto @g31 fixedpoint off @g31 fixedpoint type 0 @g31 fixedpoint xy 0.000000, 0.000000 @g31 fixedpoint format general general @g31 fixedpoint prec 6, 6 @with g31 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.400000 @ view ymax 0.500000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g32 on @g32 hidden false @g32 type XY @g32 autoscale type auto @g32 fixedpoint off @g32 fixedpoint type 0 @g32 fixedpoint xy 0.000000, 0.000000 @g32 fixedpoint format general general @g32 fixedpoint prec 6, 6 @with g32 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.500000 @ view ymax 0.600000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g33 on @g33 hidden false @g33 type XY @g33 autoscale type auto @g33 fixedpoint off @g33 fixedpoint type 0 @g33 fixedpoint xy 0.000000, 0.000000 @g33 fixedpoint format general general @g33 fixedpoint prec 6, 6 @with g33 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.600000 @ view ymax 0.700000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g34 on @g34 hidden false @g34 type XY @g34 autoscale type auto @g34 fixedpoint off @g34 fixedpoint type 0 @g34 fixedpoint xy 0.000000, 0.000000 @g34 fixedpoint format general general @g34 fixedpoint prec 6, 6 @with g34 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.700000 @ view ymax 0.800000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @g35 on @g35 hidden false @g35 type XY @g35 autoscale type auto @g35 fixedpoint off @g35 fixedpoint type 0 @g35 fixedpoint xy 0.000000, 0.000000 @g35 fixedpoint format general general @g35 fixedpoint prec 6, 6 @with g35 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.800000 @ view xmax 0.900000 @ view ymin 0.800000 @ view ymax 0.900000 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 0.280000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.160000 @ xaxis ticklabel off @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 0.999000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.280000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.160000 @ yaxis ticklabel off @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type spec @ yaxis ticklabel stop 0.999000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 2 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @WITH G0 @G0 ON @WITH G1 @G1 ON @WITH G2 @G2 ON @WITH G3 @G3 ON @WITH G4 @G4 ON @WITH G5 @G5 ON @WITH G6 @G6 ON @WITH G7 @G7 ON @WITH G8 @G8 ON @WITH G9 @G9 ON @WITH G10 @G10 ON @WITH G11 @G11 ON @WITH G12 @G12 ON @WITH G13 @G13 ON @WITH G14 @G14 ON @WITH G15 @G15 ON @WITH G16 @G16 ON @WITH G17 @G17 ON @WITH G18 @G18 ON @WITH G19 @G19 ON @WITH G20 @G20 ON @WITH G21 @G21 ON @WITH G22 @G22 ON @WITH G23 @G23 ON @WITH G24 @G24 ON @WITH G25 @G25 ON @WITH G26 @G26 ON @WITH G27 @G27 ON @WITH G28 @G28 ON @WITH G29 @G29 ON @WITH G30 @G30 ON @WITH G31 @G31 ON @WITH G32 @G32 ON @WITH G33 @G33 ON @WITH G34 @G34 ON @WITH G35 @G35 ON grace-5.1.23/examples/log.dat0000644000076500001440000001077106626627163015545 0ustar fnevgenyusers.000001 .000001 .00001 .00001 .0001 .0001 .001 .001 .01 .01 .1 .1 1 1 10 10 100 100 1000 1000 10000 10000 100000 100000 1000000 1000000 & 1.000000 1.000000 2.000000 4.000000 3.000000 9.000000 4.000000 16.000000 5.000000 25.000000 6.000000 36.000000 7.000000 49.000000 8.000000 64.000000 9.000000 81.000000 10.000000 100.000000 11.000000 121.000000 12.000000 144.000000 13.000000 169.000000 14.000000 196.000000 15.000000 225.000000 16.000000 256.000000 17.000000 289.000000 18.000000 324.000000 19.000000 361.000000 20.000000 400.000000 21.000000 441.000000 22.000000 484.000000 23.000000 529.000000 24.000000 576.000000 25.000000 625.000000 26.000000 676.000000 27.000000 729.000000 28.000000 784.000000 29.000000 841.000000 30.000000 900.000000 31.000000 961.000000 32.000000 1024.000000 33.000000 1089.000000 34.000000 1156.000000 35.000000 1225.000000 36.000000 1296.000000 37.000000 1369.000000 38.000000 1444.000000 39.000000 1521.000000 40.000000 1600.000000 41.000000 1681.000000 42.000000 1764.000000 43.000000 1849.000000 44.000000 1936.000000 45.000000 2025.000000 46.000000 2116.000000 47.000000 2209.000000 48.000000 2304.000000 49.000000 2401.000000 50.000000 2500.000000 51.000000 2601.000000 52.000000 2704.000000 53.000000 2809.000000 54.000000 2916.000000 55.000000 3025.000000 56.000000 3136.000000 57.000000 3249.000000 58.000000 3364.000000 59.000000 3481.000000 60.000000 3600.000000 61.000000 3721.000000 62.000000 3844.000000 63.000000 3969.000000 64.000000 4096.000000 65.000000 4225.000000 66.000000 4356.000000 67.000000 4489.000000 68.000000 4624.000000 69.000000 4761.000000 70.000000 4900.000000 71.000000 5041.000000 72.000000 5184.000000 73.000000 5329.000000 74.000000 5476.000000 75.000000 5625.000000 76.000000 5776.000000 77.000000 5929.000000 78.000000 6084.000000 79.000000 6241.000000 80.000000 6400.000000 81.000000 6561.000000 82.000000 6724.000000 83.000000 6889.000000 84.000000 7056.000000 85.000000 7225.000000 86.000000 7396.000000 87.000000 7569.000000 88.000000 7744.000000 89.000000 7921.000000 90.000000 8100.000000 91.000000 8281.000000 92.000000 8464.000000 93.000000 8649.000000 94.000000 8836.000000 95.000000 9025.000000 96.000000 9216.000000 97.000000 9409.000000 98.000000 9604.000000 99.000000 9801.000000 100.000000 10000.000000 & 1.000000 1.000000 2.000000 8.000000 3.000000 27.000000 4.000000 64.000000 5.000000 125.000000 6.000000 216.000000 7.000000 343.000000 8.000000 512.000000 9.000000 729.000000 10.000000 1000.000000 11.000000 1331.000000 12.000000 1728.000000 13.000000 2197.000000 14.000000 2744.000000 15.000000 3375.000000 16.000000 4096.000000 17.000000 4913.000000 18.000000 5832.000000 19.000000 6859.000000 20.000000 8000.000000 21.000000 9261.000000 22.000000 10648.000000 23.000000 12167.000000 24.000000 13824.000000 25.000000 15625.000000 26.000000 17576.000000 27.000000 19683.000000 28.000000 21952.000000 29.000000 24389.000000 30.000000 27000.000000 31.000000 29791.000000 32.000000 32768.000000 33.000000 35937.000000 34.000000 39304.000000 35.000000 42875.000000 36.000000 46656.000000 37.000000 50653.000000 38.000000 54872.000000 39.000000 59319.000000 40.000000 64000.000000 41.000000 68921.000000 42.000000 74088.000000 43.000000 79507.000000 44.000000 85184.000000 45.000000 91125.000000 46.000000 97336.000000 47.000000 103823.000000 48.000000 110592.000000 49.000000 117649.000000 50.000000 125000.000000 51.000000 132651.000000 52.000000 140608.000000 53.000000 148877.000000 54.000000 157464.000000 55.000000 166375.000000 56.000000 175616.000000 57.000000 185193.000000 58.000000 195112.000000 59.000000 205379.000000 60.000000 216000.000000 61.000000 226981.000000 62.000000 238328.000000 63.000000 250047.000000 64.000000 262144.000000 65.000000 274625.000000 66.000000 287496.000000 67.000000 300763.000000 68.000000 314432.000000 69.000000 328509.000000 70.000000 343000.000000 71.000000 357911.000000 72.000000 373248.000000 73.000000 389017.000000 74.000000 405224.000000 75.000000 421875.000000 76.000000 438976.000000 77.000000 456533.000000 78.000000 474552.000000 79.000000 493039.000000 80.000000 512000.000000 81.000000 531441.000000 82.000000 551368.000000 83.000000 571787.000000 84.000000 592704.000000 85.000000 614125.000000 86.000000 636056.000000 87.000000 658503.000000 88.000000 681472.000000 89.000000 704969.000000 90.000000 729000.000000 91.000000 753571.000000 92.000000 778688.000000 93.000000 804357.000000 94.000000 830584.000000 95.000000 857375.000000 96.000000 884736.000000 97.000000 912673.000000 98.000000 941192.000000 99.000000 970299.000000 100.000000 1000000.000000 grace-5.1.23/examples/test.com0000644000076500001440000000316507113065565015742 0ustar fnevgenyusersecho "Arrange graphs (2x2 matrix)" arrange(2, 2, 0.1, 0.15, 0.2, on, off, on) redraw sleep 1 echo "Create sets in graphs 0, 1, and 2" sleep 1 g0.s0 on g0.s0 length 1024 g1.s0 on g1.s0 length 1024 g1.s1 on g1.s1 length 1024 g2.s1 on g2.s1 length 1024 echo "Set g0.s0.x = set index" sleep 1 with g0 s0.x = mesh(1024) with g1 echo "Set g1.s0.x = g1.s1.x = set index" sleep 1 s0.x = mesh(1024) s1.x = mesh(1024) g2.s1.x = mesh(1024) with g0 echo "Back to graph g0 to load s0.y" sleep 1 s0.y = 2*cos(2*pi*x/100) + 5 * sin(2*pi*x/35) echo "load g1.s0.y" sleep 1 g1.s0.y = 2*cos(2*pi*x/100) + 5 * sin(2*pi*x/35) echo "load g1.s1.y" sleep 1 g1.s1.y = g0.s0.y/3 echo "load g2.s1.y" sleep 1 g2.s1.y = 2*cos(2*pi*g2.s1.x/100) + 5 * sin(2*pi*g2.s1.x/35) echo "Autoscale g0, g1, g2" with g2 autoscale with g0 autoscale with g1 autoscale with g0 echo "Mess with g0.s0.y" s0.y=g1.s0.y - g1.s1.y redraw echo "Compute an fft on g0.s0" fft(s0, 0) echo "move g0.s1 to g3.s0" move g0.s1 to g3.s0 with g3 autoscale with g2 echo "More computations" g2.s1.y = 2*g2.s1.x autoscale g2.s1.y = 2*cos(2*pi*g2.s1.x/100) + 5 * sin(2*pi*g2.s1.x/35) autoscale with g0 echo "Fit a line to g0.s0" sleep 1 regress(s0, 1) redraw echo "12 pt. running average of g0.s0" sleep 1 runavg(s0, 12) echo "Add some random variation to s0" sleep 1 s0.y = s0.y + rand echo "Spline fit of g0.s0, 100 points" sleep 1 interpolate(s0, mesh(min(s0.x), max(s0.x), 100), spline, true) redraw frame fill on frame background color 7 with g1 frame fill on frame background color 7 with g2 frame fill on frame background color 7 with g3 frame fill on frame background color 7 redraw echo "Batch file completed" grace-5.1.23/examples/hilo.agr0000644000076500001440000003463106626627163015721 0ustar fnevgenyusers# ACE/gr parameter file # @version 30000 @with line @ line on @ line loctype view @ line 0.251250, 0.657143, 0.285000, 0.677143 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @line def @with line @ line on @ line loctype view @ line 0.273750, 0.622857, 0.302500, 0.624286 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @line def @with line @ line on @ line loctype view @ line 0.253750, 0.520000, 0.288750, 0.540000 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @line def @with line @ line on @ line loctype view @ line 0.217500, 0.564286, 0.196250, 0.595714 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @line def @with string @ string on @ string loctype view @ string 0.293750, 0.680000 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "High" @with string @ string on @ string loctype view @ string 0.312500, 0.625714 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Close" @with string @ string on @ string loctype view @ string 0.297500, 0.541429 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Low" @with string @ string on @ string loctype view @ string 0.170000, 0.610000 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @string def "Open" @with g0 @g0 on @g0 label off @g0 hidden false @g0 type xy @g0 autoscale type AUTO @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @ default linestyle 1 @ default linewidth 1 @ default color 1 @ default char size 1.000000 @ default font 2 @ default font source 0 @ default symbol size 1.000000 @ world xmin 0 @ world xmax 15 @ world ymin 0 @ world ymax 40 @ view xmin 0.151250 @ view xmax 0.848750 @ view ymin 0.324286 @ view ymax 0.847143 @ title "Hi/Lo/Open/Close" @ title font 4 @ title size 1.500000 @ title color 1 @ title linewidth 1 @ subtitle "Requires X HIGH LOW OPEN CLOSE data format" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ subtitle linewidth 1 @ s0 type xyhilo @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol fill 0 @ s0 symbol center false @ s0 skip 0 @ s0 linestyle 1 @ s0 linewidth 4 @ s0 color 1 @ s0 fill 0 @ s0 fill color 0 @ s0 errorbar type BOTH @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1 @ s0 errorbar linestyle 1 @ s0 errorbar riser on @ s0 errorbar riser linewidth 1 @ s0 errorbar riser linestyle 1 @ s0 comment "hilo.d" @ xaxis tick on @ xaxis tick major 5.000000 @ xaxis tick minor 2.500000 @ xaxis tick offsetx 0.000000 @ xaxis tick offsety 0.000000 @ xaxis tick alt off @ xaxis tick min 0.000000 @ xaxis tick max 1.000000 @ xaxis label "" @ xaxis label layout para @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label linewidth 1 @ xaxis ticklabel on @ xaxis ticklabel type auto @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel layout horizontal @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis ticklabel linewidth 1 @ xaxis tick major on @ xaxis tick minor on @ xaxis tick default 6 @ xaxis tick in @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick log off @ xaxis tick size 1.000000 @ xaxis tick minor size 0.500000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis tick major grid off @ xaxis tick minor grid off @ xaxis tick op both @ xaxis tick type auto @ xaxis tick spec 0 @ yaxis tick on @ yaxis tick major 10.000000 @ yaxis tick minor 5.000000 @ yaxis tick offsetx 0.000000 @ yaxis tick offsety 0.000000 @ yaxis tick alt off @ yaxis tick min 0.000000 @ yaxis tick max 1.000000 @ yaxis label "" @ yaxis label layout para @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label linewidth 1 @ yaxis ticklabel on @ yaxis ticklabel type auto @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel layout horizontal @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis ticklabel linewidth 1 @ yaxis tick major on @ yaxis tick minor on @ yaxis tick default 6 @ yaxis tick in @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick log off @ yaxis tick size 1.000000 @ yaxis tick minor size 0.500000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis tick major grid off @ yaxis tick minor grid off @ yaxis tick op both @ yaxis tick type auto @ yaxis tick spec 0 @ altxaxis tick on @ altxaxis tick major 0.500000 @ altxaxis tick minor 0.250000 @ altxaxis tick offsetx 0.000000 @ altxaxis tick offsety 0.000000 @ altxaxis tick alt off @ altxaxis tick min 0.000000 @ altxaxis tick max 1.000000 @ altxaxis label "" @ altxaxis label layout para @ altxaxis label char size 1.000000 @ altxaxis label font 4 @ altxaxis label color 1 @ altxaxis label linewidth 1 @ altxaxis ticklabel off @ altxaxis ticklabel type auto @ altxaxis ticklabel prec 1 @ altxaxis ticklabel format decimal @ altxaxis ticklabel layout horizontal @ altxaxis ticklabel skip 0 @ altxaxis ticklabel stagger 0 @ altxaxis ticklabel op bottom @ altxaxis ticklabel sign normal @ altxaxis ticklabel start type auto @ altxaxis ticklabel start 0.000000 @ altxaxis ticklabel stop type auto @ altxaxis ticklabel stop 0.000000 @ altxaxis ticklabel char size 1.000000 @ altxaxis ticklabel font 4 @ altxaxis ticklabel color 1 @ altxaxis ticklabel linewidth 1 @ altxaxis tick major off @ altxaxis tick minor on @ altxaxis tick default 6 @ altxaxis tick in @ altxaxis tick major color 1 @ altxaxis tick major linewidth 1 @ altxaxis tick major linestyle 1 @ altxaxis tick minor color 1 @ altxaxis tick minor linewidth 1 @ altxaxis tick minor linestyle 1 @ altxaxis tick log off @ altxaxis tick size 1.000000 @ altxaxis tick minor size 0.500000 @ altxaxis bar off @ altxaxis bar color 1 @ altxaxis bar linestyle 1 @ altxaxis bar linewidth 1 @ altxaxis tick major grid off @ altxaxis tick minor grid off @ altxaxis tick op both @ altxaxis tick type auto @ altxaxis tick spec 0 @ altyaxis tick on @ altyaxis tick major 0.500000 @ altyaxis tick minor 0.250000 @ altyaxis tick offsetx 0.000000 @ altyaxis tick offsety 0.000000 @ altyaxis tick alt off @ altyaxis tick min 0.000000 @ altyaxis tick max 1.000000 @ altyaxis label "" @ altyaxis label layout para @ altyaxis label char size 1.000000 @ altyaxis label font 4 @ altyaxis label color 1 @ altyaxis label linewidth 1 @ altyaxis ticklabel off @ altyaxis ticklabel type auto @ altyaxis ticklabel prec 1 @ altyaxis ticklabel format decimal @ altyaxis ticklabel layout horizontal @ altyaxis ticklabel skip 0 @ altyaxis ticklabel stagger 0 @ altyaxis ticklabel op left @ altyaxis ticklabel sign normal @ altyaxis ticklabel start type auto @ altyaxis ticklabel start 0.000000 @ altyaxis ticklabel stop type auto @ altyaxis ticklabel stop 0.000000 @ altyaxis ticklabel char size 1.000000 @ altyaxis ticklabel font 4 @ altyaxis ticklabel color 1 @ altyaxis ticklabel linewidth 1 @ altyaxis tick major off @ altyaxis tick minor on @ altyaxis tick default 6 @ altyaxis tick in @ altyaxis tick major color 1 @ altyaxis tick major linewidth 1 @ altyaxis tick major linestyle 1 @ altyaxis tick minor color 1 @ altyaxis tick minor linewidth 1 @ altyaxis tick minor linestyle 1 @ altyaxis tick log off @ altyaxis tick size 1.000000 @ altyaxis tick minor size 0.500000 @ altyaxis bar off @ altyaxis bar color 1 @ altyaxis bar linestyle 1 @ altyaxis bar linewidth 1 @ altyaxis tick major grid off @ altyaxis tick minor grid off @ altyaxis tick op both @ altyaxis tick type auto @ altyaxis tick spec 0 @ zeroxaxis tick on @ zeroxaxis tick major 5.000000 @ zeroxaxis tick minor 2.500000 @ zeroxaxis tick offsetx 0.000000 @ zeroxaxis tick offsety 0.000000 @ zeroxaxis tick alt off @ zeroxaxis tick min 0.000000 @ zeroxaxis tick max 1.000000 @ zeroxaxis label "" @ zeroxaxis label layout para @ zeroxaxis label char size 1.000000 @ zeroxaxis label font 4 @ zeroxaxis label color 1 @ zeroxaxis label linewidth 1 @ zeroxaxis ticklabel off @ zeroxaxis ticklabel type auto @ zeroxaxis ticklabel prec 1 @ zeroxaxis ticklabel format decimal @ zeroxaxis ticklabel layout horizontal @ zeroxaxis ticklabel skip 0 @ zeroxaxis ticklabel stagger 0 @ zeroxaxis ticklabel op bottom @ zeroxaxis ticklabel sign normal @ zeroxaxis ticklabel start type auto @ zeroxaxis ticklabel start 0.000000 @ zeroxaxis ticklabel stop type auto @ zeroxaxis ticklabel stop 0.000000 @ zeroxaxis ticklabel char size 1.000000 @ zeroxaxis ticklabel font 4 @ zeroxaxis ticklabel color 1 @ zeroxaxis ticklabel linewidth 1 @ zeroxaxis tick major off @ zeroxaxis tick minor on @ zeroxaxis tick default 6 @ zeroxaxis tick in @ zeroxaxis tick major color 1 @ zeroxaxis tick major linewidth 1 @ zeroxaxis tick major linestyle 1 @ zeroxaxis tick minor color 1 @ zeroxaxis tick minor linewidth 1 @ zeroxaxis tick minor linestyle 1 @ zeroxaxis tick log off @ zeroxaxis tick size 1.000000 @ zeroxaxis tick minor size 0.500000 @ zeroxaxis bar off @ zeroxaxis bar color 1 @ zeroxaxis bar linestyle 1 @ zeroxaxis bar linewidth 1 @ zeroxaxis tick major grid off @ zeroxaxis tick minor grid off @ zeroxaxis tick op both @ zeroxaxis tick type auto @ zeroxaxis tick spec 0 @ zeroyaxis tick on @ zeroyaxis tick major 10.000000 @ zeroyaxis tick minor 5.000000 @ zeroyaxis tick offsetx 0.000000 @ zeroyaxis tick offsety 0.000000 @ zeroyaxis tick alt off @ zeroyaxis tick min 0.000000 @ zeroyaxis tick max 1.000000 @ zeroyaxis label "" @ zeroyaxis label layout para @ zeroyaxis label char size 1.000000 @ zeroyaxis label font 4 @ zeroyaxis label color 1 @ zeroyaxis label linewidth 1 @ zeroyaxis ticklabel off @ zeroyaxis ticklabel type auto @ zeroyaxis ticklabel prec 1 @ zeroyaxis ticklabel format decimal @ zeroyaxis ticklabel layout horizontal @ zeroyaxis ticklabel skip 0 @ zeroyaxis ticklabel stagger 0 @ zeroyaxis ticklabel op left @ zeroyaxis ticklabel sign normal @ zeroyaxis ticklabel start type auto @ zeroyaxis ticklabel start 0.000000 @ zeroyaxis ticklabel stop type auto @ zeroyaxis ticklabel stop 0.000000 @ zeroyaxis ticklabel char size 1.000000 @ zeroyaxis ticklabel font 4 @ zeroyaxis ticklabel color 1 @ zeroyaxis ticklabel linewidth 1 @ zeroyaxis tick major off @ zeroyaxis tick minor on @ zeroyaxis tick default 6 @ zeroyaxis tick in @ zeroyaxis tick major color 1 @ zeroyaxis tick major linewidth 1 @ zeroyaxis tick major linestyle 1 @ zeroyaxis tick minor color 1 @ zeroyaxis tick minor linewidth 1 @ zeroyaxis tick minor linestyle 1 @ zeroyaxis tick log off @ zeroyaxis tick size 1.000000 @ zeroyaxis tick minor size 0.500000 @ zeroyaxis bar off @ zeroyaxis bar color 1 @ zeroyaxis bar linestyle 1 @ zeroyaxis bar linewidth 1 @ zeroyaxis tick major grid off @ zeroyaxis tick minor grid off @ zeroyaxis tick op both @ zeroyaxis tick type auto @ zeroyaxis tick spec 0 @ legend off @ legend loctype view @ legend layout 0 @ legend vgap 2 @ legend hgap 1 @ legend length 4 @ legend box off @ legend x1 0.800000 @ legend y1 0.800000 @ legend font 4 @ legend char size 1.000000 @ legend linestyle 1 @ legend linewidth 1 @ legend color 1 @ frame on @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame fill off @ frame background color 0 @TYPE xyhilo 1.000000 10.000000 5.000000 7.000000 9.000000 2.000000 25.000000 15.000000 18.000000 23.000000 3.000000 5.000000 2.000000 4.000000 3.000000 4.000000 15.000000 1.000000 7.000000 9.000000 5.000000 15.000000 5.000000 12.000000 13.000000 6.000000 5.000000 2.000000 4.000000 3.000000 7.000000 7.000000 5.000000 6.000000 5.000000 8.000000 35.000000 15.000000 18.000000 23.000000 9.000000 15.000000 2.000000 4.000000 3.000000 10.000000 12.000000 5.000000 7.000000 9.000000 11.000000 24.000000 15.000000 18.000000 23.000000 12.000000 15.000000 2.000000 4.000000 3.000000 13.000000 12.000000 5.000000 7.000000 9.000000 14.000000 27.000000 15.000000 18.000000 23.000000 15.000000 3.000000 2.000000 2.000000 3.000000 & grace-5.1.23/examples/arrows.agr0000644000076500001440000002345706716602772016306 0ustar fnevgenyusers# Grace project file # @version 50003 @page size 612 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Thu May 13 18:52:21 1999" @with line @ line on @ line loctype world @ line g0 @ line 0.1, 0.475, 0.875, 0.475 @ line linewidth 0.5 @ line linestyle 6 @ line color 1 @ line arrow 0 @ line arrow type 0 @ line arrow length 2.000000 @ line arrow layout 1.000000, 0.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.45, 0.32, 0.45, 0.175 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow type 0 @ line arrow length 2.000000 @ line arrow layout 1.000000, 0.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.85, 0.495, 0.85, 0.175 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow type 0 @ line arrow length 2.000000 @ line arrow layout 1.000000, 0.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.55, 0.46, 0.55, 0.225 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow type 0 @ line arrow length 2.000000 @ line arrow layout 1.000000, 0.000000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.45, 0.185, 0.85, 0.185 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 3 @ line arrow type 1 @ line arrow length 2.000000 @ line arrow layout 0.500000, 0.200000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.45, 0.24, 0.55, 0.24 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 3 @ line arrow type 1 @ line arrow length -2.000000 @ line arrow layout 0.500000, 0.200000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.47, 0.3, 0.4, 0.3 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow type 1 @ line arrow length 2.000000 @ line arrow layout 0.500000, 0.200000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.47, 0.65, 0.4, 0.65 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow type 1 @ line arrow length 2.000000 @ line arrow layout 0.500000, 0.200000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.415, 0.65, 0.415, 0.3 @ line linewidth 0.5 @ line linestyle 1 @ line color 1 @ line arrow 3 @ line arrow type 1 @ line arrow length 2.000000 @ line arrow layout 0.500000, 0.200000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.1, 0.64, 0.25, 0.85 @ line linewidth 1.0 @ line linestyle 1 @ line color 2 @ line arrow 3 @ line arrow type 1 @ line arrow length 3.000000 @ line arrow layout 1.000000, 0.400000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.34, 0.86, 0.45, 0.8 @ line linewidth 2.0 @ line linestyle 3 @ line color 3 @ line arrow 2 @ line arrow type 2 @ line arrow length 3.000000 @ line arrow layout 0.800000, -0.300000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.08, 0.32, 0.25, 0.15 @ line linewidth 6.0 @ line linestyle 5 @ line color 14 @ line arrow 2 @ line arrow type 2 @ line arrow length 4.000000 @ line arrow layout 2.000000, 0.400000 @line def @with line @ line on @ line loctype world @ line g0 @ line 0.7, 0.85, 0.85, 0.85 @ line linewidth 3.0 @ line linestyle 1 @ line color 8 @ line arrow 2 @ line arrow type 0 @ line arrow length 3.000000 @ line arrow layout 0.900000, 0.000000 @line def @with string @ string on @ string loctype world @ string g0 @ string 0.6625, 0.2 @ string color 1 @ string rot 0 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "L" @with string @ string on @ string loctype world @ string g0 @ string 0.5, 0.255 @ string color 1 @ string rot 0 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "l" @with string @ string on @ string loctype world @ string g0 @ string 0.395, 0.53 @ string color 1 @ string rot 90 @ string font 0 @ string just 2 @ string char size 1.000000 @ string def "d" @with string @ string on @ string loctype world @ string g0 @ string 0.24, 0.74 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.800000 @ string def "The arrow shape is defined by the three parameters:" @with string @ string on @ string loctype world @ string g0 @ string 0.24, 0.7 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.800000 @ string def "length (\+\f{Times-Roman}L\f{}\N), and two layout form factors, \+\f{Times-Roman}d/L\f{}\N and \+\f{Times-Roman}l/L\f{}\N" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Fixed @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 0.9 @ world ymin 0.3 @ world ymax 0.7 @ stack world 0, 0, 0, 0 @ view xmin 0.100000 @ view xmax 0.900000 @ view ymin 0.100000 @ view ymax 0.850000 @ title "Anatomy of arrows" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis off @ yaxis off @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 10.0 @ frame color 11 @ frame pattern 26 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 4 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 1 @ s0 fill rule 0 @ s0 fill color 4 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar type both @ s0 errorbar length 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 comment "Editor" @ s0 legend "" @target G0.S0 @type xy 0.15 0.5 0.55 0.5 0.45 0.65 0.85 0.475 0.45 0.3 0.55 0.45 0.15 0.45 0.1525 0.46 0.1475 0.47 0.1525 0.48 0.1475 0.49 0.15 0.5 & grace-5.1.23/examples/tfonts.agr0000644000076500001440000001554506744165772016312 0ustar fnevgenyusers# Grace project file # @version 50000 @page size 700 600 @page scroll 5% @page inout 5% @link page off @default linestyle 1 @default linewidth 1 @default color 1 @default char size 1.000000 @default font 4 @default font source 0 @default symbol size 1.000000 @timestamp off @timestamp 0.03, 0.03 @timestamp linewidth 1 @timestamp color 1 @timestamp rot 0 @timestamp font 4 @timestamp char size 1.000000 @timestamp def "Sun Dec 7 00:39:47 1997" @g0 off @with string @ string on @ string loctype view @ string 0.01, 0.91 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.83 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 1 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.75 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 2 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.67 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 3 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.59 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.51 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.43 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 6 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.35 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 7 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.27 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.700000 @ string def " ! #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.01, 0.19 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.700000 @ string def "\c#$%&'()*+,-./013456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnoqrstuvwxyz{|}~" @with string @ string on @ string loctype view @ string 0.051378, 0.951535 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Times-Roman" @with string @ string on @ string loctype view @ string 0.05, 0.862682 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Times-Bold" @with string @ string on @ string loctype view @ string 0.05, 0.785137 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Times-Italic" @with string @ string on @ string loctype view @ string 0.05, 0.702746 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Times-BoldItalic" @with string @ string on @ string loctype view @ string 0.05, 0.625202 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Helvetica" @with string @ string on @ string loctype view @ string 0.05, 0.53958 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Helvetica-Bold" @with string @ string on @ string loctype view @ string 0.05, 0.46042 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Helvetica-Oblique" @with string @ string on @ string loctype view @ string 0.05, 0.382876 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Helvetica-BoldOblique" @with string @ string on @ string loctype view @ string 0.05, 0.305331 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Symbol (lower 128 chars)" @with string @ string on @ string loctype view @ string 0.05, 0.221325 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 0.700000 @ string def "Symbol (continuation, upper 128 chars)" @with string @ string on @ string loctype view @ string 0.261905, 0.129241 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 5 @ string just 0 @ string char size 1.120000 @ string def "Fonts and font mappings" @with string @ string on @ string loctype view @ string 0.037594, 0.077544 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.920000 @ string def "Grace no longer uses the Hershey fonts for drawing text on the screen." @with string @ string on @ string loctype view @ string 0.037594, 0.048465 @ string linewidth 1 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.920000 @ string def "There should be no discrepancies between the display and hardcopy outputs." grace-5.1.23/examples/reciprocal.agr0000644000076500001440000004565707350734372017117 0ustar fnevgenyusers# Grace project file # @version 50104 @page size 792, 612 @description "An example of using reciprocal axis" @description "scale." @description "" @description "By Nels Dumin (nels.dumin@ieee.org)" @description "15/09/2001." @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @map color 16 to (188, 143, 143), "brown" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.15, 0.007 @timestamp color 1 @timestamp rot 0 @timestamp font 4 @timestamp char size 0.850000 @timestamp def "Sat Sep 15 21:53:19 2001" @with string @ string on @ string loctype view @ string 0.675, 0.8 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.850000 @ string def "\f{Times-Roman}Data is from the sixth edition of \f{Times-Italic}College Chemistry\nWith Qualitative Analysis\f{Times-Roman}, by Nebergall, Holtzclaw,\nand Robinson, published in 1980 by D. C. Heath &\nCompany, Lexington, Massachusetts (pp. 383-384).\n\n\nThe activation energy is estimated to be 185 kJ/mol." @with string @ string on @ string loctype view @ string 0.18, 0.58 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.850000 @ string def "E\sa\N = -\m{0}\v{0.6} d ln (k)\M{0}\v{-0.6} d (1/T)\M{0}\v{0.44} \u \U\N \f{Symbol}»\f{} 185 kJ/mol" @with string @ string on @ string loctype view @ string 0.06, 0.35 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.850000 @ string def "1) Plot the data using T (in Kelvin), instead of 1/T\n\n2) Select \"Invert axis\"\n\n3) Assign special tick labels for °C\n\n or\n\n Apply axis transform \"$t -273.15\"\n\n" @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0.001 @ world xmax 0.002 @ world ymin 1e-07 @ world ymax 0.1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.150000 @ view xmax 0.625000 @ view ymin 0.525000 @ view ymax 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Typical Arrhenius Plot Using 1/T" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "Temperature [ K\S-1\N ]" @ xaxis label layout para @ xaxis label place spec @ xaxis label place 0.000000, 0.080000 @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.0002 @ xaxis tick minor ticks 9 @ xaxis tick default 6 @ xaxis tick place rounded false @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "Reaction Rate Constant (k)\n [ liter / (mol · sec) ]" @ yaxis label layout para @ yaxis label place spec @ yaxis label place 0.000000, 0.100000 @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 9 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format power @ yaxis ticklabel prec 0 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend 0.85, 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "Editor" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "1 deg fit of set 0" @ s1 legend "" @g1 on @g1 hidden false @g1 type XY @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 473.15 @ world xmax 873.15 @ world ymin 1e-07 @ world ymax 0.1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.775000 @ view xmax 1.250000 @ view ymin 0.150000 @ view ymax 0.475000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Replotted With Reciprocal T-Axis" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Reciprocal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "Temperature [°C]" @ xaxis label layout para @ xaxis label place spec @ xaxis label place 0.000000, 0.080000 @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 100 @ xaxis tick minor ticks 9 @ xaxis tick default 6 @ xaxis tick place rounded false @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "$t-273.15" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "Reaction Rate Constant (k)\n [ liter / (mol · sec) ]" @ yaxis label layout para @ yaxis label place spec @ yaxis label place 0.000000, 0.100000 @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 9 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format power @ yaxis ticklabel prec 0 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend 0.85, 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "copy of set G0.S0" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "copy of set G0.S1" @ s1 legend "" @target G0.S0 @type xy 0.0018018018 3.52e-07 0.0017391304 1.22e-06 0.0015503876 8.59e-05 0.0014285714 0.00116 0.0012804097 0.0395 & @target G0.S1 @type xy 0.001 18.474849 0.00105 6.0619994 0.0011 1.9890737 0.00115 0.65265832 0.0012 0.21415138 0.00125 0.070267721 0.0013 0.023056366 0.00135 0.0075652948 0.0014 0.0024823376 0.00145 0.00081450892 0.0015 0.00026725808 0.00155 8.7693182e-05 0.0016 2.8774039e-05 0.00165 9.4413874e-06 0.0017 3.0979244e-06 0.00175 1.0164963e-06 0.0018 3.3353453e-07 0.00185 1.0943993e-07 0.0019 3.5909618e-08 0.00195 1.1782726e-08 0.002 3.8661685e-09 & @target G1.S0 @type xy 555 3.52e-07 575 1.22e-06 645 8.59e-05 700 0.00116 781 0.0395 & @target G1.S1 @type xy 1000 18.474849 952.38095 6.0619994 909.09091 1.9890737 869.56522 0.65265832 833.33333 0.21415138 800 0.070267721 769.23077 0.023056366 740.74074 0.0075652948 714.28571 0.0024823376 689.65517 0.00081450892 666.66667 0.00026725808 645.16129 8.7693182e-05 625 2.8774039e-05 606.06061 9.4413874e-06 588.23529 3.0979244e-06 571.42857 1.0164963e-06 555.55556 3.3353453e-07 540.54054 1.0943993e-07 526.31579 3.5909618e-08 512.82051 1.1782726e-08 500 3.8661685e-09 & grace-5.1.23/examples/log2log.agr0000644000076500001440000002050510565430266016317 0ustar fnevgenyusers# Grace project file # @version 50121 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Feb 16 00:17:35 2007" @r0 off @link r0 to g0 @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 off @link r1 to g0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 off @link r2 to g0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 off @link r3 to g0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 off @link r4 to g0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format computing engineering @g0 fixedpoint prec 4, 3 @with g0 @ world 0.5, 1e-05, 8388608, 0.1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view 0.150000, 0.150000, 1.150000, 0.850000 @ title "TCP/IP Network Latency" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Test of Engineering and Computing tick label formats" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Logarithmic @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "message size (bytes)" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 4 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format computing @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "time" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 8 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format engineering @ yaxis ticklabel prec 0 @ yaxis ticklabel formula "" @ yaxis ticklabel append "s" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend 0.85, 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 3 @ s0 symbol size 1.000000 @ s0 symbol color 4 @ s0 symbol pattern 1 @ s0 symbol fill color 4 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 80 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 0 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 4 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "loglog.agr" @ s0 legend "" @target G0.S0 @type xy 0 3.012e-05 1 3.023e-05 2 3.521e-05 4 3.035e-05 8 3.575e-05 16 3.113e-05 32 3.187e-05 64 3.173e-05 128 3.314e-05 256 3.695e-05 512 4.359e-05 1024 5.842e-05 2048 7.543e-05 4096 9.457e-05 8192 0.00013825 16384 0.00021383 32768 0.00035716 65536 0.00065037 131072 0.00122419 262144 0.00234661 524288 0.00456522 1048576 0.00899682 2097152 0.01784503 4194304 0.03551839 & grace-5.1.23/examples/logistic.agr0000644000076500001440000003301106766566062016577 0ustar fnevgenyusers# Grace project file # @version 50004 @page size 792, 612 @page scroll 95% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Sep 12 01:52:41 1999" @with string @ string on @ string loctype view @ string 0.0776470588235, 0.339256865913 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Non-linear curve fitting:" @with string @ string on @ string loctype view @ string 0.0776470588235, 0.306946688207 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "The function above is a sample from a logistic curve defined as" @with string @ string on @ string loctype view @ string 0.0776470588235, 0.273021001616 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "y=1/(1+exp(-(x-a0)/a1)) for x in [-10,20] with a0=5 and a1=3." @with string @ string on @ string loctype view @ string 0.0776470588235, 0.24071082391 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "To fit the parameters a0 and a1, open Data/Transformations/Non-linear" @with string @ string on @ string loctype view @ string 0.0776470588235, 0.208400646204 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "curve fitting. Enter items as requested, use initial guesses of a0=1 and" @with string @ string on @ string loctype view @ string 0.0776470588235, 0.176090468498 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "a1=1 - make sure the item '# of parameters' is 2. For the function," @with string @ string on @ string loctype view @ string 0.0776470588235, 0.143780290792 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "use the definition above i.e., y=1/(1+exp(-(x-a0)/a1))." @with string @ string on @ string loctype view @ string 0.0776470588235, 0.111450290792 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Alternatively, from File/Open select 'logistic.fit'." @with string @ string on @ string loctype view @ string 0.077647058824, 0.07 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Use 'Edit/Load current fit' to see the initial guess. Press 'Apply'. Curves should coinside." @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin -10 @ world xmax 20 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 @ view xmin 0.191361 @ view xmax 1.102756 @ view ymin 0.468498 @ view ymax 0.848142 @ title "" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 10 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 1.03529411765 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 0 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 0 @ s0 symbol char font 2 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 0 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 2 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 2.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "logistic.d" @ s0 legend "" @target G0.S0 @type xy -10 0.006693 -9.69697 0.007399 -9.393939 0.008179 -9.090909 0.00904 -8.787879 0.009992 -8.484848 0.011042 -8.181818 0.012201 -7.878788 0.013481 -7.575758 0.014892 -7.272727 0.016449 -6.969697 0.018165 -6.666667 0.020058 -6.363636 0.022142 -6.060606 0.024438 -5.757576 0.026966 -5.454545 0.029746 -5.151515 0.032804 -4.848485 0.036165 -4.545455 0.039856 -4.242424 0.043906 -3.939394 0.048347 -3.636364 0.053212 -3.333333 0.058537 -3.030303 0.064358 -2.727273 0.070715 -2.424242 0.077648 -2.121212 0.085197 -1.818182 0.093407 -1.515152 0.102319 -1.212121 0.111977 -0.909091 0.122421 -0.606061 0.133694 -0.30303 0.145831 0 0.158869 0.30303 0.172836 0.606061 0.187758 0.909091 0.20365 1.212121 0.220522 1.515152 0.238374 1.818182 0.257194 2.121212 0.276959 2.424242 0.297635 2.727273 0.319173 3.030303 0.341512 3.333333 0.364576 3.636364 0.388281 3.939394 0.412525 4.242424 0.437202 4.545455 0.462194 4.848485 0.487376 5.151515 0.512624 5.454545 0.537806 5.757576 0.562798 6.060606 0.587475 6.363636 0.611719 6.666667 0.635424 6.969697 0.658488 7.272727 0.680827 7.575758 0.702365 7.878788 0.723041 8.181818 0.742806 8.484848 0.761626 8.787879 0.779478 9.090909 0.79635 9.393939 0.812242 9.69697 0.827164 10 0.841131 10.30303 0.854169 10.606061 0.866306 10.909091 0.877579 11.212121 0.888023 11.515152 0.897681 11.818182 0.906593 12.121212 0.914803 12.424242 0.922352 12.727273 0.929285 13.030303 0.935642 13.333333 0.941463 13.636364 0.946788 13.939394 0.951653 14.242424 0.956094 14.545455 0.960144 14.848485 0.963835 15.151515 0.967196 15.454545 0.970254 15.757576 0.973034 16.060606 0.975562 16.363636 0.977858 16.666667 0.979942 16.969697 0.981835 17.272727 0.983551 17.575758 0.985108 17.878788 0.986519 18.181818 0.987799 18.484848 0.988958 18.787879 0.990008 19.090909 0.99096 19.393939 0.991821 19.69697 0.992601 20 0.993307 & grace-5.1.23/examples/logtest.par0000644000076500001440000004262506626627163016462 0ustar fnevgenyusers# xvgr parameter file # with g0 g0 ON g0 label OFF g0 hidden FALSE g0 type LOGXY g0 autoscale type AUTO g0 fixedpoint OFF g0 fixedpoint xy 0.000000 , 0.000000 g0 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 1 world xmax 1e+08 world ymin 1 world ymax 1e+08 view xmin 0.200000 view xmax 0.820000 view ymin 0.155714 view ymax 0.470000 title "" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 s0 type XY s0 symbol 0 s0 symbol size 1.000000 s0 skip 0 s0 linestyle 1 s0 linewidth 1 s0 color 1 s0 fill 0 s0 fill color 0 s0 errorbar type BOTH s0 errorbar length 1.000000 s0 errorbar linewidth 1 s0 errorbar linestyle 1 s0 errorbar riser ON s0 errorbar riser linewidth 1 s0 errorbar riser linestyle 1 s0 comment "log.d" s1 type XY s1 symbol 0 s1 symbol size 1.000000 s1 skip 0 s1 linestyle 1 s1 linewidth 1 s1 color 2 s1 fill 0 s1 fill color 0 s1 errorbar type BOTH s1 errorbar length 1.000000 s1 errorbar linewidth 1 s1 errorbar linestyle 1 s1 errorbar riser ON s1 errorbar riser linewidth 1 s1 errorbar riser linestyle 1 s1 comment "log.d" s2 type XY s2 symbol 0 s2 symbol size 1.000000 s2 skip 0 s2 linestyle 1 s2 linewidth 1 s2 color 3 s2 fill 0 s2 fill color 0 s2 errorbar type BOTH s2 errorbar length 1.000000 s2 errorbar linewidth 1 s2 errorbar linestyle 1 s2 errorbar riser ON s2 errorbar riser linewidth 1 s2 errorbar riser linestyle 1 s2 comment "log.d" xaxis tick ON xaxis tick major 10.000000 xaxis tick minor 10.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis label "" xaxis label layout para xaxis label char size 0.000000 xaxis label font 0 xaxis label color 0 xaxis label linewidth 0 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format POWER xaxis ticklabel layout horizontal xaxis ticklabel angle 0 xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 10.000000 yaxis tick minor 5.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis label "" yaxis label layout para yaxis label char size 0.000000 yaxis label font 0 yaxis label color 0 yaxis label linewidth 0 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format EXPONENTIAL yaxis ticklabel layout horizontal yaxis ticklabel angle 0 yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis OFF altyaxis OFF zeroxaxis tick ON zeroxaxis tick major 5.000000 zeroxaxis tick minor 0.000000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 0.000000 zeroxaxis label font 0 zeroxaxis label color 0 zeroxaxis label linewidth 0 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel angle 0 zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op LEFT zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 5.000000 zeroyaxis tick minor 0.000000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 0.000000 zeroyaxis label font 0 zeroyaxis label color 0 zeroyaxis label linewidth 0 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel angle 0 zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 legend string 0 "" legend string 1 "" legend string 2 "" frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 with g1 g1 ON g1 label OFF g1 hidden FALSE g1 type LOGXY g1 autoscale type AUTO g1 fixedpoint OFF g1 fixedpoint xy 0.000000 , 0.000000 g1 fixedpoint type 0 default linestyle 1 default linewidth 1 default color 1 default char size 1.000000 default font 4 default font source 0 default symbol size 1.000000 world xmin 1 world xmax 1000 world ymin .1 world ymax 1000 view xmin 0.200000 view xmax 0.820000 view ymin 0.555714 view ymax 0.870000 title "Test of log plots" title font 4 title size 1.500000 title color 1 subtitle "" subtitle font 4 subtitle size 1.000000 subtitle color 1 s0 type XY s0 symbol 0 s0 symbol size 1.000000 s0 skip 0 s0 linestyle 1 s0 linewidth 1 s0 color 1 s0 fill 0 s0 fill color 0 s0 errorbar type BOTH s0 errorbar length 1.000000 s0 errorbar linewidth 1 s0 errorbar linestyle 1 s0 errorbar riser ON s0 errorbar riser linewidth 1 s0 errorbar riser linestyle 1 s0 comment "log.d" s1 type XY s1 symbol 0 s1 symbol size 1.000000 s1 skip 0 s1 linestyle 1 s1 linewidth 1 s1 color 2 s1 fill 0 s1 fill color 0 s1 errorbar type BOTH s1 errorbar length 1.000000 s1 errorbar linewidth 1 s1 errorbar linestyle 1 s1 errorbar riser ON s1 errorbar riser linewidth 1 s1 errorbar riser linestyle 1 s1 comment "log.d" s2 type XY s2 symbol 0 s2 symbol size 1.000000 s2 skip 0 s2 linestyle 1 s2 linewidth 1 s2 color 3 s2 fill 0 s2 fill color 0 s2 errorbar type BOTH s2 errorbar length 1.000000 s2 errorbar linewidth 1 s2 errorbar linestyle 1 s2 errorbar riser ON s2 errorbar riser linewidth 1 s2 errorbar riser linestyle 1 s2 comment "log.d" xaxis tick ON xaxis tick major 10.000000 xaxis tick minor 1.000000 xaxis tick offsetx 0.000000 xaxis tick offsety 0.000000 xaxis tick alt OFF xaxis tick min 0.000000 xaxis tick max 1.000000 xaxis label "" xaxis label layout para xaxis label char size 0.000000 xaxis label font 0 xaxis label color 0 xaxis label linewidth 0 xaxis ticklabel ON xaxis ticklabel type auto xaxis ticklabel prec 1 xaxis ticklabel format POWER xaxis ticklabel layout horizontal xaxis ticklabel angle 0 xaxis ticklabel skip 0 xaxis ticklabel op BOTTOM xaxis ticklabel sign NORMAL xaxis ticklabel start type AUTO xaxis ticklabel start 0.000000 xaxis ticklabel stop type AUTO xaxis ticklabel stop 0.000000 xaxis ticklabel char size 1.000000 xaxis ticklabel font 1 xaxis ticklabel color 1 xaxis ticklabel linewidth 1 xaxis tick major ON xaxis tick minor ON xaxis tick default 6 xaxis tick IN xaxis tick major color 1 xaxis tick major linewidth 1 xaxis tick major linestyle 1 xaxis tick minor color 1 xaxis tick minor linewidth 1 xaxis tick minor linestyle 1 xaxis tick log OFF xaxis tick size 1.000000 xaxis tick minor size 0.500000 xaxis bar OFF xaxis bar color 1 xaxis bar linestyle 1 xaxis bar linewidth 1 xaxis tick major grid OFF xaxis tick minor grid OFF xaxis tick op BOTH xaxis tick type auto xaxis tick spec 0 yaxis tick ON yaxis tick major 10.000000 yaxis tick minor 1.000000 yaxis tick offsetx 0.000000 yaxis tick offsety 0.000000 yaxis tick alt OFF yaxis tick min 0.000000 yaxis tick max 1.000000 yaxis label "" yaxis label layout para yaxis label char size 0.000000 yaxis label font 0 yaxis label color 0 yaxis label linewidth 0 yaxis ticklabel ON yaxis ticklabel type auto yaxis ticklabel prec 1 yaxis ticklabel format DECIMAL yaxis ticklabel layout horizontal yaxis ticklabel angle 0 yaxis ticklabel skip 0 yaxis ticklabel op LEFT yaxis ticklabel sign NORMAL yaxis ticklabel start type AUTO yaxis ticklabel start 0.000000 yaxis ticklabel stop type AUTO yaxis ticklabel stop 0.000000 yaxis ticklabel char size 1.000000 yaxis ticklabel font 1 yaxis ticklabel color 1 yaxis ticklabel linewidth 1 yaxis tick major ON yaxis tick minor ON yaxis tick default 6 yaxis tick IN yaxis tick major color 1 yaxis tick major linewidth 1 yaxis tick major linestyle 1 yaxis tick minor color 1 yaxis tick minor linewidth 1 yaxis tick minor linestyle 1 yaxis tick log OFF yaxis tick size 1.000000 yaxis tick minor size 0.500000 yaxis bar OFF yaxis bar color 1 yaxis bar linestyle 1 yaxis bar linewidth 1 yaxis tick major grid OFF yaxis tick minor grid OFF yaxis tick op BOTH yaxis tick type auto yaxis tick spec 0 altxaxis OFF altyaxis OFF zeroxaxis tick ON zeroxaxis tick major 0.500000 zeroxaxis tick minor 1.000000 zeroxaxis tick offsetx 0.000000 zeroxaxis tick offsety 0.000000 zeroxaxis tick alt OFF zeroxaxis tick min 0.000000 zeroxaxis tick max 1.000000 zeroxaxis label "" zeroxaxis label layout para zeroxaxis label char size 0.000000 zeroxaxis label font 0 zeroxaxis label color 0 zeroxaxis label linewidth 0 zeroxaxis ticklabel OFF zeroxaxis ticklabel type auto zeroxaxis ticklabel prec 1 zeroxaxis ticklabel format DECIMAL zeroxaxis ticklabel layout horizontal zeroxaxis ticklabel angle 0 zeroxaxis ticklabel skip 0 zeroxaxis ticklabel op LEFT zeroxaxis ticklabel sign NORMAL zeroxaxis ticklabel start type AUTO zeroxaxis ticklabel start 0.000000 zeroxaxis ticklabel stop type AUTO zeroxaxis ticklabel stop 0.000000 zeroxaxis ticklabel char size 1.000000 zeroxaxis ticklabel font 1 zeroxaxis ticklabel color 1 zeroxaxis ticklabel linewidth 1 zeroxaxis tick major OFF zeroxaxis tick minor ON zeroxaxis tick default 6 zeroxaxis tick IN zeroxaxis tick major color 1 zeroxaxis tick major linewidth 1 zeroxaxis tick major linestyle 1 zeroxaxis tick minor color 1 zeroxaxis tick minor linewidth 1 zeroxaxis tick minor linestyle 1 zeroxaxis tick log OFF zeroxaxis tick size 1.000000 zeroxaxis tick minor size 0.500000 zeroxaxis bar OFF zeroxaxis bar color 1 zeroxaxis bar linestyle 1 zeroxaxis bar linewidth 1 zeroxaxis tick major grid OFF zeroxaxis tick minor grid OFF zeroxaxis tick op BOTH zeroxaxis tick type auto zeroxaxis tick spec 0 zeroyaxis tick ON zeroyaxis tick major 1.000000 zeroyaxis tick minor 1.000000 zeroyaxis tick offsetx 0.000000 zeroyaxis tick offsety 0.000000 zeroyaxis tick alt OFF zeroyaxis tick min 0.000000 zeroyaxis tick max 1.000000 zeroyaxis label "" zeroyaxis label layout para zeroyaxis label char size 0.000000 zeroyaxis label font 0 zeroyaxis label color 0 zeroyaxis label linewidth 0 zeroyaxis ticklabel OFF zeroyaxis ticklabel type auto zeroyaxis ticklabel prec 1 zeroyaxis ticklabel format DECIMAL zeroyaxis ticklabel layout horizontal zeroyaxis ticklabel angle 0 zeroyaxis ticklabel skip 0 zeroyaxis ticklabel op LEFT zeroyaxis ticklabel sign NORMAL zeroyaxis ticklabel start type AUTO zeroyaxis ticklabel start 0.000000 zeroyaxis ticklabel stop type AUTO zeroyaxis ticklabel stop 0.000000 zeroyaxis ticklabel char size 1.000000 zeroyaxis ticklabel font 1 zeroyaxis ticklabel color 1 zeroyaxis ticklabel linewidth 1 zeroyaxis tick major OFF zeroyaxis tick minor ON zeroyaxis tick default 6 zeroyaxis tick IN zeroyaxis tick major color 1 zeroyaxis tick major linewidth 1 zeroyaxis tick major linestyle 1 zeroyaxis tick minor color 1 zeroyaxis tick minor linewidth 1 zeroyaxis tick minor linestyle 1 zeroyaxis tick log OFF zeroyaxis tick size 1.000000 zeroyaxis tick minor size 0.500000 zeroyaxis bar OFF zeroyaxis bar color 1 zeroyaxis bar linestyle 1 zeroyaxis bar linewidth 1 zeroyaxis tick major grid OFF zeroyaxis tick minor grid OFF zeroyaxis tick op BOTH zeroyaxis tick type auto zeroyaxis tick spec 0 legend OFF legend loctype view legend layout 0 legend vgap 1 legend hgap 1 legend length 4 legend box OFF legend x1 0.800000 legend y1 0.800000 legend font 1 legend char size 1.000000 legend linestyle 1 legend linewidth 1 legend color 1 legend string 0 "" legend string 1 "" legend string 2 "" frame ON frame type 0 frame linestyle 1 frame linewidth 1 frame color 1 frame fill OFF frame background color 0 grace-5.1.23/examples/test2.agr0000644000076500001440000004011207025564030016001 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 2 to "Times-Italic", "Times-Italic" @map font 1 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 6 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 5 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Symbol", "Symbol" @map font 9 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1900 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 4 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Nov 28 05:45:55 1999" @with string @ string on @ string loctype view @ string 0.262058823529, 0.475714 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Sub\sscripts\N and Super\Sscripts" @with string @ string on @ string loctype view @ string 0.572647058824, 0.222857 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "Changing \f{4}fonts \f{1}within a \f{6}string" @with string @ string on @ string loctype view @ string 0.577075163399, 0.743632405229 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\-\-small text \+\+\+\+LARGE TEXT" @with string @ string on @ string loctype view @ string 0.571045751634, 0.284836601307 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "\uUnderlined\U and \ooverlined\O strings" @with string @ string on @ string loctype view @ string 0.572647058824, 0.165 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "Changing \R{2}colors \R{3}within a \R{4}string" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 8 @ world ymin 0 @ world ymax 8 @ stack world 0, 0, 0, 0 @ view xmin 0.194118 @ view xmax 1.100000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "Speedups over one processor - no IO" @ title font 4 @ title size 1.500000 @ title color 1 @ subtitle "Intel IPSC/2" @ subtitle font 4 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 2 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 2 @ xaxis tick minor grid on @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format decimal @ xaxis ticklabel prec 1 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 1 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 2 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 2 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 2 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format decimal @ yaxis ticklabel prec 1 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 1 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.276617647059 @ legend y1 0.772857 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 1 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 1 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 4 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 0 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 4 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 2.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "examples/t.d" @ s0 legend "640 drogues" @ s1 hidden false @ s1 type xy @ s1 symbol 2 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 4 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 0 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 4 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 2.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "examples/t.d" @ s1 legend "1280 drogues" @ s2 hidden false @ s2 type xy @ s2 symbol 3 @ s2 symbol size 1.000000 @ s2 symbol color 3 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 4 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 3 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 0 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 4 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 3 @ s2 errorbar pattern 1 @ s2 errorbar size 2.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "examples/t.d" @ s2 legend "2560 drogues" @ s3 hidden false @ s3 type xy @ s3 symbol 4 @ s3 symbol size 1.000000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 4 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 4 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 0 @ s3 fill rule 0 @ s3 fill color 0 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 4 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 4 @ s3 errorbar pattern 1 @ s3 errorbar size 2.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "examples/t.d" @ s3 legend "5120 drogues" @ s4 hidden false @ s4 type xy @ s4 symbol 5 @ s4 symbol size 1.000000 @ s4 symbol color 5 @ s4 symbol pattern 1 @ s4 symbol fill color 5 @ s4 symbol fill pattern 0 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 4 @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 5 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 0 @ s4 fill rule 0 @ s4 fill color 0 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 4 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar on @ s4 errorbar place both @ s4 errorbar color 5 @ s4 errorbar pattern 1 @ s4 errorbar size 2.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 errorbar riser clip off @ s4 errorbar riser clip length 0.100000 @ s4 comment "examples/t.d" @ s4 legend "10240 drogues" @ s5 hidden false @ s5 type xy @ s5 symbol 7 @ s5 symbol size 1.000000 @ s5 symbol color 6 @ s5 symbol pattern 1 @ s5 symbol fill color 6 @ s5 symbol fill pattern 0 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 4 @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 6 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 0 @ s5 fill rule 0 @ s5 fill color 0 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 4 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar on @ s5 errorbar place both @ s5 errorbar color 6 @ s5 errorbar pattern 1 @ s5 errorbar size 2.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 errorbar riser clip off @ s5 errorbar riser clip length 0.100000 @ s5 comment "examples/t.d" @ s5 legend "20480 drogues" @target G0.S0 @type xy 1 1 2 1.775862 4 2.901408 8 4.204082 & @target G0.S1 @type xy 1 1 2 1.873786 4 3.299145 8 5.361111 & @target G0.S2 @type xy 1 1 2 1.925065 4 3.599034 8 6.313559 & @target G0.S3 @type xy 1 1 2 1.958611 4 3.771208 8 7.019139 & @target G0.S4 @type xy 1 1 2 1.978912 4 3.868351 8 7.420918 & @target G0.S5 @type xy 1 1 2 2.060034 4 4.065674 8 7.911726 & grace-5.1.23/examples/test.dat0000644000076500001440000001454706626627163015750 0ustar fnevgenyusers# # test data set for grtool # 282.553000 -0.167460 282.595000 -0.126310 282.637000 -0.130120 282.678000 -0.119800 282.720000 -0.037540 282.762000 -0.002380 282.803000 -0.022020 282.845000 0.049130 282.887000 0.143210 282.928000 0.120830 282.970000 0.048930 283.012000 -0.005400 283.053000 0.032100 283.095000 0.112180 283.137000 0.184520 283.178000 0.172540 283.220000 0.146710 283.262000 0.095280 283.303000 0.005320 283.345000 -0.157820 283.387000 -0.195990 283.428000 -0.041310 283.470000 0.025790 283.512000 0.016070 283.553000 0.035670 283.595000 0.056150 283.637000 0.055440 283.678000 0.056190 283.720000 0.026470 283.762000 -0.030040 283.803000 0.017780 283.845000 0.088130 283.887000 -0.046750 283.928000 -0.066710 283.970000 -0.104480 284.012000 -0.071790 284.053000 -0.002780 284.095000 0.013930 284.137000 -0.063730 284.178000 -0.059800 284.220000 -0.100280 284.262000 -0.112140 284.303000 -0.041790 284.345000 -0.007060 284.387000 0.057740 284.428000 0.113100 284.470000 0.050710 284.512000 -0.057340 284.553000 -0.012740 284.595000 0.025120 284.637000 0.048770 284.678000 0.048370 284.720000 0.076710 284.762000 0.030630 284.803000 -0.060480 284.845000 -0.018100 284.887000 -0.037500 284.928000 -0.098330 284.970000 -0.117420 285.012000 -0.106430 285.053000 -0.093610 285.095000 -0.074520 285.137000 -0.083970 285.178000 -0.086710 285.220000 -0.077700 285.262000 -0.101350 285.303000 -0.122780 285.345000 -0.049960 285.387000 -0.001350 285.428000 0.032540 285.470000 -0.036590 285.512000 -0.114440 285.553000 -0.130160 285.595000 -0.110630 285.637000 -0.082060 285.678000 -0.070710 285.720000 -0.038020 285.762000 -0.017700 285.803000 -0.015630 285.845000 -0.004290 285.887000 0.019290 285.928000 -0.002260 285.970000 -0.010120 286.012000 0.047060 286.053000 -0.028170 286.095000 -0.086350 286.137000 -0.077060 286.178000 -0.088890 286.220000 -0.109050 286.262000 -0.078890 286.303000 -0.108570 286.345000 -0.168810 286.387000 -0.035830 286.428000 0.007380 286.470000 -0.142860 286.512000 -0.094130 286.553000 0.037020 286.595000 -0.006710 286.637000 -0.082140 286.678000 -0.135790 286.720000 -0.176670 286.762000 -0.143020 286.803000 -0.172220 286.845000 -0.146470 286.887000 0.004050 286.928000 0.109010 286.970000 0.093810 & 282.553000 0.015561 282.595000 0.014710 282.637000 0.013859 282.678000 0.013028 282.720000 0.012177 282.762000 0.011325 282.803000 0.010494 282.845000 0.009643 282.887000 0.008792 282.928000 0.007961 282.970000 0.007110 283.012000 0.006259 283.053000 0.005428 283.095000 0.004577 283.137000 0.003726 283.178000 0.002895 283.220000 0.002044 283.262000 0.001192 283.303000 0.000362 283.345000 -0.000490 283.387000 -0.001341 283.428000 -0.002172 283.470000 -0.003023 283.512000 -0.003874 283.553000 -0.004705 283.595000 -0.005556 283.637000 -0.006407 283.678000 -0.007238 283.720000 -0.008089 283.762000 -0.008940 283.803000 -0.009771 283.845000 -0.010623 283.887000 -0.011474 283.928000 -0.012305 283.970000 -0.013156 284.012000 -0.014007 284.053000 -0.014838 284.095000 -0.015689 284.137000 -0.016540 284.178000 -0.017371 284.220000 -0.018222 284.262000 -0.019073 284.303000 -0.019904 284.345000 -0.020755 284.387000 -0.021607 284.428000 -0.022438 284.470000 -0.023289 284.512000 -0.024140 284.553000 -0.024971 284.595000 -0.025822 284.637000 -0.026673 284.678000 -0.027504 284.720000 -0.028355 284.762000 -0.029206 284.803000 -0.030037 284.845000 -0.030888 284.887000 -0.031740 284.928000 -0.032570 284.970000 -0.033422 285.012000 -0.034273 285.053000 -0.035104 285.095000 -0.035955 285.137000 -0.036806 285.178000 -0.037637 285.220000 -0.038488 285.262000 -0.039339 285.303000 -0.040170 285.345000 -0.041021 285.387000 -0.041873 285.428000 -0.042703 285.470000 -0.043555 285.512000 -0.044406 285.553000 -0.045237 285.595000 -0.046088 285.637000 -0.046939 285.678000 -0.047770 285.720000 -0.048621 285.762000 -0.049472 285.803000 -0.050303 285.845000 -0.051154 285.887000 -0.052005 285.928000 -0.052836 285.970000 -0.053688 286.012000 -0.054539 286.053000 -0.055370 286.095000 -0.056221 286.137000 -0.057072 286.178000 -0.057903 286.220000 -0.058754 286.262000 -0.059605 286.303000 -0.060436 286.345000 -0.061287 286.387000 -0.062138 286.428000 -0.062969 286.470000 -0.063820 286.512000 -0.064672 286.553000 -0.065502 286.595000 -0.066354 286.637000 -0.067205 286.678000 -0.068036 286.720000 -0.068887 286.762000 -0.069738 286.803000 -0.070569 286.845000 -0.071420 286.887000 -0.072271 286.928000 -0.073102 286.970000 -0.073953 & 282.740500 -0.029246 282.782500 -0.007607 282.824500 0.004484 282.865500 0.020706 282.907500 0.043904 282.949500 0.066110 282.990500 0.083602 283.032500 0.100475 283.074500 0.105090 283.115500 0.091301 283.157500 0.063436 283.199500 0.038944 283.240500 0.035353 283.282500 0.034722 283.324500 0.025111 283.365500 0.010226 283.407500 -0.001413 283.449500 -0.010540 283.490500 -0.014449 283.532500 -0.012334 283.574500 0.000444 283.615500 0.021821 283.657500 0.034765 283.699500 0.027511 283.740500 0.019233 283.782500 0.005218 283.824500 -0.007576 283.865500 -0.013398 283.907500 -0.017624 283.949500 -0.026644 283.990500 -0.029620 284.032500 -0.041426 284.074500 -0.061453 284.115500 -0.060957 284.157500 -0.054992 284.199500 -0.038770 284.240500 -0.020281 284.282500 -0.014932 284.324500 -0.022059 284.365500 -0.016960 284.407500 -0.008468 284.449500 0.006437 284.490500 0.022488 284.532500 0.034338 284.574500 0.038107 284.615500 0.026285 284.657500 0.013165 284.699500 0.004344 284.740500 0.000245 284.782500 -0.010223 284.824500 -0.023378 284.865500 -0.037616 284.907500 -0.049905 284.949500 -0.065973 284.990500 -0.077707 285.032500 -0.079429 285.074500 -0.087754 285.115500 -0.096282 285.157500 -0.091445 285.199500 -0.079838 285.240500 -0.065941 285.282500 -0.060239 285.324500 -0.064231 285.365500 -0.068850 285.407500 -0.071242 285.449500 -0.071678 285.490500 -0.068614 285.532500 -0.060138 285.574500 -0.056912 285.615500 -0.058340 285.657500 -0.062023 285.699500 -0.056435 285.740500 -0.045217 285.782500 -0.033213 285.824500 -0.017444 285.865500 -0.012055 285.907500 -0.013619 285.949500 -0.017523 285.990500 -0.024642 286.032500 -0.033984 286.074500 -0.041444 286.115500 -0.054230 286.157500 -0.070885 286.199500 -0.073456 286.240500 -0.077424 286.282500 -0.088893 286.324500 -0.089671 286.365500 -0.078263 286.407500 -0.070045 286.449500 -0.067354 286.490500 -0.073044 286.532500 -0.079854 286.574500 -0.077275 286.615500 -0.090914 286.657500 -0.106299 286.699500 -0.091608 286.740500 -0.071294 286.782500 -0.065615 grace-5.1.23/examples/motif.agr0000644000076500001440000002761506757640725016114 0ustar fnevgenyusers# Grace project file # @version 50003 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sat Aug 14 21:47:19 1999" @with box @ box on @ box loctype view @ box 0.68, 0.63, 1.13, 0.83 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 7 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.691176470588, 0.77614379085, 1.12091503268, 0.638888888889 @ box linestyle 1 @ box linewidth 1.0 @ box color 8 @ box fill color 0 @ box fill pattern 1 @box def @with ellipse @ ellipse on @ ellipse loctype view @ ellipse 1.075, 0.1125, 1.225, 0.1875 @ ellipse linestyle 1 @ ellipse linewidth 2.0 @ ellipse color 11 @ ellipse fill color 1 @ ellipse fill pattern 0 @ellipse def @with string @ string on @ string loctype view @ string 0.1, 0.08 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "No, it's \+NOT\N a Y2K bug :-). The 2-digit year format is set in \"Edit/Preferences\" popup (off by default)." @with string @ string on @ string loctype view @ string 0.7, 0.75 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.750000 @ string def "1998-05-15 4365 \"xmgr-4.1.2\"" @with string @ string on @ string loctype view @ string 0.7, 0.725 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.750000 @ string def "1998-06-30 3761 \"grace-5.0.0\"" @with string @ string on @ string loctype view @ string 0.7, 0.7 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.750000 @ string def "1998-09-15 3703 \"grace-5.0.1\"" @with string @ string on @ string loctype view @ string 0.7, 0.675 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.750000 @ string def "1999-03-20 3188 \"grace-5.0.2\"" @with string @ string on @ string loctype view @ string 0.7, 0.65 @ string color 1 @ string rot 0 @ string font 8 @ string just 0 @ string char size 0.750000 @ string def "1999-08-22 2223 \"grace-5.0.3\"" @with string @ string on @ string loctype view @ string 0.702614379085, 0.795751633987 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "The input file looked like this:" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format mmddyy decimal @g0 fixedpoint prec 6, 0 @with g0 @ world xmin 2450907.5 @ world xmax 2451546.5 @ world ymin 0 @ world ymax 5000 @ stack world 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 1.150000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "C source lines with Motif\f{Symbol}ä\f{}/Xt calls" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "(an example of using strings to annotate data values)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 91.25 @ xaxis tick minor ticks 2 @ xaxis tick default 6 @ xaxis tick place rounded false @ xaxis tick in @ xaxis tick major size 0.750000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format monthsy @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place normal @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 1000 @ yaxis tick minor ticks 0 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 3 @ yaxis tick major linewidth 0.5 @ yaxis tick major linestyle 3 @ yaxis tick major grid on @ yaxis tick minor color 3 @ yaxis tick minor linewidth 0.5 @ yaxis tick minor linestyle 3 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 5 @ yaxis ticklabel format general @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 15 @ s0 symbol pattern 1 @ s0 symbol fill color 9 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 2.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 3 @ s0 line linewidth 6.0 @ s0 line color 7 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 4 @ s0 avalue char size 0.800000 @ s0 avalue font 0 @ s0 avalue color 12 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar off @ s0 errorbar place normal @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "/tmp/a.dat" @ s0 legend "" @ s1 hidden false @ s1 type bar @ s1 symbol 0 @ s1 symbol size 1.500000 @ s1 symbol color 15 @ s1 symbol pattern 1 @ s1 symbol fill color 9 @ s1 symbol fill pattern 1 @ s1 symbol linewidth 2.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 6.0 @ s1 line color 7 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue on @ s1 avalue type 4 @ s1 avalue char size 0.800000 @ s1 avalue font 0 @ s1 avalue color 12 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place normal @ s1 errorbar color 1 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "/tmp/a.dat" @ s1 legend "" @target G0.S0 @type xy 2451412.5 2223 2451544.5 0 & @target G0.S1 @type bar 2450948.5 4365 "xmgr-4.1.2" 2450994.5 3761 "grace-5.0.0" 2451071.5 3703 "grace-5.0.1" 2451257.5 3188 "grace-5.0.2" 2451412.5 2223 "grace-5.0.3" & grace-5.1.23/examples/boxplot.agr0000644000076500001440000003266107052641352016444 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @description "This sample is based on a real data processed with the" @description "\"gracebox\" script by Stewart Rounds." @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Thu Feb 17 02:28:30 2000" @with line @ line on @ line loctype view @ line 0.718954248366, 0.661764705882, 0.62, 0.53 @ line linewidth 1.0 @ line linestyle 1 @ line color 1 @ line arrow 2 @ line arrow type 2 @ line arrow length 1.000000 @ line arrow layout 1.000000, -0.300000 @line def @with string @ string on @ string loctype view @ string 0.72, 0.66 @ string color 1 @ string rot 0 @ string font 4 @ string just 6 @ string char size 0.800000 @ string def "\m{0}The whisker properties are controlled by\M{0}\v{-1}\"Plot/Set appearance/Error bars\"" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format decimal general @g0 fixedpoint prec 0, 6 @with g0 @ world xmin 0 @ world xmax 13 @ world ymin 100 @ world ymax 10000 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.150000 @ view xmax 1.150000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "Daily Mean Streamflow" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "(a sample of BoxPlot)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick both @ xaxis tick major size 0.200000 @ xaxis tick major color 1 @ xaxis tick major linewidth 6.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type spec @ xaxis ticklabel start 1.000000 @ xaxis ticklabel stop type spec @ xaxis ticklabel stop 12.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place normal @ xaxis tick spec type both @ xaxis tick spec 12 @ xaxis tick major 0, 1 @ xaxis ticklabel 0, "\R{blue}Jan" @ xaxis tick major 1, 2 @ xaxis ticklabel 1, "\R{blue}Feb" @ xaxis tick major 2, 3 @ xaxis ticklabel 2, "\R{magenta}Mar" @ xaxis tick major 3, 4 @ xaxis ticklabel 3, "\R{magenta}Apr" @ xaxis tick major 4, 5 @ xaxis ticklabel 4, "\R{magenta}May" @ xaxis tick major 5, 6 @ xaxis ticklabel 5, "\R{green}Jun" @ xaxis tick major 6, 7 @ xaxis ticklabel 6, "\R{green}Jul" @ xaxis tick major 7, 8 @ xaxis ticklabel 7, "\R{green}Aug" @ xaxis tick major 8, 9 @ xaxis ticklabel 8, "\R{orange}Sep" @ xaxis tick major 9, 10 @ xaxis ticklabel 9, "\R{orange}Oct" @ xaxis tick major 10, 11 @ xaxis ticklabel 10, "\R{orange}Nov" @ xaxis tick major 11, 12 @ xaxis ticklabel 11, "\R{blue}Dec" @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick off @ yaxis tick major 10 @ yaxis tick minor ticks 8 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 7 @ yaxis tick major linewidth 0.5 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 7 @ yaxis tick minor linewidth 0.5 @ yaxis tick minor linestyle 3 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format engineering @ yaxis ticklabel prec 0 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xyboxplot @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 4 @ s0 symbol pattern 1 @ s0 symbol fill color 9 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 5.0 @ s0 line color 12 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 14 @ s0 errorbar pattern 1 @ s0 errorbar size 0.500000 @ s0 errorbar linewidth 2.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "box.gr" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 9 @ s1 symbol size 0.650000 @ s1 symbol color 11 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 0 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 2 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 0 @ s1 fill rule 0 @ s1 fill color 1 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "box.gr" @ s1 legend "" @ s2 hidden false @ s2 type xy @ s2 symbol 1 @ s2 symbol size 0.500000 @ s2 symbol color 2 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 0 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 3 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 0 @ s2 fill rule 0 @ s2 fill color 1 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 3 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "box.gr" @ s2 legend "" @target G0.S0 @type xyboxplot 1 2010 1130 3940 768 4400 2 917 782 1400 666 2110 3 2010 1360 2480 716 3190 4 2495 2140 3522.5 1450 3810 5 1200 832 1650 709 2330 6 579.5 398.5 939 309 1410 7 235 210 248 173 290 8 141 125 160 110 211 9 176.5 147.25 270.25 110 296 10 165 142 202 115 262 11 187.5 171 203.5 161 250 12 914 540 2170 442 3470 & @target G0.S1 @type xy 2 2960 2 2530 7 147 & @target G0.S2 @type xy 2 3310 & grace-5.1.23/examples/pie.agr0000644000076500001440000005156307065003442015530 0ustar fnevgenyusers# Grace project file # @version 50100 @page size 792, 612 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap off @date wrap year 1950 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Mar 19 00:35:45 2000" @with string @ string on @ string loctype view @ string 0.647058823529, 0.93 @ string color 1 @ string rot 0 @ string font 0 @ string just 2 @ string char size 1.500000 @ string def "Examples of \R{red}p\R{green}i\R{blue}e\R{} charts" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type Pie @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin -1 @ world ymax 1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.100000 @ view xmax 0.800000 @ view ymin 0.150000 @ view ymax 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Different colors and patterns (set type XYColPat)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 3.0 @ frame color 14 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xycolpat @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 13 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 0.5 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 4 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.030000 @ s0 errorbar on @ s0 errorbar place normal @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "p.agr" @ s0 legend "" @g1 on @g1 hidden false @g1 type Pie @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 1 @ world ymin -1 @ world ymax 1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.850000 @ view xmax 1.200000 @ view ymin 0.150000 @ view ymax 0.500000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 3.0 @ frame color 14 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 4 @ s0 symbol pattern 1 @ s0 symbol fill color 14 @ s0 symbol fill pattern 24 @ s0 symbol linewidth 0.5 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 1 @ s0 avalue char size 0.750000 @ s0 avalue font 4 @ s0 avalue color 2 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , -0.030000 @ s0 errorbar on @ s0 errorbar place normal @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "copy of set G0.S0" @ s0 legend "" @g2 on @g2 hidden false @g2 type Pie @g2 stacked false @g2 bar hgap 0.000000 @g2 fixedpoint off @g2 fixedpoint type 0 @g2 fixedpoint xy 0.000000, 0.000000 @g2 fixedpoint format general general @g2 fixedpoint prec 6, 6 @with g2 @ world xmin 0 @ world xmax 1 @ world ymin -1 @ world ymax 1 @ stack world 0, 0, 0, 0 @ znorm 1 @ view xmin 0.850000 @ view xmax 1.200000 @ view ymin 0.500000 @ view ymax 0.850000 @ title "" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Different colors (set type XYColor)" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 0.2 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel format general @ xaxis ticklabel prec 5 @ xaxis ticklabel formula "" @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis tick spec type none @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "" @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel format general @ yaxis ticklabel prec 5 @ yaxis ticklabel formula "" @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place normal @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis tick spec type none @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.85 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 3.0 @ frame color 14 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xycolor @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 13 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 1 @ s0 symbol linewidth 0.5 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 0 @ s0 fill rule 0 @ s0 fill color 1 @ s0 fill pattern 1 @ s0 avalue on @ s0 avalue type 1 @ s0 avalue char size 0.750000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.020000 @ s0 errorbar on @ s0 errorbar place normal @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "copy of set G1.S0" @ s0 legend "" @target G0.S0 @type xycolpat 0.1 0 1 1 "Aaa" 0.2 0 2 10 "Bbb" 0.3 0 3 13 "Ccc" 0.4 0 4 31 "Ddd" 0.5 0.15 5 21 "Eee" 0.6 0 6 30 "Fff" 0.7 0.2 7 24 "Ggg" 0.8 0 8 20 "Hhh" 0.9 0.25 9 26 "Iii" & @target G1.S0 @type xy 0.2 0 0.4 0 0.5 0.15 0.6 0 0.7 0.15 0.8 0 0.9 0.15 & @target G2.S0 @type xycolor 0.1 0 1 "Aaa" 0.2 0 2 "Bbb" 0.3 0 3 "Ccc" 0.4 0 4 "Ddd" 0.5 0.15 5 "Eee" 0.6 0 6 "Fff" 0.7 0.2 7 "Ggg" 0.8 0 8 "Hhh" 0.9 0.25 9 "Iii" & grace-5.1.23/examples/spectrum.agr0000644000076500001440000014317307004163357016621 0ustar fnevgenyusers# Grace project file # @version 50005 @page size 600, 768 @description "A sample sent by Ron Eisler." @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman", "Times-Roman" @map font 1 to "Times-Italic", "Times-Italic" @map font 2 to "Times-Bold", "Times-Bold" @map font 3 to "Times-BoldItalic", "Times-BoldItalic" @map font 4 to "Helvetica", "Helvetica" @map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" @map font 6 to "Helvetica-Bold", "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" @map font 8 to "Courier", "Courier" @map font 9 to "Courier-Oblique", "Courier-Oblique" @map font 10 to "Courier-Bold", "Courier-Bold" @map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" @map font 12 to "Symbol", "Symbol" @map font 13 to "ZapfDingbats", "ZapfDingbats" @map color 0 to (255, 255, 255), "white" @map color 1 to (0, 0, 0), "black" @map color 2 to (255, 0, 0), "red" @map color 3 to (0, 255, 0), "green" @map color 4 to (0, 0, 255), "blue" @map color 5 to (255, 255, 0), "yellow" @map color 6 to (188, 143, 143), "brown" @map color 7 to (220, 220, 220), "grey" @map color 8 to (148, 0, 211), "violet" @map color 9 to (0, 255, 255), "cyan" @map color 10 to (255, 0, 255), "magenta" @map color 11 to (255, 165, 0), "orange" @map color 12 to (114, 33, 188), "indigo" @map color 13 to (103, 7, 72), "maroon" @map color 14 to (64, 224, 208), "turquoise" @map color 15 to (0, 139, 0), "green4" @reference date 0 @date wrap on @date wrap year 1900 @default linewidth 1.0 @default linestyle 1 @default color 1 @default pattern 1 @default font 0 @default char size 1.000000 @default symbol size 1.000000 @default sformat "%16.8g" @background color 0 @page background fill on @timestamp on @timestamp 0.66, 1.25 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Fri Oct 22 19:18:36 1999" @with box @ box on @ box loctype view @ box 0.171928104575, 0.870784313725, 0.456928104575, 0.830784313725 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 0 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.47, 1.146, 0.835, 1.02 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 0 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.141633629731, 0.761437908498, 0.173881924305, 0.73366013072 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 11 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.141633629731, 0.727124183007, 0.173881924305, 0.699346405229 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 3 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.572464611642, 0.761437908497, 0.604712906216, 0.733660130719 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 2 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.572464611642, 0.725490196079, 0.604712906216, 0.697712418301 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 4 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.47, 0.489137254902, 0.835, 0.363137254902 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 0 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.139999642803, 0.116013071896, 0.172247937377, 0.0882352941183 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 11 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.139999642803, 0.0816993464054, 0.172247937377, 0.0539215686274 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 3 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.575732585499, 0.114379084967, 0.607980880073, 0.0866013071895 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 2 @ box fill pattern 1 @box def @with box @ box on @ box loctype view @ box 0.575732585499, 0.0800653594778, 0.607980880073, 0.0522875816998 @ box linestyle 1 @ box linewidth 1.0 @ box color 1 @ box fill color 4 @ box fill pattern 1 @box def @with string @ string on @ string loctype view @ string 0.18, 0.745 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Lower Pe" @with string @ string on @ string loctype view @ string 0.18, 0.71 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Upper Pe" @with string @ string on @ string loctype view @ string 0.612, 0.745 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Compton (F)" @with string @ string on @ string loctype view @ string 0.612, 0.71 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Target CS" @with string @ string on @ string loctype view @ string 0.78, 0.745 @ string color 2 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "10678 " @with string @ string on @ string loctype view @ string 0.32, 0.745 @ string color 11 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "3665 " @with string @ string on @ string loctype view @ string 0.32, 0.71 @ string color 15 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "2584 " @with string @ string on @ string loctype view @ string 0.475, 1.125 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Cesium Peak" @with string @ string on @ string loctype view @ string 0.475, 1.095 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Target HV" @with string @ string on @ string loctype view @ string 0.475, 1.065 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "LS Resolution" @with string @ string on @ string loctype view @ string 0.645, 1.125 @ string color 12 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "111.40" @with string @ string on @ string loctype view @ string 0.645, 1.095 @ string color 15 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "<948.3>V" @with string @ string on @ string loctype view @ string 0.645, 1.065 @ string color 10 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "9.81 " @with string @ string on @ string loctype view @ string 0.645, 1.035 @ string color 10 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "1044.87" @with string @ string on @ string loctype view @ string 0.04, 1.25 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Head Voltage" @with string @ string on @ string loctype view @ string 0.19, 1.25 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "100" @with string @ string on @ string loctype view @ string 0.04, 1.23 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Temperature" @with string @ string on @ string loctype view @ string 0.19, 1.23 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "29" @with string @ string on @ string loctype view @ string 0.04, 0.64 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Firmware Vers" @with string @ string on @ string loctype view @ string 0.19, 0.64 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def " 4.0" @with string @ string on @ string loctype view @ string 0.04, 0.6 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Time out err" @with string @ string on @ string loctype view @ string 0.19, 0.6 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "23816" @with string @ string on @ string loctype view @ string 0.04, 0.62 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Receive err" @with string @ string on @ string loctype view @ string 0.19, 0.62 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "55552" @with string @ string on @ string loctype view @ string 0.04, 0.58 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Overruns" @with string @ string on @ string loctype view @ string 0.19, 0.58 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "0" @with string @ string on @ string loctype view @ string 0.175814255206, 0.849673202614 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "Accum Time" @with string @ string on @ string loctype view @ string 0.310696215231, 0.849673202614 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "55 secs" @with string @ string on @ string loctype view @ string 0.475, 0.465 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Cesium Peak" @with string @ string on @ string loctype view @ string 0.475, 0.435 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Target HV" @with string @ string on @ string loctype view @ string 0.475, 0.405 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Resolution" @with string @ string on @ string loctype view @ string 0.64, 0.465 @ string color 12 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "107.82" @with string @ string on @ string loctype view @ string 0.64, 0.435 @ string color 15 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "<948.3>V" @with string @ string on @ string loctype view @ string 0.64, 0.405 @ string color 10 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "9.44 " @with string @ string on @ string loctype view @ string 0.64, 0.375 @ string color 10 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "1000.34" @with string @ string on @ string loctype view @ string 0.18, 0.1 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Lower Pe" @with string @ string on @ string loctype view @ string 0.18, 0.065 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Upper Pe" @with string @ string on @ string loctype view @ string 0.32, 0.1 @ string color 11 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "3388 " @with string @ string on @ string loctype view @ string 0.32, 0.065 @ string color 15 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "2473 " @with string @ string on @ string loctype view @ string 0.612, 0.1 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Compton (F)" @with string @ string on @ string loctype view @ string 0.612, 0.065 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "SS Target CS" @with string @ string on @ string loctype view @ string 0.78, 0.1 @ string color 2 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "15837 " @with string @ string on @ string loctype view @ string 0.04, 1.21 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "X Caliper" @with string @ string on @ string loctype view @ string 0.19, 1.21 @ string color 13 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.870000 @ string def "165.25" @r0 type above @r0 linestyle 1 @r0 linewidth 1.0 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1.0 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1.0 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1.0 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1.0 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 stacked false @g0 bar hgap 0.000000 @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 130 @ world ymin 1 @ world ymax 1000000 @ stack world 0, 0, 0, 0 @ view xmin 0.145000 @ view xmax 0.845000 @ view ymin 0.800000 @ view ymax 1.150000 @ title "LS Spectrum" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Depth: 150.2" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "channel" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.430000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 20 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid on @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "counts" @ yaxis label layout para @ yaxis label place spec @ yaxis label place 0.000000, 0.110000 @ yaxis label char size 1.430000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 9 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.670000 @ yaxis tick major color 1 @ yaxis tick major linewidth 2.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place both @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.91370168 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 2 @ s0 fill rule 1 @ s0 fill color 7 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "Created" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 2 @ s1 fill rule 0 @ s1 fill color 11 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "Created" @ s1 legend "" @ s2 hidden false @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 3 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 1 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 2 @ s2 fill rule 0 @ s2 fill color 3 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 3 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "Created" @ s2 legend "" @ s3 hidden false @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 1 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 2 @ s3 fill rule 0 @ s3 fill color 2 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 4 @ s3 errorbar pattern 1 @ s3 errorbar size 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "Created" @ s3 legend "" @ s4 hidden false @ s4 type xy @ s4 symbol 0 @ s4 symbol size 1.000000 @ s4 symbol color 5 @ s4 symbol pattern 1 @ s4 symbol fill color 5 @ s4 symbol fill pattern 0 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 0 @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 1 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 2 @ s4 fill rule 0 @ s4 fill color 7 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar on @ s4 errorbar place both @ s4 errorbar color 5 @ s4 errorbar pattern 1 @ s4 errorbar size 1.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 errorbar riser clip off @ s4 errorbar riser clip length 0.100000 @ s4 comment "Created" @ s4 legend "" @ s5 hidden false @ s5 type xy @ s5 symbol 0 @ s5 symbol size 1.000000 @ s5 symbol color 6 @ s5 symbol pattern 1 @ s5 symbol fill color 6 @ s5 symbol fill pattern 0 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 0 @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 1 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 2 @ s5 fill rule 0 @ s5 fill color 4 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar on @ s5 errorbar place both @ s5 errorbar color 6 @ s5 errorbar pattern 1 @ s5 errorbar size 1.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 errorbar riser clip off @ s5 errorbar riser clip length 0.100000 @ s5 comment "Created" @ s5 legend "" @ s6 hidden false @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol color 1 @ s6 symbol pattern 1 @ s6 symbol fill color 1 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1.0 @ s6 symbol linestyle 1 @ s6 symbol char 65 @ s6 symbol char font 0 @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 1.0 @ s6 line color 1 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 2 @ s6 fill rule 1 @ s6 fill color 7 @ s6 fill pattern 1 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar on @ s6 errorbar place both @ s6 errorbar color 1 @ s6 errorbar pattern 1 @ s6 errorbar size 1.000000 @ s6 errorbar linewidth 1.0 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1.0 @ s6 errorbar riser linestyle 1 @ s6 errorbar riser clip off @ s6 errorbar riser clip length 0.100000 @ s6 comment "Created" @ s6 legend "" @g1 on @g1 hidden false @g1 type XY @g1 stacked false @g1 bar hgap 0.000000 @g1 fixedpoint off @g1 fixedpoint type 0 @g1 fixedpoint xy 0.000000, 0.000000 @g1 fixedpoint format general general @g1 fixedpoint prec 6, 6 @with g1 @ world xmin 0 @ world xmax 130 @ world ymin 1 @ world ymax 1000000 @ stack world 0, 0, 0, 0 @ view xmin 0.145000 @ view xmax 0.845000 @ view ymin 0.150000 @ view ymax 0.500000 @ title "SS Spectrum" @ title font 0 @ title size 1.500000 @ title color 1 @ subtitle "Depth: 150.2" @ subtitle font 0 @ subtitle size 1.000000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Logarithmic @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar on @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1.0 @ xaxis label "channel" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.430000 @ xaxis label font 0 @ xaxis label color 1 @ xaxis label place normal @ xaxis tick on @ xaxis tick major 20 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1.0 @ xaxis tick major linestyle 1 @ xaxis tick major grid on @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1.0 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid on @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 5 @ xaxis ticklabel format general @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel place normal @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 0 @ xaxis ticklabel color 1 @ xaxis tick place both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar on @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1.0 @ yaxis label "counts" @ yaxis label layout para @ yaxis label place spec @ yaxis label place 0.000000, 0.110000 @ yaxis label char size 1.430000 @ yaxis label font 0 @ yaxis label color 1 @ yaxis label place normal @ yaxis tick on @ yaxis tick major 10 @ yaxis tick minor ticks 9 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 0.670000 @ yaxis tick major color 1 @ yaxis tick major linewidth 2.0 @ yaxis tick major linestyle 1 @ yaxis tick major grid on @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1.0 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid on @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 0 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel place both @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 0 @ yaxis ticklabel color 1 @ yaxis tick place both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend on @ legend loctype view @ legend x1 0.91370168 @ legend y1 0.8 @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1.0 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 0 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ legend invert false @ frame type 0 @ frame linestyle 1 @ frame linewidth 1.0 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @ s0 hidden false @ s0 type xy @ s0 symbol 0 @ s0 symbol size 1.000000 @ s0 symbol color 1 @ s0 symbol pattern 1 @ s0 symbol fill color 1 @ s0 symbol fill pattern 0 @ s0 symbol linewidth 1.0 @ s0 symbol linestyle 1 @ s0 symbol char 65 @ s0 symbol char font 0 @ s0 symbol skip 0 @ s0 line type 1 @ s0 line linestyle 1 @ s0 line linewidth 1.0 @ s0 line color 1 @ s0 line pattern 1 @ s0 baseline type 0 @ s0 baseline off @ s0 dropline off @ s0 fill type 2 @ s0 fill rule 1 @ s0 fill color 7 @ s0 fill pattern 1 @ s0 avalue off @ s0 avalue type 2 @ s0 avalue char size 1.000000 @ s0 avalue font 0 @ s0 avalue color 1 @ s0 avalue rot 0 @ s0 avalue format general @ s0 avalue prec 3 @ s0 avalue prepend "" @ s0 avalue append "" @ s0 avalue offset 0.000000 , 0.000000 @ s0 errorbar on @ s0 errorbar place both @ s0 errorbar color 1 @ s0 errorbar pattern 1 @ s0 errorbar size 1.000000 @ s0 errorbar linewidth 1.0 @ s0 errorbar linestyle 1 @ s0 errorbar riser linewidth 1.0 @ s0 errorbar riser linestyle 1 @ s0 errorbar riser clip off @ s0 errorbar riser clip length 0.100000 @ s0 comment "Created" @ s0 legend "" @ s1 hidden false @ s1 type xy @ s1 symbol 0 @ s1 symbol size 1.000000 @ s1 symbol color 2 @ s1 symbol pattern 1 @ s1 symbol fill color 2 @ s1 symbol fill pattern 0 @ s1 symbol linewidth 1.0 @ s1 symbol linestyle 1 @ s1 symbol char 65 @ s1 symbol char font 0 @ s1 symbol skip 0 @ s1 line type 1 @ s1 line linestyle 1 @ s1 line linewidth 1.0 @ s1 line color 1 @ s1 line pattern 1 @ s1 baseline type 0 @ s1 baseline off @ s1 dropline off @ s1 fill type 2 @ s1 fill rule 0 @ s1 fill color 11 @ s1 fill pattern 1 @ s1 avalue off @ s1 avalue type 2 @ s1 avalue char size 1.000000 @ s1 avalue font 0 @ s1 avalue color 1 @ s1 avalue rot 0 @ s1 avalue format general @ s1 avalue prec 3 @ s1 avalue prepend "" @ s1 avalue append "" @ s1 avalue offset 0.000000 , 0.000000 @ s1 errorbar on @ s1 errorbar place both @ s1 errorbar color 2 @ s1 errorbar pattern 1 @ s1 errorbar size 1.000000 @ s1 errorbar linewidth 1.0 @ s1 errorbar linestyle 1 @ s1 errorbar riser linewidth 1.0 @ s1 errorbar riser linestyle 1 @ s1 errorbar riser clip off @ s1 errorbar riser clip length 0.100000 @ s1 comment "Created" @ s1 legend "" @ s2 hidden false @ s2 type xy @ s2 symbol 0 @ s2 symbol size 1.000000 @ s2 symbol color 3 @ s2 symbol pattern 1 @ s2 symbol fill color 3 @ s2 symbol fill pattern 0 @ s2 symbol linewidth 1.0 @ s2 symbol linestyle 1 @ s2 symbol char 65 @ s2 symbol char font 0 @ s2 symbol skip 0 @ s2 line type 1 @ s2 line linestyle 1 @ s2 line linewidth 1.0 @ s2 line color 1 @ s2 line pattern 1 @ s2 baseline type 0 @ s2 baseline off @ s2 dropline off @ s2 fill type 2 @ s2 fill rule 0 @ s2 fill color 3 @ s2 fill pattern 1 @ s2 avalue off @ s2 avalue type 2 @ s2 avalue char size 1.000000 @ s2 avalue font 0 @ s2 avalue color 1 @ s2 avalue rot 0 @ s2 avalue format general @ s2 avalue prec 3 @ s2 avalue prepend "" @ s2 avalue append "" @ s2 avalue offset 0.000000 , 0.000000 @ s2 errorbar on @ s2 errorbar place both @ s2 errorbar color 3 @ s2 errorbar pattern 1 @ s2 errorbar size 1.000000 @ s2 errorbar linewidth 1.0 @ s2 errorbar linestyle 1 @ s2 errorbar riser linewidth 1.0 @ s2 errorbar riser linestyle 1 @ s2 errorbar riser clip off @ s2 errorbar riser clip length 0.100000 @ s2 comment "Created" @ s2 legend "" @ s3 hidden false @ s3 type xy @ s3 symbol 0 @ s3 symbol size 1.000000 @ s3 symbol color 4 @ s3 symbol pattern 1 @ s3 symbol fill color 4 @ s3 symbol fill pattern 0 @ s3 symbol linewidth 1.0 @ s3 symbol linestyle 1 @ s3 symbol char 65 @ s3 symbol char font 0 @ s3 symbol skip 0 @ s3 line type 1 @ s3 line linestyle 1 @ s3 line linewidth 1.0 @ s3 line color 1 @ s3 line pattern 1 @ s3 baseline type 0 @ s3 baseline off @ s3 dropline off @ s3 fill type 2 @ s3 fill rule 0 @ s3 fill color 2 @ s3 fill pattern 1 @ s3 avalue off @ s3 avalue type 2 @ s3 avalue char size 1.000000 @ s3 avalue font 0 @ s3 avalue color 1 @ s3 avalue rot 0 @ s3 avalue format general @ s3 avalue prec 3 @ s3 avalue prepend "" @ s3 avalue append "" @ s3 avalue offset 0.000000 , 0.000000 @ s3 errorbar on @ s3 errorbar place both @ s3 errorbar color 4 @ s3 errorbar pattern 1 @ s3 errorbar size 1.000000 @ s3 errorbar linewidth 1.0 @ s3 errorbar linestyle 1 @ s3 errorbar riser linewidth 1.0 @ s3 errorbar riser linestyle 1 @ s3 errorbar riser clip off @ s3 errorbar riser clip length 0.100000 @ s3 comment "Created" @ s3 legend "" @ s4 hidden false @ s4 type xy @ s4 symbol 0 @ s4 symbol size 1.000000 @ s4 symbol color 5 @ s4 symbol pattern 1 @ s4 symbol fill color 5 @ s4 symbol fill pattern 0 @ s4 symbol linewidth 1.0 @ s4 symbol linestyle 1 @ s4 symbol char 65 @ s4 symbol char font 0 @ s4 symbol skip 0 @ s4 line type 1 @ s4 line linestyle 1 @ s4 line linewidth 1.0 @ s4 line color 1 @ s4 line pattern 1 @ s4 baseline type 0 @ s4 baseline off @ s4 dropline off @ s4 fill type 2 @ s4 fill rule 0 @ s4 fill color 7 @ s4 fill pattern 1 @ s4 avalue off @ s4 avalue type 2 @ s4 avalue char size 1.000000 @ s4 avalue font 0 @ s4 avalue color 1 @ s4 avalue rot 0 @ s4 avalue format general @ s4 avalue prec 3 @ s4 avalue prepend "" @ s4 avalue append "" @ s4 avalue offset 0.000000 , 0.000000 @ s4 errorbar on @ s4 errorbar place both @ s4 errorbar color 5 @ s4 errorbar pattern 1 @ s4 errorbar size 1.000000 @ s4 errorbar linewidth 1.0 @ s4 errorbar linestyle 1 @ s4 errorbar riser linewidth 1.0 @ s4 errorbar riser linestyle 1 @ s4 errorbar riser clip off @ s4 errorbar riser clip length 0.100000 @ s4 comment "Created" @ s4 legend "" @ s5 hidden false @ s5 type xy @ s5 symbol 0 @ s5 symbol size 1.000000 @ s5 symbol color 6 @ s5 symbol pattern 1 @ s5 symbol fill color 6 @ s5 symbol fill pattern 0 @ s5 symbol linewidth 1.0 @ s5 symbol linestyle 1 @ s5 symbol char 65 @ s5 symbol char font 0 @ s5 symbol skip 0 @ s5 line type 1 @ s5 line linestyle 1 @ s5 line linewidth 1.0 @ s5 line color 1 @ s5 line pattern 1 @ s5 baseline type 0 @ s5 baseline off @ s5 dropline off @ s5 fill type 2 @ s5 fill rule 0 @ s5 fill color 4 @ s5 fill pattern 1 @ s5 avalue off @ s5 avalue type 2 @ s5 avalue char size 1.000000 @ s5 avalue font 0 @ s5 avalue color 1 @ s5 avalue rot 0 @ s5 avalue format general @ s5 avalue prec 3 @ s5 avalue prepend "" @ s5 avalue append "" @ s5 avalue offset 0.000000 , 0.000000 @ s5 errorbar on @ s5 errorbar place both @ s5 errorbar color 6 @ s5 errorbar pattern 1 @ s5 errorbar size 1.000000 @ s5 errorbar linewidth 1.0 @ s5 errorbar linestyle 1 @ s5 errorbar riser linewidth 1.0 @ s5 errorbar riser linestyle 1 @ s5 errorbar riser clip off @ s5 errorbar riser clip length 0.100000 @ s5 comment "Created" @ s5 legend "" @ s6 hidden false @ s6 type xy @ s6 symbol 0 @ s6 symbol size 1.000000 @ s6 symbol color 1 @ s6 symbol pattern 1 @ s6 symbol fill color 1 @ s6 symbol fill pattern 0 @ s6 symbol linewidth 1.0 @ s6 symbol linestyle 1 @ s6 symbol char 65 @ s6 symbol char font 0 @ s6 symbol skip 0 @ s6 line type 1 @ s6 line linestyle 1 @ s6 line linewidth 1.0 @ s6 line color 1 @ s6 line pattern 1 @ s6 baseline type 0 @ s6 baseline off @ s6 dropline off @ s6 fill type 2 @ s6 fill rule 1 @ s6 fill color 7 @ s6 fill pattern 1 @ s6 avalue off @ s6 avalue type 2 @ s6 avalue char size 1.000000 @ s6 avalue font 0 @ s6 avalue color 1 @ s6 avalue rot 0 @ s6 avalue format general @ s6 avalue prec 3 @ s6 avalue prepend "" @ s6 avalue append "" @ s6 avalue offset 0.000000 , 0.000000 @ s6 errorbar on @ s6 errorbar place both @ s6 errorbar color 1 @ s6 errorbar pattern 1 @ s6 errorbar size 1.000000 @ s6 errorbar linewidth 1.0 @ s6 errorbar linestyle 1 @ s6 errorbar riser linewidth 1.0 @ s6 errorbar riser linestyle 1 @ s6 errorbar riser clip off @ s6 errorbar riser clip length 0.100000 @ s6 comment "Created" @ s6 legend "" @target G0.S0 @type xy 0 1 1 253 2 4388 3 5724 4 6016 4.99 6776.99 4.99 0.01 & @target G0.S1 @type xy 5 6777 6 7173 7 7905 8 10029 9 13945 10 17525 11 18939 12 22252 13 21064 14 22945 14.99 26015.99 14.99 0.01 & @target G0.S2 @type xy 15 26016 16 25037 17 28323 18 26321 19 25319 19.99 25911.99 19.99 0.01 & @target G0.S3 @type xy 20 25912 21 25359 22 25811 23 24499 24 22935 25 22862 26 22183 27 20685 28 20301 29 20423 30 18765 31 17845 32 18209 33 16859 34 16418 35 15848 36 15321 37 13498 38 13736 39 12680 40 12538 41 11369 42 11212 43 9934 44 9752 45 9074 46 8660 47 7814 48 7688 49 7121 50 6614 51 6313 52 5604 53 5500 54 4922 55 4813 56 4203 57 3838 58 3545 59 3425 60 3017 61 2973 62 2405 63 2558 64 2413 65 1987 66 1882 67 1744 68 1466 69 1483 70 1256 71 1207 72 1019 73 994 74 810 75 856 76 745 77 702 78 579 79 552 80 502 81 496 82 370 82.99 298.99 82.99 0.01 & @target G0.S4 @type xy 83 299 84 330 85 316 86 267 87 258 88 204 89 169 90 204 91 175 92 177 93 168 94 163 95 132 96 136 97 140 98 169 99 188 100 213 101 239 102 361 103 391 104 531 104.99 589.99 104.99 0.01 & @target G0.S5 @type xy 105 590 106 789 107 924 108 988 109 1098 110 1224 111 1154 112 1200 113 1029 114 869 114.99 685.99 114.99 0.01 & @target G0.S6 @type xy 115 686 116 683 117 482 118 383 119 281 120 209 121 104 122 82 123 53 124 42 125 31 125.99 22.99 125.99 0.01 & @target G1.S0 @type xy 0 1 1 455 2 5749 3 7854 4 8744 4.99 8797.99 4.99 0.01 & @target G1.S1 @type xy 5 8798 6 9067 7 8908 8 11243 9 13517 10 18034 11 18333 12 19153 13 19539 14 21412 14.99 22053.99 14.99 0.01 & @target G1.S2 @type xy 15 22054 16 25789 17 23457 18 26392 18.99 26109.99 18.99 0.01 & @target G1.S3 @type xy 19 26110 20 28000 21 26054 22 26646 23 25023 24 25922 25 26354 26 22691 27 25843 28 22364 29 22846 30 21272 31 21518 32 21979 33 21944 34 21172 35 20845 36 22253 37 19187 38 20339 39 21091 40 19134 41 19265 42 20003 43 19040 44 18139 45 18444 46 17850 47 17567 48 16271 49 15673 50 15456 51 14654 52 13631 53 12130 54 11239 55 11458 56 9859 57 8514 58 8049 59 7415 60 6462 61 5807 62 5531 63 4540 64 3984 65 3525 66 3303 67 2807 68 2334 69 2186 70 1656 71 1902 72 1454 73 1222 74 1163 75 1082 76 877 77 788 78 736 79 547 79.99 486.99 79.99 0.01 & @target G1.S4 @type xy 80 487 81 460 82 448 83 413 84 341 85 334 86 331 87 299 88 257 89 253 90 280 91 245 92 233 93 234 94 258 95 229 96 219 97 241 98 268 99 285 100 310 101 401 102 598 103 730 104 909 104.99 1042.99 104.99 0.01 & @target G1.S5 @type xy 105 1043 106 1163 107 1280 108 1300 109 1194 110 1048 111 855 112 717 113 562 114 398 114.99 288.99 114.99 0.01 & @target G1.S6 @type xy 115 289 116 135 117 102 118 65 119 57 120 33 121 31 122 19 123 17 124 26 125 17 125.99 16.99 125.99 0.01 & grace-5.1.23/examples/explain.agr0000644000076500001440000002677106751424402016422 0ustar fnevgenyusers# Grace project file # @version 50001 @page size 600 600 @page scroll 5% @page inout 5% @link page off @map font 0 to "Times-Roman" , "Times-Roman" @map font 2 to "Times-Italic" , "Times-Italic" @map font 1 to "Times-Bold" , "Times-Bold" @map font 3 to "Times-BoldItalic" , "Times-BoldItalic" @map font 4 to "Helvetica" , "Helvetica" @map font 6 to "Helvetica-Oblique" , "Helvetica-Oblique" @map font 5 to "Helvetica-Bold" , "Helvetica-Bold" @map font 7 to "Helvetica-BoldOblique" , "Helvetica-BoldOblique" @map font 8 to "Symbol" , "Symbol" @map font 9 to "ZapfDingbats" , "ZapfDingbats" @default linewidth 1 @default linestyle 1 @default color 1 @default pattern 1 @default font 2 @default char size 1.000000 @default symbol size 1.000000 @background color 0 @timestamp off @timestamp 0.03, 0.03 @timestamp color 1 @timestamp rot 0 @timestamp font 0 @timestamp char size 1.000000 @timestamp def "Sun Sep 13 23:37:42 1998" @with line @ line on @ line loctype view @ line 0.04, 0.988571428571, 0.08625, 0.978571428571 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow size 1.000000 @ line arrow type 1 @line def @with line @ line on @ line loctype view @ line 0.1575, 0.34, 0.19, 0.41 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 1 @ line arrow size 1.000000 @ line arrow type 1 @line def @with line @ line on @ line loctype view @ line 0.4, 0.56, 0.4, 0.49 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 0 @ line arrow size 1.000000 @ line arrow type 1 @line def @with line @ line on @ line loctype view @ line 0.4, 0.525, 0.435, 0.525 @ line linewidth 1 @ line linestyle 1 @ line color 1 @ line arrow 2 @ line arrow size 1.000000 @ line arrow type 1 @line def @with string @ string on @ string loctype view @ string 0.09625, 0.97 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 0.800000 @ string def "Locator (see Edit/Locator props...) - The G0: indicates which graph is current" @with string @ string on @ string loctype view @ string 0.015, 0.93 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Zoom - Autoscale" @with string @ string on @ string loctype view @ string 0.015, 0.88 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Expand - Shrink" @with string @ string on @ string loctype view @ string 0.015, 0.83 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Scroll left - Scroll right" @with string @ string on @ string loctype view @ string 0.015, 0.785 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Scroll down - Scroll up" @with string @ string on @ string loctype view @ string 0.015, 0.73 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Automatically set the tick spacing" @with string @ string on @ string loctype view @ string 0.015, 0.69 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Autoscale on a set" @with string @ string on @ string loctype view @ string 0.015, 0.64 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Zoom in X /Y only" @with string @ string on @ string loctype view @ string 0.015, 0.59 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Autoscale in X /Y only" @with string @ string on @ string loctype view @ string 0.015, 0.55 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Push then Zoom - Push" @with string @ string on @ string loctype view @ string 0.015, 0.5 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Pop - Cycle through the stack" @with string @ string on @ string loctype view @ string 0.015, 0.46 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Stack depth" @with string @ string on @ string loctype view @ string 0.015, 0.43 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "Current world" @with string @ string on @ string loctype view @ string 0.015, 0.39 @ string color 1 @ string rot 0 @ string font 4 @ string just 0 @ string char size 1.000000 @ string def "End session" @with string @ string on @ string loctype view @ string 0.2, 0.46 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "The current graph is indicated by the markers at the corners" @with string @ string on @ string loctype view @ string 0.2, 0.435 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 1.000000 @ string def "of a graph." @with string @ string on @ string loctype view @ string 0.4475, 0.59 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.900000 @ string def "These buttons control the World Stack." @with string @ string on @ string loctype view @ string 0.4475, 0.56 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.900000 @ string def "Each graph has up to 20 different allowable" @with string @ string on @ string loctype view @ string 0.4475, 0.54 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.900000 @ string def "views of the data. Use this feature to zoom" @with string @ string on @ string loctype view @ string 0.4475, 0.515 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.900000 @ string def "in on an area of the graph, then Po (pop) to" @with string @ string on @ string loctype view @ string 0.4475, 0.49 @ string color 1 @ string rot 0 @ string font 0 @ string just 0 @ string char size 0.900000 @ string def "return to the original scale." @r0 type above @r0 linestyle 1 @r0 linewidth 1 @r0 color 1 @r0 line 0, 0, 0, 0 @r1 type above @r1 linestyle 1 @r1 linewidth 1 @r1 color 1 @r1 line 0, 0, 0, 0 @r2 type above @r2 linestyle 1 @r2 linewidth 1 @r2 color 1 @r2 line 0, 0, 0, 0 @r3 type above @r3 linestyle 1 @r3 linewidth 1 @r3 color 1 @r3 line 0, 0, 0, 0 @r4 type above @r4 linestyle 1 @r4 linewidth 1 @r4 color 1 @r4 line 0, 0, 0, 0 @g0 on @g0 hidden false @g0 type XY @g0 autoscale type auto @g0 fixedpoint off @g0 fixedpoint type 0 @g0 fixedpoint xy 0.000000, 0.000000 @g0 fixedpoint format general general @g0 fixedpoint prec 6, 6 @with g0 @ world xmin 0 @ world xmax 1 @ world ymin 0 @ world ymax 1 @ stack world 0, 0, 0, 0 tick 0, 0, 0, 0 @ view xmin 0.150000 @ view xmax 0.850000 @ view ymin 0.146667 @ view ymax 0.321667 @ title "Double click here to edit the graph title" @ title font 4 @ title size 1.000000 @ title color 1 @ subtitle "or use Plot/Graph appearance" @ subtitle font 4 @ subtitle size 0.950000 @ subtitle color 1 @ xaxes scale Normal @ yaxes scale Normal @ xaxes invert off @ yaxes invert off @ xaxis on @ xaxis type zero false @ xaxis offset 0.000000 , 0.000000 @ xaxis bar off @ xaxis bar color 1 @ xaxis bar linestyle 1 @ xaxis bar linewidth 1 @ xaxis label "Double click here to set the X-axis props or use Plot/Tick labels/tick marks" @ xaxis label layout para @ xaxis label place auto @ xaxis label char size 1.000000 @ xaxis label font 4 @ xaxis label color 1 @ xaxis label op bottom @ xaxis tick on @ xaxis tick major 0.5 @ xaxis tick minor ticks 1 @ xaxis tick default 6 @ xaxis tick place rounded true @ xaxis tick in @ xaxis tick major size 1.000000 @ xaxis tick major color 1 @ xaxis tick major linewidth 1 @ xaxis tick major linestyle 1 @ xaxis tick major grid off @ xaxis tick minor color 1 @ xaxis tick minor linewidth 1 @ xaxis tick minor linestyle 1 @ xaxis tick minor grid off @ xaxis tick minor size 0.500000 @ xaxis ticklabel on @ xaxis ticklabel prec 1 @ xaxis ticklabel format decimal @ xaxis ticklabel append "" @ xaxis ticklabel prepend "" @ xaxis ticklabel angle 0 @ xaxis ticklabel skip 0 @ xaxis ticklabel stagger 0 @ xaxis ticklabel op bottom @ xaxis ticklabel offset auto @ xaxis ticklabel offset 0.000000 , 0.010000 @ xaxis ticklabel sign normal @ xaxis ticklabel start type auto @ xaxis ticklabel start 0.000000 @ xaxis ticklabel stop type auto @ xaxis ticklabel stop 0.000000 @ xaxis ticklabel char size 1.000000 @ xaxis ticklabel font 4 @ xaxis ticklabel color 1 @ xaxis tick op both @ xaxis ticklabel type auto @ xaxis tick type auto @ yaxis on @ yaxis type zero false @ yaxis offset 0.000000 , 0.000000 @ yaxis bar off @ yaxis bar color 1 @ yaxis bar linestyle 1 @ yaxis bar linewidth 1 @ yaxis label "Same for Y-axis " @ yaxis label layout para @ yaxis label place auto @ yaxis label char size 1.000000 @ yaxis label font 4 @ yaxis label color 1 @ yaxis label op left @ yaxis tick on @ yaxis tick major 0.5 @ yaxis tick minor ticks 1 @ yaxis tick default 6 @ yaxis tick place rounded true @ yaxis tick in @ yaxis tick major size 1.000000 @ yaxis tick major color 1 @ yaxis tick major linewidth 1 @ yaxis tick major linestyle 1 @ yaxis tick major grid off @ yaxis tick minor color 1 @ yaxis tick minor linewidth 1 @ yaxis tick minor linestyle 1 @ yaxis tick minor grid off @ yaxis tick minor size 0.500000 @ yaxis ticklabel on @ yaxis ticklabel prec 1 @ yaxis ticklabel format decimal @ yaxis ticklabel append "" @ yaxis ticklabel prepend "" @ yaxis ticklabel angle 0 @ yaxis ticklabel skip 0 @ yaxis ticklabel stagger 0 @ yaxis ticklabel op left @ yaxis ticklabel offset auto @ yaxis ticklabel offset 0.000000 , 0.010000 @ yaxis ticklabel sign normal @ yaxis ticklabel start type auto @ yaxis ticklabel start 0.000000 @ yaxis ticklabel stop type auto @ yaxis ticklabel stop 0.000000 @ yaxis ticklabel char size 1.000000 @ yaxis ticklabel font 4 @ yaxis ticklabel color 1 @ yaxis tick op both @ yaxis ticklabel type auto @ yaxis tick type auto @ altxaxis off @ altyaxis off @ legend off @ legend loctype view @ legend x1 0.8 @ legend y1 0.8 @ legend box off @ legend box color 1 @ legend box pattern 1 @ legend box linewidth 1 @ legend box linestyle 1 @ legend box fill color 0 @ legend box fill pattern 1 @ legend font 4 @ legend char size 1.000000 @ legend color 1 @ legend length 4 @ legend vgap 1 @ legend hgap 1 @ frame type 0 @ frame linestyle 1 @ frame linewidth 1 @ frame color 1 @ frame pattern 1 @ frame background color 0 @ frame background pattern 0 @WITH G0 @G0 ON grace-5.1.23/examples/mlo.dat0000644000076500001440000000362206626627163015550 0ustar fnevgenyusers1974.33 333.1 1974.42 332.1 1974.5 331.1 1974.58 329.1 1974.67 327.4 1974.75 327.3 1974.83 328.2 1974.92 329.6 1975 330.6 1975.08 331.4 1975.17 331.9 1975.25 333.2 1975.33 333.9 1975.42 333.4 1975.5 331.9 1975.58 330.0 1975.67 328.5 1975.75 328.4 1975.83 329.3 1975.92 331.0 1976 331.6 1976.08 332.6 1976.17 333.6 1976.25 334.7 1976.33 334.7 1976.42 334.2 1976.5 333 1976.58 330.8 1976.67 329 1976.75 328.6 1976.83 330.2 1976.92 331.6 1977 332.7 1977.08 333.2 1977.17 334.9 1977.25 336.1 1977.33 336.8 1977.42 336.1 1977.5 334.8 1977.58 332.6 1977.67 331.3 1977.75 331.2 1977.83 332.4 1977.92 333.5 1978 334.7 1978.08 335.2 1978.17 336.5 1978.25 337.8 1978.33 338 1978.42 338 1978.5 336.4 1978.58 334.5 1978.67 332.5 1978.75 332.3 1978.83 333.8 1978.92 334.8 1979 336 1979.08 336.6 1979.17 337.9 1979.25 339 1979.33 339.1 1979.42 339.3 1979.5 337.6 1979.58 335.7 1979.67 333.8 1979.75 334.1 1979.83 335.3 1979.92 336.8 1980 337.8 1980.08 338.3 1980.17 340.1 1980.25 340.9 1980.33 341.5 1980.42 341.3 1980.5 339.4 1980.58 337.7 1980.67 336.1 1980.75 336.1 1980.83 337.2 1980.92 338.4 1981 339.3 1981.08 340.4 1981.17 341.7 1981.25 342.5 1981.33 343 1981.42 342.5 1981.5 340.9 1981.58 338.8 1981.67 337.1 1981.75 337.1 1981.83 338.5 1981.92 339.9 1982 340.9 1982.08 341.7 1982.17 342.7 1982.25 343.7 1982.33 344.3 1982.42 343.4 1982.5 342 1982.58 340 1982.67 337.8 1982.75 338 1982.83 339.2 1982.92 340.6 1983 341.4 1983.08 342.7 1983.17 343.0 1983.25 345.3 1983.33 345.9 1983.42 345.4 1983.5 344.2 1983.58 342.1 1983.67 340.1 1983.75 340.2 1983.83 341.4 1983.92 343.0 1984 343.6 1984.08 344.5 1984.17 345.1 1984.25 346 <- interpolated (by eye) value, was missing data 1984.33 347.3 1984.42 346.6 1984.5 345 1984.58 342 1984.67 340.9 1984.75 341.1 1984.83 342.8 1984.92 344.3 1985 344.9 1985.08 345.6 1985.17 347.2 1985.25 347.6 1985.33 348.5 1985.42 347.9 1985.5 346 1985.58 343.9 1985.67 342.6 1985.75 342.6 1985.83 344.1 1985.92 345.5 grace-5.1.23/conf/0000755000076500001440000000000012032153126013350 5ustar fnevgenyusersgrace-5.1.23/conf/opennt0000644000076500001440000000103206671072762014614 0ustar fnevgenyusers#************************ #* Interix (aka OpenNT) * #************************ ############################### # Compiler # CC="gcc" ############################### ############################### # C flags # CFLAGS="-fno-common -Wall -pedantic \ -Wpointer-arith -Wnested-externs -D_ALL_SOURCE" ############################### ############################### # Misc optimization flags # OPTIMIZE="" ############################### ############################### # Flags used for debugging # DEBUG="-g" ############################### grace-5.1.23/conf/lcc0000644000076500001440000000106507015636370014052 0ustar fnevgenyusers#****************************************** #* lcc (checked with lcc-4.1 on Linux/x86 * #****************************************** ############################### # Compiler # CC="lcc" ############################### ############################### # C flags # CFLAGS="-D__inline__= -D__NO_MATH_INLINES -D__volatile__=" ############################### ############################### # Misc optimization flags # OPTIMIZE="" ############################### ############################### # Flags used for debugging # DEBUG="-g" ############################### grace-5.1.23/conf/ix86-os20000644000076500001440000000105507053635541014610 0ustar fnevgenyusers#****************************************** #* OS/2, EMX/gcc with XFree86 and Lesstif * #****************************************** ############################### # Compiler # CC="gcc" ############################### ############################### # C flags # CFLAGS="-pedantic -Wall -Zmtd -DOS2" ############################### ############################### # Misc optimization flags # OPTIMIZE="-O2 -m486" ############################### ############################### # Flags used for debugging # DEBUG="-g -O1" ############################### grace-5.1.23/conf/generic0000644000076500001440000000102707053635541014724 0ustar fnevgenyusers#************************************************ #* Generic Unix with X11 >= R5 and Motif >= 1.2 * #************************************************ ############################### # Compiler # CC="cc" ############################### ############################### # C flags # CFLAGS="" ############################### ############################### # Misc optimization flags # OPTIMIZE="-O" ############################### ############################### # Flags used for debugging # DEBUG="-g" ############################### grace-5.1.23/conf/generic.gcc0000644000076500001440000000137707053635541015467 0ustar fnevgenyusers#***************************************************** #* Generic Unix with gcc, X11 >= R5 and Motif >= 1.2 * #***************************************************** ############################### # Compiler # CC="gcc" ############################### ############################### # C flags # CFLAGS="-fno-common \ -Wall -pedantic -Wpointer-arith -Wnested-externs -Wno-implicit-int" #-Wshadow -Wmissing-prototypes -Wwrite-strings -Waggregate-return \ #-W -Wcast-align -Wcast-qual -Wconversion -Wstrict-prototypes ############################### ############################### # Misc optimization flags # OPTIMIZE="-O2" ############################### ############################### # Flags used for debugging # DEBUG="-g -O2" ############################### grace-5.1.23/T1lib/0000755000076500001440000000000012032153126013376 5ustar fnevgenyusersgrace-5.1.23/T1lib/t1lib/0000755000076500001440000000000012032153126014411 5ustar fnevgenyusersgrace-5.1.23/T1lib/t1lib/t1base.c0000644000076500001440000010610310037046500015735 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1base.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It contains basic routines to initialize the data structures used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1BASE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "sysconf.h" #include "t1base.h" #include "t1types.h" #include "t1global.h" #include "t1env.h" #include "t1delete.h" static int T1_pad=0; /* This function is to be called by the user to initialize the font mechanism */ void *T1_InitLib( int log) { int result; int i; char *usershome=NULL; char *logfilepath=NULL; char *envlogreq=NULL; int usrforcelog=0; /* Reset T1_errno */ T1_errno=0; /* Assign pointer to global struct and set entry padding: */ pFontBase=&FontBase; if (T1_pad) pFontBase->bitmap_pad=T1_pad; else pFontBase->bitmap_pad=T1GLYPH_PAD; pFontBase->pFontArray = NULL; pFontBase->t1lib_flags=0; /* Check for AA-caching */ if ((log & T1_AA_CACHING)){ pFontBase->t1lib_flags |= T1_AA_CACHING; } /* Check for AFM disable */ if ((log & T1_NO_AFM)) { pFontBase->t1lib_flags |= T1_NO_AFM; } /* Check environment variable ENV_LOG_STRING. By this means, a user may generate a log file even if at compile time log file creation has been suppressed. Of course, if the loglevel is reduced after initialization by the programmer, this environment variable takes no effect! */ if ((envlogreq=getenv(ENV_LOG_STRING))!=NULL) { if (strcmp( envlogreq, "logDebug")==0) T1_SetLogLevel( T1LOG_DEBUG); else if (strcmp( envlogreq, "logStatistic")==0) T1_SetLogLevel( T1LOG_STATISTIC); else if (strcmp( envlogreq, "logWarning")==0) T1_SetLogLevel( T1LOG_WARNING); else if (strcmp( envlogreq, "logError")==0) T1_SetLogLevel( T1LOG_ERROR); usrforcelog=1; } /* Open log-file: */ t1lib_log_file=NULL; if ((log & LOGFILE) || (usrforcelog!=0)) { pFontBase->t1lib_flags |= LOGFILE; /* Try first opening in current directory: */ if ((t1lib_log_file=fopen( T1_LOG_FILE, "wb"))==NULL) { if ((usershome=getenv("HOME"))!=NULL) { logfilepath=(char *)malloc((strlen(usershome) + strlen(T1_LOG_FILE) + 2 ) * sizeof(char)); strcpy( logfilepath, usershome); strcat( logfilepath, DIRECTORY_SEP); strcat( logfilepath, T1_LOG_FILE); if ((t1lib_log_file=fopen( logfilepath, "wb"))==NULL){ t1lib_log_file=stderr; } free( logfilepath); } else { t1lib_log_file=stderr; } } if (t1lib_log_file==stderr) { T1_PrintLog( "T1_InitLib()", "Unable to open a logfile, using stderr", T1LOG_ERROR); } } T1_PrintLog( "T1_InitLib()", "Initialization started", T1LOG_STATISTIC); /* Check for representation of data in memory: */ if ((pFontBase->endian=T1_CheckEndian())){ T1_PrintLog( "T1_InitLib()", "Using Big Endian data presentation (MSBFirst)", T1LOG_DEBUG); pFontBase->endian=1; } else{ T1_PrintLog( "T1_InitLib()", "Using Little Endian data presentation (LSBFirst)", T1LOG_DEBUG); pFontBase->endian=0; } /* Save version identifier */ sprintf( err_warn_msg_buf, "Version Identifier: %s", T1LIB_IDENT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); /* Save how t1lib is initialized */ sprintf( err_warn_msg_buf, "Initialization flags: 0x%X", log); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); /* Save padding value in log file */ sprintf( err_warn_msg_buf, "Glyphs are padded to %d bits", pFontBase->bitmap_pad); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); #ifdef __CHAR_UNSIGNED__ T1_PrintLog( "T1_InitLib()", "System-Info: char is unsigned", T1LOG_DEBUG); #else T1_PrintLog( "T1_InitLib()", "System-Info: char is signed", T1LOG_DEBUG); #endif sprintf( err_warn_msg_buf, "System-Info: sizeof(char): %d", SIZEOF_CHAR); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(short): %d", SIZEOF_SHORT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(int): %d", SIZEOF_INT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long): %d", SIZEOF_LONG); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long long): %d", SIZEOF_LONG_LONG); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(float): %d", SIZEOF_FLOAT); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(double): %d", SIZEOF_DOUBLE); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(long double): %d", SIZEOF_LONG_DOUBLE); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "System-Info: sizeof(void *): %d", SIZEOF_VOID_P); T1_PrintLog( "T1_InitLib()", err_warn_msg_buf, T1LOG_DEBUG); intT1_SetupDefaultSearchPaths(); if (log & IGNORE_CONFIGFILE) { pFontBase->t1lib_flags |= IGNORE_CONFIGFILE; T1_PrintLog( "T1_InitLib()", "Skipping configuration file search!", T1LOG_STATISTIC); } else { if ((result=intT1_ScanConfigFile())==0) T1_PrintLog( "T1_InitLib()", "Warning t1lib configuration file not found!", T1LOG_WARNING); } /* Set the default encoding to the fonts' internal encoding */ pFontBase->default_enc=NULL; /* Initialize the no_fonts... values */ pFontBase->no_fonts=0; pFontBase->no_fonts_ini=pFontBase->no_fonts; pFontBase->no_fonts_limit=pFontBase->no_fonts; /* Check whether to read font database */ if ((log & IGNORE_FONTDATABASE)){ pFontBase->t1lib_flags |= IGNORE_FONTDATABASE; T1_Up=1; /* System has been initialized ! */ T1_PrintLog( "T1_InitLib()", "Initialization successfully finished (Database empty)", T1LOG_STATISTIC); return((void *) pFontBase); } result=0; /* Read fontdatabase(s) */ i=0; while (T1_FDB_ptr[i]!=NULL) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[i]))==-1){ T1_PrintLog( "T1_InitLib()", "Fatal error scanning Font Database File %s", T1LOG_WARNING, T1_FDB_ptr[i]); } if (result>-1) pFontBase->no_fonts+=result; i++; } if (result == 0){ T1_PrintLog( "T1_InitLib()", "No fonts from Font Database File(s) found (T1_errno=%d)", T1LOG_ERROR, T1_errno); return(NULL); } /* Initialize the no_fonts... values */ pFontBase->no_fonts_ini=pFontBase->no_fonts; pFontBase->no_fonts_limit=pFontBase->no_fonts; T1_Up=1; /* System has been initialized ! */ T1_PrintLog( "T1_InitLib()", "Initialization successfully finished", T1LOG_STATISTIC); return((void *) pFontBase); } /* intT1_scanFontDBase(): - opens the file with the font definitions, - reads the number of fonts defined and saves this in FontBase, - allocates memory for all the filenames of the Type1 files - tests for .pfa und .pfb files and saves the name found - initializes an array that allows to acces these names by an index number, the font_ID - returns -1 on fatal error and the number of fonts located successfullly */ int intT1_scanFontDBase( char *filename) { int fd; int filesize, i, j, k, m; int found=0, located=0; char *filebuffer; int nofonts=0; FONTPRIVATE* fontarrayP=NULL; #ifndef O_BINARY # define O_BINARY 0x0 #endif if ((fd=open( filename, O_RDONLY | O_BINARY))<3){ T1_PrintLog( "intT1_scanFontDBase()", "Font Database File %s not found!", T1LOG_WARNING, filename); T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } /* Get the file size */ filesize=lseek( fd, 0, 2); /* Reset fileposition to start */ lseek (fd, 0, 0); if ((filebuffer=(char *)malloc(filesize*sizeof(char) )) == NULL){ T1_PrintLog( "intT1_scanFontDBase()", "Couldn't allocate memory for loading font database file %s", T1LOG_ERROR, filename); T1_errno=T1ERR_ALLOC_MEM; return(-1); } i=read( fd, filebuffer, filesize); close(fd); /* Close font database file */ i=j=m=0; while (inofonts) /* to ignore especially white space at end */ break; i++; /* Step further in file position */ } /* Return the memory for file reading */ free(filebuffer); return( found); } /* T1_CloseLib(): Close the library and free all associated memory */ int T1_CloseLib( void) { int i, j, error=0; if (T1_Up){ for (i=pFontBase->no_fonts; i; i--){ /* Free filename only if not NULL and if the font is physical! Do it before removing the font since the physical information is no more available afterwards. If necessary, an explicitly specified AFM filename is also freed. */ if ((pFontBase->pFontArray[i-1].pFontFileName!=NULL) && (pFontBase->pFontArray[i-1].physical==1)){ free( pFontBase->pFontArray[i-1].pFontFileName); pFontBase->pFontArray[i-1].pFontFileName=NULL; if (pFontBase->pFontArray[i-1].pAfmFileName!=NULL){ free( pFontBase->pFontArray[i-1].pAfmFileName); pFontBase->pFontArray[i-1].pAfmFileName=NULL; } } /* Now, remove font: */ if ((j=T1_DeleteFont( i-1))){ error=1; sprintf( err_warn_msg_buf, "T1_DeleteFont() returned %d for Font %d", j, i-1); T1_PrintLog( "T1_CloseLib()", err_warn_msg_buf, T1LOG_ERROR); } } /* Free the FONTPRIVATE area */ if (pFontBase->pFontArray) free( pFontBase->pFontArray); else error=1; /* Free search paths */ intT1_FreeSearchPaths(); /* Reset the flags */ pFontBase->t1lib_flags=0; /* Indicate Library is no longer initialized */ pFontBase=NULL; T1_Up=0; T1_PrintLog( "T1_CloseLib()", "Library closed", T1LOG_STATISTIC); if ((t1lib_log_file!=NULL) && (t1lib_log_file!=stderr)) fclose(t1lib_log_file); t1lib_log_file=NULL; } return( error); } /* T1_AddFont(): Add a new fontfile to the fontdatabase. Return values: >0: Assigned FontID -1: Fontfile not found -2: Error allocating memory for FONTPRIVATE-area -3: No memory for saving font filename */ int T1_AddFont( char *fontfilename) { char *FullName; FONTPRIVATE *save_ptr; int i; int new_ID; if (fontfilename==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* Check for existence of fontfile */ if ((FullName=intT1_Env_GetCompletePath(fontfilename,T1_PFAB_ptr))==NULL) { T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } free(FullName); /* Check if free space for a new FONTPRIVATE is available; if not, realloc memory some amount larger */ save_ptr=pFontBase->pFontArray; if (pFontBase->no_fonts==pFontBase->no_fonts_limit){ if (pFontBase->pFontArray == NULL) { /* In case this is the first font */ pFontBase->pFontArray=(FONTPRIVATE *)calloc(pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE, sizeof(FONTPRIVATE)); } else { /* We already have some fonts */ pFontBase->pFontArray=(FONTPRIVATE *)realloc(pFontBase->pFontArray, (pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE) * sizeof(FONTPRIVATE)); if (pFontBase->pFontArray==NULL){ /* Restore pointer */ pFontBase->pFontArray=save_ptr; T1_errno=T1ERR_ALLOC_MEM; return(-2); /* No memory available */ } } pFontBase->no_fonts_limit += ADVANCE_FONTPRIVATE; /* First, initialize newly allocated to be not used */ for ( i=pFontBase->no_fonts; ino_fonts+ADVANCE_FONTPRIVATE; i++){ pFontBase->pFontArray[i].pFontFileName=NULL; pFontBase->pFontArray[i].pAfmFileName=NULL; pFontBase->pFontArray[i].pAFMData=NULL; pFontBase->pFontArray[i].pType1Data=NULL; pFontBase->pFontArray[i].pEncMap=NULL; pFontBase->pFontArray[i].pKernMap=NULL; pFontBase->pFontArray[i].pFontEnc=NULL; pFontBase->pFontArray[i].pFontSizeDeps=NULL; pFontBase->pFontArray[i].vm_base=NULL; pFontBase->pFontArray[i].FontMatrix[0]=0.0; pFontBase->pFontArray[i].FontMatrix[1]=0.0; pFontBase->pFontArray[i].FontMatrix[2]=0.0; pFontBase->pFontArray[i].FontMatrix[3]=0.0; pFontBase->pFontArray[i].FontTransform[0]=0.0; pFontBase->pFontArray[i].FontTransform[1]=0.0; pFontBase->pFontArray[i].FontTransform[2]=0.0; pFontBase->pFontArray[i].FontTransform[3]=0.0; pFontBase->pFontArray[i].slant=0.0; pFontBase->pFontArray[i].extend=0.0; pFontBase->pFontArray[i].physical=0; pFontBase->pFontArray[i].refcount=0; pFontBase->pFontArray[i].space_position=0; pFontBase->pFontArray[i].info_flags=0; } } /* no_fonts-1 was the largest allowed font ID */ new_ID=pFontBase->no_fonts; pFontBase->no_fonts++; if ((FontBase.pFontArray[new_ID].pFontFileName=(char *) calloc( strlen( fontfilename)+1, sizeof(char))) == NULL){ T1_PrintLog( "T1_AddFont()", "Failed to allocate memory for Filename %s (FontID=%d)", T1LOG_ERROR, fontfilename, new_ID); T1_errno=T1ERR_ALLOC_MEM; return(-3); } strcpy( FontBase.pFontArray[new_ID].pFontFileName, fontfilename); /* Generate logfile entry */ sprintf( err_warn_msg_buf, "Assigned FontID %d to fontfile %s", new_ID, FontBase.pFontArray[new_ID].pFontFileName); T1_PrintLog( "T1_AddFont()", err_warn_msg_buf, T1LOG_STATISTIC); /* Return FontID of newly declared font */ return( new_ID); } /* T1_PrintLog() generates entries in the log file. msg_txt is subject to scan conversion and ... signifies a accordingly lrge variable list. */ void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...) { va_list vararg; static char levelid[4]={ 'E', 'W', 'S', 'D'}; time_t s_clock, *tp; if (t1lib_log_file==NULL) return; if ((level>t1lib_log_level) || (level<1)){ return; } else{ /* initialize argument list */ va_start( vararg, level); tp=&s_clock; s_clock=time( tp); /* fprintf( t1lib_log_file, "(%c) (%.24s) %s: ", levelid[level-1], ctime(&s_clock), func_ident); */ /* Don't print the time stamp */ fprintf( t1lib_log_file, "(%c) %s: ", levelid[level-1], func_ident ); vfprintf( t1lib_log_file, msg_txt, vararg ); fprintf( t1lib_log_file, "\n"); fflush( t1lib_log_file); /* cleanup variable list */ va_end( vararg); return; } } /* T1_SetLogLevel(): Set the level which a message must have so that it is printed into the logfile. This function may be called before T1_InitLib(). */ void T1_SetLogLevel( int level) { if ((level>0) && (level<5)) t1lib_log_level=level; return; } /* CheckForInit(): If no initialization of font mechanism has been done, return -1, indicating an error. */ int CheckForInit(void) { if(T1_Up) return(0); else return(-1); } /* CheckForFontID(): Checks the font mechanism concerning the specified ID. It returns: 0 if font belonging to FontID has not yet been loaded 1 if font belonging to FontID has already been loaded -1 if FontID is an invalid specification or t1lib not initialized */ int CheckForFontID( int FontID) { /* FontID is invalid */ if ((FontID<0)||(FontID>(pFontBase->no_fonts - 1))||(T1_Up==0)) return(-1); if (pFontBase->pFontArray[FontID].pType1Data==NULL) return(0); /* has not yet been loaded */ else return(1); /* has already been loaded */ } /* test_for_t1_file returns 0 if a file "name.pfa" or "name.pfb" was found. Else, -1 is returned. If successful, buffer contains the found filename string */ int test_for_t1_file( char *buffer ) { int i=0; char *FullName; /* First case: A PostScript Font ASCII File without extension (according to some UNIX-conventions) */ if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } while (buffer[i]!=0){ i++; } buffer[i]='.'; buffer[i+1]='p'; buffer[i+2]='f'; buffer[i+4]=0; /* Second case: A PostScript Font ASCII File */ buffer[i+3]='a'; if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } /* Third case: A PostScript Font Binary File */ buffer[i+3]='b'; if ((FullName=intT1_Env_GetCompletePath(buffer,T1_PFAB_ptr))!=NULL) { free(FullName); return(0); } /* If we get here no file was found => Set buffer to an empty string and return -1 */ buffer[0]=0; return(-1); } /* T1_GetFontFileName() returns a pointer to the filename of the font, associated with FontID. This filename does not contain a full path. */ char *T1_GetFontFileName( int FontID) { static char filename[T1_MAXPATHLEN+1]; if (CheckForInit())return(NULL); /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strcpy( filename, pFontBase->pFontArray[FontID].pFontFileName); return( filename); } /* As suggested by Nicolai Langfeldt, we make it possible to specify a completely independent path for the afm filename. This should make t1lib usable in context with using the kpathsearch-library. We allow setting those path´s after initialization, but before a font is loaded. returns 0: OK -1: Operation could not be performed */ int T1_SetAfmFileName( int FontID, char *afm_name) { if (CheckForFontID(FontID)!=0){ /* Operation may not be applied because FontID is invalid or font is loaded */ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (afm_name==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } if (pFontBase->pFontArray[FontID].pAfmFileName!=NULL){ /* we first free the current name */ free( pFontBase->pFontArray[FontID].pAfmFileName); pFontBase->pFontArray[FontID].pAfmFileName=NULL; } if ((pFontBase->pFontArray[FontID].pAfmFileName= (char *)malloc( (strlen(afm_name)+1)*sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( -1); } strcpy( pFontBase->pFontArray[FontID].pAfmFileName, afm_name); return(0); } /* We have a function for querying the name. Returns a pointer to the string or NULL if name was not explicitly set .*/ char *T1_GetAfmFileName( int FontID) { static char filename[T1_MAXPATHLEN+1]; if (CheckForInit())return(NULL); /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pAfmFileName==NULL) { return( NULL); } strcpy( filename, pFontBase->pFontArray[FontID].pAfmFileName); return( filename); } /* T1_Get_no_fonts(): Return the number of declared fonts */ int T1_Get_no_fonts(void) { if (CheckForInit())return(-1); return(FontBase.no_fonts); } /* T1_SetDeviceResolutions( x_res, y_res): Set the device's physical resolution in horizontal and vertical direction, mesured in DPI (Dots Per Inch). This should be done before the first font is loaded! */ int T1_SetDeviceResolutions( float x_res, float y_res) { int i; if (CheckForInit()) ; /* Not initialized -> no size dependent data -> OK */ else /* Check if size-dependent data is existent */ for ( i=T1_Get_no_fonts(); i; i--) if (pFontBase->pFontArray[i-1].pFontSizeDeps!=NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); /* There's is size dependent data for a font */ } /* Save resolutions and calculate horizontal and vertical scale factors to map desired bp to device pixel */ DeviceSpecifics.x_resolution=(float) x_res; DeviceSpecifics.y_resolution=(float) y_res; DeviceSpecifics.scale_x=(float)(((float)x_res)/BIGPOINTSPERINCH); DeviceSpecifics.scale_y=(float)(((float)y_res)/BIGPOINTSPERINCH); return(0); } /* T1_QueryX11Support(): Check at runtime to see if t1lib was compiled with X11 interface: */ int T1_QueryX11Support( void) { #ifndef T1LIB_NO_X11_SUPPORT return(1); #else return(0); #endif } /* int T1_CopyFont(): Copies the font associated with FontID to another location. The pointers to type1- , afm- and encoding data as well as the matrices remain completely untouched. However, size dependent data is not copied. The produced font is marked as a "logical" font. If no memory is available in the FONTPRIVATE-array, there's realloc'ed some more memory. The FontID which is assigned to the newly generated font is given as the return value, or < 0 if an error occurs. Also, the refcount entry of the source font is incremented by one. Return value -1: invalid FontID specified -2: source font is not a "physical" font -3: no memory for reallocation of FONTPRIVATEs -4: no memory for one of the mapping tables */ int T1_CopyFont( int FontID) { FONTPRIVATE *save_ptr; int k; int new_ID; /* Check for a valid source font */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Check if the font in question is a "physical" font, otherwise it may not be copied */ if (pFontBase->pFontArray[FontID].physical==0){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-2); } /* Check if free space for a new FONTPRIVATE is available; if not, realloc memory some amount larger */ save_ptr=pFontBase->pFontArray; if (pFontBase->no_fonts==pFontBase->no_fonts_limit){ pFontBase->pFontArray=(FONTPRIVATE *)realloc(pFontBase->pFontArray, (pFontBase->no_fonts_limit + ADVANCE_FONTPRIVATE) * sizeof(FONTPRIVATE)); if (pFontBase->pFontArray==NULL){ /* Restore pointer */ pFontBase->pFontArray=save_ptr; T1_errno=T1ERR_ALLOC_MEM; return(-3); } /* We zero the newly allocated memory */ if (pFontBase->pFontArray != NULL) { memset( pFontBase->pFontArray + pFontBase->no_fonts_limit, 0, ADVANCE_FONTPRIVATE * sizeof(FONTPRIVATE)); } pFontBase->no_fonts_limit += ADVANCE_FONTPRIVATE; } /* no_fonts-1 was the largest allowed font ID */ new_ID=pFontBase->no_fonts; /* Copy FONTPRIVATE-structure: */ pFontBase->pFontArray[new_ID]=pFontBase->pFontArray[FontID]; /* (Re)Set some values explicitly, others remain untouched: */ pFontBase->pFontArray[new_ID].pFontSizeDeps=NULL; pFontBase->pFontArray[new_ID].physical=0; /* AFM-mapping tables are to be setup for logical fonts separately (if AFM data is there) */ /* first, kerning map */ if (pFontBase->pFontArray[new_ID].pAFMData) { k=pFontBase->pFontArray[new_ID].pAFMData->numOfPairs; if (k>0){ /* kern map exists only if kerning pairs exist! */ if ((pFontBase->pFontArray[new_ID].pKernMap= (METRICS_ENTRY *)malloc( k*sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for kerning map (new_ID=%d)", new_ID); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-4); } memcpy( pFontBase->pFontArray[new_ID].pKernMap, pFontBase->pFontArray[FontID].pKernMap, k*sizeof( METRICS_ENTRY)); } else { /* no kerning pairs, bu AFM data present */ pFontBase->pFontArray[new_ID].pKernMap=NULL; } } else { /* AFM data not present at all */ pFontBase->pFontArray[new_ID].pKernMap=NULL; } /* second, encoding map */ if (pFontBase->pFontArray[FontID].pEncMap!=NULL) { if ((pFontBase->pFontArray[new_ID].pEncMap= (int *)calloc(256,sizeof(int)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for encoding map (new_ID=%d)", new_ID); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-4); } memcpy( pFontBase->pFontArray[new_ID].pEncMap, pFontBase->pFontArray[FontID].pEncMap, 256*sizeof( int)); } /* New font is logical --> indicate to which physical font it refers by setting refcount: */ pFontBase->pFontArray[new_ID].refcount=FontID; /* Now the struct is setup; increment no_fonts by 1 because new_ID is a valid font specification from now on. */ pFontBase->no_fonts++; /* Increment refcount in source font */ pFontBase->pFontArray[FontID].refcount++; /* Generate logfile entry */ sprintf( err_warn_msg_buf, "Assigned FontID %d to fontfile %s", new_ID, FontBase.pFontArray[new_ID].pFontFileName); T1_PrintLog( "T1_CopyFont()", err_warn_msg_buf, T1LOG_STATISTIC); return(new_ID); } /* T1_SetBitmapPad(): Set the value to which bitmap-scanlines are padded. This has to be done before initialization because it is a very rudimentary operation. */ int T1_SetBitmapPad( int pad) { if (T1_Up){ /* Library is initialized --> return error */ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } else{ switch (pad){ case 8: T1_pad=8; return(0); case 16: T1_pad=16; return(0); #ifdef T1_AA_TYPE64 case 32: T1_pad=32; return(0); #endif default: T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } } } /* T1_GetBitmapPad(): Read the value to which scanlines of bitmap are padded. This can be done before or after initialization. */ int T1_GetBitmapPad( void) { if (pFontBase) /* T1lib initialized --> return value from struct */ return( pFontBase->bitmap_pad); else{ if (T1_pad) return(T1_pad); /* pad is explicitly set --> return that value */ else return( T1GLYPH_PAD); /* not expl. set --> return compilation default */ } } /* bin_dump(): Print a binary dump of a byte, short and long variable (used for debug purposes only): */ void bin_dump_c(unsigned char value, char space_flag) { int i,j; for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } if (space_flag) printf(" "); } void bin_dump_s(unsigned short value, char space_flag) { int i,j; if (T1_CheckEndian()){ for (i=8;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } else{ for (i=0;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } if (space_flag) printf(" "); } void bin_dump_l(unsigned long value, char space_flag) { int i,j; if (T1_CheckEndian()){ for (i=24;i<=31;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=16;i<=23;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=8;i<=15;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } for (i=0;i<=7;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } else{ for (i=0;i<=31;i++){ if ((j=((value)>>i)&0x01)) printf("X"); else printf("."); } } if (space_flag) printf(" "); } /* CheckEndian(): Checks whether the current machine is of little or big endian architecture. This is important for concatenating bitmaps. Function returns 0 if LittleEndian and 1 if BigEndian representation is used on the current hardware. */ int T1_CheckEndian() { unsigned char *charptr; /* Generate test value */ unsigned short test=0x0001; /* Read out memory as unsigned char */ charptr=(unsigned char *)(&test)+1; /* Return value will be 1 if Big- and 0 if Little Endian */ return((int) *charptr); } /* T1_GetLibIdent(): Return the identifier string for the current version of t1lib */ char *T1_GetLibIdent( void) { static char buf[15]; sprintf( buf, "%s", T1LIB_IDENT); return( (char *)buf); } /* T1_SetRasterFlags(): Enable/Disable certain features in the rasterizer */ extern void T1_SetRasterFlags( int flags) { T1_Type1OperatorFlags=flags; return; } /* T1_GetFontFileName(): returns a pointer to the complete path filename of the font, associated with FontID as it is in use by t1lib. */ char *T1_GetFontFilePath( int FontID) { static char filepath[T1_MAXPATHLEN+1]; char *FileNamePath=NULL; /* is initialzed? */ if (CheckForInit()) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* lib is initialized and FontID is valid -> we can really expect a name */ if ((FileNamePath=intT1_Env_GetCompletePath( pFontBase->pFontArray[FontID].pFontFileName, T1_PFAB_ptr))==NULL) { T1_PrintLog( "T1_GetFontFilePath()", "Couldn't locate font file for font %d in %s", T1LOG_WARNING, FontID, T1_GetFileSearchPath(T1_PFAB_PATH)); T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } strcpy( filepath, FileNamePath); free( FileNamePath); return( filepath); } /* We have a function for querying the name. Returns a pointer to the string or NULL if name was not explicitly set .*/ char *T1_GetAfmFilePath( int FontID) { static char filepath[T1_MAXPATHLEN+1]; char *FontFileName; char *AFMFilePath; int i, j; /* is initialized? */ if ((CheckForInit())) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check first for valid FontID */ if ((FontID<0) || (FontID>FontBase.no_fonts)){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check wether AFM-file loading was suppressed on user's request */ if ((pFontBase->t1lib_flags & T1_NO_AFM)!=0) { /* this is no error condition, we simply return (NULL) */ return( NULL); } /* Check for explicitly associated metrics filename (via "T1_SetAfmFileName()"). If it exists, we return it! */ if (pFontBase->pFontArray[FontID].pAfmFileName!=NULL) { strcpy( filepath, pFontBase->pFontArray[FontID].pAfmFileName); sprintf( err_warn_msg_buf, "Returning explicitly specified path %s for Font %d", filepath, FontID); T1_PrintLog( "T1_GetAfmFilePath()", err_warn_msg_buf, T1LOG_DEBUG); return( filepath); } /* we have the usual case that the name of the metrics file has to be deduced from the font file name */ FontFileName=T1_GetFontFileName( FontID); i=strlen(FontFileName); j=i; strcpy( filepath, FontFileName); while ( filepath[i] != '.'){ if (i==0) break; else i--; } if (i==0){ /* We have a filename without extension -> append extension */ filepath[j]='.'; filepath[j+1]='a'; filepath[j+2]='f'; filepath[j+3]='m'; filepath[j+4]='\0'; } else{ /* we found a '.' -> replace extension */ filepath[i+1]='a'; filepath[i+2]='f'; filepath[i+3]='m'; filepath[i+4]='\0'; } /* Get full path of the afm file (The case of a full path name name specification is valid */ if ((AFMFilePath=intT1_Env_GetCompletePath( filepath, T1_AFM_ptr)) == NULL) { return NULL; } strcpy( filepath, AFMFilePath); free( AFMFilePath); return( filepath); } grace-5.1.23/T1lib/t1lib/t1enc.h0000644000076500001440000000375407415144742015622 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1enc.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-16 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t11enc.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1ENC_C static char **ScanEncodingFile( char *FileName); char **T1_LoadEncoding( char *FileName); int T1_DeleteEncoding( char **encoding); int T1_ReencodeFont( int FontID, char **Encoding); int T1_SetDefaultEncoding( char **encoding); char *T1_GetEncodingScheme( int FontID); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); #else extern char **T1_LoadEncoding( char *FileName); extern int T1_DeleteEncoding( char **encoding); extern int T1_ReencodeFont( int FontID, char **Encoding); extern int T1_SetDefaultEncoding( char **encoding); extern char *T1_GetEncodingScheme( int FontID); #endif grace-5.1.23/T1lib/t1lib/t1delete.c0000644000076500001440000002625007415144742016306 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1delete.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-03 ----- Description: This file is part of the t1-library. It contains functions for giving free previously allocated memory areas and similar things. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1DELETE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "t1types.h" #include "t1extern.h" #include "t1delete.h" #include "t1load.h" #include "t1finfo.h" #include "t1base.h" /* T1_DeleteSize(): Gives back all the memory allocated for size to the system. If size is somewhere in the middle of a linked list of sizes, it further takes care that the remaining list is linked in a proper way. Function returns 0 if successful and otherwise -1*/ int T1_DeleteSize( int FontID, float size) { int i, j; FONTSIZEDEPS *ptr, *next_ptr, *prev_ptr; int jobs=0; int antialias; int level[4]={0,T1_AA_NONE,T1_AA_LOW,T1_AA_HIGH}; for ( j=0; j<4; j++){ antialias=level[j]; /* Check if size exists; if not, return 1 */ if ((ptr=QueryFontSize( FontID, size, antialias))!=NULL){ /* We have to remove a size-> */ jobs++; /* Get pointers to structure which is before/after the structure to be deleted in the linked list and properly relink structures */ next_ptr=((FONTSIZEDEPS *)ptr)->pNextFontSizeDeps; prev_ptr=((FONTSIZEDEPS *)ptr)->pPrevFontSizeDeps; if ((prev_ptr==NULL)&&(next_ptr==NULL)){ /* There's only one single size, no relink is necessary => reset the initial pointer to indicate that no size dependent data is available */ pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; } else{ if (prev_ptr!=NULL) /* We are at the first size of the linked list and there are still some sizes left after removing the current */ prev_ptr->pNextFontSizeDeps=next_ptr; else pFontBase->pFontArray[FontID].pFontSizeDeps=next_ptr; if (next_ptr!=NULL) /* We are at the end of an list of at least two sizes: */ next_ptr->pPrevFontSizeDeps=prev_ptr; } /* Now, that the list is properly linked, free the memory used by size: */ /* Free the bitmaps memory: */ for (i=0; i<256; i++) if (ptr->pFontCache[i].bits) free(ptr->pFontCache[i].bits); /* Free memory for glyphs: */ free(ptr->pFontCache); /* Free the structure itself: */ free(ptr); /* Print log: */ sprintf( err_warn_msg_buf, "Size %f deleted for FontID %d (antialias=%d)", size, FontID, antialias); T1_PrintLog( "T1_DeleteSize()", err_warn_msg_buf, T1LOG_STATISTIC); } } /* Return the appropriate value */ if (jobs==0) return(-1); else return(0); } /* T1_DeleteAllSizes(): Gives back all the memory allocated for all sizes to the system. Function returns the number of removed sizes or -1 if an error ocurred. */ int T1_DeleteAllSizes( int FontID) { int sizecount; float currsize; FONTSIZEDEPS *ptr; if (CheckForFontID(FontID)!=1) return(-1); /* Start deleting at the end of the linked list: */ sizecount=0; if ((ptr=GetLastFontSize( FontID))==NULL){ /* There has not been any size dependent data: */ return(0); } while (((ptr=GetLastFontSize(FontID)) != NULL)){ currsize=ptr->size; T1_DeleteSize( FontID, currsize); sizecount++; } return(sizecount); } /* T1_FreeGlyph(): Gives the memory used by a glyph back to the system. */ int T1_FreeGlyph( GLYPH *glyph) { if (glyph!=NULL) { if (glyph->bits!=NULL) { free(glyph->bits); } free(glyph); } return(0); } /* T1_FreeCompCharData(): Return emory used by a composite character data information structure to the system */ int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci) { if (cci!=NULL) { if (cci->pieces!=NULL) { free( cci->pieces); } free( cci); } return( 0); } /* T1_DeleteFont(): Gives all memory used by a font back to the system. If the font is successfully deinstalled 0 is returned. A positive value indicates an error. */ int T1_DeleteFont( int FontID) { int result; if (CheckForFontID(FontID)==-1){ /* Invalid ID */ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (CheckForFontID(FontID)==0) /* Font is not loaded */ return(0); /* Memory freeing must be done hierachical, start with size dependent data: */ result=T1_DeleteAllSizes(FontID); /* Next we delete the AFM-mapping tables */ if (pFontBase->pFontArray[FontID].pEncMap!=NULL) free( pFontBase->pFontArray[FontID].pEncMap); if (pFontBase->pFontArray[FontID].pKernMap!=NULL) free( pFontBase->pFontArray[FontID].pKernMap); /* We do not touch the file name because this is only to be done by T1_CloseLib(): */ /* The Type-1 area and tyhe AFM-area may only be free'ed, if the font is a "physical" font and if its reference counter is 1, or if it is a logical font. Otherwise, other logical font use this physical one and it may not be free'ed. In this case, return the number of logical fonts which refer to this physical font. */ if ((pFontBase->pFontArray[FontID].physical==1)&& (pFontBase->pFontArray[FontID].refcount==1)){ /* Now handle the type 1 data: */ if (pFontBase->pFontArray[FontID].pType1Data!=NULL){ /* First: VM, which includes CharStrings, Private, .... */ free(pFontBase->pFontArray[FontID].vm_base); /* .. then the struct itself: */ free(pFontBase->pFontArray[FontID].pType1Data); pFontBase->pFontArray[FontID].pType1Data=NULL; } /* afm-data is yet there -> */ if (pFontBase->pFontArray[FontID].pAFMData!=NULL){ result=FreeAFMData(pFontBase->pFontArray[FontID].pAFMData); pFontBase->pFontArray[FontID].pAFMData=NULL; } } else{ if (pFontBase->pFontArray[FontID].physical==1){ /* font is physical and is referred to by other fonts -> Do nothing further and return number of references: */ return(pFontBase->pFontArray[FontID].refcount - 1); } } /* If we get here and the font is logical, we have to decrement the refcount of the referred physical font */ if (pFontBase->pFontArray[FontID].physical==0){ pFontBase->pFontArray[pFontBase->pFontArray[FontID].refcount].refcount--; } /* Set remaining area explicitly to 0 (all but pFontFileName and pAfmFileName!) */ pFontBase->pFontArray[FontID].pAFMData=NULL; pFontBase->pFontArray[FontID].pType1Data=NULL; pFontBase->pFontArray[FontID].pEncMap=NULL; pFontBase->pFontArray[FontID].pKernMap=NULL; pFontBase->pFontArray[FontID].pFontEnc=NULL; pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; pFontBase->pFontArray[FontID].vm_base=NULL; pFontBase->pFontArray[FontID].FontMatrix[0]=0.0; pFontBase->pFontArray[FontID].FontMatrix[1]=0.0; pFontBase->pFontArray[FontID].FontMatrix[2]=0.0; pFontBase->pFontArray[FontID].FontMatrix[3]=0.0; pFontBase->pFontArray[FontID].FontTransform[0]=0.0; pFontBase->pFontArray[FontID].FontTransform[1]=0.0; pFontBase->pFontArray[FontID].FontTransform[2]=0.0; pFontBase->pFontArray[FontID].FontTransform[3]=0.0; pFontBase->pFontArray[FontID].slant=0.0; pFontBase->pFontArray[FontID].extend=0.0; pFontBase->pFontArray[FontID].UndrLnPos=0.0; pFontBase->pFontArray[FontID].UndrLnThick=0.0; pFontBase->pFontArray[FontID].OvrLnPos=0.0; pFontBase->pFontArray[FontID].OvrLnThick=0.0; pFontBase->pFontArray[FontID].OvrStrkPos=0.0; pFontBase->pFontArray[FontID].OvrStrkThick=0.0; pFontBase->pFontArray[FontID].physical=0; pFontBase->pFontArray[FontID].refcount=0; pFontBase->pFontArray[FontID].space_position=0; pFontBase->pFontArray[FontID].info_flags=0; return(0); } /* FreeAFMData(): Give all memory used by afm-Information back to the system. */ int FreeAFMData( FontInfo *pAFMData) { if (pAFMData != NULL){ if (pAFMData->gfi != NULL){ free(pAFMData->gfi->afmVersion); pAFMData->gfi->afmVersion = NULL; free(pAFMData->gfi->fontName); pAFMData->gfi->fontName = NULL; free(pAFMData->gfi->fullName); pAFMData->gfi->fullName = NULL; free(pAFMData->gfi->familyName); pAFMData->gfi->familyName = NULL; free(pAFMData->gfi->weight); pAFMData->gfi->weight = NULL; free(pAFMData->gfi->version); pAFMData->gfi->version = NULL; free(pAFMData->gfi->notice); pAFMData->gfi->notice = NULL; free(pAFMData->gfi->encodingScheme); pAFMData->gfi->encodingScheme = NULL; free(pAFMData->gfi); pAFMData->gfi = NULL; } if (pAFMData->cwi != NULL){ free(pAFMData->cwi); pAFMData->cwi = NULL; } if (pAFMData->cmi != NULL){ int i = 0; CharMetricInfo *temp = pAFMData->cmi; Ligature *node = temp->ligs; for (i = 0; i < pAFMData->numOfChars; ++i){ for (node = temp->ligs; node != NULL; node = node->next){ free(node->succ); node->succ = NULL; free(node->lig); node->lig = NULL; } free(temp->name); temp->name = NULL; temp++; } free(pAFMData->cmi); pAFMData->cmi = NULL; } if (pAFMData->tkd != NULL){ free(pAFMData->tkd); pAFMData->tkd = NULL; } if (pAFMData->pkd != NULL){ int i = 0; for (i = 0; i < pAFMData->numOfPairs; ++i){ free(pAFMData->pkd[i].name1); pAFMData->pkd[i].name1 = NULL; free(pAFMData->pkd[i].name2); pAFMData->pkd[i].name2 = NULL; } free(pAFMData->pkd); pAFMData->pkd = NULL; } if (pAFMData->ccd != NULL){ int i = 0, j = 0; CompCharData *ccd = pAFMData->ccd; for (i = 0; i < pAFMData->numOfComps; ++i){ for (j = 0; j < ccd[i].numOfPieces; ++j){ free(ccd[i].pieces[j].pccName); ccd[i].pieces[j].pccName = NULL; } free(ccd[i].ccName); ccd[i].ccName = NULL; } free(pAFMData->ccd); pAFMData->ccd = NULL; } free(pAFMData); } return(0); } grace-5.1.23/T1lib/t1lib/t1afmtool.h0000644000076500001440000000347107415144742016512 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1afmtool.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1afmtool.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1AFMTOOL_C FontInfo *T1_GenerateAFMFallbackInfo( int FontID); int T1_WriteAFMFallbackFile( int FontID); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); #else extern FontInfo *T1_GenerateAFMFallbackInfo( int FontID); extern int T1_WriteAFMFallbackFile( int FontID); #endif grace-5.1.23/T1lib/t1lib/t1lib.h0000644000076500001440000004043007415144743015614 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1lib.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It must be included by the user of the t1lib. It contains function declarations and some basic data types, the user must deal with. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifndef T1LIB_H_INCLUDED #define T1LIB_H_INCLUDED /* type definitions, needed by the user: */ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* the data structure which contains the character bitmap description */ typedef struct { char *bits; /* A pointer to the characters local bitmap */ struct /* A struct containing diverse metric information */ { int ascent; int descent; int leftSideBearing; int rightSideBearing; int advanceX; int advanceY; } metrics; void *pFontCacheInfo; unsigned long bpp; } GLYPH; /* A structure representing a matrix */ typedef struct { double cxx; double cyx; double cxy; double cyy; } T1_TMATRIX; /* the bounding box data structure: */ typedef struct { int llx; /* lower left x-position */ int lly; /* lower left y-position */ int urx; /* upper right x-position */ int ury; /* upper right y-position */ } BBox; /* A data that makes most important information available to user. */ typedef struct { int width; /* The glyph's width */ BBox bbox; /* The glyph's bounding box */ int numchars; /* The number of characters in the glyph (string) */ int *charpos; /* A pointer to an integer array were the horizontal positions in (afm units) of the individual characters in the string are stored */ } METRICSINFO; #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) /* def's for T1_InitLib() */ #define NO_LOGFILE 0x0 #define LOGFILE 0x1 #define IGNORE_FONTDATABASE 0x2 /* Default is to read database */ #define IGNORE_CONFIGFILE 0x4 /* Default is to read config file */ #define T1_AA_CACHING 0x8 /* Cache aa-bytes */ #define T1_NO_AFM 0x10 /* Do not load or generate AFM data */ /* common 'yes'/'no' */ #define T1_YES 0x1 #define T1_NO 0x0 /* logfile levels: */ #define T1LOG_ERROR 1 #define T1LOG_WARNING 2 #define T1LOG_STATISTIC 3 #define T1LOG_DEBUG 4 /* #define's for manipulating searchpaths */ #define T1_PFAB_PATH 0x01 #define T1_AFM_PATH 0x02 #define T1_ENC_PATH 0x04 #define T1_FDB_PATH 0x08 #define T1_APPEND_PATH 0x00 #define T1_PREPEND_PATH 0x01 /* #define's for character/string properties (not all implemented) */ #define T1_DEFAULT 0x0000 #define T1_UNDERLINE 0x0001 #define T1_OVERLINE 0x0002 #define T1_OVERSTRIKE 0x0004 #define T1_DOUBLEOVERSTRIKE 0x0008 #define T1_RIGHT_TO_LEFT 0x0010 #define T1_SUBSCRIPT 0x0100 #define T1_SUPERSCRIPT 0x0200 #define T1_STROKED 0x1000 #define T1_KERNING 0x2000 /* Setting the subsampling value */ #define T1_AA_NONE 1 #define T1_AA_LOW 2 #define T1_AA_HIGH 4 /* Error handling: */ extern int T1_errno; /* These are from scanning a font file */ #define T1ERR_SCAN_FONT_FORMAT -5 #define T1ERR_SCAN_FILE_OPEN_ERR -4 #define T1ERR_SCAN_OUT_OF_MEMORY -3 #define T1ERR_SCAN_ERROR -2 #define T1ERR_SCAN_FILE_EOF -1 /* These are from generating paths */ #define T1ERR_PATH_ERROR 1 #define T1ERR_PARSE_ERROR 2 #define T1ERR_TYPE1_ABORT 3 /* These are from t1lib */ #define T1ERR_INVALID_FONTID 10 #define T1ERR_INVALID_PARAMETER 11 #define T1ERR_OP_NOT_PERMITTED 12 #define T1ERR_ALLOC_MEM 13 #define T1ERR_FILE_OPEN_ERR 14 #define T1ERR_UNSPECIFIED 15 #define T1ERR_NO_AFM_DATA 16 #define T1ERR_X11 17 #define T1ERR_COMPOSITE_CHAR 18 /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 /* definitions for outline handling */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* From/to conversion of pels/fractpels */ #define T1_TOPATHPOINT(p) (((long)p)<>FRACTBITS) /* A fractional point */ typedef struct { long x; long y; } T1_PATHPOINT; /* A straight outline segment, stroked or not stroked */ typedef struct pathsegment { char type; /* type of segment (line or move) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct pathsegment *link; /* pointer to next structure in linked list */ struct pathsegment *last; /* pointer to last structure in list */ T1_PATHPOINT dest; /* relative ending location of path segment */ } T1_PATHSEGMENT; /* A third order bezier segment */ typedef struct bezierpathsegment { char type; /* type of segment (bezier) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ T1_PATHSEGMENT *link; /* as with any 'segment' type */ T1_PATHSEGMENT *last; /* as with any 'segment' type */ T1_PATHPOINT dest; /* ending point (D) */ T1_PATHPOINT B; /* control point B */ T1_PATHPOINT C; /* control point C */ } T1_BEZIERSEGMENT; typedef T1_PATHSEGMENT T1_OUTLINE; #define T1_PATHTYPE_LINE 0x10 #define T1_PATHTYPE_BEZIER 0x12 #define T1_PATHTYPE_MOVE 0x15 /* Definitions for font subsetting */ #define T1_SUBSET_DEFAULT 0x00 #define T1_SUBSET_FORCE_REENCODE 0x01 #define T1_SUBSET_SKIP_REENCODE 0x02 #define T1_SUBSET_ENCRYPT_BINARY 0x04 /* This is only for debugging, it does not produce valid font-files! This flag is not in the documented API!. */ #define T1_SUBSET_ENCRYPT_NONE 0x08 /* Two structures for handling composite character data */ /* One structure for each symbol of the composite character */ typedef struct { int piece; /* the index of the current symbol */ int deltax; /* horizontal displacement of current symbol in CS */ int deltay; /* vertical displacement of current symbol in CS */ } T1_COMP_PIECE; /* This one defines the composite character, the number of pieces and how to access their data. */ typedef struct { int compchar; /* the base character in the current encoding */ int numPieces; /* the number of defined pieces including the base char */ T1_COMP_PIECE *pieces; /* a pointer to the pieces' information */ } T1_COMP_CHAR_INFO; /* function declarations: */ /* from t1base.c */ extern void *T1_InitLib( int log); extern int T1_CloseLib( void); extern int T1_AddFont( char *fontfilename); extern void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); extern void T1_SetLogLevel( int level); extern int CheckForInit(void); extern int CheckForFontID( int FontID); extern int test_for_t1_file( char *buffer ); extern char *T1_GetFontFileName( int FontID); extern int T1_Get_no_fonts(void); extern int T1_SetDeviceResolutions( float x_res, float y_res); extern int T1_CopyFont( int FontID); extern int T1_QueryX11Support( void); extern void bin_dump_c(unsigned char value); extern void bin_dump_s(unsigned short value); extern void bin_dump_l(unsigned long value); extern int T1_CheckEndian(void); extern int T1_SetBitmapPad( int pad); extern int T1_GetBitmapPad( void); extern char *T1_GetLibIdent( void); extern void T1_SetRasterFlags( int flags); extern char *T1_GetAfmFileName( int FontID); extern int T1_SetAfmFileName( int FontId, char *afm_name); extern char *T1_GetFontFilePath( int FontID); extern char *T1_GetAfmFilePath( int FontID); /* from t1delete.c */ extern int T1_DeleteSize( int FontID, float size); extern int T1_DeleteAllSizes( int FontID); extern int T1_FreeGlyph( GLYPH *glyph); extern int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); extern int T1_DeleteFont( int FontID); /* from t1enc.c */ extern char **T1_LoadEncoding( char *FileName); extern int T1_DeleteEncoding( char **encoding); extern int T1_ReencodeFont( int FontID, char **Encoding); extern int T1_SetDefaultEncoding( char **encoding); extern char *T1_GetEncodingScheme( int FontID); /* from t1env.c */ extern int T1_SetFileSearchPath( int type, char *pathname); extern int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); extern char *T1_GetFileSearchPath( int type); extern int T1_SetFontDataBase( char *filename); extern int T1_AddFontDataBase( int mode, char *filename); /* from t1finfo.c */ extern int T1_GetKerning( int FontID, char char1, char char2); extern int T1_GetCharWidth( int FontID, char char1); extern BBox T1_GetCharBBox( int FontID, char char1); extern float T1_GetUnderlinePosition( int FontID); extern float T1_GetUnderlineThickness( int FontID); extern float T1_GetItalicAngle( int FontID); extern int T1_GetIsFixedPitch( int FontID); extern char *T1_GetFontName( int FontID); extern char *T1_GetFullName( int FontID); extern char *T1_GetFamilyName( int FontID); extern char *T1_GetWeight( int FontID); extern char *T1_GetVersion( int FontID); extern char *T1_GetNotice( int FontID); extern char *T1_GetCharName( int FontID, char char1); extern int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); extern int T1_GetEncodingIndex( int FontID, char *char1); extern int *T1_GetEncodingIndices( int FontID, char *char1); extern int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); extern METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetFontBBox( int FontID); extern char **T1_GetAllCharNames( int FontID); extern int T1_GetNoKernPairs( int FontID); extern int T1_GetNoCompositeChars( int FontID); extern int T1_QueryCompositeChar( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); extern int T1_IsInternalChar( int FontID, char char1); /* from t1load.c */ extern int T1_LoadFont( int FontID); extern int openFontMetricsFile( int FontID); extern void *CreateNewFontSize( int FontID, float size, int aa); extern void *GetLastFontSize( int FontID); extern void *QueryFontSize( int FontID, float size, int aa); /* from t1set.c */ extern GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern GLYPH *T1_CopyGlyph(GLYPH *glyph); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); extern void T1_DumpPixmap( GLYPH *glyph); extern GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); /* from t1trans.c */ extern int T1_ExtendFont( int FontID, double extend); extern int T1_SlantFont( int FontID, double slant); extern int T1_TransformFont( int FontID, T1_TMATRIX *matrix); extern double T1_GetExtend( int FontID); extern double T1_GetSlant( int FontID); extern T1_TMATRIX T1_GetTransform( int FontID); extern int T1_SetLinePosition( int FontID, int linetype, float value); extern int T1_SetLineThickness( int FontID, int linetype, float value); extern float T1_GetLinePosition( int FontID, int linetype); extern float T1_GetLineThickness( int FontID, int linetype); extern T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); extern T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); /* from t1aaset.c */ extern GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern int T1_AASetGrayValues(unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); extern int T1_AAHSetGrayValues( unsigned long *grayvals); extern int T1_AANSetGrayValues( unsigned long bg, unsigned long fg); extern int T1_AAGetGrayValues( long *pgrayvals); extern int T1_AAHGetGrayValues( long *pgrayvals); extern int T1_AANGetGrayValues( long *pgrayvals); extern int T1_AASetBitsPerPixel( int bpp); extern int T1_AAGetBitsPerPixel( void); extern int T1_AASetLevel( int level); extern int T1_AAGetLevel( void); extern GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); extern int T1_AASetSmartLimits( float limit1, float limit2); extern int T1_AASetSmartMode( int smart); /* from t1afmtool.c */ extern int T1_WriteAFMFallbackFile( int FontID); /* from t1outline.c */ extern T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); extern T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); extern T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); extern void T1_DumpPath( T1_OUTLINE *path); extern void T1_AbsolutePath( T1_OUTLINE *rpath); extern void T1_RelativePath( T1_OUTLINE *apath); extern void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(long *x,long *y,int type)); extern T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); extern void T1_FreeOutline( T1_OUTLINE *path); /* from t1subset.c */ extern char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); extern char *T1_GetCharString( int FontID, char *charname, int *len); extern int T1_GetlenIV( int FontID); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* T1LIB_H_INCLUDED */ grace-5.1.23/T1lib/t1lib/t1delete.h0000644000076500001440000000367207415144742016316 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1delete.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-03 ----- Description: This file is part of the t1-library. It contains functions for setting characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1DELETE_C int T1_DeleteSize( int FontID, float size); int T1_DeleteAllSizes( int FontID); int T1_FreeGlyph( GLYPH *glyph); int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); int T1_DeleteFont( int FontID); int FreeAFMData( FontInfo *pAFMData); #else extern int T1_DeleteSize( int FontID, float size); extern int T1_DeleteAllSizes( int FontID); extern int T1_FreeGlyph( GLYPH *glyph); extern int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci); extern int T1_DeleteFont( int FontID); extern int FreeAFMData( FontInfo *pAFMData); #endif grace-5.1.23/T1lib/t1lib/sysconf.h0000644000076500001440000000012610037046500016245 0ustar fnevgenyusers#include #define T1LIB_IDENT "1.3.1p3-grace" #define T1LIB_NO_X11_SUPPORT grace-5.1.23/T1lib/t1lib/t1trans.c0000644000076500001440000003404607415144743016176 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1trans.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains functions for transforming fonts and setting line-parameters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1TRANS_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1trans.h" #include "t1base.h" /* T1_ExtendFont(): Extend the font referenced by FontID by the factor extend. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_ExtendFont( int FontID, double extend) { /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].extend=extend; pFontBase->pFontArray[FontID].FontTransform[0] = extend; return(0); } /* T1_GetExtend(): Return the current extension factor of the font FontID Return: 0.0 if font not loaded current extent otherwise */ double T1_GetExtend( int FontID) { /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return( pFontBase->pFontArray[FontID].extend); } /* T1_SlantFont(): Slant the font referenced by FontID by the factor extend. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_SlantFont( int FontID, double slant) { /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].slant=slant; pFontBase->pFontArray[FontID].FontTransform[2] = slant; return(0); } /* T1_GetSlant(): Return the current slanting factor of the font FontID Return: 0.0 if font not loaded current slant otherwise (may also be 0.0!) */ double T1_GetSlant( int FontID) { /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return( pFontBase->pFontArray[FontID].slant); } /* T1_TransformFont(): Transform the font referenced by FontID according to the transform matrix. This is only allowed if no size dependent data exists. Of course, the font must already have been loaded. Returns 0 for success and -1 otherwise. */ int T1_TransformFont( int FontID, T1_TMATRIX *matrix) { /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].FontTransform[0] = matrix->cxx; pFontBase->pFontArray[FontID].FontTransform[1] = matrix->cxy; pFontBase->pFontArray[FontID].FontTransform[2] = matrix->cyx; pFontBase->pFontArray[FontID].FontTransform[3] = matrix->cyy; return(0); } /* T1_GetTransform(): Return the current transformation matrix for the font FontID Return: [0.0, 0.0, 0.0, 0.0] if font not loaded current tmatrix otherwise */ T1_TMATRIX T1_GetTransform( int FontID) { T1_TMATRIX tmatrix={0.0, 0.0, 0.0, 0.0}; /* First, check for font residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(tmatrix); } tmatrix.cxx=pFontBase->pFontArray[FontID].FontTransform[0]; tmatrix.cxy=pFontBase->pFontArray[FontID].FontTransform[1]; tmatrix.cyx=pFontBase->pFontArray[FontID].FontTransform[2]; tmatrix.cyy=pFontBase->pFontArray[FontID].FontTransform[3]; return( tmatrix); } /* Functions for setting line-parameters: linetypeis expected to be an OR'ed combination of T1_UNDERLINE, T1_OVERLINE and T1_OVERSTRIKE. */ int T1_SetLinePosition( int FontID, int linetype, float value) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (linetype & T1_UNDERLINE){ pFontBase->pFontArray[FontID].UndrLnPos=value; return( 0); } if (linetype & T1_OVERLINE){ pFontBase->pFontArray[FontID].OvrLnPos=value; return( 0); } if (linetype & T1_OVERSTRIKE){ pFontBase->pFontArray[FontID].OvrStrkPos=value; return( 0); } /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } int T1_SetLineThickness( int FontID, int linetype, float value) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } if (linetype & T1_UNDERLINE){ pFontBase->pFontArray[FontID].UndrLnThick=value; return( 0); } if (linetype & T1_OVERLINE){ pFontBase->pFontArray[FontID].OvrLnThick=value; return( 0); } if (linetype & T1_OVERSTRIKE){ pFontBase->pFontArray[FontID].OvrStrkThick=value; return( 0); } /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } float T1_GetLinePosition( int FontID, int linetype) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } if (linetype & T1_UNDERLINE) return( pFontBase->pFontArray[FontID].UndrLnPos); if (linetype & T1_OVERLINE) return( pFontBase->pFontArray[FontID].OvrLnPos); if (linetype & T1_OVERSTRIKE) return( pFontBase->pFontArray[FontID].OvrStrkPos); /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( 0.0); } float T1_GetLineThickness( int FontID, int linetype) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } if (linetype & T1_UNDERLINE) return( pFontBase->pFontArray[FontID].UndrLnThick); if (linetype & T1_OVERLINE) return( pFontBase->pFontArray[FontID].OvrLnThick); if (linetype & T1_OVERSTRIKE) return( pFontBase->pFontArray[FontID].OvrStrkThick); /* The linetype was bad */ T1_errno=T1ERR_INVALID_PARAMETER; return( 0.0); } /* Functions for intuitively transforming matrices. All function operate on their original objects. In case NULL is specified, a unity-matrix is allocated by the function and then tranformed appropriately. Note that in order to concatenate transformation in the sense of t1lib the current transformation matrix must be left-multiplied by the trnasformation to be applied! */ /* Rotation: ( x11' x21' ) ( cos(a) -sin(a) ) ( x11 x21 ) ( ) = ( ) * ( ) ( x12' x22' ) ( sin(a) cos(a) ) ( x12 x22 ) */ T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle) { T1_TMATRIX tmat; if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } memcpy( &tmat, matrix, sizeof(T1_TMATRIX)); /* Convert angle to radians: */ angle=angle*PI/180.0; /* multiply matrices */ matrix->cxx=cos((double)angle) * tmat.cxx - sin((double)angle) * tmat.cxy; matrix->cyx=cos((double)angle) * tmat.cyx - sin((double)angle) * tmat.cyy; matrix->cxy=sin((double)angle) * tmat.cxx + cos((double)angle) * tmat.cxy; matrix->cyy=sin((double)angle) * tmat.cyx + cos((double)angle) * tmat.cyy; return( matrix); } /* Horizontal mirroring */ /* H-Mirror: ( x11' x21' ) ( -1 0 ) ( x11 x21 ) ( -x11 -x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx *=-1.0; matrix->cyx *=-1.0; return( matrix); } /* Vertical mirroring */ /* V-Mirror: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 -1 ) ( x12 x22 ) ( -x12 -x22 ) */ T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy *=-1.0; matrix->cyy *=-1.0; return( matrix); } /* Horizontal shearing */ /* H-Shearing: ( x11' x21' ) ( 1 f ) ( x11 x21 ) ( x11+f*x12 x21+f*x22 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx +=shear*matrix->cxy; matrix->cyx +=shear*matrix->cyy; return( matrix); } /* Vertical shearing */ /* V-Shearing: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( f 1 ) ( x12 x22 ) ( x12+f*x11 x22+f*x21 ) */ T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy +=shear*matrix->cxx; matrix->cyy +=shear*matrix->cyx; return( matrix); } /* Horizontal extension */ /* Horizontal-Extension: ( x11' x21' ) ( f 0 ) ( x11 x21 ) ( f*x11 f*x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 1 ) ( x12 x22 ) ( x12 x22 ) */ T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxx *=extent; matrix->cyx *=extent; return( matrix); } /* Vertical extension */ /* Vertical-Extension: ( x11' x21' ) ( 1 0 ) ( x11 x21 ) ( x11 x21 ) ( ) = ( ) * ( ) = ( ) ( x12' x22' ) ( 0 f ) ( x12 x22 ) ( f*x12 f*x22 ) */ T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent) { if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } matrix->cxy *=extent; matrix->cyy *=extent; return( matrix); } /* General transformation */ /* ( x11 x21 ) ( y11 y21 ) ( x11*y11+x21*y12 x11*y21+x21*y22 ) ( ) * ( ) = ( ) ( x12 x22 ) ( y12 y22 ) ( x12*y11+x22*y12 x12*y21+x22*y22 ) */ T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy) { T1_TMATRIX tmat; if (matrix==NULL){ if ((matrix=(T1_TMATRIX *)malloc( sizeof(T1_TMATRIX)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return( NULL); } matrix->cxx=1.0; matrix->cyx=0.0; matrix->cxy=0.0; matrix->cyy=1.0; } memcpy( &tmat, matrix, sizeof(T1_TMATRIX)); matrix->cxx=cxx * tmat.cxx + cyx * tmat.cxy; matrix->cyx=cxx * tmat.cyx + cyx * tmat.cyy; matrix->cxy=cxy * tmat.cxx + cyy * tmat.cxy; matrix->cyy=cxy * tmat.cyx + cyy * tmat.cyy; return( matrix); } grace-5.1.23/T1lib/t1lib/t1aaset.h0000644000076500001440000000643507415144742016151 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1aaset.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1set.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1AASET_C GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); int T1_AASetGrayValues( unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); int T1_AAHSetGrayValues( unsigned long *grayvals); int T1_AANSetGrayValues( unsigned long fg, unsigned long bg); int T1_AAGetGrayValues( long *pgrayvals); int T1_AAHGetGrayValues( long *pgrayvals); int T1_AANGetGrayValues( long *pgrayvals); int T1_AASetBitsPerPixel( int bpp); int T1_AAGetBitsPerPixel( void); int T1_AASetLevel( int level); int T1_AAGetLevel( void); GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); int T1_AASetSmartLimits( float limit1, float limit2); int T1_AASetSmartMode( int smart); #else extern GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern int T1_AASetGrayValues( unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black); extern int T1_AAHSetGrayValues( unsigned long *grayvals); extern int T1_AANSetGrayValues( unsigned long bg, unsigned long fg); extern int T1_AAGetGrayValues( long *pgrayvals); extern int T1_AAHGetGrayValues( long *pgrayvals); extern int T1_AANGetGrayValues( long *pgrayvals); extern int T1_AASetBitsPerPixel( int bpp); extern int T1_AAGetBitsPerPixel( void); extern int T1_AASetLevel( int level); extern int T1_AAGetLevel( void); extern GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag); extern int T1_AASetSmartLimits( float limit1, float limit2); extern int T1_AASetSmartMode( int smart); #endif grace-5.1.23/T1lib/t1lib/t1types.h0000644000076500001440000002057007415144743016215 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1types.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-04 ----- Description: This file is part of the t1-library. It contains type definitions used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1TYPES_H typedef struct { int flags; int chars; int hkern; } METRICS_ENTRY; typedef struct { char *pFontFileName; /* Pointer to the font's filename */ char *pAfmFileName; /* Pointer to the afm filename, IFF set explicitly */ FontInfo *pAFMData; /* A pointer to a struct which gives access to all the data contained in the .afm-file. If this pointer is NULL, no .afm-file had been found. => There's no advanced info on the font available. */ psfont *pType1Data; /* A pointer to a struct giving access to all information contained in the .pfa/.pfb-file. This is needed! */ int *pEncMap; /* For fast mapping from charnames to encoding indices */ METRICS_ENTRY *pKernMap; /* dito */ int KernMapSize; char **pFontEnc; /* This is the pointer to the encoding array associated with that particular font. If FontEnc=NULL, it means the internal (fontspecific) encoding is to be used. */ char *vm_base; /* The base address of the virtual memory area for this font. It must be stored in order to be able to realloc and free those memory areas later. */ void *pFontSizeDeps; /* This one points to a linked list of structures which store all font size dependent data. */ double FontMatrix[4]; /* Two matrices which store the font matrix and special Transformation to be applied, such as slant and extend or probably some rotation. */ double FontTransform[4]; float slant; /* A slant factor for the font */ float extend; /* A extension factor for the font */ float UndrLnPos; /* Parameters for ~lining rules */ float UndrLnThick; float OvrLnPos; float OvrLnThick; float OvrStrkPos; float OvrStrkThick; unsigned short physical; /* This entry is used to decide, whether a font is associated with an own physical fontfile, or whether it has been created as a "logical" font by copying another "physical" font. */ unsigned short refcount; /* At load time this counter is set to 1. Every time, a T1_CopyFont() is executed on this font, this counter is incremented by 1. This gives the possibility to decide whether a physical font is used by some logical font. */ short space_position; /* The position where "space" is encoded, is saved in this entry. The space character needs special treatment. Saving its position here yields faster execution during rastering of strings with a user-supplied space-offset! */ short info_flags; /* Here some info may be stored */ } FONTPRIVATE; /* A structure representing a matrix */ typedef struct { double cxx; double cyx; double cxy; double cyy; } T1_TMATRIX; /* Following struct is used for storing all information for a particular rendered character glyph */ typedef struct { char *bits; /* A pointer to the characters local bitmap */ struct /* A struct containing diverse metric information */ { int ascent; int descent; int leftSideBearing; int rightSideBearing; int advanceX; int advanceY; } metrics; void *pFontCacheInfo; unsigned long bpp; /* The number of bits that represent 1 pixel */ } GLYPH; /* Next comes the struct declaration for FontSizeDeps, which stores size specific data of a font */ typedef struct { GLYPH *pFontCache; /* Pointer to the cache area of this font at this size */ void *pNextFontSizeDeps; /* A pointer to the next size's FontSizeDeps-structure. */ void *pPrevFontSizeDeps; /* A pointer to the previous size's FontSizeDeps-structure or NULL if the current is the first. */ struct XYspace *pCharSpaceLocal; /* This is a scaled version of the global version for this font. */ float size; /* The desired size, to be specified in bp's. */ int antialias; /* Switch for marking the current size antialiased */ } FONTSIZEDEPS; /* A data that makes most important information available to user. */ typedef struct { int width; /* The glyph's width */ BBox bbox; /* The glyph's bounding box */ int numchars; /* The number of characters in the glyph (string) */ int *charpos; /* A pointer to an integer array were the horizontal positions in (afm units) of the individual characters in the string are stored */ } METRICSINFO; /* Handling of outlines: These definitions decouple from the type 1 rasterizers def's and make the necessary stuff available to end users */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* From/to conversion of pels/fractpels */ #define T1_TOPATHPOINT(p) (((long)p)<>FRACTBITS) /* A fractional point */ typedef struct { long x; long y; } T1_PATHPOINT; /* A straight outline segment, stroked or not stroked */ typedef struct pathsegment { char type; /* type of segment (line or move) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct pathsegment *link; /* pointer to next structure in linked list */ struct pathsegment *last; /* pointer to last structure in list */ T1_PATHPOINT dest; /* relative ending location of path segment */ } T1_PATHSEGMENT; /* A third order bezier segment */ typedef struct bezierpathsegment { char type; /* type of segment (bezier) */ unsigned char flag; /* type1 rasterizer internal stuff */ short references; /* type1 rasterizer internal stuff */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ T1_PATHSEGMENT *link; /* as with any 'segment' type */ T1_PATHSEGMENT *last; /* as with any 'segment' type */ T1_PATHPOINT dest; /* ending point (D) */ T1_PATHPOINT B; /* control point B */ T1_PATHPOINT C; /* control point C */ } T1_BEZIERSEGMENT; typedef T1_PATHSEGMENT T1_OUTLINE; /* Two structures for handling composite character data */ /* One structure for each symbol of the composite character */ typedef struct { int piece; /* the index of the current symbol */ int deltax; /* horizontal displacement of current symbol in CS */ int deltay; /* vertical displacement of current symbol in CS */ } T1_COMP_PIECE; /* This one defines the composite character, the number of pieces and how to access their data. */ typedef struct { int compchar; /* the base character in the current encoding */ int numPieces; /* the number of defined pieces including the base char */ T1_COMP_PIECE *pieces; /* a pointer to the pieces' information */ } T1_COMP_CHAR_INFO; grace-5.1.23/T1lib/t1lib/t1enc.c0000644000076500001440000005526707521323634015620 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1enc.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-18 ----- Description: This file is part of the t1-library. It contains functions encoding handling at runtime. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1ENC_C #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1enc.h" #include "t1env.h" #include "t1base.h" #include "t1finfo.h" static char defaultencodingname[]="Unspecified"; /* This struct is retunred by the tokenizer. It contains indices in linebuf for the first and the last character in a token */ typedef struct { int first; int last; } CNTOKEN; /* ScanForWord(): Tokenizer for ScanEncodingFile. - and return the first and last index in linebuf of the token - skips whitespace and comments - the vector marks [ and ] are considered token-delimiters and also treated as independent tokens - the literal escape char "/" is also considered as a token delimiter but is not returned as a token. This function leaves linebuf unmodified so that in case of a failure, TryT1LibEncoding() will receive a clean buffer! */ static CNTOKEN *ScanForWord( char *lb, int size) { static int i=-1; int j; int comment; static CNTOKEN currtoken={-1,-1}; /* Reset tokenizer */ if (lb==NULL) { i=-1; currtoken.first=-1; currtoken.last=-1; return NULL; } comment=0; j=-1; while (++i word */ if (j==-1) { j=i; currtoken.first=j; continue; } } /* We're at the end of the buffer. Do we have a word? */ if (j!=-1) { currtoken.last=i-1; return &currtoken; } /* We have nothing */ return NULL; } /* tokcpy(): Copy a token from linebuf and append \0 */ static char *tokcpy( char *dest, const char *src, int first, int last) { /* we do not do any range or error checking in this function */ memcpy( dest, &(src[first]), last-first+1); dest[last-first+1]='\0'; return dest; } /* TryDVIPSEncoding(): Try to read an encoding file conforming to the dvips specification. The file's contents is expected in a buffer "linebuf" of size "filesize". Function returns the actual size of the charnames memory or -1. */ static int TryDVIPSEncoding( char *linebuf, int filesize, char *charnames) { char token[256]; char *encname; int charname_count=0; int k=0; CNTOKEN *currtokenP; /* Initialize tokenizer */ currtokenP=ScanForWord( NULL, filesize); currtokenP=ScanForWord(linebuf,filesize); if ( (currtokenP!=NULL) && (linebuf[currtokenP->first]=='/')) { /* / indicates start of postscript string literal, so this could be a postscript .enc file */ if ((encname=(char *)malloc( (currtokenP->last - currtokenP->first + 1 + 1) * sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } else { /* store encoding name */ if (currtokenP->first==currtokenP->last) { /* PostScript encoding requires an identifier so this does not seem to be a valid encoding file */ free( encname); return( -1); } tokcpy( encname, linebuf, currtokenP->first+1, currtokenP->last); } /* Next, the PostScript "mark" character is expected */ if ( ((currtokenP=ScanForWord(linebuf,filesize))!=NULL) && (currtokenP->first==currtokenP->last) && (linebuf[currtokenP->first]!='[') ) { /* Since we got up to here, there is a certain probability that we have a PostScript encoding definition, but with invalid syntax. So put log message. */ sprintf( err_warn_msg_buf, "Expected encoding definition after %s, but did not find \"[\"-character", encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } /* now, try to read 256 literal character names. We do not check for charname count because this would bypass error checking. */ while((currtokenP=ScanForWord(linebuf,filesize))!=NULL) { /* End of vector operator? */ if ( (currtokenP->first==currtokenP->last) && /* one character? */ (linebuf[currtokenP->first]==']')) { break; } /* We drop the escape character if it is present. However, non-literal name specifications are not allowed in encoding vectors. */ if (linebuf[currtokenP->first]!='/') { sprintf( err_warn_msg_buf, "Found non-literal name (c=%c (first=%d, last=%d)) at slot %d while scanning encoding vector %s.", linebuf[currtokenP->first], currtokenP->first, currtokenP->last, charname_count, encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } else { /* OK, first char in token is "/". Does there follow a name? */ if ( currtokenP->first==currtokenP->last) { sprintf( err_warn_msg_buf, "Empty literal name at slot %d while scanning encoding vector %s.", charname_count, encname); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); if (encname!=NULL) free( encname); return( -1); } } /* We seem to have a valid name -> copy name to *charnames-array */ tokcpy( &(charnames[k]), linebuf, currtokenP->first+1, currtokenP->last); k+=currtokenP->last-currtokenP->first+1; /* note: we have omitted "/"! */ /* Increment character counter */ charname_count++; /* set index to start of next word/line */ } /* end of loop scanning character names */ if (currtokenP==NULL) { /* In this case loop has been stopped because buffer end has been reached. Since we did not alreay read the ]-character, this is an error condition. */ sprintf( err_warn_msg_buf, "Premature end of encoding definition encountered." ); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* Since the above loop has not been finished due to a NULL-ptr, the token ] must have been encountered. Thus, read ahead and look for def: */ if ((currtokenP=ScanForWord(linebuf,filesize))==NULL) { sprintf( err_warn_msg_buf, "Premature end of encoding definition encountered."); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } if (strcmp(tokcpy( &(charnames[k]), linebuf, currtokenP->first, currtokenP->last), "def")!=0) { /* we store the current token in charnames only temporarily, so we do not increment k! */ sprintf( err_warn_msg_buf, "Closing token \"def\" expected but found \"%s\".", &(charnames[k])); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* Encoding definition is complete. we do not allow any further tokens except comments. */ if ((currtokenP=ScanForWord(linebuf,filesize))!=NULL) { tokcpy( token, linebuf, currtokenP->first, currtokenP->last); sprintf( err_warn_msg_buf, "Token \"%s\" after closing \"def\" in successfully scanned encoding file makes encoding definition file invalid", token); T1_PrintLog( "TryDVIPSEncoding()", err_warn_msg_buf, T1LOG_WARNING); free(encname); return( -1); } /* we allow less than 256 character names. The missing ones are filled now with .notdef */ for ( ; charname_count<256; charname_count++) { tokcpy( &(charnames[k]), ".notdef", 0, 6); k+=8; } /* Append the string for the encoding's name */ strcpy( &(charnames[k]), encname); k +=strlen(encname)+1; free(encname); return( k); } /* file does not start with / -> no dvips-encoding file */ return( -1); } /* TryT1LibEncoding(): Try to read an encoding file conforming to the t1lib specification. The file's contents is expected in a buffer "linebuf" of size "filesize". Function returns the actual size of the charnames memory or -1. */ static int TryT1LibEncoding( char *linebuf, int filesize, char *charnames) { int i=0, j=0, k=0, l=0; char save_char; int charname_count=0; while(i no encoding read */ } /* enc_fp points now to a (hopefully) valid encoding file */ /* Get the file size */ fseek( enc_fp, 0, SEEK_END); filesize=ftell(enc_fp); /* Reset fileposition to start */ fseek( enc_fp, 0, SEEK_SET); if ((linebuf=(char *)calloc( filesize, sizeof(char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Allocate space for character names, assume the worst case and realloc later. The DVIPS-parser requires one more char in order to work properly */ if ((charnames=(char *)calloc( filesize + strlen(defaultencodingname+1), sizeof(char)))==NULL){ free( linebuf); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } fread((char *)linebuf, sizeof(char), filesize, enc_fp); fclose(enc_fp); /* file is read. Operate now on the buffer. */ /* try dvips encoding file */ cnsize=TryDVIPSEncoding( linebuf, filesize, charnames); if ( cnsize>-1) { /* a debug message to log file */ sprintf( err_warn_msg_buf, "Scanned file %s (%d bytes) as dvips-encoding file.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_DEBUG); } else { /* try t1lib encoding file */ cnsize=TryT1LibEncoding( linebuf, filesize, charnames); if ( cnsize>-1) { /* write a debug message to log file */ sprintf( err_warn_msg_buf, "Scanned file %s (%d bytes) as t1lib-encoding file.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_DEBUG); } else { /* write a warning message because loading encoding entirely failed */ sprintf( err_warn_msg_buf, "Scanning file %s (%d bytes) as encoding file failed.", FileName, filesize); T1_PrintLog( "ScanEncodingFile()", err_warn_msg_buf, T1LOG_WARNING); } } if ( cnsize<0) { /* T1_errno is already set from the respective function */ if ( charnames!=NULL) { free(charnames); } free(linebuf); return( NULL); } /* cnsize contains the size of the charnames' memory, so let's now realloc charnames */ charnames=(char *)realloc( charnames, cnsize*sizeof(char)); /* Now initialize the array with the start-addresses of the character name strings */ /* We alloc 257 to save the encoding's name at the 257th entry */ if ((encoding=(char **)malloc(257*sizeof(char *)))==NULL) { if ( charnames!=NULL) { free(charnames); } free(linebuf); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } while (i<257) { encoding[i]=&charnames[j]; while (charnames[j]) j++; j++; i++; } free( linebuf); return(encoding); } /* T1_LoadEncoding(): Load an encoding file to have a new encoding available. If successful, the pointer to the encoding array is returned. In case of an error, the return value is NULL. */ char **T1_LoadEncoding( char *FileName) { char **Encoding; char *EncFileName; if( FileName==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if ((EncFileName=intT1_Env_GetCompletePath( FileName, T1_ENC_ptr))==NULL){ T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } Encoding=ScanEncodingFile(EncFileName); free(EncFileName); return(Encoding); } /* T1_DeleteEncoding() free a previously loaded encoding */ int T1_DeleteEncoding( char **encoding) { if (encoding){ /* First free character names memory */ free( encoding[0]); /* then, free pointer array */ free( encoding); } return(0); } /* T1_ReencodeFont(): Assign a new encoding to an existent font. This is only allowed if no size dependent data exists for the font in question. Moreover, the font must be loaded already since must get the position of the space-character. Function returns 0 if successful, and -1 otherwise. */ int T1_ReencodeFont( int FontID, char **Encoding) { int i, j, k, l, m; char *charname; PairKernData *pkd; METRICS_ENTRY *kern_tbl; int char1, char2; /* First, check for valid font ID residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* Second, check whether size-dependent data exists: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps != NULL){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->pFontArray[FontID].pFontEnc=Encoding; /* We have to update the space_position-entry in the FONTPRIVATE. If space is not found (not encoded), set it to -1: */ pFontBase->pFontArray[FontID].space_position=-1; i=0; if (Encoding){ /* external encoding */ while (i<256){ if (strcmp( (char *)pFontBase->pFontArray[FontID].pFontEnc[i], "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } else{ /* reencoding to internal encoding */ while (i<256){ if (strcmp( (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[i].data.arrayP, "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } /* Now update afm index mapping: */ if (pFontBase->pFontArray[FontID].pAFMData != NULL){ for (i=0; i<256; i++) { charname=T1_GetCharName( FontID, i); /* in a first loop check for ordinary characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfChars; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->cmi[j].name)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=j+1; /* index 0 is reserved! */ continue; } } /* if nothing has been found, check for composite characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=-(j+1); /* index 0 is reserved! */ /* Note: Metrics of composite characters already exist so that there is no need to recalculate them! */ continue; } } } /* Update kerning table */ k=pFontBase->pFontArray[FontID].pAFMData->numOfPairs; if (k>0){ /* i.e., there are any pairs */ /* OK, it does not suffice to alloc numOfPairs METRICS_ENTRYs, because a given character might be encoded at several locations and kerning should still work. As a worst case estimation, we allocate 256^2 and realloc later. */ if ((pFontBase->pFontArray[FontID].pKernMap= (METRICS_ENTRY *)malloc( (256*256) *sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for metrics map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } kern_tbl=pFontBase->pFontArray[FontID].pKernMap; pkd=pFontBase->pFontArray[FontID].pAFMData->pkd; j=0; for ( i=0; i Put char1 in higher byte and char2 in LSB: */ kern_tbl[j].chars=(char1 << 8) | char2; /* We only make use of horizontal kerning */ kern_tbl[j].hkern=pkd[i].xamt; j++; } /* while (char2) */ } /* while (char1) */ } /* for */ /* We are done, realloc memory: */ kern_tbl=(METRICS_ENTRY*) realloc( kern_tbl, j*sizeof(METRICS_ENTRY)); /* We now sort the kerning array with respect to char indices */ qsort( kern_tbl, (size_t) j, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY ); /* Finally write back pointer for the case that realloc changed the pointer */ pFontBase->pFontArray[FontID].pKernMap=kern_tbl; pFontBase->pFontArray[FontID].KernMapSize=j; } else { pFontBase->pFontArray[FontID].pKernMap=NULL; } } return(0); } /* T1_SetDefaultEncoding(): Set the default encoding vector that's used when fonts are loaded. */ int T1_SetDefaultEncoding( char **encoding) { if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pFontBase->default_enc=encoding; return(0); } /* T1_GetEncodingScheme(): Get the name associated with the current encoding vector of font FontID */ char *T1_GetEncodingScheme( int FontID) { static char enc_scheme[256]; /* First, check for valid font ID residing in memory: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ if (pFontBase->pFontArray[FontID].info_flags & USES_STANDARD_ENCODING){ strcpy( enc_scheme, "StandardEncoding"); } else { strcpy( enc_scheme, "FontSpecific"); } } else strcpy( enc_scheme, pFontBase->pFontArray[FontID].pFontEnc[256]); return(enc_scheme); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } grace-5.1.23/T1lib/t1lib/t1load.h0000644000076500001440000000420007415144743015760 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1load.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1load.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1LOAD_C int T1_LoadFont( int FontID); static int openFontMetricsFile( int FontID, int open_sloppy); FONTSIZEDEPS *CreateNewFontSize( int FontID, float size, int aa); FONTSIZEDEPS *GetLastFontSize( int FontID); FONTSIZEDEPS *QueryFontSize( int FontID, float size, int aa); int fontfcnA( char *env, int *mode, psfont *Font_Ptr); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); extern char *vm_base; /* from fontfcn.c in initfont()! */ extern char *vm_used; /* from fontfcn.c in fontfcnA()! */ #else extern int T1_LoadFont( int FontID); extern FONTSIZEDEPS *CreateNewFontSize( int FontID, float size, int aa); extern FONTSIZEDEPS *GetLastFontSize( int FontID); extern FONTSIZEDEPS *QueryFontSize( int FontID, float size, int aa); #endif grace-5.1.23/T1lib/t1lib/t1set.h0000644000076500001440000000675607415144743015656 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1set.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-05-27 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1set.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1SET_C GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); void fill(char *dest, int h, int w, struct region *area, int byte, int bit, int wordsize); void fillrun(char *p, pel x0, pel x1, int bit); GLYPH *T1_CopyGlyph(GLYPH *glyph); void T1_DumpGlyph( GLYPH *glyph); void T1_ComputeLineParameters( int FontID, int width, int mode, float size, int *startx, int *endx, int *starty, int *endy); GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); void T1_DumpGlyph( GLYPH *glyph); GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); #else extern GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform); extern GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern void fill(char *dest, int h, int w, struct region *area, int byte, int bit, int wordsize); extern void fillrun(char *p, pel x0, pel x1, int bit); extern GLYPH *T1_CopyGlyph(GLYPH *glyph); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_ConcatGlyphs( GLYPH *glyph1, GLYPH *glyph2, int x_off, int y_off, int modflag); extern void T1_DumpGlyph( GLYPH *glyph); extern GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag); #endif extern struct region *fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster); extern struct region *fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); grace-5.1.23/T1lib/t1lib/t1outline.c0000644000076500001440000005463507415144743016534 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1outline.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-05-27 ----- Description: This file is part of the t1-library. It contains functions for getting glyph outline descriptions of strings and characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1OUTLINE_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "../type1/paths.h" #include "t1types.h" #include "t1extern.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1outline.h" /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif extern char *t1_get_abort_message( int number); extern struct segment *Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length); extern struct segment *t1_Join( struct segment *path1, struct segment *path2); extern struct segment *CopyPath( struct segment *p); extern void KillPath( struct segment *p); /* T1_SetChar(...): Generate the bitmap for a character */ T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform) { int i; int mode; T1_PATHSEGMENT *charpath; struct XYspace *Current_S; unsigned char ucharcode; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; /* We don't implement underlining for characters, but the rasterer implements it. Thus, we use a modflag of constant 0 */ int modflag=0; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetCharOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } ucharcode=(unsigned char)charcode; /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } fontarrayP=&(pFontBase->pFontArray[FontID]); /* font is now loaded into memory => Check for size: */ if ((font_ptr=QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (transform!=NULL) { Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; charpath=(T1_PATHSEGMENT *)fontfcnB( FontID, modflag, Current_S, fontarrayP->pFontEnc, ucharcode, &mode, fontarrayP->pType1Data, DO_NOT_RASTER); KillSpace (Current_S); return((T1_OUTLINE *)charpath); } /* T1_GetStringOutline(...): Generate the outline for a string of characters */ T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { int i; int mode; /* initialize this to NULL just to be on the safe side */ T1_PATHSEGMENT *charpath = NULL; struct XYspace *Current_S; int *kern_pairs; /* use for accessing the kern pairs if kerning is requested */ int no_chars=0; /* The number of characters in the string */ static int lastno_chars=0; long spacewidth; /* This is given to fontfcnb_string() */ FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; static int *pixel_h_anchor_corr=NULL; static int *flags=NULL; unsigned char *ustring; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetStringOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* force string elements into unsigned */ ustring=(unsigned char*)string; /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return(NULL); } /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } fontarrayP=&(pFontBase->pFontArray[FontID]); /* font is now loaded into memory => Check for size: */ if ((font_ptr=QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Now comes string specific stuff: Get length of string and create an array of integers where to store the bitmap positioning dimens: */ if (len<0){ /* invalid length */ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* If necessary, allocate memory */ if (no_chars>lastno_chars){ if (pixel_h_anchor_corr!=NULL){ free(pixel_h_anchor_corr); } if (flags!=NULL){ free(flags); } pixel_h_anchor_corr=(int *)calloc(no_chars, sizeof(int)); flags=(int *)calloc(no_chars, sizeof(int)); lastno_chars=no_chars; } else{ /* Reset flags and position array */ for (i=0; ipCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* Compute the correct spacewidth value (in charspace units). The value supplied by the user is interpreted as an offset in char space units: */ spacewidth=T1_GetCharWidth(FontID,fontarrayP->space_position)+spaceoff; mode=0; kern_pairs=(int *)calloc(no_chars, sizeof(int)); if ((modflag & T1_KERNING)) for (i=0; ipFontEnc, (unsigned char *)string, no_chars, &mode, fontarrayP->pType1Data, kern_pairs, spacewidth, DO_NOT_RASTER); KillSpace (Current_S); /* In all cases, free memory for kerning pairs */ free(kern_pairs); /* fill the string_glyph-structure */ if (mode != 0) { sprintf( err_warn_msg_buf, "fontfcnB_string() set mode=%d", mode); T1_PrintLog( "T1_GetStringOutline()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* make sure to get rid of path if it's there */ if (charpath){ KillRegion (charpath); } return(NULL); } if (charpath == NULL){ T1_PrintLog( "T1_GetStringOutline()", "path=NULL returned by fontfcnB_string()", T1LOG_WARNING); T1_errno=mode; return(NULL); } return( (T1_OUTLINE *)charpath); } /* T1_GetMoveOutline(...): Generate the "outline" for a movement */ T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform) { int i; FONTSIZEDEPS *font_ptr; struct segment *path, *tmppath; struct XYspace *Current_S; psfont *FontP; float length; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetMoveOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } FontP=pFontBase->pFontArray[i].pType1Data; /* font is now loaded into memory => Check for size: */ if ((font_ptr=QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (transform!=NULL){ Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } path=(struct segment *)ILoc( Current_S, deltax, deltay); /* Take care for underlining and such */ length=(float) deltax; if (modflag & T1_UNDERLINE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].UndrLnPos, pFontBase->pFontArray[FontID].UndrLnThick, length); path=(struct segment *)Join(path,tmppath); } if (modflag & T1_OVERLINE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].OvrLnPos, pFontBase->pFontArray[FontID].OvrLnThick, length); path=(struct segment *)Join(path,tmppath); } if (modflag & T1_OVERSTRIKE){ tmppath=(struct segment *)Type1Line(FontP,Current_S, pFontBase->pFontArray[FontID].OvrStrkPos, pFontBase->pFontArray[FontID].OvrStrkThick, length); path=(struct segment *)Join(path,tmppath); } KillSpace( Current_S); return( (T1_OUTLINE *)path); } /* T1_ConcatOutlines(): Concatenate two outline to one path */ T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2) { return( (T1_OUTLINE *) t1_Join( (struct segment *) path1, (struct segment *) path2)); } /* T1_ScaleOutline(): Scale an outline */ T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ ipath->dest.x = (fractpel) (ipath->dest.x * scale); ipath->dest.y = (fractpel) (ipath->dest.y * scale); } if (ipath->type==CONICTYPE){ ((struct conicsegment *)ipath)->dest.x = (fractpel) ((struct conicsegment *)ipath)->dest.x * scale; ((struct conicsegment *)ipath)->dest.y = (fractpel) ((struct conicsegment *)ipath)->dest.y * scale; ((struct conicsegment *)ipath)->M.x = (fractpel) ((struct conicsegment *)ipath)->M.x * scale; ((struct conicsegment *)ipath)->M.y = (fractpel) ((struct conicsegment *)ipath)->M.y * scale; } if (ipath->type==MOVETYPE){ ipath->dest.x = (fractpel) (ipath->dest.x * scale); ipath->dest.y = (fractpel) (ipath->dest.y * scale); } if (ipath->type==BEZIERTYPE){ ((struct beziersegment *)ipath)->B.x = (fractpel) (((struct beziersegment *)ipath)->B.x * scale); ((struct beziersegment *)ipath)->B.y = (fractpel) (((struct beziersegment *)ipath)->B.y * scale); ((struct beziersegment *)ipath)->C.x = (fractpel) (((struct beziersegment *)ipath)->C.x * scale); ((struct beziersegment *)ipath)->C.y = (fractpel) (((struct beziersegment *)ipath)->C.y * scale); ((struct beziersegment *)ipath)->dest.x = (fractpel) (((struct beziersegment *)ipath)->dest.x * scale); ((struct beziersegment *)ipath)->dest.y = (fractpel) (((struct beziersegment *)ipath)->dest.y * scale); } if (ipath->type==HINTTYPE){ ((struct hintsegment *)ipath)->dest.x = (fractpel) (((struct hintsegment *)ipath)->dest.x * scale); ((struct hintsegment *)ipath)->dest.y = (fractpel) (((struct hintsegment *)ipath)->dest.y * scale); ((struct hintsegment *)ipath)->ref.x = (fractpel) (((struct hintsegment *)ipath)->ref.x * scale); ((struct hintsegment *)ipath)->ref.y = (fractpel) (((struct hintsegment *)ipath)->ref.y * scale); ((struct hintsegment *)ipath)->width.x = (fractpel) (((struct hintsegment *)ipath)->width.x * scale); ((struct hintsegment *)ipath)->width.y = (fractpel) (((struct hintsegment *)ipath)->width.y * scale); } if (ipath->type==TEXTTYPE) ; ipath=ipath->link; } while (ipath!=NULL); return( path); } /* dump a description of path elements to stdout */ void T1_DumpPath( T1_OUTLINE *path) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); } if (ipath->type==MOVETYPE){ printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); } if (ipath->type==BEZIERTYPE){ printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); } ipath=ipath->link; } while (ipath!=NULL); } /* convert a relative path to an absolute path */ void T1_AbsolutePath( T1_OUTLINE *rpath) { struct segment *ipath; fractpel xcurr=0, ycurr=0; /* Step through the path list */ ipath=(struct segment *)rpath; do { if (ipath->type==LINETYPE){ ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } if (ipath->type==MOVETYPE){ ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } if (ipath->type==BEZIERTYPE){ ((struct beziersegment *)ipath)->B.x +=xcurr; ((struct beziersegment *)ipath)->B.y +=ycurr; ((struct beziersegment *)ipath)->C.x +=xcurr; ((struct beziersegment *)ipath)->C.y +=ycurr; ipath->dest.x +=xcurr; ipath->dest.y +=ycurr; #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif xcurr=ipath->dest.x; ycurr=ipath->dest.y; } ipath=ipath->link; } while (ipath!=NULL); } /* convert path into a relative path as needed by the rasterizer */ void T1_RelativePath( T1_OUTLINE *apath) { struct segment *ipath; fractpel xcurr=0, ycurr=0; /* Step through the path list */ ipath=(struct segment *)apath; do { if (ipath->type==LINETYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f), curr=(%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF), xcurr/(double)(0xFFFF), -ycurr/(double)(0xFFFF)); #endif } if (ipath->type==MOVETYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f), curr=(%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF), xcurr/(double)(0xFFFF), -ycurr/(double)(0xFFFF)); #endif } if (ipath->type==BEZIERTYPE){ ipath->dest.x -=xcurr; ipath->dest.y -=ycurr; ((struct beziersegment *)ipath)->C.x -=xcurr; ((struct beziersegment *)ipath)->C.y -=ycurr; ((struct beziersegment *)ipath)->B.x -=xcurr; ((struct beziersegment *)ipath)->B.y -=ycurr; xcurr +=ipath->dest.x; ycurr +=ipath->dest.y; #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif } ipath=ipath->link; } while (ipath!=NULL); } /* maniuplate the coordinata points of a path */ void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)) { struct segment *ipath; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE){ manipulate( &(ipath->dest.x), &ipath->dest.y, LINETYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Line-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif } if (ipath->type==MOVETYPE){ manipulate( &(ipath->dest.x), &ipath->dest.y, MOVETYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Move-Segment: -> (%f,%f)\n", (ipath->dest.x)/(double)(0xFFFF), -(ipath->dest.y)/(double)(0xFFFF)); #endif } if (ipath->type==BEZIERTYPE){ manipulate( &((struct beziersegment *)ipath)->B.x, &((struct beziersegment *)ipath)->B.y, BEZIERTYPE); manipulate( &((struct beziersegment *)ipath)->C.x, &((struct beziersegment *)ipath)->C.y, BEZIERTYPE); manipulate( &((struct beziersegment *)ipath)->dest.x, &((struct beziersegment *)ipath)->dest.y, BEZIERTYPE); #ifdef PRINT_PATHS_TO_STDOUT printf("Bezier-Segment: ... (%f,%f) ... (%f,%f) -> (%f,%f)\n", (((struct beziersegment *)ipath)->B.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->B.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->C.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->C.y)/(double)(0xFFFF), (((struct beziersegment *)ipath)->dest.x)/(double)(0xFFFF), -(((struct beziersegment *)ipath)->dest.y)/(double)(0xFFFF)); #endif } ipath=ipath->link; } while (ipath!=NULL); } /* T1_CopyOutline(): Copy an outline physically. Returns a pointer to the path or NULL */ T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path) { return( (T1_OUTLINE *) CopyPath( (struct segment *)path)); } /* T1_FreeOutline(): Free an outline. */ void T1_FreeOutline( T1_OUTLINE *path) { KillPath( (struct segment *)path); return; } grace-5.1.23/T1lib/t1lib/t1set.c0000644000076500001440000016547407415144743015654 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1set.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-05-27 ----- Description: This file is part of the t1-library. It contains functions for setting characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1SET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif extern char *t1_get_abort_message( int number); extern struct region *Interior(struct segment *path, int fillrule); extern unsigned T1_AA_TYPE32 T1aa_bg; /* white value */ static int T1_bit=T1GLYPH_BIT; static int T1_byte; static int T1_pad; static int T1_wordsize; static int c_shift=8; static int s_shift=16; static int l_shift=32; /* T1_SetChar(...): Generate the bitmap for a character */ GLYPH *T1_SetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) { int i; int mode; struct region *area; struct XYspace *Current_S; int cache_flag=1; int rot_flag=0; unsigned char ucharcode; FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; volatile int memsize=0; LONG h,w; LONG paddedW; /* We don't implement underlining for characters, but the rasterer implements it. Thus, we use a modflag of constant 0 */ int modflag=0; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } ucharcode=(unsigned char)charcode; /* Reset character glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; fontarrayP=&(pFontBase->pFontArray[FontID]); /* Check if rotation is requested */ if (transform!=NULL){ /* there's rotation requested => do not cache the resulting bitmap */ rot_flag=1; cache_flag=0; } else { rot_flag=0; cache_flag=1; } /* font is now loaded into memory => Check for size: */ if ((font_ptr=QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } else {/* size is already existent in cache */ /* If no rotation, try to get character from cache */ if (rot_flag==0){ /* we don't use the .bits entry to check because in newer releases also white glyphs (bits=NULL) are allowed. Rather, we check whether bpp > 0! */ if (font_ptr->pFontCache[ucharcode].bpp > 0){ /* Character is already in Chache -> create a copy of cache and return a pointer to the result: */ memcpy( &glyph, &(font_ptr->pFontCache[ucharcode]), sizeof(GLYPH)); paddedW = PAD((glyph.metrics.rightSideBearing-glyph.metrics.leftSideBearing), T1_pad); if (font_ptr->pFontCache[ucharcode].bits!=NULL) { memsize = (glyph.metrics.ascent-glyph.metrics.descent)*paddedW / 8; glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } memcpy( glyph.bits, font_ptr->pFontCache[ucharcode].bits, memsize); } return(&(glyph)); } } } /* Setup an appropriate charspace matrix. Note that the rasterizer assumes vertical values with inverted sign! Transformation should create a copy of the local charspace matrix which then still has to be made permanent. */ if (rot_flag){ Current_S=(struct XYspace *) Permanent(Scale(Transform (font_ptr->pCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; area=fontfcnB( FontID, modflag, Current_S, fontarrayP->pFontEnc, ucharcode, &mode, fontarrayP->pType1Data, DO_RASTER); KillSpace (Current_S); /* fill the glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetChar()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } h = area->ymax - area->ymin; w = area->xmax - area->xmin; if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted for character %d from font %d", ucharcode, FontID); T1_PrintLog( "T1_SetChar()", err_warn_msg_buf, T1LOG_WARNING); mode=0; } paddedW = PAD(w, T1_pad); if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry glyph.bits is free'ed every time this function is called: */ glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } /* Assign metrics */ glyph.metrics.leftSideBearing = area->xmin; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = area->xmax; glyph.metrics.descent = - area->ymax; glyph.metrics.ascent = - area->ymin; if (h > 0 && w > 0) { (void) memset(glyph.bits, 0, memsize); fill(glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* make sure to get rid of 'area' before leaving! */ KillRegion (area); /* Cache glyph if requested, also if it contains only white space */ if (cache_flag){ /* Copy glyph to cache but be careful not to modify the pixmap entry */ font_ptr->pFontCache[ucharcode].metrics.leftSideBearing=glyph.metrics.leftSideBearing; font_ptr->pFontCache[ucharcode].metrics.rightSideBearing=glyph.metrics.rightSideBearing; font_ptr->pFontCache[ucharcode].metrics.advanceX=glyph.metrics.advanceX; font_ptr->pFontCache[ucharcode].metrics.advanceY=glyph.metrics.advanceY; font_ptr->pFontCache[ucharcode].metrics.ascent=glyph.metrics.ascent; font_ptr->pFontCache[ucharcode].metrics.descent=glyph.metrics.descent; font_ptr->pFontCache[ucharcode].pFontCacheInfo=glyph.pFontCacheInfo; font_ptr->pFontCache[ucharcode].bpp=glyph.bpp; if (glyph.bits==NULL) { font_ptr->pFontCache[ucharcode].bits=NULL; } else { font_ptr->pFontCache[ucharcode].bits = (char *)malloc(memsize*sizeof( char)); if (font_ptr->pFontCache[ucharcode].bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* ... and copy bitmap to cache area: */ memcpy( font_ptr->pFontCache[ucharcode].bits, glyph.bits, memsize); } } return(&glyph); } /* T1_SetString(...): Generate the bitmap for a string of characters */ GLYPH *T1_SetString( int FontID, char *string, volatile int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { volatile int i, j=0, k; int mode; /* initialize this to NULL just to be on the safe side */ struct region *area = NULL; struct XYspace *Current_S, *S; int cache_flag=1; volatile int rot_flag=0; int *kern_pairs; /* use for accessing the kern pairs if kerning is requested */ int no_chars=0; /* The number of characters in the string */ static int lastno_chars=0; float factor; long spacewidth; /* This is given to fontfcnb_string() */ FONTSIZEDEPS *font_ptr; FONTPRIVATE *fontarrayP; volatile int memsize=0; long h,w; long paddedW, char_paddedW; int h_anchor, v_anchor; static int *pixel_h_anchor_corr=NULL; static int *flags=NULL; int lsb_min, rsb_max; long overallwidth=0; long overallascent=0; long overalldescent=0; int underline_startx, underline_starty, underline_endx, underline_endy; int overline_startx, overline_starty, overline_endx, overline_endy; int overstrike_startx, overstrike_starty, overstrike_endx, overstrike_endy; int start, middle; int afm_ind; char startmask, endmask; static unsigned char *r2lstring; static int r2l_len=0; static GLYPH string_glyph={NULL,{0,0,0,0,0,0},NULL,1}; GLYPH *currchar; /* The following are for bitmap blitting */ long BitShift; long ByteOffset; /* pad=8 */ unsigned T1_AA_TYPE16 BitBuf_c; unsigned char *p_c; unsigned char *Target_c; /* pad=16 */ unsigned T1_AA_TYPE32 BitBuf_s; unsigned T1_AA_TYPE16 *p_s; unsigned T1_AA_TYPE16 *Target_s; #ifdef T1_AA_TYPE64 /* pad=32 */ unsigned T1_AA_TYPE64 BitBuf_l; unsigned T1_AA_TYPE32 *p_l; unsigned T1_AA_TYPE32 *Target_l; #endif unsigned char *ustring; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* force string elements into unsigned */ ustring=(unsigned char*)string; /* Check for valid string */ if (string==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Reorganize if required */ if (modflag & T1_RIGHT_TO_LEFT){ if (len) i=len; else i=j=strlen( string); if (i+1>r2l_len){ if (r2lstring!=NULL) free( r2lstring); r2lstring=(unsigned char *)malloc( (i+1)*sizeof(char)); r2l_len=i+1; } j--; while ( i--) { r2lstring[j-i]=ustring[i]; } ustring=r2lstring; len=j+1; } /* Reset string glyph, if necessary */ if (string_glyph.bits!=NULL){ free(string_glyph.bits); string_glyph.bits=NULL; } string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.advanceX=0; string_glyph.metrics.advanceY=0; string_glyph.metrics.ascent=0; string_glyph.metrics.descent=0; string_glyph.pFontCacheInfo=NULL; string_glyph.bpp=1; /* We don't want to cache the resulting bitmap: */ cache_flag=0; /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* if necessary load font into memory */ if (i==0) if (T1_LoadFont(FontID)) return(NULL); /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return(NULL); } /* Check for valid size */ if (size<=0.0){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; fontarrayP=&(pFontBase->pFontArray[FontID]); /* Check if rotation is requested */ if (transform!=NULL){ /* there's rotation requested => do not cache the resulting bitmap */ rot_flag=1; cache_flag=0; } /* font is now loaded into memory => Check for size: */ if ((font_ptr=QueryFontSize( FontID, size, NO_ANTIALIAS))==NULL){ font_ptr=CreateNewFontSize( FontID, size, NO_ANTIALIAS); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } /* Now comes string specific stuff: Get length of string and create an array of integers where to store the bitmap positioning dimens: */ if (len<0){ /* invalid length */ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } if (len==0) /* should be computed assuming "normal" 0-terminated string, or R2L-part has already been computed! */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* If necessary, allocate memory */ if (no_chars>lastno_chars){ if (pixel_h_anchor_corr!=NULL){ free(pixel_h_anchor_corr); } if (flags!=NULL){ free(flags); } pixel_h_anchor_corr=(int *)calloc(no_chars, sizeof(int)); flags=(int *)calloc(no_chars, sizeof(int)); lastno_chars=no_chars; } else{ /* Reset flags and position array */ for (i=0; ipCharSpaceLocal, transform->cxx, - transform->cxy, transform->cyx, - transform->cyy), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } else{ Current_S=(struct XYspace *) Permanent(Scale(Transform(font_ptr->pCharSpaceLocal, 1.0, 0.0, 0.0, -1.0), DeviceSpecifics.scale_x, DeviceSpecifics.scale_y)); } /* Compute the correct spacewidth value (in charspace units). The value supplied by the user is interpreted as an offset in char space units: */ spacewidth=T1_GetCharWidth(FontID,fontarrayP->space_position)+spaceoff; /* The following if (rot_flag==0){ ... } contains the whole code to execute when the string is oriented horizontal. Then, there's the possibility of concatenating most probably existent bitmaps from the Cache, which should be much faster than every time raster all the characters. */ /* First, ensure that all needed characters are in the Cache; if not, generate them */ if ((rot_flag==0)){ overallwidth=0; for (i=0; ipFontCache[ustring[i]]); if (currchar->bpp<1) { flags[i]=0; mode=0; /* Don't try to generate space-character: */ if (ustring[i]!=fontarrayP->space_position){ /* Note: Never underline etc. cached chars --> modflag=0 */ area=fontfcnB( FontID, 0, Current_S, fontarrayP->pFontEnc, ustring[i], &mode, fontarrayP->pType1Data, DO_RASTER); /* fill the glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* Make sure to free the region if it's non-NULL */ if (area){ KillRegion (area); } return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetString()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted in string[%d] (=character %d) from font %d", i, ustring[i], FontID); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); mode=0; flags[i]=1; /* indicates that .notdef has been substituted */ } h = area->ymax - area->ymin; w = area->xmax - area->xmin; if (h > 0 && w > 0) { /* bitmap contains pixels */ paddedW = PAD(w, T1_pad); memsize = h * paddedW / 8 + 1; currchar->bits = (char *)malloc(memsize*sizeof( char)); if (currchar->bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* Make sure to free up the region if it's non-NULL */ if (area){ KillRegion (area); } return(NULL); } (void) memset(currchar->bits, 0, memsize); fill(currchar->bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* area valid -> set metrics in cache for that character */ currchar->metrics.leftSideBearing = area->xmin; currchar->metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); currchar->metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); currchar->metrics.rightSideBearing = area->xmax; currchar->metrics.descent = - area->ymax; currchar->metrics.ascent = - area->ymin; currchar->bpp=1; /* By this point, it's clear that the 'area' struct exists, and that we no longer need it, so free it up. */ KillRegion (area); } } /* end of if ( ... ), needed characters are now in cache! */ } /* end of for (ipFontArray[FontID].pEncMap[(int) ustring[i]]; /* Advance to next character in high resolution */ if (ustring[i]==fontarrayP->space_position) h_anchor +=(int)spacewidth; /* check for a substituted char or notdef and get missing escapement */ else if (afm_ind==0) { /* Setup apropriate charspace matrix */ S=(struct XYspace *)IDENTITY; /* Make this permanent so that scaling it in fontfcnB_ByName will make a duplicate of it, and this duplicate can thus be safely destroyed. Fixes the somewhat smaller memory leak */ S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Get metrics values */ area=fontfcnB_ByName( FontID, 0, S, ".notdef", &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER); if (area==NULL || mode!=0){ sprintf( err_warn_msg_buf, "Could not get charspace representation of \".notdef\", Font %d, mode=%d!", FontID, mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_ERROR); T1_errno=mode; return( NULL); } /* value to add to hanchor */ h_anchor +=NEARESTPEL(area->ending.x); /* make sure to free S */ if (S) { KillSpace (S); } /* make sure to free area */ if (area) { KillRegion (area); } } else{ currchar=&(font_ptr->pFontCache[ustring[i]]); pixel_h_anchor_corr[i]=((int)floor(h_anchor*factor+0.5)); /* Store maximum rsb ...*/ if ( pixel_h_anchor_corr[i]+currchar->metrics.rightSideBearing > rsb_max){ rsb_max=pixel_h_anchor_corr[i]+currchar->metrics.rightSideBearing; } /* ... and minimum lsb */ if ( pixel_h_anchor_corr[i]+currchar->metrics.leftSideBearing < lsb_min){ lsb_min=pixel_h_anchor_corr[i]+currchar->metrics.leftSideBearing; } /* Advance by current chars width */ /* h_anchor +=T1_GetCharWidth( FontID, ustring[i]); */ if (afm_ind>0) { /* we have a standard character */ h_anchor +=(fontarrayP->pAFMData->cmi[afm_ind-1].wx) * fontarrayP->extend; } else { /* afm_ind must be negative so that we have a composite char */ h_anchor +=(fontarrayP->pAFMData->ccd[-(afm_ind+1)].wx) * fontarrayP->extend; } /* If kerning, insert kerning amount */ if ((imetrics.ascent>overallascent) overallascent=currchar->metrics.ascent; if (currchar->metrics.descentmetrics.descent; } } string_glyph.metrics.advanceX=(int)floor(h_anchor*factor+0.5); /* We have to check for underlining and such things. They may affect the bounding box of the glyph */ if (modflag & T1_UNDERLINE){ T1_ComputeLineParameters( FontID, T1_UNDERLINE, string_glyph.metrics.advanceX, size, &underline_startx, &underline_endx, &underline_starty, &underline_endy); /* Check whether rsb is affected ...*/ if ( underline_endx > rsb_max){ rsb_max=underline_endx; } /* ... and for lsb */ if ( underline_startx < lsb_min){ lsb_min=underline_startx; } /* Vertical metrics may also be affected. */ if (underline_starty > overallascent) overallascent=underline_starty; if (underline_endy < overalldescent) overalldescent=underline_endy; } if (modflag & T1_OVERLINE){ T1_ComputeLineParameters( FontID, T1_OVERLINE, string_glyph.metrics.advanceX, size, &overline_startx, &overline_endx, &overline_starty, &overline_endy); /* Check whether rsb is affected ...*/ if ( overline_endx > rsb_max){ rsb_max=overline_endx; } /* ... and for lsb */ if ( overline_startx < lsb_min){ lsb_min=overline_startx; } /* Vertical metrics may also be affected. */ if (overline_starty > overallascent) overallascent=overline_starty; if (overline_endy < overalldescent) overalldescent=overline_endy; } if (modflag & T1_OVERSTRIKE){ T1_ComputeLineParameters( FontID, T1_OVERSTRIKE, string_glyph.metrics.advanceX, size, &overstrike_startx, &overstrike_endx, &overstrike_starty, &overstrike_endy); /* Check whether rsb is affected ...*/ if ( overstrike_endx > rsb_max){ rsb_max=overstrike_endx; } /* ... and for lsb */ if ( overstrike_startx < lsb_min){ lsb_min=overstrike_startx; } /* Vertical metrics may also be affected. */ if (overstrike_starty > overallascent) overallascent=overstrike_starty; if (overstrike_endy < overalldescent) overalldescent=overstrike_endy; } /* Set the string-glyphs' metrics: */ /* Bearings: */ string_glyph.metrics.rightSideBearing=rsb_max; string_glyph.metrics.leftSideBearing=lsb_min; /* ascent and descent: */ string_glyph.metrics.ascent=overallascent; string_glyph.metrics.descent=overalldescent; /* Now, allocate memory for the resulting bitmap and set it to 0: */ h=overallascent - overalldescent; w=string_glyph.metrics.rightSideBearing-string_glyph.metrics.leftSideBearing; paddedW = PAD( w, T1_pad); if ( h > 0 && w > 0){ memsize = h * paddedW / 8; /* We alloc some amount more in order to avoid alignment check in bit-blitting loop */ memsize += T1_pad/8; string_glyph.bits = (char *)malloc( memsize); if (string_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } } else { /* We have only characters without pixels in the string -> we allow this and only set the advance width in the glyph. The bits pointer will be NULL. We reset rsb and lsb */ string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.ascent=0; string_glyph.metrics.descent=0; } if (string_glyph.bits != NULL) { memset(string_glyph.bits, 0, memsize); /* Now comes the loop for bitmap blitting: */ for (i=0;ipFontCache[ustring[i]]); /* First, we have to correct the positioning values to refer to the bitmap BBox */ pixel_h_anchor_corr[i] -= lsb_min; pixel_h_anchor_corr[i] += currchar->metrics.leftSideBearing; /* Compute vertical anchor for current char-bitmap: */ v_anchor=overallascent - currchar->metrics.ascent; char_paddedW=PAD( currchar->metrics.rightSideBearing - currchar->metrics.leftSideBearing , T1_pad); /* We have to check for Big Endian. In that case, we have to act on byte-level */ if (T1_byte){ BitShift = pixel_h_anchor_corr[i] % 8; ByteOffset = pixel_h_anchor_corr[i] / 8; } else { BitShift = pixel_h_anchor_corr[i] % T1_pad; ByteOffset = pixel_h_anchor_corr[i] / T1_pad; if (T1_pad==32) ByteOffset *=4; else if (T1_pad==16) ByteOffset *=2; } #ifdef T1_AA_TYPE64 /* We compile this part only if long is 64 bits to be conform to ANSI C */ if (T1_pad==32 && T1_byte==0){ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_l= (unsigned T1_AA_TYPE32 *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_l = (unsigned T1_AA_TYPE32 *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0) { for (k=char_paddedW >> 5; k; k--) *Target_l++ |= *p_l++; } else { for (k=0; k < char_paddedW / 32 ; k++){ BitBuf_l= ((T1_AA_TYPE64)(*p_l++)) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ }/* end if (T1_pad==32) */ else #endif if (T1_pad==16 && T1_byte==0){ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_s= (unsigned T1_AA_TYPE16 *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_s = (unsigned T1_AA_TYPE16 *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0) { for (k=char_paddedW >> 4; k; k--) *Target_s++ |= *p_s++; } else{ for (k=char_paddedW >> 4; k; k--){ BitBuf_s= ((T1_AA_TYPE32)(*p_s++))<>s_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ }/* end if (T1_pad==16 */ else{ /* T1_pad = 8 or Big Endian machine */ /* The following loop steps through the lines of the character bitmap: */ for (j=0;jmetrics.ascent-currchar->metrics.descent;j++){ Target_c= (unsigned char *)(string_glyph.bits +((v_anchor+j)*paddedW/8) +ByteOffset); /* The following loop copies the scanline of a character bitmap: */ if (currchar->bits != NULL) { p_c = (unsigned char *)(currchar->bits+(char_paddedW/8*j)); if (BitShift == 0){ for (k=char_paddedW >> 3; k; k--) *Target_c++ |= *p_c++; } else{ for (k=char_paddedW >> 3; k; k--){ BitBuf_c = ((T1_AA_TYPE16)(*p_c++)) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } /* End of for ( .. ) stepping through columns */ } } /* End of if(currchar->bits != NULL) */ } /* End of for( .. ) steppin' through lines of char bitmap */ } /* end if (T1_pad==8) and/or BigEndian */ } } /* if (string_glyph.bits != NULL) */ /* We now put the underlining rule on the glyph */ if (modflag & T1_UNDERLINE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-underline_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Put an overstrike rule on the glyph */ if (modflag & T1_OVERSTRIKE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-overstrike_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Put an overline rule */ if (modflag & T1_OVERLINE){ start=-string_glyph.metrics.leftSideBearing; for (i=string_glyph.metrics.ascent-overline_starty; islant+0.5); middle = ((start+string_glyph.metrics.advanceX) / 8) - (start / 8); startmask = 0xFF << (start % 8); endmask = (char) ~(0xFF << ((start+string_glyph.metrics.advanceX) % 8)); Target_c= (unsigned char *)(string_glyph.bits +(i*paddedW/8) + (start / 8)); j=middle; if (j == 0) *Target_c++ |= startmask & endmask; else { *Target_c++ |= startmask; while (--j > 0) *Target_c++ = (unsigned char) 0xFF; if ((endmask)) *Target_c |= endmask; } } } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ string_glyph.metrics.advanceX *= -1; string_glyph.metrics.leftSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.rightSideBearing += string_glyph.metrics.advanceX; } return(&string_glyph); } /* end of "if (rot_flag==0.0)" */ /* fnt_ptr now points to the correct FontSizeDeps-struct => lets now raster the character */ mode=0; kern_pairs=(int *)calloc(no_chars, sizeof(int)); if ((modflag & T1_KERNING)) for (i=0; ipFontEnc, ustring, no_chars, &mode, fontarrayP->pType1Data, kern_pairs, spacewidth, DO_RASTER); KillSpace (Current_S); /* In all cases, free memory for kerning pairs */ free(kern_pairs); /* fill the string_glyph-structure */ if (mode > 0) { sprintf( err_warn_msg_buf, "fontfcnB() set mode=%d", mode); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=mode; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return(NULL); } if (area == NULL){ T1_PrintLog( "T1_SetString()", "area=NULL returned by fontfcnB()", T1LOG_WARNING); T1_errno=mode; return(NULL); } if (mode == FF_NOTDEF_SUBST) { sprintf( err_warn_msg_buf, "\".notdef\" substituted somewhere in string from font %d", FontID); T1_PrintLog( "T1_SetString()", err_warn_msg_buf, T1LOG_WARNING); mode=0; } h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, T1_pad); if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry string_glyph.bits is free'ed every time this function is called: */ string_glyph.bits = (char *)malloc(memsize*sizeof( char)); if (string_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } /* it's safe to free this, since this is a rotated glyph and therefore it's a copy of the original one */ return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } string_glyph.metrics.leftSideBearing=area->xmin; string_glyph.metrics.advanceX=NEARESTPEL(area->ending.x - area->origin.x); string_glyph.metrics.advanceY=-NEARESTPEL(area->ending.y - area->origin.y); string_glyph.metrics.rightSideBearing=area->xmax; string_glyph.metrics.descent=-area->ymax; string_glyph.metrics.ascent=-area->ymin; if (h > 0 && w > 0) { (void) memset(string_glyph.bits, 0, memsize); fill(string_glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } else { /* We have no black pixels */ string_glyph.metrics.leftSideBearing=0; string_glyph.metrics.advanceX=NEARESTPEL(area->ending.x - area->origin.x); string_glyph.metrics.advanceY=-NEARESTPEL(area->ending.y - area->origin.y); string_glyph.metrics.rightSideBearing=0; string_glyph.metrics.descent=0; string_glyph.metrics.ascent=0; } /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ string_glyph.metrics.advanceX *= -1; string_glyph.metrics.advanceY *= -1; string_glyph.metrics.leftSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.rightSideBearing += string_glyph.metrics.advanceX; string_glyph.metrics.descent += string_glyph.metrics.advanceY; string_glyph.metrics.ascent += string_glyph.metrics.advanceY; } return(&string_glyph); } void fill(dest, h, w, area, byte, bit, wordsize) register char *dest; /* destination bitmap */ int h,w; /* dimensions of 'dest', w padded */ register struct region *area; /* region to write to 'dest' */ int byte,bit; /* flags; LSBFirst or MSBFirst */ int wordsize; /* number of bits per word for LSB/MSB purposes */ { register struct edgelist *edge; /* for looping through edges */ register char *p; /* current scan line in 'dest' */ register int y; /* for looping through scans */ register int wbytes = w / 8; /* number of bytes in width */ register pel *leftP,*rightP; /* pointers to X values, left and right */ int xmin = area->xmin; /* upper left X */ int ymin = area->ymin; /* upper left Y */ for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { p = dest + (edge->ymin - ymin) * wbytes; leftP = edge->xvalues; rightP = edge->link->xvalues; for (y = edge->ymin; y < edge->ymax; y++) { fillrun(p, *leftP++ - xmin , *rightP++ - xmin, bit); p += wbytes; } } /* Now, as an afterthought, we'll go reorganize if odd byte order requires it: */ /* We do not reorganize since t1lib internally always uses LSBFirst */ /* if ( 0 && wordsize != 8) { register int i; printf("Reorganizing data ..\n"); switch (wordsize) { case 16: { register unsigned short data,*p; p = (unsigned short *) dest; for (i = h * w /16; --i >= 0;) { data = *p; *p++ = (data << 8) + (data >> 8); } break; } case 64: case 32: { register ULONG data,*p; p = (ULONG *) dest; for (i = h * w / 32; --i >= 0;) { data = *p; *p++ = (data << 24) + (data >> 24) + (0xFF00 & (data >> 8)) + (0xFF0000 & (data << 8)); } if (wordsize == 64) { p = (ULONG *) dest; for (i = h * w / 64; --i >= 0;) { data = *p++; p[-1] = p[0]; *p++ = data; } } break; } default: abort("xiFill: unknown format"); } } */ } #define ALLONES 0xFF void fillrun(register char *p, pel x0, pel x1, int bit) { register int startmask,endmask; /* bits to set in first and last char*/ register int middle; /* number of chars between start and end + 1 */ if (x1 <= x0) return; middle = x1/8 - x0/8; p += x0/8; x0 &= 7; x1 &= 7; if (bit == LSBFirst) { startmask = ALLONES << x0; endmask = ~(ALLONES << x1); } else { startmask = ALLONES >> x0; endmask = ~(ALLONES >> x1); } if (middle == 0) *p++ |= startmask & endmask; else { *p++ |= startmask; while (--middle > 0){ *p++ = (unsigned char)ALLONES; } if (endmask) *p |= endmask; } } /* outline */ #undef CHECK_OUTLINEFILL #ifdef CHECK_OUTLINEFILL void fill(dest, h, w, area, byte, bit, wordsize) register char *dest; /* destination bitmap */ int h,w; /* dimensions of 'dest', w padded */ register struct region *area; /* region to write to 'dest' */ int byte,bit; /* flags; LSBFirst or MSBFirst */ int wordsize; /* number of bits per word for LSB/MSB purposes */ { register struct edgelist *edge; /* for looping through edges */ register char *p; /* current scan line in 'dest' */ register int y; /* for looping through scans */ register int wbytes = w / 8; /* number of bytes in width */ register pel *leftP,*rightP; /* pointers to X values, left and right */ int xmin = area->xmin; /* upper left X */ int ymin = area->ymin; /* upper left Y */ for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { p = dest + (edge->ymin - ymin) * wbytes; leftP = edge->xvalues; rightP = edge->link->xvalues; printf("leftP=%d, RightP=%d,\n", *leftP, *rightP); for (y = edge->ymin; y < edge->ymax; y++) { printf("leftP=%d, RightP=%d,y=%d\n", *leftP, *rightP, y); fillrun(p, *leftP++ - xmin, *rightP++ - xmin, bit); p += wbytes; } } } #endif /* T1_CopyGlyph(): Make a copy of an existent glyph-structure to save it for later usage by the user. */ GLYPH *T1_CopyGlyph( GLYPH *glyph) { GLYPH *dest; long size; if (glyph==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; /* Allocate memory for struct: */ if ((dest=(GLYPH *)malloc(sizeof(GLYPH)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } /* Copy the structure members: */ *dest=*glyph; /* Allocate memory for bitmap, initialize pointer to it and copy bitmap: */ size=PAD((dest->metrics.rightSideBearing-dest->metrics.leftSideBearing)* glyph->bpp, T1_pad) / 8; size=size*(dest->metrics.ascent-dest->metrics.descent); /* We must check whether there's actually a bits-pointer different from NULL. If not omit the following step: */ if (glyph->bits!=NULL){ if ((dest->bits=(char *)malloc(size*sizeof(char)))==NULL){ free(dest); T1_errno=T1ERR_ALLOC_MEM; return(NULL); } memcpy(dest->bits,glyph->bits,size); } return(dest); } /* T1_DumpGlyph(): Dump a glyph-representation to stdout: */ void T1_DumpGlyph( GLYPH *glyph) { int i,j,h,w; /* i=line-index, j=column-index */ long paddedW; printf("Dataformat: T1_bit=%d, T1_byte=%d, T1_wordsize=%d, T1_pad=%d\n", T1_bit, T1_byte, T1_pad, T1_pad); if (glyph==NULL){ return; } h=glyph->metrics.ascent-glyph->metrics.descent; w=glyph->metrics.rightSideBearing-glyph->metrics.leftSideBearing; paddedW=PAD(w,T1_pad); printf("GlyphInfo: h=%d, w=%d, paddedW=%ld\n", h, w, paddedW); for ( i=0; ibits[i*paddedW/T1_pad+j], 1); else if (T1_pad==16) for (j=0; jbits)[i*paddedW/T1_pad+j], 1); } else for (j=0; jbits)[i*paddedW/T1_pad+j], 1); } printf("\n"); } } /* This function will essentially return the bounding box of the line-rule */ void T1_ComputeLineParameters( int FontID, int mode, int width, float size, int *startx, int *endx, int *starty, int *endy) { float position=0.0, thickness=0.0; int startx1, startx2, endx1, endx2; if (mode & T1_UNDERLINE){ position=pFontBase->pFontArray[FontID].UndrLnPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].UndrLnThick * DeviceSpecifics.scale_y; } else if (mode & T1_OVERLINE){ position=pFontBase->pFontArray[FontID].OvrLnPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].OvrLnThick * DeviceSpecifics.scale_y; } else if (mode & T1_OVERSTRIKE){ position=pFontBase->pFontArray[FontID].OvrStrkPos * DeviceSpecifics.scale_y; thickness=pFontBase->pFontArray[FontID].OvrStrkThick * DeviceSpecifics.scale_y; } *starty=(int) floor((position+0.5*(thickness-DeviceSpecifics.y_resolution/1000.0)) *size/1000.0 +0.5 ); startx1=(int) floor(*starty*pFontBase->pFontArray[FontID].slant+0.5); *endy =*starty - (int) floor(thickness/1000.0*size+0.5); startx2=(int) floor(*endy*pFontBase->pFontArray[FontID].slant+0.5); *startx=startx1 < startx2 ? startx1 : startx2; endx1 = width + (int) floor(*starty*pFontBase->pFontArray[FontID].slant+0.5); endx2 = width + (int) floor(*endy*pFontBase->pFontArray[FontID].slant+0.5); *endx=endx1 < endx2 ? endx2 : endx1; /* We take care that at least one pixel is drawn */ if (*starty==*endy) *endy -=1; return; } /* The following function concatenates two glyphs. Optional offsets x_off, y_off are respected. By the function. If either glyph is NULL or the glyphs have distinct depth, NULL is returned. */ GLYPH *T1_ConcatGlyphs( GLYPH *glyph_1, GLYPH *glyph_2, int x_off, int y_off, int modflag) { int lsb1, lsb2, rsb1, rsb2; int advanceX1, advanceX2, advanceY1, advanceY2; int ascent1, ascent2, descent1, descent2; int rsb, lsb, ascent, descent, advanceX, advanceY; int vanchor, w, h, wscanline, wscanline1, wscanline2, bpp; int memsize, BitShift; GLYPH *glyph1, *glyph2; unsigned T1_AA_TYPE16 BitBuf_c; unsigned T1_AA_TYPE32 BitBuf_s; unsigned long BitBuf_l; /* This is only actually used if sizeof long = 8 */ int i, j, k; int ByteOffset; unsigned char *Target_c, *p_c; unsigned T1_AA_TYPE16 *Target_s, *p_s; unsigned T1_AA_TYPE32 *Target_l, *p_l; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; /* We handle the Right-To-Left concatenation the simple way: 1) Change the order of the two glyphs 2) Invert the sign of the y-part of the offset 3) Recalculate the dimensions of the resulating glyph. */ /* Check for writing direction and reorganize appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ glyph1=glyph_2; glyph2=glyph_1; y_off=-y_off; } else { glyph1=glyph_1; glyph2=glyph_2; } if (glyph1==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } if (glyph2==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } if (glyph1->bpp != glyph2->bpp){ T1_errno=T1ERR_INVALID_PARAMETER; return( NULL); } /* We have two glyph different from NULL */ /* Reset glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* Assign dimens */ lsb1=glyph1->metrics.leftSideBearing; rsb1=glyph1->metrics.rightSideBearing; ascent1=glyph1->metrics.ascent; descent1=glyph1->metrics.descent; advanceX1=glyph1->metrics.advanceX + x_off; advanceY1=glyph1->metrics.advanceY + y_off; lsb2=glyph2->metrics.leftSideBearing; rsb2=glyph2->metrics.rightSideBearing; ascent2=glyph2->metrics.ascent; descent2=glyph2->metrics.descent; advanceX2=glyph2->metrics.advanceX; advanceY2=glyph2->metrics.advanceY; lsb=lsb1 < lsb2+advanceX1 ? lsb1 : lsb2+advanceX1; rsb=rsb1 > rsb2+advanceX1 ? rsb1 : rsb2+advanceX1; ascent=ascent1 > ascent2+advanceY1 ? ascent1 : ascent2+advanceY1; descent=descent1 < descent2+advanceY1 ? descent1 : descent2+advanceY1; advanceX=advanceX1+advanceX2; advanceY=advanceY1+advanceY2; bpp=glyph1->bpp; w=rsb-lsb; h=ascent-descent; wscanline=PAD( w*bpp, T1_pad) / 8; wscanline1=PAD( (rsb1-lsb1)*bpp, T1_pad) / 8; wscanline2=PAD( (rsb2-lsb2)*bpp, T1_pad) / 8; memsize=wscanline*h; if ((glyph.bits=(char *)calloc( memsize + 1, sizeof(unsigned char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } if (bpp==1){ if (T1_pad==32 && T1_byte==0 && sizeof(long)==8){ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 32; ByteOffset=(lsb1-lsb)/32*4; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1/4; k; k--) *Target_l++ |= *p_l++; } else{ for (k=wscanline1/4; k; k--){ BitBuf_l = ((long)*p_l++) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 32; ByteOffset=(lsb2+advanceX1-lsb)/32*4; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2/4; k; k--) *Target_l++ |= *p_l++; } else{ for (k=wscanline2/4; k; k--){ BitBuf_l = ((long)*p_l++) << BitShift; *Target_l++ |= BitBuf_l; *Target_l |= BitBuf_l>>l_shift; } } } } else if(T1_pad==16 && T1_byte==0){ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 16; ByteOffset=(lsb1-lsb)/16*2; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1/2; k; k--) *Target_s++ |= *p_s++; } else{ for (k=wscanline1/2; k; k--){ BitBuf_s = ((T1_AA_TYPE32)*p_s++) << BitShift; *Target_s++ |= BitBuf_s; *Target_s |= BitBuf_s>>s_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 16; ByteOffset=(lsb2+advanceX1-lsb)/16*2; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2/2; k; k--) *Target_s++ |= *p_s++; } else{ for (k=wscanline2/2; k; k--){ BitBuf_s = ((T1_AA_TYPE32)*p_s++) << BitShift; *Target_s++ |= BitBuf_s; *Target_s |= BitBuf_s>>s_shift; } } } } else{ /* T1_pad==8 or Big Endian machine */ /* The following loop steps through the lines of the first glyph: */ vanchor=ascent-ascent1; BitShift=(lsb1-lsb) % 8; ByteOffset=(lsb1-lsb) / 8; for ( i=0; ibits+(wscanline1*i)); if (BitShift == 0){ for (k=wscanline1; k; k--) *Target_c++ |= *p_c++; } else{ for (k=wscanline1; k; k--){ BitBuf_c = ((T1_AA_TYPE16)*p_c++) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } } } /* The following loop steps through the lines of the second glyph: */ vanchor=ascent-(ascent2+advanceY1); BitShift=(lsb2+advanceX1-lsb) % 8; ByteOffset=(lsb2+advanceX1-lsb) / 8; for ( i=0; ibits+(wscanline2*i)); if (BitShift == 0){ for (k=wscanline2; k; k--) *Target_c++ |= *p_c++; } else{ for (k=wscanline2; k; k--){ BitBuf_c = ((T1_AA_TYPE16)*p_c++) << BitShift; *Target_c++ |= BitBuf_c; *Target_c |= BitBuf_c>>c_shift; } } } } } /* end of if (bpp==1) ... */ else if (bpp==8){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_c, p_c, (rsb1-lsb1)); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_c[j] != (unsigned char) T1aa_bg) Target_c[j]=p_c[j]; } } /* end of if (bpp==8) ... */ else if (bpp==16){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_s, p_s, (rsb1-lsb1)*2); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_s[j] != (unsigned T1_AA_TYPE16) T1aa_bg) Target_s[j]=p_s[j]; } } /* end of if (bpp==16) ... */ else if (bpp==32){ /* Set background */ for ( i=0; ibits+(wscanline1*i)); memcpy( Target_l, p_l, (rsb1-lsb1)*4); } /* The following loop steps through the lines of the second glyph. Note that we only set the pixel if it is not background! */ vanchor=ascent-(ascent2+advanceY1); for ( i=0; ibits+(wscanline2*i)); for (j=0; j<(rsb2-lsb2); j++) if (p_l[j] != (unsigned T1_AA_TYPE32) T1aa_bg) Target_l[j]=p_l[j]; } } /* end of if (bpp==32) ... */ /* Check for writing direction and re-compute dimens appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ advanceX=-advanceX1-advanceX2; advanceY=-advanceY1-advanceY2; lsb=lsb1 < lsb2+advanceX1 ? advanceX+lsb1 : advanceX+lsb2+advanceX1; rsb=rsb1 > rsb2+advanceX1 ? advanceX+rsb1 : advanceX+rsb2+advanceX1; ascent=ascent1 > ascent2+advanceY1 ? ascent1 : ascent2+advanceY1; descent=descent1 < descent2+advanceY1 ? descent1 : descent2+advanceY1; ascent += advanceY; descent += advanceY; } glyph.metrics.leftSideBearing=lsb; glyph.metrics.rightSideBearing=rsb; glyph.metrics.advanceX=advanceX; glyph.metrics.advanceY=advanceY; glyph.metrics.ascent=ascent; glyph.metrics.descent=descent; glyph.bpp=bpp; /* printf("lsb=%d, rsb=%d, adX=%d, adY=%d asc=%d, desc=%d\n", glyph.metrics.leftSideBearing, glyph.metrics.rightSideBearing, glyph.metrics.advanceX, glyph.metrics.advanceY, glyph.metrics.ascent, glyph.metrics.descent ); */ return( &glyph); } /* T1_FillOutline(): Create a filled glyph from an outline description */ GLYPH *T1_FillOutline( T1_OUTLINE *path, int modflag) { struct region *area=NULL; static GLYPH glyph={NULL,{0,0,0,0,0,0},NULL,1}; volatile int memsize=0; int i; LONG h,w; LONG paddedW; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_FillOutline()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* Reset character glyph, if necessary */ if (glyph.bits!=NULL){ free(glyph.bits); glyph.bits=NULL; } glyph.metrics.leftSideBearing=0; glyph.metrics.rightSideBearing=0; glyph.metrics.advanceX=0; glyph.metrics.advanceY=0; glyph.metrics.ascent=0; glyph.metrics.descent=0; glyph.pFontCacheInfo=NULL; glyph.bpp=1; /* Assign padding value */ T1_pad=pFontBase->bitmap_pad; if (pFontBase->endian) T1_byte=1; else T1_byte=0; T1_wordsize=T1_pad; /* Create a region from outline */ area=(struct region *)Interior( (struct segment *)path, WINDINGRULE+CONTINUITY); /* fill the glyph-structure */ if (area == NULL){ T1_PrintLog( "T1_FillOutline()", "area=NULL returned by Interior()", T1LOG_WARNING); T1_errno=1000; return(NULL); } h = area->ymax - area->ymin; w = area->xmax - area->xmin; paddedW = PAD(w, T1_pad); if ( (area->xmin > area->xmax) || (area->ymin > area->ymax) ){ /* There was a character like .notdef or space, that didn't produce any black pixels on the bitmap! -> we return a glyph with correct metrics and bitmap pointer set to NULL */ sprintf( err_warn_msg_buf, "No black pixels in outline %p", path); T1_PrintLog( "T1_FillOutline()", err_warn_msg_buf, T1LOG_WARNING); glyph.metrics.leftSideBearing = 0; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = 0; glyph.metrics.descent = 0; glyph.metrics.ascent = 0; /* make sure to get rid of 'area' before leaving! */ KillRegion (area); return( &glyph); } if (h > 0 && w > 0) { memsize = h * paddedW / 8 + 1; /* This is for the users copy of the character, for security-reasons the original pointer to the cache area is not used. The entry glyph.bits is free'ed every time this function is called: */ glyph.bits = (char *)malloc(memsize*sizeof( char)); if (glyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return(NULL); } } else { h = w = 0; area->xmin = area->xmax = 0; area->ymin = area->ymax = 0; } glyph.metrics.leftSideBearing = area->xmin; glyph.metrics.advanceX = NEARESTPEL(area->ending.x - area->origin.x); glyph.metrics.advanceY = - NEARESTPEL(area->ending.y - area->origin.y); glyph.metrics.rightSideBearing = area->xmax; glyph.metrics.descent = - area->ymax; glyph.metrics.ascent = - area->ymin; if (h > 0 && w > 0) { (void) memset(glyph.bits, 0, memsize); fill(glyph.bits, h, paddedW, area, T1_byte, T1_bit, T1_wordsize ); } /* Check for writing direction and re-compute dimensions appropriately: */ if (modflag & T1_RIGHT_TO_LEFT){ glyph.metrics.advanceX *= -1; glyph.metrics.advanceY *= -1; glyph.metrics.leftSideBearing += glyph.metrics.advanceX; glyph.metrics.rightSideBearing += glyph.metrics.advanceX; glyph.metrics.descent += glyph.metrics.advanceY; glyph.metrics.ascent += glyph.metrics.advanceY; } /* make sure to get rid of area if it's there */ if (area){ KillRegion (area); } return( &glyph); } grace-5.1.23/T1lib/t1lib/t1global.h0000644000076500001440000001013007415144743016300 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1global.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains global declarations used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include "t1misc.h" /* Following struct will allow all accesses to font data! */ struct FONTBASE { int t1lib_flags; /* Global library flags */ int no_fonts_ini; /* The number of fonts initially declared in Font database file. */ int no_fonts; /* The number of currently allocated fonts including logical fonts produced by T1_CopyFont() */ int no_fonts_limit; /* The maximum number of font for which is memory currently available. */ int bitmap_pad; /* The value to which bitmap-scanlines are padded */ int endian; /* 1 if little endian representation and 0 otherwise */ char **default_enc; /* The default encoding vector */ FONTPRIVATE *pFontArray; /* Points to first element of font pointer array */ } FontBase; struct FONTBASE *pFontBase=NULL; /* Further we need a struct where to save device dependent data such as resolution. The values in this struct may be altered using T1_SetDeviceRes(x_res,y_res). Generally, the fontsize is to be specified in BigPoints ("bp")---this is the default PostScript unit. It is 1in=72bp. */ typedef struct { float x_resolution; /* Value must be specified in DPI */ float y_resolution; /* Value must be specified in DPI */ float scale_x; /* horizontal scale-value to get a matrix scaled to 1b */ float scale_y; /* vertical scale-value to get a matrix scaled to 1b */ } DEVICESPECIFICS; DEVICESPECIFICS DeviceSpecifics = { DEFAULT_RES, DEFAULT_RES, DEFAULT_RES/BIGPOINTSPERINCH, DEFAULT_RES/BIGPOINTSPERINCH }; struct stat filestats; /* A structure where fileinfo is stored */ char linebuf[BUF_SIZE]; /* A buffer for reading files line by line */ int T1_Up=0; /* This one is for initialization-checking */ /* The width of AA-pixels */ int T1aa_bpp; /* The follwoing variable allows the primary rastering functions to check for the caller */ int SetFuncRequestID=0; /* The following variable allows to suppress rastering at 1000 bp for getting a correct bounding box for slanted characters --> should only internally be used */ int ForceAFMBBox=0; extern struct XYspace *IDENTITY; int errornumber; /* for debugging purposes */ /* The following pointers should be set to path-strings--used for locating type1, afm and encoding files */ char** T1_PFAB_ptr=NULL; char** T1_AFM_ptr=NULL; char** T1_ENC_ptr=NULL; char** T1_FDB_ptr=NULL; /* We use a uchar buffer for error and warning messages: */ char err_warn_msg_buf[1024]; /* file pointer for log-file */ FILE *t1lib_log_file=NULL; int t1lib_log_level=2; /* The errno for t1lib */ int T1_errno=0; /* A variable for saving stack info */ jmp_buf stck_state; grace-5.1.23/T1lib/t1lib/.dependencies0000644000076500001440000001066507415144742017065 0ustar fnevgenyusersparseAFM.lo: parseAFM.c parseAFM.h t1aaset.lo: t1aaset.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h t1types.h \ t1extern.h t1misc.h t1aaset.h t1set.h t1load.h t1finfo.h t1base.h \ t1outline.h t1afmtool.lo: t1afmtool.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h \ ../type1/blues.h t1types.h t1extern.h t1misc.h t1finfo.h t1base.h \ t1set.h t1load.h t1afmtool.h t1base.lo: t1base.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h sysconf.h \ t1base.h t1types.h t1global.h t1misc.h t1env.h t1delete.h t1delete.lo: t1delete.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h t1types.h \ t1extern.h t1misc.h t1delete.h t1load.h t1finfo.h t1base.h t1enc.lo: t1enc.c ../type1/ffilest.h ../type1/types.h ../type1/Xstuff.h \ ../type1/fontmisc.h ../type1/fontstruct.h ../type1/font.h \ ../type1/fsmasks.h ../type1/fontfile.h ../type1/fontxlfd.h parseAFM.h \ ../type1/objects.h ../type1/spaces.h ../type1/util.h \ ../type1/fontfcn.h ../type1/regions.h t1types.h t1extern.h t1misc.h \ t1enc.h t1env.h t1base.h t1finfo.h t1env.lo: t1env.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h \ ../type1/fontmisc.h sysconf.h t1types.h t1extern.h t1misc.h t1env.h \ t1base.h t1finfo.lo: t1finfo.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h t1types.h \ t1extern.h t1misc.h t1finfo.h t1base.h t1set.h t1load.h t1load.lo: t1load.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/blues.h \ ../type1/regions.h t1types.h t1extern.h t1misc.h t1load.h t1env.h \ t1set.h t1base.h t1finfo.h t1afmtool.h t1outline.lo: t1outline.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h \ ../type1/paths.h t1types.h t1extern.h t1misc.h t1set.h t1load.h \ t1finfo.h t1base.h t1outline.h t1set.lo: t1set.c ../type1/ffilest.h ../type1/types.h ../type1/Xstuff.h \ ../type1/fontmisc.h ../type1/fontstruct.h ../type1/font.h \ ../type1/fsmasks.h ../type1/fontfile.h ../type1/fontxlfd.h parseAFM.h \ ../type1/objects.h ../type1/spaces.h ../type1/util.h \ ../type1/fontfcn.h ../type1/regions.h t1types.h t1extern.h t1misc.h \ t1set.h t1load.h t1finfo.h t1base.h t1subset.lo: t1subset.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h t1types.h \ t1extern.h t1misc.h t1finfo.h t1base.h t1subset.h t1trans.lo: t1trans.c ../type1/ffilest.h ../type1/types.h \ ../type1/Xstuff.h ../type1/fontmisc.h ../type1/fontstruct.h \ ../type1/font.h ../type1/fsmasks.h ../type1/fontfile.h \ ../type1/fontxlfd.h parseAFM.h ../type1/objects.h ../type1/spaces.h \ ../type1/util.h ../type1/fontfcn.h ../type1/regions.h t1types.h \ t1extern.h t1misc.h t1trans.h t1base.h t1x11.lo: t1x11.c ../type1/types.h parseAFM.h ../type1/objects.h \ ../type1/spaces.h ../type1/util.h ../type1/fontfcn.h \ ../type1/regions.h t1types.h t1extern.h t1misc.h t1set.h t1aaset.h \ t1load.h t1finfo.h t1x11.h t1base.h grace-5.1.23/T1lib/t1lib/t1misc.h0000644000076500001440000001532110037046500015764 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1misc.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It contains some miscellaneous definitions. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include #define LINE_BUF 512 #define BUF_SIZE 512 #define NULLPTR (void *) 0 /* t1lib-glyphs are padded to this value by default: */ #define T1GLYPH_PAD 8 #define T1GLYPH_BIT 0 #define T1GLYPH_BYTE 0 #define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) /* For debugging purposes: */ #define SLEEP for(j=0; j<50; j++){for (k=0; k<65536; k++);} #define KERN_FLAG 0x01 #define LIGATURE_FLAG 0x02 /* common 'yes'/'no' */ #define T1_YES 0x1 #define T1_NO 0x0 /* The maximum length of a PostScript name of a font: */ #define MAXPSNAMELEN 256 #define T1_MAXPATHLEN 1024 /* The default resolution used by the library */ #define DEFAULT_RES 72.0 #define BIGPOINTSPERINCH 72.0 /* Defaults for configuration file searching: */ /* (Note: The directory where the global config will be located is determined by configure at compile time) */ #define T1_CONFIGFILENAME ".t1librc" #define ENV_CONF_STRING "T1LIB_CONFIG" #define GLOBAL_CONFIG_FILE "t1lib.config" /* Directory separator is operating system dependent */ #if defined(VMS) # define DIRECTORY_SEP "]" # define DIRECTORY_SEP_CHAR ']' #elif defined(MSDOS) | defined(_WIN32) | defined(__EMX__) | defined(_MSC_VER) # define DIRECTORY_SEP "\\" # define DIRECTORY_SEP_CHAR '\\' #else # define DIRECTORY_SEP "/" # define DIRECTORY_SEP_CHAR '/' #endif /* For EMX-, WIN32-, MSDOS-environment, we define the default path separator to be ';' instead of ':' */ #if defined(MSDOS) | defined(_WIN32) | defined(__EMX__) | defined(_MSC_VER) | defined(VMS) #define PATH_SEP ";" #define PATH_SEP_CHAR ';' #else #define PATH_SEP ":" #define PATH_SEP_CHAR ':' #endif /* This non printable character is used internally */ #define INTERNAL_PATH_SEP "\001" #define INTERNAL_PATH_SEP_CHAR '\1' /* Default name for t1lib-logfile: */ #define ENV_LOG_STRING "T1LIB_LOGMODE" #define T1_LOG_FILE "t1lib.log" /* logfile levels: */ #define T1LOG_ERROR 1 #define T1LOG_WARNING 2 #define T1LOG_STATISTIC 3 #define T1LOG_DEBUG 4 /* def's for T1_InitLib() */ #define NO_LOGFILE 0x0 #define LOGFILE 0x1 #define IGNORE_FONTDATABASE 0x2 /* Default is to read database */ #define IGNORE_CONFIGFILE 0x4 /* Default is to read config file */ #define T1_AA_CACHING 0x8 /* Cache aa-bytes */ #define T1_NO_AFM 0x10 /* Don't load AFM files or generate AFM data */ /* How may ligatures a character may have at maximum: */ #define MAX_LIGS 20 /* The maximum number of gray-levels in antialiasing */ #define AAMAXPLANES 17 #define T1_AA_NONE 1 #define T1_AA_LOW 2 #define T1_AA_HIGH 4 /* The default limits for no/low/high AA */ #define T1_AA_SMARTLIMIT1 20.0 #define T1_AA_SMARTLIMIT2 60.0 /* How much to advance the number of FONTPRIVATE structures when reallocating for new fonts? */ #define ADVANCE_FONTPRIVATE 10 #define NO_ANTIALIAS 0 #define ANTIALIAS 1 /* #define's for manipulating searchpaths */ #define T1_PFAB_PATH 0x01 #define T1_AFM_PATH 0x02 #define T1_ENC_PATH 0x04 #define T1_FDB_PATH 0x08 #define T1_APPEND_PATH 0x00 #define T1_PREPEND_PATH 0x01 /* #define's for character/string properties (not all implemented) */ #define T1_DEFAULT 0x0000 #define T1_UNDERLINE 0x0001 #define T1_OVERLINE 0x0002 #define T1_OVERSTRIKE 0x0004 #define T1_DOUBLEOVERSTRIKE 0x0008 #define T1_RIGHT_TO_LEFT 0x0010 #define T1_SUBSCRIPT 0x0100 #define T1_SUPERSCRIPT 0x0200 #define T1_STROKED 0x1000 #define T1_KERNING 0x2000 /* Error handling: */ /* These are from scanning a font file */ #define T1ERR_SCAN_FONT_FORMAT -5 #define T1ERR_SCAN_FILE_OPEN_ERR -4 #define T1ERR_SCAN_OUT_OF_MEMORY -3 #define T1ERR_SCAN_ERROR -2 #define T1ERR_SCAN_FILE_EOF -1 /* These are from generating paths */ #define T1ERR_PATH_ERROR 1 #define T1ERR_PARSE_ERROR 2 #define T1ERR_TYPE1_ABORT 3 /* These are from t1lib */ #define T1ERR_INVALID_FONTID 10 #define T1ERR_INVALID_PARAMETER 11 #define T1ERR_OP_NOT_PERMITTED 12 #define T1ERR_ALLOC_MEM 13 #define T1ERR_FILE_OPEN_ERR 14 #define T1ERR_UNSPECIFIED 15 #define T1ERR_NO_AFM_DATA 16 #define T1ERR_X11 17 #define T1ERR_COMPOSITE_CHAR 18 /* The info_flags meaning */ #define AFM_SUCCESS (short)0x0001 #define AFM_SLOPPY_SUCCESS (short)0x0002 #define AFM_SELFGEN_SUCCESS (short)0x0004 #define USES_STANDARD_ENCODING (short)0x0008 #define FONT_NOCACHING (short)0x0100 #ifndef PI #define PI 3.1415927 #endif /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 /* */ #define DO_RASTER 0x1 #define DO_NOT_RASTER 0x0 /* this definition reports a character substitution from fontfcn */ #define FF_NOTDEF_SUBST -1 grace-5.1.23/T1lib/t1lib/Makefile0000644000076500001440000000073707244311605016067 0ustar fnevgenyusers# TOP=../.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) OBJS = \ t1finfo$(O) \ t1base$(O) \ t1delete$(O) \ t1enc$(O) \ t1env$(O) \ t1load$(O) \ t1set$(O) \ t1trans$(O) \ t1aaset$(O) \ t1afmtool$(O) \ t1outline$(O) \ t1subset$(O) \ parseAFM$(O) all : $(OBJS) .PHONY : clean clean : dummy $(RM) *$(O) $(RM) *~ *.bak \#*\# install : dummy dummy : # Dependencies of object files # (generated by "gcc -MM *.c > .dependencies"): include .dependencies grace-5.1.23/T1lib/t1lib/t1outline.h0000644000076500001440000000735307415144743016534 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1outline.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-05-27 ----- Description: This file is part of the t1-library. It contains definitions and declarations for t1outline.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1OUTLINE_C T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); void T1_DumpPath( T1_OUTLINE *path); void T1_AbsolutePath( T1_OUTLINE *rpath); void T1_RelativePath( T1_OUTLINE *apath); void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)); T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); void T1_FreeOutline( T1_OUTLINE *path); #else extern T1_OUTLINE *T1_GetCharOutline( int FontID, char charcode, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_GetStringOutline( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform); extern T1_OUTLINE *T1_ConcatOutlines( T1_OUTLINE *path1, T1_OUTLINE *path2); extern T1_OUTLINE *T1_ScaleOutline( T1_OUTLINE *path, float scale); extern T1_OUTLINE *T1_GetMoveOutline( int FontID, int deltax, int deltay, int modflag, float size, T1_TMATRIX *transform); extern void T1_DumpPath( T1_OUTLINE *path); extern void T1_AbsolutePath( T1_OUTLINE *rpath); extern void T1_RelativePath( T1_OUTLINE *apath); extern void T1_ManipulatePath( T1_OUTLINE *path, void (*manipulate)(fractpel *x,fractpel *y,int type)); extern T1_OUTLINE *T1_CopyOutline( T1_OUTLINE *path); extern void T1_FreeOutline( T1_OUTLINE *path); #endif extern struct region *fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster); extern struct region *fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster); extern struct region *fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, char *charname, int *mode, psfont *Font_Ptr, int do_raster); grace-5.1.23/T1lib/t1lib/t1afmtool.c0000644000076500001440000004276407521323634016512 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1afmtool.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains functions for generating a fallback set of afm data from type 1 font files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1AFMTOOL_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "../type1/blues.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1base.h" #include "t1misc.h" #include "t1set.h" #include "t1load.h" #include "t1afmtool.h" #define DELTA_MAX 30 #define ENCODINGSIZE (int) 256 #ifndef T1LIB_IDENT #define T1LIB_IDENT "???.???" #endif extern char *t1_get_abort_message( int number); /* T1_GenerateAFMFallbackInfo(): Generate fallback information from Type 1 font file by rasterizing every character at 1000 bp. Returns a pointer to a generated FontInfo struct or NULL in case of an error. */ FontInfo *T1_GenerateAFMFallbackInfo( int FontID) { int i, j; struct region *area; struct XYspace *S; int mode=0; char **charnames; int nochars=0; FontInfo *pAFMData; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_ERROR); return( NULL); } /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ sprintf( err_warn_msg_buf, "Can't generate AFM Info from Font %d (invalid ID)\n", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Setup apropriate charspace matrix */ S=(struct XYspace *)IDENTITY; /* Make this permanent so that scaling it in fontfcnB_ByName will make a duplicate of it, and this duplicate can thus be safely destroyed. Fixes the somewhat smaller memory leak */ S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Alloc memory for FontInfo: */ if ((pAFMData=(FontInfo *)malloc( sizeof(FontInfo)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for FontInfo in Font %d!", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } /* Initialize pointers */ pAFMData->gfi=NULL; pAFMData->cwi=NULL; pAFMData->numOfChars=0; pAFMData->cmi=NULL; pAFMData->numOfTracks=0; pAFMData->tkd=NULL; pAFMData->numOfPairs=0; pAFMData->pkd=NULL; pAFMData->numOfComps=0; pAFMData->ccd=NULL; /* Get list of character name */ charnames=T1_GetAllCharNames( FontID); /* and count number of characters */ nochars=0; while (charnames[nochars]!=NULL) nochars++; pAFMData->numOfChars=nochars; /* Allocate memory for CharMetricInfo area */ if ((pAFMData->cmi=(CharMetricInfo *) malloc( nochars * sizeof( CharMetricInfo)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for CharMetricsInfo area in Font %d!", FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); free( pAFMData); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } /* Get metrics values */ for (i=0; ipFontArray[FontID].pType1Data, DO_RASTER); if (area==NULL){ sprintf( err_warn_msg_buf, "Could not get charspace representation of character %d (%s) Font %d!", i, charnames[i], FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); /* Return since we don't know how to fill the values */ for (j=i-1; j>=0; j--) free( pAFMData->cmi[j].name); if (pAFMData->cmi!=NULL) free( pAFMData->cmi); if (pAFMData!=NULL) free( pAFMData); T1_errno=mode; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } else if ((pAFMData->cmi[i].name=(char *) malloc( (size_t)(strlen( charnames[i])+1)))==NULL){ sprintf( err_warn_msg_buf, "Failed to allocate memory for CharName %d (%s) Font %d!", i, charnames[i], FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_WARNING); /* NULL-ptr in charnames is prone to SIGSEGV-errors, thus, we have to return: */ for (j=i; j>=0; j--) free( pAFMData->cmi[j].name); free( pAFMData->cmi); free( pAFMData); T1_errno=T1ERR_ALLOC_MEM; /* make sure to free S */ if (S) { KillSpace (S); } return( NULL); } else{ strcpy( pAFMData->cmi[i].name, charnames[i]); pAFMData->cmi[i].code=T1_GetEncodingIndex( FontID, charnames[i]); pAFMData->cmi[i].wx=NEARESTPEL(area->ending.x); pAFMData->cmi[i].wy=NEARESTPEL(area->ending.y); /* We check for a valid BBox and set it to zero otherwise */ if ((int)area->xmax > (int)area->xmin){ pAFMData->cmi[i].charBBox.llx =(int)area->xmin; pAFMData->cmi[i].charBBox.urx =(int)area->xmax; pAFMData->cmi[i].charBBox.lly =(int)area->ymin; pAFMData->cmi[i].charBBox.ury =(int)area->ymax; } else{ pAFMData->cmi[i].charBBox.llx =0; pAFMData->cmi[i].charBBox.urx =0; pAFMData->cmi[i].charBBox.lly =0; pAFMData->cmi[i].charBBox.ury =0; } pAFMData->cmi[i].ligs=NULL; /* We are done with area, so get rid of it. Solves the REALLY HUGE memory leak */ KillRegion (area); } } sprintf( err_warn_msg_buf, "Generated metric information for %d characters of font %d!", nochars, FontID); T1_PrintLog( "T1_GenerateAFMFallbackInfo()", err_warn_msg_buf, T1LOG_STATISTIC); /* make sure to free S */ if (S) { KillSpace (S); } return( pAFMData); } /* T1_WriteAFMFallbackFile(): Write a fallback AFM-file from AFM data genarated for font FontID. returns 0 if successful -1 if afm-data was loaded from existent AFM-file -2 if font is not loaded (invalid FontID) -3 if for some reason the fonts' AFM-data has not been generated -4 if the file could not be openend -5 if an error occurred during write -6 other error. */ int T1_WriteAFMFallbackFile( int FontID) { int i, j, k, l; int nochars; int capheight, ascender, xheight, descender; int min=0, delta; time_t s_clock, *tp; char *afmfilename; FILE *afmfile; CharMetricInfo **cmi; /* Check for valid font */ if (CheckForFontID(FontID)!=1){ sprintf( err_warn_msg_buf, "Warning: Invalid FontID, font %d not loaded!", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_INVALID_FONTID; return(-2); } /* Check for AFM-data to be existent */ if (pFontBase->pFontArray[FontID].pAFMData==NULL){ sprintf( err_warn_msg_buf, "Warning: No AFM-Data available for font %d", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); return(-3); } /* Check if AFM data has been generated from existent afm file --> no need to generate a new one. */ if ((pFontBase->pFontArray[FontID].info_flags & AFM_SUCCESS) || (pFontBase->pFontArray[FontID].info_flags & AFM_SLOPPY_SUCCESS)){ sprintf( err_warn_msg_buf, "Alert: Available AFM-Data for font %d is generated from existent AFM-file!", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_STATISTIC); return(-1); } /* Construct AFM-filename */ i=strlen(pFontBase->pFontArray[FontID].pFontFileName); if ((afmfilename=(char *)malloc((size_t)(i + 1) ))==NULL){ sprintf( err_warn_msg_buf, "Memory allocation error (fontID = %d)", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-6); } strcpy( afmfilename, pFontBase->pFontArray[FontID].pFontFileName); while (afmfilename[i]!='.') i--; afmfilename[i+1]='a'; afmfilename[i+2]='f'; afmfilename[i+3]='m'; if ((afmfile=fopen( afmfilename, "wb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open %s, (FontID = %d)", afmfilename, FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); free( afmfilename); T1_errno=T1ERR_FILE_OPEN_ERR; return(-4); } /* Set the creation time of afm file */ tp=&s_clock; s_clock=time( tp); /* Allocate a pointer-array to the metrics information, of the size 256 + number of characters. */ nochars=pFontBase->pFontArray[FontID].pAFMData->numOfChars; if ((cmi=(CharMetricInfo **)calloc( nochars+ENCODINGSIZE, sizeof(CharMetricInfo *)))==NULL){ sprintf( err_warn_msg_buf, "Memory allocation error (fontID = %d)", FontID); T1_PrintLog( "T1_WriteAFMFallbackFile()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-6); } /* Reset area */ for ( i=0; i<(nochars+ENCODINGSIZE); i++) cmi[i]=NULL; /* First half of array is dedicated to encoded characters, the second half for unencoded characters */ k=ENCODINGSIZE; for ( i=0; ipFontArray[FontID].pAFMData->cmi[i].name); if (j>=0) cmi[j]=&(pFontBase->pFontArray[FontID].pAFMData->cmi[i]); else cmi[k++]=&(pFontBase->pFontArray[FontID].pAFMData->cmi[i]); } fprintf(afmfile, "StartFontMetrics 4.0\n"); fprintf(afmfile, "Comment This is %s created from %s by t1lib V. %s.\n", afmfilename, pFontBase->pFontArray[FontID].pFontFileName, T1LIB_IDENT); fprintf(afmfile, "Comment File creation date: %s", ctime(&s_clock)); fprintf(afmfile, "Comment t1lib is copyright (c) Rainer Menzner, 1996-2001.\n"); fprintf(afmfile, "Comment t1lib is distributed under the GNU General Public Library License (LGPL)\n"); fprintf(afmfile, "FontName %s\n", T1_GetFontName( FontID)); fprintf(afmfile, "FullName %s\n", T1_GetFullName( FontID)); fprintf(afmfile, "FamilyName %s\n", T1_GetFamilyName( FontID)); fprintf(afmfile, "Weight %s\n", T1_GetWeight( FontID)); fprintf(afmfile, "ItalicAngle %d\n", (int)T1_GetItalicAngle( FontID)); fprintf(afmfile, "IsFixedPitch %s\n", T1_GetIsFixedPitch( FontID) ? "true" : "false" ); fprintf(afmfile, "FontBBox %d %d %d %d\n", T1_GetFontBBox( FontID).llx, T1_GetFontBBox( FontID).lly, T1_GetFontBBox( FontID).urx, T1_GetFontBBox( FontID).ury); fprintf(afmfile, "UnderlinePosition %d\n", (int)T1_GetUnderlinePosition( FontID)); fprintf(afmfile, "UnderlineThickness %d\n", (int)T1_GetUnderlineThickness( FontID)); fprintf(afmfile, "Version %s\n", T1_GetVersion( FontID)); fprintf(afmfile, "Notice %s\n", T1_GetNotice( FontID)); /* Encoding */ if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ if (pFontBase->pFontArray[FontID].info_flags & USES_STANDARD_ENCODING){ fprintf( afmfile, "EncodingScheme AdobeStandardEncoding\n"); } else{ fprintf( afmfile, "EncodingScheme FontSpecific\n"); } } else fprintf( afmfile, "EncodingScheme FontSpecific\n"); /* Values like capheight ascender xheight and descender */ /* We start with the overshoot positions */ i=pFontBase->pFontArray[FontID].pType1Data->BluesP->numBlueValues; if (i>0){ /* Capheight */ if ((k=T1_GetEncodingIndex( FontID, "H"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ capheight=0; else capheight=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else capheight=0; /* XHeight */ if ((k=T1_GetEncodingIndex( FontID, "x"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ xheight=0; else xheight=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else{ xheight=0; } /* Ascender */ if ((k=T1_GetEncodingIndex( FontID, "d"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).ury; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[j] - l); } } if (min % 2) /* index is odd */ min--; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ ascender=0; else ascender=pFontBase->pFontArray[FontID].pType1Data->BluesP->BlueValues[min]; } else{ ascender=0; } } else{ capheight=0; xheight=0; ascender=0; } /* And now comes under shoot alignment position */ i=pFontBase->pFontArray[FontID].pType1Data->BluesP->numOtherBlues; if (i>0){ /* Descender */ if ((k=T1_GetEncodingIndex( FontID, "p"))!=-1){ l=T1_GetCharBBox( FontID, (char) k).lly; delta=10000; for (j=0; j abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[j] - l)){ min=j; delta=abs(pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[j] - l); } } if ((min % 2)==0) /* index is even */ min++; /* Check for plausibility */ if (abs( pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[min] - l) > DELTA_MAX) /* We probably did not found the right position */ descender=0; else descender=pFontBase->pFontArray[FontID].pType1Data->BluesP->OtherBlues[min]; } else{ descender=0; } } else{ descender=0; } if (capheight != 0) fprintf( afmfile, "CapHeight %d\n", capheight); if (xheight != 0) fprintf( afmfile, "XHeight %d\n", xheight); if (ascender != 0) fprintf( afmfile, "Ascender %d\n", ascender); if (descender != 0) fprintf( afmfile, "Descender %d\n", descender); if (pFontBase->pFontArray[FontID].pType1Data->BluesP->StdHW != 0.0) fprintf( afmfile, "StdHW %d\n", (int) pFontBase->pFontArray[FontID].pType1Data->BluesP->StdHW); if (pFontBase->pFontArray[FontID].pType1Data->BluesP->StdVW != 0.0) fprintf( afmfile, "StdVW %d\n", (int) pFontBase->pFontArray[FontID].pType1Data->BluesP->StdVW); /* Now fill in the values (we omit the .notdef) */ fprintf(afmfile, "StartCharMetrics %d\n", nochars-1); for ( i=0; i<(nochars+ENCODINGSIZE); i++){ if (cmi[i]!=NULL && strcmp(cmi[i]->name,".notdef")) fprintf( afmfile, "C %3d ; WX %4d ; N %-20s ; B %5d %5d %5d %5d ;\n", cmi[i]->code, cmi[i]->wx, cmi[i]->name, cmi[i]->charBBox.llx, cmi[i]->charBBox.lly, cmi[i]->charBBox.urx, cmi[i]->charBBox.ury); } fprintf(afmfile, "EndCharMetrics\nEndFontMetrics\n"); free(cmi); fclose( afmfile); return(0); } grace-5.1.23/T1lib/t1lib/t1base.h0000644000076500001440000000707307415144742015765 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1base.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1base.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1BASE_C void *T1_InitLib( int log); int intT1_scanFontDBase( char *filename); int T1_CloseLib( void); int T1_AddFont( char *fontfilename); void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); void T1_SetLogLevel( int level); int CheckForInit(void); int CheckForFontID( int FontID); int test_for_t1_file( char *buffer ); char *T1_GetFontFileName( int FontID); int T1_Get_no_fonts(void); int T1_SetDeviceResolutions( float x_res, float y_res); int T1_CopyFont( int FontID); int T1_QueryX11Support( void); void bin_dump_c(unsigned char value, char space_flag); void bin_dump_s(unsigned short value, char space_flag); void bin_dump_l(unsigned long value, char space_flag); int T1_CheckEndian(void); int T1_SetBitmapPad( int pad); int T1_GetBitmapPad( void); char *T1_GetLibIdent( void); void T1_SetRasterFlags( int flags); char *T1_GetAfmFileName( int FontID); int T1_SetAfmFileName( int FontId, char *afm_name); char *T1_GetFontFilePath( int FontID); char *T1_GetAfmFilePath( int FontID); extern int T1_Type1OperatorFlags; #else extern void *T1_InitLib( int log); extern int intT1_scanFontDBase( char *filename); extern int T1_CloseLib( void); extern int T1_AddFont( char *fontfilename); extern void T1_PrintLog( char *func_ident, char *msg_txt, int level, ...); extern void T1_SetLogLevel( int level); extern int CheckForInit(void); extern int CheckForFontID( int FontID); extern int test_for_t1_file( char *buffer ); extern char *T1_GetFontFileName( int FontID); extern int T1_Get_no_fonts(void); extern int T1_SetDeviceResolutions( float x_res, float y_res); extern int T1_QueryX11Support( void); extern int T1_CopyFont( int FontID); extern void bin_dump_c(unsigned char value, char space_flag); extern void bin_dump_s(unsigned short value, char space_flag); extern void bin_dump_l(unsigned long value, char space_flag); extern int T1_CheckEndian(void); extern int T1_SetBitmapPad( int pad); extern int T1_GetBitmapPad( void); extern char *T1_GetLibIdent( void); extern void T1_SetRasterFlags( int flags); extern char *T1_GetAfmFileName( int FontID); extern int T1_SetAfmFileName( int FontId, char *afm_name); extern char *T1_GetFontFilePath( int FontID); extern char *T1_GetAfmFilePath( int FontID); #endif grace-5.1.23/T1lib/t1lib/t1extern.h0000644000076500001440000000761607415144743016364 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1extern.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It contains external declarations used by the t1-library. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #include "t1misc.h" /* Following struct will allow all accesses to font data! */ extern struct FONTBASE { int t1lib_flags; /* Global library flags */ int no_fonts_ini; /* The number of fonts initially declared in Font database file. */ int no_fonts; /* The number of currently allocated fonts including logical fonts produced by T1_CopyFont() */ int no_fonts_limit; /* The maximum number of font for which is memory currently available. */ int bitmap_pad; /* The value to which bitmap-scanlines are padded */ int endian; /* 1 if little endian representation and 0 otherwise */ char **default_enc; /* The default encoding vector */ FONTPRIVATE *pFontArray; /* Points to first element of font pointer array */ } FontBase; extern struct FONTBASE *pFontBase; /* Further we need a struct where to save device dependent data such as resolution. The values in this struct may be altered using T1_SetDeviceRes(x_res,y_res). Generally, the fontsize is to be specified in BigPoints ("bp")---this is the default PostScript unit. It is 1in=72bp. */ extern struct { float x_resolution; /* Value must be specified in DPI */ float y_resolution; /* Value must be specified in DPI */ float scale_x; /* horizontal scale-value to get a matrix scaled to 1b */ float scale_y; /* vertical scale-value to get a matrix scaled to 1b */ } DeviceSpecifics; extern struct stat filestats; /* A structure where fileinfo is stored */ extern char linebuf[BUF_SIZE]; /* A buffer for reading files line by line */ extern int T1_Up; /* This one is for initialization-checking */ /* The width of AA-pixels */ extern int T1aa_bpp; /* The follwoing variable allows the primary rastering functions to check for the caller */ extern int SetFuncRequestID; /* The following variable allows to suppress rastering at 1000 bp for getting a correct bounding box for slanted characters --> should only internally be used */ extern int ForceAFMBBox; extern struct XYspace *IDENTITY; extern int errornumber; /* for debugging purposes */ extern char **T1_PFAB_ptr; extern char **T1_AFM_ptr; extern char **T1_ENC_ptr; extern char **T1_FDB_ptr; /* We use a uchar buffer for error and warning messages: */ extern char err_warn_msg_buf[1024]; /* file pointer for log-file */ extern FILE *t1lib_log_file; extern int t1lib_log_level; /* The errno for t1lib */ extern int T1_errno; /* A variable for saving stack info */ extern jmp_buf stck_state; grace-5.1.23/T1lib/t1lib/t1subset.c0000644000076500001440000006315707521323634016355 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1subset.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-09-09 ----- Description: This file is part of the t1-library. It contains functions for subsetting type 1 fonts. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1SUBSET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1subset.h" /* Segment header for pfb-files (reminder): Segment-header: Byte 1: always 128 (0x80) Byte 2: 1 = ASCII text 2 = Binary text 3 = End of file indicator (EOF) Byte 3: least significant byte \ Byte 4: \ Length of Byte 5: / data segment in bytes Byte 6: most significant byte / */ #define SEGMENT_ASCII 1 #define SEGMENT_BINARY 2 #define SEGMENT_EOF 3 static char *charstringP; static int charstringL; /* We define two lookup tables to make a fast conversion from binary bytes to ASCII-hex bytes. */ static unsigned char highHexByte[256]={ 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, 0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31, 0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32, 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, 0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, 0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46 }; static unsigned char lowHexByte[256]={ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 }; /* parameters for eexec encryption */ static unsigned short int eexec_r; static unsigned short int eexec_c1=52845; static unsigned short int eexec_c2=22719; /* Eexec-encrption according to the Adobe Black Book */ static unsigned char EexecEncrypt( unsigned char plain) { unsigned char cipher; cipher = (plain ^ (eexec_r>>8)); eexec_r = (cipher + eexec_r) * eexec_c1 + eexec_c2; return( cipher); } static int locateCharString( int FontID, char *charname) { int namelen; int dictlen; int i; psdict *CharStringsP; namelen=strlen( charname); CharStringsP=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; dictlen=CharStringsP[0].key.len; for ( i=1; i<=dictlen; i++) { if (namelen==CharStringsP[i].key.len) { /* This could be the charstring in question */ if (strncmp( charname, CharStringsP[i].key.data.nameP, namelen)==0) { /* It is the the desired charstring */ charstringP=CharStringsP[i].value.data.valueP; charstringL=CharStringsP[i].value.len; return( i); } } } /* charstring not found ??? */ return( 0); } static int make_pfb_segment_header( char *ptr, int type, unsigned long size) { ptr[0]=(char) 0x80; ptr[1]=type; if (type==3) return( 2); ptr[2]=(char)(size & 0xFF); ptr[3]=(char)((size>>8) & 0xFF); ptr[4]=(char)((size>>16) & 0xFF); ptr[5]=(char)((size>>24) & 0xFF); return( 6); } /* A function for reading a Type 1 font file. eexec-decryption is done on the fly. */ char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize) { FILE *ifp; static char *filebuf=NULL; unsigned long filesize=0; int filesegs=0; char *outbuf=NULL; unsigned long outsize=0; char *encryptbuf=NULL; unsigned long encryptsize=0; int encryptsegs=0; char *trailerbuf=NULL; unsigned long trailersize=0; int trailersegs=0; char linebuf[1025]; char *csdone; /* stores which charstrings already have been written */ int currstring_no=0; char *charnameP; unsigned char cipher; char rdstring[3]; char ndstring[3]; int retval=1; /* Indices. Could save a few but debugging becomes easier this way */ int i=0; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int notdefencoded=0; int stdenc=0; int reencode=0; int colcount=0; int tr_len=-1; int encrypt=1; /* 1=ASCII-hex, 2=Binary, 0=None (for debugging) */ int dindex=0; int nocharstrings=0; /* Otherwise we would get invalid accesses later */ if (CheckForFontID(FontID)!=1) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } /* Check parameters */ if ( (mask==NULL) || (bufsize==NULL) || (linewidth < 8) || (linewidth > 1024) || (maxblocksize < 4) ) { T1_errno=T1ERR_INVALID_PARAMETER; return(NULL); } for ( j=0; j<256; j++) { if (mask[j]!=0) { nocharstrings++; } } /* adjust encrypting type according to flags. Default is ASCII-hex encryption because the output may be verbatim inserted into a PostScript-file. */ if (flags & T1_SUBSET_ENCRYPT_BINARY) encrypt=2; else if (flags & T1_SUBSET_ENCRYPT_NONE) encrypt=0; /* Open and initialize scanning machinery */ T1io_reset(); if ((ifp = (FILE *)T1Open(T1_GetFontFilePath( FontID), "rb"))==NULL) { T1_errno=T1ERR_FILE_OPEN_ERR; return(NULL); } if (encrypt==0) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, non-encrypted debug output", FontID, flags); else if (encrypt==1) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, ASCII-hex output with linelength %d", FontID, flags, linewidth); else if (encrypt==2) sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, Binary output with maximum blocksize %lu", FontID, flags, maxblocksize); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* Get size of file */ filesize=T1GetFileSize( ifp); sprintf( err_warn_msg_buf, "Source file %s is %lu bytes long", T1_GetFontFilePath( FontID), filesize); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); if ((filebuf=(char *)calloc( filesize, sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( NULL); } while (retval>0) { /* get a line from the file. We have to read enough characters to ensure that "eexec" does not get split between two reads. Otherwise, decryption would not be started. */ retval=T1Gets(&(filebuf[i]), 1025, ifp); i+=retval; if ( (dindex==0) && (T1GetDecrypt()>0) ) { dindex=i-retval; /* from this point on we have decrypted bytes */ sprintf( err_warn_msg_buf, "Human-readable header finished (%d data bytes)", dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } /* Encoding handling */ if (strstr( &(filebuf[i-retval]), "/Encoding")!=NULL) { if (strstr( &(filebuf[i-retval]), "StandardEncoding")!=NULL) { stdenc=1; if ((flags & T1_SUBSET_FORCE_REENCODE)!=0) { /* we ignore the current line ... */ i-=retval; /* and put the encoding header into the buffer */ i+=sprintf( &(filebuf[i]), "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n" ); reencode=1; } else { T1_PrintLog( "T1_SubsetFont()", "Leaving StandardEncoding untouched", T1LOG_DEBUG); reencode=0; } } else { /* The encoding is explicitly defined in the font file. We skip the whole definition unless reencoding should be skipped. */ stdenc=0; retval=T1Gets(&(filebuf[i]), 1025, ifp); i+=retval; while (retval>0) { /* get a line and check for end of encoding definition. */ retval=T1Gets(&(filebuf[i]), 1025, ifp); if ((flags & T1_SUBSET_SKIP_REENCODE)!=0) { /* we store the encoding defined here */ i+=retval; reencode=0; } else { reencode=1; } if ( (dindex==0) && (T1GetDecrypt()>0) ) { dindex=i; /* from this point we have decrypted bytes */ } if (strstr( &(filebuf[i-retval]), "readonly def")!=NULL) { break; } } if (reencode==0) T1_PrintLog( "T1_SubsetFont()", "Preserving FontSpecific Encoding", T1LOG_DEBUG); } /* At this point, if required, the actual encoding definition follows */ if ( reencode!=0) { k=0; for ( j=0; j<256; j++) { if (mask[j]!=0) { charnameP=T1_GetCharName( FontID, j); i+=sprintf( &(filebuf[i]), "dup %d /%s put\n", j, charnameP); k++; if (strcmp(charnameP, ".notdef")==0) notdefencoded=1; } } /* finish encoding definition */ i+=sprintf( &(filebuf[i]), "readonly def\n"); sprintf( err_warn_msg_buf, "Encoded %d characters", k); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); k=0; } } /* end of if (...encoding handling...) */ /* Extract the names are used for the charstring definitions. We will later need them! */ if (strstr( &(filebuf[i-retval]), "/RD")!=NULL) { sprintf( rdstring, "RD"); } if (strstr( &(filebuf[i-retval]), "/ND")!=NULL) { sprintf( ndstring, "ND"); } if (strstr( &(filebuf[i-retval]), "/-|")!=NULL) { sprintf( rdstring, "-|"); } if (strstr( &(filebuf[i-retval]), "/|-")!=NULL) { sprintf( ndstring, "|-"); } if (strstr( &(filebuf[i-retval]), "/CharStrings")!=NULL) { /* replace dictionary with one of an appropriate size: */ i -=retval; sprintf( err_warn_msg_buf, "Private dictionary finished (%u data bytes)", i-dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* if .notdef is not in the encoding mask, we have to reserve room for the additional charstring .notdef. Note that still nocharstrings is an upper bound estimation, which is reached in cases where no characters are encoded more than one time. */ if (notdefencoded==0) nocharstrings++; i+=sprintf( &(filebuf[i]), "2 index /CharStrings %d dict dup begin\n", nocharstrings); break; } } /* the portion until Charstrings-dict is now read in */ /* We now have to write the CharStrings. Each charstring must be written once, even if the respective character appears more than once in the encoding. So we set up table to remember which charstrings already have been written. Note: The indices returned by locateCharString() range from 1 to n, so that we have to decrement the index when filling the csdone array! */ if (( csdone=(char *)calloc( pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len, sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); T1Close( ifp); return( NULL); } /* The .notdef character is in force! */ if ((currstring_no=locateCharString( FontID, ".notdef"))==0) { T1_errno=T1ERR_UNSPECIFIED; free( csdone); T1Close( ifp); return( NULL); } i+=sprintf( &(filebuf[i]), "/.notdef %d %s ", charstringL, rdstring); memcpy(&(filebuf[i]), charstringP, charstringL); i+=charstringL; i+=sprintf( &(filebuf[i]), " %s\n", ndstring); csdone[currstring_no-1]=1; /* Now, step through the specifier matrix and write only the necessary charstrings. */ for ( j=0; j<256; j++) { if (mask[j]!=0) { charnameP=T1_GetCharName( FontID, j); if ((currstring_no=locateCharString( FontID, charnameP))==0) { /* This is mysterious, but causes no harm because .notdef will be substituted */ sprintf( err_warn_msg_buf, "Could not locate CS ""%s"" for index %d", charnameP, j); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_WARNING); continue; } /* Process charstring only if it has not already been done */ if (csdone[currstring_no-1]==0) { k=i; i+=sprintf( &(filebuf[i]), "/%s %d %s ", charnameP, charstringL, rdstring); memcpy(&(filebuf[i]), charstringP, charstringL); i+=charstringL; i+=sprintf( &(filebuf[i]), " %s\n", ndstring); csdone[currstring_no-1]=1; sprintf( err_warn_msg_buf, "Processing of CS ""%s"" for index %d successful (len=%d bytes, line=%d bytes)", charnameP, j, charstringL, i-k); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } else { sprintf( err_warn_msg_buf, "Skipped multiple processing of CS ""%s"" (index %d)", charnameP, j); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); } } } if (csdone!=NULL) free( csdone); /* All charstrings are written. Some PostScript code follows */ i+=sprintf( &(filebuf[i]), "end\nend\nreadonly put\nnoaccess put\ndup /FontName get exch definefont pop\nmark currentfile closefile\n"); sprintf( err_warn_msg_buf, "Charstrings and Font definition finished (%d data bytes, from which %d bytes will be encrypted)", i, i-dindex); T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, T1LOG_DEBUG); /* we compute the size of the encrypted area. */ if (encrypt==1) { encryptsize=i-dindex; encryptsize+=4; /* the four random bytes */ encryptsize*=2; /* since we use ASCII-hex output */ encryptsize+=(int)ceil((double)encryptsize/linewidth); /* we need a few newline characters to adjust the output format */ } else if (encrypt==2) { /* binary encryption. The whole data is contiguous and only at the end of the data a newline is added. */ encryptsize=i-dindex+1; encryptsize+=4; /* the four random bytes */ } else { /*The case of no encryption does not produce valid fonts, it is for debugging purposes only */ encryptsize=i-dindex+1; } /* we add the size of the 512 zeros and the cleartomark */ trailersize+=ZEROS; trailersize+=(int)ceil((double)ZEROS/linewidth); trailersize+=12; /* cleartomark */ /* Search for remaining PostScript code in the last 1024 bytes. This should suffice for any font. */ tr_len=T1GetTrailer( linebuf, 1025, ifp); T1Close(ifp); /* we do not need the file any longer */ /* And we add the size of the trailer. A trailer only consisting of a newline is ignored because the newline has already been included in the cleartomark-string. */ if ( !((tr_len==1) && ((linebuf[0]=='\n') || (linebuf[0]=='\r')) ) ) { trailersize+=tr_len; } if ((encryptbuf=(char *)calloc( encryptsize, 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); return( NULL); } /* Allocate one byte in orer to be able to use sprintf() (which appends an ASCII-\0).*/ if ((trailerbuf=(char *)calloc( trailersize+1, 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( filebuf); free( encryptbuf); return( NULL); } k=0; colcount=0; /* perform eexec-encryption */ eexec_r=55665; if (encrypt==0) { for (j=dindex; jpFontArray[FontID].pType1Data->Private[LENIV].value.data.integer); } grace-5.1.23/T1lib/t1lib/parseAFM.h0000644000076500001440000003161107415144742016237 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: parseAFM.h ----- Author: Adobe Systems Inc., modifications by Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It is the original parseAFM.h modified at a few points. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ /* * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved. * * This file may be freely copied and redistributed as long as: * 1) This entire notice continues to be included in the file, * 2) If the file has been modified in any way, a notice of such * modification is conspicuously indicated. * * PostScript, Display PostScript, and Adobe are registered trademarks of * Adobe Systems Incorporated. * * ************************************************************************ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. * ************************************************************************ */ /* ParseAFM.h * * This header file is used in conjuction with the parseAFM.c file. * Together these files provide the functionality to parse Adobe Font * Metrics files and store the information in predefined data structures. * It is intended to work with an application program that needs font metric * information. The program can be used as is by making a procedure call to * parse an AFM file and have the data stored, or an application developer * may wish to customize the code. * * This header file defines the data structures used as well as the key * strings that are currently recognized by this version of the AFM parser. * This program is based on the document "Adobe Font Metrics Files, * Specification Version 2.0". * * AFM files are separated into distinct sections of different data. Because * of this, the parseAFM program can parse a specified file to only save * certain sections of information based on the application's needs. A record * containing the requested information will be returned to the application. * * AFM files are divided into five sections of data: * 1) The Global Font Information * 2) The Character Metrics Information * 3) The Track Kerning Data * 4) The Pair-Wise Kerning Data * 5) The Composite Character Data * * Basically, the application can request any of these sections independent * of what other sections are requested. In addition, in recognizing that * many applications will want ONLY the x-width of characters and not all * of the other character metrics information, there is a way to receive * only the width information so as not to pay the storage cost for the * unwanted data. An application should never request both the * "quick and dirty" char metrics (widths only) and the Character Metrics * Information since the Character Metrics Information will contain all * of the character widths as well. * * There is a procedure in parseAFM.c, called parseFile, that can be * called from any application wishing to get information from the AFM File. * This procedure expects 3 parameters: a vaild file descriptor, a pointer * to a (FontInfo *) variable (for which space will be allocated and then * will be filled in with the data requested), and a mask specifying * which data from the AFM File should be saved in the FontInfo structure. * * The flags that can be used to set the appropriate mask are defined below. * In addition, several commonly used masks have already been defined. * * History: * original: DSM Thu Oct 20 17:39:59 PDT 1988 * modified: DSM Mon Jul 3 14:17:50 PDT 1989 * - added 'storageProblem' return code * - fixed typos */ #include /* your basic constants */ #define T1LIB_TRUE 1 #define T1LIB_FALSE 0 #define EOL '\n' /* end-of-line indicator */ #define MAX_NAME 4096 /* max length for identifiers */ #define BOOL int #define FLAGS int /* Flags that can be AND'ed together to specify exactly what * information from the AFM file should be saved. */ #define P_G 0x01 /* 0000 0001 */ /* Global Font Info */ #define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */ #define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */ #define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */ #define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */ #define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */ /* Commonly used flags */ #define P_GW (P_G | P_W) #define P_GM (P_G | P_M) #define P_GMP (P_G | P_M | P_P) #define P_GMK (P_G | P_M | P_P | P_T) #define P_ALL (P_G | P_M | P_P | P_T | P_C) /* Possible return codes from the parseFile procedure. * * ok means there were no problems parsing the file. * * parseError means that there was some kind of parsing error, but the * parser went on. This could include problems like the count for any given * section does not add up to how many entries there actually were, or * there was a key that was not recognized. The return record may contain * vaild data or it may not. * * earlyEOF means that an End of File was encountered before expected. This * may mean that the AFM file had been truncated, or improperly formed. * * storageProblem means that there were problems allocating storage for * the data structures that would have contained the AFM data. */ #define ok 0 #define parseError -1 #define earlyEOF -2 #define storageProblem -3 /************************* TYPES *********************************/ /* Below are all of the data structure definitions. These structures * try to map as closely as possible to grouping and naming of data * in the AFM Files. */ /* Bounding box definition. Used for the Font BBox as well as the * Character BBox. */ typedef struct { int llx; /* lower left x-position */ int lly; /* lower left y-position */ int urx; /* upper right x-position */ int ury; /* upper right y-position */ } BBox; /* Global Font information. * The key that each field is associated with is in comments. For an * explanation about each key and its value please refer to the AFM * documentation (full title & version given above). */ typedef struct { char *afmVersion; /* key: StartFontMetrics */ char *fontName; /* key: FontName */ char *fullName; /* key: FullName */ char *familyName; /* key: FamilyName */ char *weight; /* key: Weight */ float italicAngle; /* key: ItalicAngle */ BOOL isFixedPitch; /* key: IsFixedPitch */ BBox fontBBox; /* key: FontBBox */ int underlinePosition; /* key: UnderlinePosition */ int underlineThickness; /* key: UnderlineThickness */ char *version; /* key: Version */ char *notice; /* key: Notice */ char *encodingScheme; /* key: EncodingScheme */ int capHeight; /* key: CapHeight */ int xHeight; /* key: XHeight */ int ascender; /* key: Ascender */ int descender; /* key: Descender */ } GlobalFontInfo; /* Ligature definition is a linked list since any character can have * any number of ligatures. */ typedef struct _t_ligature { char *succ, *lig; struct _t_ligature *next; } Ligature; /* Character Metric Information. This structure is used only if ALL * character metric information is requested. If only the character * widths is requested, then only an array of the character x-widths * is returned. * * The key that each field is associated with is in comments. For an * explanation about each key and its value please refer to the * Character Metrics section of the AFM documentation (full title * & version given above). */ typedef struct { int code, /* key: C */ wx, /* key: WX */ wy; /* together wx and wy are associated with key: W */ char *name; /* key: N */ BBox charBBox; /* key: B */ Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */ } CharMetricInfo; /* Track kerning data structure. * The fields of this record are the five values associated with every * TrackKern entry. * * For an explanation about each value please refer to the * Track Kerning section of the AFM documentation (full title * & version given above). */ typedef struct { int degree; float minPtSize, minKernAmt, maxPtSize, maxKernAmt; } TrackKernData; /* Pair Kerning data structure. * The fields of this record are the four values associated with every * KP entry. For KPX entries, the yamt will be zero. * * For an explanation about each value please refer to the * Pair Kerning section of the AFM documentation (full title * & version given above). */ typedef struct { char *name1; char *name2; int xamt, yamt; } PairKernData; /* PCC is a piece of a composite character. This is a sub structure of a * compCharData described below. * These fields will be filled in with the values from the key PCC. * * For an explanation about each key and its value please refer to the * Composite Character section of the AFM documentation (full title * & version given above). */ typedef struct { char *pccName; int deltax, deltay; } Pcc; /* Composite Character Information data structure. * The fields ccName and numOfPieces are filled with the values associated * with the key CC. The field pieces points to an array (size = numOfPieces) * of information about each of the parts of the composite character. That * array is filled in with the values from the key PCC. * * For an explanation about each key and its value please refer to the * Composite Character section of the AFM documentation (full title * & version given above). structure extended for use with t1lib. The fields "width" and bbox store the composite characters escapement and its bounding box (2001-05-027, RMz) */ typedef struct { int wx; /* these two will be filled by T1_LoadFont() */ BBox charBBox; char *ccName; int numOfPieces; Pcc *pieces; } CompCharData; /* FontInfo * Record type containing pointers to all of the other data * structures containing information about a font. * A a record of this type is filled with data by the * parseFile function. */ typedef struct { GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */ int *cwi; /* ptr to 256 element array of just char widths */ int numOfChars; /* number of entries in char metrics array */ CharMetricInfo *cmi; /* ptr to char metrics array */ int numOfTracks; /* number to entries in track kerning array */ TrackKernData *tkd; /* ptr to track kerning array */ int numOfPairs; /* number to entries in pair kerning array */ PairKernData *pkd; /* ptr to pair kerning array */ int numOfComps; /* number to entries in comp char array */ CompCharData *ccd; /* ptr to comp char array */ } FontInfo; /************************* PROCEDURES ****************************/ /* Call this procedure to do the grunt work of parsing an AFM file. * * "fp" should be a valid file pointer to an AFM file. * * "fi" is a pointer to a pointer to a FontInfo record sturcture * (defined above). Storage for the FontInfo structure will be * allocated in parseFile and the structure will be filled in * with the requested data from the AFM File. * * "flags" is a mask with bits set representing what data should * be saved. Defined above are valid flags that can be used to set * the mask, as well as a few commonly used masks. * * The possible return codes from parseFile are defined above. */ extern int T1lib_parseFile ( FILE *fp, FontInfo **fi, FLAGS flags ); grace-5.1.23/T1lib/t1lib/t1trans.h0000644000076500001440000000706607415144743016205 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1trans.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains definitions and declarations fort t1trans.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1TRANS_C int T1_ExtendFont( int FontID, double extend); int T1_SlantFont( int FontID, double slant); int T1_TransformFont( int FontID, T1_TMATRIX *matrix); double T1_GetExtend( int FontID); double T1_GetSlant( int FontID); T1_TMATRIX T1_GetTransform( int FontID); int T1_SetLinePosition( int FontID, int linetype, float value); int T1_SetLineThickness( int FontID, int linetype, float value); float T1_GetLinePosition( int FontID, int linetype); float T1_GetLineThickness( int FontID, int linetype); T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); #else extern int T1_ExtendFont( int FontID, double extend); extern int T1_SlantFont( int FontID, double slant); extern int T1_TransformFont( int FontID, T1_TMATRIX *matrix); extern double T1_GetExtend( int FontID); extern double T1_GetSlant( int FontID); extern T1_TMATRIX T1_GetTransform( int FontID); extern int T1_SetLinePosition( int FontID, int linetype, float value); extern int T1_SetLineThickness( int FontID, int linetype, float value); extern float T1_GetLinePosition( int FontID, int linetype); extern float T1_GetLineThickness( int FontID, int linetype); extern T1_TMATRIX *T1_RotateMatrix( T1_TMATRIX *matrix, double angle); extern T1_TMATRIX *T1_MirrorHMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_MirrorVMatrix( T1_TMATRIX *matrix); extern T1_TMATRIX *T1_ShearHMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ShearVMatrix( T1_TMATRIX *matrix, double shear); extern T1_TMATRIX *T1_ExtendHMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_ExtendVMatrix( T1_TMATRIX *matrix, double extent); extern T1_TMATRIX *T1_TransformMatrix( T1_TMATRIX *matrix, double cxx, double cyx, double cxy, double cyy); #endif grace-5.1.23/T1lib/t1lib/t1finfo.h0000644000076500001440000001076107415144743016153 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1finfo.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-03 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1finfo.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1FINFO_C int T1_GetKerning( int FontID, char char1, char char2); int T1_GetCharWidth( int FontID, char char1); BBox T1_GetCharBBox( int FontID, char char1); float T1_GetUnderlinePosition( int FontID); float T1_GetUnderlineThickness( int FontID); float T1_GetItalicAngle( int FontID); int T1_GetIsFixedPitch( int FontID); char *T1_GetFontName( int FontID); char *T1_GetFullName( int FontID); char *T1_GetFamilyName( int FontID); char *T1_GetWeight( int FontID); char *T1_GetVersion( int FontID); char *T1_GetNotice( int FontID); char *T1_GetCharName( int FontID, char char1); int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); int T1_GetEncodingIndex( int FontID, char *char1); int *T1_GetEncodingIndices( int FontID, char *char1); int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff,int kerning); BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); BBox T1_GetFontBBox( int FontID); char **T1_GetAllCharNames( int FontID); int T1_GetNoKernPairs( int FontID); static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2); int T1_GetNoCompositeChars( int FontID); int T1_QueryCompositeChar( int FontID, char char1); T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); int T1_IsInternalChar( int FontID, char char1); #else extern int T1_GetKerning( int FontID, char char1, char char2); extern int T1_GetCharWidth( int FontID, char char1); extern BBox T1_GetCharBBox( int FontID, char char1); extern float T1_GetUnderlinePosition( int FontID); extern float T1_GetUnderlineThickness( int FontID); extern float T1_GetItalicAngle( int FontID); extern int T1_GetIsFixedPitch( int FontID); extern char *T1_GetFontName( int FontID); extern char *T1_GetFullName( int FontID); extern char *T1_GetFamilyName( int FontID); extern char *T1_GetWeight( int FontID); extern char *T1_GetVersion( int FontID); extern char *T1_GetNotice( int FontID); extern char *T1_GetCharName( int FontID, char char1); extern int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures); extern int T1_GetEncodingIndex( int FontID, char *char1); extern int *T1_GetEncodingIndices( int FontID, char *char1); extern int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff,int kerning); extern BBox T1_GetStringBBox( int FontID, char *string, int len, long spaceoff, int kerning); extern METRICSINFO T1_GetMetricsInfo( int FontID, char *string, int len, long spaceoff, int kerning); extern BBox T1_GetFontBBox( int FontID); extern int T1_GetNoKernPairs( int FontID); extern char **T1_GetAllCharNames( int FontID); extern int T1_GetNoCompositeChars( int FontID); extern int T1_QueryCompositeChar( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1); extern T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index); extern int T1_IsInternalChar( int FontID, char char1); #endif grace-5.1.23/T1lib/t1lib/t1env.h0000644000076500001440000000447007415144743015642 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1env.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-09-26 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1env.c ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1ENV_C void intT1_FreeSearchPaths( void); void intT1_SetupDefaultSearchPaths( void); int intT1_ScanConfigFile( void); char *intT1_Env_GetCompletePath( char *FileName, char **env_ptr ); int T1_SetFileSearchPath( int type, char *pathname); int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); char *T1_GetFileSearchPath( int type); int T1_SetFontDataBase( char *filename); int T1_AddFontDataBase( int mode, char *filename); #else extern void intT1_FreeSearchPaths( void); extern void intT1_SetupDefaultSearchPaths( void); extern int intT1_ScanConfigFile( void); extern char *intT1_Env_GetCompletePath( char *FileName, char **env_ptr ); extern int T1_SetFileSearchPath( int type, char *pathname); extern int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname); extern char *T1_GetFileSearchPath( int type); extern int T1_SetFontDataBase( char *filename); extern int T1_AddFontDataBase( int mode, char *filename); #endif grace-5.1.23/T1lib/t1lib/parseAFM.c0000644000076500001440000012736007623544015016237 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: parseAFM.c ----- Author: Adobe Systems Inc., modifications by Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2002-10-26 ----- Description: This file is part of the t1-library. It is the original parseAFM.h modified at a few points, especially for reading MSDOS-style AFM files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ /* * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved. * * This file may be freely copied and redistributed as long as: * 1) This entire notice continues to be included in the file, * 2) If the file has been modified in any way, a notice of such * modification is conspicuously indicated. * * PostScript, Display PostScript, and Adobe are registered trademarks of * Adobe Systems Incorporated. * * ************************************************************************ * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. * ************************************************************************ */ /* parseAFM.c * * This file is used in conjuction with the parseAFM.h header file. * This file contains several procedures that are used to parse AFM * files. It is intended to work with an application program that needs * font metric information. The program can be used as is by making a * procedure call to "parseFile" (passing in the expected parameters) * and having it fill in a data structure with the data from the * AFM file, or an application developer may wish to customize this * code. * * There is also a file, parseAFMclient.c, that is a sample application * showing how to call the "parseFile" procedure and how to use the data * after "parseFile" has returned. * * Please read the comments in parseAFM.h and parseAFMclient.c. * * History: * original: DSM Thu Oct 20 17:39:59 PDT 1988 * modified: DSM Mon Jul 3 14:17:50 PDT 1989 * - added 'storageProblem' return code * - fixed bug of not allocating extra byte for string duplication * - fixed typos * modified: DSM Tue Apr 3 11:18:34 PDT 1990 * - added free(ident) at end of parseFile routine * modified: DSM Tue Jun 19 10:16:29 PDT 1990 * - changed (width == 250) to (width = 250) in initializeArray */ #include #include #include #include /* this seems to be necessary on some SCO-systems */ #if !defined(_MSC_VER) # include #endif #include #include #include "parseAFM.h" #include "t1base.h" #include "t1misc.h" #define lineterm EOL /* line terminating character */ #define normalEOF 1 /* return code from parsing routines used only */ /* in this module */ #define Space "space" /* used in string comparison to look for the width */ /* of the space character to init the widths array */ #define False "false" /* used in string comparison to check the value of */ /* boolean keys (e.g. IsFixedPitch) */ #define MATCH(A,B) (strncmp((A),(B), MAX_NAME) == 0) /* Note: The functions token and linetoken are extended to be able to parse AFM files with DOS-style line-ends under UNIX. I don't know why AFM files which according to Adobe are explicitly intended to be used under UNIX have MSDOS-style line ends. However, we parse the tokens based on the following atoms. This should work on any system. */ #define CR '\r' /* a carriage return */ #define LF '\n' /* a linefeed, which is a newline under UNIX */ #define CTRL_Z 0x1A /* some AFM files have this characters as an end of file indicator. Who know why :) ? */ /*************************** GLOBALS ***********************/ static char *ident = NULL; /* storage buffer for keywords */ /* "shorts" for fast case statement * The values of each of these enumerated items correspond to an entry in the * table of strings defined below. Therefore, if you add a new string as * new keyword into the keyStrings table, you must also add a corresponding * parseKey AND it MUST be in the same position! * * IMPORTANT: since the sorting algorithm is a binary search, the strings of * keywords must be placed in lexicographical order, below. [Therefore, the * enumerated items are not necessarily in lexicographical order, depending * on the name chosen. BUT, they must be placed in the same position as the * corresponding key string.] The NOPE shall remain in the last position, * since it does not correspond to any key string, and it is used in the * "recognize" procedure to calculate how many possible keys there are. */ typedef enum { ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, CHARACTERSET, COMMENT, DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES, ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN, FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME, ISFIXEDPITCH, ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME, NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES, STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS, STARTTRACKKERN, STDHW, STDVW, TRACKKERN, UNDERLINEPOSITION, UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT, NOPE} PARSEKEY; /* keywords for the system: * This a table of all of the current strings that are vaild AFM keys. * Each entry can be referenced by the appropriate parseKey value (an * enumerated data type defined above). If you add a new keyword here, * a corresponding parseKey MUST be added to the enumerated data type * defined above, AND it MUST be added in the same position as the * string is in this table. * * IMPORTANT: since the sorting algorithm is a binary search, the keywords * must be placed in lexicographical order. And, NULL should remain at the * end. */ static char *keyStrings[] = { "Ascender", "B", "C", "CC", "CapHeight", "CharacterSet", "Comment", "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites", "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern", "FamilyName", "FontBBox", "FontName", "FullName", "IsFixedPitch", "ItalicAngle", "KP", "KPX", "L", "N", "Notice", "PCC", "StartCharMetrics", "StartComposites", "StartFontMetrics", "StartKernData", "StartKernPairs", "StartTrackKern", "StdHW", "StdVW", "TrackKern", "UnderlinePosition", "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight", NULL }; /*************************** PARSING ROUTINES **************/ /*************************** token *************************/ /* A "AFM File Conventions" tokenizer. That means that it will * return the next token delimited by white space. See also * the `linetoken' routine, which does a similar thing but * reads all tokens until the next end-of-line. */ static char *token(stream) FILE *stream; { int ch, idx; /* skip over white space, instead of the systems EOL-character we check explicitly for CR and LF as well as for ^Z. */ while ((ch = fgetc(stream)) == ' ' || ch == CR || ch == LF || ch == CTRL_Z || ch == ',' || ch == '\t' || ch == ';'); idx = 0; while (ch != EOF && ch != ' ' && ch != CR && ch != LF && ch != CTRL_Z && ch != '\t' && ch != ':' && ch != ';'){ ident[idx++] = ch; ch = fgetc(stream); } /* while */ if (ch == EOF && idx < 1) { return ((char *)NULL); } if (idx >= 1 && ch != ':' ) { ungetc(ch, stream); } if (idx < 1 ) { ident[idx++] = ch; /* single-character token */ } ident[idx] = 0; return(ident); /* returns pointer to the token */ } /* token */ /*************************** linetoken *************************/ /* "linetoken" will get read all tokens until the EOL character from * the given stream. This is used to get any arguments that can be * more than one word (like Comment lines and FullName). */ static char *linetoken(stream) FILE *stream; { int ch, idx; while ((ch = fgetc(stream)) == ' ' || ch == '\t' ); idx = 0; while (ch != EOF && ch != CR && ch != LF && ch != CTRL_Z) { ident[idx++] = ch; ch = fgetc(stream); } /* while */ ungetc(ch, stream); ident[idx] = 0; return(ident); /* returns pointer to the token */ } /* linetoken */ /*************************** recognize *************************/ /* This function tries to match a string to a known list of * valid AFM entries (check the keyStrings array above). * "ident" contains everything from white space through the * next space, tab, or ":" character. * * The algorithm is a standard Knuth binary search. */ static PARSEKEY recognize(ident) register char *ident; { int lower = 0, upper = (int) NOPE, midpoint=NOPE, cmpvalue; BOOL found = T1LIB_FALSE; while ((upper >= lower) && !found) { midpoint = (lower + upper)/2; if (keyStrings[midpoint] == NULL) break; cmpvalue = strncmp(ident, keyStrings[midpoint], MAX_NAME); if (cmpvalue == 0) found = T1LIB_TRUE; else if (cmpvalue < 0) upper = midpoint - 1; else lower = midpoint + 1; } /* while */ if (found) return (PARSEKEY) midpoint; else return NOPE; } /* recognize */ /************************* parseGlobals *****************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "StartCharMetrics" keyword, which essentially marks the * end of the Global Font Information and the beginning of the character * metrics information. * * If the caller of "parseFile" specified that it wanted the Global * Font Information (as defined by the "AFM File Specification" * document), then that information will be stored in the returned * data structure. * * Any Global Font Information entries that are not found in a * given file, will have the usual default initialization value * for its type (i.e. entries of type int will be 0, etc). * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static BOOL parseGlobals(fp, gfi) FILE *fp; register GlobalFontInfo *gfi; { BOOL cont = T1LIB_TRUE, save = (gfi != NULL); int error = ok; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Global Font info section */ /* without saving any of the data */ switch (recognize(keyword)) { case STARTCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire global font info section, */ /* saving the data */ switch(recognize(keyword)) { case STARTFONTMETRICS: keyword = token(fp); gfi->afmVersion = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->afmVersion, keyword); break; case COMMENT: /* We ignore the following keywords. They are only listed here in order to prevent from "Unknown Keyword" errors. */ case CHARACTERSET: case STDHW: case STDVW: keyword = linetoken(fp); break; case FONTNAME: keyword = linetoken(fp); gfi->fontName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->fontName, keyword); break; case ENCODINGSCHEME: keyword = linetoken(fp); gfi->encodingScheme = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->encodingScheme, keyword); break; case FULLNAME: keyword = linetoken(fp); gfi->fullName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->fullName, keyword); break; case FAMILYNAME: keyword = linetoken(fp); gfi->familyName = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->familyName, keyword); break; case WEIGHT: keyword = linetoken(fp); gfi->weight = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->weight, keyword); break; case ITALICANGLE: keyword = token(fp); gfi->italicAngle = atof(keyword); if (errno == ERANGE) error = parseError; break; case ISFIXEDPITCH: keyword = token(fp); if (MATCH(keyword, False)) gfi->isFixedPitch = 0; else gfi->isFixedPitch = 1; break; case UNDERLINEPOSITION: keyword = token(fp); gfi->underlinePosition = atoi(keyword); break; case UNDERLINETHICKNESS: keyword = token(fp); gfi->underlineThickness = atoi(keyword); break; case VERSION: keyword = linetoken(fp); gfi->version = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->version, keyword); break; case NOTICE: keyword = linetoken(fp); gfi->notice = (char *) malloc(strlen(keyword) + 1); strcpy(gfi->notice, keyword); break; case FONTBBOX: keyword = token(fp); gfi->fontBBox.llx = atoi(keyword); keyword = token(fp); gfi->fontBBox.lly = atoi(keyword); keyword = token(fp); gfi->fontBBox.urx = atoi(keyword); keyword = token(fp); gfi->fontBBox.ury = atoi(keyword); break; case CAPHEIGHT: keyword = token(fp); gfi->capHeight = atoi(keyword); break; case XHEIGHT: keyword = token(fp); gfi->xHeight = atoi(keyword); break; case DESCENDER: keyword = token(fp); gfi->descender = atoi(keyword); break; case ASCENDER: keyword = token(fp); gfi->ascender = atoi(keyword); break; case STARTCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; T1_PrintLog( "parseGlobals()", "Unknown Keyword: %s", T1LOG_WARNING, keyword); break; } /* switch */ } /* while */ return(error); } /* parseGlobals */ /************************* initializeArray ************************/ /* Unmapped character codes are (at Adobe Systems) assigned the * width of the space character (if one exists) else they get the * value of 250 ems. This function initializes all entries in the * char widths array to have this value. Then any mapped character * codes will be replaced with the width of the appropriate character * when parsing the character metric section. * This function parses the Character Metrics Section looking * for a space character (by comparing character names). If found, * the width of the space character will be used to initialize the * values in the array of character widths. * * Before returning, the position of the read/write pointer of the * file is reset to be where it was upon entering this function. */ /* We comment out the following function since it is not needed in t1lib and we don't want compiler warnings */ /* static int initializeArray(fp, cwi) FILE *fp; register int *cwi; { BOOL cont = T1LIB_TRUE, found = T1LIB_FALSE; long opos = ftell(fp); int code = 0, width = 0, i = 0, error = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; } switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: code = atoi(token(fp)); break; case XWIDTH: width = atoi(token(fp)); break; case CHARNAME: keyword = token(fp); if (MATCH(keyword, Space)) { cont = T1LIB_FALSE; found = T1LIB_TRUE; } break; case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } } if (!found) width = 250; for (i = 0; i < 256; ++i) cwi[i] = width; fseek(fp, opos, 0); return(error); } */ /************************* parseCharWidths **************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndCharMetrics" keyword. It will save the character * width info (as opposed to all of the character metric information) * if requested by the caller of parseFile. Otherwise, it will just * parse through the section without saving any information. * * If data is to be saved, parseCharWidths is passed in a pointer * to an array of widths that has already been initialized by the * standard value for unmapped character codes. This function parses * the Character Metrics section only storing the width information * for the encoded characters into the array using the character code * as the index into that array. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCharWidths(fp, cwi) FILE *fp; register int *cwi; { BOOL cont = T1LIB_TRUE, save = (cwi != NULL); int pos = 0, error = ok; register char *keyword; while (cont) { keyword = token(fp); /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Char Metrics section without */ /* saving any of the data*/ switch (recognize(keyword)) { case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire char metrics section, saving */ /* only the char x-width info */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: keyword = token(fp); pos = atoi(keyword); break; case XYWIDTH: /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */ keyword = token(fp); keyword = token(fp); /* eat values */ error = parseError; break; case XWIDTH: keyword = token(fp); if (pos >= 0) /* ignore unmapped chars */ cwi[pos] = atoi(keyword); break; case ENDCHARMETRICS: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case CHARNAME: /* eat values (so doesn't cause parseError) */ keyword = token(fp); break; case CHARBBOX: keyword = token(fp); keyword = token(fp); keyword = token(fp); keyword = token(fp); break; case LIGATURE: keyword = token(fp); keyword = token(fp); break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ return(error); } /* parseCharWidths */ /************************* parseCharMetrics ************************/ /* This function is called by parseFile if the caller of parseFile * requested that all character metric information be saved * (as opposed to only the character width information). * * parseCharMetrics is passed in a pointer to an array of records * to hold information on a per character basis. This function * parses the Character Metrics section storing all character * metric information for the ALL characters (mapped and unmapped) * into the array. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCharMetrics(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, firstTime = T1LIB_TRUE; int error = ok, count = 0; register CharMetricInfo *temp = fi->cmi; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case CODE: if (count < fi->numOfChars) { if (firstTime) firstTime = T1LIB_FALSE; else temp++; temp->code = atoi(token(fp)); count++; } else { error = parseError; cont = T1LIB_FALSE; } break; case XYWIDTH: temp->wx = atoi(token(fp)); temp->wy = atoi(token(fp)); break; case XWIDTH: temp->wx = atoi(token(fp)); break; case CHARNAME: keyword = token(fp); temp->name = (char *) malloc(strlen(keyword) + 1); strcpy(temp->name, keyword); break; case CHARBBOX: temp->charBBox.llx = atoi(token(fp)); temp->charBBox.lly = atoi(token(fp)); temp->charBBox.urx = atoi(token(fp)); temp->charBBox.ury = atoi(token(fp)); break; case LIGATURE: { Ligature **tail = &(temp->ligs); Ligature *node = *tail; if (*tail != NULL) { while (node->next != NULL) node = node->next; tail = &(node->next); } *tail = (Ligature *) calloc(1, sizeof(Ligature)); keyword = token(fp); (*tail)->succ = (char *) malloc(strlen(keyword) + 1); strcpy((*tail)->succ, keyword); keyword = token(fp); (*tail)->lig = (char *) malloc(strlen(keyword) + 1); strcpy((*tail)->lig, keyword); break; } case ENDCHARMETRICS: cont = T1LIB_FALSE;; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if ((error == ok) && (count != fi->numOfChars)) error = parseError; return(error); } /* parseCharMetrics */ /************************* parseTrackKernData ***********************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndTrackKern" or "EndKernData" keywords. It will save the * track kerning data if requested by the caller of parseFile. * * parseTrackKernData is passed in a pointer to the FontInfo record. * If data is to be saved, the FontInfo record will already contain * a valid pointer to storage for the track kerning data. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseTrackKernData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, save = (fi->tkd != NULL); int pos = 0, error = ok, tcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Track Kerning Data */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDTRACKKERN: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Track Kerning Data section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case TRACKKERN: if (tcount < fi->numOfTracks) { keyword = token(fp); fi->tkd[pos].degree = atoi(keyword); keyword = token(fp); fi->tkd[pos].minPtSize = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos].minKernAmt = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos].maxPtSize = atof(keyword); if (errno == ERANGE) error = parseError; keyword = token(fp); fi->tkd[pos++].maxKernAmt = atof(keyword); if (errno == ERANGE) error = parseError; tcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case ENDTRACKKERN: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && tcount != fi->numOfTracks) error = parseError; return(error); } /* parseTrackKernData */ /************************* parsePairKernData ************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndKernPairs" or "EndKernData" keywords. It will save * the pair kerning data if requested by the caller of parseFile. * * parsePairKernData is passed in a pointer to the FontInfo record. * If data is to be saved, the FontInfo record will already contain * a valid pointer to storage for the pair kerning data. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parsePairKernData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, save = (fi->pkd != NULL); int pos = 0, error = ok, pcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) { error = earlyEOF; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Pair Kerning Data */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDKERNPAIRS: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Pair Kerning Data section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case KERNPAIR: if (pcount < fi->numOfPairs) { keyword = token(fp); fi->pkd[pos].name1 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name1, keyword); keyword = token(fp); fi->pkd[pos].name2 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name2, keyword); keyword = token(fp); fi->pkd[pos].xamt = atoi(keyword); keyword = token(fp); fi->pkd[pos++].yamt = atoi(keyword); pcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case KERNPAIRXAMT: if (pcount < fi->numOfPairs) { keyword = token(fp); fi->pkd[pos].name1 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name1, keyword); keyword = token(fp); fi->pkd[pos].name2 = (char *) malloc(strlen(keyword) + 1); strcpy(fi->pkd[pos].name2, keyword); keyword = token(fp); fi->pkd[pos++].xamt = atoi(keyword); pcount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case ENDKERNPAIRS: case ENDKERNDATA: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && pcount != fi->numOfPairs) error = parseError; return(error); } /* parsePairKernData */ /************************* parseCompCharData **************************/ /* This function is called by "parseFile". It will parse the AFM File * up to the "EndComposites" keyword. It will save the composite * character data if requested by the caller of parseFile. * * parseCompCharData is passed in a pointer to the FontInfo record, and * a boolean representing if the data should be saved. * * This function will create the appropriate amount of storage for * the composite character data and store a pointer to the storage * in the FontInfo record. * * This function returns an error code specifying whether there was * a premature EOF or a parsing error. This return value is used by * parseFile to determine if there is more file to parse. */ static int parseCompCharData(fp, fi) FILE *fp; register FontInfo *fi; { BOOL cont = T1LIB_TRUE, firstTime = T1LIB_TRUE, save = (fi->ccd != NULL); int pos = 0, j = 0, error = ok, ccount = 0, pcount = 0; register char *keyword; while (cont) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { error = earlyEOF; break; /* get out of loop */ } if (ccount > fi->numOfComps) { error = parseError; break; /* get out of loop */ } if (!save) /* get tokens until the end of the Composite Character info */ /* section without saving any of the data */ switch(recognize(keyword)) { case ENDCOMPOSITES: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; default: break; } /* switch */ else /* otherwise parse entire Composite Character info section, */ /* saving the data */ switch(recognize(keyword)) { case COMMENT: keyword = linetoken(fp); break; case COMPCHAR: if (ccount < fi->numOfComps) { keyword = token(fp); if (pcount != fi->ccd[pos].numOfPieces) error = parseError; pcount = 0; if (firstTime) firstTime = T1LIB_FALSE; else pos++; fi->ccd[pos].ccName = (char *) malloc(strlen(keyword) + 1); strcpy(fi->ccd[pos].ccName, keyword); keyword = token(fp); fi->ccd[pos].numOfPieces = atoi(keyword); fi->ccd[pos].pieces = (Pcc *) calloc(fi->ccd[pos].numOfPieces, sizeof(Pcc)); j = 0; ccount++; } else { error = parseError; cont = T1LIB_FALSE; } break; case COMPCHARPIECE: if (pcount < fi->ccd[pos].numOfPieces) { keyword = token(fp); fi->ccd[pos].pieces[j].pccName = (char *) malloc(strlen(keyword) + 1); strcpy(fi->ccd[pos].pieces[j].pccName, keyword); keyword = token(fp); fi->ccd[pos].pieces[j].deltax = atoi(keyword); keyword = token(fp); fi->ccd[pos].pieces[j++].deltay = atoi(keyword); pcount++; } else error = parseError; break; case ENDCOMPOSITES: cont = T1LIB_FALSE; break; case ENDFONTMETRICS: cont = T1LIB_FALSE; error = normalEOF; break; case NOPE: default: error = parseError; break; } /* switch */ } /* while */ if (error == ok && ccount != fi->numOfComps) error = parseError; return(error); } /* parseCompCharData */ /*************************** 'PUBLIC' FUNCTION ********************/ /*************************** parseFile *****************************/ /* parseFile is the only 'public' procedure available. It is called * from an application wishing to get information from an AFM file. * The caller of this function is responsible for locating and opening * an AFM file and handling all errors associated with that task. * * parseFile expects 3 parameters: a vaild file pointer, a pointer * to a (FontInfo *) variable (for which storage will be allocated and * the data requested filled in), and a mask specifying which * data from the AFM File should be saved in the FontInfo structure. * * The file will be parsed and the requested data will be stored in * a record of type FontInfo (refer to ParseAFM.h). * * parseFile returns an error code as defined in parseAFM.h. * * The position of the read/write pointer associated with the file * pointer upon return of this function is undefined. */ /* Note: function renamed to T1lib_parseFile in order to avoid name clushes with other libraries that also use the Adobe parseAFM-package (RMz) */ int T1lib_parseFile (fp, fi, flags) FILE *fp; FontInfo **fi; FLAGS flags; { int code = ok; /* return code from each of the parsing routines */ int error = ok; /* used as the return code from this function */ register char *keyword; /* used to store a token */ /* storage data for the global variable ident */ ident = (char *) calloc(MAX_NAME, sizeof(char)); if (ident == NULL) {error = storageProblem; return(error);} (*fi) = (FontInfo *) calloc(1, sizeof(FontInfo)); if ((*fi) == NULL) {error = storageProblem; return(error);} if (flags & P_G) { (*fi)->gfi = (GlobalFontInfo *) calloc(1, sizeof(GlobalFontInfo)); if ((*fi)->gfi == NULL) {error = storageProblem; return(error);} } /* The AFM File begins with Global Font Information. This section */ /* will be parsed whether or not information should be saved. */ code = parseGlobals(fp, (*fi)->gfi); if (code < 0) error = code; /* The Global Font Information is followed by the Character Metrics */ /* section. Which procedure is used to parse this section depends on */ /* how much information should be saved. If all of the metrics info */ /* is wanted, parseCharMetrics is called. If only the character widths */ /* is wanted, parseCharWidths is called. parseCharWidths will also */ /* be called in the case that no character data is to be saved, just */ /* to parse through the section. */ if ((code != normalEOF) && (code != earlyEOF)) { (*fi)->numOfChars = atoi(token(fp)); if (flags & (P_M ^ P_W)) { (*fi)->cmi = (CharMetricInfo *) calloc((*fi)->numOfChars, sizeof(CharMetricInfo)); if ((*fi)->cmi == NULL) {error = storageProblem; return(error);} code = parseCharMetrics(fp, *fi); } else { if (flags & P_W) { (*fi)->cwi = (int *) calloc(256, sizeof(int)); if ((*fi)->cwi == NULL) { error = storageProblem; return(error); } } /* parse section regardless */ code = parseCharWidths(fp, (*fi)->cwi); } /* else */ } /* if */ if ((error != earlyEOF) && (code < 0)) error = code; /* The remaining sections of the AFM are optional. This code will */ /* look at the next keyword in the file to determine what section */ /* is next, and then allocate the appropriate amount of storage */ /* for the data (if the data is to be saved) and call the */ /* appropriate parsing routine to parse the section. */ while ((code != normalEOF) && (code != earlyEOF)) { keyword = token(fp); if (keyword == NULL) /* Have reached an early and unexpected EOF. */ /* Set flag and stop parsing */ { code = earlyEOF; break; /* get out of loop */ } switch(recognize(keyword)) { /* this case has been added for t1lib because otherwise comment line between (i.e., outside) the main sections would lead to parse errors. The Adobe spec does not seem to forbid comments at such locations (2001-05-14, RMz) */ case COMMENT: keyword = linetoken(fp); break; case STARTKERNDATA: break; case ENDKERNDATA: break; case STARTTRACKKERN: keyword = token(fp); if (flags & P_T) { (*fi)->numOfTracks = atoi(keyword); (*fi)->tkd = (TrackKernData *) calloc((*fi)->numOfTracks, sizeof(TrackKernData)); if ((*fi)->tkd == NULL) { error = storageProblem; return(error); } } /* if */ code = parseTrackKernData(fp, *fi); break; case STARTKERNPAIRS: keyword = token(fp); if (flags & P_P) { (*fi)->numOfPairs = atoi(keyword); (*fi)->pkd = (PairKernData *) calloc((*fi)->numOfPairs, sizeof(PairKernData)); if ((*fi)->pkd == NULL) { error = storageProblem; return(error); } } /* if */ code = parsePairKernData(fp, *fi); break; case STARTCOMPOSITES: keyword = token(fp); if (flags & P_C) { (*fi)->numOfComps = atoi(keyword); (*fi)->ccd = (CompCharData *) calloc((*fi)->numOfComps, sizeof(CompCharData)); if ((*fi)->ccd == NULL) { error = storageProblem; return(error); } } /* if */ code = parseCompCharData(fp, *fi); break; case ENDFONTMETRICS: code = normalEOF; break; case NOPE: default: code = parseError; break; } /* switch */ if ((error != earlyEOF) && (code < 0)) error = code; } /* while */ if ((error != earlyEOF) && (code < 0)) error = code; if (ident != NULL) { free(ident); ident = NULL; } return(error); } /* parseFile */ grace-5.1.23/T1lib/t1lib/t1subset.h0000644000076500001440000000536107415144743016357 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1subset.h ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains declarations and definitions for t1subset.c. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #ifdef T1SUBSET_C #define T1_SUBSET_DEFAULT 0x00 #define T1_SUBSET_FORCE_REENCODE 0x01 #define T1_SUBSET_SKIP_REENCODE 0x02 #define T1_SUBSET_ENCRYPT_BINARY 0x04 /* This is only for debugging, it does not produce valid font-files! */ #define T1_SUBSET_ENCRYPT_NONE 0x08 /* Functions used from the t1io-module, partially written and added for font-subsetting. We don't care about the special F_FILE-type defined in that module because all accesses are done via pointers. */ extern unsigned long T1GetFileSize( FILE *f); extern FILE *T1Open( char *fn, char *mode); extern int T1Gets(char *string, int size, FILE *f); extern int T1GetDecrypt( void); extern int T1GetTrailer(char *string, int size, FILE *f); extern int T1Close( FILE *f); extern void T1io_reset( void); char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); char *T1_GetCharString( int FontID, char *charname, int *len); int T1_GetlenIV( int FontID); #define ZEROS 512 #else extern char *T1_SubsetFont( int FontID, char *mask, unsigned int flags, int linewidth, unsigned long maxblocksize, unsigned long *bufsize); extern char *T1_GetCharString( int FontID, char *charname, int *len); extern int T1_GetlenIV( int FontID); #endif grace-5.1.23/T1lib/t1lib/t1env.c0000644000076500001440000006777507521323634015652 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1env.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-11-12 ----- Description: This file is part of the t1-library. It implements the reading of a configuration file and path-searching of type1-, afm- and encoding files. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independ from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1ENV_C #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/fontmisc.h" #include "sysconf.h" #include "t1types.h" #include "t1extern.h" #include "t1env.h" #include "t1misc.h" #include "t1base.h" /* The following static variables are used to store information on the distinct file search paths: -1 t1lib has not yet been initialized! 0 t1lib has been initialized and default paths have been setup n (>0) there are n path elements for current search path type, either built from a FontDataBase file or from explicit fucntion calls. */ static int pfab_no=-1; static int afm_no=-1; static int enc_no=-1; static int fdb_no=-1; static char path_sep_char='\0'; static char path_sep_string[2]; static char pathbuf[2048]; /* Define some default search paths */ #ifndef VMS static char T1_pfab[]="."; static char T1_afm[]="."; static char T1_enc[]="."; #else static char T1_pfab[]="sys$disk:[]"; static char T1_afm[]="sys$disk:[]"; static char T1_enc[]="sys$disk:[]"; #endif char T1_fdb[]="FontDataBase"; /* keywords recognized in config file */ static const char enc_key[]="ENCODING"; static const char pfab_key[]="TYPE1"; static const char afm_key[]="AFM"; static const char fdb_key[]="FONTDATABASE"; /* qstrncpy(): Copy bytes from srcP to to destP. srcP is count bytes long and destP is the number of quoted characters shorter. That is, count refers to the number of characters including the escapement chars in srcP! */ static void qstrncpy( char *destP, const char *srcP, long nochars) { long i; long j; i=0; /* dest-index */ j=0; /* src-index */ while (j omit escape char. */ } } else { /* normal character */ destP[i++]=srcP[j++]; } } } /* Setup the default paths for searching the distinct file types. If paths have been setup explicitly, skip the step of setting up a default path. */ void intT1_SetupDefaultSearchPaths( void) { path_sep_char=PATH_SEP_CHAR; sprintf( path_sep_string, "%c", path_sep_char); /* We set the number of stored path elements 0 so that we can distiguish between explicitly setup paths and default paths in intT1_ScanConfigFile(). */ if (pfab_no==-1) { T1_PFAB_ptr=(char**) calloc( 2, sizeof(char*)); T1_PFAB_ptr[0]=(char*)malloc(strlen(T1_pfab)+1); strcpy(T1_PFAB_ptr[0],T1_pfab); pfab_no=0; } if (afm_no==-1) { T1_AFM_ptr=(char**) calloc( 2, sizeof(char*)); T1_AFM_ptr[0]=(char*)malloc(strlen(T1_afm)+1); strcpy(T1_AFM_ptr[0],T1_afm); afm_no=0; } if (enc_no==-1) { T1_ENC_ptr=(char**) calloc( 2, sizeof(char*)); T1_ENC_ptr[0]=(char*)malloc(strlen(T1_enc)+1); strcpy(T1_ENC_ptr[0],T1_enc); enc_no=0; } if (fdb_no==-1) { T1_FDB_ptr=(char**) calloc( 2, sizeof(char*)); T1_FDB_ptr[0]=(char*)malloc(strlen(T1_fdb)+1); strcpy(T1_FDB_ptr[0],T1_fdb); fdb_no=0; } } /* This function is called from T1_CloseLib(). We have to indicate the state of a non-initialzed t1lib! */ void intT1_FreeSearchPaths( void) { int i; i=0; if (T1_PFAB_ptr!=NULL) { while (T1_PFAB_ptr[i]!=NULL) { free(T1_PFAB_ptr[i]); T1_PFAB_ptr[i]=NULL; } free( T1_PFAB_ptr); } i=0; if (T1_AFM_ptr!=NULL) { while (T1_AFM_ptr[i]!=NULL) { free(T1_AFM_ptr[i]); T1_AFM_ptr[i]=NULL; } free( T1_AFM_ptr); } i=0; if (T1_ENC_ptr!=NULL) { while (T1_ENC_ptr[i]!=NULL) { free(T1_ENC_ptr[i]); T1_ENC_ptr[i]=NULL; } free( T1_ENC_ptr); } i=0; if (T1_FDB_ptr!=NULL) { while (T1_FDB_ptr[i]!=NULL) { free(T1_FDB_ptr[i]); T1_FDB_ptr[i]=NULL; } free( T1_FDB_ptr); } /* indicate t1lib non-initialized */ pfab_no=-1; afm_no=-1; enc_no=-1; fdb_no=-1; return; } /* ScanConfigFile(): Read a configuration file and scan and save the environment strings used for searching pfa/pfb-, afm- and encoding files as well as the name of the font database file. */ int intT1_ScanConfigFile( void) { char *env_str; char *linebuf; char *usershome; char *cnffilepath; char *globalcnffilepath; static int linecnt; char local_path_sep_char; int quoted=0; int quotecnt=0; FILE *cfg_fp; int filesize, i, j, k; int ignoreline=0; char*** destP=NULL; int *idestP=NULL; char* curr_key=NULL; /* First, get the string stored in the environment variable: */ env_str=getenv(ENV_CONF_STRING); linecnt=1; if (env_str==NULL) { /* environment variable not set, try to open default file in user's home directory and afterwards global config file */ if ((usershome=getenv("HOME"))!=NULL) { cnffilepath=(char *)malloc((strlen(usershome) + strlen(T1_CONFIGFILENAME) + 2 ) * sizeof(char)); if (cnffilepath==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( cnffilepath, usershome); } else { cnffilepath=(char *)malloc((strlen(T1_CONFIGFILENAME) + 2 ) * sizeof(char)); } strcat( cnffilepath, DIRECTORY_SEP); strcat( cnffilepath, T1_CONFIGFILENAME); globalcnffilepath=(char*)malloc((strlen(GLOBAL_CONFIG_DIR) + strlen(GLOBAL_CONFIG_FILE) + 2 ) * sizeof(char)); if (globalcnffilepath==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( globalcnffilepath, GLOBAL_CONFIG_DIR); strcat( globalcnffilepath, DIRECTORY_SEP); strcat( globalcnffilepath, GLOBAL_CONFIG_FILE); if ((cfg_fp=fopen( cnffilepath, "rb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open configfile %s", cnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); /* Try global config file */ if ((cfg_fp=fopen( globalcnffilepath, "rb"))==NULL){ sprintf( err_warn_msg_buf, "Could not open global configfile %s", globalcnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_WARNING); } else{ sprintf( err_warn_msg_buf, "Using %s as Configfile (global)", cnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } } else{ sprintf( err_warn_msg_buf, "Using %s as Configfile (user's)", cnffilepath); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } free( cnffilepath); free( globalcnffilepath); if (cfg_fp==NULL){ T1_PrintLog( "ScanConfigFile()", "Neither user's nor global Configfile has been found", T1LOG_WARNING); return(0); } } else { /* open specified file for reading the configuration */ if ((cfg_fp=fopen(env_str,"rb"))==NULL){ T1_PrintLog( "ScanConfigFile()", "Configfile as specified by Environment has not been found", T1LOG_WARNING); return(0); /* specified file could not be openend => no config paths read */ } else { sprintf( err_warn_msg_buf, "Using %s as Configfile (environment)", env_str); T1_PrintLog( "ScanConfigFile()", err_warn_msg_buf, T1LOG_STATISTIC); } } /* cfg_fp points now to a valid config file */ /* Get the file size */ fseek( cfg_fp, 0, SEEK_END); filesize=ftell(cfg_fp); /* Reset fileposition to start */ fseek( cfg_fp, 0, SEEK_SET); if ((linebuf=(char *)calloc( filesize+1, sizeof(char)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(-1); } fread((char *)linebuf, sizeof(char), filesize, cfg_fp); fclose(cfg_fp); i=0; /* this might be overwritten on a per file basis */ local_path_sep_char=path_sep_char; while(i end of path specification */ else quotecnt++; } /* some other char */ if (linebuf[i]=='\n') { /* a newline in a quoted string? Perhabs, quotes do not match! */ T1_PrintLog( "ScanConfigFile()", "Newline in quoted %s-string in line %d, column %d, of config file! Closing quote missing?", T1LOG_WARNING, curr_key, linecnt, i-j+1); j=i+1; /* resynchronize linecount */ linecnt++; } if (i1) && (FileName[0]=='.') && (FileName[1]==DIRECTORY_SEP_CHAR)) || ((fnamelen>2) && (FileName[0]=='.') && (FileName[1]=='.') && (FileName[2]==DIRECTORY_SEP_CHAR)) #if defined(MSDOS) | defined(_WIN32) | defined (__EMX__) || ((isalpha(FileName[0])) && (FileName[1]==':')) #endif #ifdef VMS || (strchr(FileName,':') != NULL) #endif ) { /* Check for existence of the path: */ if (!stat( FileName, &filestats)) { if (t1lib_log_file!=NULL) { sprintf( err_warn_msg_buf, "stat()'ing complete path %s successful", FileName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* Return a copy of the string */ if ((FullPathName=(char *)malloc( fnamelen + 1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } strcpy( FullPathName, FileName); return(FullPathName); } if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing complete path %s failed", FileName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* Trying to locate absolute path spec. failed. We try to recover by removing the path component and searching in the remaining search path entries. This depends on the OS. */ i=fnamelen-1; StrippedName=&(FileName[i]); while ( FileName[i]!=DIRECTORY_SEP_CHAR #if defined(VMS) /* What exactly to do for VMS? */ #elif defined(MSDOS) | defined(_WIN32) | defined (__EMX__) | defined(_MSC_VER) /* We take a drive specification into account. This means we step back until the directory separator or a drive specifier appears! */ && FileName[i]!=':' #endif ) { i--; } i++; StrippedName=&FileName[i]; if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "path %s stripped to %s", FileName, StrippedName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } } else{ /* We have a relative path name */ StrippedName=&FileName[0]; } i=0; while (env_ptr[i]!=NULL) { /* Copy current path element: */ strcpy( pathbuf, env_ptr[i]); /* cut a trailing directory separator */ j=strlen(pathbuf); if (pathbuf[j-1]==DIRECTORY_SEP_CHAR) pathbuf[j--]='\0'; /* Add the directory separator: */ #ifdef VMS { char *p= strrchr(pathbuf, DIRECTORY_SEP_CHAR); if (p && *(p+1) == '\0') *p = '\0'; } #endif strcat( pathbuf, DIRECTORY_SEP); /* And finally the filename: */ strcat( pathbuf, StrippedName); /* Check for existence of the path: */ if (!stat( pathbuf, &filestats)) { if ((FullPathName=(char*)malloc( (j+fnamelen+2)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } strcpy( FullPathName, pathbuf); if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing %s successful", FullPathName); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } return(FullPathName); } if (t1lib_log_file!=NULL){ sprintf( err_warn_msg_buf, "stat()'ing %s failed", pathbuf); T1_PrintLog( "intT1_Env_GetCompletePath()", err_warn_msg_buf, T1LOG_DEBUG); } /* We didn't find the file --> try next path entry */ i++; } /* If we get here, no file was found at all, so return a NULL-pointer */ return(NULL); } /* T1_SetFileSearchPath(): Set the search path to find files of the specified type and return 0 if successful and -1 otherwise. An existing path is overwritten rigorously, unless the database already contains fonts. In the latter case the function returns with an error status. Multiple path types may be specified as a bitmask! */ int T1_SetFileSearchPath( int type, char *pathname) { int i; int pathlen; if (pathname==NULL){ T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* We do not allow to change the searchpath if the database already contains one or more entries. */ if (T1_Get_no_fonts()>0){ sprintf( err_warn_msg_buf, "Path %s not set, database is not empty", pathname); T1_PrintLog( "T1_SetFileSearchPath()", err_warn_msg_buf, T1LOG_STATISTIC); T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } pathlen=strlen(pathname)+1; /* Throw away a possibly existing path */ if (type & T1_PFAB_PATH){ if (pfab_no==-1) { T1_PFAB_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_PFAB_ptr[i]!=NULL) { free (T1_PFAB_ptr[i++]); } } if ((T1_PFAB_ptr=(char**)realloc( T1_PFAB_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_PFAB_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_PFAB_ptr[0], pathname); T1_PFAB_ptr[1]=NULL; pfab_no=1; } if (type & T1_AFM_PATH){ if (afm_no==-1) { T1_AFM_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_AFM_ptr[i]!=NULL) { free (T1_AFM_ptr[i++]); } } if ((T1_AFM_ptr=(char**)realloc( T1_AFM_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_AFM_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_AFM_ptr[0], pathname); T1_AFM_ptr[1]=NULL; afm_no=1; } if (type & T1_ENC_PATH){ if (enc_no==-1) { T1_ENC_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_ENC_ptr[i]!=NULL) { free (T1_ENC_ptr[i++]); } } if ((T1_ENC_ptr=(char**)realloc( T1_ENC_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } if ((T1_ENC_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( T1_ENC_ptr[0], pathname); T1_ENC_ptr[1]=NULL; enc_no=1; } return(0); } /* T1_GetFileSearchPath(): Return the specified file search path or NULL if an error occurred. Note: We do only one path at a time, so that if a bitmask is specified, the first match wins. The returned path is formatted using the actual PATH_SEP_CHAR. */ char *T1_GetFileSearchPath( int type) { static char *out_ptr; int i; int pathlen; char **src_ptr=NULL; if (out_ptr!=NULL) free( out_ptr); out_ptr=NULL; if (type & T1_PFAB_PATH) { src_ptr=T1_PFAB_ptr; } else if (type & T1_AFM_PATH) { src_ptr=T1_AFM_ptr; } else if (type & T1_ENC_PATH) { src_ptr=T1_ENC_ptr; } else if (type & T1_FDB_PATH) { src_ptr=T1_FDB_ptr; } i=0; pathlen=0; while (src_ptr[i]!=NULL) { pathlen +=strlen( src_ptr[i++]); pathlen+=1; /* path separator */ } if ((out_ptr=(char *)malloc(pathlen+1))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( NULL); } strcpy( out_ptr, src_ptr[0]); i=1; while (src_ptr[i]!=NULL) { strcat( out_ptr, path_sep_string); strcat( out_ptr, src_ptr[i++]); } return( out_ptr); } /* T1_AddToFileSearchPath(): Add the specified path element to the specified search path. If the existing path is the default path, it will not be replaced by the new path element. Since this function might be called before initialization, we have to be aware that even the default path could be missing. Multiple path types may be specified as a bitmask! Return value is 0 if successful and -1 otherwise */ int T1_AddToFileSearchPath( int pathtype, int mode, char *pathname) { int i; int pathlen; char* newpath; int nofonts; if (pathname==NULL) return(-1); nofonts=T1_Get_no_fonts(); pathlen=strlen(pathname); if (pathtype & T1_PFAB_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (pfab_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { pfab_no++; } else { free( T1_AFM_ptr[0]); } } if (pfab_no==-1) { /* not initialized! */ pfab_no=0; T1_PFAB_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_PFAB_ptr=(char**)realloc( T1_PFAB_ptr, (++pfab_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element: */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=pfab_no-2; while (i>=0) { T1_PFAB_ptr[i+1]=T1_PFAB_ptr[i]; i--; } T1_PFAB_ptr[0]=newpath; } else{ /* append */ T1_PFAB_ptr[pfab_no-1]=newpath; } T1_PFAB_ptr[pfab_no]=NULL; } if (pathtype & T1_AFM_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (afm_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { afm_no++; } else { free( T1_AFM_ptr[0]); } } if (afm_no==-1) { /* not initialized! */ afm_no=0; T1_AFM_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_AFM_ptr=(char**)realloc( T1_AFM_ptr, (++afm_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=afm_no-2; while (i>=0) { T1_AFM_ptr[i+1]=T1_AFM_ptr[i]; i--; } T1_AFM_ptr[0]=newpath; } else{ /* append */ T1_AFM_ptr[afm_no-1]=newpath; } T1_AFM_ptr[afm_no]=NULL; } if (pathtype & T1_ENC_PATH){ /* Allocate meory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for and handle the existing path configuration */ if (enc_no==0) { /* do not free the default path but establish it as a regularly setup path, if database not empty! */ if (nofonts>0) { enc_no++; } else { free( T1_ENC_ptr[0]); } } if (enc_no==-1) { /* not initialized! */ enc_no=0; T1_ENC_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_ENC_ptr=(char**)realloc( T1_ENC_ptr, (++enc_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new path element: */ if (mode & T1_PREPEND_PATH){ /* prepend */ i=enc_no-2; while (i>=0) { T1_ENC_ptr[i+1]=T1_ENC_ptr[i]; i--; } T1_ENC_ptr[0]=newpath; } else{ /* append */ T1_ENC_ptr[enc_no-1]=newpath; } T1_ENC_ptr[enc_no]=NULL; } return(0); } /* T1_SetFontDataBase(): Set a new name for the font database. It replaces the default name and any names specified previously with this function. Return value: 0 if OK, and -1 if filename not valid or an allocation error occurred */ int T1_SetFontDataBase( char *filename) { int pathlen; int i; int result=0; /* chekc filename */ if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return -1; } /* this function must be called before any font is in the database, that is, usually, before initialization! */ if ( pFontBase!=NULL && pFontBase->no_fonts>0) { T1_errno=T1ERR_OP_NOT_PERMITTED; return -1; } pathlen=strlen(filename)+1; /* Throw away a possibly existing font database-statement */ if (fdb_no==-1) { T1_FDB_ptr=NULL; /* realloc() will do a malloc() */ } else { /* throw away current paths */ i=0; while (T1_FDB_ptr[i]!=NULL) { free (T1_FDB_ptr[i++]); } } if ((T1_FDB_ptr=(char**)realloc( T1_FDB_ptr, 2*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } if ((T1_FDB_ptr[0]=(char*)malloc(pathlen*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return -1; } strcpy( T1_FDB_ptr[0], filename); T1_FDB_ptr[1]=NULL; fdb_no=1; /* Load database immediately if t1lib already is initailzed */ if (CheckForInit()==0) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[0]))==-1) { T1_PrintLog( "T1_AddFontDataBase()", "Fatal error scanning Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDB_ptr[0], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } return result; } /* T1_AddFontDataBase(): Add a new font database file to the list. If the lib is already initialzed, then the new database is immediately loaded. Otherwise it is simply appended to the list and loaded at the time of initialization. Returns: -1 an error occured 0 successfully inserted but not loaded because lib not initilized n>0 the highest defined FontID */ int T1_AddFontDataBase( int mode, char *filename) { int i; int pathlen; int result=0; char* newpath; if (filename==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } pathlen=strlen(filename); /* Allocate memory for string */ if ((newpath=(char*)malloc( (pathlen+1)*sizeof(char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } strcpy( newpath, filename); /* Check for and handle the existing path configuration */ if (fdb_no==0) { /* defauls setup, free the path */ free( T1_FDB_ptr[0]); } if (fdb_no==-1) { /* not initialized! */ fdb_no=0; T1_FDB_ptr=NULL; /* realloc() will do the malloc()! */ } if ((T1_FDB_ptr=(char**)realloc( T1_FDB_ptr, (++fdb_no+1)*sizeof(char*)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Insert the new database. If t1lib is already initialzed, the database can only be appended. Otherwise. prepending is also possible.*/ if ((mode & T1_PREPEND_PATH) && (CheckForInit()!=0) ) { /* prepend */ i=fdb_no-2; while (i>=0) { T1_FDB_ptr[i+1]=T1_FDB_ptr[i]; i--; } T1_FDB_ptr[0]=newpath; result=0; } else { /* append */ T1_FDB_ptr[fdb_no-1]=newpath; if (CheckForInit()==0) { if ((result=intT1_scanFontDBase(T1_FDB_ptr[fdb_no-1]))==-1) { T1_PrintLog( "T1_AddFontDataBase()", "Fatal error scanning Font Database File %s (T1_errno=%d)", T1LOG_WARNING, T1_FDB_ptr[fdb_no-1], T1_errno); } if (result>-1) pFontBase->no_fonts+=result; result=pFontBase->no_fonts; } } T1_FDB_ptr[fdb_no]=NULL; return result; } grace-5.1.23/T1lib/t1lib/t1load.c0000644000076500001440000011751007521323634015760 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1load.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-10-03 ----- Description: This file is part of the t1-library. It contains functions for loading fonts and for managing size dependent data. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1LOAD_C #define ANSI_REALLOC_VM #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/blues.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1load.h" #include "t1env.h" #include "t1set.h" #include "t1base.h" #include "t1finfo.h" #include "t1afmtool.h" extern psobj *StdEncArrayP; /* For checking of a fonts encoding */ extern char not_def[]; /* for checking the ".notdef"-string */ /* T1_LoadFont(FontID): Loads a Type1 font into memory and allocates all memory, necessary for this. */ int T1_LoadFont( int FontID) { int i, j, k, l, m; char *FileName, *FileNamePath; int mode; /* This is used by the type1-library for error reporting */ char *charname; /* The following vars are used for reallocation of VM */ long tmp_size; float ascender; #ifdef ANSI_REALLOC_VM unsigned long shift; unsigned long ldummy; char *tmp_ptr; #endif struct region *area; struct XYspace *S; /* These are for constructing the kerning lookup table: */ PairKernData *pkd; METRICS_ENTRY *kern_tbl; int char1, char2; if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } i=CheckForFontID(FontID); if (i==1) return(0); /* Font already loaded */ if (i==-1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); /* illegal FontID */ } /* Allocate memory for ps_font structure: */ if ((pFontBase->pFontArray[FontID].pType1Data=(psfont *)malloc(sizeof(psfont)))==NULL){ T1_PrintLog( "T1_LoadFont()", "Failed to allocate memory for psfont-struct (FontID=%d)", T1LOG_ERROR, FontID); T1_errno=T1ERR_ALLOC_MEM; return(-1); } /* Check for valid filename */ if ((FileName=T1_GetFontFileName(FontID))==NULL){ T1_PrintLog( "T1_LoadFont()", "No font file name for font %d", T1LOG_ERROR, FontID); return(-1); } /* Fetch the full path of type1 font file */ if ((FileNamePath=intT1_Env_GetCompletePath( FileName, T1_PFAB_ptr))==NULL){ T1_PrintLog( "T1_LoadFont()", "Couldn't locate font file for font %d in %s", T1LOG_ERROR, FontID, T1_GetFileSearchPath(T1_PFAB_PATH)); T1_errno=T1ERR_FILE_OPEN_ERR; return(-1); } /* And load all PostScript information into memory */ if (fontfcnA( FileNamePath, &mode, pFontBase->pFontArray[FontID].pType1Data) == FALSE){ T1_PrintLog( "T1_LoadFont()", "Loading font with ID = %d failed! (mode = %d)", T1LOG_ERROR, FontID, mode); free(FileNamePath); pFontBase->pFontArray[FontID].pType1Data=NULL; T1_errno=mode; return(-1); } free(FileNamePath); /* Store the base address of virtual memory and realloc in order not to waste too much memory: */ pFontBase->pFontArray[FontID].vm_base=vm_base; #ifdef ANSI_REALLOC_VM /* We first get the size of pointers on the current system */ /* Get size of VM, ... */ tmp_size=((unsigned long)vm_used - (unsigned long)vm_base); /* ... realloc to that size ... */ tmp_ptr=(char *)realloc(vm_base, tmp_size); /* ... and shift all pointers refering to that area */ if (tmp_ptr > vm_base){ shift= (unsigned long)tmp_ptr - (unsigned long)vm_base; sprintf( err_warn_msg_buf, "Old VM at 0x%lX, new VM at 0x%lX, shifting up by %lu", (unsigned long)vm_base, (unsigned long)tmp_ptr, tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); /* We start by shifting the topmost pointers: */ pFontBase->pFontArray[FontID].vm_base=tmp_ptr; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->vm_start); ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->vm_start=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP=(psdict *)ldummy; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->BluesP); ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP=(struct blues_struct *)ldummy; /* We now have to care for correcting all pointers which are in the VM and refer to some place in the VM! Note: Instead of selecting the appropriate pointer-elements of the union we simply shift the unspecified pointer "valueP". Note: The filename entry does not need to be modified since it does not need to be shifted since it points to memory managed by t1lib. */ /* FontInfo-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->fontInfoP[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; } /* The encoding needs special treatment: */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ENCODING){ /* If a builtin encoding is used, it is sufficient to shift the pointer to the Encoding since the character-namestrings of builtin encodings are static and thus located on the heap. For font-specific encoding, character-namestrings reside in VM and thus each entry has to be shifted. Caution: We still have to shift the builtin encoding-pointer, since they also point to are located in VM: */ ldummy=(long)StdEncArrayP; ldummy +=shift; StdEncArrayP=(psobj *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP == StdEncArrayP){ /* Font uses builtin standard encoding */ ; } else{ /* Font-specific encoding */ for (k=0; k<256; k++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP; /* The ".notdef" is also static and may not be shifted (Thanks, Derek ;) */ if (ldummy != (unsigned long)not_def) { ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP=(struct ps_obj *)ldummy; } } } } /* end of encoding-handling */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP=(char *)ldummy; } /* fontinfo-dict done */ /* Private-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->Private[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP=(char *)ldummy; } ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP=(char *)ldummy; } /* BluesP: The entry "next" is the only pointer in blues_struct. Although it is not used anywhere we should shift it for correctness reasons (in case its not NULL)! */ if (pFontBase->pFontArray[FontID].pType1Data->BluesP->next != NULL){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->BluesP->next; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP->next=(struct blues_struct *)ldummy; } /* The CharStrings-dictionary: Every namepointer and its corresponding charstring has to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len; for (j=1; j<=i; j++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP=(char *)ldummy; } /* The Subroutines have also to be reorganized: */ i=pFontBase->pFontArray[FontID].pType1Data->Subrs.len; /* First, shift pointer to array-start and after that the pointers to each command string: */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP=(struct ps_obj *)ldummy; for (j=0; jpFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP; ldummy +=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP=(char *)ldummy; } } /* end of if( tmp_ptr > vm_base ) */ else if ( vm_base > tmp_ptr){ shift= (unsigned long)vm_base - (unsigned long)tmp_ptr; sprintf( err_warn_msg_buf, "Old VM at 0x%lX, new VM at 0x%lX, shifting down by %lu", (unsigned long)vm_base, (unsigned long)tmp_ptr, tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); /* We start by shifting the topmost pointers: */ pFontBase->pFontArray[FontID].vm_base=tmp_ptr; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->vm_start); ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->vm_start=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private=(psdict *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP=(psdict *)ldummy; ldummy=(long)(pFontBase->pFontArray[FontID].pType1Data->BluesP); ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP=(struct blues_struct *)ldummy; /* We now have to care for correcting all pointers which are in the VM and refer to some place in the VM! Note: Instead of selecting the appropriate pointer-elements of the union we simply shift the unspecified pointer "valueP". Note: The filename entry does not need to be modified since it does not need to be shifted since it points to memory managed by t1lib. */ /* FontInfo-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->fontInfoP[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; } /* The encoding needs special treatment: */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.type==OBJ_ENCODING){ /* If a builtin encoding is used, it is sufficient to shift the pointer to the Encoding since the character-namestrings of builtin encodings are static and thus located on the heap. For font-specific encoding, character-namestrings reside in VM and thus each entry has to be shifted. Caution: We still have to shift the builtin encoding-pointer, since they also point to are located in VM: */ ldummy=(long)StdEncArrayP; ldummy -=shift; StdEncArrayP=(psobj *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.valueP=(char *)ldummy; if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP == StdEncArrayP){ /* Font uses builtin encoding */ ; } else{ /* Font-specific encoding */ for (k=0; k<256; k++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP; /* The ".notdef" is also static and may not be shifted (Thanks, Derek ;) */ if (ldummy != (unsigned long)not_def) { ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].value.data.arrayP[k].data.arrayP=(struct ps_obj *)ldummy; } } } } /* end of encoding-handling */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->fontInfoP[j].key.data.valueP=(char *)ldummy; } /* fontinfo-dict done */ /* Private-dictionary: All name-pointers and the pointers to all array types have to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->Private[0].key.len; for (j=1; j<=i; j++){ if ((pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_ARRAY) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_STRING) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_NAME) || (pFontBase->pFontArray[FontID].pType1Data->Private[j].value.type==OBJ_FILE)){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].value.data.valueP=(char *)ldummy; } ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Private[j].key.data.valueP=(char *)ldummy; } /* BluesP: The entry "next" is the only pointer in blues_struct. Although it is not used anywhere we should shift it for correctness reasons (in case its not NULL)! */ if (pFontBase->pFontArray[FontID].pType1Data->BluesP->next != NULL){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->BluesP->next; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->BluesP->next=(struct blues_struct *)ldummy; } /* The CharStrings-dictionary: Every namepointer and its corresponding charstring has to be shifted: */ i=pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len; for (j=1; j<=i; j++){ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].value.data.valueP=(char *)ldummy; ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->CharStringsP[j].key.data.valueP=(char *)ldummy; } /* The Subroutines have also to be reorganized: */ i=pFontBase->pFontArray[FontID].pType1Data->Subrs.len; /* First, shift pointer to array-start and after that the pointers to each command string: */ ldummy=(long)pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP=(struct ps_obj *)ldummy; for (j=0; jpFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP; ldummy -=shift; pFontBase->pFontArray[FontID].pType1Data->Subrs.data.arrayP[j].data.valueP=(char *)ldummy; } } /* end of if( vm_base > tmp_ptr ) */ else{ /* VM addess has not changed during reallocation */ sprintf( err_warn_msg_buf, "Old VM and new VM at 0x%lX, no pointer-shifting", (unsigned long)vm_base); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); } #endif /* Generate a message how much VM the current font consumes */ sprintf( err_warn_msg_buf, "VM for Font %d: %d bytes", FontID, (int) tmp_size); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); /* Set the matrix for common transformations to "no transformations" */ pFontBase->pFontArray[FontID].FontTransform[0]=1.0; pFontBase->pFontArray[FontID].FontTransform[1]=0.0; pFontBase->pFontArray[FontID].FontTransform[2]=0.0; pFontBase->pFontArray[FontID].FontTransform[3]=1.0; /* Now, that the font has been loaded into memory, try to find the FontMatrix in the font info dictionary. If it exists, load it into our local fontmatrix, otherwise use a default matrix which scales to 1/1000 (since font outlines are defined in a 1000 point space) and does no further transformations. */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP == NULL){ pFontBase->pFontArray[FontID].FontMatrix[0]=0.001; pFontBase->pFontArray[FontID].FontMatrix[1]=0.0; pFontBase->pFontArray[FontID].FontMatrix[2]=0.0; pFontBase->pFontArray[FontID].FontMatrix[3]=0.001; } else{ pFontBase->pFontArray[FontID].FontMatrix[0]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[0].data.real; pFontBase->pFontArray[FontID].FontMatrix[1]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[1].data.real; pFontBase->pFontArray[FontID].FontMatrix[2]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[2].data.real; pFontBase->pFontArray[FontID].FontMatrix[3]= (double)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTMATRIX].value.data.arrayP[3].data.real; } /* Set the default values for transformation: */ pFontBase->pFontArray[FontID].slant=0.0; pFontBase->pFontArray[FontID].extend=1.0; /* Now try to load afm-structures from corresponding .afm-file (if not suppressed by the user). */ if ((pFontBase->t1lib_flags & T1_NO_AFM)!=0) { pFontBase->pFontArray[FontID].pAFMData = NULL; T1_PrintLog( "T1_LoadFont()", "Suppressing AFM data handling on user request", T1LOG_STATISTIC); } else { if ((i=openFontMetricsFile( FontID, 0))){ /* Try a fallback, opening sloppy: */ if ((i=openFontMetricsFile( FontID, 1))) { sprintf( err_warn_msg_buf, "Alert: Error (%d) sloppy-processing afm-file for Font %d!", i ,FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); if ((pFontBase->pFontArray[FontID].pAFMData= T1_GenerateAFMFallbackInfo(FontID))==NULL){ sprintf( err_warn_msg_buf, "Ultimately failed to generate metrics information Font %d!", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SELFGEN_SUCCESS; T1_PrintLog( "T1_LoadFont()", "Generating AFM-information from fontfile successful!", T1LOG_STATISTIC); } } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SLOPPY_SUCCESS; sprintf( err_warn_msg_buf, "Alert: Limited afm-information for Font %d",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_STATISTIC); } } else { pFontBase->pFontArray[FontID].info_flags |=AFM_SUCCESS; } } /* Now, set Encodingvector entry to default if the font's internal encoding is "StandardEncoding". */ if (pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP == StdEncArrayP) { pFontBase->pFontArray[FontID].info_flags |=USES_STANDARD_ENCODING; pFontBase->pFontArray[FontID].pFontEnc=pFontBase->default_enc; sprintf( err_warn_msg_buf, "Font %d reencoded to default",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); } else { sprintf( err_warn_msg_buf, "Font %d not reencoded to default",FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); pFontBase->pFontArray[FontID].pFontEnc = NULL; } /* If AFM-Info available we try to speed up some things: */ if (pFontBase->pFontArray[FontID].pAFMData != NULL) { /* We have to fill the array that maps the current encodings' indices to the indices used in afm file. The interpretation has been changed in in t1lib-1.2. We now use positive values for indexing into the charmetrics array and negative values for indexing into the composite character array. an index of zero indicates that no metrics are defined for this character. This may happen because (a) not all AFM-files define metrics for the .notdef character, and (b) because font and AFM-file do not match. */ if ((pFontBase->pFontArray[FontID].pEncMap= (int *)calloc(256,sizeof(int)))==NULL) { sprintf( err_warn_msg_buf, "Error allocating memory for encoding map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } for (i=0; i<256; i++) { charname=T1_GetCharName( FontID, i); /* in a first loop check for ordinary characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfChars; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->cmi[j].name)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=j+1; /* index 0 is reserved! */ continue; } } /* if nothing has been found, check for composite characters */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { if (strcmp( charname, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName)==0) { pFontBase->pFontArray[FontID].pEncMap[i]=-(j+1); /* index 0 is reserved! */ continue; } } } /* For composite characters, we still have to compute the width and bbox */ for ( j=0; jpFontArray[FontID].pAFMData->numOfComps; j++) { /*and bounding box by ourselves. First, set up an identity charspace matrix and then generate an edgelist for the composite character at size 1000bp using no transformation and current encoding. Note: This action is only required when loading a font at first time, but not when reencoding a font. */ S=(struct XYspace *)IDENTITY; S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); area=fontfcnB_ByName( FontID, 0, S, pFontBase->pFontArray[FontID].pAFMData->ccd[j].ccName, &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER); /* Store bounding box ... */ pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.llx=area->xmin; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.urx=area->xmax; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.lly=area->ymin; pFontBase->pFontArray[FontID].pAFMData->ccd[j].charBBox.ury=area->ymax; /* ... and character width. This should be the width of the base character of the composite! */ pFontBase->pFontArray[FontID].pAFMData->ccd[j].wx=NEARESTPEL(area->ending.x); /* clean up. */ KillRegion (area); if (S!=NULL) { KillSpace (S); S=NULL; } } /* We now create an encoding-specific kerning table which will speed up looking for kerning pairs! */ /* First, get number of defined kerning pairs: */ k=pFontBase->pFontArray[FontID].pAFMData->numOfPairs; if (k>0){ /* i.e., there are any pairs */ /* OK, it does not suffice to alloc numOfPairs METRICS_ENTRYs, because a given character might be encoded at several locations and kerning should still work. As a worst case estimation, we allocate 256^2 and realloc later. */ if ((pFontBase->pFontArray[FontID].pKernMap= (METRICS_ENTRY *)malloc( (256*256) *sizeof( METRICS_ENTRY)))==NULL){ sprintf( err_warn_msg_buf, "Error allocating memory for metrics map (FontID=%d)", FontID); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_ALLOC_MEM; return(-1); } kern_tbl=pFontBase->pFontArray[FontID].pKernMap; pkd=pFontBase->pFontArray[FontID].pAFMData->pkd; j=0; for ( i=0; i Put char1 in higher byte and char2 in LSB: */ kern_tbl[j].chars=(char1 << 8) | char2; /* We only make use of horizontal kerning */ kern_tbl[j].hkern=pkd[i].xamt; j++; } /* while (char2) */ } /* while (char1) */ } /* for */ /* We are done, realloc memory: */ kern_tbl=(METRICS_ENTRY*) realloc( kern_tbl, j*sizeof(METRICS_ENTRY)); /* We now sort the kerning array with respect to char indices */ qsort( kern_tbl, (size_t) j, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY ); /* Finally write back pointer for the case that realloc changed the pointer */ pFontBase->pFontArray[FontID].pKernMap=kern_tbl; pFontBase->pFontArray[FontID].KernMapSize=j; } else pFontBase->pFontArray[FontID].pKernMap=NULL; } else { /* no AFM data */ pFontBase->pFontArray[FontID].pKernMap=NULL; pFontBase->pFontArray[FontID].pEncMap=NULL; } /* End of "if (AFM-info ..)" */ /* We have just loaded a physical font into memory, thus .... */ pFontBase->pFontArray[FontID].physical=1; /* Set reference-counter to 1: */ pFontBase->pFontArray[FontID].refcount=1; /* Get the index into encoding vector where the space character is found. If not encoded, set space_position to -1. */ pFontBase->pFontArray[FontID].space_position=-1; i=0; if (pFontBase->pFontArray[FontID].pFontEnc) { /* external default encoding */ while (i<256) { if (strcmp( (char *)pFontBase->pFontArray[FontID].pFontEnc[i], "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } else { /* internal encoding */ while (i<256) { if (strcmp( (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[i].data.arrayP, "space")==0){ /* space found at position i: */ pFontBase->pFontArray[FontID].space_position=i; break; } i++; } } /* Set the lining rule parameters to default values */ pFontBase->pFontArray[FontID].UndrLnPos= pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINEPOSITION].value.data.real; pFontBase->pFontArray[FontID].UndrLnThick= pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINETHICKNESS].value.data.real; /* We have to set the value for the typographic ascender. If possible, we get it from the afm-File. But be aware this value might be undefined! This value should in any acse explicitly be set later by the user! */ if (pFontBase->pFontArray[FontID].pAFMData!=NULL && pFontBase->pFontArray[FontID].pAFMData->gfi!=NULL) { ascender=(float) pFontBase->pFontArray[FontID].pAFMData->gfi->ascender; } else { ascender=(float) T1_GetCharBBox( FontID, T1_GetEncodingIndex( FontID, "d")).ury; } pFontBase->pFontArray[FontID].OvrLnPos=ascender + (float) abs( (double)pFontBase->pFontArray[FontID].UndrLnPos); pFontBase->pFontArray[FontID].OvrStrkPos=ascender / 2.0; pFontBase->pFontArray[FontID].OvrLnThick=pFontBase->pFontArray[FontID].UndrLnThick; pFontBase->pFontArray[FontID].OvrStrkThick=pFontBase->pFontArray[FontID].UndrLnThick; /* Finally, set the font size dependencies pointer to NULL since we can assume, that at load time of a font, no size specific data of this font is available. */ pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; /* If wanted, some debugging information is put into logfile */ sprintf( err_warn_msg_buf, "Pointer vm_base: 0x%lX", (long)pFontBase->pFontArray[FontID].vm_base); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer vm_start: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->vm_start); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer CharStringsP: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->CharStringsP); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer Private: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->Private); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); sprintf( err_warn_msg_buf, "Pointer fontInfoP: 0x%lX", (long)pFontBase->pFontArray[FontID].pType1Data->fontInfoP); T1_PrintLog( "T1_LoadFont()", err_warn_msg_buf, T1LOG_DEBUG); return(0); } /* openFontMetricsFile( FontID, open_sloppy): Gets the fontfilename corresponding to FontID, opens the corresponding afm-file and fills the data structures. return-value is the value returned by the T1lib_parseFile() function. If open_sloppy is set, the minimum information needed is read from AFM file. This can be considered a fallback for problematic AFM files. */ static int openFontMetricsFile( int FontID, int open_sloppy) { char *FontFileName; char *AFMFileName; char *afm_name; char *AFMFileNamePath; int i, j; FILE *metricsfile; afm_name=T1_GetAfmFileName(FontID); if (afm_name!=NULL) { /* We have name explicitly specified */ /* It needs to be freeable */ if ((AFMFileName= (char *)malloc( (strlen(afm_name)+1)*sizeof( char)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( -6); } strcpy( AFMFileName, afm_name); } else { FontFileName=T1_GetFontFileName( FontID); i=strlen(FontFileName); j=i; AFMFileName=(char *)malloc( i+5); strcpy( AFMFileName, FontFileName); while ( AFMFileName[i] != '.'){ if (i==0) break; else i--; } if (i==0){ /* We have a filename without extension -> append extension */ AFMFileName[j]='.'; AFMFileName[j+1]='a'; AFMFileName[j+2]='f'; AFMFileName[j+3]='m'; AFMFileName[j+4]='\0'; } else{ /* we found a '.' -> replace extension */ AFMFileName[i+1]='a'; AFMFileName[i+2]='f'; AFMFileName[i+3]='m'; AFMFileName[i+4]='\0'; } } /* Get full path of the afm file (The case of a full path name name specification is valid */ AFMFileNamePath=intT1_Env_GetCompletePath( AFMFileName, T1_AFM_ptr); free( AFMFileName); /* open afm-file: */ if (AFMFileNamePath!=NULL){ if ((metricsfile=fopen(AFMFileNamePath,"rb"))==NULL){ free(AFMFileNamePath); return(-4); } else { free(AFMFileNamePath); } } else{ return( -5); } /* Call procedure to read afm-file and store the data formatted. Flags used here: P_M All Metrics Information P_P Pair Kerning Information P_C Composite Character Data (since t1lib V.1.2) The P_G flag to get global font information should not be used if not absolutely needed. When parsing an unknown keyword, which may be harmless, the T1lib_parseFile function returns the error code -1 (parseError). On the other hand, all other really relevant data may habe been parsed and stored correctly. In such a case, There's no way to make a serious decision whether an error has occured or not. */ if (open_sloppy!=0) i=T1lib_parseFile( (FILE *) metricsfile, (FontInfo **) &(FontBase.pFontArray[FontID].pAFMData), P_M ); else i=T1lib_parseFile( (FILE *) metricsfile, (FontInfo **) &(FontBase.pFontArray[FontID].pAFMData), P_G | P_M | P_P | P_C ); fclose(metricsfile); return(i); } /* CreateNewFontSize( FontID, size): Create a new size "size" of font "FontID" and allocate all data necessary for this. The data structure is connected to the linked list of FontSizeDeps for this font. Returns a pointer to the newly created FontSizeDeps-struct if all went correct and NULL otherwise. Since of version 0.3 a member antialias has been added to the FONTSIZEDEPS structure! This can be: 0: bitmaps are stored in this struct 1: non-antialiased bytemaps are stored in this struct 2: low-antialiased bytemaps are stored in this struct 4: high-antialiased bytemaps are stored in this struct */ FONTSIZEDEPS *CreateNewFontSize( int FontID, float size, int aa) { FONTSIZEDEPS *pFontSizeDeps, *pPrev; /* First, get to the last font size in the linked list for this font. The following routine returns the address of the last struct in the linked list of FONTSIZEDEPS or NULL if none exists. */ pFontSizeDeps=GetLastFontSize( FontID); pPrev=pFontSizeDeps; if (pFontSizeDeps==NULL){ /* Allocate memory for first FontSizeDeps-structure: */ if ((pFontBase->pFontArray[FontID].pFontSizeDeps=(FONTSIZEDEPS *)malloc(sizeof(FONTSIZEDEPS)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } pFontSizeDeps=pFontBase->pFontArray[FontID].pFontSizeDeps; } else{ /* A valid address of an existing structure was found */ if ((pFontSizeDeps->pNextFontSizeDeps=(FONTSIZEDEPS *)malloc(sizeof(FONTSIZEDEPS)))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } pFontSizeDeps=pFontSizeDeps->pNextFontSizeDeps; } /* The pointer to the previous struct */ pFontSizeDeps->pPrevFontSizeDeps=pPrev; /* Put the size into this structure */ pFontSizeDeps->size=size; /* Set the antialias mark: */ pFontSizeDeps->antialias=aa; /* Just the current becomes now the last item in the linked list: */ pFontSizeDeps->pNextFontSizeDeps=NULL; /* Setup CharSpaceMatrix for this font: */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) IDENTITY; /* Apply transformation with font matrix: */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Transform(pFontSizeDeps->pCharSpaceLocal, pFontBase->pFontArray[FontID].FontMatrix[0], pFontBase->pFontArray[FontID].FontMatrix[1], pFontBase->pFontArray[FontID].FontMatrix[2], pFontBase->pFontArray[FontID].FontMatrix[3]); /* Apply a further transformation (optionally): */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Transform(pFontSizeDeps->pCharSpaceLocal, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3]); /* Apply desired scaling factor, and make it Permanent */ pFontSizeDeps->pCharSpaceLocal=(struct XYspace *) Permanent (Scale(pFontSizeDeps->pCharSpaceLocal, size, size)); /* We should now allocate memory for the glyph area of the font cache: */ if ((pFontSizeDeps->pFontCache=(GLYPH *)calloc(256,sizeof(GLYPH))) ==NULL) return(NULL); sprintf( err_warn_msg_buf, "New Size %f created for FontID %d (antialias=%d)", pFontSizeDeps->size, FontID, pFontSizeDeps->antialias); T1_PrintLog( "CreateNewFontSize()", err_warn_msg_buf, T1LOG_STATISTIC); /* We are done */ return(pFontSizeDeps); } /* QueryFontSize( FontID, size, aa): Search if a requested size of font FontID is already existing. If so, it returns a pointer to the respective FontSizeDeps-structure, otherwise NULL is returned: */ FONTSIZEDEPS *QueryFontSize( int FontID, float size, int aa) { FONTSIZEDEPS *link_ptr; /* There's not yet one size: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps == NULL) return(pFontBase->pFontArray[FontID].pFontSizeDeps); /* There's already existing one or more size */ link_ptr=pFontBase->pFontArray[FontID].pFontSizeDeps; while (((link_ptr->size != size)||(link_ptr->antialias != aa)) &&(link_ptr->pNextFontSizeDeps != NULL)) link_ptr=link_ptr->pNextFontSizeDeps; if ((link_ptr->size != size)||(link_ptr->antialias != aa)) return( NULL); /* requested size/aa-combination was not found */ else return(link_ptr); /* return pointer to requested struct */ } /* FONTSIZEDEPS *GetLastFontSize( FontID): Get the address of the last struct in the linked list of FontSizeDeps or NULL if there is no existing size dependent data. */ FONTSIZEDEPS *GetLastFontSize( int FontID) { FONTSIZEDEPS *link_ptr, *result_ptr; /* There's not yet one size: */ if (pFontBase->pFontArray[FontID].pFontSizeDeps == NULL) return((FONTSIZEDEPS *) (pFontBase->pFontArray[FontID].pFontSizeDeps)); /* There's already existing one or more size */ link_ptr=pFontBase->pFontArray[FontID].pFontSizeDeps; while (link_ptr != NULL){ result_ptr=link_ptr; link_ptr=link_ptr->pNextFontSizeDeps; } return((FONTSIZEDEPS *)(result_ptr)); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } grace-5.1.23/T1lib/t1lib/t1aaset.c0000644000076500001440000013146507415144742016146 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1aaset.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) Subsampling based on code by Raph Levien (raph@acm.org) ----- Date: 2001-04-01 ----- Description: This file is part of the t1-library. It contains functions for antialiased setting of characters and strings of characters. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1AASET_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1aaset.h" #include "t1set.h" #include "t1load.h" #include "t1finfo.h" #include "t1misc.h" #include "t1base.h" #include "t1outline.h" #define DEFAULTBPP 8 /* As a fall back */ #ifndef T1_AA_TYPE16 #define T1_AA_TYPE16 short #endif #ifndef T1_AA_TYPE32 #define T1_AA_TYPE32 int #endif /* In the following arrays take the gray values. Entry 0 is associated with the white (background) value and the max entry is the black (foreground) value. */ static unsigned T1_AA_TYPE32 gv[5]={0,0,0,0,0}; static unsigned T1_AA_TYPE32 gv_h[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; static unsigned T1_AA_TYPE32 gv_n[2]={0,0}; static int T1aa_level=T1_AA_LOW; /* The default value */ static T1_AA_TYPE32 T1aa_lut[625]; static int T1aa_count[256]; static T1_AA_TYPE32 T1aa_h_lut[289]; static int T1aa_h_count[256]; static T1_AA_TYPE32 T1aa_n_lut[64]; /* This global is for querying the current bg from other parts of t1lib */ unsigned T1_AA_TYPE32 T1aa_bg=0; /* The limit values for smart antialiasing */ float T1aa_smartlimit1=T1_AA_SMARTLIMIT1; float T1aa_smartlimit2=T1_AA_SMARTLIMIT2; int T1aa_SmartOn=0; /* We do not enable smart AA by default */ /* T1_AAInit: This function must be called whenever the T1aa_gray_val or T1aa_bpp variables change, or the level changes. */ static int T1_AAInit ( int level ) { int i; int i0, i1, i2, i3; int movelow=0, movehigh=0, indlow=0, indhigh=0; /* Note: movelow, movehigh, indlow and indhigh take care for proper byte swapping in dependence of endianess for level=4 */ if (level==T1_AA_NONE){ if (T1aa_bpp==8){ if (pFontBase->endian){ movelow=3; movehigh=2; } else{ movelow=0; movehigh=1; } } else if (T1aa_bpp==16){ if (pFontBase->endian){ movelow=1; movehigh=0; } else{ movelow=0; movehigh=1; } } } if (level==T1_AA_HIGH){ if (T1aa_bpp==8){ if (pFontBase->endian){ indlow=17; indhigh=1; movelow=3; movehigh=2; } else{ indlow=1; indhigh=17; movelow=0; movehigh=1; } } else if (T1aa_bpp==16){ if (pFontBase->endian){ indlow=17; indhigh=1; movelow=1; movehigh=0; } else{ indlow=1; indhigh=17; movelow=0; movehigh=1; } } else if (T1aa_bpp==32){ indlow=1; indhigh=17; } for (i = 0; i < 256; i++) { T1aa_h_count[i] = 0; if (i & 0x80) T1aa_h_count[i] += indhigh; if (i & 0x40) T1aa_h_count[i] += indhigh; if (i & 0x20) T1aa_h_count[i] += indhigh; if (i & 0x10) T1aa_h_count[i] += indhigh; if (i & 0x08) T1aa_h_count[i] += indlow; if (i & 0x04) T1aa_h_count[i] += indlow; if (i & 0x02) T1aa_h_count[i] += indlow; if (i & 0x01) T1aa_h_count[i] += indlow; } } if (level == 2 && T1aa_bpp == 8) { for (i0 = 0; i0 < 5; i0++) for (i1 = 0; i1 < 5; i1++) for (i2 = 0; i2 < 5; i2++) for (i3 = 0; i3 < 5; i3++) { ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4] = gv[i3]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 1] = gv[i2]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 2] = gv[i1]; ((char *)T1aa_lut)[(((i0 * 5 + i1) * 5 + i2) * 5 + i3) * 4 + 3] = gv[i0]; } for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 125; if (i & 0x40) T1aa_count[i] += 125; if (i & 0x20) T1aa_count[i] += 25; if (i & 0x10) T1aa_count[i] += 25; if (i & 0x08) T1aa_count[i] += 5; if (i & 0x04) T1aa_count[i] += 5; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 2 && T1aa_bpp == 16) { for (i0 = 0; i0 < 5; i0++) for (i1 = 0; i1 < 5; i1++) { ((T1_AA_TYPE16 *)T1aa_lut)[(i0 * 5 + i1) * 2] = gv[i1]; ((T1_AA_TYPE16 *)T1aa_lut)[(i0 * 5 + i1) * 2 + 1] = gv[i0]; } for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 160; if (i & 0x40) T1aa_count[i] += 160; if (i & 0x20) T1aa_count[i] += 32; if (i & 0x10) T1aa_count[i] += 32; if (i & 0x08) T1aa_count[i] += 5; if (i & 0x04) T1aa_count[i] += 5; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 2 && T1aa_bpp == 32) { for (i0 = 0; i0 < 5; i0++) ((T1_AA_TYPE32 *)T1aa_lut)[i0] = gv[i0]; for (i = 0; i < 256; i++) { T1aa_count[i] = 0; if (i & 0x80) T1aa_count[i] += 512; if (i & 0x40) T1aa_count[i] += 512; if (i & 0x20) T1aa_count[i] += 64; if (i & 0x10) T1aa_count[i] += 64; if (i & 0x08) T1aa_count[i] += 8; if (i & 0x04) T1aa_count[i] += 8; if (i & 0x02) T1aa_count[i] += 1; if (i & 0x01) T1aa_count[i] += 1; } return(0); } else if (level == 4 && T1aa_bpp == 8) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((char *)T1aa_h_lut)[(i0 * 17 + i1) * 4 + movelow] = gv_h[i1]; ((char *)T1aa_h_lut)[(i0 * 17 + i1) * 4 + movehigh] = gv_h[i0]; } } return(0); } else if (level == 4 && T1aa_bpp == 16) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((T1_AA_TYPE16 *)T1aa_h_lut)[(i0 * 17 + i1) * 2 + movelow] = gv_h[i1]; ((T1_AA_TYPE16 *)T1aa_h_lut)[(i0 * 17 + i1) * 2 + movehigh] = gv_h[i0]; } } return(0); } else if (level == 4 && T1aa_bpp == 32) { for (i0 = 0; i0 < 17; i0++){ /* i0 indexes higher nibble */ for (i1 = 0; i1 < 17; i1++){ /* i1 indixes lower nibble */ ((T1_AA_TYPE32 *)T1aa_h_lut)[(i0 * 17 + i1)] = gv_h[i1]; } } return(0); } else if (level == 1 && T1aa_bpp == 8) { for (i0=0; i0<16; i0++) { ((char *)T1aa_n_lut)[i0*4+movelow]=gv_n[i0 & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+1]=gv_n[(i0>>1) & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+2]=gv_n[(i0>>2) & 0x01]; ((char *)T1aa_n_lut)[i0*4+movelow+3]=gv_n[(i0>>3) & 0x01]; } return(0); } else if (level == 1 && T1aa_bpp == 16) { for (i0=0; i0<4; i0++) { ((T1_AA_TYPE16 *)T1aa_n_lut)[i0*2]=gv_n[i0 & 0x01]; ((T1_AA_TYPE16 *)T1aa_n_lut)[i0*2+1]=gv_n[(i0>>1) & 0x01]; } return(0); } else if (level == 1 && T1aa_bpp == 32) { for ( i0=0; i0<2; i0++) { ((T1_AA_TYPE32 *)T1aa_n_lut)[i0]=gv_n[i0]; } return(0); } else { /* unsupported combination of level and bpp -> we set T1_errno and put an entry into the logfile! */ T1_errno=T1ERR_INVALID_PARAMETER; sprintf( err_warn_msg_buf, "Unsupported AA specification: level=%d, bpp=%d", level, T1aa_bpp); T1_PrintLog( "T1_AAInit()", err_warn_msg_buf, T1LOG_WARNING); } return(1); } /* T1_AADoLine: Create a single scanline of antialiased output. The (x, y) arguments refer to the number of pixels in the input image to convert down. The width argument is the number of bytes separating scanlines in the input. The quantity hcorr describes the number of subpixels. It is the shift of the oversampled bitmap to the right */ static void T1_AADoLine ( int level, int x, int y, int width, char *c_in_ptr, char *target_ptr, int hcorr ) { int i=0; int size; int count=0; int mod; unsigned char bcarry1=0, bcarry2=0, bcarry3=0, bcarry4=0; static char *align_buf = NULL; static int align_buf_size = 0; unsigned char *in_ptr; int new_size=55; register char *optr; /* We convert the input pointer to unsigned since we use it as index! */ in_ptr=(unsigned char*)c_in_ptr; if ((long)target_ptr & 3){ /* calculate new_size (size in bytes of output buffer */ if (level == T1_AA_LOW){ new_size=((x + hcorr + 1) >> 1) * (T1aa_bpp >> 3); } else{ /* T1_AA_HIGH */ new_size = ((x + hcorr + 3) >> 2) * (T1aa_bpp >> 3); } if (new_size > align_buf_size) { if (align_buf) free (align_buf); /* Note: we allocate 12 more than necessary to have tolerance at the end of line */ align_buf = (char *)malloc(new_size+12); align_buf_size = new_size; } optr = align_buf; } else optr = target_ptr; /* size: The number of valid byte in the input string, i.e., the number of bytes partially filled with pixels before shifting with hcorr. mod: Is 1 if after shifting with hcorr the last byte in the input line has an overflow. */ if (level == T1_AA_LOW) { size=(x+7)>>3; mod=(x+hcorr)>(size*8) ? 1 : 0; if (T1aa_bpp == 8) { if (y == 2){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_lut[(T1aa_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 5]; } } else if (T1aa_bpp == 32) { if (y == 2){ for (i = 0; i < size; i++) { count = T1aa_count[(unsigned char)((in_ptr[i]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; bcarry1=in_ptr[i]>>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; bcarry1=in_ptr[i]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<> 3) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 2] = T1aa_lut[(count >> 6) & 7]; ((T1_AA_TYPE32 *)optr)[i * 4 + 3] = T1aa_lut[(count >> 9) & 7]; } } } else if (level==T1_AA_HIGH){ size=(x+7)>>3; mod=(x+hcorr)>(size*8) ? 1 : 0; if (T1aa_bpp == 8) { if (y == 4){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } } else if (y == 3){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); } } else if (y == 2){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } } else if (y == 1){ for (i = 0; i < size; i++) { ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); } } if (mod) { if (y == 4) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3] + T1aa_h_count[bcarry4])]; else if (y == 3) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2] + T1aa_h_count[bcarry3])]; else if (y == 2) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1] + T1aa_h_count[bcarry2])]; else if (y == 1) ((T1_AA_TYPE16 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[bcarry1])]; } } else if (T1aa_bpp == 16) { if (y == 4){ for (i = 0; i < size; i++) { ((T1_AA_TYPE32 *)optr)[i] = T1aa_h_lut[(T1aa_h_count[(unsigned char)((in_ptr[i]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+2*width]>>(8-hcorr); bcarry3=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); bcarry4=in_ptr[i+3*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); bcarry3=in_ptr[i+2*width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); bcarry2=in_ptr[i+width]>>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>(8-hcorr); } if (size==0){ bcarry1=in_ptr[0]<>j%8)&0x0F]; } } else if (T1aa_bpp==16) { starget_ptr=(T1_AA_TYPE16 *)target_ptr; for ( j=0; j>j%8)&0x03]; } } else if (T1aa_bpp==32) { ltarget_ptr=(T1_AA_TYPE32 *)target_ptr; for ( j=0; j>j%8)&0x01]; } return; } /* T1_AASetChar(...): Generate the anti-aliased bitmap for a character */ GLYPH *T1_AASetChar( int FontID, char charcode, float size, T1_TMATRIX *transform) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; FONTSIZEDEPS *font_ptr=NULL; unsigned char ucharcode; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; ucharcode=charcode; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* The following code is only exectued if caching of antialiased chracters is enabled. */ /* Check if char is in cache */ if ((pFontBase->t1lib_flags & T1_AA_CACHING)) { if (transform==NULL){ /* if size/aa is not existent we create it */ if ((font_ptr=QueryFontSize( FontID, size, T1aa_level))==NULL){ /* We create the required size struct and leave the rest for T1_SetChar() */ font_ptr=CreateNewFontSize( FontID, size, T1aa_level); if (font_ptr==NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } } else {/* size is already existent in cache */ if (font_ptr->pFontCache[ucharcode].bits != NULL){ /* Character is already in Chache -> create a copy of cache and return a pointer to the result: */ memcpy( &aaglyph, &(font_ptr->pFontCache[ucharcode]), sizeof(GLYPH)); memsize = (aaglyph.metrics.ascent-aaglyph.metrics.descent) * PAD((aaglyph.metrics.rightSideBearing-aaglyph.metrics.leftSideBearing) * T1aa_bpp,pFontBase->bitmap_pad)/8; aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( aaglyph.bits, font_ptr->pFontCache[ucharcode].bits, memsize); return(&(aaglyph)); } } } /* (transform==NULL) */ } /* T1_AA_CACHING */ /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetChar( FontID, charcode, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; /* aaglyph.bits = (char *)malloc(memsize*sizeof( char)); */ aaglyph.bits = (char *)malloc(memsize*sizeof( char)); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because the computation above is not valid in this case */ if (n_vert==1) v_start=v_start < v_end ? v_start : v_end; ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; if ((pFontBase->t1lib_flags & T1_AA_CACHING) && (transform==NULL)) { /* Put char into cache area */ memcpy( &(font_ptr->pFontCache[ucharcode]), &aaglyph, sizeof(GLYPH)); font_ptr->pFontCache[ucharcode].bits = (char *)malloc(memsize*sizeof( char)); if (font_ptr->pFontCache[ucharcode].bits == NULL){ T1_errno=T1ERR_ALLOC_MEM; T1aa_level=savelevel; return(NULL); } memcpy( font_ptr->pFontCache[ucharcode].bits, aaglyph.bits, memsize); } /* restore level */ T1aa_level=savelevel; return(&aaglyph); } /* T1_AASetString(...): Generate the antialiased bitmap for a string of characters */ GLYPH *T1_AASetString( int FontID, char *string, int len, long spaceoff, int modflag, float size, T1_TMATRIX *transform) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aastring_glyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; int savelevel; /* Reset character glyph, if necessary */ if (aastring_glyph.bits!=NULL){ free(aastring_glyph.bits); aastring_glyph.bits=NULL; } aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=0; aastring_glyph.metrics.advanceY=0; aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; aastring_glyph.bpp=T1aa_bpp; /* Check for smart antialiasing */ savelevel=T1aa_level; if (T1aa_SmartOn){ if (size>=T1aa_smartlimit2) { T1aa_level=T1_AA_NONE; } else if (size>=T1aa_smartlimit1) { T1aa_level=T1_AA_LOW; } else { T1aa_level=T1_AA_HIGH; } } /* First, call routine to rasterize character, all error checking is done in this function: */ if ((glyph=T1_SetString( FontID, string, len, spaceoff, modflag, T1aa_level*size, transform))==NULL){ /* restore level */ T1aa_level=savelevel; return(NULL); /* An error occured */ } /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aastring_glyph.bits=NULL; aastring_glyph.metrics.leftSideBearing=0; aastring_glyph.metrics.rightSideBearing=0; aastring_glyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aastring_glyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aastring_glyph.metrics.ascent=0; aastring_glyph.metrics.descent=0; aastring_glyph.pFontCacheInfo=NULL; /* restore level and return */ T1aa_level=savelevel; return(&aastring_glyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aastring_glyph=*glyph; aastring_glyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph */ memsize = n_horz_pad*ht*8; aastring_glyph.bits = (char *)malloc(memsize*sizeof( char)); if (aastring_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; /* restore level */ T1aa_level=savelevel; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aastring_glyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } /* restore level */ T1aa_level=savelevel; return(&aastring_glyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; /* Note: we allocate 12 bytes more than necessary */ aastring_glyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aastring_glyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aastring_glyph.bits; /* We must check for n_vert==1 because the computation above is not valid in this case */ if (n_vert==1) v_start=v_start < v_end ? v_start : v_end; ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aastring_glyph */ aastring_glyph.metrics.leftSideBearing=aalsb; aastring_glyph.metrics.rightSideBearing=aalsb + n_horz; aastring_glyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aastring_glyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aastring_glyph.metrics.ascent=n_asc; aastring_glyph.metrics.descent=n_dsc; aastring_glyph.pFontCacheInfo=NULL; /* restore level */ T1aa_level=savelevel; return(&aastring_glyph); } /* T1_AASetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries: Returns 0 if successfull. */ int T1_AASetGrayValues(unsigned long white, unsigned long gray75, unsigned long gray50, unsigned long gray25, unsigned long black) { if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } gv[4]=(unsigned T1_AA_TYPE32)black; /* black value */ gv[3]=(unsigned T1_AA_TYPE32)gray25; /* gray 25% value */ gv[2]=(unsigned T1_AA_TYPE32)gray50; /* gray 50% value */ gv[1]=(unsigned T1_AA_TYPE32)gray75; /* gray 75% value */ gv[0]=(unsigned T1_AA_TYPE32)white; /* white value */ T1aa_bg=white; if ((T1_AAInit( T1_AA_LOW))) return(-1); return(0); } /* T1_AAHSetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries (for 17 gray levels): Returns 0 if successfull. */ int T1_AAHSetGrayValues( unsigned long *grayvals) { int i; if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } /* 0==white(background) ... 16==black(foreground) */ for (i=0; i<17; i++){ gv_h[i]=(unsigned T1_AA_TYPE32)grayvals[i]; } T1aa_bg=grayvals[0]; if ((T1_AAInit( T1_AA_HIGH))) return(-1); return(0); } /* T1_AANSetGrayValues(): Sets the byte values that are put into the pixel position for the respective entries (for 2 gray levels): Returns 0 if successfull. This is for the case the non-antialiased "bytemaps" should be generated. */ int T1_AANSetGrayValues( unsigned long bg, unsigned long fg) { if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } gv_n[0]=bg; gv_n[1]=fg; T1aa_bg=bg; if ((T1_AAInit( T1_AA_NONE))) return(-1); return(0); } /* Get the current setting of graylevels for 2x antialiasing. The 5 values are stored at address pgrayvals in order from background to foreground */ int T1_AAGetGrayValues( long *pgrayvals) { int i; if (CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } for ( i=0; i<5; i++) { /* bg (i=0) to fg (i=4) */ pgrayvals[i]=gv[i]; } return( 0); } /* Get the current setting of graylevels for 2x antialiasing. The 17 values are stored at address pgrayvals in order from background to foreground */ int T1_AAHGetGrayValues( long *pgrayvals) { int i; if (CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } for ( i=0; i<17; i++) { /* bg (i=0) to fg (i=16) */ pgrayvals[i]=gv[i]; } return( 0); } /* Get the current setting of graylevels for 2x antialiasing. The 2 values are stored at address pgrayvals in order from background to foreground */ int T1_AANGetGrayValues( long *pgrayvals) { if (CheckForInit()) { T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (pgrayvals==NULL) { T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } pgrayvals[0]=gv[0]; /* background */ pgrayvals[1]=gv[1]; /* foreground */ return( 0); } /* T1_AASetBitsPerPixel(): Sets the depths of the antialiased glyph pixel. Returns 0 if bpp is valid and -1 otherwise. If 24 is specified, meaning to be the depth rather than the bpp-value, automatically 32 bpp is chosen. */ int T1_AASetBitsPerPixel( int bpp) { if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } /* T1aa_level = 0; */ if (bpp==8){ T1aa_bpp=8; return(0); } if (bpp==16){ T1aa_bpp=16; return(0); } if ((bpp==32)|(bpp==24)){ T1aa_bpp=32; return(0); } T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* T1_AAGetBitsPerPixel(): Return the number of bits per pixel set in t1lib. */ int T1_AAGetBitsPerPixel( void) { return( T1aa_bpp); } /* Set the Subsampling level for subsequent operations: */ int T1_AASetLevel( int level) { if (CheckForInit()){ T1_errno=T1ERR_OP_NOT_PERMITTED; return(-1); } if (level==T1_AA_LOW){ T1aa_level=T1_AA_LOW; return(0); } else if (level==T1_AA_HIGH){ T1aa_level=T1_AA_HIGH; return(0); } else if (level==T1_AA_NONE){ T1aa_level=T1_AA_NONE; return(0); } T1_errno=T1ERR_INVALID_PARAMETER; return(-1); } /* Get the current subsampling level */ int T1_AAGetLevel( void) { return( T1aa_level); } /* T1_AAFillOutline(): Create a filled glyph from an outline description */ GLYPH *T1_AAFillOutline( T1_OUTLINE *path, int modflag) { GLYPH *glyph; /* pointer to bitmap glyph */ static GLYPH aaglyph={NULL,{0,0,0,0,0,0},NULL,DEFAULTBPP};/* The anti-aliased glyph */ long asc, dsc, ht, wd; long i; long n_horz, n_horz_pad, n_vert, n_asc, n_dsc; long v_start, v_end; char *target_ptr; long offset; char *ptr; int y; long lsb, aalsb, aahstart; int memsize; LONG paddedW; /* Reset character glyph, if necessary */ if (aaglyph.bits!=NULL){ free(aaglyph.bits); aaglyph.bits=NULL; } aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=0; aaglyph.metrics.advanceY=0; aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; aaglyph.bpp=T1aa_bpp; /* First, scale outline appropriately: */ path=T1_ScaleOutline( path, T1aa_level); /* Second, call routine to fill outline, all error checking is done in this function: */ if ((glyph=T1_FillOutline( path, modflag))==NULL) return(NULL); /* An error occured */ /* In case there are no black pixels, we simply set the dimensions and then return */ if ( glyph->bits == NULL) { aaglyph.bits=NULL; aaglyph.metrics.leftSideBearing=0; aaglyph.metrics.rightSideBearing=0; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=0; aaglyph.metrics.descent=0; aaglyph.pFontCacheInfo=NULL; return(&aaglyph); } /* Get dimensions of bitmap: */ asc=glyph->metrics.ascent; dsc=glyph->metrics.descent; lsb=glyph->metrics.leftSideBearing; ht=asc-dsc; wd=glyph->metrics.rightSideBearing-lsb; if (T1aa_level==T1_AA_NONE){ /* we only convert bitmap to bytemap */ aaglyph=*glyph; aaglyph.bpp=T1aa_bpp; /* Compute scanline length and such */ n_horz_pad=PAD( wd*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* Allocate memory for glyph, we alloc 12 bytes more to simplify subsampling! */ memsize = n_horz_pad*ht*8; aaglyph.bits = (char *)malloc(memsize*sizeof( char) +12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)>>3; ptr=glyph->bits; target_ptr=aaglyph.bits; for (i = 0; i < ht; i++) { T1_DoLine ( wd, paddedW, ptr, target_ptr ); ptr += paddedW; target_ptr += n_horz_pad; } return(&aaglyph); } /* Set some looping parameters for subsampling */ if (lsb<0){ aalsb=lsb/T1aa_level-1; aahstart=T1aa_level+(lsb%T1aa_level); } else{ aalsb=lsb/T1aa_level; aahstart=lsb%T1aa_level; } /* The horizontal number of steps: */ n_horz=(wd+aahstart+T1aa_level-1)/T1aa_level; /* And the padded value */ n_horz_pad=PAD( n_horz*T1aa_bpp, pFontBase->bitmap_pad )>>3; /* vertical number of steps: */ if (asc % T1aa_level){ /* not aligned */ if ( asc > 0){ n_asc=asc/T1aa_level+1; v_start=asc % T1aa_level; } else{ n_asc=asc/T1aa_level; v_start=T1aa_level + (asc % T1aa_level); } } else{ n_asc=asc/T1aa_level; v_start=T1aa_level; } if (dsc % T1aa_level){ /* not aligned */ if ( dsc < 0){ n_dsc=dsc/T1aa_level-1; v_end=-(dsc % T1aa_level); } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level - (dsc % T1aa_level); } } else{ n_dsc=dsc/T1aa_level; v_end=T1aa_level; } /* the total number of lines: */ n_vert=n_asc-n_dsc; /* Allocate memory for glyph */ memsize = n_horz_pad*n_vert; aaglyph.bits = (char *)malloc(memsize*sizeof( char)+12); if (aaglyph.bits == NULL) { T1_errno=T1ERR_ALLOC_MEM; return(NULL); } paddedW=PAD(wd,pFontBase->bitmap_pad)/8; offset=0; target_ptr=aaglyph.bits; /* We must check for n_vert==1 because the computation above is not valid in this case */ if (n_vert==1) v_start=v_start < v_end ? v_start : v_end; ptr = glyph->bits; for (i = 0; i < n_vert; i++) { if (i==0) y=v_start; else if (i==n_vert-1) y=v_end; else y=T1aa_level; T1_AADoLine ( T1aa_level, wd, y, paddedW, ptr, target_ptr, aahstart ); ptr += y * paddedW; target_ptr += n_horz_pad; } /* .. and set them in aaglyph */ aaglyph.metrics.leftSideBearing=aalsb; aaglyph.metrics.rightSideBearing=aalsb + n_horz; aaglyph.metrics.advanceX=(int) floor(glyph->metrics.advanceX/(float)T1aa_level+0.5); aaglyph.metrics.advanceY=(int) floor(glyph->metrics.advanceY/(float)T1aa_level+0.5); aaglyph.metrics.ascent=n_asc; aaglyph.metrics.descent=n_dsc; aaglyph.pFontCacheInfo=NULL; return(&aaglyph); } /* T1_AASetSmartLimits(): Set the limit-values for smart antialiasing. Returns 0 if OK, and -1 else. */ int T1_AASetSmartLimits( float limit1, float limit2) { if (limit1 > 0.0 && limit2 > 0.0 && limit2 >= limit2) { T1aa_smartlimit1=limit1; T1aa_smartlimit2=limit2; return( 0); } else{ T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } } /* T1_AASetSmartMode(): Enable or disable smart anialiasing */ int T1_AASetSmartMode( int smart) { if (smart==T1_YES) { T1aa_SmartOn=1; } else if (smart==T1_NO) { T1aa_SmartOn=0; } else { T1_errno=T1ERR_INVALID_PARAMETER; return( -1); } return( 0); } grace-5.1.23/T1lib/t1lib/t1finfo.c0000644000076500001440000011346207415144743016150 0ustar fnevgenyusers/*-------------------------------------------------------------------------- ----- File: t1finfo.c ----- Author: Rainer Menzner (Rainer.Menzner@web.de) ----- Date: 2001-06-10 ----- Description: This file is part of the t1-library. It contains functions for accessing afm-data and some other fontinformation data. ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2001. As of version 0.5, t1lib is distributed under the GNU General Public Library Lincense. The conditions can be found in the files LICENSE and LGPL, which should reside in the toplevel directory of the distribution. Please note that there are parts of t1lib that are subject to other licenses: The parseAFM-package is copyrighted by Adobe Systems Inc. The type1 rasterizer is copyrighted by IBM and the X11-consortium. ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) ----- Credits: I want to thank IBM and the X11-consortium for making their rasterizer freely available. Also thanks to Piet Tutelaers for his ps2pk, from which I took the rasterizer sources in a format independent from X11. Thanks to all people who make free software living! --------------------------------------------------------------------------*/ #define T1FINFO_C #include #include #include #include #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include "../type1/ffilest.h" #include "../type1/types.h" #include "parseAFM.h" #include "../type1/objects.h" #include "../type1/spaces.h" #include "../type1/util.h" #include "../type1/fontfcn.h" #include "../type1/regions.h" #include "t1types.h" #include "t1extern.h" #include "t1finfo.h" #include "t1base.h" #include "t1misc.h" #include "t1set.h" #include "t1load.h" /* The following variable controls the computation of the bbox internal to T1_GetMetricsInfo(). Its influence may be overridden by the global variable ForceAFMBBox: */ static int ForceAFMBBoxInternal=0; extern int ForceAFMBBox; extern char *t1_get_abort_message( int number); /* int T1_GetKerning(): This function returns the amount of kerning that is specified in the afm-file for the supplied character-pair. If an an extension has been applied to the font in question, this is taken into account. If for whatever reason there's no afm information available (that's not deadly), simply 0 is returned, indicating that no kerning should be used. The value returned is meant to be in character space coordinates. Thus, it must be transformed to be applicable in device space. */ int T1_GetKerning( int FontID, char char1, char char2) { METRICS_ENTRY entry; METRICS_ENTRY *target_pair=NULL; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* if there's no kerning info, return immediately */ if (pFontBase->pFontArray[FontID].KernMapSize==0) return( 0); entry.chars=(char1<<8) | char2; if ((target_pair=(METRICS_ENTRY *) bsearch( &entry, pFontBase->pFontArray[FontID].pKernMap, (size_t) pFontBase->pFontArray[FontID].KernMapSize, sizeof(METRICS_ENTRY), &cmp_METRICS_ENTRY))==NULL) return(0); else return( target_pair->hkern * pFontBase->pFontArray[FontID].extend); } /* int T1_GetCharWidth(): This function returns the characterwidth specified in the .afm-file. If no .afm-file is loaded for that font, 0 is returned. Note that if one tries to raster strings, afm data must always be available. The returned character width is corrected using a possibly applied font extension! */ int T1_GetCharWidth( int FontID, char char1) { unsigned char uchar1; uchar1=(unsigned char) char1; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* return appriate value */ if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]>0) { /* ordinary character */ return((int) ((pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]-1].wx) * pFontBase->pFontArray[FontID].extend)); } else if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]<0) { /* composite character */ return((int) ((pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)].wx) * pFontBase->pFontArray[FontID].extend)); } else { /* undefined or .notdef */ return(0); } } /* T1_GetCharBBox(): Get the BoundingBox of specified character. If an extension factor has been applied to the font in question, this is taken into account. However, a slant factor which has been applied to the font, also affects the bounding box of a character. The only way to determine its influence on the character bounding box is to compute the exact shape of that slanted character. There's no simple way to extract the new bounding box from the former bounding box. Thus, if a font has been slanted, the characters outline itself is examined. Since this must be done at 1000 bp it takes considerably longer than reading afm data. */ BBox T1_GetCharBBox( int FontID, char char1) { struct region *area; struct XYspace *S; int mode=0; int i; BBox NullBBox= { 0, 0, 0, 0}; /* A bounding box containing all 0's. */ BBox ResultBox= { 0, 0, 0, 0}; /* The Box returned if char is found */ unsigned char uchar1; /* We return to this if something goes wrong deep in the rasterizer */ if ((i=setjmp( stck_state))!=0) { T1_errno=T1ERR_TYPE1_ABORT; sprintf( err_warn_msg_buf, "t1_abort: Reason: %s", t1_get_abort_message( i)); T1_PrintLog( "T1_GetCharBBox()", err_warn_msg_buf, T1LOG_ERROR); return( NullBBox); } uchar1=(unsigned char) char1; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NullBBox); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( NullBBox); } /* Check for a font slant */ if ((pFontBase->pFontArray[FontID].slant!=0.0) &&(ForceAFMBBox==0) &&(ForceAFMBBoxInternal==0)){ /* We have a font slant -> character outline must be examined in order to determine bounding box */ /* Set up an identity charspace matrix and take a slant and an extension into account */ /* And make it permanent, to plug a memory leak */ S=(struct XYspace *)IDENTITY; S=(struct XYspace *)Permanent (Transform(S, pFontBase->pFontArray[FontID].FontTransform[0], pFontBase->pFontArray[FontID].FontTransform[1], pFontBase->pFontArray[FontID].FontTransform[2], pFontBase->pFontArray[FontID].FontTransform[3])); /* Genrate an edgelist for the current character at size 1000bp using current transformation and encoding: */ area=fontfcnB( FontID, 0, S, pFontBase->pFontArray[FontID].pFontEnc, (int) uchar1, &mode, pFontBase->pFontArray[FontID].pType1Data, DO_RASTER); /* Read out bounding box */ ResultBox.llx =area->xmin; ResultBox.urx =area->xmax; ResultBox.lly =area->ymin; ResultBox.ury =area->ymax; /* Reset AFM-switch and return BBox */ ForceAFMBBoxInternal=0; /* make sure to destroy 'area' before leaving! */ KillRegion (area); /* make sure to free S */ if (S) { KillSpace (S); } return(ResultBox); } else{ /* Assign bounding box for the different cases: */ /* Check if character is */ if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]>0) { /* ordinary char */ ResultBox=(pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]-1].charBBox); } else if (pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]<0) { /* composite char */ ResultBox=(pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)].charBBox); } else { /* undefined char */ return(NullBBox); } /* .. and apply transformations: */ ResultBox.llx *=pFontBase->pFontArray[FontID].extend; ResultBox.urx *=pFontBase->pFontArray[FontID].extend; return(ResultBox); } } /* int T1_GetUnderlinePosition(): Return underline position of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetUnderlinePosition( int FontID) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINEPOSITION].value.data.real)); } /* int T1_GetUnderlineThickness(): Return underline thickness of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetUnderlineThickness( int FontID) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[UNDERLINETHICKNESS].value.data.real)); } /* int T1_ItalicAngle(): Return underline position of specified font in charspace units. If 0.0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ float T1_GetItalicAngle( int FontID) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((float)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ITALICANGLE].value.data.real)); } /* int T1_GetUnderlinePosition(): Return underline position of specified font in charspace units. If 0 is returned, it indicated that the font is not yet loaded into memory. or an invalid ID has been specified. */ int T1_GetIsFixedPitch( int FontID) { if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0.0); } return((int)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ISFIXEDPITCH].value.data.boolean)); } /* char *T1_GetFontName( FontID): Get the PostScript FontName of the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFontName( int FontID) { static char fontname[MAXPSNAMELEN]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(fontname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.len); fontname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTNAME].value.len]=0; return(fontname); } /* char *T1_GetFullName( FontID): Get the Full Name from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFullName( int FontID) { static char fullname[MAXPSNAMELEN]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(fullname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.len); fullname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FULLNAME].value.len]=0; return(fullname); } /* char *T1_GetFamilyName( FontID): Get the Family Name of the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetFamilyName( int FontID) { static char familyname[MAXPSNAMELEN]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(familyname, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.len); familyname[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FAMILYNAME].value.len]=0; return(familyname); } /* char *T1_GetWeight( FontID): Get the Weight entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetWeight( int FontID) { static char weight[128]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(weight, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.len); weight[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[WEIGHT].value.len]=0; return(weight); } /* char *T1_GetFontName( FontID): Get the Version entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetVersion( int FontID) { static char version[2048]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(version, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.len); version[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[VERSION].value.len]=0; return(version); } /* char *T1_GetNotice( FontID): Get the Notice entry from the font dictionary associated with the specified font, or NULL if an error occurs. */ char *T1_GetNotice( int FontID) { static char notice[2048]; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } strncpy(notice, (char *)(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.data.nameP), pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.len); notice[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[NOTICE].value.len]=0; return(notice); } /* char *T1_GetCharName(): Get the PostScript character name of the character indexed by char1. */ char *T1_GetCharName( int FontID, char char1) { static char cc_name1[256]; char *c1; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(NULL); } if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ /* We have to get the names from the fonts internal encoding */ c1= (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP; strncpy(cc_name1, (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP, pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len); cc_name1[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len]=0; } else{ /* Take names from explicitly loaded and assigned encoding */ c1=pFontBase->pFontArray[FontID].pFontEnc[(unsigned char)char1]; strcpy(cc_name1,c1); } /* Return address of charname */ return(cc_name1); } /* T1_QueryLigs(): Get the number of ligatures defined in the font FontID for the character which is located at position char1 in the current encoding vector! Function returns the number of defined ligs (including 0) or -1 if an error occured. */ int T1_QueryLigs( int FontID, char char1, char **successors, char **ligatures) { FontInfo *afm_ptr; CharMetricInfo *m_ptr; char *c_name; char cc_name[128]; static char succ[MAX_LIGS]; int succ_index; static char lig[MAX_LIGS]; int lig_index; Ligature *ligs; int i,j; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } /* All OK, ... */ afm_ptr=pFontBase->pFontArray[FontID].pAFMData; m_ptr=afm_ptr->cmi; /* Get the name of the character: */ if (pFontBase->pFontArray[FontID].pFontEnc==NULL){ /* We have to get the name from the fonts internal encoding */ c_name=(char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP; strncpy(cc_name, (char *)pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].data.arrayP, pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len); cc_name[pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[(unsigned char)char1].len]=0; } else{ /* Take name from explicitly loaded and assigned encoding */ c_name=pFontBase->pFontArray[FontID].pFontEnc[(unsigned char)char1]; strcpy(cc_name,c_name); } for (i=0; inumOfChars; i++){ if (strcmp(m_ptr[i].name,cc_name)==0) break; } if (i==afm_ptr->numOfChars) /* we didn't find the characters name */ return(-1); ligs=m_ptr[i].ligs; j=0; if (ligs==NULL) return(0); while (ligs!=NULL) { /* Get indices of the two characters: */ if ((succ_index=T1_GetEncodingIndex( FontID, (char*) ligs->succ))==-1) { /* successor is not current encoding */ ligs=ligs->next; continue; } if ((lig_index=T1_GetEncodingIndex( FontID, (char*) ligs->lig))==-1) { /* Specified ligature is not in current encoding */ ligs=ligs->next; continue; } succ[j]=(char)succ_index; lig[j]=(char)lig_index; j++; ligs=ligs->next; } *successors=succ; *ligatures=lig; return(j); } /* T1_GetEncodingIndex(): Return the Index of char1 in the current encoding vector of font FontID */ int T1_GetEncodingIndex( int FontID, char *char1) { int i; int len1; int result_index; char **extern_enc; psobj *objptr; if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return(-1); } extern_enc=pFontBase->pFontArray[FontID].pFontEnc; len1=strlen( char1); /* The default return-value if character is not found: */ result_index=-1; if (extern_enc==NULL) { objptr=&(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[0]); /* We have to search the fonts internal encoding */ for (i=0;i<256;i++){ if (len1==objptr[i].len){ if (strncmp((char *)objptr[i].data.arrayP, char1, objptr[i].len)==0){ result_index=i; break; } } } } else { /* Take name from explicitly loaded and assigned encoding */ for (i=0;i<256;i++){ if (strcmp(extern_enc[i], char1)==0){ result_index=i; break; } } } return(result_index); } /* T1_GetEncodingIndices(): Return all indices of char1 in the current encoding vector of font FontID. */ int *T1_GetEncodingIndices( int FontID, char *char1) { int i; int endmark=0; int len1; char **extern_enc; psobj *objptr; /* the following array suffices for the extreme unlikely case of a font where one single fillsthe whole encoding vector */ static int indices[257]; if (CheckForFontID(FontID)!=1) { T1_errno=T1ERR_INVALID_FONTID; return(NULL); } extern_enc=pFontBase->pFontArray[FontID].pFontEnc; len1=strlen( char1); if (extern_enc==NULL) { objptr=&(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[ENCODING].value.data.arrayP[0]); /* We have to search the fonts internal encoding */ for (i=0;i<256;i++){ if (len1==objptr[i].len){ if (strncmp((char *)objptr[i].data.arrayP, char1, objptr[i].len)==0){ indices[endmark++]=i; } } } } else { /* Take name from explicitly loaded and assigned encoding */ for (i=0;i<256;i++){ if (strcmp(extern_enc[i], char1)==0){ indices[endmark++]=i; } } } indices[endmark]=-1; return((int *)indices); } /* int T1_GetStringWidth(): This function returns the width of string in .afm-file units. If no .afm-file is loaded for font FontID, 0 is returned. Note that if one tries to raster strings, afm data should always be available. The returned character width is corrected using a possibly applied font extension! */ int T1_GetStringWidth( int FontID, char *string, int len, long spaceoff, int kerning) { int no_chars; /* Number of chars in string */ int i; int *kern_pairs; int *charwidths; int spacewidth; int stringwidth; unsigned char *ustring; ustring=(unsigned char *) string; /* First, check for a correct ID */ i=CheckForFontID(FontID); if (i!=1){ T1_errno=T1ERR_INVALID_FONTID; return(0); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( 0); } /* Get length of string: */ if (len<0 || ustring == NULL){ /* invalid length or NULL-pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(0); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* Allocate room for temporary arrays of kerning and width arrays: */ kern_pairs=(int *)calloc(no_chars -1, sizeof(int)); if (kern_pairs==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(0); } charwidths=(int *)calloc(no_chars, sizeof(int)); if (charwidths==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(0); } /* If kerning is requested, get kerning amounts and fill the array: */ if (kerning){ for (i=0; ipFontArray[FontID].space_position)+spaceoff; /* Fill the width-array: */ for (i=0; ipFontArray[FontID].space_position) charwidths[i]=(int)spacewidth; else charwidths[i]=T1_GetCharWidth(FontID,ustring[i]); } /* Accumulate width: */ stringwidth=0; for (i=0; ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( NullBBox); } /* Get length of string: */ if (len<0 || string==NULL) { /* invalid length or NULL-pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(NullBBox); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; spacewidth= T1_GetCharWidth(FontID,pFontBase->pFontArray[FontID].space_position)+spaceoff; /* Accumulate metrics: */ for (i=0; ipFontArray[FontID].space_position) curr_width +=spacewidth; else{ tmp_BBox=T1_GetCharBBox( FontID, string[i]); if (curr_width+tmp_BBox.llx < lsb_min) lsb_min=curr_width+tmp_BBox.llx; if (curr_width+tmp_BBox.urx > rsb_max) rsb_max=curr_width+tmp_BBox.urx; if (tmp_BBox.lly < overalldescent) overalldescent=tmp_BBox.lly; if (tmp_BBox.ury > overallascent) overallascent=tmp_BBox.ury; curr_width +=T1_GetCharWidth( FontID, string[i]); if ((ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( metrics); } /* Get length of string: */ if (len<0 || ustring==NULL ) { /* invalid length or NULL_pointer */ T1_errno=T1ERR_INVALID_PARAMETER; return(metrics); } if (len==0) /* should be computed assuming "normal" 0-terminated string */ no_chars=strlen(string); else /* use value given on command line */ no_chars=len; /* Compute the correct spacewidth value (in charspace units): */ spacewidth=T1_GetCharWidth(FontID,pFontBase->pFontArray[FontID].space_position)+spaceoff; /* Allocate memory for character positions array: */ metrics.charpos=(int *)calloc(no_chars, sizeof(int)); metrics.numchars=no_chars; /* Accumulate metrics: */ for (i=0; ipFontArray[FontID].space_position) curr_width +=spacewidth; else{ tmp_BBox=T1_GetCharBBox( FontID, string[i]); if (curr_width+tmp_BBox.llx < lsb_min) lsb_min=curr_width+tmp_BBox.llx; if (curr_width+tmp_BBox.urx > rsb_max) rsb_max=curr_width+tmp_BBox.urx; if (tmp_BBox.lly < overalldescent) overalldescent=tmp_BBox.lly; if (tmp_BBox.ury > overallascent) overallascent=tmp_BBox.ury; curr_width +=T1_GetCharWidth( FontID, string[i]); if ((ipFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[0]); outbox.llx = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[1]); outbox.lly = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[2]); outbox.urx = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); obj = &(pFontBase->pFontArray[FontID].pType1Data->fontInfoP[FONTBBOX].value.data.arrayP[3]); outbox.ury = objPIsInteger(obj) ? obj->data.integer : obj->data.real > 0 ? (int) ceil(obj->data.real) : (int) floor(obj->data.real); return( outbox); } /* T1_GetAllCharNames(): Get a list of all defined character names in in the font FontID: */ char **T1_GetAllCharNames( int FontID) { static char **bufmem=NULL; register char *namedest; psdict *pCharStrings; int len, i, j; long nameoffset; int bufmemsize=0; /* return NULL if font not loaded */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( NULL); } pCharStrings=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; /* First, get number of charstrings: */ len=pCharStrings[0].key.len; /* We must be careful here: size of the charstrings dict might be larger than the actual number of charstrings. We correct for this by reducing the value of len appropriately */ for ( i=1; i<=len; i++){ /* calculate room for each characters name plus the prepending \0 */ if ((j=pCharStrings[i].key.len)){ bufmemsize += j + 1; } else{ /* we skip this (the remaining) entries */ len--; i--; } } /* Now we reserve memory for the pointers (including final NULL) */ nameoffset=(len+1)*sizeof( char *); bufmemsize += nameoffset; /* Now allocate memory, copy strings and initialize pointers */ if (bufmem!=NULL) free(bufmem); if ((bufmem=(char **)malloc( bufmemsize))==NULL){ T1_errno=T1ERR_ALLOC_MEM; return(NULL); } namedest=(char *)((long)bufmem + nameoffset); j=0; for ( i=0; ipFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } return( pFontBase->pFontArray[FontID].pAFMData->numOfPairs); } /* A function for comparing METRICS_ENTRY structs */ static int cmp_METRICS_ENTRY( const void *entry1, const void *entry2) { if (((METRICS_ENTRY *)entry1)->chars < ((METRICS_ENTRY *)entry2)->chars) return(-1); if (((METRICS_ENTRY *)entry1)->chars > ((METRICS_ENTRY *)entry2)->chars) return(1); return(0); /* This should not happen */ } /* A few functions for accessing composite character data: */ /* T1_GetNoCompositeChars(): Return the number of characters for for which composite character information is available for font FontID */ int T1_GetNoCompositeChars( int FontID) { /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -1); } /* If no AFM info is present, we return an error */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -1); } return( pFontBase->pFontArray[FontID].pAFMData->numOfComps); } /* T1_QueryCompositeChar(): Query whether char1 from font FontID is a composite character. If so, the index of the composite character data within the afm array is returned. The index can be used to retrieve the retrieve the composite character data. retval>=0: index into AFM-array where the corresponding composite char data is located retval=-1: No composite character, but result is valid, retval=-2: No composite character, but result is invalid. T1_errno indicated the reason. */ int T1_QueryCompositeChar( int FontID, char char1) { unsigned char uchar1; uchar1=char1; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -2); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( -2); } if (pFontBase->pFontArray[FontID].pEncMap[ uchar1]<0) { /* composite char */ return( -(pFontBase->pFontArray[FontID].pEncMap[(int) uchar1]+1)); } return(-1); } /* T1_GetCompCharData(): Retrieve data to construct composite character char1 from font FontID. In case of an error NULL is returned and T1_errno is set appropriately. */ T1_COMP_CHAR_INFO *T1_GetCompCharData( int FontID, char char1) { T1_COMP_CHAR_INFO *cci=NULL; CompCharData *ccd=NULL; int afmind=-1; int i; unsigned char uchar1; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( cci); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( cci); } if ((cci=(T1_COMP_CHAR_INFO*)malloc( sizeof(T1_COMP_CHAR_INFO)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( cci); } uchar1=(unsigned char)char1; /* set default values */ cci->compchar=uchar1; cci->numPieces=1; cci->pieces=NULL; /* check char1 */ if ((afmind=pFontBase->pFontArray[FontID].pEncMap[uchar1]) >= 0) { /* char is no composite char */ return(cci); } /* character is a composite char-> retrieve index and pointer into AFM data */ afmind=-(afmind+1); ccd=&(pFontBase->pFontArray[FontID].pAFMData->ccd[afmind]); /* cci->compchar is already setup correctly because char1 is a composite character */ cci->numPieces=ccd->numOfPieces; /* we expect numPieces to be >1 */ if ((cci->pieces=(T1_COMP_PIECE *)malloc( sizeof(T1_COMP_PIECE)* cci->numPieces))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( cci); return( NULL); } /* Copy information */ for (i=0; inumPieces; i++) { cci->pieces[i].piece=T1_GetEncodingIndex( FontID, ccd->pieces[i].pccName); cci->pieces[i].deltax=ccd->pieces[i].deltax; cci->pieces[i].deltay=ccd->pieces[i].deltay; } return( cci); } /* T1_GetCompCharDataByIndex(): Retrieve data to construct composite characters form font FontID. The data is addressed by index which may, for example, have been obtained by a call to T1_QueryCompositeChar(). In case of error NULL is returned and T1_errno is set appropriately. */ T1_COMP_CHAR_INFO *T1_GetCompCharDataByIndex( int FontID, int index) { T1_COMP_CHAR_INFO *cci=NULL; CompCharData *ccd=NULL; int i; /* Check whether font is loaded: */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( cci); } /* If no AFM info is present, we return -2 */ if (pFontBase->pFontArray[FontID].pAFMData==NULL) { T1_errno=T1ERR_NO_AFM_DATA; return( cci); } /* range check for index */ if ((index < 0) || (index >= pFontBase->pFontArray[FontID].pAFMData->numOfComps)) { T1_errno=T1ERR_INVALID_PARAMETER; return( cci); } /* Alloc mem */ if ((cci=(T1_COMP_CHAR_INFO*)malloc( sizeof(T1_COMP_CHAR_INFO)))==NULL) { T1_errno=T1ERR_ALLOC_MEM; return( cci); } /* set source pointer */ ccd=&(pFontBase->pFontArray[FontID].pAFMData->ccd[index]); /* and copy information */ cci->compchar=T1_GetEncodingIndex( FontID, ccd->ccName); cci->numPieces=ccd->numOfPieces; /* we expect numPieces to be >1 */ if ((cci->pieces=(T1_COMP_PIECE *)malloc( sizeof(T1_COMP_PIECE)* cci->numPieces))==NULL) { T1_errno=T1ERR_ALLOC_MEM; free( cci); return( NULL); } /* Copy information */ for (i=0; inumPieces; i++) { cci->pieces[i].piece=T1_GetEncodingIndex( FontID, ccd->pieces[i].pccName); cci->pieces[i].deltax=ccd->pieces[i].deltax; cci->pieces[i].deltay=ccd->pieces[i].deltay; } return( cci); } /* T1_IsInternalChar(): Query whether the character in encoding slot char1 of font FontID has an internal definition (CharString) or whether it is constructed by t1lib from elementary units */ int T1_IsInternalChar( int FontID, char char1) { unsigned char uchar1; char *charname; psdict *pCharStrings; int len, i, j; /* return NULL if font not loaded */ if (CheckForFontID(FontID)!=1){ T1_errno=T1ERR_INVALID_FONTID; return( -1); } pCharStrings=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; uchar1=(unsigned char)char1; charname=T1_GetCharName( FontID, uchar1); /* First, get the maximum number of charstrings: */ len=pCharStrings[0].key.len; /* Check all CharString definitions */ for ( i=1; i<=len; i++) { /* if len=0, then the CharStrings dict is larger that required which is valid and allowed by the spec.*/ if ((j=pCharStrings[i].key.len)!=0) { if ( (j==strlen(charname)) && (strncmp( charname, pCharStrings[i].key.data.nameP, j)==0) ) { /* we have found an internal definition */ return( 1); } } } return( 0); } grace-5.1.23/T1lib/Makefile0000644000076500001440000000430007244311605015042 0ustar fnevgenyusers##################################################### # Makefile for T1lib (bundled with Grace) # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) ALLCFLAGS = $(CFLAGS0) -I../.. $(CPPFLAGS) -DGLOBAL_CONFIG_DIR="\".\"" \ -DT1_AA_TYPE16=$(T1_AA_TYPE16) -DT1_AA_TYPE32=$(T1_AA_TYPE32) SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(ALLCFLAGS)' TYPE1_OBJS = \ type1/arith$(O) \ type1/curves$(O) \ type1/fontfcn$(O) \ type1/hints$(O) \ type1/lines$(O) \ type1/objects$(O) \ type1/paths$(O) \ type1/regions$(O) \ type1/scanfont$(O) \ type1/spaces$(O) \ type1/t1io$(O) \ type1/t1snap$(O) \ type1/t1stub$(O) \ type1/token$(O) \ type1/type1$(O) \ type1/util$(O) T1LIB_OBJS = \ t1lib/t1finfo$(O) \ t1lib/t1base$(O) \ t1lib/t1delete$(O) \ t1lib/t1enc$(O) \ t1lib/t1env$(O) \ t1lib/t1load$(O) \ t1lib/t1set$(O) \ t1lib/t1trans$(O) \ t1lib/t1aaset$(O) \ t1lib/t1afmtool$(O) \ t1lib/t1outline$(O) \ t1lib/t1subset$(O) \ t1lib/parseAFM$(O) TYPE1_SRCS = \ type1/arith.c \ type1/curves.c \ type1/fontfcn.c \ type1/hints.c \ type1/lines.c \ type1/objects.c \ type1/paths.c \ type1/regions.c \ type1/scanfont.c \ type1/spaces.c \ type1/t1io.c \ type1/t1snap.c \ type1/t1stub.c \ type1/token.c \ type1/type1.c \ type1/util.c T1LIB_SRCS = \ t1lib/t1finfo.c \ t1lib/t1base.c \ t1lib/t1delete.c \ t1lib/t1enc.c \ t1lib/t1env.c \ t1lib/t1load.c \ t1lib/t1set.c \ t1lib/t1trans.c \ t1lib/t1aaset.c \ t1lib/t1afmtool.c \ t1lib/t1outline.c \ t1lib/parseAFM.c LIBSUBDIRS = \ type1 \ t1lib all : libt1.a $(TYPE1_OBJS) : $(TYPE1_SRCS) (cd type1; $(SUBMAKE)) $(T1LIB_OBJS) : $(T1LIB_SRCS) (cd t1lib; $(SUBMAKE)) libt1.a : $(TYPE1_OBJS) $(T1LIB_OBJS) $(RM) $@ $(AR) cr $@ $(TYPE1_OBJS) $(T1LIB_OBJS) $(RANLIB) $@ .PHONY : clean clean : dummy for i in $(LIBSUBDIRS); do \ (cd $$i; $(MAKE) clean) || exit 1; \ done $(RM) libt1.a *~ distclean : dummy for i in $(LIBSUBDIRS); do \ (cd $$i; $(MAKE) clean) || exit 1; \ done $(RM) libt1.a *~ install : dummy links : dummy tests : dummy dummy : grace-5.1.23/T1lib/LICENSE0000644000076500001440000004307606626627165014442 0ustar fnevgenyusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. grace-5.1.23/T1lib/type1/0000755000076500001440000000000012032153126014440 5ustar fnevgenyusersgrace-5.1.23/T1lib/type1/ffilest.h0000644000076500001440000001030206626627165016266 0ustar fnevgenyusers/* * $XConsortium: fontfilest.h,v 1.3 91/07/16 20:15:16 keith Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTFILEST_H_ #define _FONTFILEST_H_ #ifdef XSERVER #include #else #include "types.h" #include "Xstuff.h" #endif #include "fontmisc.h" #include "fontstruct.h" #include "fontfile.h" #include "fontxlfd.h" typedef struct _FontName { char *name; short length; short ndashes; } FontNameRec; typedef struct _FontScaled { FontScalableRec vals; FontEntryPtr bitmap; FontPtr pFont; } FontScaledRec; typedef struct _FontScalableExtra { FontScalableRec defaults; int numScaled; int sizeScaled; FontScaledPtr scaled; pointer private; } FontScalableExtraRec; typedef struct _FontScalableEntry { FontRendererPtr renderer; char *fileName; FontScalableExtraPtr extra; } FontScalableEntryRec; /* * This "can't" work yet - the returned alias string must be permanent, * but this layer would need to generate the appropriate name from the * resolved scalable + the XLFD values passed in. XXX */ typedef struct _FontScaleAliasEntry { char *resolved; } FontScaleAliasEntryRec; typedef struct _FontBitmapEntry { FontRendererPtr renderer; char *fileName; FontPtr pFont; } FontBitmapEntryRec; typedef struct _FontAliasEntry { char *resolved; } FontAliasEntryRec; typedef struct _FontBCEntry { FontScalableRec vals; FontEntryPtr entry; } FontBCEntryRec; typedef struct _FontEntry { FontNameRec name; int type; union _FontEntryParts { FontScalableEntryRec scalable; FontBitmapEntryRec bitmap; FontAliasEntryRec alias; FontBCEntryRec bc; } u; } FontEntryRec; typedef struct _FontTable { int used; int size; FontEntryPtr entries; Bool sorted; } FontTableRec; typedef struct _FontDirectory { char *directory; ULONG dir_mtime; ULONG alias_mtime; FontTableRec scalable; FontTableRec nonScalable; } FontDirectoryRec; typedef struct _FontRenderer { char *fileSuffix; int fileSuffixLen; int (*OpenBitmap)(/* fpe, pFont, flags, entry, fileName, format, fmask */); int (*OpenScalable)(/* fpe, pFont, flags, entry, fileName, vals, format, fmask */); int (*GetInfoBitmap)(/* fpe, pFontInfo, entry, fileName */); int (*GetInfoScalable)(/* fpe, pFontInfo, entry, fileName, vals */); int number; } FontRendererRec; typedef struct _FontRenders { int number; FontRendererPtr *renderers; } FontRenderersRec, *FontRenderersPtr; typedef struct _BitmapInstance { FontScalableRec vals; FontBitmapEntryPtr bitmap; } BitmapInstanceRec, *BitmapInstancePtr; typedef struct _BitmapScalablePrivate { int numInstances; BitmapInstancePtr instances; } BitmapScalablePrivateRec, *BitmapScalablePrivatePtr; typedef struct _BitmapSources { FontPathElementPtr *fpe; int size; int count; } BitmapSourcesRec, *BitmapSourcesPtr; extern BitmapSourcesRec FontFileBitmapSources; #endif /* _FONTFILEST_H_ */ grace-5.1.23/T1lib/type1/hdigit.h0000644000076500001440000001237207244311605016075 0ustar fnevgenyusers/* $XConsortium: hdigit.h,v 1.2 91/10/10 11:18:11 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ /* ... and yet, I did it. The code would fail on ASCII-encrypted files if the lines were separated by instead of (which is typical DOSian, but appearently such files exist). Setting the 13th element in the two LUTs to HWHITE_SPACE cures the problem. (RMz (Author of t1lib), 2000-05-18) */ #ifndef HDIGIT #define HDIGIT 1 /* * Hex Digit Value Table -- * * The entries in the Digit Value Table map character codes in the set * {0-9,a-f,A-F} to their numeric values for readhexstring * (00 10...F0 for the high hex digit and 00 01...0F for the low). * The white-space and hex string termination characters are. * mapped to codes > 0xf0 to enable usage by several modules. * 2 tables are build HighHex and LowHex. * */ /* Indicators for special characters in these tables */ #define HERROR (0xfe) #define HWHITE_SPACE (0xfd) #define HRIGHT_ANGLE (0xfc) #define LAST_HDIGIT (0xf0) #define HighHexP (HighHex+1) unsigned char HighHex[257] = { 0xFF, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFD,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE }; #define LowHexP (LowHex+1) unsigned char LowHex[257] = { 0xFF, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFD,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE }; #endif grace-5.1.23/T1lib/type1/fontxlfd.h0000644000076500001440000000323206626627165016462 0ustar fnevgenyusers/* * $XConsortium: fontxlfd.h,v 1.1 91/05/11 09:12:07 rws Exp $ * * Copyright 1990 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTXLFD_H_ #define _FONTXLFD_H_ typedef struct _FontScalable { int pixel, point, x, y, width; } FontScalableRec, *FontScalablePtr; extern Bool FontParseXLFDName(); #define FONT_XLFD_REPLACE_NONE 0 #define FONT_XLFD_REPLACE_STAR 1 #define FONT_XLFD_REPLACE_ZERO 2 #define FONT_XLFD_REPLACE_VALUE 3 #endif /* _FONTXLFD_H_ */ grace-5.1.23/T1lib/type1/curves.c0000644000076500001440000001672306715154350016137 0ustar fnevgenyusers/* $XConsortium: curves.c,v 1.3 91/10/10 11:17:56 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 */ /* All Rights Reserved */ /* License to use, copy, modify, and distribute this software */ /* and its documentation for any purpose and without fee is */ /* hereby granted, provided that licensee provides a license to */ /* IBM, Corp. to use, copy, modify, and distribute derivative */ /* works and their documentation for any purpose and without */ /* fee, that the above copyright notice appear in all copies */ /* and that both that copyright notice and this permission */ /* notice appear in supporting documentation, and that the name */ /* of IBM not be used in advertising or publicity pertaining to */ /* distribution of the software without specific, written prior */ /* permission. */ /* IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES */ /* OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT */ /* LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, */ /* FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF */ /* THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND */ /* PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT */ /* OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF */ /* THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES */ /* THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN */ /* NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR */ /* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING */ /* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF */ /* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT */ /* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ /* SOFTWARE. */ /* :h1.CURVES Module - Stepping Beziers This module is responsible for "rasterizing" third order curves. That is, it changes the high level curve specification into a list of pels that that curve travels through. :h3.Include Files Include files needed: */ #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "curves.h" #include "lines.h" #include "arith.h" /* :h3.Functions Provided to Other Modules External entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that "stepping" and "flattening" are so similiar that they use the same routine. When the "region" parameter is NULL, that is a flag that we are flattening instead of stepping. */ /* :h2.Bezier Third Order Curves */ /* :h3.The "bezierinfo" Structure This structure is used to store information used when we subdivide Bezier curves. */ struct bezierinfo { struct region *region; /* the region being built or NULL */ struct fractpoint last; /* not used yet; maybe could save some work */ struct fractpoint origin; /* the origin of the bezier */ } ; /* Checking for termination of the subdivision process: This is the stupidest test in the world, just check if the coordinatewise distance from an end control point to the next control point is less than one half pel. If so, we must be done. This returns 1 if the subdivision is terminated and 0 if you still need to subdivide. */ int BezierTerminationTest(xa,ya,xb,yb,xc,yc,xd,yd) fractpel xa,ya,xb,yb,xc,yc,xd,yd; { fractpel dmax; dmax = TYPE1_ABS(xa - xb); dmax = TYPE1_MAX(dmax,TYPE1_ABS(ya - yb)); dmax = TYPE1_MAX(dmax,TYPE1_ABS(xd - xc)); dmax = TYPE1_MAX(dmax,TYPE1_ABS(yd - yc)); if(dmax > FPHALF) return(0); /* not done yet */ else return(1); /* done */ } /* :h3.StepBezierRecurse() - The Recursive Logic in StepBezier() The recursion involves dividing the control polygon into two smaller control polygons by finding the midpoints of the lines. This idea is described in any graphics text book and its simplicity is what caused Bezier to define his curves as he did. If the input region 'R' is NULL, the result is a path that is the 'flattened' curve; otherwise StepBezier returns nothing special. */ static struct segment *StepBezierRecurse(I,xA,yA,xB,yB,xC,yC,xD,yD) struct bezierinfo *I; /* Region under construction or NULL */ fractpel xA,yA; /* A control point */ fractpel xB,yB; /* B control point */ fractpel xC,yC; /* C control point */ fractpel xD,yD; /* D control point */ { if (BezierTerminationTest(xA,yA,xB,yB,xC,yC,xD,yD)) { if (I->region == NULL) return(PathSegment(LINETYPE, xD - xA, yD - yA)); else StepLine(I->region, I->origin.x + xA, I->origin.y + yA, I->origin.x + xD, I->origin.y + yD); } else { fractpel xAB,yAB; fractpel xBC,yBC; fractpel xCD,yCD; fractpel xABC,yABC; fractpel xBCD,yBCD; fractpel xABCD,yABCD; xAB = xA + xB; yAB = yA + yB; xBC = xB + xC; yBC = yB + yC; xCD = xC + xD; yCD = yC + yD; xABC = xAB + xBC; yABC = yAB + yBC; xBCD = xBC + xCD; yBCD = yBC + yCD; xABCD = xABC + xBCD; yABCD = yABC + yBCD; xAB >>= 1; yAB >>= 1; xBC >>= 1; yBC >>= 1; xCD >>= 1; yCD >>= 1; xABC >>= 2; yABC >>= 2; xBCD >>= 2; yBCD >>= 2; xABCD >>= 3; yABCD >>= 3; if (I->region == NULL) { return( Join( StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD), StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD) ) ); } else { StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD); StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD); } } /*NOTREACHED*/ /* To make ANSI-C-comnpiler happy (RMz): */ return(0); } /* :h3.TOOBIG() - Macro to Test if a Coordinate is Too Big to Bezier SubDivide Normally Intermediate values in the Bezier subdivision are 8 times bigger than the starting values. If this overflows, a 'long', we are in trouble: */ #define BITS (sizeof(LONG)*8) #define HIGHTEST(p) (((p)>>(BITS-4)) != 0) /* includes sign bit */ #define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy)) /* :h3.StepBezier() - Produce Run Ends for a Bezier Curve This is the entry point called from outside the module. */ struct segment *StepBezier(R, xA, yA, xB, yB, xC, yC, xD, yD) struct region *R; /* Region under construction or NULL */ fractpel xA,yA; /* A control point */ fractpel xB,yB; /* B control point */ fractpel xC,yC; /* C control point */ fractpel xD,yD; /* D control point */ { struct bezierinfo Info; Info.region = R; Info.origin.x = xA; Info.origin.y = yA; xB -= xA; xC -= xA; xD -= xA; yB -= yA; yC -= yA; yD -= yA; if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC) || TOOBIG(xD) || TOOBIG(yD) ) abort("Beziers this big not yet supported", 3); return(StepBezierRecurse(&Info, (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD)); } grace-5.1.23/T1lib/type1/scanfont.c0000644000076500001440000012537507521323636016450 0ustar fnevgenyusers/* $XConsortium: scanfont.c,v 1.9 92/07/07 17:14:56 gildea Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include #include "t1stdio.h" #include "util.h" #include "token.h" #include "fontfcn.h" #include "blues.h" /* #define DEBUG_SCANFONT */ static int rc; static boolean InPrivateDict; static boolean WantFontInfo; static boolean TwoSubrs; static psobj inputFile; static psobj filterFile; static psobj *inputP; extern int T1Getc(F_FILE * ); extern int T1Ungetc( int,F_FILE *); extern int SearchDictName( psdict *dictP, psobj *keyP); extern void T1io_setblocklen( long len); /* functions from util.c */ extern void objFormatInteger(psobj *objP, int value); extern void objFormatReal(psobj *objP, float value); extern void objFormatBoolean(psobj *objP, boolean value); extern void objFormatEncoding( psobj *objP, int length, psobj *valueP); extern void objFormatArray( psobj *objP, int length, psobj *valueP); extern void objFormatString( psobj *objP, int length, char *valueP); extern void objFormatName( psobj *objP, int length, char *valueP); extern void objFormatFile( psobj *objP, FILE *valueP); /**********************************************************************/ /* Init_BuiltInEncoding() */ /* */ /* Initializes the StandardEncoding. */ /* */ /**********************************************************************/ typedef struct /* Builtin Standard Encoding */ { int index; char *name; } EncodingTable; char not_def[]=".notdef"; static EncodingTable StdEnc[] = { {040 , "space"}, {041 , "exclam"}, {042 , "quotedbl"}, {043 , "numbersign"}, {044 , "dollar"}, {045 , "percent"}, {046 , "ampersand"}, {047 , "quoteright"}, {050 , "parenleft"}, {051 , "parenright"}, {052 , "asterisk"}, {053 , "plus"}, {054 , "comma"}, {055 , "hyphen"}, {056 , "period"}, {057 , "slash"}, {060 , "zero"}, {061 , "one"}, {062 , "two"}, {063 , "three"}, {064 , "four"}, {065 , "five"}, {066 , "six"}, {067 , "seven"}, {070 , "eight"}, {071 , "nine"}, {072 , "colon"}, {073 , "semicolon"}, {074 , "less"}, {075 , "equal"}, {076 , "greater"}, {077 , "question"}, {0100 , "at"}, {0101 , "A"}, {0102 , "B"}, {0103 , "C"}, {0104 , "D"}, {0105 , "E"}, {0106 , "F"}, {0107 , "G"}, {0110 , "H"}, {0111 , "I"}, {0112 , "J"}, {0113 , "K"}, {0114 , "L"}, {0115 , "M"}, {0116 , "N"}, {0117 , "O"}, {0120 , "P"}, {0121 , "Q"}, {0122 , "R"}, {0123 , "S"}, {0124 , "T"}, {0125 , "U"}, {0126 , "V"}, {0127 , "W"}, {0130 , "X"}, {0131 , "Y"}, {0132 , "Z"}, {0133 , "bracketleft"}, {0134 , "backslash"}, {0135 , "bracketright"}, {0136 , "asciicircum"}, {0137 , "underscore"}, {0140 , "quoteleft"}, {0141 , "a"}, {0142 , "b"}, {0143 , "c"}, {0144 , "d"}, {0145 , "e"}, {0146 , "f"}, {0147 , "g"}, {0150 , "h"}, {0151 , "i"}, {0152 , "j"}, {0153 , "k"}, {0154 , "l"}, {0155 , "m"}, {0156 , "n"}, {0157 , "o"}, {0160 , "p"}, {0161 , "q"}, {0162 , "r"}, {0163 , "s"}, {0164 , "t"}, {0165 , "u"}, {0166 , "v"}, {0167 , "w"}, {0170 , "x"}, {0171 , "y"}, {0172 , "z"}, {0173 , "braceleft"}, {0174 , "bar"}, {0175 , "braceright"}, {0176 , "asciitilde"}, {0241 , "exclamdown"}, {0242 , "cent"}, {0243 , "sterling"}, {0244 , "fraction"}, {0245 , "yen"}, {0246 , "florin"}, {0247 , "section"}, {0250 , "currency"}, {0251 , "quotesingle"}, {0252 , "quotedblleft"}, {0253 , "guillemotleft"}, {0254 , "guilsinglleft"}, {0255 , "guilsinglright"}, {0256 , "fi"}, {0257 , "fl"}, {0261 , "endash"}, {0262 , "dagger"}, {0263 , "daggerdbl"}, {0264 , "periodcentered"}, {0266 , "paragraph"}, {0267 , "bullet"}, {0270 , "quotesinglbase"}, {0271 , "quotedblbase"}, {0272 , "quotedblright"}, {0273 , "guillemotright"}, {0274 , "ellipsis"}, {0275 , "perthousand"}, {0277 , "questiondown"}, {0301 , "grave"}, {0302 , "acute"}, {0303 , "circumflex"}, {0304 , "tilde"}, {0305 , "macron"}, {0306 , "breve"}, {0307 , "dotaccent"}, {0310 , "dieresis"}, {0312 , "ring"}, {0313 , "cedilla"}, {0315 , "hungarumlaut"}, {0316 , "ogonek"}, {0317 , "caron"}, {0320 , "emdash"}, {0341 , "AE"}, {0343 , "ordfeminine"}, {0350 , "Lslash"}, {0351 , "Oslash"}, {0352 , "OE"}, {0353 , "ordmasculine"}, {0361 , "ae"}, {0365 , "dotlessi"}, {0370 , "lslash"}, {0371 , "oslash"}, {0372 , "oe"}, {0373 , "germandbls"}, { 0, 0 } }; /* Encodings changed from static to global since they must be accessible by T1_LoadFont() when reallocating memory. */ psobj *StdEncArrayP = NULL; static psobj *MakeEncodingArrayP(encodingTable) EncodingTable *encodingTable; { int i; psobj *encodingArrayP; encodingArrayP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!encodingArrayP) return NULL; /* initialize everything to .notdef */ for (i=0; i<256;i++) objFormatName(&(encodingArrayP[i]),7, not_def); for (i=0; encodingTable[i].name; i++) { objFormatName(&(encodingArrayP[encodingTable[i].index]), strlen(encodingTable[i].name), encodingTable[i].name); } return(encodingArrayP); } boolean Init_BuiltInEncoding() { StdEncArrayP = MakeEncodingArrayP(StdEnc); if (StdEncArrayP==NULL) return( FALSE); else return( TRUE); } /********************************************************************/ /***================================================================***/ static int getNextValue(valueType) int valueType; { scan_token(inputP); if (tokenType != valueType) { return(SCAN_ERROR); } return(SCAN_OK); } /***================================================================***/ /* This routine will set the global rc if there is an error */ /***================================================================***/ static int getInt() { scan_token(inputP); if (tokenType != TOKEN_INTEGER) { rc = SCAN_ERROR; return(0); } else { return( tokenValue.integer); } } /***================================================================***/ /* * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1, * for parsing Encoding. */ static int getEncoding(arrayP) psobj *arrayP; { scan_token(inputP); if ((tokenType == TOKEN_NAME) && ((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) ) { /* Adobe Standard Encoding */ if (tokenLength == 16) arrayP->data.valueP = (char *) StdEncArrayP; else return(SCAN_ERROR); arrayP->len = 256; return(SCAN_OK); } else if ( (tokenType == TOKEN_LEFT_BRACE) || (tokenType == TOKEN_LEFT_BRACKET) ) { /* Array of literal names */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++, objP++) { scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP,tokenLength,tokenStartP); } scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) return(SCAN_OK); } else { /* Must be sequences of ``dup put" */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++) objFormatName(objP + i, 7, not_def); while (TRUE) { scan_token(inputP); switch (tokenType) { case TOKEN_NAME: if (tokenLength == 3) { if (strncmp(tokenStartP,"dup",3) == 0) { /* get */ scan_token(inputP); if (tokenType != TOKEN_INTEGER || tokenValue.integer < 0 || tokenValue.integer > 255) return (SCAN_ERROR); i = tokenValue.integer; /* get */ scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP + i,tokenLength,tokenStartP); /* get "put" */ scan_token(inputP); if (tokenType != TOKEN_NAME) return(SCAN_ERROR); } else if (strncmp(tokenStartP,"def",3) == 0) return (SCAN_OK); } break; case TOKEN_EOF: case TOKEN_NONE: case TOKEN_INVALID: return (SCAN_ERROR); } } } return (SCAN_ERROR); } /***================================================================***/ static int getArray(arrayP) psobj *arrayP; { int N; /* count the items in the array */ psobj *objP; scan_token(inputP); if ( (tokenType != TOKEN_LEFT_BRACE) && (tokenType != TOKEN_LEFT_BRACKET) ) { return(SCAN_ERROR); } /* format the array in memory, save pointer to the beginning */ arrayP->data.valueP = tokenStartP; /* loop, picking up next object, until right BRACE or BRACKET */ N = 0; do { scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) { /* save then number of items in the array */ arrayP->len = N; return(SCAN_OK); } /* allocate the space for the object */ objP = (psobj *)vm_alloc(sizeof(psobj)); if (!(objP)) return(SCAN_OUT_OF_MEMORY); /* array is an array of numbers, (real or integer) */ if (tokenType == TOKEN_REAL) { objFormatReal(objP, tokenValue.real); } else if (tokenType == TOKEN_INTEGER) { objFormatInteger(objP, tokenValue.integer); } else return(SCAN_ERROR); N++; } while ( 1>0 ); /* NOTREACHED*/ } /***================================================================***/ /* is not needed */ /* static int getName(nameP) char *nameP; { do { scan_token(inputP); if (tokenType <= TOKEN_NONE) { if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(SCAN_ERROR); } } while ((tokenType != TOKEN_NAME) || (0 != strncmp(tokenStartP,nameP,strlen(nameP))) ); return(SCAN_OK); } */ /***================================================================***/ static int getNbytes(N) int N; { int I; if (N > vm_free_bytes()) { if (!vm_init()) return(SCAN_OUT_OF_MEMORY); } tokenStartP = vm_next_byte(); I = fread(tokenStartP,1,N,inputP->data.fileP); if ( I != N ) return(SCAN_FILE_EOF); return(SCAN_OK); } /***================================================================***/ /* getLiteralName(nameObjP) */ /* scan for next literal. */ /* if we encounter the name 'end' then terminate and say ok. */ /* It means that the CharStrings does not have as many characters */ /* as the dictionary said it would and that is ok. */ /***================================================================***/ static int getLiteralName(nameObjP) psobj *nameObjP; { do { scan_token(inputP); if (tokenType <= TOKEN_NONE) { if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(SCAN_ERROR); } if (tokenType == TOKEN_NAME) { if (0 == strncmp(tokenStartP,"end",3) ) { return(SCAN_END); } } } while (tokenType != TOKEN_LITERAL_NAME) ; nameObjP->len = tokenLength; /* allocate all the names in the CharStrings Structure */ if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); nameObjP->data.valueP = tokenStartP; /* found */ return(SCAN_OK); } /***================================================================***/ /* * BuildSubrs routine */ /***================================================================***/ static int BuildSubrs(FontP) psfont *FontP; { int N; /* number of values in Subrs */ int I; /* index into Subrs */ int i; /* loop thru Subrs */ int J; /* length of Subrs entry */ psobj *arrayP; /* next token should be a positive int */ /* note: rc is set by getInt. */ N = getInt(); if (rc) return(rc); if (N < 0 ) return(SCAN_ERROR); /* if we already have a Subrs, then skip the second one */ /* The second one is for hiresolution devices. */ if (FontP->Subrs.data.arrayP != NULL) { TwoSubrs = TRUE; /* process all the Subrs, but do not update anything */ /* can not just skip them because of the binary data */ for (i=0;iSubrs.len = N; FontP->Subrs.data.arrayP = arrayP; /* get N values for Subrs */ for (i=0;iCharStringsP = dictP; dictP[0].key.len = N; /* get N values for CharStrings */ for (i=1;i<=N;i++) { /* look for next literal name */ rc = getLiteralName(&(dictP[i].key)); /* If rc=SCAN_END, the end of file has been reached. This means there were less than N charstrings. This is perfectly valid. */ if (rc) return(rc); /* get 1 integer */ J = getInt(); if (rc) return(rc); /* if next token was not an Int */ if (J<0) return (SCAN_ERROR); dictP[i].value.len = J; /* get the next token, it should be RD or -|, either is ok */ rc = getNextValue(TOKEN_NAME); if ( rc != SCAN_OK ) return(rc); rc = getNbytes(J); if (rc == SCAN_OK) { dictP[i].value.data.valueP = tokenStartP; if ( !(vm_alloc(J)) ) return(SCAN_OUT_OF_MEMORY); } else { return(rc); } } return(SCAN_OK); } /***================================================================***/ /***================================================================***/ /* * BuildFontInfo Dictionary */ /***================================================================***/ static int BuildFontInfo(fontP) psfont *fontP; { psdict *dictP; /* allocate the private dictionary */ dictP = (psdict *)vm_alloc(20*sizeof(psdict)); if (!(dictP)) return(SCAN_OUT_OF_MEMORY); fontP->fontInfoP = dictP; fontP->fontInfoP[0].key.len = 17; /* number of actual entries */ objFormatName(&(dictP[FONTNAME].key),8,"FontName"); objFormatName(&(dictP[FONTNAME].value),0,NULL); objFormatName(&(dictP[PAINTTYPE].key),9,"PaintType"); objFormatInteger(&(dictP[PAINTTYPE].value),0); objFormatName(&(dictP[FONTTYPENUM].key),8,"FontType"); objFormatInteger(&(dictP[FONTTYPENUM].value),0); objFormatName(&(dictP[FONTMATRIX].key),10,"FontMatrix"); objFormatArray(&(dictP[FONTMATRIX].value),0,NULL); objFormatName(&(dictP[FONTBBOX].key),8,"FontBBox"); objFormatArray(&(dictP[FONTBBOX].value),0,NULL); objFormatName(&(dictP[ENCODING].key),8,"Encoding"); objFormatEncoding(&(dictP[ENCODING].value),0,NULL); objFormatName(&(dictP[UNIQUEID].key),8,"UniqueID"); objFormatInteger(&(dictP[UNIQUEID].value),0); objFormatName(&(dictP[STROKEWIDTH].key),11,"StrokeWidth"); objFormatReal(&(dictP[STROKEWIDTH].value),0.0); objFormatName(&(dictP[VERSION].key),7,"version"); objFormatString(&(dictP[VERSION].value),0,NULL); objFormatName(&(dictP[NOTICE].key),6,"Notice"); objFormatString(&(dictP[NOTICE].value),0,NULL); objFormatName(&(dictP[FULLNAME].key),8,"FullName"); objFormatString(&(dictP[FULLNAME].value),0,NULL); objFormatName(&(dictP[FAMILYNAME].key),10,"FamilyName"); objFormatString(&(dictP[FAMILYNAME].value),0,NULL); objFormatName(&(dictP[WEIGHT].key),6,"Weight"); objFormatString(&(dictP[WEIGHT].value),0,NULL); objFormatName(&(dictP[ITALICANGLE].key),11,"ItalicAngle"); objFormatReal(&(dictP[ITALICANGLE].value),0.0); objFormatName(&(dictP[ISFIXEDPITCH].key),12,"isFixedPitch"); objFormatBoolean(&(dictP[ISFIXEDPITCH].value),FALSE); objFormatName(&(dictP[UNDERLINEPOSITION].key),17,"UnderlinePosition"); objFormatReal(&(dictP[UNDERLINEPOSITION].value),0.0); objFormatName(&(dictP[UNDERLINETHICKNESS].key),18,"UnderlineThickness"); objFormatReal(&(dictP[UNDERLINETHICKNESS].value),0.0); return(SCAN_OK); } /***================================================================***/ /* * BuildPrivate Dictionary */ /* "LenIV" corrected to be "lenIV", otherwise fonts with some specific lenIV value could not be decrypted. (RMz, Author of t1lib, 06/03/1998)*/ /***================================================================***/ static int BuildPrivate(fontP) psfont *fontP; { psdict *Private; /* allocate the private dictionary */ Private = (psdict *)vm_alloc(20*sizeof(psdict)); if (!(Private)) return(SCAN_OUT_OF_MEMORY); fontP->Private = Private; fontP->Private[0].key.len = 16; /* number of actual entries */ objFormatName(&(Private[BLUEVALUES].key),10,"BlueValues"); objFormatArray(&(Private[BLUEVALUES].value),0,NULL); objFormatName(&(Private[OTHERBLUES].key),10,"OtherBlues"); objFormatArray(&(Private[OTHERBLUES].value),0,NULL); objFormatName(&(Private[FAMILYBLUES].key),11,"FamilyBlues"); objFormatArray(&(Private[FAMILYBLUES].value),0,NULL); objFormatName(&(Private[FAMILYOTHERBLUES].key),16,"FamilyOtherBlues"); objFormatArray(&(Private[FAMILYOTHERBLUES].value),0,NULL); objFormatName(&(Private[BLUESCALE].key),9,"BlueScale"); objFormatReal(&(Private[BLUESCALE].value),DEFAULTBLUESCALE); objFormatName(&(Private[BLUESHIFT].key),9,"BlueShift"); objFormatInteger(&(Private[BLUESHIFT].value),DEFAULTBLUESHIFT); objFormatName(&(Private[BLUEFUZZ].key),8,"BlueFuzz"); objFormatInteger(&(Private[BLUEFUZZ].value),DEFAULTBLUEFUZZ); objFormatName(&(Private[STDHW].key),5,"StdHW"); objFormatArray(&(Private[STDHW].value),0,NULL); objFormatName(&(Private[STDVW].key),5,"StdVW"); objFormatArray(&(Private[STDVW].value),0,NULL); objFormatName(&(Private[STEMSNAPH].key),9,"StemSnapH"); objFormatArray(&(Private[STEMSNAPH].value),0,NULL); objFormatName(&(Private[STEMSNAPV].key),9,"StemSnapV"); objFormatArray(&(Private[STEMSNAPV].value),0,NULL); objFormatName(&(Private[FORCEBOLD].key),9,"ForceBold"); objFormatBoolean(&(Private[FORCEBOLD].value),DEFAULTFORCEBOLD); objFormatName(&(Private[LANGUAGEGROUP].key),13,"LanguageGroup"); objFormatInteger(&(Private[LANGUAGEGROUP].value),DEFAULTLANGUAGEGROUP); objFormatName(&(Private[LENIV].key),5,"lenIV"); objFormatInteger(&(Private[LENIV].value),DEFAULTLENIV); objFormatName(&(Private[RNDSTEMUP].key),9,"RndStemUp"); objFormatBoolean(&(Private[RNDSTEMUP].value),DEFAULTRNDSTEMUP); objFormatName(&(Private[EXPANSIONFACTOR].key),9,"ExpansionFactor"); objFormatReal(&(Private[EXPANSIONFACTOR].value), DEFAULTEXPANSIONFACTOR); return(SCAN_OK); } /***================================================================***/ /**********************************************************************/ /* GetType1Blues(fontP) */ /* */ /* Routine to support font-level hints. */ /* */ /* Gets all the Blues information from the Private dictionary */ /* for the font. */ /* */ /* */ /**********************************************************************/ static int GetType1Blues(fontP) psfont *fontP; { psdict *PrivateDictP; /* the Private dict relating to hints */ struct blues_struct *blues; /* ptr for the blues struct we will allocate */ int i; psobj *HintEntryP; /* get the Private dictionary pointer */ PrivateDictP = fontP->Private; /* allocate the memory for the blues structure */ blues = (struct blues_struct *) vm_alloc(sizeof(struct blues_struct)); if (!blues) return(SCAN_OUT_OF_MEMORY); /* Make fontP's blues ptr point to this newly allocated structure. */ fontP->BluesP = blues; /* fill in the BlueValues array */ HintEntryP = &(PrivateDictP[BLUEVALUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numBlueValues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMBLUEVALUES) { blues->numBlueValues = NUMBLUEVALUES; } else blues->numBlueValues = HintEntryP->len; for (i = 0; i<= blues->numBlueValues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->BlueValues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->BlueValues[i] = HintEntryP->data.arrayP[i].data.real; else blues->BlueValues[i] = 0; } } /* fill in the OtherBlues array */ HintEntryP = &(PrivateDictP[OTHERBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numOtherBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMOTHERBLUES) { blues->numOtherBlues = NUMOTHERBLUES; } else blues->numOtherBlues = HintEntryP->len; for (i = 0; i<= blues->numOtherBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->OtherBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->OtherBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->OtherBlues[i] = 0; } } /* fill in the FamilyBlues array */ HintEntryP = &(PrivateDictP[FAMILYBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numFamilyBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMFAMILYBLUES) { blues->numFamilyBlues = NUMFAMILYBLUES; } else blues->numFamilyBlues = HintEntryP->len; for (i = 0; i<= blues->numFamilyBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->FamilyBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->FamilyBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->FamilyBlues[i] = 0; } } /* fill in the FamilyOtherBlues array */ HintEntryP = &(PrivateDictP[FAMILYOTHERBLUES].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numFamilyOtherBlues = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMFAMILYOTHERBLUES) { blues->numFamilyOtherBlues = NUMFAMILYOTHERBLUES; } else blues->numFamilyOtherBlues = HintEntryP->len; for (i = 0; i<= blues->numFamilyOtherBlues-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->FamilyOtherBlues[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->FamilyOtherBlues[i] = HintEntryP->data.arrayP[i].data.real; else blues->FamilyOtherBlues[i] = 0; } } /* fill in the StemSnapH array */ HintEntryP = &(PrivateDictP[STEMSNAPH].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numStemSnapH = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMSTEMSNAPH) { blues->numStemSnapH = NUMSTEMSNAPH; } else blues->numStemSnapH = HintEntryP->len; for (i = 0; i<= blues->numStemSnapH-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->StemSnapH[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->StemSnapH[i] = HintEntryP->data.arrayP[i].data.real; else blues->StemSnapH[i] = 0; } } /* fill in the StemSnapV array */ HintEntryP = &(PrivateDictP[STEMSNAPV].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) blues->numStemSnapV = 0; else { /* get the number of values in the array */ if (HintEntryP->len > NUMSTEMSNAPV) { blues->numStemSnapV = NUMSTEMSNAPV; } else blues->numStemSnapV = HintEntryP->len; for (i = 0; i<= blues->numStemSnapV-1; ++i) { if (objPIsInteger(&HintEntryP->data.arrayP[i])) blues->StemSnapV[i] = HintEntryP->data.arrayP[i].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[i])) blues->StemSnapV[i] = HintEntryP->data.arrayP[i].data.real; else blues->StemSnapV[i] = 0; } } /* fill in the StdVW array */ HintEntryP = &(PrivateDictP[STDVW].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) /* a value of zero signifies no entry */ blues->StdVW = 0.0; else { if (HintEntryP->len > NUMSTDVW) { } if (objPIsInteger(&HintEntryP->data.arrayP[0])) blues->StdVW = HintEntryP->data.arrayP[0].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[0])) blues->StdVW = HintEntryP->data.arrayP[0].data.real; else blues->StdVW = 0.0; } /* fill in the StdHW array */ HintEntryP = &(PrivateDictP[STDHW].value); /* check to see if the entry exists and if it's an array */ if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) /* a value of zero signifies no entry */ blues->StdHW = 0; else { if (HintEntryP->len > NUMSTDHW) { } if (objPIsInteger(&HintEntryP->data.arrayP[0])) blues->StdHW = HintEntryP->data.arrayP[0].data.integer; else if (objPIsReal(&HintEntryP->data.arrayP[0])) blues->StdHW = HintEntryP->data.arrayP[0].data.real; else blues->StdHW = 0; } /* get the ptr to the BlueScale entry */ HintEntryP = &(PrivateDictP[BLUESCALE].value); /* put the BlueScale in the blues structure */ if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueScale = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueScale = HintEntryP->data.real; else blues->BlueScale = DEFAULTBLUESCALE; /* get the ptr to the BlueShift entry */ HintEntryP = &(PrivateDictP[BLUESHIFT].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueShift = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueShift = HintEntryP->data.real; else blues->BlueShift = DEFAULTBLUESHIFT; /* get the ptr to the BlueFuzz entry */ HintEntryP = &(PrivateDictP[BLUEFUZZ].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->BlueFuzz = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) /* Error? */ blues->BlueFuzz = HintEntryP->data.real; else blues->BlueFuzz = DEFAULTBLUEFUZZ; /* get the ptr to the ForceBold entry */ HintEntryP = &(PrivateDictP[FORCEBOLD].value); if (objPIsBoolean(HintEntryP)) /* Must be integer! */ blues->ForceBold = HintEntryP->data.boolean; else blues->ForceBold = DEFAULTFORCEBOLD; /* get the ptr to the LanguageGroup entry */ HintEntryP = &(PrivateDictP[LANGUAGEGROUP].value); if (objPIsInteger(HintEntryP)) /* Must be integer! */ blues->LanguageGroup = HintEntryP->data.integer; else blues->LanguageGroup = DEFAULTLANGUAGEGROUP; /* get the ptr to the RndStemUp entry */ HintEntryP = &(PrivateDictP[RNDSTEMUP].value); if (objPIsBoolean(HintEntryP)) /* Must be integer! */ blues->RndStemUp = HintEntryP->data.boolean; else blues->RndStemUp = DEFAULTRNDSTEMUP; /* get the ptr to the lenIV entry */ HintEntryP = &(PrivateDictP[LENIV].value); if (objPIsInteger(HintEntryP)) {/* Must be integer! */ blues->lenIV = HintEntryP->data.integer; } else{ blues->lenIV = DEFAULTLENIV; } /* get the ptr to the ExpansionFactor entry */ HintEntryP = &(PrivateDictP[EXPANSIONFACTOR].value); if (objPIsInteger(HintEntryP)) blues->ExpansionFactor = HintEntryP->data.integer; else if (objPIsReal(HintEntryP)) blues->ExpansionFactor = HintEntryP->data.real; else blues->ExpansionFactor = DEFAULTEXPANSIONFACTOR; return(SCAN_OK); } /**********************************************************************/ /* GetType1CharString(fontP,code) */ /* */ /* Look up code in the standard encoding vector and return */ /* the charstring associated with the character name. */ /* */ /* fontP is the psfont structure. */ /* */ /* Returns a psobj (string) */ /**********************************************************************/ psobj *GetType1CharString(fontP, code) psfont *fontP; unsigned char code; { int N; /* the 'Nth' entry in the CharStrings */ psobj *charnameP; /* points to psobj that is name of character*/ psdict *CharStringsDictP; /* dictionary with char strings */ psobj *theStringP; /* the definition for the code */ if (StdEncArrayP == NULL) { return(NULL); } /* use the code to index into the standard encoding vector */ charnameP = &(StdEncArrayP[code]); /* test if the encoding array points to a name */ if (!(objPIsName(charnameP)) ) { return(NULL); } /* Now that we have the character name out of the standardencoding */ /* get the character definition out of the current font */ CharStringsDictP = fontP->CharStringsP; /* search the chars string for this charname as key */ N = SearchDictName(CharStringsDictP,charnameP); if (N<=0) { return(NULL); } /* OK, the nth item is the psobj that is the string for this char */ theStringP = &(CharStringsDictP[N].value); return(theStringP); } /***================================================================***/ /* * FindDictValue */ /***================================================================***/ static int FindDictValue(dictP) psdict *dictP; { psobj LitName; int N; int V; /* we have just scanned a token and it is a literal name */ /* need to check if that name is in Private dictionary */ objFormatName(&LitName,tokenLength,tokenStartP); /* is it in the dictP */ N = SearchDictName(dictP,&LitName); /* if found */ if ( N > 0 ) { /* what type */ switch (dictP[N].value.type) { case OBJ_ENCODING: V = getEncoding(&(dictP[N].value)); if ( V != SCAN_OK ) return(V); break; case OBJ_ARRAY: V = getArray(&(dictP[N].value)); if ( V != SCAN_OK ) return(V); break; case OBJ_INTEGER: /* next value in integer */ dictP[N].value.data.integer = getInt(); if (rc) return(rc); /* if next token was not an Int */ break; case OBJ_REAL: /* next value must be real or int, store as a real */ scan_token(inputP); if (tokenType == TOKEN_REAL) { dictP[N].value.data.real = tokenValue.real; } else if (tokenType == TOKEN_INTEGER) { dictP[N].value.data.real = tokenValue.integer; } else return(SCAN_ERROR); break; case OBJ_NAME: V = getNextValue(TOKEN_LITERAL_NAME); if ( V != SCAN_OK ) return(V); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(&(dictP[N].value),tokenLength,tokenStartP); break; case OBJ_STRING: V = getNextValue(TOKEN_STRING); if ( V != SCAN_OK ) return(V); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatString(&(dictP[N].value),tokenLength,tokenStartP); break; case OBJ_BOOLEAN: scan_token(inputP); if (tokenType != TOKEN_NAME) { return(SCAN_ERROR); } if (0 == strncmp(tokenStartP,"true",4) ) { dictP[N].value.data.boolean =TRUE; } else if (0 == strncmp(tokenStartP,"false",5) ) { dictP[N].value.data.boolean =FALSE; } else return(SCAN_ERROR); break; default: return(SCAN_ERROR); break; } } /* Name is not in dictionary. That is ok. */ return(SCAN_OK); } /***================================================================***/ /* * ------------------------------------------------------------------- * Scan the next token and convert it into an object * Result is placed on the Operand Stack as next object * ------------------------------------------------------------------- */ int scan_font(FontP) psfont *FontP; { char filename[128]; FILE *fileP; char *nameP; int namelen; /* copy the filename and remove leading or trailing blanks */ /* point to name and search for leading blanks */ nameP= FontP->FontFileName.data.nameP; namelen = FontP->FontFileName.len; while (nameP[0] == ' ') { nameP++; namelen--; } /* now remove any trailing blanks */ while ((namelen>0) && ( nameP[namelen-1] == ' ')) { namelen--; } strncpy(filename,nameP,namelen); filename[namelen] = '\0'; /* file name is now constructed */ inputFile.data.fileP = NULL; filterFile.data.fileP = NULL; inputP = &inputFile; if ((fileP = fopen(filename,"rb"))!=NULL) { objFormatFile(inputP,fileP); } else { return(SCAN_FILE_OPEN_ERROR); }; WantFontInfo = TRUE; InPrivateDict = FALSE; TwoSubrs = FALSE; rc = BuildFontInfo(FontP); #ifdef DEBUG_SCANFONT printf("BuildFontInfo(): retval=%d\n", rc); #endif if (rc != 0) return(rc); /* Assume everything will be OK */ rc = 0; /* Loop until complete font is read */ do { /* Scan the next token */ scan_token(inputP); /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ /* now set */ switch (tokenType) { case TOKEN_EOF: case TOKEN_NONE: case TOKEN_INVALID: /* in this case we are done */ if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); rc = SCAN_ERROR; break; case TOKEN_LITERAL_NAME: /* Look up the name */ tokenStartP[tokenLength] = '\0'; /* At this point we check for the font not being a Multiple Master Font. If it is, we return an error. (RMz, 01/29/1999) */ if (strncmp(tokenStartP, "BlendAxisTypes", 14)==0){ rc=SCAN_MMFONT; break; } if (InPrivateDict ) { if (0== strncmp(tokenStartP,"Subrs",5) ) { rc = BuildSubrs(FontP); #ifdef DEBUG_SCANFONT printf("BuildSubrs(): retval=%d\n", rc); #endif break; } if (0== strncmp(tokenStartP,"CharStrings",11) ) { rc = BuildCharStrings(FontP); #ifdef DEBUG_SCANFONT printf("BuildCharstrings(): retval=%d\n", rc); #endif if ( (rc == SCAN_OK) ||(rc == SCAN_END) ) { fclose(inputP->data.fileP); /* Build the Blues Structure */ rc = GetType1Blues(FontP); #ifdef DEBUG_SCANFONT printf("GetType1Blues(): retval=%d\n", rc); #endif /* whatever the return code, return it */ /* all the work is done. This is the normal exit.*/ return(rc); } break; } rc = FindDictValue(FontP->Private); /* we are not going to report errors */ /* Sometimes the font file may test a value such as */ /* testing to see if the font is alreadly loaded with */ /* same UniqueID. We would faile on /UniqueID get */ /* because we are expecting a int to follow UniqueID*/ /* If the correct object type does not follow a Name*/ /* then we will skip over it without reporting error*/ rc = SCAN_OK; break; } /* end of reading Private dictionary */ else if (0== strncmp(tokenStartP,"Private",7) ) { InPrivateDict = TRUE; rc = BuildPrivate(FontP); break; } else if (WantFontInfo) { rc = FindDictValue(FontP->fontInfoP); /* we are not going to report errors */ rc = SCAN_OK; break; } break; case TOKEN_NAME: if (0 == strncmp(tokenStartP,"eexec",5) ) { /* We check for the pfb-headers in I/O-module */ filterFile.data.fileP = T1eexec(inputP->data.fileP); if (filterFile.data.fileP == NULL) { fclose(inputFile.data.fileP); return(SCAN_FILE_OPEN_ERROR); } inputP = &filterFile; WantFontInfo = FALSE; } break; } } while (rc ==0); fclose(inputP->data.fileP); if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); return(rc); } grace-5.1.23/T1lib/type1/t1imager.h0000644000076500001440000001057406626627166016357 0ustar fnevgenyusers/* $XConsortium: t1imager.h,v 1.5 92/03/20 14:36:05 keith Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include "types.h" #include "fontmisc.h" typedef pointer xobject; typedef pointer location; typedef pointer path; typedef pointer region; /* typedef pointer XYspace; */ #ifndef NOEXTERNS /* The following are the user entry locations to TYPE1IMAGER */ extern path t1_Bezier(); extern path t1_ClosePath(); extern xobject t1_Destroy(); extern xobject t1_Dup(); extern char *t1_ErrorMsg(); extern void t1_InitImager(); extern region t1_Interior(); extern location t1_ILoc(); extern xobject t1_Join(); extern path t1_Line(); extern xobject t1_Permanent(); extern path t1_Phantom(); extern location t1_Loc(); extern xobject t1_Scale(); extern xobject t1_Snap(); extern location t1_SubLoc(); extern xobject t1_Temporary(); #endif #ifndef NULL #define NULL 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /* Here are some TYPE1IMAGER functions that are defined in terms of others: */ #define t1_AddLoc(p1,p2) t1_Join(p1,p2) #ifndef NONAMES /* Define the simple form of all the subroutine names: */ #define AddLoc(p1,p2) t1_AddLoc(p1,p2) #define Bezier(B,C,D) t1_Bezier(B,C,D) #define ClosePath(p) t1_ClosePath(p,0) #define Complement(area) t1_Complement(area) #define Destroy(o) t1_Destroy(o) #define Dup(o) t1_Dup(o) #define ErrorMsg() t1_ErrorMsg() #define HeadSegment(p) t1_HeadSegment(p) #define InitImager() t1_InitImager() #define Interior(p,rule) t1_Interior(p,rule) #define ILoc(S,x,y) t1_ILoc(S,x,y) #define Join(p1,p2) t1_Join(p1,p2) #define Line(P) t1_Line(P) #define Permanent(o) t1_Permanent(o) #define Phantom(o) t1_Phantom(o) #define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y) #define Scale(o,sx,sy) t1_Scale(o,(DOUBLE)sx,(DOUBLE)sy) #define Snap(o) t1_Snap(o) #define SubLoc(a,b) t1_SubLoc(a,b) #define Temporary(o) t1_Temporary(o) #define TermImager() t1_TermImager() #define Transform(o,cxx,cyx,cxy,cyy) t1_Transform(o,(DOUBLE)cxx,(DOUBLE)cyx,\ (DOUBLE)cxy,(DOUBLE)cyy) #endif #define WINDINGRULE -2 #define EVENODDRULE -3 #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ /* Stroke() line style constants: */ /* Coordinate space constants: */ /* #define IDENTITY t1_Identity extern XYspace *IDENTITY; */ /* Generic null object definition: */ #define NULLOBJECT ((xobject)NULL) /* Null path definition: */ #define NULLPATH NULLOBJECT /* Full page and null region definition: */ #ifndef NOEXTERNS extern region *t1_Infinity; #endif #define NULLREGION NULLOBJECT #define FF_PARSE_ERROR 2 /* Previously 5 */ #define FF_PATH_ERROR 1 /* Changed from FF_PATH */ #define FF_PATH 33 /* Some arbitrary value */ extern pointer xiStub(); grace-5.1.23/T1lib/type1/blues.h0000644000076500001440000000752606626627165015762 0ustar fnevgenyusers/* $XConsortium: blues.h,v 1.2 91/10/10 11:17:52 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * Portions Copyright (c) 1990 Adobe Systems Incorporated. * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark or Adobe * not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "types.h" extern psobj *GetType1CharString(); #define TOPLEFT 1 #define BOTTOMRIGHT 2 #define NUMBLUEVALUES 14 #define NUMOTHERBLUES 10 #define NUMFAMILYBLUES 14 #define NUMFAMILYOTHERBLUES 10 #define NUMSTEMSNAPH 12 #define NUMSTEMSNAPV 12 #define NUMSTDHW 1 #define NUMSTDVW 1 #define DEFAULTBOLDSTEMWIDTH 2.0 #define MAXALIGNMENTZONES ((NUMBLUEVALUES+NUMOTHERBLUES)/2) #define DEFAULTBLUESCALE 0.039625 #define DEFAULTBLUESHIFT 7 #define DEFAULTBLUEFUZZ 1 #define DEFAULTSTDHW 0 #define DEFAULTSTDVW 0 #define DEFAULTFORCEBOLD FALSE #define DEFAULTLANGUAGEGROUP 0 #define DEFAULTRNDSTEMUP FALSE #define DEFAULTLENIV 4 #define DEFAULTEXPANSIONFACTOR 0.06 /* see Type 1 Font Format book for explanations of these values */ /* Note that we're currently doing nothing for minfeature and password. */ struct blues_struct { struct blues_struct *next; /* ptr to next Blues structure in list */ int numBlueValues; /* # of BlueValues in following array */ int BlueValues[NUMBLUEVALUES]; int numOtherBlues; /* # of OtherBlues values in following array */ int OtherBlues[NUMOTHERBLUES]; int numFamilyBlues; /* # of FamilyBlues values in following array */ int FamilyBlues[NUMFAMILYBLUES]; int numFamilyOtherBlues; /* # of FamilyOtherBlues values in */ int FamilyOtherBlues[NUMFAMILYOTHERBLUES]; /* this array */ DOUBLE BlueScale; int BlueShift; int BlueFuzz; DOUBLE StdHW; DOUBLE StdVW; int numStemSnapH; /* # of StemSnapH values in following array */ DOUBLE StemSnapH[NUMSTEMSNAPH]; int numStemSnapV; /* # of StemSnapV values in following array */ DOUBLE StemSnapV[NUMSTEMSNAPV]; int ForceBold; int LanguageGroup; int RndStemUp; int lenIV; DOUBLE ExpansionFactor; }; /* the alignment zone structure -- somewhat similar to the stem structure */ /* see Adobe Type1 Font Format book about the terms used in this structure */ struct alignmentzone { int topzone; /* TRUE if a topzone, FALSE if a bottom zone */ DOUBLE bottomy, topy; /* interval of this alignment zone */ }; grace-5.1.23/T1lib/type1/pictures.h0000644000076500001440000000366107415144745016475 0ustar fnevgenyusers/* $XConsortium: pictures.h,v 1.2 91/10/10 11:18:53 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define CopyPicture(p) p #define UniquePicture(p) p /* #define KillPicture(p) */ #define BegHandle(o,m) o #define EndHandle(o,m) o #define PictureBounds(P) P struct picture { struct fractpoint origin; struct fractpoint ending; }; #define Phantom(o) t1_Phantom(o) #define Snap(o) t1_Snap(o) struct segment *t1_Phantom(); struct segment *t1_Snap(); grace-5.1.23/T1lib/type1/digit.h0000644000076500001440000000621506626627165015742 0ustar fnevgenyusers/* $XConsortium: digit.h,v 1.2 91/10/10 11:18:01 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ #ifndef DIGIT #define DIGIT 1 /* * Digit Value Table -- * * The entries in the Digit Value Table map character * codes in the set {0-9,a-z,A-Z} to their numeric * values as part of numbers of radix 2-36. * */ unsigned char digit_value[256] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }; #endif grace-5.1.23/T1lib/type1/README.RMz0000644000076500001440000000075006626627165016056 0ustar fnevgenyusersDear Folks, this directory basically contains the Type 1 rasterizer code, donated to the X11-project by IBM and afterwards modified by Piet Tutelaers for his ps2pk-package. But there are several files modified by myself. Thus the state of this directory is not an official one and subject to further changes! Before version 0.6 of t1lib I have cleaned the sources, removed the X11-dummy function and made the sources more ANSI-C compliant. (03/09/1998, RMz) grace-5.1.23/T1lib/type1/util.h0000644000076500001440000001715106626627166015621 0ustar fnevgenyusers/* $XConsortium: util.h,v 1.3 92/03/26 16:42:29 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifndef UTIL_H #define UTIL_H #include "types.h" #ifndef boolean typedef int boolean; #endif #ifndef TRUE #define TRUE (1) #endif #ifndef FALSE #define FALSE (0) #endif /***================================================================***/ /* Portable definitions for 2's complement machines. * NOTE: These really should be based on PostScript types, * for example, sizeof(ps_integer), or sizeof(ps_unsigned) */ #define MAX_ULONG (~(ULONG)(0)) /* This code is portable, assuming K&R C and 2's complement arithmetic */ #define MAX_INTEGER \ ((LONG)((((ULONG) 1)<<(sizeof(ULONG)*8-1))-1)) #define MIN_INTEGER ((-MAX_INTEGER)-1) #define MAX_ARRAY_CNT (65535) #define MAX_DICT_CNT (65535) #define MAX_STRING_LEN (65535) #define MAX_NAME_LEN (128) /* this is the size of memory allocated for reading fonts */ #define VM_SIZE (50*1024) /***================================================================***/ #ifndef TYPE1_MIN #define TYPE1_MIN(a,b) (((a)<(b)) ? a : b ) #endif /***================================================================***/ /* Routines for managing virtual memory */ /***================================================================***/ extern boolean vm_init(); extern LONG vm_free; extern LONG vm_size; extern char *vm_next; extern char *vm_alloc(); /***================================================================***/ /* Macros for managing virtual memory */ /***================================================================***/ #define vm_next_byte() (vm_next) #define vm_free_bytes() (vm_free) #define vm_avail(B) (B <= vm_free) /***================================================================***/ /* Types of PostScript objects */ /***================================================================***/ #define OBJ_INTEGER (0) #define OBJ_REAL (1) #define OBJ_BOOLEAN (2) #define OBJ_ARRAY (3) #define OBJ_STRING (4) #define OBJ_NAME (5) #define OBJ_FILE (6) #define OBJ_ENCODING (7) /***================================================================***/ /* Value of PostScript objects */ /***================================================================***/ typedef union ps_value { char *valueP; /* value pointer for unspecified type */ int value; /* value for unspecified type */ int integer; /* when type is OBJ_INTEGER */ float real; /* when type is OBJ_REAL */ int boolean; /* when type is OBJ_BOOLEAN */ struct ps_obj *arrayP; /* when type is OBJ_ARRAY */ unsigned char *stringP; /* when type is OBJ_STRING */ char *nameP; /* when type is OBJ_NAME */ FILE *fileP; /* when type is OBJ_FILE */ } psvalue; /***================================================================***/ /* Definition of a PostScript object */ /***================================================================***/ typedef struct ps_obj { char type; char unused; unsigned short len; union ps_value data; } psobj; /***================================================================***/ /* Definition of a PostScript Dictionary Entry */ /***================================================================***/ typedef struct ps_dict { psobj key; psobj value; } psdict; /***================================================================***/ /* Macros for testing type of PostScript objects */ /***================================================================***/ #define objIsInteger(o) ((o).type == OBJ_INTEGER) #define objIsReal(o) ((o).type == OBJ_REAL) #define objIsBoolean(o) ((o).type == OBJ_BOOLEAN) #define objIsArray(o) ((o).type == OBJ_ARRAY) #define objIsString(o) ((o).type == OBJ_STRING) #define objIsName(o) ((o).type == OBJ_NAME) #define objIsFile(o) ((o).type == OBJ_FILE) /***================================================================***/ /* Macros for setting type of PostScript objects */ /***================================================================***/ #define objSetInteger(o) ((o).type = OBJ_INTEGER) #define objSetReal(o) ((o).type = OBJ_REAL) #define objSetBoolean(o) ((o).type = OBJ_BOOLEAN) #define objSetArray(o) ((o).type = OBJ_ARRAY) #define objSetString(o) ((o).type = OBJ_STRING) #define objSetName(o) ((o).type = OBJ_NAME) #define objSetFile(o) ((o).type = OBJ_FILE) /***================================================================***/ /* Macros for testing type of PostScript objects (pointer access) */ /***================================================================***/ #define objPIsInteger(o) ((o)->type == OBJ_INTEGER) #define objPIsReal(o) ((o)->type == OBJ_REAL) #define objPIsBoolean(o) ((o)->type == OBJ_BOOLEAN) #define objPIsArray(o) ((o)->type == OBJ_ARRAY) #define objPIsString(o) ((o)->type == OBJ_STRING) #define objPIsName(o) ((o)->type == OBJ_NAME) #define objPIsFile(o) ((o)->type == OBJ_FILE) /***================================================================***/ /* Macros for setting type of PostScript objects (pointer access) */ /***================================================================***/ #define objPSetInteger(o) ((o)->type = OBJ_INTEGER) #define objPSetReal(o) ((o)->type = OBJ_REAL) #define objPSetBoolean(o) ((o)->type = OBJ_BOOLEAN) #define objPSetArray(o) ((o)->type = OBJ_ARRAY) #define objPSetString(o) ((o)->type = OBJ_STRING) #define objPSetName(o) ((o)->type = OBJ_NAME) #define objPSetFile(o) ((o)->type = OBJ_FILE) /***================================================================***/ /* Entry point for Type1Char to get entry from CharStrings */ /***================================================================***/ extern psobj *GetType1CharString(); #endif grace-5.1.23/T1lib/type1/tokst.h0000644000076500001440000007231006626627166016006 0ustar fnevgenyusers/* $XConsortium: tokst.h,v 1.2 91/10/10 11:20:00 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* -------------------------------------- */ /* --- MACHINE GENERATED, DO NOT EDIT --- */ /* -------------------------------------- */ #ifndef TOKST #define TOKST 1 /* * State Index Tables -- * * These tables map the input character to the * proper entry in the Class Action Table. * There is one table for each state. * */ #define s0 (si0+2) static unsigned char si0[258] = { 0x10,0x11, 0x02,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x02,0x02,0x0F,0x0F,0x02,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x02,0x0F,0x0F,0x0F,0x0F,0x03,0x0F,0x0F,0x05,0x0B,0x0F,0x0D,0x0F,0x0D,0x0E,0x04, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x0F,0x08,0x0F,0x0C,0x0F, 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x0A,0x0F,0x0F, 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x09,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F }; #define s1 (si1+2) static unsigned char si1[258] = { 0x14,0x15, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13 }; #define s2 (si2+2) static unsigned char si2[258] = { 0x1B,0x1C, 0x16,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x16,0x16,0x1A,0x1A,0x16,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x16,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x1A,0x17,0x17,0x1A,0x1A,0x1A,0x1A,0x19,0x17, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1A,0x1A,0x17,0x1A,0x17,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A }; #define s3 (si3+2) static unsigned char si3[258] = { 0x23,0x24, 0x1D,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1D,0x1D,0x22,0x22,0x1D,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x1D,0x22,0x22,0x20,0x22,0x1E,0x22,0x22,0x1E,0x1E,0x22,0x22,0x22,0x22,0x1F,0x1E, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22, 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22 }; #define s4 (si4+2) static unsigned char si4[258] = { 0x29,0x2A, 0x25,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x28,0x28,0x25,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x25,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x26, 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x28,0x26,0x28,0x26,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28 }; #define s5 (si5+2) static unsigned char si5[258] = { 0x30,0x31, 0x2B,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2B,0x2B,0x2F,0x2F,0x2B,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2B,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2F,0x2C,0x2C,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C, 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F }; #define s6 (si6+2) static unsigned char si6[258] = { 0x36,0x37, 0x32,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x32,0x32,0x35,0x35,0x32,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x32,0x35,0x35,0x35,0x35,0x33,0x35,0x35,0x33,0x33,0x35,0x35,0x35,0x35,0x35,0x33, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35, 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35 }; #define s7 (si7+2) static unsigned char si7[258] = { 0x3D,0x3E, 0x38,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x38,0x38,0x3C,0x3C,0x38,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x38,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x3C,0x39,0x39,0x3C,0x3A,0x3C,0x3A,0x3C,0x39, 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x39,0x3C,0x39,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C }; #define s8 (si8+2) static unsigned char si8[258] = { 0x43,0x44, 0x3F,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3F,0x3F,0x42,0x42,0x3F,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x3F,0x42,0x42,0x42,0x42,0x40,0x42,0x42,0x40,0x40,0x42,0x42,0x42,0x42,0x42,0x40, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x42,0x40,0x42,0x40,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42 }; #define s9 (si9+2) static unsigned char si9[258] = { 0x48,0x49, 0x45,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x45,0x45,0x47,0x47,0x45,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x45,0x47,0x47,0x47,0x47,0x46,0x47,0x47,0x46,0x46,0x47,0x47,0x47,0x47,0x47,0x46, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47 }; #define s10 (si10+2) static unsigned char si10[258] = { 0x4E,0x4F, 0x4A,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4A,0x4A,0x4D,0x4D,0x4A,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4A,0x4D,0x4D,0x4D,0x4D,0x4B,0x4D,0x4D,0x4B,0x4B,0x4D,0x4D,0x4D,0x4D,0x4D,0x4B, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4D,0x4D,0x4B,0x4D,0x4B,0x4D, 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D }; #define s11 (si11+2) static unsigned char si11[258] = { 0x53,0x54, 0x50,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x50,0x50,0x52,0x52,0x50,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x50,0x52,0x52,0x52,0x52,0x51,0x52,0x52,0x51,0x51,0x52,0x52,0x52,0x52,0x52,0x51, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52 }; /* * Class Action Table -- * * The entries in the Class Action Table indicate the * action routine to be called, and the next state to * enter, for each relevant character class in each. * state. There are several entries for each state. * */ static int AAH_NAME(); static int BREAK_SIGNAL(); static int HEX_STRING(); static int IMMED_NAME(); static int INTEGER(); static int LEFT_BRACE(); static int LEFT_BRACKET(); static int LITERAL_NAME(); static int NAME(); static int NO_TOKEN(); static int OOPS_NAME(); static int RADIX_NUMBER(); static int REAL(); static int RIGHT_ANGLE(); static int RIGHT_BRACE(); static int RIGHT_BRACKET(); static int RIGHT_PAREN(); static int STRING(); static int add_1st_decpt(); static int add_1st_digits(); static int add_char(); static int add_decpt(); static int add_digits(); static int add_e_sign(); static int add_exponent(); static int add_fraction(); static int add_r_digits(); static int add_radix(); static int add_sign(); static int next_char(); static int skip_comment(); static int skip_space(); static struct cat { int (*actionRoutineP)(); unsigned char *nextStateP; } classActionTable[] = { /* s0: Classify initial character */ /* 00 ALPHA */ {NAME, s0}, /* executable name */ /* 01 DIGIT */ {add_1st_digits, s3}, /* number? */ /* 02 WHITE_SPACE */ {skip_space, s0}, /* skip white space */ /* 03 PERCENT */ {skip_comment, s0}, /* comment? */ /* 04 SLASH */ {next_char, s1}, /* literal or imm name */ /* 05 LEFT_PAREN */ {STRING, s0}, /* string */ /* 06 LEFT_BRACE */ {LEFT_BRACE, s0}, /* begin procedure body */ /* 07 LEFT_BRACKET */ {LEFT_BRACKET, s0}, /* begin array */ /* 08 LEFT_ANGLE */ {HEX_STRING, s0}, /* hex string? */ /* 09 RIGHT_BRACE */ {RIGHT_BRACE, s0}, /* end procedure body */ /* 0A RIGHT_BRACKET */ {RIGHT_BRACKET, s0}, /* end array */ /* 0B RIGHT_PAREN */ {RIGHT_PAREN, s0}, /* unmatched right paren */ /* 0C RIGHT_ANGLE */ {RIGHT_ANGLE, s0}, /* unmatched right angle */ /* 0D SIGN */ {add_sign, s2}, /* signed number? */ /* 0E DECIMAL_POINT */ {add_1st_decpt, s4}, /* real number? */ /* 0F ANY */ {NAME, s0}, /* executable name */ /* 10 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 11 EOF */ {NO_TOKEN, s0}, /* no token found */ /* s1: Further classify a '/' */ /* 12 SLASH */ {IMMED_NAME, s0}, /* immediate name */ /* 13 ANY */ {LITERAL_NAME, s0}, /* literal name */ /* 14 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 15 EOF */ {OOPS_NAME, s0}, /* isolated sign */ /* s2: sign */ /* 16 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated sign */ /* 17 SPECIAL */ {OOPS_NAME, s0}, /* isolated sign */ /* 18 DIGIT */ {add_digits, s3}, /* number? */ /* 19 DECIMAL_POINT */ {add_decpt, s4}, /* real number? */ /* 1A ANY */ {NAME, s0}, /* executable name */ /* 1B BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 1C EOF */ {OOPS_NAME, s0}, /* isolated sign */ /* s3: sign? digit+ */ /* 1D WHITE_SPACE */ {INTEGER, s0}, /* n-digit integer */ /* 1E SPECIAL */ {INTEGER, s0}, /* n-digit integer */ /* 1F DECIMAL_POINT */ {add_char, s5}, /* real number? */ /* 20 POUND */ {add_radix, s10}, /* radix number? */ /* 21 eE */ {add_char, s7}, /* real with exponent? */ /* 22 ANY */ {AAH_NAME, s0}, /* executable name */ /* 23 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 24 EOF */ {INTEGER, s0}, /* n-digit integer */ /* s4: sign? . */ /* 25 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* 26 SPECIAL */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* 27 DIGIT */ {add_fraction, s6}, /* number? */ /* 28 ANY */ {NAME, s0}, /* executable name */ /* 29 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 2A EOF */ {OOPS_NAME, s0}, /* isolated +. or -. */ /* s5: sign? digit+ . */ /* 2B WHITE_SPACE */ {REAL, s0}, /* real with fraction */ /* 2C SPECIAL */ {REAL, s0}, /* real with fraction */ /* 2D eE */ {add_char, s7}, /* real with exponent? */ /* 2E DIGIT */ {add_fraction, s6}, /* number? */ /* 2F ANY */ {AAH_NAME, s0}, /* executable name */ /* 30 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 31 EOF */ {REAL, s0}, /* real with fraction */ /* s6: sign? (digit+ . digit+) | (. digit+) */ /* 32 WHITE_SPACE */ {REAL, s0}, /* real with fraction */ /* 33 SPECIAL */ {REAL, s0}, /* real with fraction */ /* 34 eE */ {add_char, s7}, /* real with exponent? */ /* 35 ANY */ {AAH_NAME, s0}, /* executable name */ /* 36 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 37 EOF */ {REAL, s0}, /* real with fraction */ /* s7: sign? ((digit+ (. digit*)?) | (. digit+)) Ee */ /* 38 WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ /* 39 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ /* 3A SIGN */ {add_e_sign, s8}, /* real w signed exponent? */ /* 3B DIGIT */ {add_exponent, s9}, /* real w exponent ? */ /* 3C ANY */ {AAH_NAME, s0}, /* executable name */ /* 3D BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 3E EOF */ {OOPS_NAME, s0}, /* invalid real number */ /* s8: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign */ /* 3F WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ /* 40 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ /* 41 DIGIT */ {add_exponent, s9}, /* real w exponent? */ /* 42 ANY */ {AAH_NAME, s0}, /* executable name */ /* 43 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 44 EOF */ {OOPS_NAME, s0}, /* invalid real number */ /* s9: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign? digit+ */ /* 45 WHITE_SPACE */ {REAL, s0}, /* real w exponent */ /* 46 SPECIAL */ {REAL, s0}, /* real w exponent */ /* 47 ANY */ {AAH_NAME, s0}, /* executable name */ /* 48 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 49 EOF */ {REAL, s0}, /* real w exponent */ /* s10: digit+ # */ /* 4A WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid radix number */ /* 4B SPECIAL */ {OOPS_NAME, s0}, /* invalid radix number */ /* 4C R_DIGIT */ {add_r_digits, s11}, /* radix number? */ /* 4D ANY */ {AAH_NAME, s0}, /* executable name */ /* 4E BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 4F EOF */ {OOPS_NAME, s0}, /* invalid radix number */ /* s11: digit+ # r_digit+ */ /* 50 WHITE_SPACE */ {RADIX_NUMBER, s0}, /* radix number */ /* 51 SPECIAL */ {RADIX_NUMBER, s0}, /* radix number */ /* 52 ANY */ {AAH_NAME, s0}, /* executable name */ /* 53 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ /* 54 EOF */ {RADIX_NUMBER, s0} /* radix number */ }; /* * Character Classification Tables -- * * The entries in the Character Classification Tables * map character codes to character classes. The * tables contains one entry per code. The bits in * each entry indicate which classes the character * code belongs to. * * The macros 'isInCLASS(ch)' generate code to test * whether 'ch' is a character in 'CLASS'. * */ /* Membership macros for classes defined in table 1 ... */ #define isRADIX_DIGIT(c) ((isInP1[c] & 0x80) != 0) #define isHEX_DIGIT(c) ((isInP1[c] & 0x40) != 0) #define isDECIMAL_DIGIT(c) ((isInP1[c] & 0x10) != 0) #define isOCTAL_DIGIT(c) ((isInP1[c] & 0x20) != 0) /* Membership macros for classes defined in table 2 ... */ #define isWHITE_SPACE(c) ((isInP2[c] & 0x80) != 0) #define isCOMMENT(c) ((isInP2[c] & 0x40) != 0) #define isNAME(c) ((isInP2[c] & 0x20) != 0) #define isSTRING_SPECIAL(c) ((isInP2[c] & 0x10) != 0) #define isNUMBER_ENDER(c) ((isInP2[c] & 0x08) != 0) #define isInP1 (isInT1+2) static unsigned char isInT1[258] = { 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xD0,0xD0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; #define isInP2 (isInT2+2) static unsigned char isInT2[258] = { 0x18,0x18, 0xC8,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC8,0x88,0x60,0x60,0x98,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0xC8,0x60,0x60,0x60,0x60,0x48,0x60,0x60,0x58,0x58,0x60,0x60,0x60,0x60,0x60,0x48, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x70,0x48,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60 }; #endif grace-5.1.23/T1lib/type1/arith.h0000644000076500001440000000420506626627165015746 0ustar fnevgenyusers/* $XConsortium: arith.h,v 1.2 91/10/10 11:17:49 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" void DLmult(),DLdiv(),DLadd(),DLsub(); fractpel FPmult(); fractpel FPdiv(); fractpel FPstarslash(); /*END SHARED*/ /*SHARED*/ #define SHORTSIZE (sizeof(SHORT)*8) #define LONGSIZE (SHORTSIZE*2) #define MAXSHORT ((1<> N) + (((ULONG) dl.high) << (LONGSIZE - N)); \ dl.high >>= N; \ } /*END SHARED*/ grace-5.1.23/T1lib/type1/paths.c0000644000076500001440000014544107244311605015743 0ustar fnevgenyusers/* $XConsortium: paths.c,v 1.4 91/10/10 11:18:40 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* PATHS CWEB V0021 ******** */ /* :h1 id=paths.PATHS Module - Path Operator Handler This is the module that is responsible for building and transforming path lists. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include /* after the system includes (dsr) */ #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" /* understands about Union */ #include "fonts.h" /* understands about TEXTTYPEs */ #include "pictures.h" /* understands about handles */ #include "strokes.h" /* understands how to coerce stroke paths */ #include "trig.h" static int UnClose(); /* :h3.Routines Available to the TYPE1IMAGER User The PATHS routines that are made available to the outside user are: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to Other Modules The path routines that are made available to other TYPE1IMAGER modules are defined here: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* NOTE: because of the casts put in the macros for Loc, ArcCA, Conic, RoundConic, PathSegment, and JoinSegment, we cannot use the macro names when the functions are actually defined. We have to use the unique names with their unique first two characters. Thus, if anyone in the future ever decided to change the first two characters, it would not be enough just to change the macro (as it would for most other functions). He would have to also change the function definition. */ /* :h3.Macros Provided to Other Modules The CONCAT macro is defined here and used in the STROKES module. See :hdref refid=pathmac.. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Path Segment Structures A path is represented as a linked list of the following structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* When 'link' is NULL, we are at the last segment in the path (surprise!). 'last' is only non-NULL on the first segment of a path, for all the other segments 'last' == NULL. We test for a non-NULL 'last' (ISPATHANCHOR predicate) when we are given an alleged path to make sure the user is not trying to pull a fast one on us. A path may be a collection of disjoint paths. Every break in the disjoint path is represented by a MOVETYPE segment. Closed paths are discussed in :hdref refid=close.. :h3.CopyPath() - Physically Duplicating a Path This simple function illustrates moving through the path linked list. Duplicating a segment just involves making a copy of it, except for text, which has some auxilliary things involved. We don't feel competent to duplicate text in this module, so we call someone who knows how (in the FONTS module). */ struct segment *CopyPath(p0) register struct segment *p0; /* path to duplicate */ { register struct segment *p,*n=NULL,*last=NULL,*anchor; for (p = p0, anchor = NULL; p != NULL; p = p->link) { ARGCHECK((!ISPATHTYPE(p->type) || (p != p0 && p->last != NULL)), "CopyPath: invalid segment", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) n = (struct segment *) CopyText(p); else n = (struct segment *)Allocate(p->size, p, 0); n->last = NULL; if (anchor == NULL) anchor = n; else last->link = n; last = n; } /* At this point we have a chain of newly allocated segments hanging off 'anchor'. We need to make sure the first segment points to the last: */ if (anchor != NULL) { n->link = NULL; anchor->last = n; } return(anchor); } /* :h3.KillPath() - Destroying a Path Destroying a path is simply a matter of freeing each segment in the linked list. Again, we let the experts handle text. */ void KillPath(p) register struct segment *p; /* path to destroy */ { register struct segment *linkp; /* temp register holding next segment*/ /* return conditional based on reference count 3-26-91 PNM */ if ( (--(p->references) > 1) || ( (p->references == 1) && !ISPERMANENT(p->flag) ) ) return; while (p != NULL) { if (!ISPATHTYPE(p->type)) { ArgErr("KillPath: bad segment", p, NULL); return; } linkp = p->link; if (p->type == TEXTTYPE) KillText(p); else Free(p); p = linkp; } } /* :h2 id=location."location" Objects The TYPE1IMAGER user creates and destroys objects of type "location". These objects locate points for the primitive path operators. We play a trick here and store these objects in the same "segment" structure used for paths, with a type field == MOVETYPE. This allows the Line() operator, for example, to be very trivial: It merely stamps its input structure as a LINETYPE and returns it to the caller--assuming, of course, the input structure was not permanent (as it usually isn't). :h3.The "movesegment" Template Structure This template is used as a generic segment structure for Allocate: */ /* added reference field 1 to temporary template below 3-26-91 PNM */ static struct segment movetemplate = { MOVETYPE, 0, 1, sizeof(struct segment), 0, NULL, NULL, {0, 0} }; /* :h3.Loc() - Create an "Invisible Line" Between (0,0) and a Point */ struct segment *t1_Loc(S, x, y) register struct XYspace *S; /* coordinate space to interpret X,Y */ DOUBLE x,y; /* destination point */ { register struct segment *r; IfTrace3((MustTraceCalls),"..Loc(S=%p, x=%f, y=%f)\n", S, x, y); r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); r->last = r; r->context = S->context; (*S->convert)(&r->dest, S, x, y); ConsumeSpace(S); return(r); } /* :h3.ILoc() - Loc() With Integer Arguments */ struct segment *ILoc(S, x, y) register struct XYspace *S; /* coordinate space to interpret X,Y */ register int x,y; /* destination point */ { register struct segment *r; IfTrace3((MustTraceCalls),"..ILoc(S=%p, x=%d, y=%d)\n", S, (LONG) x, (LONG) y); r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); r->last = r; r->context = S->context; (*S->iconvert)(&r->dest, S, (LONG) x, (LONG) y); ConsumeSpace(S); return(r); } /* :h3.SubLoc() - Vector Subtraction of Two Locition Objects This user operator subtracts two location objects, yielding a new location object that is the result. The symmetrical function AddLoc() is totally redundent with Join(), so it is not provided. */ struct segment *SubLoc(p1, p2) register struct segment *p1; register struct segment *p2; { IfTrace2((MustTraceCalls),"SubLoc(%p, %p)\n", p1, p2); ARGCHECK(!ISLOCATION(p1), "SubLoc: bad first arg", p1, NULL, (0), struct segment *); ARGCHECK(!ISLOCATION(p2), "SubLoc: bad second arg", p2, NULL, (0), struct segment *); p1 = UniquePath(p1); p1->dest.x -= p2->dest.x; p1->dest.y -= p2->dest.y; ConsumePath(p2); return(p1); } /* :h2.Straight Line Segments :h3.PathSegment() - Create a Generic Path Segment Many routines need a LINETYPE or MOVETYPE path segment, but do not want to go through the external user's interface, because, for example, they already know the "fractpel" destination of the segment and the conversion is unnecessary. PathSegment() is an internal routine provided to the rest of TYPE1IMAGER for handling these cases. */ struct segment *t1_PathSegment(type, x, y) int type; /* LINETYPE or MOVETYPE */ fractpel x,y; /* where to go to, if known */ { register struct segment *r; /* newly created segment */ r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); r->type = type; r->last = r; /* last points to itself for singleton */ r->dest.x = x; r->dest.y = y; return(r); } /* :h3.Line() - Create a Line Segment Between (0,0) and a Point P This involves just creating and filling out a segment structure: */ struct segment *Line(P) register struct segment *P; /* relevant coordinate space */ { IfTrace1((MustTraceCalls),"..Line(%p)\n", P); ARGCHECK(!ISLOCATION(P), "Line: arg not a location", P, NULL, (0), struct segment *); P = UniquePath(P); P->type = LINETYPE; return(P); } /* :h2.Curved Path Segments We need more points to describe curves. So, the structures for curved path segments are slightly different. The first part is identical; the curved structures are larger with the extra points on the end. :h3.Bezier Segment Structure We support third order Bezier curves. They are specified with four control points A, B, C, and D. The curve starts at A with slope AB and ends at D with slope CD. The curvature at the point A is inversely related to the length |AB|, and the curvature at the point D is inversely related to the length |CD|. Point A is always point (0,0). */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Bezier() - Generate a Bezier Segment This is just a simple matter of filling out a 'beziersegment' structure: */ struct beziersegment *Bezier(B, C, D) register struct segment *B; /* second control point */ register struct segment *C; /* third control point */ register struct segment *D; /* fourth control point (ending point) */ { /* added reference field of 1 to temporary template below 3-26-91 PNM */ static struct beziersegment template = { BEZIERTYPE, 0, 1, sizeof(struct beziersegment), 0, NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 } }; register struct beziersegment *r; /* output segment */ IfTrace3((MustTraceCalls),"..Bezier(%p, %p, %p)\n", B, C, D); ARGCHECK(!ISLOCATION(B), "Bezier: bad B", B, NULL, (2,C,D), struct beziersegment *); ARGCHECK(!ISLOCATION(C), "Bezier: bad C", C, NULL, (2,B,D), struct beziersegment *); ARGCHECK(!ISLOCATION(D), "Bezier: bad D", D, NULL, (2,B,C), struct beziersegment *); r = (struct beziersegment *)Allocate(sizeof(struct beziersegment), &template, 0); r->last = (struct segment *) r; r->dest.x = D->dest.x; r->dest.y = D->dest.y; r->B.x = B->dest.x; r->B.y = B->dest.y; r->C.x = C->dest.x; r->C.y = C->dest.y; ConsumePath(B); ConsumePath(C); ConsumePath(D); return(r); } /* :h2.Font "Hint" Segments :h3.Hint() - A Font 'Hint' Segment This is temporary code while we experiment with hints. */ /*SHARED LINE(S) ORIGINATED HERE*/ struct hintsegment *Hint(S, ref, width, orientation, hinttype, adjusttype, direction, label) struct XYspace *S; float ref; float width; char orientation; char hinttype; char adjusttype; char direction; int label; { /* added reference field of 1 to hintsegment template below 3-26-91 PNM */ static struct hintsegment template = { HINTTYPE, 0, 1, sizeof(struct hintsegment), 0, NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 }, ' ', ' ', ' ', ' ', 0}; register struct hintsegment *r; r = (struct hintsegment *)Allocate(sizeof(struct hintsegment), &template, 0); r->orientation = orientation; if (width == 0.0) width = 1.0; if (orientation == 'h') { (*S->convert)(&r->ref, S, 0.0, ref); (*S->convert)(&r->width, S, 0.0, width); } else if (orientation == 'v') { (*S->convert)(&r->ref, S, ref, 0.0); (*S->convert)(&r->width, S, width, 0.0); } else return((struct hintsegment *)ArgErr("Hint: orient not 'h' or 'v'", NULL, NULL)); if (r->width.x < 0) r->width.x = - r->width.x; if (r->width.y < 0) r->width.y = - r->width.y; r->hinttype = hinttype; r->adjusttype = adjusttype; r->direction = direction; r->label = label; r->last = (struct segment *) r; ConsumeSpace(S); return(r); } /* */ /*SHARED LINE(S) ORIGINATED HERE*/ /* POP removes the first segment in a path 'p' and Frees it. 'p' is left pointing to the end of the path: */ #define POP(p) \ { register struct segment *linkp; \ linkp = p->link; \ if (linkp != NULL) \ linkp->last = p->last; \ Free(p); \ p = linkp; } /* INSERT inserts a single segment in the middle of a chain. 'b' is the segment before, 'p' the segment to be inserted, and 'a' the segment after. */ #define INSERT(b,p,a) b->link=p; p->link=a; p->last=NULL /* :h3.Join() - Join Two Objects Together If these are paths, this operator simply invokes the CONCAT macro. Why so much code then, you ask? Well we have to check for object types other than paths, and also check for certain path consistency rules. */ struct segment *Join(p1, p2) register struct segment *p1,*p2; { IfTrace2((MustTraceCalls && PathDebug > 1),"..Join(%p, %p)\n", p1, p2); IfTrace2((MustTraceCalls && PathDebug <=1),"..Join(%p, %p)\n", p1, p2); /* We start with a whole bunch of very straightforward argument tests: */ if (p2 != NULL) { if (!ISPATHTYPE(p2->type)) { if (p1 == NULL) return((struct segment *)Unique(p2)); switch (p1->type) { case REGIONTYPE: case STROKEPATHTYPE: p1 = CoercePath(p1); break; default: return((struct segment *)BegHandle(p1, p2)); } } ARGCHECK((p2->last == NULL), "Join: right arg not anchor", p2, NULL, (1,p1), struct segment *); p2 = UniquePath(p2); /* In certain circumstances, we don't have to duplicate a permanent location. (We would just end up destroying it anyway). These cases are when 'p2' begins with a move-type segment: */ if (p2->type == TEXTTYPE || p2->type == MOVETYPE) { if (p1 == NULL) return(p2); if (ISLOCATION(p1)) { p2->dest.x += p1->dest.x; p2->dest.y += p1->dest.y; ConsumePath(p1); return(p2); } } } else return((struct segment *)Unique(p1)); if (p1 != NULL) { if (!ISPATHTYPE(p1->type)) switch (p2->type) { case REGIONTYPE: case STROKEPATHTYPE: p2 = CoercePath(p2); break; default: return((struct segment *)EndHandle(p1, p2)); } ARGCHECK((p1->last == NULL), "Join: left arg not anchor", p1, NULL, (1,p2), struct segment *); p1 = UniquePath(p1); } else return(p2); /* At this point all the checking is done. We have two temporary non-null path types in 'p1' and 'p2'. If p1 ends with a MOVE, and p2 begins with a MOVE, we collapse the two MOVEs into one. We enforce the rule that there may not be two MOVEs in a row: */ if (p1->last->type == MOVETYPE && p2->type == MOVETYPE) { p1->last->flag |= p2->flag; p1->last->dest.x += p2->dest.x; p1->last->dest.y += p2->dest.y; POP(p2); if (p2 == NULL) return(p1); } /* Now we check for another silly rule. If a path has any TEXTTYPEs, then it must have only TEXTTYPEs and MOVETYPEs, and furthermore, it must begin with a TEXTTYPE. This rule makes it easy to check for the special case of text. If necessary, we will coerce TEXTTYPEs into paths so we don't mix TEXTTYPEs with normal paths. */ if (p1->type == TEXTTYPE) { if (p2->type != TEXTTYPE && !ISLOCATION(p2)) p1 = CoerceText(p1); } else { if (p2->type == TEXTTYPE) { if (ISLOCATION(p1)) { p2->dest.x += p1->dest.x; p2->dest.y += p1->dest.y; Free(p1); return(p2); } else p2 = CoerceText(p2); } } /* Thank God! Finally! It's hard to believe, but we are now able to actually do the join. This is just invoking the CONCAT macro: */ CONCAT(p1, p2); return(p1); } /* :h3.JoinSegment() - Create a Path Segment and Join It to a Known Path This internal function is quicker than a full-fledged join because it can do much less checking. */ struct segment *t1_JoinSegment(before, type, x, y, after) register struct segment *before; /* path to join before new segment */ int type; /* type of new segment (MOVETYPE or LINETYPE) */ fractpel x,y; /* x,y of new segment */ register struct segment *after; /* path to join after new segment */ { register struct segment *r; /* returned path built here */ r = PathSegment(type, x, y); if (before != NULL) { CONCAT(before, r); r = before; } else r->context = after->context; if (after != NULL) CONCAT(r, after); return(r); } /* :h2.Other Path Functions */ struct segment *t1_ClosePath(p0,lastonly) register struct segment *p0; /* path to close */ register int lastonly; /* flag deciding to close all subpaths or... */ { register struct segment *p,*last=NULL,*start; /* used in looping through path */ register fractpel x,y; /* current position in path */ register fractpel firstx=0,firsty=0; /* start position of sub path */ register struct segment *lastnonhint=NULL; /* last non-hint segment in path */ IfTrace1((MustTraceCalls),"ClosePath(%p)\n", p0); if (p0 != NULL && p0->type == TEXTTYPE) return(UniquePath(p0)); if (p0->type == STROKEPATHTYPE) return((struct segment *)Unique(p0)); /* * NOTE: a null closed path is different from a null open path * and is denoted by a closed (0,0) move segment. We make * sure this path begins and ends with a MOVETYPE: */ if (p0 == NULL || p0->type != MOVETYPE) p0 = JoinSegment(NULL, MOVETYPE, 0, 0, p0); TYPECHECK("ClosePath", p0, MOVETYPE, NULL, (0), struct segment *); if (p0->last->type != MOVETYPE) p0 = JoinSegment(p0, MOVETYPE, 0, 0, NULL); p0 = UniquePath(p0); /* We now begin a loop through the path, incrementing current 'x' and 'y'. We are searching for MOVETYPE segments (breaks in the path) that are not already closed. At each break, we insert a close segment. */ for (p = p0, x = y = 0, start = NULL; p != NULL; x += p->dest.x, y += p->dest.y, last = p, p = p->link) { if (p->type == MOVETYPE) { if (start != NULL && (lastonly?p->link==NULL:TRUE) && !(ISCLOSED(start->flag) && LASTCLOSED(last->flag))) { register struct segment *r; /* newly created */ start->flag |= ISCLOSED(ON); r = PathSegment(LINETYPE, firstx - x, firsty - y); INSERT(last, r, p); r->flag |= LASTCLOSED(ON); /*< adjust 'last' if possible for a 0,0 close >*/ { #define CLOSEFUDGE 3 /* if we are this close, let's change last segment */ if (r->dest.x != 0 || r->dest.y != 0) { if (r->dest.x <= CLOSEFUDGE && r->dest.x >= -CLOSEFUDGE && r->dest.y <= CLOSEFUDGE && r->dest.y >= -CLOSEFUDGE) { IfTrace2((PathDebug), "ClosePath forced closed by (%d,%d)\n", r->dest.x, r->dest.y); lastnonhint->dest.x += r->dest.x; lastnonhint->dest.y += r->dest.y; r->dest.x = r->dest.y = 0; } } } if (p->link != NULL) { p->dest.x += x - firstx; p->dest.y += y - firsty; x = firstx; y = firsty; } } start = p; firstx = x + p->dest.x; firsty = y + p->dest.y; } else if (p->type != HINTTYPE) lastnonhint = p; } return(p0); } /* */ /* :h2.Reversing the Direction of a Path This turned out to be more difficult than I thought at first. The trickiness was due to the fact that closed paths must remain closed, etc. We need three subroutines: */ static struct segment *SplitPath(); /* break a path at any point */ static struct segment *DropSubPath(); /* breaks a path after first sub-path */ static struct segment *ReverseSubPath(); /* reverses a single sub-path */ /* :h3.Reverse() - User Operator to Reverse a Path This operator reverses the entire path. */ struct segment *Reverse(p) register struct segment *p; /* full path to reverse */ { register struct segment *r; /* output path built here */ register struct segment *nextp; /* contains next sub-path */ IfTrace1((MustTraceCalls),"Reverse(%p)\n", p); if (p == NULL) return(NULL); ARGCHECK(!ISPATHANCHOR(p), "Reverse: invalid path", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) p = CoerceText(p); p = UniquePath(p); r = NULL; do { nextp = DropSubPath(p); p = ReverseSubPath(p); r = Join(p, r); p = nextp; } while (p != NULL); return(r); } /* :h4.ReverseSubPath() - Subroutine to Reverse a Single Sub-Path */ static struct segment *ReverseSubPath(p) register struct segment *p; /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ register int wasclosed; /* flag, path was closed */ if (p == NULL) return(NULL); wasclosed = ISCLOSED(p->flag); r = NULL; do { /* First we reverse the direction of this segment and clean up its flags: */ p->dest.x = - p->dest.x; p->dest.y = - p->dest.y; p->flag &= ~(ISCLOSED(ON) | LASTCLOSED(ON)); switch (p->type) { case LINETYPE: case MOVETYPE: break; case CONICTYPE: { /* The logic of this is that the new M point (stored relative to the new beginning) is (M - C). However, C ("dest") has already been reversed So, we add "dest" instead of subtracting it: */ register struct conicsegment *cp = (struct conicsegment *) p; cp->M.x += p->dest.x; cp->M.y += p->dest.y; } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; bp->B.x += p->dest.x; bp->B.y += p->dest.y; bp->C.x += p->dest.x; bp->C.y += p->dest.y; } break; case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; hp->ref.x = -hp->ref.x; hp->ref.y = -hp->ref.y; } break; default: abort("Reverse: bad path segment", 23); } /* We need to reverse the order of segments too, so we break this segment off of the input path, and tack it on the front of the growing path in 'r': */ nextp = p->link; p->link = NULL; p->last = p; if (r != NULL) CONCAT(p,r); /* leaves result in 'p'... not what we want */ r = p; p = nextp; /* advance to next segment in input path */ } while (p != NULL); if (wasclosed) r = ClosePath(r); return(r); } /* :h4.DropSubPath() - Drops the First Sub-Path Off a Path This subroutine returns the remaining sub-path(s). While doing so, it breaks the input path after the first sub-path so that a pointer to the original path now contains the first sub-path only. */ static struct segment *DropSubPath(p0) register struct segment *p0; /* original path */ { register struct segment *p; /* returned remainder here */ for (p = p0; p->link != NULL; p = p->link) { if (p->link->type == MOVETYPE) break; } return(SplitPath(p0, p)); } static struct segment *SplitPath(anchor, before) register struct segment *anchor; register struct segment *before; { register struct segment *r; if (before == anchor->last) return(NULL); r = before->link; r->last = anchor->last; anchor->last = before; before->link = NULL; return(r); } /* :h3.ReverseSubPaths() - Reverse the Direction of Sub-paths Within a Path This user operator reverses the sub-paths in a path, but leaves the 'move' segments unchanged. It builds on top of the subroutines already established. */ struct segment *ReverseSubPaths(p) register struct segment *p; /* input path */ { register struct segment *r; /* reversed path will be created here */ register struct segment *nextp; /* temporary variable used in loop */ int wasclosed; /* flag; subpath was closed */ register struct segment *nomove; /* the part of sub-path without move segment */ struct fractpoint delta; IfTrace1((MustTraceCalls),"ReverseSubPaths(%p)\n", p); if (p == NULL) return(NULL); ARGCHECK(!ISPATHANCHOR(p), "ReverseSubPaths: invalid path", p, NULL, (0), struct segment *); if (p->type == TEXTTYPE) p = CoerceText(p); if (p->type != MOVETYPE) p = JoinSegment(NULL, MOVETYPE, 0, 0, p); p = UniquePath(p); r = NULL; for (; p != NULL;) { nextp = DropSubPath(p); wasclosed = ISCLOSED(p->flag); if (wasclosed) UnClose(p); nomove = SplitPath(p, p); r = Join(r, p); PathDelta(nomove, &delta); nomove = ReverseSubPath(nomove); p->dest.x += delta.x; p->dest.y += delta.y; if (nextp != NULL) { nextp->dest.x += delta.x; nextp->dest.y += delta.y; } if (wasclosed) { nomove = ClosePath(nomove); nextp->dest.x -= delta.x; nextp->dest.y -= delta.y; } r = Join(r, nomove); p = nextp; } return(r); } static int UnClose(p0) register struct segment *p0; { register struct segment *p; for (p=p0; p->link->link != NULL; p=p->link) { ; } if (!LASTCLOSED(p->link->flag)) abort("UnClose: no LASTCLOSED", 24); Free(SplitPath(p0, p)); p0->flag &= ~ISCLOSED(ON); return(0); } /* :h2.Transforming and Putting Handles on Paths :h3.PathTransform() - Transform a Path Transforming a path involves transforming all the points. In order that closed paths do not become "unclosed" when their relative positions are slightly changed due to loss of arithmetic precision, all point transformations are in absolute coordinates. (It might be better to reset the "absolute" coordinates every time a move segment is encountered. This would mean that we could accumulate error from subpath to subpath, but we would be less likely to make the "big error" where our fixed point arithmetic "wraps". However, I think I'll keep it this way until something happens to convince me otherwise.) The transform is described as a "space", that way we can use our old friend the "iconvert" function, which should be very efficient. */ struct segment *PathTransform(p0, S) register struct segment *p0; /* path to transform */ register struct XYspace *S; /* pseudo space to transform in */ { register struct segment *p; /* to loop through path with */ register fractpel newx,newy; /* current transformed position in path */ register fractpel oldx,oldy; /* current untransformed position in path */ register fractpel savex,savey; /* save path delta x,y */ p0 = UniquePath(p0); newx = newy = oldx = oldy = 0; for (p=p0; p != NULL; p=p->link) { savex = p->dest.x; savey = p->dest.y; (*S->iconvert)(&p->dest, S, p->dest.x + oldx, p->dest.y + oldy); p->dest.x -= newx; p->dest.y -= newy; switch (p->type) { case LINETYPE: case MOVETYPE: break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) p; (*S->iconvert)(&cp->M, S, cp->M.x + oldx, cp->M.y + oldy); cp->M.x -= newx; cp->M.y -= newy; /* * Note roundness doesn't change... linear transform */ break; } case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; (*S->iconvert)(&bp->B, S, bp->B.x + oldx, bp->B.y + oldy); bp->B.x -= newx; bp->B.y -= newy; (*S->iconvert)(&bp->C, S, bp->C.x + oldx, bp->C.y + oldy); bp->C.x -= newx; bp->C.y -= newy; break; } case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; (*S->iconvert)(&hp->ref, S, hp->ref.x + oldx, hp->ref.y + oldy); hp->ref.x -= newx; hp->ref.y -= newy; (*S->iconvert)(&hp->width, S, hp->width.x, hp->width.y); /* Note: width is not relative to origin */ break; } case TEXTTYPE: { XformText(p,S); break; } default: IfTrace1(TRUE,"path = %p\n", p); abort("PathTransform: invalid segment", 25); } oldx += savex; oldy += savey; newx += p->dest.x; newy += p->dest.y; } return(p0); } /* :h3.PathDelta() - Return a Path's Ending Point */ void PathDelta(p, pt) register struct segment *p; /* input path */ register struct fractpoint *pt; /* pointer to x,y to set */ { struct fractpoint mypoint; /* I pass this to TextDelta */ register fractpel x,y; /* working variables for path current point */ for (x=y=0; p != NULL; p=p->link) { x += p->dest.x; y += p->dest.y; if (p->type == TEXTTYPE) { TextDelta(p, &mypoint); x += mypoint.x; y += mypoint.y; } } pt->x = x; pt->y = y; } /* :h3.BoundingBox() - Produce a Bounding Box Path This function is called by image code, when we know the size of the image in pels, and need to get a bounding box path that surrounds it. The starting/ending handle is in the lower right hand corner. */ struct segment *BoundingBox(h, w) register pel h,w; /* size of box */ { register struct segment *path; path = PathSegment(LINETYPE, -TOFRACTPEL(w), 0); path = JoinSegment(NULL, LINETYPE, 0, -TOFRACTPEL(h), path); path = JoinSegment(NULL, LINETYPE, TOFRACTPEL(w), 0, path); path = ClosePath(path); return(path); } /* :h2.Querying Locations and Paths :h3.QueryLoc() - Return the X,Y of a Locition */ void QueryLoc(P, S, xP, yP) register struct segment *P; /* location to query, not consumed */ register struct XYspace *S; /* XY space to return coordinates in */ register DOUBLE *xP,*yP; /* coordinates returned here */ { IfTrace4((MustTraceCalls),"QueryLoc(P=%p, S=%p, (%f, %f))\n", P, S, *xP, *yP); if (!ISLOCATION(P)) { ArgErr("QueryLoc: first arg not a location", P, NULL); return; } if (S->type != SPACETYPE) { ArgErr("QueryLoc: second arg not a space", S, NULL); return; } UnConvert(S, &P->dest, xP, yP); } /* :h3.QueryPath() - Find Out the Type of Segment at the Head of a Path This is a very simple routine that looks at the first segment of a path and tells the caller what it is, as well as returning the control point(s) of the path segment. Different path segments have different number of control points. If the caller knows that the segment is a move segment, for example, he only needs to pass pointers to return one control point. */ void QueryPath(path, typeP, Bp, Cp, Dp, fP) register struct segment *path; /* path to check */ register int *typeP; /* return the type of path here */ register struct segment **Bp; /* return location of first point */ register struct segment **Cp; /* return location of second point */ register struct segment **Dp; /* return location of third point */ register DOUBLE *fP; /* return Conic sharpness */ { register int coerced = FALSE; /* did I coerce a text path? */ IfTrace3((MustTraceCalls), "QueryPath(%p, %p, %p, ...)\n", path, typeP, Bp); if (path == NULL) { *typeP = -1; return; } if (!ISPATHANCHOR(path)) { ArgErr("QueryPath: arg not a valid path", path, NULL); } if (path->type == TEXTTYPE) { path = CoerceText(path); coerced = TRUE; } switch (path->type) { case MOVETYPE: *typeP = 0; *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); break; case LINETYPE: *typeP = (LASTCLOSED(path->flag)) ? 4 : 1; *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) path; *typeP = 2; *Bp = PathSegment(MOVETYPE, cp->M.x, cp->M.y); *Cp = PathSegment(MOVETYPE, cp->dest.x, cp->dest.y); *fP = cp->roundness; } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) path; *typeP = 3; *Bp = PathSegment(MOVETYPE, bp->B.x, bp->B.y); *Cp = PathSegment(MOVETYPE, bp->C.x, bp->C.y); *Dp = PathSegment(MOVETYPE, bp->dest.x, bp->dest.y); } break; case HINTTYPE: *typeP = 5; break; default: abort("QueryPath: unknown segment", 26); } if (coerced) KillPath(path); } /* :h3.QueryBounds() - Return the Bounding Box of a Path Returns the bounding box by setting the user's variables. */ void QueryBounds(p0, S, xminP, yminP, xmaxP, ymaxP) register struct segment *p0; /* object to check for bound */ struct XYspace *S; /* coordinate space of returned values */ DOUBLE *xminP,*yminP; /* lower left hand corner (set by routine) */ DOUBLE *xmaxP,*ymaxP; /* upper right hand corner (set by routine) */ { register struct segment *path; /* loop variable for path segments */ register fractpel lastx,lasty; /* loop variables: previous endingpoint */ register fractpel x,y; /* loop variables: current ending point */ struct fractpoint min; /* registers to keep lower left hand corner */ struct fractpoint max; /* registers to keep upper right hand corner */ int coerced = FALSE; /* we have coerced the path from another object */ DOUBLE x1,y1,x2,y2,x3,y3,x4,y4; /* corners of rectangle in space X */ IfTrace2((MustTraceCalls), "QueryBounds(%p, %p,", p0, S); IfTrace4((MustTraceCalls), " %p, %p, %p, %p)\n", xminP, yminP, xmaxP, ymaxP); if (S->type != SPACETYPE) { ArgErr("QueryBounds: bad XYspace", S, NULL); return; } min.x = min.y = max.x = max.y = 0; if (p0 != NULL) { if (!ISPATHANCHOR(p0)) { switch(p0->type) { case STROKEPATHTYPE: /* replaced DupStrokePath() with Dup() 3-26-91 PNM */ p0 = (struct segment *) DoStroke(Dup(p0)); /* no break here, we have a region in p0 */ case REGIONTYPE: p0 = RegionBounds(p0); break; case PICTURETYPE: p0 = PictureBounds(p0); break; default: ArgErr("QueryBounds: bad object", p0, NULL); return; } coerced = TRUE; } if (p0->type == TEXTTYPE) { /* replaced CopyPath() with Dup() 3-26-91 PNM */ p0 = (struct segment *)CoerceText(Dup(p0)); /* there are faster ways */ coerced = TRUE; } if (p0->type == MOVETYPE) { min.x = max.x = p0->dest.x; min.y = max.y = p0->dest.y; } } lastx = lasty = 0; for (path = p0; path != NULL; path = path->link) { x = lastx + path->dest.x; y = lasty + path->dest.y; switch (path->type) { case LINETYPE: break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) path; register fractpel Mx = lastx + cp->M.x; register fractpel My = lasty + cp->M.y; register fractpel deltax = 0.5 * cp->roundness * cp->dest.x; register fractpel deltay = 0.5 * cp->roundness * cp->dest.y; register fractpel Px = Mx - deltax; register fractpel Py = My - deltay; register fractpel Qx = Mx + deltax; register fractpel Qy = My + deltay; if (Mx < min.x) min.x = Mx; else if (Mx > max.x) max.x = Mx; if (My < min.y) min.y = My; else if (My > max.y) max.y = My; if (Px < min.x) min.x = Px; else if (Px > max.x) max.x = Px; if (Py < min.y) min.y = Py; else if (Py > max.y) max.y = Py; if (Qx < min.x) min.x = Qx; else if (Qx > max.x) max.x = Qx; if (Qy < min.y) min.y = Qy; else if (Qy > max.y) max.y = Qy; } break; case MOVETYPE: /* * We can't risk adding trailing Moves to the * bounding box: */ if (path->link == NULL) goto done; /* God forgive me */ break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) path; register fractpel Bx = lastx + bp->B.x; register fractpel By = lasty + bp->B.y; register fractpel Cx = lastx + bp->C.x; register fractpel Cy = lasty + bp->C.y; if (Bx < min.x) min.x = Bx; else if (Bx > max.x) max.x = Bx; if (By < min.y) min.y = By; else if (By > max.y) max.y = By; if (Cx < min.x) min.x = Cx; else if (Cx > max.x) max.x = Cx; if (Cy < min.y) min.y = Cy; else if (Cy > max.y) max.y = Cy; } break; case HINTTYPE: break; default: abort("QueryBounds: unknown type", 27); } if (x < min.x) min.x = x; else if (x > max.x) max.x = x; if (y < min.y) min.y = y; else if (y > max.y) max.y = y; lastx = x; lasty = y; } done: UnConvert(S, &min, &x1, &y1); UnConvert(S, &max, &x4, &y4); x = min.x; min.x = max.x; max.x = x; UnConvert(S, &min, &x2, &y2); UnConvert(S, &max, &x3, &y3); *xminP = *xmaxP = x1; if (x2 < *xminP) *xminP = x2; else if (x2 > *xmaxP) *xmaxP = x2; if (x3 < *xminP) *xminP = x3; else if (x3 > *xmaxP) *xmaxP = x3; if (x4 < *xminP) *xminP = x4; else if (x4 > *xmaxP) *xmaxP = x4; *yminP = *ymaxP = y1; if (y2 < *yminP) *yminP = y2; else if (y2 > *ymaxP) *ymaxP = y2; if (y3 < *yminP) *yminP = y3; else if (y3 > *ymaxP) *ymaxP = y3; if (y4 < *yminP) *yminP = y4; else if (y4 > *ymaxP) *ymaxP = y4; if (coerced) Destroy(p0); } /* :h3.BoxPath() */ struct segment *BoxPath(S, h, w) struct XYspace *S; int h,w; { struct segment *path; path = Join( Line(ILoc(S, w, 0)), Line(ILoc(S, 0, h)) ); path = JoinSegment(path, LINETYPE, -path->dest.x, -path->dest.y, NULL); return(ClosePath(path)); } /* :h3.DropSegment() - Drop the First Segment in a Path This routine takes the path and returns a new path that is one segment shorter. It can be used in conjunction with QueryPath(), for example, to ask about an entire path. */ struct segment *DropSegment(path) register struct segment *path; { IfTrace1((MustTraceCalls),"DropSegment(%p)\n", path); if (path != NULL && path->type == STROKEPATHTYPE) path = CoercePath(path); ARGCHECK((path == NULL || !ISPATHANCHOR(path)), "DropSegment: arg not a non-null path", path, path, (0), struct segment *); if (path->type == TEXTTYPE) path = CoerceText(path); path = UniquePath(path); POP(path); return(path); } /* :h3.HeadSegment() - Return the First Segment in a Path This routine takes the path and returns a new path consists of the first segment only. */ struct segment *HeadSegment(path) register struct segment *path; /* input path */ { IfTrace1((MustTraceCalls),"HeadSegment(%p)\n", path); if (path == NULL) return(NULL); if (path->type == STROKEPATHTYPE) path = CoercePath(path); ARGCHECK(!ISPATHANCHOR(path), "HeadSegment: arg not a path", path, path, (0), struct segment *); if (path->type == TEXTTYPE) path = CoerceText(path); path = UniquePath(path); if (path->link != NULL) KillPath(path->link); path->link = NULL; path->last = path; return(path); } /* :h2.Path Debug Routines :h3.DumpPath() - Display a Path on the Trace File removed by RMz, 1999-06-07 */ /* void DumpPath(p) register struct segment *p; { register fractpel x,y; register fractpel lastx,lasty; DOUBLE roundness; IfTrace1(TRUE,"Dumping path, anchor=%p:\n", p); lastx = lasty = 0; for (;p != NULL; p=p->link) { IfTrace0(TRUE,". "); x = p->dest.x; y = p->dest.y; switch (p->type) { case LINETYPE: IfTrace1(TRUE,". line<%x> to", (LONG) p->flag); IfTrace4(TRUE," (%d,%d), delta=(%d,%d)", x + lastx, y + lasty, x, y); break; case MOVETYPE: IfTrace1(TRUE,"MOVE<%x> to", (LONG) p->flag); IfTrace4(TRUE,"(%d,%d), delta=(%d,%d)", x + lastx, y + lasty, x, y); break; case CONICTYPE: { register struct conicsegment *cp = (struct conicsegment *) p; roundness = cp->roundness; IfTrace2(TRUE, ". conic to (%d,%d),", x + lastx, y + lasty); IfTrace3(TRUE," M=(%d,%d), r=%p", cp->M.x + lastx, cp->M.y + lasty, &roundness); } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; IfTrace4(TRUE,". bezier to (%d,%d), B=(%d,%d)", x + lastx, y + lasty, bp->B.x + lastx, bp->B.y + lasty); IfTrace2(TRUE, ", C=(%d,%d)", bp->C.x + lastx, bp->C.y + lasty); } break; case HINTTYPE: { register struct hintsegment *hp = (struct hintsegment *) p; IfTrace4(TRUE,". hint ref=(%d,%d), width=(%d,%d)", hp->ref.x + lastx, hp->ref.y + lasty, hp->width.x, hp->width.y); IfTrace4(TRUE, ", %c %c %c %c", hp->orientation, hp->hinttype, hp->adjusttype, hp->direction); IfTrace1(TRUE, ", %d", (LONG) hp->label); } break; case TEXTTYPE: DumpText(p); break; default: IfTrace0(TRUE, "bad path segment?"); } IfTrace1(TRUE," at %p\n", p); lastx += x; lasty += y; } } */ grace-5.1.23/T1lib/type1/spaces_rmz.h0000644000076500001440000001355006626627166017011 0ustar fnevgenyusers/* $XConsortium: spaces.h,v 1.3 91/10/10 11:19:22 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define USER t1_User #define IDENTITY t1_Identity #define Context(d,u) t1_Context(d,u) /* #define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4) */ #define Rotate(o,d) t1_Rotate(o,d) /* #define Scale(o,sx,sy) t1_Scale(o,sx,sy) */ #define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) #define Warp(s1,o,s2) t1_Warp(s1,o,s2) struct XYspace *t1_Context(); /* creates a coordinate space for a device */ struct xobject *t1_Transform(); /* transform an object */ struct xobject *t1_Rotate(); /* rotate an object */ /* struct xobject *t1_Scale(); */ /* scale an object */ struct xobject *t1_Warp(); /* transform like delta of two spaces */ void t1_QuerySpace(); /* returns coordinate space matrix */ /*END SHARED*/ /*SHARED*/ #define DeviceResolution t1_DeviceResolution #define InitSpaces() t1_InitSpaces() #define CopySpace(s) t1_CopySpace(s) #define Xform(o,M) t1_Xform(o,M) #define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) #define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) #define MatrixInvert(A,B) t1_MInvert(A,B) #define PseudoSpace(S,M) t1_PseudoSpace(S,M) #define FindContext(M) t1_FindContext(M) void t1_InitSpaces(); /* initialize pre-defined coordinate spaces */ struct XYspace *t1_CopySpace(); /* duplicate a coordinate space */ struct xobject *t1_Xform(); /* transform object by matrix */ void t1_UnConvert(); /* return user coordinates from device coordinates */ void t1_MMultiply(); /* multiply two matrices */ void t1_MInvert(); /* invert a matrix */ void t1_PseudoSpace(); /* force a coordinate space from a matrix */ int t1_FindContext(); /* return the "context" represented by a matrix */ /*END SHARED*/ /*SHARED*/ /* #define KillSpace(s) Free(s) Note - redefined KillSpace() to check references ! 3-26-91 PNM */ #define KillSpace(s) if ( (--(s->references) == 0) ||\ ( (s->references == 1) && ISPERMANENT(s->flag) ) )\ Free(s) #define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s)) #define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s)) /*END SHARED*/ /*SHARED*/ typedef SHORT pel; /* integer pel locations */ typedef LONG fractpel; /* fractional pel locations */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* We define the following macros to convert from 'fractpel' to 'pel' and vice versa: */ #define TOFRACTPEL(p) (((fractpel)p)<>FRACTBITS) #define FRACTFLOAT (DOUBLE)(1L<lastdy >= 0) \ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ if (y2 < R->edgeYstop) \ MoreWorkArea(R, x1, y1, x2, y2); \ } \ else if (dy > 0) { \ if (R->lastdy <= 0) \ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ if (y2 > R->edgeYstop) \ MoreWorkArea(R, x1, y1, x2, y2); \ } \ else /* dy == 0 */ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ if (x2 < R->edgexmin) R->edgexmin = x2; \ else if (x2 > R->edgexmax) R->edgexmax = x2; \ } #define MINPEL (-1<<(8*sizeof(pel)-1)) /* smallest value fitting in a pel */ #define MAXPEL ((1<<(8*sizeof(pel)-1))-1)/* largest value fitting in a pel */ /* The "Unique"-type macro is different (unique?) for regions, because some regions structures are shared among several objects, and might have to be made unique for that reason (i.e., references > 1). */ #define ConsumeRegion(R) MAKECONSUME(R,KillRegion(R)) #define UniqueRegion(R) MAKEUNIQUE(R,CopyRegion(R)) /*END SHARED*/ /*SHARED*/ struct region { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = REGIONTYPE */ struct fractpoint origin; /* beginning handle: X,Y origin of region */ struct fractpoint ending; /* ending handle: X,Y change after painting region */ pel xmin,ymin; /* minimum X,Y of region */ pel xmax,ymax; /* mat1_mum X,Y of region */ struct edgelist *anchor; /* list of edges that bound the region */ struct picture *thresholded; /* region defined by thresholded picture*/ /* Note that the ending handle and the bounding box values are stored relative to 'origin'. The above elements describe a region. The following elements are scratchpad areas used while the region is being built: */ fractpel lastdy; /* direction of last segment */ fractpel firstx,firsty; /* starting point of current edge */ fractpel edgexmin,edgexmax; /* x extent of current edge */ struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */ pel *edge; /* pointer to array of X values for edge */ fractpel edgeYstop; /* Y value where 'edges' array ends */ int (*newedgefcn)(); /* function to use when building a new edge */ struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */ } ; /* The ISCOMPLEMENT flag indicates the region is reversed--it is the "outside" of the nominal region. */ #define ISCOMPLEMENT(flag) ((flag)&0x80) /* The ISJUMBLED flag indicates the region is not sorted top-to-bottom. */ #define ISJUMBLED(flag) ((flag)&0x40) /* The ISINFINITE flag allows a quick check for an INFINITE region, which is frequently intersected. */ #define ISINFINITE(flag) ((flag)&0x20) /*END SHARED*/ /*SHARED*/ #define ISRECTANGULAR(flag) ((flag)&0x08) /*END SHARED*/ /*SHARED*/ #define EmptyRegion t1_EmptyRegion /*END SHARED*/ /*SHARED*/ struct edgelist { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = EDGETYPE */ struct edgelist *link; /* pointer to next in linked list */ struct edgelist *subpath; /* informational link for "same subpath" */ pel xmin,xmax; /* range of edge in X */ pel ymin,ymax; /* range of edge in Y */ pel *xvalues; /* pointer to ymax-ymin X values */ } ; /* The end of the list is marked by either "link" being NULL, or by ymin == ymax. See :hdref refid=discard.. We define the VALIDEDGE predicate to test for the opposite of these conditions: */ #define VALIDEDGE(p) ((p)!=NULL&&(p)->ymin<(p)->ymax) /*END SHARED*/ /*SHARED*/ #define ISDOWN(f) ((f)&0x80) #define ISAMBIGUOUS(f) ((f)&0x40) /*END SHARED*/ /*SHARED*/ /* Interior() rule enumerations: */ #define WINDINGRULE -2 #define EVENODDRULE -3 #define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ /*END SHARED*/ grace-5.1.23/T1lib/type1/t1snap.c0000644000076500001440000000520506626627166016042 0ustar fnevgenyusers/* $XConsortium: t1snap.c,v 1.3 91/10/10 11:19:47 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include "objects.h" #include "spaces.h" #include "paths.h" /* :h2.Handle Functions :h3.Phantom() - Returns a Move Segment Equivalent to Handles This is a user operator. Its new name is QueryHandle. */ struct segment *t1_Phantom(obj) register struct xobject *obj; /* object to take the Phantom of */ { struct fractpoint pt; /* handle size will built here */ if (obj == NULL) pt.x = pt.y = 0; else PathDelta(obj, &pt); return(PathSegment(MOVETYPE, pt.x, pt.y)); } /* :h3.Snap() - Force Ending Handle of Object to Origin This is a user operator. */ struct xobject *t1_Snap(p) register struct segment *p; /* path to snap */ { struct fractpoint pt; /* for finding length of path */ if (p == NULL) return(NULL); p = UniquePath(p); PathDelta(p, &pt); if (p->last->type == MOVETYPE) { p->last->dest.x -= pt.x; p->last->dest.y -= pt.y; } else p = JoinSegment(p, MOVETYPE, -pt.x, -pt.y, NULL); return((struct xobject *)p); } grace-5.1.23/T1lib/type1/util.c0000644000076500001440000001172506715154351015603 0ustar fnevgenyusers/* $XConsortium: util.c,v 1.6 92/03/26 16:42:26 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include "types.h" #include #include #include "util.h" #include "fontmisc.h" static char *vm_base = NULL; /* Start of virtual memory area */ char *vm_next = NULL; /* Pointer to first free byte */ LONG vm_free = 0; /* Count of free bytes */ LONG vm_size = 0; /* Total size of memory */ /* The following global variable is for detecting a trial to allocate a second chunk---not to be done with the t1lib, since a later reallocation would lead to segmentation faults! */ int vm_init_count; /* This is the amount of VM, the font is tried to be loaded in. */ int vm_init_amount; /* * Initialize memory. */ extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */ boolean vm_init() { /* Check whether it is the first piece of memory for the current font or not. If so, simulate lacking memory to indicate that the font should be tried to load with a vitual memory twice as large! */ if (vm_init_count>0){ vm_init_count++; return(FALSE); } vm_init_count++; vm_next = vm_base = (char *) calloc( vm_init_amount, sizeof(char)); if (vm_base != NULL) { vm_free = vm_init_amount; vm_size = vm_init_amount; tokenMaxP = vm_next_byte() + vm_init_amount; return(TRUE); } else return(FALSE); } char *vm_alloc(bytes) unsigned int bytes; { char *answer; /* Align returned bytes to 64-bit boundary */ bytes = (bytes + 7) & ~7; /* take space from what is left otherwise allocate another CHUNK */ if (bytes > vm_free){ if (!vm_init()) return NULL; } else{ answer = vm_next; vm_free -= bytes; vm_next += bytes; return answer; } /* Never reached, but compiler is happy: */ return NULL; } /* * Format an Integer object */ void objFormatInteger( psobj *objP, int value) { if (objP != NULL) { objP->type = OBJ_INTEGER; objP->len = 0; objP->data.integer = value; } } /* * Format a Real object */ void objFormatReal(psobj *objP, float value) { if (objP != NULL) { objP->type = OBJ_REAL; objP->len = 0; objP->data.real = value; } } /* * Format a Boolean object */ void objFormatBoolean(psobj *objP, boolean value) { if (objP != NULL) { objP->type = OBJ_BOOLEAN; objP->len = 0; objP->data.boolean = value; } } /* * Format an Encoding object */ void objFormatEncoding(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ENCODING; objP->len = length; objP->data.arrayP = valueP; } } /* * Format an Array object */ void objFormatArray(psobj *objP, int length, psobj *valueP) { if (objP != NULL) { objP->type = OBJ_ARRAY; objP->len = length; objP->data.arrayP = valueP; } } /* * Format a String object */ void objFormatString(psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_STRING; objP->len = length; objP->data.valueP = valueP; } } /* * Format a Name object */ void objFormatName( psobj *objP, int length, char *valueP) { if (objP != NULL) { objP->type = OBJ_NAME; objP->len = length; objP->data.nameP = valueP; } } /* * Format a File object */ void objFormatFile(psobj *objP, FILE *valueP) { if (objP != NULL) { objP->type = OBJ_FILE; objP->len = 0; objP->data.fileP = valueP; } } grace-5.1.23/T1lib/type1/objects.h0000644000076500001440000002450106765275311016265 0ustar fnevgenyusers/* $XConsortium: objects.h,v 1.6 92/03/20 14:35:56 keith Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ /*END SHARED*/ /*SHARED*/ #include "types.h" #define Permanent(obj) t1_Permanent(obj) #define Temporary(obj) t1_Temporary(obj) #define Destroy(obj) t1_Destroy(obj) #define Dup(obj) t1_Dup(obj) #define InitImager() t1_InitImager() #define TermImager() t1_TermImager() #define Pragmatics(f,v) t1_Pragmatics(f,v) #define ErrorMsg() t1_ErrorMsg() struct xobject *t1_Permanent(); /* make an object permanent */ struct xobject *t1_Temporary(); /* make an object temporary */ struct xobject *t1_Destroy(); /* destroy an object */ struct xobject *t1_Dup(); /* duplicate an object */ void t1_InitImager(); /* initialize TYPE1IMAGER */ void t1_TermImager(); /* terminate TYPE1IMAGER */ void t1_Pragmatics(); /* set debug flags, etc. */ char *t1_ErrorMsg(); /* return last TYPE1IMAGER error message */ /*END SHARED*/ /*SHARED*/ #define abort(line,no) t1_abort(line,no) #define Allocate(n,t,s) t1_Allocate(n,t,s) #define Free(obj) t1_Free(obj) #define NonObjectFree(a) free(a) #define Consume t1_Consume #define ArgErr(s,o,r) t1_ArgErr(s,o,r) #define TypeErr(n,o,e,r) t1_TypeErr(n,o,e,r) #define Copy(obj) t1_Copy(obj) #define Unique(obj) t1_Unique(obj) void t1_abort(); /* crash; software logic error */ struct xobject *t1_Allocate(); /* allocate memory */ void t1_Free(); /* free memory */ struct xobject *t1_Unique(); /* make a unique temporary copy of an object */ struct xobject *t1_ArgErr(); /* handle argument errors */ struct xobject *t1_TypeErr(); /* handle 'bad type' argument errors */ void t1_Consume(); /* consume a variable number of arguments */ struct xobject *t1_Copy(); /* make a new copy, not reference bump PNM */ /*END SHARED*/ /*SHARED*/ #define ON (~0) /* all bits on */ #ifndef FALSE #define FALSE 0 /* handy zero value */ #endif #ifndef TRUE #define TRUE 1 /* handy non-zero value */ #endif #ifndef NULL #define NULL 0 /* The NULL pointer is system specific. (Most systems, however, use 0.) TYPE1IMAGER could have its own NULL, independent of the rest of the system, were it not for malloc(). The system call malloc() returns NULL when out of memory. :i1/portibility assumptions/ */ #endif #define TYPE1_MIN(a,b) (((a)<(b)) ? a : b) #define TYPE1_MAX(a,b) (((a)>(b)) ? a : b) #define TYPE1_ABS(a) (((a)>=0)?(a):-(a)) /*END SHARED*/ /*SHARED*/ struct xobject { char type; /* encoded type of object */ unsigned char flag; /* flag byte for temporary object characteristics */ short references; /* count of pointers to this object (plus 1 for permanent objects) PNM */ } ; /*END SHARED*/ /*SHARED*/ #define XOBJ_COMMON char type; unsigned char flag; short references; /*END SHARED*/ /*SHARED*/ #define INVALIDTYPE 0 #define FONTTYPE 1 #define REGIONTYPE 3 #define PICTURETYPE 4 #define SPACETYPE 5 #define LINESTYLETYPE 6 #define EDGETYPE 7 #define STROKEPATHTYPE 8 #define CLUTTYPE 9 #define ISPATHTYPE(type) ((type)&0x10) /* all path segments have this bit on */ #define LINETYPE (0+ISPATHTYPE(ON)) #define CONICTYPE (1+ISPATHTYPE(ON)) #define BEZIERTYPE (2+ISPATHTYPE(ON)) #define HINTTYPE (3+ISPATHTYPE(ON)) #define MOVETYPE (5+ISPATHTYPE(ON)) #define TEXTTYPE (6+ISPATHTYPE(ON)) /*END SHARED*/ /*SHARED*/ #define ISPERMANENT(flag) ((flag)&0x01) #define ISIMMORTAL(flag) ((flag)&0x02) /*END SHARED*/ /*SHARED*/ #define PRESERVE(obj) if (!ISPERMANENT((obj)->flag)) \ (obj)->references++; /*END SHARED*/ /*SHARED*/ #define LONGCOPY(dest,source,bytes) { \ register LONG *p1 = (LONG *)dest; register LONG *p2 = (LONG *)source; \ register int count = (bytes) / sizeof(LONG); \ while (--count >= 0) *p1++ = *p2++; } /*END SHARED*/ /*SHARED*/ #define FOLLOWING(p) ((p)+1) /*END SHARED*/ /*SHARED*/ #define TYPECHECK(name, obj, expect, whenBAD, consumables, rettype) { \ if (obj->type != expect) { \ (Consume)consumables; \ return((rettype)TypeErr(name, obj, expect, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ #define ARGCHECK(test,msg,obj,whenBAD,consumables,rettype) { \ if (test) { \ (Consume)consumables; \ return((rettype)ArgErr(msg, obj, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ /* Changed use of Dup() below to Temporary(Copy()) because Dup() does not necessarily return a Unique Copy anymore! 3-26-91 */ #define TYPENULLCHECK(name, obj, expect, whenBAD, consumables,rettype) \ if (obj == NULL) { \ (Consume)consumables; \ if (whenBAD != NULL && ISPERMANENT(whenBAD->flag)) \ return((rettype)Temporary(Copy(whenBAD))); \ else return((rettype)whenBAD); \ } else { \ if (obj->type != expect) { \ (Consume)consumables; \ return((rettype)TypeErr(name, obj, expect, whenBAD)); \ } \ } /*END SHARED*/ /*SHARED*/ #define MAKECONSUME(obj,stmt) { if (!ISPERMANENT(obj->flag)) stmt; } /*END SHARED*/ /*SHARED*/ #define MAKEUNIQUE(obj,stmt) ( ( (obj)->references > 1 ) ? stmt : obj ) /*END SHARED*/ /*SHARED*/ /* NDW: personally, I want to see status and error messages! */ #define IfTrace0(condition,model) \ {if (condition) printf(model);} #define IfTrace1(condition,model,arg0) \ {if (condition) printf(model,arg0);} #define IfTrace2(condition,model,arg0,arg1) \ {if (condition) printf(model,arg0,arg1);} #define IfTrace3(condition,model,arg0,arg1,arg2) \ {if (condition) printf(model,arg0,arg1,arg2);} #define IfTrace4(condition,model,arg0,arg1,arg2,arg3) \ {if (condition) printf(model,arg0,arg1,arg2,arg3);} #define IfTrace5(condition,model,arg0,arg1,arg2,arg3,arg4) \ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4);} #define IfTrace6(condition,model,arg0,arg1,arg2,arg3,arg4,arg5) \ {if (condition) printf(model,arg0,arg1,arg2,arg3,arg4,arg5);} /* NDW: patch ends */ void Trace0(); char *Trace1(),*Trace2(),*Trace3(),*Trace4(),*Trace5(),*Trace6(); #ifdef GLOBALS #define extern #define INITIALIZED(value) = value #else #define INITIALIZED(value) #endif extern char MustCheckArgs INITIALIZED(TRUE); extern char MustTraceCalls INITIALIZED(FALSE); extern char MustCrash INITIALIZED(TRUE); extern char InternalTrace INITIALIZED(TRUE); extern char LineIOTrace INITIALIZED(TRUE); extern char ProcessHints INITIALIZED(TRUE); extern char SaveFontPaths INITIALIZED(TRUE); extern short CRASTERCompressionType INITIALIZED(1); extern char ConicDebug INITIALIZED(0); extern char LineDebug INITIALIZED(0); extern char RegionDebug INITIALIZED(0); extern char PathDebug INITIALIZED(0); extern char FontDebug INITIALIZED(0); extern char SpaceDebug INITIALIZED(0); extern char StrokeDebug INITIALIZED(0); extern char MemoryDebug INITIALIZED(0); extern char HintDebug INITIALIZED(0); extern char ImageDebug INITIALIZED(0); extern char OffPageDebug INITIALIZED(0); extern short CachedChars INITIALIZED(0x7FFF); extern short CachedFonts INITIALIZED(0x7FFF); extern int CacheBLimit INITIALIZED(12500); extern char Continuity INITIALIZED(2); #ifdef extern #undef extern #endif /* We define other routines formatting parameters */ #define DumpArea(area) t1_DumpArea(area) #define DumpText(text) t1_DumpText(text) /* #define DumpPath(path) t1_DumpPath(path) */ /* commented by RMz, 1999-06-10 */ #define DumpSpace(space) t1_DumpSpace(space) #define DumpEdges(e) t1_DumpEdges(e) #define FormatFP(s,p) t1_FormatFP(s,p) void t1_DumpArea(); /* dump a region structure */ void t1_DumpText(); /* dump a textpath structure */ void t1_DumpPath(); /* dump a path list */ void t1_DumpSpace(); /* dump a coordinate space structure */ void t1_DumpEdges(); /* dump a region's edge list */ void t1_FormatFP(); /* dump a format a "fractpel" coordinate */ /*END SHARED*/ grace-5.1.23/T1lib/type1/fontfile.h0000644000076500001440000000606306626627165016451 0ustar fnevgenyusers/* * $XConsortium: fontfile.h,v 1.1 91/05/11 09:11:58 rws Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTFILE_H_ #define _FONTFILE_H_ typedef struct _FontEntry *FontEntryPtr; typedef struct _FontTable *FontTablePtr; typedef struct _FontName *FontNamePtr; typedef struct _FontScaled *FontScaledPtr; typedef struct _FontScalableExtra *FontScalableExtraPtr; typedef struct _FontScalableEntry *FontScalableEntryPtr; typedef struct _FontScaleAliasEntry *FontScaleAliasEntryPtr; typedef struct _FontBitmapEntry *FontBitmapEntryPtr; typedef struct _FontAliasEntry *FontAliasEntryPtr; typedef struct _FontBCEntry *FontBCEntryPtr; typedef struct _FontDirectory *FontDirectoryPtr; typedef struct _FontRenderer *FontRendererPtr; #define NullFontEntry ((FontEntryPtr) 0) #define NullFontTable ((FontTablePtr) 0) #define NullFontName ((FontNamePtr) 0) #define NullFontScaled ((FontScaled) 0) #define NullFontScalableExtra ((FontScalableExtra) 0) #define NullFontscalableEntry ((FontScalableEntry) 0) #define NullFontScaleAliasEntry ((FontScaleAliasEntry) 0) #define NullFontBitmapEntry ((FontBitmapEntry) 0) #define NullFontAliasEntry ((FontAliasEntry) 0) #define NullFontBCEntry ((FontBCEntry) 0) #define NullFontDirectory ((FontDirectoryPtr) 0) #define NullFontRenderer ((FontRendererPtr) 0) #define FONT_ENTRY_SCALABLE 0 #define FONT_ENTRY_SCALE_ALIAS 1 #define FONT_ENTRY_BITMAP 2 #define FONT_ENTRY_ALIAS 3 #define FONT_ENTRY_BC 4 #define MAXFONTNAMELEN 1024 #define MAXFONTFILENAMELEN 1024 #define FontDirFile "fonts.dir" #define FontAliasFile "fonts.alias" #define FontScalableFile "fonts.scale" extern FontEntryPtr FontFileFindNameInDir (); extern FontDirectoryPtr FontFileMakeDir (); extern FontRendererPtr FontFileMatchRenderer (); extern char *SaveString (); extern FontScaledPtr FontFileFindScaledInstance (); #endif /* _FONTFILE_H_ */ grace-5.1.23/T1lib/type1/regions.c0000644000076500001440000017126707415144745016310 0ustar fnevgenyusers/* $XConsortium: regions.c,v 1.4 91/10/10 11:18:57 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* REGIONS CWEB V0023 LOTS */ /* :h1 id=regions.REGIONS Module - Regions Operator Handler This module is responsible for creating and manipulating regions. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include #include "types.h" #include "objects.h" #include "spaces.h" #include "regions.h" #include "paths.h" #include "curves.h" #include "lines.h" #include "pictures.h" #include "fonts.h" #include "hints.h" #include "strokes.h" /* to pick up 'DoStroke' */ static int Unwind(); static int newfilledge(); static struct edgelist *splitedge(); static int vertjoin(); static int touches(); static int crosses(); static int edgemin(); static int edgemax(); static int discard(); static int edgecheck(); static struct edgelist *NewEdge(); struct edgelist *swathxsort(); /* 'SortSwath' function */ extern struct XYspace *IDENTITY; /* :h3.Functions Provided to the TYPE1IMAGER User This module provides the following TYPE1IMAGER entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to Other Modules This module provides the following entry points to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules :h4.GOING_TO() - Macro Predicate Needed for Changing Direction, Etc. The actual generation of run end lists (edge boundaries) is left to the low level rasterizing modules, LINES and CURVES. There are some global region-type questions that occur when doing a low-level rasterization: :ol. :li.Did we just change direction in Y and therefore need to start a new edge? :li.Did we run out of allocated edge space? :li.Do the minimum or maximum X values for the current edge need updating? :eol. In general the REGIONS is not smart enough to answer those questions itself. (For example, determining if and when a curve changes direction may need detailed curve knowledge.) Yet, this must be done efficiently. We provide a macro "GOING_TO" where the invoker tells us where it is heading for (x2,y2), plus where it is now (x1,y1), plus the current region under construction, and the macro answers the questions above. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Data Structures Used to Represent Regions :h3.The "region" Structure The region structure is an anchor for a linked list of "edgelist" structures (see :hdref refid=edgelist..). It also summarizes the information in the edgelist structures (for example, the bounding box of the region). And, it contains scratch areas used during the creation of a region. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The ISOPTIMIZED flag tells us if we've put a permanent region in 'optimal' form. */ #define ISOPTIMIZED(flag) ((flag)&0x10) /* The ISRECTANGULAR flag tells us if a region is a rectangle. We don't always notice rectangles--if this flag is set, the region definitely is a rectangle, but some rectangular regions will not have the flag set. The flag is used to optimize some paths. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h4."INFINITY" - A Constant Region Structure of Infinite Extent Infinity is the complement of a null area: Note - removed the refcount = 1 init, replaced with references = 2 3-26-91 PNM */ static struct region infinity = { REGIONTYPE, ISCOMPLEMENT(ON)+ISINFINITE(ON)+ISPERMANENT(ON)+ISIMMORTAL(ON), 2, {0, 0}, {0, 0}, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL }; /* we rename INFINITY to T1_INFINITY. Anyhow it is currently not used */ struct region *T1_INFINITY = &infinity; /* :h4."EmptyRegion" - A Region Structure with Zero Area This structure is used to initialize the region to be built in Interior(): Note - replaced refcount = 1 init with references = 2 3-26-91 PNM */ /*SHARED LINE(S) ORIGINATED HERE*/ struct region EmptyRegion = { REGIONTYPE, ISPERMANENT(ON)+ISIMMORTAL(ON), 2, {0, 0}, {0, 0}, MAXPEL, MAXPEL, MINPEL, MINPEL, NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL }; /* :h3 id=edgelist.The "edgelist" Structure Regions are represented by a linked list of 'edgelist' structures. When a region is complete, the structures are paired, one for the left and one for the right edge. While a region is being built, this rule may be violated temporarily. An 'edgelist' structure contains the X values for a given span of Y values. The (X,Y) pairs define an edge. We use the crack and edge coordinate system, so that integer values of X and Y go between pels. The edge is defined between the minimum Y and maximum Y. The linked list is kept sorted from top to bottom, that is, in increasing y. Also, if 'e1' is an edgelist structure and 'e2' is the next one in the list, they must have exactly the same ymin,ymax values or be totally disjoint. These two requirements mean that if e2's ymin is less than e1's ymax, it must be exactly equal to e1's ymin. A sublist of structures with identical ymin and ymax values is called a 'swath'. In addition, edgelist structures are separately linked together based on what subpath originally created them; each subpath is kept as a separate circular linked list. This information is ignored unless continuity checking is invoked. See :hdref refid=subpath. for a complete description of this. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The "edgelist" structure follows the convention of TYPE1IMAGER user objects, having a type field and a flag field as the first two elements. However, the user never sees "edgelist" structures directly; he is given handles to "region" structures only. By having a type field, we can use the "copy" feature of Allocate() to duplicate edge lists quickly. We also define two flag bits for this structure. The ISDOWN bit is set if the edge is going in the direction of increasing Y. The ISAMBIGUOUS bit is set if the edge is identical to its neighbor (edge->link); such edges may be "left" when they should be "right", or vice versa, unnecessarily confusing the continuity checking logic. The FixSubPaths() routine in HINTS will swap ambiguous edges if that avoids crossing edges; see :hdref refid=fixsubp.. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.KillRegion() - Destroys a Region KillRegion nominally just decrements the reference count to that region. If the reference count becomes 0, all memory associated with it is freed. We just follow the linked list, freeing as we go, then kill any associated (thresholded) picture. Note - added conditional return based on references 3-26-91 PNM */ void KillRegion(area) register struct region *area; /* area to free */ { register struct edgelist *p; /* loop variable */ register struct edgelist *next; /* loop variable */ if (area->references < 0) abort("KillRegion: negative reference count", 28); if ( (--(area->references) > 1) || ( (area->references == 1) && !ISPERMANENT(area->flag) ) ) return; for (p=area->anchor; p != NULL; p=next) { next = p->link; Free(p); } /* KillPicture-macro removed from sources (RMz, 2001-04-01) if (area->thresholded != NULL) KillPicture(area->thresholded); */ Free(area); } /* :h3.CopyRegion() - Makes a Copy of a Region */ struct region *CopyRegion(area) register struct region *area; /* region to duplicate */ { register struct region *r; /* output region built here */ register struct edgelist *last=NULL; /* loop variable */ register struct edgelist *p,*newp; /* loop variables */ r = (struct region *)Allocate(sizeof(struct region), area, 0); r->anchor = NULL; for (p=area->anchor; VALIDEDGE(p); p=p->link) { newp = NewEdge(p->xmin, p->xmax, p->ymin, p->ymax, p->xvalues, ISDOWN(p->flag)); if (r->anchor == NULL) r->anchor = last = newp; else last->link = newp; last = newp; } if (area->thresholded != NULL) /* replaced DupPicture with Dup() 3-26-91 PNM */ r->thresholded = (struct picture *)Dup(area->thresholded); return(r); } /* :h4.NewEdge() - Allocates and Returns a New "edgelist" Structure We allocate space for the X values contiguously with the 'edgelist' structure that locates them. That way, we only have to free the edgelist structure to free all memory associated with it. Damn clever, huh? */ static struct edgelist *NewEdge(xmin, xmax, ymin, ymax, xvalues, isdown) pel xmin,xmax; /* X extent of edge */ pel ymin,ymax; /* Y extent of edge */ pel *xvalues; /* list of X values for entire edge */ int isdown; /* flag: TRUE means edge progresses downward */ { static struct edgelist template = { EDGETYPE, 0, 1, NULL, NULL, 0, 0, 0, 0, NULL }; register struct edgelist *r; /* returned structure */ register int iy; /* ymin adjusted for 'long' alignment purposes */ IfTrace2((RegionDebug),"....new edge: ymin=%d, ymax=%d ", (LONG)ymin, (LONG) ymax); if (ymin >= ymax) abort("newedge: height not positive", 29); /* We are going to copy the xvalues into a newly allocated area. It helps performance if the values are all "long" aligned. We can test if the xvalues are long aligned by ANDing the address with the (sizeof(long) - 1)--if non zero, the xvalues are not aligned well. We set 'iy' to the ymin value that would give us good alignment: */ iy = ymin - (((unsigned long) xvalues) & (sizeof(LONG) - 1)) / sizeof(pel); r = (struct edgelist *)Allocate(sizeof(struct edgelist), &template, (ymax - iy) * sizeof(pel)); if (isdown) r->flag = ISDOWN(ON); r->xmin = xmin; r->xmax = xmax; r->ymin = ymin; r->ymax = ymax; r->xvalues = (pel *) FOLLOWING(r); if (ymin != iy) { r->xvalues += ymin - iy; xvalues -= ymin - iy; } /* We must round up (ymax - iy) so we get the ceiling of the number of longs. The destination must be able to hold these extra bytes because Allocate() makes everything it allocates be in multiples of longs. */ LONGCOPY(&r[1], xvalues, (ymax - iy) * sizeof(pel) + sizeof(LONG) - 1); IfTrace1((RegionDebug),"result=%p\n", r); return(r); } /* :h2.Building Regions :h3.Interior() - Iterate Through a Path, Building a Region This routine is the workhorse driver routine that iterates through a path, calling the appropriate stepping routines to actually produce the run end "edgelist" structures. :ol. :li."Interior" calls StepLine or StepConic or StepBezier as appropriate to produce run ends. :li.Occasionally these routines will notice a change in Y direction and will call ChangeDirection (through the GOING_TO macro); this is a call back to the REGIONS module. :li.ChangeDirection will call whatever function is in the region structure; for Interior, this function is 'newfilledge'. :li.Newfilledge will call NewEdge to create a new edgelist structure, then, call SortSwath to sort it onto the linked list being built at the region "anchor". :eol. By making the function called by ChangeDirection be a parameter of the region, we allow the same ChangeDirection logic to be used by stroking. */ /*SHARED LINE(S) ORIGINATED HERE*/ struct region *Interior(p, fillrule) register struct segment *p; /* take interior of this path */ register int fillrule; /* rule to follow if path crosses itself */ { register fractpel x,y; /* keeps ending point of path segment */ fractpel lastx,lasty; /* previous x,y from path segment before */ register struct region *R; /* region I will build */ register struct segment *nextP; /* next segment of path */ struct fractpoint hint; /* accumulated hint value */ char tempflag; /* flag; is path temporary? */ char Cflag; /* flag; should we apply continuity? */ IfTrace2((MustTraceCalls),". INTERIOR(%p, %d)\n", p, (LONG) fillrule); if (p == NULL) return(NULL); /* Establish the 'Cflag' continuity flag based on user's fill rule and our own 'Continuity' pragmatic (0: never do continuity, 1: do what user asked, >1: do it regardless). */ if (fillrule > 0) { Cflag = Continuity > 0; fillrule -= CONTINUITY; } else Cflag = Continuity > 1; ARGCHECK((fillrule != WINDINGRULE && fillrule != EVENODDRULE), "Interior: bad fill rule", NULL, NULL, (1,p), struct region *); if (p->type == TEXTTYPE) /* if (fillrule != EVENODDRULE) else */ return((struct region *)UniquePath(p)); if (p->type == STROKEPATHTYPE){ if (fillrule == WINDINGRULE) return((struct region *)DoStroke(p)); else p = CoercePath(p); } R = (struct region *)Allocate(sizeof(struct region), &EmptyRegion, 0); ARGCHECK(!ISPATHANCHOR(p), "Interior: bad path", p, R, (0), struct region *); ARGCHECK((p->type != MOVETYPE), "Interior: path not closed", p, R, (0), struct region *); /* changed definition from !ISPERMANENT to references <= 1 3-26-91 PNM */ tempflag = (p->references <= 1); /* only first segment in path is so marked */ if (!ISPERMANENT(p->flag)) p->references -= 1; R->newedgefcn = newfilledge; /* Believe it or not, "R" is now completely initialized. We are counting on the copy of template to get other fields the way we want them, namely :ol. :li.anchor = NULL :li.xmin, ymin, xmax, ymax, to minimum and maximum values respectively. :eol. Anchor = NULL is very important to ChangeDirection. See :hdref refid=CD.. To minimize problems of "wrapping" in our pel arithmetic, we keep an origin of the region which is the first move. Hopefully, that keeps numbers within plus or minus 32K pels. */ R->origin.x = 0/*TOFRACTPEL(NEARESTPEL(p->dest.x))*/; R->origin.y = 0/*TOFRACTPEL(NEARESTPEL(p->dest.y))*/; lastx = - R->origin.x; lasty = - R->origin.y; /* ChangeDirection initializes other important fields in R, such as lastdy, edge, edgeYstop, edgexmin, and edgexmax. The first segment is a MOVETYPE, so it will be called first. */ /* The hints data structure must be initialized once for each path. */ if (ProcessHints) InitHints(); /* initialize hint data structure */ while (p != NULL) { x = lastx + p->dest.x; y = lasty + p->dest.y; IfTrace2((HintDebug > 0),"Ending point = (%d,%d)\n", x, y); nextP = p->link; /* Here we start the hints processing by initializing the hint value to zero. If ProcessHints is FALSE, the value will remain zero. Otherwise, hint accumulates the computed hint values. */ hint.x = hint.y = 0; /* If we are processing hints, and this is a MOVE segment (other than the first on the path), we need to close (reverse) any open hints. */ if (ProcessHints) if ((p->type == MOVETYPE) && (p->last == NULL)) { CloseHints(&hint); IfTrace2((HintDebug>0),"Closed point= (%d,%d)\n", x+hint.x, y+hint.y); } /* Next we run through all the hint segments (if any) attached to this segment. If ProcessHints is TRUE, we will accumulate computed hint values. In either case, nextP will be advanced to the first non-HINT segment (or NULL), and each hint segment will be freed if necessary. */ while ((nextP != NULL) && (nextP->type == HINTTYPE)) { if (ProcessHints) ProcessHint(nextP, x + hint.x, y + hint.y, &hint); { register struct segment *saveP = nextP; nextP = nextP->link; if (tempflag) Free(saveP); } } /* We now apply the full hint value to the ending point of the path segment. */ /* printf("Applying hints (x=%d,y=%d)\n", hint.x, hint.y);*/ x += hint.x; y += hint.y; IfTrace2((HintDebug>0),"Hinted ending point = (%d,%d)\n", x, y); switch(p->type) { case LINETYPE: StepLine(R, lastx, lasty, x, y); break; case CONICTYPE: { /* For a conic curve, we apply half the hint value to the conic midpoint. */ } break; case BEZIERTYPE: { register struct beziersegment *bp = (struct beziersegment *) p; /* For a Bezier curve, we apply the full hint value to the Bezier C point. */ StepBezier(R, lastx, lasty, lastx + bp->B.x, lasty + bp->B.y, lastx + bp->C.x + hint.x, lasty + bp->C.y + hint.y, x, y); } break; case MOVETYPE: /* At this point we have encountered a MOVE segment. This breaks the path, making it disjoint. */ if (p->last == NULL) /* i.e., not first in path */ ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0); ChangeDirection(CD_FIRST, R, x, y, (fractpel) 0); /* We'll just double check for closure here. We forgive an appended MOVETYPE at the end of the path, if it isn't closed: */ if (!ISCLOSED(p->flag) && p->link != NULL) return((struct region *)ArgErr("Fill: sub-path not closed", p, NULL)); break; default: abort("Interior: path type error", 30); } /* We're done with this segment. Advance to the next path segment in the list, freeing this one if necessary: */ lastx = x; lasty = y; if (tempflag) Free(p); p = nextP; } ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0); R->ending.x = lastx; R->ending.y = lasty; /* Finally, clean up the region's based on the user's 'fillrule' request: */ if (Cflag) ApplyContinuity(R); if (fillrule == WINDINGRULE) Unwind(R->anchor); return(R); } /* :h4.Unwind() - Discards Edges That Fail the Winding Rule Test The winding rule says that upward going edges should be paired with downward going edges only, and vice versa. So, if two upward edges or two downward edges are nominally left/right pairs, Unwind() should discard the second one. Everything should balance; we should discard an even number of edges; of course, we abort if we don't. */ static int Unwind(area) register struct edgelist *area; /* input area modified in place */ { register struct edgelist *last=NULL,*next; /* struct before and after current one */ register int y; /* ymin of current swath */ register int count,newcount; /* winding count registers */ IfTrace1((RegionDebug>0),"...Unwind(%p)\n", area); while (VALIDEDGE(area)) { count = 0; y = area->ymin; do { next = area->link; if (ISDOWN(area->flag)) newcount = count + 1; else newcount = count - 1; if (count == 0 || newcount == 0) last = area; else discard(last, next); count = newcount; area = next; } while (area != NULL && area->ymin == y); if (count != 0) abort("Unwind: uneven edges", 31); } /* We retunr a value for ANSI-C-compiler */ return(0); } /* :h3."workedge" Array This is a statically allocated array where edges are built before being copied into more permanent storage by NewEdge(). */ #ifndef MAXEDGE #define MAXEDGE 1000 #endif static pel workedge[MAXEDGE]; static pel *currentworkarea = workedge; static pel currentsize = MAXEDGE; /* :h3 id=cd.ChangeDirection() - Called When Y Direction Changes The rasterizing routines call this entry point when they detect a change in Y. We then build the current edge and sort it into emerging edgelist at 'anchor' by calling whatever "newedgefcn" is appropriate. */ void ChangeDirection(type, R, x, y, dy) int type; /* CD_FIRST, CD_CONTINUE, or CD_LAST */ register struct region *R; /* region in which we are changing direction */ fractpel x,y; /* current beginning x,y */ fractpel dy; /* direction and magnitude of change in y */ { register fractpel ymin,ymax; /* minimum and maximum Y since last call */ register fractpel x_at_ymin,x_at_ymax; /* their respective X's */ register pel iy; /* nearest integer pel to 'y' */ register pel idy; /* nearest integer pel to 'dy' */ register int ydiff; /* allowed Y difference in 'currentworkarea' */ IfTrace4((RegionDebug>0),"Change Y direction (%d) from (%d,%d), dy=%d\n", (LONG) type, x, y, dy); if (type != CD_FIRST) { if (R->lastdy > 0) { ymin = R->firsty; x_at_ymin = R->firstx; ymax = y; x_at_ymax = x; } else { ymin = y; x_at_ymin = x; ymax = R->firsty; x_at_ymax = R->firstx; } if (ymax < ymin) abort("negative sized edge?", 32); (*R->newedgefcn)(R, R->edgexmin, R->edgexmax, ymin, ymax, R->lastdy > 0, x_at_ymin, x_at_ymax); } R->firsty = y; R->firstx = x; R->lastdy = dy; iy = NEARESTPEL(y); idy = NEARESTPEL(dy); if (currentworkarea != workedge && idy < MAXEDGE && idy > -MAXEDGE) { NonObjectFree(currentworkarea); currentworkarea = workedge; currentsize = MAXEDGE; } ydiff = currentsize - 1; if (dy > 0) { R->edge = ¤tworkarea[-iy]; R->edgeYstop = TOFRACTPEL(ydiff + iy) + FPHALF; } else { R->edge = ¤tworkarea[ydiff - iy]; R->edgeYstop = TOFRACTPEL(iy - ydiff) - FPHALF; } R->edgexmax = R->edgexmin = x; /* If this is the end of a subpath, we complete the subpath circular chain: */ if (type == CD_LAST && R->lastedge != NULL) { register struct edgelist *e = R->firstedge; while (e->subpath != NULL) e = e->subpath; e->subpath = R->lastedge; R->lastedge = R->firstedge = NULL; } } /* :h3 id=newfill.newfilledge() - Called When We Have a New Edge While Filling This is the prototypical "newedge" function passed to "Rasterize" and stored in "newedgefcn" in the region being built. If the edge is non-null, we sort it onto the list of edges we are building at "anchor". This function also has to keep the bounding box of the region up to date. */ static int newfilledge(R, xmin, xmax, ymin, ymax, isdown) register struct region *R; /* region being built */ fractpel xmin,xmax; /* X range of this edge */ fractpel ymin,ymax; /* Y range of this edge */ int isdown; /* flag: TRUE means edge goes down, else up */ { register pel pelxmin,pelymin,pelxmax,pelymax; /* pel versions of bounds */ register struct edgelist *edge; /* newly created edge */ pelymin = NEARESTPEL(ymin); pelymax = NEARESTPEL(ymax); if (pelymin == pelymax) return(0); pelxmin = NEARESTPEL(xmin); pelxmax = NEARESTPEL(xmax); if (pelxmin < R->xmin) R->xmin = pelxmin; if (pelxmax > R->xmax) R->xmax = pelxmax; if (pelymin < R->ymin) R->ymin = pelymin; if (pelymax > R->ymax) R->ymax = pelymax; edge = NewEdge(pelxmin, pelxmax, pelymin, pelymax, &R->edge[pelymin], isdown); edge->subpath = R->lastedge; R->lastedge = edge; if (R->firstedge == NULL) R->firstedge = edge; R->anchor = SortSwath(R->anchor, edge, swathxsort); return(0); } /* :h2.Sorting Edges :h3.SortSwath() - Vertically Sort an Edge into a Region This routine sorts an edge or a pair of edges into a growing region, so that the region maintains its top-to-bottom, left-to-right form. The rules for sorting horizontally may vary depending on what you are doing, but the rules for vertical sorting are always the same. This routine is passed an argument that is a function that will perform the horizontal sort on demand (for example, swathxsort() or SwathUnion()). This is a recursive routine. A new edge (or edge pair) may overlap the list I am building in strange and wonderful ways. Edges may cross. When this happens, my strategy is to split the incoming edge (or the growing list) in two at that point, execute the actual sort on the top part of the split, and recursively call myself to figure out exactly where the bottom part belongs. */ #define TOP(e) ((e)->ymin) /* the top of an edge (for readability */ #define BOTTOM(e) ((e)->ymax) /* the bottom of an edge (for readability */ struct edgelist *SortSwath(anchor, edge, swathfcn) struct edgelist *anchor; /* list being built */ register struct edgelist *edge; /* incoming edge or pair of edges */ struct edgelist *(*swathfcn)(); /* horizontal sorter */ { register struct edgelist *before,*after; struct edgelist base; if (RegionDebug > 0) { if (RegionDebug > 2) { IfTrace3(TRUE,"SortSwath(anchor=%p, edge=%p, fcn=%p)\n", anchor, edge, swathfcn); } else { IfTrace3(TRUE,"SortSwath(anchor=%p, edge=%p, fcn=%p)\n", anchor, edge, swathfcn); } } if (anchor == NULL) return(edge); before = &base; before->ymin = before->ymax = MINPEL; before->link = after = anchor; /* If the incoming edge is above the current list, we connect the current list to the bottom of the incoming edge. One slight complication is if the incoming edge overlaps into the current list. Then, we first split the incoming edge in two at the point of overlap and recursively call ourselves to sort the bottom of the split into the current list: */ if (TOP(edge) < TOP(after)) { if (BOTTOM(edge) > TOP(after)) { after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn); } vertjoin(edge, after); return(edge); } /* At this point the top of edge is not higher than the top of the list, which we keep in 'after'. We move the 'after' point down the list, until the top of the edge occurs in the swath beginning with 'after'. If the bottom of 'after' is below the bottom of the edge, we have to split the 'after' swath into two parts, at the bottom of the edge. If the bottom of 'after' is above the bottom of the swath, */ while (VALIDEDGE(after)) { if (TOP(after) == TOP(edge)) { if (BOTTOM(after) > BOTTOM(edge)) vertjoin(after, splitedge(after, BOTTOM(edge))); else if (BOTTOM(after) < BOTTOM(edge)) { after = SortSwath(after, splitedge(edge, BOTTOM(after)), swathfcn); } break; } else if (TOP(after) > TOP(edge)) { IfTrace0((BOTTOM(edge) < TOP(after) && RegionDebug > 0), "SortSwath: disjoint edges\n"); if (BOTTOM(edge) > TOP(after)) { after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn); } break; } else if (BOTTOM(after) > TOP(edge)) vertjoin(after, splitedge(after, TOP(edge))); before = after; after = after->link; } /* At this point 'edge' exactly corresponds in height to the current swath pointed to by 'after'. */ if (after != NULL && TOP(after) == TOP(edge)) { before = (*swathfcn)(before, edge); after = before->link; } /* At this point 'after' contains all the edges after 'edge', and 'before' contains all the edges before. Whew! A simple matter now of adding 'edge' to the linked list in its rightful place: */ before->link = edge; if (RegionDebug > 1) { IfTrace3(TRUE,"SortSwath: in between %p and %p are %p", before, after, edge); while (edge->link != NULL) { edge = edge->link; IfTrace1(TRUE," and %p", edge); } IfTrace0(TRUE,"\n"); } else for (; edge->link != NULL; edge = edge->link) { ; } edge->link = after; return(base.link); } /* :h3.splitedge() - Split an Edge or Swath in Two at a Given Y Value This function returns the edge or swath beginning at the Y value, and is guaranteed not to change the address of the old swath while splitting it. */ static struct edgelist *splitedge(list, y) struct edgelist *list; /* area to split */ register pel y; /* Y value to split list at */ { register struct edgelist *new; /* anchor for newly built list */ register struct edgelist *last=NULL; /* end of newly built list */ register struct edgelist *r; /* temp pointer to new structure */ register struct edgelist *lastlist; /* temp pointer to last 'list' value */ IfTrace2((RegionDebug > 1),"splitedge of %p at %d ", list, (LONG) y); lastlist = new = NULL; while (list != NULL) { if (y < list->ymin) break; if (y >= list->ymax) abort("splitedge: above top of list", 33); if (y == list->ymin) abort("splitedge: would be null", 34); r = (struct edgelist *)Allocate(sizeof(struct edgelist), list, 0); /* At this point 'r' points to a copy of the single structure at 'list'. We will make 'r' be the new split 'edgelist'--the lower half. We don't bother to correct 'xmin' and 'xmax', we'll take the the pessimistic answer that results from using the old values. */ r->ymin = y; r->xvalues = list->xvalues + (y - list->ymin); /* Note that we do not need to allocate new memory for the X values, they can remain with the old "edgelist" structure. We do have to update that old structure so it is not as high: */ list->ymax = y; /* Insert 'r' in the subpath chain: */ r->subpath = list->subpath; list->subpath = r; /* Now attach 'r' to the list we are building at 'new', and advance 'list' to point to the next element in the old list: */ if (new == NULL) new = r; else last->link = r; last = r; lastlist = list; list = list->link; } /* At this point we have a new list built at 'new'. We break the old list at 'lastlist', and add the broken off part to the end of 'new'. Then, we return the caller a pointer to 'new': */ if (new == NULL) abort("null splitedge", 35); lastlist->link = NULL; last->link = list; IfTrace1((RegionDebug > 1),"yields %p\n", new); return(new); } /* :h3.vertjoin() - Join Two Disjoint Edge Lists Vertically The two edges must be disjoint vertically. */ static int vertjoin(top, bottom) register struct edgelist *top; /* uppermost region */ register struct edgelist *bottom; /* bottommost region */ { if (BOTTOM(top) > TOP(bottom)) abort("vertjoin not disjoint", 36); for (; top->link != NULL; top=top->link) { ; } top->link = bottom; return(0); } /* :h3.swathxsort() - Sorting by X Values We need to sort 'edge' into its rightful place in the swath by X value, taking care that we do not accidentally advance to the next swath while searching for the correct X value. Like all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ struct edgelist *swathxsort(before0, edge) register struct edgelist *before0; /* edge before this swath */ register struct edgelist *edge; /* input edge */ { register struct edgelist *before; register struct edgelist *after; register pel y=0; before = before0; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { register pel *x1,*x2; y = TOP(edge); x1 = after->xvalues; x2 = edge->xvalues; while (y < BOTTOM(edge) && *x1 == *x2) { x1++; x2++; y++; } if (y >= BOTTOM(edge)) { edge->flag |= ISAMBIGUOUS(ON); after->flag |= ISAMBIGUOUS(ON); break; } if (*x1 >= *x2) break; before = after; after = after->link; } /* At this point, 'edge' is between 'before' and 'after'. If 'edge' didn't cross either of those other edges, we would be done. We check for crossing. If it does cross, we split the problem up by calling SortSwath recursively with the part of the edge that is below the crossing point: */ { register int h0,h; /* height of edge--number of scans */ h0 = h = BOTTOM(edge) - y; y -= TOP(edge); if (h0 <= 0) { IfTrace0((RegionDebug>0),"swathxsort: exactly equal edges\n"); return(before); } if (TOP(before) == TOP(edge)) h -= crosses(h, &before->xvalues[y], &edge->xvalues[y]); if (after != NULL && TOP(after) == TOP(edge)) h -= crosses(h, &edge->xvalues[y], &after->xvalues[y]); if (h < h0) { SortSwath(before0->link, splitedge(edge, TOP(edge) + y + h), swathxsort); } } return(before); } /* :h3.SwathUnion() - Union Two Edges by X Value We have a left and right edge that must be unioned into a growing swath. If they are totally disjoint, they are just added in. The fun comes in they overlap the existing edges. Then some edges will disappear. */ struct edgelist *SwathUnion(before0, edge) register struct edgelist *before0; /* edge before the swath */ register struct edgelist *edge; /* list of two edges to be unioned */ { register int h; /* saves height of edge */ register struct edgelist *rightedge; /* saves right edge of 'edge' */ register struct edgelist *before,*after; /* edge before and after */ int h0; /* saves initial height */ IfTrace2((RegionDebug > 1),"SwathUnion entered, before=%p, edge=%p\n", before0, edge); h0 = h = edge->ymax - edge->ymin; if (h <= 0) abort("SwathUnion: 0 height swath?", 37); before = before0; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { register struct edgelist *right; right = after->link; if (right->xvalues[0] >= edge->xvalues[0]) break; before = right; after = before->link; } /* This is the picture at this point. 'L' indicates a left hand edge, 'R' indicates the right hand edge. '<--->' indicates the degree of uncertainty as to its placement relative to other edges: :xmp atomic. before after R <---L----> R L R L R <---L---> <------R--------------------------> edge :exmp. In case the left of 'edge' touches 'before', we need to reduce the height by that amount. */ if (TOP(before) == TOP(edge)) h -= touches(h, before->xvalues, edge->xvalues); rightedge = edge->link; if (after == NULL || TOP(after) != TOP(edge) || after->xvalues[0] > rightedge->xvalues[0]) { IfTrace2((RegionDebug > 1), "SwathUnion starts disjoint: before=%p after=%p\n", before, after); /* On this side of the the above 'if', the new edge is disjoint from the existing edges in the swath. This is the picture: :xmp atomic. before after R L R L R L R L R edge :exmp. We will verify it remains disjoint for the entire height. If the situation changes somewhere down the edge, we split the edge at that point and recursively call ourselves (through 'SortSwath') to figure out the new situation: */ if (after != NULL && TOP(after) == TOP(edge)) h -= touches(h, rightedge->xvalues, after->xvalues); if (h < h0) SortSwath(before0->link, splitedge(edge, edge->ymin + h), t1_SwathUnion); /* go to "return" this edge pair; it is totally disjoint */ } else { /* At this point, at the 'else', we know that the new edge overlaps one or more pairs in the existing swath. Here is a picture of our knowledge and uncertainties: :xmp atomic. before after R L R L R L R <---L---> <---R-------------------> edge :exmp. We need to move 'after' along until it is to the right of the right of 'edge'. ('After' should always point to a left edge of a pair:) */ register struct edgelist *left; /* variable to keep left edge in */ do { left = after; after = (after->link)->link; } while (after != NULL && TOP(after) == TOP(edge) && after->xvalues[0] <= rightedge->xvalues[0]); /* At this point this is the picture: :xmp atomic. before left after R L R L R L R <---L---> <---R---> edge :exmp. We need to verify that the situation stays like this all the way down the edge. Again, if the situation changes somewhere down the edge, we split the edge at that point and recursively call ourselves (through 'SortSwath') to figure out the new situation: */ h -= crosses(h, left->xvalues, rightedge->xvalues); h -= crosses(h, edge->xvalues, ((before->link)->link)->xvalues); if (after != NULL && TOP(after) == TOP(edge)) h -= touches(h, rightedge->xvalues, after->xvalues); IfTrace3((RegionDebug > 1), "SwathUnion is overlapped until %d: before=%p after=%p\n", (LONG) TOP(edge) + h, before, after); /* OK, if we touched either of our neighbors we need to split at that point and recursively sort the split edge onto the list. One tricky part is that when we recursively sort, 'after' will change if it was not in our current swath: */ if (h < h0) { SortSwath(before0->link, splitedge(edge, edge->ymin + h), t1_SwathUnion); if (after == NULL || TOP(after) != TOP(edge)) for (after = before0->link; TOP(after) == TOP(edge); after = after->link) { ; } } /* Now we need to augment 'edge' by the left and right of the overlapped swath, and to discard all edges between before and after, because they were overlapped and have been combined with the new incoming 'edge': */ edge->xmin = TYPE1_MIN(edge->xmin, (before->link)->xmin); edge->xmax = TYPE1_MIN(edge->xmax, (before->link)->xmax); edgemin(h, edge->xvalues, (before->link)->xvalues); rightedge->xmin = TYPE1_MAX(rightedge->xmin, (left->link)->xmin); rightedge->xmax = TYPE1_MAX(rightedge->xmax, (left->link)->xmax); edgemax(h, rightedge->xvalues, (left->link)->xvalues); discard(before, after); } return(before); } /* :h3.swathrightmost() - Simply Sorts New Edge to Rightmost of Swath Like all swath functions, this function returns a pointer to the edge BEFORE the given edge in the sort. */ struct edgelist *swathrightmost(before, edge) register struct edgelist *before; /* edge before this swath */ register struct edgelist *edge; /* input edge */ { register struct edgelist *after; after = before->link; while (after != NULL && TOP(after) == TOP(edge)) { before = after; after = after->link; } return(before); } /* :h3.touches() - Returns the Remaining Height When Two Edges Touch So, it will return 0 if they never touch. Allows incredibly(?) mnemonic if (touches(...)) construct. */ static int touches(h, left, right) register int h; register pel *left,*right; { for (; h > 0; h--) if (*left++ >= *right++) break; return(h); } /* :h3.crosses() - Returns the Remaining Height When Two Edges Cross So, it will return 0 if they never cross. */ static int crosses(h, left, right) register int h; register pel *left,*right; { for (; h > 0; h--) if (*left++ > *right++) break; return(h); } /* :h3.cedgemin() - Stores the Mininum of an Edge and an X Value */ static int cedgemin(h, e1, x) register int h; register pel *e1; register pel x; { for (; --h >= 0; e1++) if (*e1 > x) *e1 = x; return(0); } /* :h3.cedgemax() - Stores the Maximum of an Edge and an X Value */ static int cedgemax(h, e1, x) register int h; register pel *e1; register pel x; { for (; --h >= 0; e1++) if (*e1 < x) *e1 = x; return(0); } /* :h3.edgemin() - Stores the Mininum of Two Edges in First Edge */ static int edgemin(h, e1, e2) register int h; register pel *e1,*e2; { for (; --h >= 0; e1++,e2++) if (*e1 > *e2) *e1 = *e2; return(0); } /* :h3.edgemax() - Stores the Maximum of Two Edges in First Edge */ static int edgemax(h, e1, e2) register int h; register pel *e1,*e2; { for (; --h >= 0; e1++,e2++) if (*e1 < *e2) *e1 = *e2; return(0); } /* :h3 id=discard.discard() - Discard All Edges Between Two Edges At first glance it would seem that we could discard an edgelist structure merely by unlinking it from the list and freeing it. You are wrong, region-breath! For performance, the X values associated with an edge are allocated contiguously with it. So, we free the X values when we free a structure. However, once an edge has been split, we are no longer sure which control block actually is part of the memory block that contains the edges. Rather than trying to decide, we play it safe and never free part of a region. So, to mark a 'edgelist' structure as discarded, we move it to the end of the list and set ymin=ymax. */ static int discard(left, right) register struct edgelist *left,*right; /* all edges between here exclusive */ /* should be discarded */ { register struct edgelist *beg,*end,*p; IfTrace2((RegionDebug > 0),"discard: l=%p, r=%p\n", left, right); beg = left->link; if (beg == right) return(0); for (p = beg; p != right; p = p->link) { if (p->link == NULL && right != NULL) abort("discard(): ran off end", 38); IfTrace1((RegionDebug > 0),"discarding %p\n", p); p->ymin = p->ymax = 32767; end = p; } /* * now put the chain beg/end at the end of right, if it is not * already there: */ if (right != NULL) { left->link = right; while (right->link != NULL) right = right->link; right->link = beg; } end->link = NULL; return(0); } /* :h2.Changing the Representation of Regions For convenience and/or performance, we sometimes like to change the way regions are represented. This does not change the object itself, just the representation, so these transformations can be made on a permanent region. */ void MoveEdges(R, dx, dy) register struct region *R; /* region to modify */ register fractpel dx,dy; /* delta X and Y to move edge list by */ { register struct edgelist *edge; /* for looping through edges */ R->origin.x += dx; R->origin.y += dy; R->ending.x += dx; R->ending.y += dy; if (R->thresholded != NULL) { R->thresholded->origin.x -= dx; R->thresholded->origin.y -= dy; } /* From now on we will deal with dx and dy as integer pel values: */ dx = NEARESTPEL(dx); dy = NEARESTPEL(dy); if (dx == 0 && dy == 0) return; R->xmin += dx; R->xmax += dx; R->ymin += dy; R->ymax += dy; for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { edge->ymin += dy; edge->ymax += dy; if (dx != 0) { register int h; /* loop index; height of edge */ register pel *Xp; /* loop pointer to X values */ edge->xmin += dx; edge->xmax += dx; for (Xp = edge->xvalues, h = edge->ymax - edge->ymin; --h >= 0; ) *Xp++ += dx; } } } /* :h3.UnJumble() - Sort a Region Top to Bottom It is an open question whether it pays in general to do this. */ void UnJumble(region) struct region *region; /* region to sort */ { register struct edgelist *anchor; /* new lists built here */ register struct edgelist *edge; /* edge pointer for loop */ register struct edgelist *next; /* ditto */ anchor = NULL; for (edge=region->anchor; VALIDEDGE(edge); edge=next) { if (edge->link == NULL) abort("UnJumble: unpaired edge?", 39); next = edge->link->link; edge->link->link = NULL; anchor = SortSwath(anchor, edge, t1_SwathUnion); } if (edge != NULL) vertjoin(anchor, edge); region->anchor = anchor; region->flag &= ~ISJUMBLED(ON); } /* */ #undef NEED_OPTIMZEREGION #ifdef NEED_OPTIMZEREGION static int OptimizeRegion(R) struct region *R; /* region to optimize */ { register pel *xP; /* pel pointer for inner loop */ register int x; /* holds X value */ register int xmin,xmax; /* holds X range */ register int h; /* loop counter */ register struct edgelist *e; /* edgelist pointer for loop */ R->flag |= ISRECTANGULAR(ON); for (e = R->anchor; VALIDEDGE(e); e=e->link) { xmin = MAXPEL; xmax = MINPEL; for (h = e->ymax - e->ymin, xP = e->xvalues; --h >= 0;) { x = *xP++; if (x < xmin) xmin = x; if (x > xmax) xmax = x; } if (xmin != xmax || (xmin != R->xmin && xmax != R->xmax)) R->flag &= ~ISRECTANGULAR(ON); if (xmin < e->xmin || xmax > e->xmax) abort("Tighten: existing edge bound was bad", 40); if (xmin < R->xmin || xmax > R->xmax) abort("Tighten: existing region bound was bad", 41); e->xmin = xmin; e->xmax = xmax; } R->flag |= ISOPTIMIZED(ON); return(0); } #endif /* This function is not used */ /* :h2.Miscelaneous Routines :h3.MoreWorkArea() - Allocate New Space for "edge" Our strategy is to temporarily allocate an array to hold this unexpectedly large edge. ChangeDirection frees this array any time it gets a shorter 'dy'. */ /*ARGSUSED*/ void MoreWorkArea(R, x1, y1, x2, y2) struct region *R; /* region we are generating */ fractpel x1,y1; /* starting point of line */ fractpel x2,y2; /* ending point of line */ { register int idy; /* integer dy of line */ idy = NEARESTPEL(y1) - NEARESTPEL(y2); if (idy < 0) idy = - idy; /* * we must add one to the delta for the number of run ends we * need to store: */ if (++idy > currentsize) { IfTrace1((RegionDebug > 0),"Allocating edge of %d pels\n", idy); if (currentworkarea != workedge) NonObjectFree(currentworkarea); currentworkarea = (pel *)Allocate(0, NULL, idy * sizeof(pel)); currentsize = idy; } ChangeDirection(CD_CONTINUE, R, x1, y1, y2 - y1); } /* :h3.BoxClip() - Clip a Region to a Rectangle BoxClip also duplicates the region if it is permanent. Note the clipping box is specified in REGION coordinates, that is, in coordinates relative to the region (0,0) point */ struct region *BoxClip(R, xmin, ymin, xmax, ymax) register struct region *R; /* region to clip */ register pel xmin,ymin; /* upper left hand corner of rectangle */ register pel xmax,ymax; /* lower right hand corner */ { struct edgelist anchor; /* pretend edgelist to facilitate discards */ register struct edgelist *e,*laste; IfTrace1((OffPageDebug),"BoxClip of %p:\n", R); R = UniqueRegion(R); if (xmin > R->xmin) { IfTrace2((OffPageDebug),"BoxClip: left clip old %d new %d\n", (LONG) R->xmin, (LONG) xmin); R->xmin = xmin; } if (xmax < R->xmax) { IfTrace2((OffPageDebug),"BoxClip: right clip old %d new %d\n", (LONG) R->xmax, (LONG) xmax); R->xmax = xmax; } if (ymin > R->ymin) { IfTrace2((OffPageDebug),"BoxClip: top clip old %d new %d\n", (LONG) R->ymin, (LONG) ymin); R->ymin = ymin; } if (ymax < R->ymax) { IfTrace2((OffPageDebug),"BoxClip: bottom clip old %d new %d\n", (LONG) R->ymax, (LONG) ymax); R->ymax = ymax; } laste = &anchor; anchor.link = R->anchor; for (e = R->anchor; VALIDEDGE(e); e = e->link) { if (TOP(e) < ymin) { e->xvalues += ymin - e->ymin; e->ymin = ymin; } if (BOTTOM(e) > ymax) e->ymax = ymax; if (TOP(e) >= BOTTOM(e)) { discard(laste, e->link->link); e = laste; continue; } if (e->xmin < xmin) { cedgemax(BOTTOM(e) - TOP(e), e->xvalues, xmin); e->xmin = xmin; e->xmax = TYPE1_MAX(e->xmax, xmin); } if (e->xmax > xmax) { cedgemin(BOTTOM(e) - TOP(e), e->xvalues, xmax); e->xmin = TYPE1_MIN(e->xmin, xmax); e->xmax = xmax; } laste = e; } R->anchor = anchor.link; return(R); } #ifdef notdef /* :h3.CoerceRegion() - Force a TextPath Structure to Become a Region We also save the newly created region in the textpath structure, if the structure was permanent. Then we don't have to do this again. Why not save it all the time? Well, we certainly could, but I suspect it wouldn't pay. We would have to make this region permanent (because we couldn't have it be consumed) and this would probably require unnecessary CopyRegions in most cases. */ struct region *CoerceRegion(tp) register struct textpath *tp; /* input TEXTTYPE */ { struct segment *path; /* temporary character path */ struct region *R; /* returned region */ R = Interior(path, EVENODDRULE); return(R); } #endif /* :h3.RegionBounds() - Returns Bounding Box of a Region */ struct segment *RegionBounds(R) register struct region *R; { register struct segment *path; /* returned path */ path = BoxPath(IDENTITY, R->ymax - R->ymin, R->xmax - R->xmin); path = Join(PathSegment(MOVETYPE, R->origin.x + TOFRACTPEL(R->xmin), R->origin.y + TOFRACTPEL(R->ymin) ), path); return(path); } /* :h2.Formatting/Dump Routines for Debug :h3.DumpArea() - Display a Region */ void DumpArea(area) register struct region *area; { IfTrace1(TRUE,"Dumping area %p,", area); IfTrace4(TRUE," X %d:%d Y %d:%d;", (LONG) area->xmin, (LONG) area->xmax, (LONG) area->ymin,(LONG) area->ymax); IfTrace4(TRUE," origin=(%d,%d), ending=(%d,%d)\n", area->origin.x, area->origin.y, area->ending.x, area->ending.y); DumpEdges(area->anchor); } #define INSWATH(p, y0, y1) (p != NULL && p->ymin == y0 && p->ymax == y1) /* :h3.DumpEdges() - Display Run End Lists (Edge Lists) */ static pel RegionDebugYMin = MINPEL; static pel RegionDebugYMax = MAXPEL; void DumpEdges(edges) register struct edgelist *edges; { register struct edgelist *p,*p2; register pel ymin = MINPEL; register pel ymax = MINPEL; register int y; if (edges == NULL) { IfTrace0(TRUE," NULL area.\n"); return; } if (RegionDebug <= 1) { for (p=edges; p != NULL; p = p->link) { edgecheck(p, ymin, ymax); ymin = p->ymin; ymax = p->ymax; IfTrace3(TRUE,". at %p type=%d flag=%x", p, (LONG) p->type,(LONG) p->flag); IfTrace4(TRUE," bounding box HxW is %dx%d at (%d,%d)\n", (LONG) ymax - ymin, (LONG) p->xmax - p->xmin, (LONG) p->xmin, (LONG) ymin); } } else { for (p2=edges; p2 != NULL; ) { edgecheck(p2, ymin, ymax); ymin = p2->ymin; ymax = p2->ymax; if (RegionDebug > 3 || (ymax > RegionDebugYMin && ymin < RegionDebugYMax)) { IfTrace2 (TRUE,". Swath from %d to %d:\n", ymin, ymax); for (p=p2; INSWATH(p,ymin,ymax); p = p->link) { IfTrace4(TRUE,". . at %p[%x] range %d:%d, ", p, (LONG) p->flag, (LONG) p->xmin, (LONG)p->xmax); IfTrace1(TRUE, "subpath=%p,\n", p->subpath); } } for (y=TYPE1_MAX(ymin,RegionDebugYMin); y < TYPE1_MIN(ymax, RegionDebugYMax); y++) { IfTrace1(TRUE,". . . Y[%5d] ", (LONG) y); for (p=p2; INSWATH(p,ymin,ymax); p = p->link) IfTrace1(TRUE,"%5d ", (LONG) p->xvalues[y - ymin]); IfTrace0(TRUE,"\n"); } while (INSWATH(p2, ymin, ymax)) p2 = p2->link; } } } /* :h3.edgecheck() - For Debug, Verify that an Edge Obeys the Rules */ /*ARGSUSED*/ static int edgecheck(edge, oldmin, oldmax) struct edgelist *edge; int oldmin,oldmax; { if (edge->type != EDGETYPE) abort("EDGE ERROR: non EDGETYPE in list", 42); /* The following check is not valid if the region is jumbled so I took it out: */ /* if (edge->ymin < oldmax && edge->ymin != oldmin) abort("EDGE ERROR: overlapping swaths", 43); */ return(0); } grace-5.1.23/T1lib/type1/cluts.h0000644000076500001440000000307306626627165015773 0ustar fnevgenyusers/* $XConsortium: cluts.h,v 1.2 91/10/10 11:17:54 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define KillCLUT(T) #define CopyCLUT(T) T #define UniqueCLUT(T) grace-5.1.23/T1lib/type1/lines.h0000644000076500001440000000360106626627166015751 0ustar fnevgenyusers/* $XConsortium: lines.h,v 1.2 91/10/10 11:18:23 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define StepLine(R,x1,y1,x2,y2) t1_StepLine(R,x1,y1,x2,y2) #define Bresenham(e,x1,y1,x2,y2) t1_Bresenham(e,x1,y1,x2,y2) void t1_StepLine(); /* check for special conditions, call Bresenham */ void t1_Bresenham(); /* produce run ends for lines */ /*END SHARED*/ grace-5.1.23/T1lib/type1/arith.c0000644000076500001440000003344706765275311015747 0ustar fnevgenyusers/* $XConsortium: arith.c,v 1.2 91/10/10 11:14:06 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* ARITH CWEB V0006 ******** */ /* :h1.ARITH Module - Portable Module for Multiple Precision Fixed Point Arithmetic This module provides division and multiplication of 64-bit fixed point numbers. (To be more precise, the module works on numbers that take two 'longs' to store. That is almost always equivalent to saying 64-bit numbers.) Note: it is frequently easy and desirable to recode these functions in assembly language for the particular processor being used, because assembly language, unlike C, will have 64-bit multiply products and 64-bit dividends. This module is offered as a portable version. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Sten F. Andler :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "arith.h" /* :h3. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Reference for all algorithms: Donald E. Knuth, "The Art of Computer Programming, Volume 2, Semi-Numerical Algorithms," Addison-Wesley Co., Massachusetts, 1969, pp. 229-279. Knuth talks about a 'digit' being an arbitrary sized unit and a number being a sequence of digits. We'll take a digit to be a 'short'. The following assumption must be valid for these algorithms to work: :ol. :li.A 'long' is two 'short's. :eol. The following code is INDEPENDENT of: :ol. :li.The actual size of a short. :li.Whether shorts and longs are stored most significant byte first or least significant byte first. :eol. SHORTSIZE is the number of bits in a short; LONGSIZE is the number of bits in a long; MAXSHORT is the maximum unsigned short: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* ASSEMBLE concatenates two shorts to form a long: */ #define ASSEMBLE(hi,lo) ((((ULONG)hi)<>SHORTSIZE) #define LOWDIGIT(u) ((u)&MAXSHORT) /* SIGNBITON tests the high order bit of a long 'w': */ #define SIGNBITON(w) (((LONG)w)<0) /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Double Long Arithmetic :h3.DLmult() - Multiply Two Longs to Yield a Double Long The two multiplicands must be positive. */ void DLmult(product, u, v) register doublelong *product; register ULONG u; register ULONG v; { register ULONG u1, u2; /* the digits of u */ register ULONG v1, v2; /* the digits of v */ register unsigned int w1, w2, w3, w4; /* the digits of w */ register ULONG t; /* temporary variable */ /* printf("DLmult(? ?, %x, %x)\n", u, v); */ u1 = HIGHDIGIT(u); u2 = LOWDIGIT(u); v1 = HIGHDIGIT(v); v2 = LOWDIGIT(v); if (v2 == 0) w4 = w3 = w2 = 0; else { t = u2 * v2; w4 = LOWDIGIT(t); t = u1 * v2 + HIGHDIGIT(t); w3 = LOWDIGIT(t); w2 = HIGHDIGIT(t); } if (v1 == 0) w1 = 0; else { t = u2 * v1 + w3; w3 = LOWDIGIT(t); t = u1 * v1 + w2 + HIGHDIGIT(t); w2 = LOWDIGIT(t); w1 = HIGHDIGIT(t); } product->high = ASSEMBLE(w1, w2); product->low = ASSEMBLE(w3, w4); } /* :h2.DLdiv() - Divide Two Longs by One Long, Yielding Two Longs Both the dividend and the divisor must be positive. */ void DLdiv(quotient, divisor) doublelong *quotient; /* also where dividend is, originally */ ULONG divisor; { register ULONG u1u2 = quotient->high; register ULONG u3u4 = quotient->low; register LONG u3; /* single digit of dividend */ register int v1,v2; /* divisor in registers */ register LONG t; /* signed copy of u1u2 */ register int qhat; /* guess at the quotient digit */ register ULONG q3q4; /* low two digits of quotient */ register int shift; /* holds the shift value for normalizing */ register int j; /* loop variable */ /* printf("DLdiv(%x %x, %x)\n", quotient->high, quotient->low, divisor); */ /* * Knuth's algorithm works if the dividend is smaller than the * divisor. We can get to that state quickly: */ if (u1u2 >= divisor) { quotient->high = u1u2 / divisor; u1u2 %= divisor; } else quotient->high = 0; if (divisor <= MAXSHORT) { /* * This is the case where the divisor is contained in one * 'short'. It is worthwhile making this fast: */ u1u2 = ASSEMBLE(u1u2, HIGHDIGIT(u3u4)); q3q4 = u1u2 / divisor; u1u2 %= divisor; u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3u4)); quotient->low = ASSEMBLE(q3q4, u1u2 / divisor); return; } /* * At this point the divisor is a true 'long' so we must use * Knuth's algorithm. * * Step D1: Normalize divisor and dividend (this makes our 'qhat' * guesses more accurate): */ for (shift=0; !SIGNBITON(divisor); shift++, divisor <<= 1) { ; } shift--; divisor >>= 1; if ((u1u2 >> (LONGSIZE - shift)) != 0 && shift != 0) abort("DLdiv: dividend too large", 1); u1u2 = (u1u2 << shift) + ((shift == 0) ? 0 : u3u4 >> (LONGSIZE - shift)); u3u4 <<= shift; /* * Step D2: Begin Loop through digits, dividing u1,u2,u3 by v1,v2, * then shifting U left by 1 digit: */ v1 = HIGHDIGIT(divisor); v2 = LOWDIGIT(divisor); q3q4 = 0; u3 = HIGHDIGIT(u3u4); for (j=0; j < 2; j++) { /* * Step D3: make a guess (qhat) at the next quotient denominator: */ qhat = (HIGHDIGIT(u1u2) == v1) ? MAXSHORT : u1u2 / v1; /* * At this point Knuth would have us further refine our * guess, since we know qhat is too big if * * v2 * qhat > ASSEMBLE(u1u2 % v, u3) * * That would make sense if u1u2 % v was easy to find, as it * would be in assembly language. I ignore this step, and * repeat step D6 if qhat is too big. */ /* * Step D4: Multiply v1,v2 times qhat and subtract it from * u1,u2,u3: */ u3 -= qhat * v2; /* * The high digit of u3 now contains the "borrow" for the * rest of the substraction from u1,u2. * Sometimes we can lose the sign bit with the above. * If so, we have to force the high digit negative: */ t = HIGHDIGIT(u3); if (t > 0) t |= -1 << SHORTSIZE; t += u1u2 - qhat * v1; /* printf("..>divide step qhat=%x t=%x u3=%x u1u2=%x v1=%x v2=%x\n", qhat, t, u3, u1u2, v1, v2); */ while (t < 0) { /* Test is Step D5. */ /* * D6: Oops, qhat was too big. Add back in v1,v2 and * decrease qhat by 1: */ u3 = LOWDIGIT(u3) + v2; t += HIGHDIGIT(u3) + v1; qhat--; /* printf("..>>qhat correction t=%x u3=%x qhat=%x\n", t, u3, qhat); */ } /* * Step D7: shift U left one digit and loop: */ u1u2 = t; if (HIGHDIGIT(u1u2) != 0) abort("divide algorithm error", 2); u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3)); u3 = LOWDIGIT(u3u4); q3q4 = ASSEMBLE(q3q4, qhat); } quotient->low = q3q4; /* printf("DLdiv returns %x %x\n", quotient->high, quotient->low); */ return; } /* :h3.DLadd() - Add Two Double Longs In this case, the doublelongs may be signed. The algorithm takes the piecewise sum of the high and low longs, with the possibility that the high should be incremented if there is a carry out of the low. How to tell if there is a carry? Alex Harbury suggested that if the sum of the lows is less than the max of the lows, there must have been a carry. Conversely, if there was a carry, the sum of the lows must be less than the max of the lows. So, the test is "if and only if". */ void DLadd(u, v) doublelong *u; /* u = u + v */ doublelong *v; { register ULONG lowmax = TYPE1_MAX(u->low, v->low); /* printf("DLadd(%x %x, %x %x)\n", u->high, u->low, v->high, v->low); */ u->high += v->high; u->low += v->low; if (lowmax > u->low) u->high++; } /* :h3.DLsub() - Subtract Two Double Longs Testing for a borrow is even easier. If the v.low is greater than u.low, there must be a borrow. */ void DLsub(u, v) doublelong *u; /* u = u - v */ doublelong *v; { /* printf("DLsub(%x %x, %x %x)\n", u->high, u->low, v->high, v->low);*/ u->high -= v->high; if (v->low > u->low) u->high--; u->low -= v->low; } /* :h3.DLrightshift() - Macro to Shift Double Long Right by N */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Fractional Pel Arithmetic */ /* :h3.FPmult() - Multiply Two Fractional Pel Values This funtion first calculates w = u * v to "doublelong" precision. It then shifts w right by FRACTBITS bits, and checks that no overflow will occur when the resulting value is passed back as a fractpel. */ fractpel FPmult(u, v) register fractpel u,v; { doublelong w; register int negative = FALSE; /* sign flag */ int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if ((u == 0) || (v == 0)) return (0); if (u < 0) {u = -u; negative = TRUE;} if (v < 0) {v = -v; negative = !negative;} if (u == TOFRACTPEL(1)) return ((negative) ? -v : v); if (v == TOFRACTPEL(1)) return ((negative) ? -u : u); DLmult(&w, u, v); DLrightshift(w, FRACTBITS); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace2(TRUE,"FPmult: overflow, %dx%d\n", u, v); w.low = TOFRACTPEL(maxshort); } return ((negative) ? -w.low : w.low); } /* :h3.FPdiv() - Divide Two Fractional Pel Values These values may be signed. The function returns the quotient. */ fractpel FPdiv(dividend, divisor) register fractpel dividend; register fractpel divisor; { doublelong w; /* result will be built here */ int negative = FALSE; /* flag for sign bit */ int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if (dividend < 0) { dividend = -dividend; negative = TRUE; } if (divisor < 0) { divisor = -divisor; negative = !negative; } w.low = dividend << FRACTBITS; w.high = dividend >> (LONGSIZE - FRACTBITS); DLdiv(&w, divisor); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace2(TRUE,"FPdiv: overflow, %d/%d\n", dividend, divisor); w.low = TOFRACTPEL(maxshort); } return( (negative) ? -w.low : w.low); } /* :h3.FPstarslash() - Multiply then Divide Borrowing a chapter from the language Forth, it is useful to define an operator that first multiplies by one constant then divides by another, keeping the intermediate result in extended precision. */ fractpel FPstarslash(a, b, c) register fractpel a,b,c; /* result = a * b / c */ { doublelong w; /* result will be built here */ int negative = FALSE; int maxshort = MAXSHORT; /* To avoid that overflow warning (RMz) */ if (a < 0) { a = -a; negative = TRUE; } if (b < 0) { b = -b; negative = !negative; } if (c < 0) { c = -c; negative = !negative; } DLmult(&w, a, b); DLdiv(&w, c); if (w.high != 0 || SIGNBITON(w.low)) { IfTrace3(TRUE,"FPstarslash: overflow, %d*%d/%d\n", a, b, c); w.low = TOFRACTPEL(maxshort); } return((negative) ? -w.low : w.low); } grace-5.1.23/T1lib/type1/lines.c0000644000076500001440000001273106626627166015750 0ustar fnevgenyusers/* $XConsortium: lines.c,v 1.2 91/10/10 11:18:21 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* LINES CWEB V0003 ******** */ /* :h1.LINES Module - Rasterizing Lines &author. Duaine W. Pryor, Jr. and Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "regions.h" #include "lines.h" /* :h3.Functions Provided to the TYPE1IMAGER User None. */ /* :h3.Functions Provided to Other Modules This module provides the following entry point to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules None. */ /* :h2.StepLine() - Produces Run Ends for a Line After Checks The main work is done by Bresenham(); here we just perform checks and get the line so that its Y direction is always increasing: */ void StepLine(R, x1, y1, x2, y2) register struct region *R; /* region being built */ register fractpel x1,y1; /* starting point */ register fractpel x2,y2; /* ending point */ { register fractpel dy; IfTrace4((LineDebug > 0), ".....StepLine: (%d,%d) to (%d,%d)\n", x1, y1, x2, y2); dy = y2 - y1; /* We execute the "GOING_TO" macro to call back the REGIONS module, if necessary (like if the Y direction of the edge has changed): */ GOING_TO(R, x1, y1, x2, y2, dy); if (dy == 0) return; if (dy < 0) Bresenham(R->edge, x2, y2, x1, y1); else Bresenham(R->edge, x1, y1, x2, y2); return; } /* :h3.Bresenham() - Actually Produces Run Ends This routine runs a Bresenham line-stepping algorithm. See, for example, Newman and Sproul, :hp1/Principles of Interactive Computer Graphics/, pp. 25-27. When we enter this, we are guaranteed that dy is positive. We'd like to work in 8 bit precision, so we'll define some macros and constants to let us do that: */ #define PREC 8 /* we'll keep fraction pels in 8 bit precision */ /* RoundFP() rounds down by 'b' bits: */ #define RoundFP(xy,b) (((xy)+(1<<((b)-1)))>>(b)) /* TruncFP() truncates down by 'b' bits: */ #define TruncFP(xy,b) ((xy)>>(b)) void Bresenham(edgeP,x1,y1,x2,y2) register pel *edgeP; /* pointer to top of list (y == 0) */ register fractpel x1,y1; /* starting point on line */ register fractpel x2,y2; /* ending point on the line (down) */ { register LONG dx,dy; /* change in x and y, in my own precision */ register LONG x,y; /* integer pel starting point */ register int count; /* integer pel delta y */ register LONG d; /* the Bresenham algorithm error term */ x1 = TruncFP(x1, FRACTBITS-PREC); y1 = TruncFP(y1, FRACTBITS-PREC); x2 = TruncFP(x2, FRACTBITS-PREC); y2 = TruncFP(y2, FRACTBITS-PREC); dx = x2 - x1; dy = y2 - y1; /* Find the starting x and y integer pel coordinates: */ x = RoundFP(x1,PREC); y = RoundFP(y1,PREC); edgeP += y; count = RoundFP(y2,PREC) - y; /*------------------------------------------------------------------*/ /* Force dx to be positive so that dfy will be negative */ /* this means that vertical moves will decrease d */ /*------------------------------------------------------------------*/ if (dx<0) { dx = -dx; #define P PREC d=(dy*(x1-(x<>P; #undef P while(--count >= 0 ) { while(d<0) { --x; d += dy; } *(edgeP++) = x; d -= dx; } } else /* positive dx */ { #define P PREC d = (dy*((x<>P; #undef P while(--count >= 0 ) { while(d<0) { ++x; d += dy; } *(edgeP++) = x; d -= dx; } } } grace-5.1.23/T1lib/type1/fontmisc.h0000644000076500001440000000344106626627165016462 0ustar fnevgenyusers/* * $XConsortium: fontmisc.h,v 1.5 91/05/12 16:15:48 rws Exp $ * * Copyright 1991 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, MIT X Consortium */ #ifndef _FONTMISC_H_ #define _FONTMISC_H_ #ifdef XSERVER #include "Xfuncs.h" #endif typedef unsigned char *pointer; /* To suppress gcc-warning (11/25/97, RMz) */ #ifndef T1DELETE_C typedef int Bool; #endif #ifndef X_PROTOCOL typedef unsigned long Atom; typedef unsigned long XID; #endif #ifndef LSBFirst #define LSBFirst 0 #define MSBFirst 1 #endif #ifndef None #define None 0l #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif extern char *NameForAtom (); #define lowbit(x) ((x) & (~(x) + 1)) #define assert(x) #endif /* _FONTMISC_H_ */ grace-5.1.23/T1lib/type1/font.h0000644000076500001440000000653306626627165015613 0ustar fnevgenyusers/* $XConsortium: font.h,v 1.8 91/07/19 21:03:49 rws Exp $ */ /*********************************************************** Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, and the Massachusetts Institute of Technology, Cambridge, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* $NCDId: @(#)font.h,v 1.7 1991/06/24 17:00:23 lemke Exp $ */ #ifndef FONT_H #define FONT_H #ifndef BitmapFormatByteOrderMask #include "fsmasks.h" #endif /* data structures */ typedef struct _Font *FontPtr; typedef struct _FontInfo *FontInfoPtr; typedef struct _FontProp *FontPropPtr; typedef struct _ExtentInfo *ExtentInfoPtr; typedef struct _FontPathElement *FontPathElementPtr; typedef struct _CharInfo *CharInfoPtr; typedef struct _FontNames *FontNamesPtr; typedef struct _FontResolution *FontResolutionPtr; #define NullCharInfo ((CharInfoPtr) 0) #define NullFont ((FontPtr) 0) #define NullFontInfo ((FontInfoPtr) 0) /* draw direction */ #define LeftToRight 0 #define RightToLeft 1 #define BottomToTop 2 #define TopToBottom 3 typedef int DrawDirection; #define NO_SUCH_CHAR -1 #define FontAliasType 0x1000 #define AllocError 80 #define StillWorking 81 #define FontNameAlias 82 #define BadFontName 83 #define Suspended 84 #define Successful 85 #define BadFontPath 86 #define BadCharRange 87 #define BadFontFormat 88 #define FPEResetFailed 89 /* for when an FPE reset won't work */ /* OpenFont flags */ #define FontLoadInfo 0x0001 #define FontLoadProps 0x0002 #define FontLoadMetrics 0x0004 #define FontLoadBitmaps 0x0008 #define FontLoadAll 0x000f #define FontOpenSync 0x0010 /* Query flags */ #define LoadAll 0x1 #define FinishRamge 0x2 #define EightBitFont 0x4 #define SixteenBitFont 0x8 typedef char *closure; extern int StartListFontsWithInfo( /* client, length, pattern, maxNames */ ); extern int ListFonts( /* client, length, pattern, maxNames */ ); extern FontNamesPtr MakeFontNamesRecord( /* size */ ); extern void FreeFontNames(); extern int AddFontNamesName(); extern int FontToFSError(); extern FontResolutionPtr GetClientResolution(); typedef struct _FontPatternCache *FontPatternCachePtr; extern FontPatternCachePtr MakeFontPatternCache (); extern void FreeFontPatternCache (); extern void EmtpyFontPatternCache (); extern void CacheFontPattern (); extern FontPtr FindCachedFontPattern (); extern void RemoveCachedFontPattern (); #endif /* FONT_H */ grace-5.1.23/T1lib/type1/fonts.h0000644000076500001440000000354506626627165015776 0ustar fnevgenyusers/* $XConsortium: fonts.h,v 1.2 91/10/10 11:18:09 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* STUB */ #define CopyFont(f) f #define UniqueFont(f) f #define KillFont(f) #define KillText(t) #define CopyText(t) t #define I_DumpText(t) #define CoerceText(t) t #define TextDelta(t,pt) #define XformText(p,s) #define GimeSpace() FALSE #define LibInit() #define InitFonts() #define InitFiles() #define TraceClose() #define FF_PARSE_ERROR -1 grace-5.1.23/T1lib/type1/hints.h0000644000076500001440000000412206626627166015763 0ustar fnevgenyusers/* $XConsortium: hints.h,v 1.2 91/10/10 11:18:19 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define InitHints() t1_InitHints() void t1_InitHints(); /* Initialize hint data structure */ #define CloseHints(hintP) t1_CloseHints(hintP) void t1_CloseHints(); /* Reverse hints that are still open */ #define ProcessHint(hP, currX, currY, hintP) t1_ProcessHint(hP, currX, currY, hintP) void t1_ProcessHint(); /* Process a rasterization hint */ #define ApplyContinuity(R) t1_ApplyContinuity(R) void t1_ApplyContinuity(); /* fix false connection breaks in a region */ /*END SHARED*/ grace-5.1.23/T1lib/type1/strokes.h0000644000076500001440000000323706626627166016336 0ustar fnevgenyusers/* $XConsortium: strokes.h,v 1.2 91/10/10 11:19:25 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /*STUB*/ #define CopyLineStyle(s) s #define CopyStrokePath(p) p #define KillStrokePath(p) #define KillLineStyle(s) #define CoercePath(sp) sp #define DoStroke(sp) sp grace-5.1.23/T1lib/type1/.dependencies0000644000076500001440000000254507415144745017115 0ustar fnevgenyusersarith.lo: arith.c types.h objects.h spaces.h arith.h bstring.lo: bstring.c curves.lo: curves.c types.h objects.h spaces.h paths.h regions.h \ curves.h lines.h arith.h fontfcn.lo: fontfcn.c t1imager.h types.h fontmisc.h util.h fontfcn.h \ paths_rmz.h spaces_rmz.h ../t1lib/parseAFM.h ../t1lib/t1types.h \ ../t1lib/t1extern.h ../t1lib/t1misc.h ../t1lib/t1base.h \ ../t1lib/t1finfo.h hints.lo: hints.c types.h objects.h spaces.h paths.h regions.h hints.h lines.lo: lines.c types.h objects.h spaces.h regions.h lines.h objects.lo: objects.c types.h objects.h spaces.h paths.h regions.h \ fonts.h pictures.h strokes.h cluts.h paths.lo: paths.c types.h objects.h spaces.h paths.h regions.h fonts.h \ pictures.h strokes.h trig.h regions.lo: regions.c types.h objects.h spaces.h regions.h paths.h \ curves.h lines.h pictures.h fonts.h hints.h strokes.h scanfont.lo: scanfont.c t1stdio.h types.h util.h token.h fontfcn.h \ blues.h spaces.lo: spaces.c types.h objects.h spaces.h paths.h pictures.h \ fonts.h arith.h trig.h t1io.lo: t1io.c t1stdio.h types.h t1hdigit.h t1snap.lo: t1snap.c objects.h types.h spaces.h paths.h t1stub.lo: t1stub.c objects.h types.h token.lo: token.c types.h t1stdio.h util.h digit.h token.h tokst.h \ hdigit.h type1.lo: type1.c types.h objects.h spaces.h paths.h fonts.h pictures.h \ util.h fontfcn.h blues.h util.lo: util.c types.h util.h fontmisc.h grace-5.1.23/T1lib/type1/t1stub.c0000644000076500001440000000331706715154351016046 0ustar fnevgenyusers/* $XConsortium: t1stub.c,v 1.3 92/03/20 15:58:40 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #include #include "objects.h" /* get #define for abort() */ int xiStub( void) { printf("xiStub called\n"); abort("xiStub called", 48); return(0); } void t1_DumpText( void) { xiStub(); } grace-5.1.23/T1lib/type1/fontfcn.c0000644000076500001440000011250607415144745016266 0ustar fnevgenyusers/* $XConsortium: fontfcn.c,v 1.8 92/03/27 18:15:45 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include #include #include #include "t1imager.h" #include "util.h" #include "fontfcn.h" #include "fontmisc.h" #include "paths_rmz.h" #include "../t1lib/parseAFM.h" #include "../t1lib/t1types.h" #include "../t1lib/t1extern.h" #include "../t1lib/t1misc.h" #include "../t1lib/t1base.h" #include "../t1lib/t1finfo.h" extern xobject Type1Char(psfont *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, psobj *osubrsP, struct blues_struct *bluesP, int *modeP, char *name); extern xobject Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length); extern boolean Init_BuiltInEncoding( void); void objFormatName(psobj *objP, int length, char *valueP); extern void T1io_reset( void); #define BEZIERTYPE 0x10+0x02 #define LINETYPE 0x10+0x00 #define MOVETYPE 0x10+0x05 /***================================================================***/ /* GLOBALS */ /***================================================================***/ static char CurCharName[257]=""; static char BaseCharName[257]=""; char CurFontName[120]; char *CurFontEnv; char *vm_base = NULL; static char notdef[]=".notdef"; /* the following is inserted by RMz for VM checking and reallocating: */ char *vm_used = NULL; extern int vm_init_count; extern int vm_init_amount; static psfont *FontP = NULL; psfont TheCurrentFont; /***================================================================***/ /* SearchDict - look for name */ /* - compare for match on len and string */ /* return 0 - not found. */ /* return n - nth element in dictionary. */ /***================================================================***/ int SearchDictName(dictP,keyP) psdict *dictP; psobj *keyP; { int i,n; n = dictP[0].key.len; for (i=1;i<=n;i++) { /* scan the intire dictionary */ if ( (dictP[i].key.len == keyP->len ) && (strncmp(dictP[i].key.data.valueP, keyP->data.valueP, keyP->len) == 0 ) ) return(i); } return(0); } /***================================================================***/ /* assignment of &TheCurrentFont removed by RMz: */ boolean initFont() { if (!(vm_init())) return(FALSE); vm_base = vm_next_byte(); if (!(Init_BuiltInEncoding())) return(FALSE); strcpy(CurFontName, ""); /* iniitialize to none */ FontP->vm_start = vm_next_byte(); FontP->FontFileName.len = 0; FontP->FontFileName.data.valueP = CurFontName; return(TRUE); } /***================================================================***/ int resetFont(env) char *env; { vm_next = FontP->vm_start; vm_free = vm_size - ( vm_next - vm_base); FontP->Subrs.len = 0; FontP->Subrs.data.stringP = NULL; FontP->CharStringsP = NULL; FontP->Private = NULL; FontP->fontInfoP = NULL; FontP->BluesP = NULL; /* This will load the font into the FontP */ strcpy(CurFontName,env); FontP->FontFileName.len = strlen(CurFontName); FontP->FontFileName.data.nameP = CurFontName; T1io_reset(); return(0); } /***================================================================***/ /* Read font used to attempt to load the font and, upon failure, try a second time with twice as much memory. Unfortunately, if it's a really complex font, simply using 2*vm_size may be insufficient. I've modified it so that the program will try progressively larger amounts of memory until it really runs out or the font loads successfully. (ndw) */ int readFont(env) char *env; { int rcode; /* int memscale = 2; */ /* initially, try twice just like we used to ... */ /* restore the virtual memory and eliminate old font */ resetFont(env); /* This will load the font into the FontP */ rcode = scan_font(FontP); return(rcode); } static int isCompositeChar( int FontID, char *charname) { int i; FontInfo *pAFMData; if (pFontBase->pFontArray[FontID].pAFMData==NULL) { /* No AFM data present */ return( -1); } pAFMData=pFontBase->pFontArray[FontID].pAFMData; for ( i=0; inumOfComps; i++) { if (strcmp( pAFMData->ccd[i].ccName, charname)==0) return( i); } return( -1); } /* dump a description of path elements to stdout */ static T1_PATHPOINT getDisplacement( struct segment *path) { register struct segment *ipath; register struct beziersegment *ibpath; T1_PATHPOINT point={0,0}; /* Step through the path list */ ipath=(struct segment *)path; do { if (ipath->type==LINETYPE) { point.x+=ipath->dest.x; point.y+=ipath->dest.y; } else if (ipath->type==MOVETYPE) { point.x+=ipath->dest.x; point.y+=ipath->dest.y; } else if (ipath->type==BEZIERTYPE) { ibpath=(struct beziersegment *)ipath; point.x+=ibpath->dest.x; point.y+=ibpath->dest.y; } ipath=ipath->link; } while (ipath!=NULL); return( point); } /***================================================================***/ /* RMz: instead of code, which is a character pointer to the name of the character, we use "ev" which is a pointer to a desired encoding vector (or NULL if font-internal encoding should be used) and "index" as an index into the desired encoding vector! The user thus has the opportunity of supplying whatever encoding he wants. Font_Ptr is the pointer to the local psfont-structure. */ xobject fontfcnB(int FontID, int modflag, struct XYspace *S, char **ev, unsigned char index, int *mode, psfont *Font_Ptr, int do_raster) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; if (ev==NULL){ /* font-internal encoding should be used */ charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[index].len; charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[index].data.arrayP; } else{ /* some user-supplied encoding is to be used */ charnameP->len = strlen(ev[index]); charnameP->data.stringP = (unsigned char *) ev[index]; } strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the chars string for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* damaged Font */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( charpath); /* concat displacement and symbol path */ charpath=(struct segment *)Join(tmppath1,charpath); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(charpath,tmppath3); } else { charpath=(struct segment *)Join(charpath,tmppath3); tmppath4=(struct segment *)Join(tmppath4,charpath); } } /* concat composite symbols and base char */ if (tmppath4==NULL) { /* no previous composite symbols */ charpath=tmppath2; /* a simple char */ } else { charpath=(struct segment *)Join(tmppath4,tmppath2); } if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((xobject) charpath); } /***================================================================***/ /* fontfcnA(env, mode) */ /* */ /* env is a pointer to a string that contains the fontname. */ /* */ /* 1) initialize the font - global indicates it has been done */ /* 2) load the font */ /* */ /* This function has been modified by RMz. It now takes a pointer which already contains the address of a valid type1 font structure as the third argument. The value of this pointer is first handed to FontP so that most other routines may be used without changes */ #define MAXTRIAL 4 /***================================================================***/ Bool fontfcnA(env,mode,Font_Ptr) char *env; int *mode; psfont *Font_Ptr; { int i, result; /* set the global font pointer to the address of already allocated structure */ FontP=Font_Ptr; InitImager(); /* Read the font program. */ for (i=1; ifontInfoP; objFormatName(&nameObj,strlen(infoName),infoName); N = SearchDictName(dictP,&nameObj); /* if found */ if ( N > 0 ) { *rcodeP = 0; switch (dictP[N].value.type) { case OBJ_ARRAY: valueP = dictP[N].value.data.arrayP; if (strcmp(infoName,"FontMatrix") == 0) { /* 6 elments, return them as floats */ for (i=0;i<6;i++) { if (valueP->type == OBJ_INTEGER ) ((float *)infoValue)[i] = valueP->data.integer; else ((float *)infoValue)[i] = valueP->data.real; valueP++; } } if (strcmp(infoName,"FontBBox") == 0) { /* 4 elments for Bounding Box. all integers */ for (i=0;i<4;i++) { ((int *)infoValue)[i] = valueP->data.integer; valueP++; } break; case OBJ_INTEGER: case OBJ_BOOLEAN: *((int *)infoValue) = dictP[N].value.data.integer; break; case OBJ_REAL: *((float *)infoValue) = dictP[N].value.data.real; break; case OBJ_NAME: case OBJ_STRING: *((char **)infoValue) = dictP[N].value.data.valueP; break; default: *rcodeP = 1; break; } } } else *rcodeP = 1; } /***================================================================***/ /* RMz: instead of code, which is a character pointer to the name of the character, we use "ev" which is a pointer to a desired encoding vector (or NULL if font-internal encoding should be used) and "index" as an index into the desired encoding vector! The user thus has the opportunity of supplying whatever encoding he wants. Font_Ptr is the pointer to the local psfont-structure. */ xobject fontfcnB_string( int FontID, int modflag, struct XYspace *S, char **ev, unsigned char *string, int no_chars, int *mode, psfont *Font_Ptr, int *kern_pairs, long spacewidth, int do_raster) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int k=0; long acc_width=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; struct segment *tmppath5=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; /* In the following for-loop, all characters are processed, one after the other. Between them, the amount of kerning is inserted. The number of path variables used is somewhat numerous. We use the follwing conventions: charpath: the overall path of the string. tmppath5: the overall path of one component (possibly a composite symbol) tmppath2: the path of a simple char or base char of a composite tmppath4: the path of all "accents" of a composite symbol */ for (k=0; klen = FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].len; charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].data.arrayP; } else { /* some user-supplied encoding is to be used */ charnameP = &CodeName; charnameP->len = strlen(ev[string[k]]); charnameP->data.stringP = (unsigned char*) ev[string[k]]; } /* Spacing is to be under users control: => if space is the charname, don't raster it. Rather, generate a horizontal movement of spacewidth: */ if (strcmp((char *)charnameP->data.stringP, "space")==0){ tmppath5=(struct segment *)ILoc(S, spacewidth,0); acc_width += spacewidth; } else { /* here a character or composite character is to be constructed */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the CharString for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); strcpy( BaseCharName, CurCharName); /* if Type1Char reports an error, clean up and return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) { if (charpath!=NULL) { KillPath( charpath); } if (tmppath1!=NULL) { KillPath( tmppath1); } if (tmppath2!=NULL) { KillPath( tmppath2); } if (tmppath3!=NULL) { KillPath( tmppath3); } if (tmppath4!=NULL) { KillPath( tmppath4); } if (tmppath5!=NULL) { KillPath( tmppath5); } return(NULL); } /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* an undefined .notdef is fatal -> clean up and return */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } if (tmppath1!=NULL) { KillPath( tmppath1); } if (tmppath2!=NULL) { KillPath( tmppath2); } if (tmppath3!=NULL) { KillPath( tmppath3); } if (tmppath4!=NULL) { KillPath( tmppath4); } if (tmppath5!=NULL) { KillPath( tmppath5); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; tmppath5=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( tmppath5); /* concat displacement and symbol path */ tmppath5=(struct segment *)Join(tmppath1,tmppath5); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(tmppath5,tmppath3); } else { tmppath5=(struct segment *)Join(tmppath5,tmppath3); tmppath4=(struct segment *)Join(tmppath4,tmppath5); } } /* concat composite symbols and base char. We use tmppath5 to store the path of the resulting (possibly composite) character. */ if (tmppath4==NULL) { /* no previous composite symbols */ tmppath5=tmppath2; /* a simple char */ } else { tmppath5=(struct segment *)Join(tmppath4,tmppath2); } /* Accumulate displacement, but be careful: In case of composite characters, we have to take the escapement of the base char only into account, because accents do not cause spacing. The path is constructed in a way that this automatically matches. */ if (numPieces>1) { /* composite character */ acc_width +=pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[string[k]]+1)].wx; } else { /* ordinary character */ acc_width +=pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[string[k]]-1].wx; } } /* else (if (char==space) */ /* character path is now stored in tmppath5. It may be a composite character. Insert kerning amount, if it is not the last character of the string. */ if (kpFontArray[FontID].UndrLnPos, pFontBase->pFontArray[FontID].UndrLnThick, (float) acc_width); charpath=(struct segment *)Join(charpath,tmppath2); } if (modflag & T1_OVERLINE){ tmppath2=(struct segment *)Type1Line(FontP,S, pFontBase->pFontArray[FontID].OvrLnPos, pFontBase->pFontArray[FontID].OvrLnThick, (float) acc_width); charpath=(struct segment *)Join(charpath,tmppath2); } if (modflag & T1_OVERSTRIKE){ tmppath2=(struct segment *)Type1Line(FontP,S, pFontBase->pFontArray[FontID].OvrStrkPos, pFontBase->pFontArray[FontID].OvrStrkThick, (float) acc_width); charpath=(struct segment *)Join(charpath,tmppath2); } /* printf("charpath->type: %x\n",charpath->type); printf("path1->type: %x\n",path1->type); printf("path2->type: %x\n",path2->type); */ /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR) return(NULL); if ( *mode == FF_PATH_ERROR) return(NULL); if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *) Interior((path) charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((path)charpath); } /* This special variant is for generating character bitmaps from charactername */ xobject fontfcnB_ByName( int FontID, int modflag, struct XYspace *S, unsigned char *charname, int *mode, psfont *Font_Ptr, int do_raster) { psobj *charnameP; /* points to psobj that is name of character*/ FontInfo *pAFMData=NULL; int i=-1; int j=0; int numPieces=1; int N; T1_PATHPOINT currdisp; int basechar; psdict *CharStringsDictP; /* dictionary with char strings */ psobj CodeName; /* used to store the translation of the name*/ psobj *SubrsArrayP; psobj *theStringP; int localmode=0; struct segment *charpath=NULL; /* the path for this character */ struct segment *tmppath1=NULL; struct segment *tmppath2=NULL; struct segment *tmppath3=NULL; struct segment *tmppath4=NULL; /* set the global font pointer to the address of already allocated structure and setup pointers*/ FontP=Font_Ptr; CharStringsDictP = FontP->CharStringsP; SubrsArrayP = &(FontP->Subrs); charnameP = &CodeName; charnameP->len = strlen((char*)charname); charnameP->data.stringP = charname; strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* search the chars string for this charname as key */ basechar = SearchDictName(CharStringsDictP,charnameP); if (basechar<=0) { /* Check first, whether a char in question is a composite char */ if ((i=isCompositeChar( FontID, CurCharName))>-1) { /* i is now the index of the composite char definitions (starting at 0). At this point it is clear that AFM-info must be present -> fetch first component of composite char. */ pAFMData=pFontBase->pFontArray[FontID].pAFMData; charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName; numPieces=pAFMData->ccd[i].numOfPieces; if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) { /* this is bad, AFM-file and font file do not match. This will most probably lead to errors or inconsistencies later. However, we substitute .notdef and inform the user via logfile and T1_errno. */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[0].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); T1_errno=T1ERR_COMPOSITE_CHAR; } } } if (basechar<=0) { /* This means the requested char is unknown or the base char of a composite is not found -> we substitute .notdef */ charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; basechar = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* Font must be completely damaged if it doesn't define a .notdef */ if (basechar<=0) { *mode=FF_PARSE_ERROR; return(NULL); } } /* if (basechar<=0) */ /* basechar is now the index of the base character in the CharStrings dictionary */ /* we provide the Type1Char() procedure with the name of the character to rasterize for debugging purposes */ strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; /* get CharString and character path */ theStringP = &(CharStringsDictP[basechar].value); tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); /* if Type1Char reported an error, then return */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* Defer rastering to later, we first have to handle the composite symbols */ for (j=1; jlen=strlen( pAFMData->ccd[i].pieces[j].pccName); charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName; /* get CharString definition */ if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) { /* handling of errors, see comments above ... */ sprintf( err_warn_msg_buf, "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)", pAFMData->ccd[i].pieces[j].pccName, pAFMData->ccd[i].ccName, FontID); T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING); charnameP = &CodeName; charnameP->len = 7; charnameP->data.stringP = (unsigned char *) notdef; N = SearchDictName(CharStringsDictP,charnameP); localmode=FF_NOTDEF_SUBST; /* damaged Font */ if (N<=0) { *mode=FF_PARSE_ERROR; if (charpath!=NULL) { KillPath( charpath); } return(NULL); } } theStringP = &(CharStringsDictP[N].value); tmppath1=(struct segment *)ILoc(S, pAFMData->ccd[i].pieces[j].deltax, pAFMData->ccd[i].pieces[j].deltay); strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len); CurCharName[charnameP->len]='\0'; charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL, FontP->BluesP,mode,CurCharName); /* return if Type1Char reports an error */ if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) return(NULL); /* get escapement of current symbol */ currdisp=getDisplacement( charpath); /* concat displacement and symbol path */ charpath=(struct segment *)Join(tmppath1,charpath); /* for composite symbols we have to step back the char escapement. this is, in order to be able to use accents that cause a non zero displacement of the current point! We further have to step back the displacement from composite char data. */ tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y); tmppath3=(struct segment *)ILoc(S, -pAFMData->ccd[i].pieces[j].deltax, -pAFMData->ccd[i].pieces[j].deltay); tmppath3=(struct segment *)Join(tmppath1,tmppath3); /* create path, or, respectively, append to existing path */ if (tmppath4==NULL) { tmppath4=(struct segment *)Join(charpath,tmppath3); } else { charpath=(struct segment *)Join(charpath,tmppath3); tmppath4=(struct segment *)Join(tmppath4,charpath); } } /* concat composite symbols and base char */ if (tmppath4==NULL) { /* no previous composite symbols */ charpath=tmppath2; /* a simple char */ } else { charpath=(struct segment *)Join(tmppath4,tmppath2); } if (do_raster) { /* fill with winding rule unless path was requested */ if (*mode != FF_PATH) { charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY); } } if (*mode==0) *mode=localmode; return((xobject) charpath); } grace-5.1.23/T1lib/type1/spaces.h0000644000076500001440000001352706626627166016125 0ustar fnevgenyusers/* $XConsortium: spaces.h,v 1.3 91/10/10 11:19:22 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define USER t1_User #define IDENTITY t1_Identity #define Context(d,u) t1_Context(d,u) #define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4) #define Rotate(o,d) t1_Rotate(o,d) #define Scale(o,sx,sy) t1_Scale(o,sx,sy) #define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) #define Warp(s1,o,s2) t1_Warp(s1,o,s2) struct XYspace *t1_Context(); /* creates a coordinate space for a device */ struct xobject *t1_Transform(); /* transform an object */ struct xobject *t1_Rotate(); /* rotate an object */ struct xobject *t1_Scale(); /* scale an object */ struct xobject *t1_Warp(); /* transform like delta of two spaces */ void t1_QuerySpace(); /* returns coordinate space matrix */ /*END SHARED*/ /*SHARED*/ #define DeviceResolution t1_DeviceResolution #define InitSpaces() t1_InitSpaces() #define CopySpace(s) t1_CopySpace(s) #define Xform(o,M) t1_Xform(o,M) #define UnConvert(S,pt,xp,yp) t1_UnConvert(S,pt,xp,yp) #define MatrixMultiply(A,B,C) t1_MMultiply(A,B,C) #define MatrixInvert(A,B) t1_MInvert(A,B) #define PseudoSpace(S,M) t1_PseudoSpace(S,M) #define FindContext(M) t1_FindContext(M) void t1_InitSpaces(); /* initialize pre-defined coordinate spaces */ struct XYspace *t1_CopySpace(); /* duplicate a coordinate space */ struct xobject *t1_Xform(); /* transform object by matrix */ void t1_UnConvert(); /* return user coordinates from device coordinates */ void t1_MMultiply(); /* multiply two matrices */ void t1_MInvert(); /* invert a matrix */ void t1_PseudoSpace(); /* force a coordinate space from a matrix */ int t1_FindContext(); /* return the "context" represented by a matrix */ /*END SHARED*/ /*SHARED*/ /* #define KillSpace(s) Free(s) Note - redefined KillSpace() to check references ! 3-26-91 PNM */ #define KillSpace(s) if ( (--(s->references) == 0) ||\ ( (s->references == 1) && ISPERMANENT(s->flag) ) )\ Free(s) #define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s)) #define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s)) /*END SHARED*/ /*SHARED*/ typedef SHORT pel; /* integer pel locations */ typedef LONG fractpel; /* fractional pel locations */ #define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ /* We define the following macros to convert from 'fractpel' to 'pel' and vice versa: */ #define TOFRACTPEL(p) (((fractpel)p)<>FRACTBITS) #define FRACTFLOAT (DOUBLE)(1L< .dependencies"): include .dependencies grace-5.1.23/T1lib/type1/t1stdio.h0000644000076500001440000000574706640030660016222 0ustar fnevgenyusers/* $XConsortium: t1stdio.h,v 1.4 91/10/10 11:19:49 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* T1IO FILE structure and related stuff */ #include "types.h" #undef getc #undef fclose #undef ungetc #undef fgetc #undef fread #undef feof #undef ferror #undef FILE #define FILE F_FILE typedef unsigned char F_char; typedef struct F_FILE { F_char *b_base; /* Pointer to beginning of buffer */ LONG b_size; /* Size of the buffer */ F_char *b_ptr; /* Pointer to next char in buffer */ LONG b_cnt; /* Number of chars remaining in buffer */ F_char flags; /* other flags; != 0 means getc must call fgetc */ F_char ungotc; /* Place for ungotten char; flag set if present */ short error; /* error status */ int fd; /* underlying file descriptor */ } F_FILE; /* defines for flags */ #define UNGOTTENC (0x01) #define FIOEOF (0x80) #define FIOERROR (0x40) #ifndef NULL #define NULL 0 /* null pointer */ #endif #define EOF (-1) /* end of file */ #define F_BUFSIZ (512) #define getc(f) \ ( \ ( ((f)->b_cnt > 0) && ((f)->flags == 0) ) ? \ ( (f)->b_cnt--, (unsigned int)*( (f)->b_ptr++ ) ) : \ T1Getc(f) \ ) extern FILE *T1Open(), *T1eexec(); extern int T1Close(), T1Ungetc(), T1Read(); #define fclose(f) T1Close(f) #define fopen(name,mode) T1Open(name,mode) #define ungetc(c,f) T1Ungetc(c,f) #define fgetc(f) T1Getc(f) #define fread(bufP,size,n,f) T1Read(bufP,size,n,f) #define feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) #define ferror(f) (((f)->flags & FIOERROR)?(f)->error:0) grace-5.1.23/T1lib/type1/t1intf.h0000644000076500001440000000311606626627166016045 0ustar fnevgenyusers/* $XConsortium: t1intf.h,v 1.2 91/10/10 11:19:39 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #define FIRSTCOL 0 struct type1font { CharInfoPtr pDefault; CharInfoRec glyphs[256-FIRSTCOL]; }; grace-5.1.23/T1lib/type1/fontfcn.h0000644000076500001440000000735206715154350016270 0ustar fnevgenyusers/* $XConsortium: fontfcn.h,v 1.3 92/03/26 16:42:23 eswu Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Definition of a PostScript FONT */ typedef struct ps_font { char *vm_start; psobj FontFileName; psobj Subrs; psdict *CharStringsP; psdict *Private; psdict *fontInfoP; struct blues_struct *BluesP; } psfont; /***================================================================***/ /* Routines in scan_font */ /***================================================================***/ extern boolean Init_StdEnc(); extern int scan_font(); extern int GetFontInfo(); /***================================================================***/ /* Return codes from scan_font */ /***================================================================***/ #define SCAN_OK 0 #define SCAN_FILE_EOF -1 #define SCAN_ERROR -2 #define SCAN_OUT_OF_MEMORY -3 #define SCAN_FILE_OPEN_ERROR -4 #define SCAN_MMFONT -5 /* font is a Multiple Master Font */ #define SCAN_TRUE -6 #define SCAN_FALSE -7 #define SCAN_END -8 /***================================================================***/ /* Name of FontInfo fields */ /***================================================================***/ #define FONTNAME 1 #define PAINTTYPE 2 #define FONTTYPENUM 3 #define FONTMATRIX 4 #define FONTBBOX 5 #define UNIQUEID 6 #define STROKEWIDTH 7 #define VERSION 8 #define NOTICE 9 #define FULLNAME 10 #define FAMILYNAME 11 #define WEIGHT 12 #define ITALICANGLE 13 #define ISFIXEDPITCH 14 #define UNDERLINEPOSITION 15 #define UNDERLINETHICKNESS 16 #define ENCODING 17 /***================================================================***/ /* Name of Private values */ /***================================================================***/ #define BLUEVALUES 1 #define OTHERBLUES 2 #define FAMILYBLUES 3 #define FAMILYOTHERBLUES 4 #define BLUESCALE 5 #define BLUESHIFT 6 #define BLUEFUZZ 7 #define STDHW 8 #define STDVW 9 #define STEMSNAPH 10 #define STEMSNAPV 11 #define FORCEBOLD 12 #define LANGUAGEGROUP 13 #define LENIV 14 #define RNDSTEMUP 15 #define EXPANSIONFACTOR 16 grace-5.1.23/T1lib/type1/type1.c0000644000076500001440000020440307244311606015661 0ustar fnevgenyusers/* $XConsortium: type1.c,v 1.5 91/10/10 11:20:06 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * Portions Copyright (c) 1990 Adobe Systems Incorporated. * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark or Adobe * not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /*********************************************************************/ /* */ /* Type 1 module - Converting fonts in Adobe Type 1 Font Format */ /* to scaled and hinted paths for rasterization. */ /* Files: type1.c, type1.h, and blues.h. */ /* */ /* Authors: Sten F. Andler, IBM Almaden Research Center */ /* (Type 1 interpreter, stem & flex hints) */ /* */ /* Patrick A. Casey, Lexmark International, Inc. */ /* (Font level hints & stem hints) */ /* */ /*********************************************************************/ /******************/ /* Include Files: */ /******************/ #include "types.h" #include /* a system-dependent include, usually */ #include #include "objects.h" #include "spaces.h" #include "paths.h" #include "fonts.h" /* understands about TEXTTYPEs */ #include "pictures.h" /* understands about handles */ typedef struct xobject xobject; #include "util.h" /* PostScript objects */ #include "fontfcn.h" #include "blues.h" /* Blues structure for font-level hints */ /**********************************/ /* Type1 Constants and Structures */ /**********************************/ #define MAXSTACK 24 /* Adobe Type1 limit */ #define MAXCALLSTACK 10 /* Adobe Type1 limit */ #define MAXPSFAKESTACK 32 /* Max depth of fake PostScript stack (local) */ #define MAXSTRLEN 512 /* Max length of a Type 1 string (local) */ #define MAXLABEL 256 /* Maximum number of new hints */ #define MAXSTEMS 512 /* Maximum number of VSTEM and HSTEM hints */ #define EPS 0.001 /* Small number for comparisons */ /************************************/ /* Adobe Type 1 CharString commands */ /************************************/ #define HSTEM 1 #define VSTEM 3 #define VMOVETO 4 #define RLINETO 5 #define HLINETO 6 #define VLINETO 7 #define RRCURVETO 8 #define CLOSEPATH 9 #define CALLSUBR 10 #define RETURN 11 #define ESCAPE 12 #define HSBW 13 #define ENDCHAR 14 #define RMOVETO 21 #define HMOVETO 22 #define VHCURVETO 30 #define HVCURVETO 31 /* The following charstring code appears in some old Adobe font files in space and .notdef character and does not seems to do anything useful aside from taking two args from the stack. We allow this command and ignore it. The source code of ghostscript states that this command is obsolete *and* undocumented. This code may also appear in an Escape-sequence! */ #define UNKNOWN_15 15 /*******************************************/ /* Adobe Type 1 CharString Escape commands */ /*******************************************/ #define DOTSECTION 0 #define VSTEM3 1 #define HSTEM3 2 #define SEAC 6 #define SBW 7 #define DIV 12 #define CALLOTHERSUBR 16 #define POP 17 #define SETCURRENTPOINT 33 /* Note: We use routines from libm because in the original macro definitions, the evaluation order of tmpx is undefined by C-standard! */ #define USE_MATHLIB_ROUTINES #ifdef USE_MATHLIB_ROUTINES #define FABS(x) (fabs (x)) #define CEIL(x) ((LONG) ceil (x)) #define FLOOR(x) ((LONG) floor (x)) #else /*****************/ /* Useful macros */ /*****************/ static DOUBLE tmpx; /* Store macro argument in tmpx to avoid re-evaluation */ static LONG tmpi; /* Store converted value in tmpi to avoid re-evaluation */ #define FABS(x) (((tmpx = (x)) < 0.0) ? -tmpx : tmpx) #define CEIL(x) (((tmpi = (LONG) (tmpx = (x))) < tmpx) ? ++tmpi : tmpi) #define FLOOR(x) (((tmpi = (LONG) (tmpx = (x))) > tmpx) ? --tmpi : tmpi) #endif #define ROUND(x) FLOOR((x) + 0.5) #define ODD(x) (((int)(x)) & 01) #define CC IfTrace1(TRUE, "Char \"%s\": ", currentchar) /* To make some compiler happy we have to care about return types! */ #define Errori {errflag = TRUE; return 0;} /* integer */ #define Errord {errflag = TRUE; return 0.0;} /* double */ #define Errorv {errflag = TRUE; return;} /* void */ #define Error0i(errmsg) { CC; IfTrace0(TRUE, errmsg); Errori;} #define Error0d(errmsg) { CC; IfTrace0(TRUE, errmsg); Errord;} #define Error0v(errmsg) { CC; IfTrace0(TRUE, errmsg); Errorv;} #define Error1i(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errori;} #define Error1d(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errord;} #define Error1v(errmsg,arg) { CC; IfTrace1(TRUE, errmsg, arg); Errorv;} /********************/ /* global variables */ /********************/ struct stem { /* representation of a STEM hint */ int vertical; /* TRUE if vertical, FALSE otherwise */ DOUBLE x, dx; /* interval of vertical stem */ DOUBLE y, dy; /* interval of horizontal stem */ struct segment *lbhint, *lbrevhint; /* left or bottom hint adjustment */ struct segment *rthint, *rtrevhint; /* right or top hint adjustment */ }; extern struct XYspace *IDENTITY; static DOUBLE escapementX, escapementY; static DOUBLE sidebearingX, sidebearingY; static DOUBLE accentoffsetX, accentoffsetY; static struct segment *path; static int errflag; /*************************************************/ /* Global variables to hold Type1Char parameters */ /*************************************************/ static char *Environment; static char *currentchar; static struct XYspace *CharSpace; static psobj *CharStringP, *SubrsP, *OtherSubrsP; static int *ModeP; /************************/ /* Forward declarations */ /************************/ static DOUBLE Div(); static DOUBLE PSFakePop(); static int DoCommand(); static int Escape(); static int HStem(); static int VStem(); static int RLineTo(); static int RRCurveTo(); static int DoClosePath(); static int CallSubr(); static int Return(); static int EndChar(); static int RMoveTo(); static int DotSection(); static int Seac(); static int Sbw(); static int CallOtherSubr(); static int SetCurrentPoint(); /*****************************************/ /* statics for Flex procedures (FlxProc) */ /*****************************************/ static struct segment *FlxOldPath; /* save path before Flex feature */ /******************************************************/ /* statics for Font level hints (Blues) (see blues.h) */ /******************************************************/ static struct blues_struct *blues; /* the blues structure */ static struct alignmentzone alignmentzones[MAXALIGNMENTZONES]; int numalignmentzones; /* total number of alignment zones */ /****************************************************************/ /* Subroutines for the Font level hints (Alignment zones, etc.) */ /****************************************************************/ /* Flags to control the rasterizer */ #define T1_IGNORE_FORCEBOLD 0x0001 #define T1_IGNORE_FAMILYALIGNMENT 0x0002 #define T1_IGNORE_HINTING 0x0004 #define T1_DEBUG_LINE 0x0100 #define T1_DEBUG_REGION 0x0200 #define T1_DEBUG_PATH 0x0400 #define T1_DEBUG_FONT 0x0800 #define T1_DEBUG_HINT 0x1000 int T1_Type1OperatorFlags; /* for manipulation from t1lib */ static void SetRasterFlags( void) { if (T1_Type1OperatorFlags & T1_IGNORE_HINTING) ProcessHints=0; else ProcessHints=1; if ( T1_Type1OperatorFlags & T1_DEBUG_LINE) LineDebug=1; else LineDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_REGION) RegionDebug=1; else RegionDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_PATH) PathDebug=1; else PathDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_FONT) FontDebug=1; else FontDebug=0; if ( T1_Type1OperatorFlags & T1_DEBUG_HINT) HintDebug=1; else HintDebug=0; return; } /******************************************/ /* Fill in the alignment zone structures. */ /******************************************/ static int ComputeAlignmentZones() { int i; DOUBLE dummy, bluezonepixels, familyzonepixels; struct segment *p; numalignmentzones = 0; /* initialize total # of zones */ /* Remarks by RMz (Author of t1lib): The handling of substitution of the BlueValues by the FamilyBlues and correspondingly for the OtherBlues and FamilyOtherBlues is not clearly documented. These are the problems: 1) Does the number of FamilyBlues entries need to be identical to that of BlueValues? 2) Obviously, the order of the alignment zones in the BlueValues and the FamilyBlues need not be same (see TimesBold.pfa) 3) Is it wise/recommended to make the substitution on a per alignment-zone level or global, i.e., if once then for all zones? 4) The principle found below, checking the delta-height of an alignment-zone and making a decision based on this is incorrect. The decision has to be done according to absolute pixel values at which a feature would be rendered with the BlueValues and the FamilyBlues respectively. To conclude, it seems better to disable the Family-feature until these things are well-known/defined. */ /* do the BlueValues zones */ for (i = 0; i < blues->numBlueValues; i +=2, ++numalignmentzones) { /* the 0th & 1st numbers in BlueValues are for a bottom zone */ /* the rest are topzones */ if (i == 0) /* bottom zone */ alignmentzones[numalignmentzones].topzone = FALSE; else /* top zone */ alignmentzones[numalignmentzones].topzone = TRUE; /* Check FamilyAlignment suppression */ if ( (T1_Type1OperatorFlags & T1_IGNORE_FAMILYALIGNMENT)==0) { if (i < blues->numFamilyBlues) { /* we must consider FamilyBlues */ p = ILoc(CharSpace,0,blues->BlueValues[i] - blues->BlueValues[i+1]); QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); Destroy(p); p = ILoc(CharSpace,0,blues->FamilyBlues[i] - blues->FamilyBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); Destroy(p); /* is the difference in size of the zones less than 1 pixel? */ if (FABS(bluezonepixels - familyzonepixels) < 1.0) { /* use the Family zones */ alignmentzones[numalignmentzones].bottomy = blues->FamilyBlues[i]; alignmentzones[numalignmentzones].topy = blues->FamilyBlues[i+1]; continue; } } } /* use this font's Blue zones */ alignmentzones[numalignmentzones].bottomy = blues->BlueValues[i]; alignmentzones[numalignmentzones].topy = blues->BlueValues[i+1]; } /* do the OtherBlues zones */ for (i = 0; i < blues->numOtherBlues; i +=2, ++numalignmentzones) { /* all of the OtherBlues zones are bottom zones */ alignmentzones[numalignmentzones].topzone = FALSE; /* Check FamilyAlignment suppression */ if ( (T1_Type1OperatorFlags & T1_IGNORE_FAMILYALIGNMENT)==0) { if (i < blues->numFamilyOtherBlues) {/* consider FamilyOtherBlues */ p = ILoc(CharSpace,0,blues->OtherBlues[i] - blues->OtherBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); Destroy(p); p = ILoc(CharSpace,0,blues->FamilyOtherBlues[i] - blues->FamilyOtherBlues[i+1]); QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); Destroy(p); /* is the difference in size of the zones less than 1 pixel? */ if (FABS(bluezonepixels - familyzonepixels) < 1.0) { /* use the Family zones */ alignmentzones[numalignmentzones].bottomy = blues->FamilyOtherBlues[i]; alignmentzones[numalignmentzones].topy = blues->FamilyOtherBlues[i+1]; continue; } } } /* use this font's Blue zones (as opposed to the Family Blues */ alignmentzones[numalignmentzones].bottomy = blues->OtherBlues[i]; alignmentzones[numalignmentzones].topy = blues->OtherBlues[i+1]; } return(0); } /**********************************************************************/ /* Subroutines and statics for handling of the VSTEM and HSTEM hints. */ /**********************************************************************/ int InDotSection; /* DotSection flag */ struct stem stems[MAXSTEMS]; /* All STEM hints */ int numstems; /* Number of STEM hints */ int currstartstem; /* The current starting stem. */ int oldvert, oldhor; /* Remember hint in effect */ int oldhorhalf, oldverthalf; /* Remember which half of the stem */ DOUBLE wsoffsetX, wsoffsetY; /* White space offset - for VSTEM3,HSTEM3 */ int wsset; /* Flag for whether we've set wsoffsetX,Y */ static int InitStems() /* Initialize the STEM hint data structures */ { InDotSection = FALSE; currstartstem = numstems = 0; oldvert = oldhor = -1; return(0); } static int FinitStems() /* Terminate the STEM hint data structures */ { int i; for (i = 0; i < numstems; i++) { Destroy(stems[i].lbhint); Destroy(stems[i].lbrevhint); Destroy(stems[i].rthint); Destroy(stems[i].rtrevhint); } return(0); } /*******************************************************************/ /* Compute the dislocation that a stemhint should cause for points */ /* inside the stem. */ /*******************************************************************/ static int ComputeStem(stemno) int stemno; { int verticalondevice, idealwidth; DOUBLE stemstart, stemwidth; struct segment *p; int i; DOUBLE stembottom, stemtop, flatposition; DOUBLE Xpixels, Ypixels; DOUBLE unitpixels, onepixel; int suppressovershoot, enforceovershoot; DOUBLE stemshift, flatpospixels, overshoot; DOUBLE widthdiff; /* Number of character space units to adjust width */ DOUBLE lbhintvalue, rthintvalue; DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */ int rotated; /* TRUE if character is on the side, FALSE if upright */ /************************************************/ /* DETERMINE ORIENTATION OF CHARACTER ON DEVICE */ /************************************************/ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) rotated = TRUE; /* Char is on side (90 or 270 degrees), possibly oblique. */ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) rotated = FALSE; /* Char is upright (0 or 180 degrees), possibly oblique. */ else { stems[stemno].lbhint = NULL; /* Char is at non-axial angle, ignore hints. */ stems[stemno].lbrevhint = NULL; stems[stemno].rthint = NULL; stems[stemno].rtrevhint = NULL; return(0); } /* Determine orientation of stem */ if (stems[stemno].vertical) { verticalondevice = !rotated; stemstart = stems[stemno].x; stemwidth = stems[stemno].dx; } else { verticalondevice = rotated; stemstart = stems[stemno].y; stemwidth = stems[stemno].dy; } /* Determine how many pixels (non-negative) correspond to 1 character space unit (unitpixels), and how many character space units (non-negative) correspond to one pixel (onepixel). */ if (stems[stemno].vertical) p = ILoc(CharSpace, 1, 0); else p = ILoc(CharSpace, 0, 1); QueryLoc(p, IDENTITY, &Xpixels, &Ypixels); Destroy(p); if (verticalondevice) unitpixels = FABS(Xpixels); else unitpixels = FABS(Ypixels); onepixel = 1.0 / unitpixels; /**********************/ /* ADJUST STEM WIDTHS */ /**********************/ widthdiff = 0.0; /* Find standard stem with smallest width difference from this stem */ if (stems[stemno].vertical) { /* vertical stem */ if (blues->StdVW != 0) /* there is an entry for StdVW */ widthdiff = blues->StdVW - stemwidth; for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ if (FABS(blues->StemSnapV[i] - stemwidth) < FABS(widthdiff)) /* this standard width is the best match so far for this stem */ widthdiff = blues->StemSnapV[i] - stemwidth; } } else { /* horizontal stem */ if (blues->StdHW != 0) /* there is an entry for StdHW */ widthdiff = blues->StdHW - stemwidth; for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ if (FABS(blues->StemSnapH[i] - stemwidth) < FABS(widthdiff)) /* this standard width is the best match so far for this stem */ widthdiff = blues->StemSnapH[i] - stemwidth; } } /* Only expand or contract stems if they differ by less than 1 pixel from the closest standard width, otherwise make the width difference = 0. */ if (FABS(widthdiff) > onepixel) widthdiff = 0.0; /* Expand or contract stem to the nearest integral number of pixels. */ idealwidth = ROUND((stemwidth + widthdiff) * unitpixels); /* Ensure that all stems are at least one pixel wide. */ if (idealwidth == 0) idealwidth = 1; /* Apply ForceBold to vertical stems. */ if (blues->ForceBold && stems[stemno].vertical && ((T1_Type1OperatorFlags & T1_IGNORE_FORCEBOLD)==0)) /* Force this vertical stem to be at least DEFAULTBOLDSTEMWIDTH wide. */ if (idealwidth < DEFAULTBOLDSTEMWIDTH) idealwidth = DEFAULTBOLDSTEMWIDTH; /* Now compute the number of character space units necessary */ widthdiff = idealwidth * onepixel - stemwidth; /*********************************************************************/ /* ALIGNMENT ZONES AND OVERSHOOT SUPPRESSION - HORIZONTAL STEMS ONLY */ /*********************************************************************/ stemshift = 0.0; if (!stems[stemno].vertical) { /* Get bottom and top boundaries of the stem. */ stembottom = stemstart; stemtop = stemstart + stemwidth; /* Find out if this stem intersects an alignment zone (the BlueFuzz */ /* entry in the Private dictionary specifies the number of character */ /* units to extend (in both directions) the effect of an alignment */ /* zone on a horizontal stem. The default value of BlueFuzz is 1. */ for (i = 0; i < numalignmentzones; ++i) { if (alignmentzones[i].topzone) { if (stemtop >= alignmentzones[i].bottomy && stemtop <= alignmentzones[i].topy + blues->BlueFuzz) { break; /* We found a top-zone */ } } else { if (stembottom <= alignmentzones[i].topy && stembottom >= alignmentzones[i].bottomy - blues->BlueFuzz) { break; /* We found a bottom-zone */ } } } if (i < numalignmentzones) { /* We found an intersecting zone (number i). */ suppressovershoot = FALSE; enforceovershoot = FALSE; /* When 1 character space unit is rendered smaller than BlueScale device units (pixels), we must SUPPRESS overshoots. Otherwise, if the top (or bottom) of this stem is more than BlueShift character space units away from the flat position, we must ENFORCE overshoot. */ if (unitpixels < blues->BlueScale){ suppressovershoot = TRUE; } else{ if (alignmentzones[i].topzone){ if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift){ enforceovershoot = TRUE; } else if (stembottom <= alignmentzones[i].topy - blues->BlueShift){ enforceovershoot = TRUE; } } } /*************************************************/ /* ALIGN THE FLAT POSITION OF THE ALIGNMENT ZONE */ /*************************************************/ /* Compute the position of the alignment zone's flat position in device space and the amount of shift needed to align it on a pixel boundary. Move all stems this amount. */ if (alignmentzones[i].topzone) flatposition = alignmentzones[i].bottomy; else flatposition = alignmentzones[i].topy; /* Find the flat position in pixels */ flatpospixels = flatposition * unitpixels; /* Find the stem shift necessary to align the flat position on a pixel boundary, and use this shift for all stems */ stemshift = (ROUND(flatpospixels) - flatpospixels) * onepixel; /************************************************/ /* HANDLE OVERSHOOT ENFORCEMENT AND SUPPRESSION */ /************************************************/ /* Compute overshoot amount (non-negative) */ if (alignmentzones[i].topzone) overshoot = stemtop - flatposition; else overshoot = flatposition - stembottom; if (overshoot > 0.0) { /* ENFORCE overshoot by shifting the entire stem (if necessary) so that it falls at least one pixel beyond the flat position. */ if (enforceovershoot){ if (overshoot < onepixel){ if (alignmentzones[i].topzone) stemshift += onepixel - overshoot; else stemshift -= onepixel - overshoot; } } /* SUPPRESS overshoot by aligning the stem to the alignment zone's flat position. */ if (suppressovershoot){ if (alignmentzones[i].topzone) stemshift -= overshoot; else stemshift += overshoot; } } /************************************************************/ /* COMPUTE HINT VALUES FOR EACH SIDE OF THE HORIZONTAL STEM */ /************************************************************/ /* If the stem was aligned by a topzone, we expand or contract the stem only at the bottom - since the stem top was aligned by the zone. If the stem was aligned by a bottomzone, we expand or contract the stem only at the top - since the stem bottom was aligned by the zone. */ if (alignmentzones[i].topzone) { lbhintvalue = stemshift - widthdiff; /* bottom */ rthintvalue = stemshift; /* top */ } else { lbhintvalue = stemshift; /* bottom */ rthintvalue = stemshift + widthdiff; /* top */ } stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue)); stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue)); stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue)); stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue)); return(0); } /* endif (i < numalignmentzones) */ /* We didn't find any alignment zones intersecting this stem, so proceed with normal stem alignment below. */ } /* endif (!stems[stemno].vertical) */ /* Align stem with pixel boundaries on device */ stemstart = stemstart - widthdiff / 2; stemshift = ROUND(stemstart * unitpixels) * onepixel - stemstart; /* Adjust the boundaries of the stem */ lbhintvalue = stemshift - widthdiff / 2; /* left or bottom */ rthintvalue = stemshift + widthdiff / 2; /* right or top */ if (stems[stemno].vertical) { stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, lbhintvalue, 0.0)); stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, -lbhintvalue, 0.0)); stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, rthintvalue, 0.0)); stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, -rthintvalue, 0.0)); } else { stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue)); stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue)); stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue)); stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue)); } return(0); } #define LEFT 1 #define RIGHT 2 #define BOTTOM 3 #define TOP 4 /*********************************************************************/ /* Adjust a point using the given stem hint. Use the left/bottom */ /* hint value or the right/top hint value depending on where the */ /* point lies in the stem. */ /*********************************************************************/ static struct segment *Applyhint(p, stemnumber, half) struct segment *p; int stemnumber, half; { if (half == LEFT || half == BOTTOM) return Join(p, stems[stemnumber].lbhint); /* left or bottom hint */ else return Join(p, stems[stemnumber].rthint); /* right or top hint */ } /*********************************************************************/ /* Adjust a point using the given reverse hint. Use the left/bottom */ /* hint value or the right/top hint value depending on where the */ /* point lies in the stem. */ /*********************************************************************/ static struct segment *Applyrevhint(p, stemnumber, half) struct segment *p; int stemnumber, half; { if (half == LEFT || half == BOTTOM) return Join(p, stems[stemnumber].lbrevhint); /* left or bottom hint */ else return Join(p, stems[stemnumber].rtrevhint); /* right or top hint */ } /***********************************************************************/ /* Find the vertical and horizontal stems that the current point */ /* (x, y) may be involved in. At most one horizontal and one vertical */ /* stem can apply to a single point, since there are no overlaps */ /* allowed. */ /* The actual hintvalue is returned as a location. */ /* Hints are ignored inside a DotSection. */ /***********************************************************************/ static struct segment *FindStems(x, y, dx, dy) DOUBLE x, y, dx, dy; { int i; int newvert, newhor; struct segment *p; int newhorhalf, newverthalf; if (InDotSection) return(NULL); newvert = newhor = -1; newhorhalf = newverthalf = -1; for (i = currstartstem; i < numstems; i++) { if (stems[i].vertical) { /* VSTEM hint */ if ((x >= stems[i].x - EPS) && (x <= stems[i].x+stems[i].dx + EPS)) { newvert = i; if (dy != 0.0) { if (dy < 0) newverthalf = LEFT; else newverthalf = RIGHT; } else { if (x < stems[i].x+stems[i].dx / 2) newverthalf = LEFT; else newverthalf = RIGHT; } } } else { /* HSTEM hint */ if ((y >= stems[i].y - EPS) && (y <= stems[i].y+stems[i].dy + EPS)) { newhor = i; if (dx != 0.0) { if (dx < 0) newhorhalf = TOP; else newhorhalf = BOTTOM; } else { if (y < stems[i].y+stems[i].dy / 2) newhorhalf = BOTTOM; else newhorhalf = TOP; } } } } p = NULL; if (newvert == -1 && oldvert == -1) ; /* Outside of any hints */ else if (newvert == oldvert && newverthalf == oldverthalf); /* No hint change */ else if (oldvert == -1) { /* New vertical hint in effect */ p = Applyhint(p, newvert, newverthalf); } else if (newvert == -1) { /* Old vertical hint no longer in effect */ p = Applyrevhint(p, oldvert, oldverthalf); } else { /* New vertical hint in effect, old hint no longer in effect */ p = Applyrevhint(p, oldvert, oldverthalf); p = Applyhint(p, newvert, newverthalf); } if (newhor == -1 && oldhor == -1) ; /* Outside of any hints */ else if (newhor == oldhor && newhorhalf == oldhorhalf) ; /* No hint change */ else if (oldhor == -1) { /* New horizontal hint in effect */ p = Applyhint(p, newhor, newhorhalf); } else if (newhor == -1) { /* Old horizontal hint no longer in effect */ p = Applyrevhint(p, oldhor, oldhorhalf); } else { /* New horizontal hint in effect, old hint no longer in effect */ p = Applyrevhint(p, oldhor, oldhorhalf); p = Applyhint(p, newhor, newhorhalf); } oldvert = newvert; oldverthalf = newverthalf; oldhor = newhor; oldhorhalf = newhorhalf; return p; } /******************************************************/ /* Subroutines and statics for the Type1Char routines */ /******************************************************/ static int strindex; /* index into PostScript string being interpreted */ static DOUBLE currx, curry; /* accumulated x and y values for hints */ struct callstackentry { psobj *currstrP; /* current CharStringP */ int currindex; /* current strindex */ unsigned short currkey; /* current decryption key */ }; static DOUBLE Stack[MAXSTACK]; static int Top; static struct callstackentry CallStack[MAXCALLSTACK]; static int CallTop; static DOUBLE PSFakeStack[MAXPSFAKESTACK]; static int PSFakeTop; static int ClearStack() { Top = -1; return(0); } static int Push(Num) DOUBLE Num; { if (++Top < MAXSTACK) Stack[Top] = Num; else Error0i("Push: Stack full\n"); return(0); } static int ClearCallStack() { CallTop = -1; return(0); } static int PushCall(CurrStrP, CurrIndex, CurrKey) psobj *CurrStrP; int CurrIndex; unsigned short CurrKey; { if (++CallTop < MAXCALLSTACK) { CallStack[CallTop].currstrP = CurrStrP; /* save CharString pointer */ CallStack[CallTop].currindex = CurrIndex; /* save CharString index */ CallStack[CallTop].currkey = CurrKey; /* save decryption key */ } else Error0i("PushCall: Stack full\n"); return(0); } static int PopCall(CurrStrPP, CurrIndexP, CurrKeyP) psobj **CurrStrPP; int *CurrIndexP; unsigned short *CurrKeyP; { if (CallTop >= 0) { *CurrStrPP = CallStack[CallTop].currstrP; /* restore CharString pointer */ *CurrIndexP = CallStack[CallTop].currindex; /* restore CharString index */ *CurrKeyP = CallStack[CallTop--].currkey; /* restore decryption key */ } else Error0i("PopCall: Stack empty\n"); return(0); } static int ClearPSFakeStack() { PSFakeTop = -1; return(0); } /* PSFakePush: Pushes a number onto the fake PostScript stack */ static int PSFakePush(Num) DOUBLE Num; { if (++PSFakeTop < MAXPSFAKESTACK) PSFakeStack[PSFakeTop] = Num; else Error0i("PSFakePush: Stack full\n"); return(0); } /* PSFakePop: Removes a number from the top of the fake PostScript stack */ static DOUBLE PSFakePop () { if (PSFakeTop >= 0) return(PSFakeStack[PSFakeTop--]); else Error0d("PSFakePop : Stack empty\n"); /*NOTREACHED*/ } /***********************************************************************/ /* Center a stem on the pixel grid -- used by HStem3 and VStem3 */ /***********************************************************************/ static struct segment *CenterStem(edge1, edge2) DOUBLE edge1; DOUBLE edge2; { int idealwidth, verticalondevice; DOUBLE leftx, lefty, rightx, righty, center, width; DOUBLE widthx, widthy; DOUBLE shift, shiftx, shifty; DOUBLE Xpixels, Ypixels; struct segment *p; p = Loc(CharSpace, edge1, 0.0); QueryLoc(p, IDENTITY, &leftx, &lefty); p = Join(p, Loc(CharSpace, edge2, 0.0)); QueryLoc(p, IDENTITY, &rightx, &righty); Destroy(p); widthx = FABS(rightx - leftx); widthy = FABS(righty - lefty); if (widthy <= EPS) { /* verticalondevice hint */ verticalondevice = TRUE; center = (rightx + leftx) / 2.0; width = widthx; } else if (widthx <= EPS) { /* horizontal hint */ verticalondevice = FALSE; center = (righty + lefty) / 2.0; width = widthy; } else { /* neither horizontal nor verticalondevice and not oblique */ return (NULL); } idealwidth = ROUND(width); if (idealwidth == 0) idealwidth = 1; if (ODD(idealwidth)) { /* is ideal width odd? */ /* center stem over pixel */ shift = FLOOR(center) + 0.5 - center; } else { /* align stem on pixel boundary */ shift = ROUND(center) - center; } if (verticalondevice) { shiftx = shift; shifty = 0.0; } else { shifty = shift; shiftx = 0.0; } p = Loc(IDENTITY, shiftx, shifty); QueryLoc(p, CharSpace, &Xpixels, &Ypixels); wsoffsetX = Xpixels; wsoffsetY = Ypixels; currx += wsoffsetX; curry += wsoffsetY; return (p); } /*----------------------------------------------------------------------- Decrypt - From Adobe Type 1 book page 63, with some modifications -----------------------------------------------------------------------*/ #define KEY 4330 /* Initial key (seed) for CharStrings decryption */ #define C1 52845 /* Multiplier for pseudo-random number generator */ #define C2 22719 /* Constant for pseudo-random number generator */ static unsigned short r; /* Pseudo-random sequence of keys */ static unsigned char Decrypt(cipher) unsigned char cipher; { unsigned char plain; plain = cipher ^ (r >> 8); r = (cipher + r) * C1 + C2; return plain; } /* Get the next byte from the codestring being interpreted */ static int DoRead(CodeP) int *CodeP; { if (strindex >= CharStringP->len) return(FALSE); /* end of string */ /* We handle the non-documented Adobe convention to use lenIV=-1 to suppress charstring encryption. */ if (blues->lenIV==-1) { *CodeP = (unsigned char) CharStringP->data.stringP[strindex++]; } else { *CodeP = Decrypt((unsigned char) CharStringP->data.stringP[strindex++]); } return(TRUE); } /* Strip blues->lenIV bytes from CharString and update encryption key */ /* (the lenIV entry in the Private dictionary specifies the number of */ /* random bytes at the beginning of each CharString; default is 4) */ static void StartDecrypt() { int Code; r = KEY; /* Initial key (seed) for CharStrings decryption */ for (strindex = 0; strindex < blues->lenIV;){ if (!DoRead(&Code)) /* Read a byte and update decryption key */ Error0v("StartDecrypt: Premature end of CharString\n"); } } #undef DecodeDebug static int Decode(Code) int Code; { int Code1, Code2, Code3, Code4; if (Code <= 31){ /* Code is [0,31] */ #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d -> Command\n", Code); #endif DoCommand(Code); } else if (Code <= 246){ /* Code is [32,246] */ #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d -> number=%f\n", Code, (DOUBLE)(Code-139)); #endif Push((DOUBLE)(Code - 139)); } else if (Code <= 250) { /* Code is [247,250] */ if (!DoRead(&Code2)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d next Code=%d -> number=%f\n", Code, Code2, (DOUBLE)(((Code - 247) << 8) + Code2 + 108)); #endif Push((DOUBLE)(((Code - 247) << 8) + Code2 + 108)); } else if (Code <= 254) { /* Code is [251,254] */ if (!DoRead(&Code2)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=%d, next Code=%d -> number=%f\n", Code, Code2, (DOUBLE)( -((Code - 251) << 8) - Code2 - 108)); #endif Push((DOUBLE)( -((Code - 251) << 8) - Code2 - 108)); } else { /* Code is 255 */ if (!DoRead(&Code1)) goto ended; if (!DoRead(&Code2)) goto ended; if (!DoRead(&Code3)) goto ended; if (!DoRead(&Code4)) goto ended; #ifdef DecodeDebug fprintf(stderr, "Decode: Code=255, Code1=%d, Code2=%d, Code3=%d, Code4=%d -> number=%f\n", Code1, Code2, Code3, Code4, (DOUBLE)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4)); #endif Push((DOUBLE)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4)); } return(0); ended: Error0i("Decode: Premature end of Type 1 CharString"); } #undef DoCommandDebug /* Interpret a command code */ static int DoCommand(Code) int Code; { switch(Code) { case HSTEM: /* |- y dy HSTEM |- */ #ifdef DoCommandDebug printf("DoCommand: HStem\n"); #endif /* Vertical range of a horizontal stem zone */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); HStem(Stack[0], Stack[1]); ClearStack(); break; case VSTEM: /* |- x dx VSTEM |- */ #ifdef DoCommandDebug printf("DoCommand: VStem\n"); #endif /* Horizontal range of a vertical stem zone */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); VStem(Stack[0], Stack[1]); ClearStack(); break; case VMOVETO: /* |- dy VMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: VMoveto\n"); #endif /* Vertical MOVETO, equivalent to 0 dy RMOVETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(0.0, Stack[0]); ClearStack(); break; case RLINETO: /* |- dx dy RLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: RLineto\n"); #endif /* Like RLINETO in PostScript */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(Stack[0], Stack[1]); ClearStack(); break; case HLINETO: /* |- dx HLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: HLineto\n"); #endif /* Horizontal LINETO, equivalent to dx 0 RLINETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(Stack[0], 0.0); ClearStack(); break; case VLINETO: /* |- dy VLINETO |- */ #ifdef DoCommandDebug printf("DoCommand: VLineto\n"); #endif /* Vertical LINETO, equivalent to 0 dy RLINETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RLineTo(0.0, Stack[0]); ClearStack(); break; case RRCURVETO: #ifdef DoCommandDebug printf("DoCommand: RRCurveto\n"); #endif /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ /* Relative RCURVETO, equivalent to dx1 dy1 */ /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ /* (dy1+dy2+dy3) RCURVETO in PostScript */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(Stack[0], Stack[1], Stack[2], Stack[3], Stack[4], Stack[5]); ClearStack(); break; case CLOSEPATH: /* - CLOSEPATH |- */ #ifdef DoCommandDebug printf("DoCommand: ClosePath\n"); #endif /* Closes a subpath without repositioning the */ /* current point */ DoClosePath(); ClearStack(); break; case CALLSUBR: /* subr# CALLSUBR - */ #ifdef DoCommandDebug printf("DoCommand: CallSubr\n"); #endif /* Calls a CharString subroutine with index */ /* subr# from the Subrs array */ if (Top < 0) Error1i("DoCommand: Stack low\n (Code=%d)", Code); CallSubr((int)Stack[Top--]); break; case RETURN: /* - RETURN - */ #ifdef DoCommandDebug printf("DoCommand: Return\n"); #endif /* Returns from a Subrs array CharString */ /* subroutine called with CALLSUBR */ Return(); break; case ESCAPE: /* ESCAPE to two-byte command code */ #ifdef DoCommandDebug printf("DoCommand: Escape to 2 Byte Code (Code=%d)\n", Code); #endif if (!DoRead(&Code)) Error0i("DoCommand: ESCAPE is last byte\n"); Escape(Code); break; case HSBW: /* |- sbx wx HSBW |- */ #ifdef DoCommandDebug printf("DoCommand: HSBW\n"); #endif /* Set the left sidebearing point to (sbx,0), */ /* set the character width vector to (wx,0). */ /* Equivalent to sbx 0 wx 0 SBW. Space */ /* character should have sbx = 0 */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Sbw(Stack[0], 0.0, Stack[1], 0.0); ClearStack(); break; case ENDCHAR: /* - ENDCHAR |- */ #ifdef DoCommandDebug printf("DoCommand: EndChar\n"); #endif /* Finishes a CharString outline */ EndChar(); ClearStack(); break; case RMOVETO: /* |- dx dy RMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: RMoveto\n"); #endif /* Behaves like RMOVETO in PostScript */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(Stack[0], Stack[1]); ClearStack(); break; case HMOVETO: /* |- dx HMOVETO |- */ #ifdef DoCommandDebug printf("DoCommand: HMovetoUnassigned\n"); #endif /* Horizontal MOVETO. Equivalent to dx 0 RMOVETO */ if (Top < 0) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RMoveTo(Stack[0], 0.0); ClearStack(); break; case VHCURVETO: /* |- dy1 dx2 dy2 dx3 VHCURVETO |- */ #ifdef DoCommandDebug printf("DoCommand: VHCurveto\n"); #endif /* Vertical-Horizontal CURVETO, equivalent to */ /* 0 dy1 dx2 dy2 dx3 0 RRCURVETO */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(0.0, Stack[0], Stack[1], Stack[2], Stack[3], 0.0); ClearStack(); break; case HVCURVETO: /* |- dx1 dx2 dy2 dy3 HVCURVETO |- */ #ifdef DoCommandDebug printf("DoCommand: HCurveto\n"); #endif /* Horizontal-Vertical CURVETO, equivalent to */ /* dx1 0 dx2 dy2 0 dy3 RRCURVETO */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); RRCurveTo(Stack[0], 0.0, Stack[1], Stack[2], 0.0, Stack[3]); ClearStack(); break; case UNKNOWN_15: if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); ClearStack(); break; default: /* Unassigned command code */ #ifdef DoCommandDebug printf("DoCommand: Unassigned\n"); #endif ClearStack(); Error1i("DoCommand: Unassigned code %d\n", Code); } return(0); } static int Escape(Code) int Code; { int i, Num; struct segment *p; switch(Code) { case DOTSECTION: /* - DOTSECTION |- */ /* Brackets an outline section for the dots in */ /* letters such as "i", "j", and "!". */ DotSection(); ClearStack(); break; case VSTEM3: /* |- x0 dx0 x1 dx1 x2 dx2 VSTEM3 |- */ /* Declares the horizontal ranges of three */ /* vertical stem zones between x0 and x0+dx0, */ /* x1 and x1+dx1, and x2 and x2+dx2. */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); if (!wsset && ProcessHints) { /* Shift the whole character so that the middle stem is centered. */ p = CenterStem(Stack[2] + sidebearingX, Stack[3]); path = Join(path, p); wsset = 1; } VStem(Stack[0], Stack[1]); VStem(Stack[2], Stack[3]); VStem(Stack[4], Stack[5]); ClearStack(); break; case HSTEM3: /* |- y0 dy0 y1 dy1 y2 dy2 HSTEM3 |- */ /* Declares the vertical ranges of three hori- */ /* zontal stem zones between y0 and y0+dy0, */ /* y1 and y1+dy1, and y2 and y2+dy2. */ if (Top < 5) Error1i("DoCommand: Stack low (Code=%d)\n", Code); HStem(Stack[0], Stack[1]); HStem(Stack[2], Stack[3]); HStem(Stack[4], Stack[5]); ClearStack(); break; case SEAC: /* |- asb adx ady bchar achar SEAC |- */ /* Standard Encoding Accented Character. */ if (Top < 4) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Seac(Stack[0], Stack[1], Stack[2], (unsigned char) Stack[3], (unsigned char) Stack[4]); ClearStack(); break; case SBW: /* |- sbx sby wx wy SBW |- */ /* Set the left sidebearing point to (sbx,sby), */ /* set the character width vector to (wx,wy). */ if (Top < 3) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Sbw(Stack[0], Stack[1], Stack[2], Stack[3]); ClearStack(); break; case DIV: /* num1 num2 DIV quotient */ /* Behaves like DIV in the PostScript language */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Stack[Top-1] = Div(Stack[Top-1], Stack[Top]); Top--; break; case CALLOTHERSUBR: /* arg1 ... argn n othersubr# CALLOTHERSUBR - */ /* Make calls on the PostScript interpreter */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); Num = Stack[Top-1]; if (Top < Num+1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); for (i = 0; i < Num; i++) PSFakePush(Stack[Top - i - 2]); Top -= Num + 2; CallOtherSubr((int)Stack[Top + Num + 2]); break; case POP: /* - POP number */ /* Removes a number from the top of the */ /* PostScript interpreter stack and pushes it */ /* onto the Type 1 BuildChar operand stack */ Push(PSFakePop()); break; case SETCURRENTPOINT: /* |- x y SETCURRENTPOINT |- */ /* Sets the current point to (x,y) in absolute */ /* character space coordinates without per- */ /* forming a CharString MOVETO command */ if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); SetCurrentPoint(Stack[0], Stack[1]); ClearStack(); break; case UNKNOWN_15: if (Top < 1) Error1i("DoCommand: Stack low (Code=%d)\n", Code); ClearStack(); break; default: /* Unassigned escape code command */ ClearStack(); Error1i("Escape: Unassigned code %d\n", Code); } return(0); } /* |- y dy HSTEM |- */ /* Declares the vertical range of a horizontal stem zone */ /* between coordinates y and y + dy */ /* y is relative to the left sidebearing point */ static int HStem(y, dy) DOUBLE y, dy; { IfTrace2((FontDebug), "Hstem %f %f\n", y, dy); if (ProcessHints) { if (numstems >= MAXSTEMS) Error0i("HStem: Too many hints\n"); if (dy < 0.0) {y += dy; dy = -dy;} stems[numstems].vertical = FALSE; stems[numstems].x = 0.0; stems[numstems].y = sidebearingY + y + wsoffsetY; stems[numstems].dx = 0.0; stems[numstems].dy = dy; ComputeStem(numstems); numstems++; } return(0); } /* |- x dx VSTEM |- */ /* Declares the horizontal range of a vertical stem zone */ /* between coordinates x and x + dx */ /* x is relative to the left sidebearing point */ static int VStem(x, dx) DOUBLE x, dx; { IfTrace2((FontDebug), "Vstem %f %f\n", x, dx); if (ProcessHints) { if (numstems >= MAXSTEMS) Error0i("VStem: Too many hints\n"); if (dx < 0.0) {x += dx; dx = -dx;} stems[numstems].vertical = TRUE; stems[numstems].x = sidebearingX + x + wsoffsetX; stems[numstems].y = 0.0; stems[numstems].dx = dx; stems[numstems].dy = 0.0; ComputeStem(numstems); numstems++; } return(0); } /* |- dx dy RLINETO |- */ /* Behaves like RLINETO in PostScript */ static int RLineTo(dx, dy) DOUBLE dx, dy; { struct segment *B; IfTrace2((FontDebug), "RLineTo %f %f\n", dx, dy); B = Loc(CharSpace, dx, dy); if (ProcessHints) { currx += dx; curry += dy; /* B = Join(B, FindStems(currx, curry)); */ B = Join(B, FindStems(currx, curry, dx, dy)); } path = Join(path, Line(B)); return(0); } /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ /* Relative RCURVETO, equivalent to dx1 dy1 */ /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ /* (dy1+dy2+dy3) RCURVETO in PostScript */ static int RRCurveTo(dx1, dy1, dx2, dy2, dx3, dy3) DOUBLE dx1, dy1, dx2, dy2, dx3, dy3; { struct segment *B, *C, *D; IfTrace4((FontDebug), "RRCurveTo %f %f %f %f ", dx1, dy1, dx2, dy2); IfTrace2((FontDebug), "%f %f\n", dx3, dy3); B = Loc(CharSpace, dx1, dy1); C = Loc(CharSpace, dx2, dy2); D = Loc(CharSpace, dx3, dy3); if (ProcessHints) { /* For a Bezier curve, we apply the full hint value to the Bezier C point (and thereby D point). */ currx += dx1 + dx2 + dx3; curry += dy1 + dy2 + dy3; /* C = Join(C, FindStems(currx, curry)); */ C = Join(C, FindStems(currx, curry, dx3, dy3)); } /* Since XIMAGER is not completely relative, */ /* we need to add up the delta values */ C = Join(C, Dup(B)); D = Join(D, Dup(C)); path = Join(path, Bezier(B, C, D)); return(0); } /* - CLOSEPATH |- */ /* Closes a subpath WITHOUT repositioning the */ /* current point */ static int DoClosePath() { struct segment *CurrentPoint; IfTrace0((FontDebug), "DoClosePath\n"); CurrentPoint = Phantom(path); path = ClosePath(path); path = Join(Snap(path), CurrentPoint); return(0); } /* subr# CALLSUBR - */ /* Calls a CharString subroutine with index */ /* subr# from the Subrs array */ static int CallSubr(subrno) int subrno; { IfTrace1((FontDebug), "CallSubr %d\n", subrno); if ((subrno < 0) || (subrno >= SubrsP->len)) Error0i("CallSubr: subrno out of range\n"); PushCall(CharStringP, strindex, r); CharStringP = &SubrsP->data.arrayP[subrno]; StartDecrypt(); return(0); } /* - RETURN - */ /* Returns from a Subrs array CharString */ /* subroutine called with CALLSUBR */ static int Return() { IfTrace0((FontDebug), "Return\n"); PopCall(&CharStringP, &strindex, &r); return(0); } /* - ENDCHAR |- */ /* Finishes a CharString outline */ /* Executes SETCHACHEDEVICE using a bounding box */ /* it computes directly from the character outline */ /* and using the width information acquired from a previous */ /* HSBW or SBW. It then calls a special version of FILL */ /* or STROKE depending on the value of PaintType in the */ /* font dictionary */ static int EndChar() { IfTrace0((FontDebug), "EndChar\n"); /* There is no need to compute and set bounding box for the cache, since XIMAGER does that on the fly. */ /* Perform a Closepath just in case the command was left out */ path = ClosePath(path); /* Set character width */ path = Join(Snap(path), Loc(CharSpace, escapementX, escapementY)); return(0); } /* |- dx dy RMOVETO |- */ /* Behaves like RMOVETO in PostScript */ static int RMoveTo(dx,dy) DOUBLE dx,dy; { struct segment *B; IfTrace2((FontDebug), "RMoveTo %f %f\n", dx, dy); B = Loc(CharSpace, dx, dy); if (ProcessHints) { currx += dx; curry += dy; /* B = Join(B, FindStems(currx, curry)); */ B = Join(B, FindStems(currx, curry, 0.0, 0.0)); } path = Join(path, B); return(0); } /* - DOTSECTION |- */ /* Brackets an outline section for the dots in */ /* letters such as "i", "j", and "!". */ static int DotSection() { IfTrace0((FontDebug), "DotSection\n"); InDotSection = !InDotSection; return(0); } /* |- asb adx ady bchar achar SEAC |- */ /* Standard Encoding Accented Character. */ static int Seac(asb, adx, ady, bchar, achar) DOUBLE asb, adx, ady; unsigned char bchar, achar; { int Code; struct segment *mypath; IfTrace4((FontDebug), "SEAC %f %f %f %d ", asb, adx, ady, bchar); IfTrace1((FontDebug), "%d\n", achar); /* Move adx - asb, ady over and up from base char's sbpoint. */ /* (We use adx - asb to counteract the accents sb shift.) */ /* The variables accentoffsetX/Y modify sidebearingX/Y in Sbw(). */ /* Note that these incorporate the base character's sidebearing shift by */ /* using the current sidebearingX, Y values. */ accentoffsetX = sidebearingX + adx - asb; accentoffsetY = sidebearingY + ady; /* Set path = NULL to avoid complaints from Sbw(). */ path = NULL; /* Go find the CharString for the accent's code via an upcall */ CharStringP = GetType1CharString(Environment, achar); if (CharStringP == NULL) { Error1i("Invalid accent ('%03o) in SEAC\n", achar); } StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) return(0); } /* Copy snapped path to mypath and set path to NULL as above. */ mypath = Snap(path); path = NULL; /* We must reset these to null now. */ accentoffsetX = accentoffsetY = 0; /* go find the CharString for the base char's code via an upcall */ CharStringP = GetType1CharString(Environment, bchar); StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); FinitStems(); InitStems(); for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) return(0); } path = Join(mypath, path); return(0); } /* |- sbx sby wx wy SBW |- */ /* Set the left sidebearing point to (sbx,sby), */ /* set the character width vector to (wx,wy). */ static int Sbw(sbx, sby, wx, wy) DOUBLE sbx, sby, wx, wy; { IfTrace4((FontDebug), "SBW %f %f %f %f\n", sbx, sby, wx, wy); escapementX = wx; /* Character width vector */ escapementY = wy; /* Sidebearing values are sbx, sby args, plus accent offset from Seac(). */ sidebearingX = sbx + accentoffsetX; sidebearingY = sby + accentoffsetY; path = Join(path, Loc(CharSpace, sidebearingX, sidebearingY)); if (ProcessHints) {currx = sidebearingX; curry = sidebearingY;} return(0); } /* num1 num2 DIV quotient */ /* Behaves like DIV in the PostScript language */ static DOUBLE Div(num1, num2) DOUBLE num1, num2; { IfTrace2((FontDebug), "Div %f %f\n", num1, num2); return(num1 / num2); } /* The following four subroutines (FlxProc, FlxProc1, FlxProc2, and HintReplace) are C versions of the OtherSubrs Programs, which were were published in the Adobe Type 1 Font Format book. The Flex outline fragment is described by c1: (x0, y0) = c3: (x0, yshrink(y0)) or (xshrink(x0), y0) " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) " (x2, y2) - reference point c2: (x0, y0) = c4: (x0, yshrink(y0)) or (xshrink(x0), y0) " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) " (x2, y2) = " (x2, y2), rightmost endpoint c3: (x0, y0) - control point, 1st Bezier curve " (x1, y1) - control point, -"- " (x2, y2) - end point, -"- c4: (x0, y0) - control point, 2nd Bezier curve " (x1, y1) - control point, -"- " (x2, y2) - end point, -"- ep: (epY, epX) - final endpoint (should be same as c4: (x2, y2)) idmin - minimum Flex height (1/100 pixel) at which to render curves */ #define dtransform(dxusr,dyusr,dxdev,dydev) { \ register struct segment *point = Loc(CharSpace, dxusr, dyusr); \ QueryLoc(point, IDENTITY, dxdev, dydev); \ Destroy(point); \ } #define itransform(xdev,ydev,xusr,yusr) { \ register struct segment *point = Loc(IDENTITY, xdev, ydev); \ QueryLoc(point, CharSpace, xusr, yusr); \ Destroy(point); \ } #define transform(xusr,yusr,xdev,ydev) dtransform(xusr,yusr,xdev,ydev) #define PaintType (0) #define lineto(x,y) { \ struct segment *CurrentPoint; \ DOUBLE CurrentX, CurrentY; \ CurrentPoint = Phantom(path); \ QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \ Destroy(CurrentPoint); \ RLineTo(x - CurrentX, y - CurrentY); \ } #define curveto(x0,y0,x1,y1,x2,y2) { \ struct segment *CurrentPoint; \ DOUBLE CurrentX, CurrentY; \ CurrentPoint = Phantom(path); \ QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \ Destroy(CurrentPoint); \ RRCurveTo(x0 - CurrentX, y0 - CurrentY, x1 - x0, y1 - y0, x2 - x1, y2 - y1); \ } #define xshrink(x) ((x - c4x2) * shrink +c4x2) #define yshrink(y) ((y - c4y2) * shrink +c4y2) #define PickCoords(flag) \ if (flag) { /* Pick "shrunk" coordinates */ \ x0 = c1x0; y0 = c1y0; \ x1 = c1x1; y1 = c1y1; \ x2 = c1x2; y2 = c1y2; \ x3 = c2x0; y3 = c2y0; \ x4 = c2x1; y4 = c2y1; \ x5 = c2x2; y5 = c2y2; \ } else { /* Pick original coordinates */ \ x0 = c3x0; y0 = c3y0; \ x1 = c3x1; y1 = c3y1; \ x2 = c3x2; y2 = c3y2; \ x3 = c4x0; y3 = c4y0; \ x4 = c4x1; y4 = c4y1; \ x5 = c4x2; y5 = c4y2; \ } /* FlxProc() = OtherSubrs[0]; Main part of Flex */ /* Calling sequence: 'idmin epX epY 3 0 callothersubr' */ /* Computes Flex values, and renders the Flex path, */ /* and returns (leaves) ending coordinates on stack */ static void FlxProc(c1x2, c1y2, c3x0, c3y0, c3x1, c3y1, c3x2, c3y2, c4x0, c4y0, c4x1, c4y1, c4x2, c4y2, epY, epX, idmin) DOUBLE c1x2, c1y2; DOUBLE c3x0, c3y0, c3x1, c3y1, c3x2, c3y2; DOUBLE c4x0, c4y0, c4x1, c4y1, c4x2, c4y2; DOUBLE epX, epY; int idmin; { DOUBLE dmin; DOUBLE c1x0, c1y0, c1x1, c1y1; DOUBLE c2x0, c2y0, c2x1, c2y1, c2x2, c2y2; char yflag; DOUBLE x0, y0, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5; DOUBLE cxx, cyx, cxy, cyy; /* Transformation matrix */ int flipXY; DOUBLE x, y; DOUBLE erosion = 1; /* Device parameter */ /* Erosion may have different value specified in 'internaldict' */ DOUBLE shrink; DOUBLE dX, dY; char erode; DOUBLE eShift; DOUBLE cx, cy; DOUBLE ex, ey; Destroy(path); path = FlxOldPath; /* Restore previous path (stored in FlxProc1) */ if (ProcessHints) { dmin = TYPE1_ABS(idmin) / 100.0; /* Minimum Flex height in pixels */ c2x2 = c4x2; c2y2 = c4y2; /* Point c2 = c4 */ yflag = FABS(c1y2 - c3y2) > FABS(c1x2 - c3x2); /* Flex horizontal? */ QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) flipXY = -1; /* Char on side */ else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) flipXY = 1; /* Char upright */ else flipXY = 0; /* Char at angle */ if (yflag) { /* Flex horizontal */ if (flipXY == 0 || c3y2 == c4y2) { /* Char at angle or Flex height = 0 */ PickCoords(FALSE); /* Pick original control points */ } else { shrink = FABS((c1y2 - c4y2) / (c3y2 - c4y2)); /* Slope */ c1x0 = c3x0; c1y0 = yshrink(c3y0); c1x1 = c3x1; c1y1 = yshrink(c3y1); c2x0 = c4x0; c2y0 = yshrink(c4y0); c2x1 = c4x1; c2y1 = yshrink(c4y1); dtransform(0.0, ROUND(c3y2-c1y2), &x, &y); /* Flex height in pixels */ dY = FABS((flipXY == 1) ? y : x); PickCoords(dY < dmin); /* If Flex small, pick 'shrunk' control points */ if (FABS(y2 - c1y2) > 0.001) { /* Flex 'non-zero'? */ transform(c1x2, c1y2, &x, &y); if (flipXY == 1) { cx = x; cy = y; } else { cx = y; cy = x; } dtransform(0.0, ROUND(y2-c1y2), &x, &y); dY = (flipXY == 1) ? y : x; if (ROUND(dY) != 0) dY = ROUND(dY); else dY = (dY < 0) ? -1 : 1; erode = PaintType != 2 && erosion >= 0.5; if (erode) cy -= 0.5; ey = cy + dY; ey = CEIL(ey) - ey + FLOOR(ey); if (erode) ey += 0.5; if (flipXY == 1) { itransform(cx, ey, &x, &y); } else { itransform(ey, cx, &x, &y); } eShift = y - y2; y1 += eShift; y2 += eShift; y3 += eShift; } } } else { /* Flex vertical */ if (flipXY == 0 || c3x2 == c4x2) { /* Char at angle or Flex height = 0 */ PickCoords(FALSE); /* Pick original control points */ } else { shrink = FABS((c1x2 - c4x2) / (c3x2 - c4x2)); /* Slope */ c1x0 = xshrink(c3x0); c1y0 = c3y0; c1x1 = xshrink(c3x1); c1y1 = c3y1; c2x0 = xshrink(c4x0); c2y0 = c4y0; c2x1 = xshrink(c4x1); c2y1 = c4y1; dtransform(ROUND(c3x2 - c1x2), 0.0, &x, &y); /* Flex height in pixels */ dX = FABS((flipXY == -1) ? y : x); PickCoords(dX < dmin); /* If Flex small, pick 'shrunk' control points */ if (FABS(x2 - c1x2) > 0.001) { transform(c1x2, c1y2, &x, &y); if (flipXY == -1) { cx = y; cy = x; } else { cx = x; cy = y; } dtransform(ROUND(x2-c1x2), 0.0, &x, &y); dX = (flipXY == -1) ? y : x; if (ROUND(dX) != 0) dX = ROUND(dX); else dX = (dX < 0) ? -1 : 1; erode = PaintType != 2 && erosion >= 0.5; if (erode) cx -= 0.5; ex = cx + dX; ex = CEIL(ex) - ex + FLOOR(ex); if (erode) ex += 0.5; if (flipXY == -1) { itransform(cy, ex, &x, &y); } else { itransform(ex, cy, &x, &y); } eShift = x - x2; x1 += eShift; x2 += eShift; x3 += eShift; } } } if (x2 == x5 || y2 == y5) { lineto(x5, y5); } else { curveto(x0, y0, x1, y1, x2, y2); curveto(x3, y3, x4, y4, x5, y5); } } else { /* ProcessHints is off */ PickCoords(FALSE); /* Pick original control points */ curveto(x0, y0, x1, y1, x2, y2); curveto(x3, y3, x4, y4, x5, y5); } PSFakePush(epY); PSFakePush(epX); } /* FlxProc1() = OtherSubrs[1]; Part of Flex */ /* Calling sequence: '0 1 callothersubr' */ /* Saves and clears path, then restores currentpoint */ static void FlxProc1() { struct segment *CurrentPoint; CurrentPoint = Phantom(path); FlxOldPath = path; path = CurrentPoint; } /* FlxProc2() = OtherSubrs[2]; Part of Flex */ /* Calling sequence: '0 2 callothersubr' */ /* Returns currentpoint on stack */ static void FlxProc2() { struct segment *CurrentPoint; DOUBLE CurrentX, CurrentY; CurrentPoint = Phantom(path); QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); Destroy(CurrentPoint); /* Push CurrentPoint on fake PostScript stack */ PSFakePush(CurrentX); PSFakePush(CurrentY); } /* HintReplace() = OtherSubrs[3]; Hint Replacement */ /* Calling sequence: 'subr# 1 3 callothersubr pop callsubr' */ /* Reinitializes stem hint structure */ static void HintReplace() { /* Effectively retire the current stems, but keep them around for */ /* revhint use in case we are in a stem when we replace hints. */ currstartstem = numstems; /* 'subr#' is left on PostScript stack (for 'pop callsubr') */ } /* arg1 ... argn n othersubr# CALLOTHERSUBR - */ /* Make calls on the PostScript interpreter (or call equivalent C code) */ /* NOTE: The n arguments have been pushed on the fake PostScript stack */ static int CallOtherSubr(othersubrno) int othersubrno; { IfTrace1((FontDebug), "CallOtherSubr %d\n", othersubrno); switch(othersubrno) { case 0: /* OtherSubrs[0]; Main part of Flex */ if (PSFakeTop < 16) Error0i("CallOtherSubr: PSFakeStack low"); ClearPSFakeStack(); FlxProc( PSFakeStack[0], PSFakeStack[1], PSFakeStack[2], PSFakeStack[3], PSFakeStack[4], PSFakeStack[5], PSFakeStack[6], PSFakeStack[7], PSFakeStack[8], PSFakeStack[9], PSFakeStack[10], PSFakeStack[11], PSFakeStack[12], PSFakeStack[13], PSFakeStack[14], PSFakeStack[15], (int) PSFakeStack[16] ); break; case 1: /* OtherSubrs[1]; Part of Flex */ FlxProc1(); break; case 2: /* OtherSubrs[2]; Part of Flex */ FlxProc2(); break; case 3: /* OtherSubrs[3]; Hint Replacement */ HintReplace(); break; case 12: /* OtherSubrs[12]: Counter Control Hinting */ /* We do nothing, because later OtherSubrs[13] will remove data from the PS-stack */ break; case 13: /* We pop all elements from PSFakeStack. They may either have been left from previous calls to OtherSubr #12 or have been pushed for this call */ ClearPSFakeStack(); break; default: { /* call OtherSubrs[4] or higher if PostScript is present */ } } return(0); } /* |- x y SETCURRENTPOINT |- */ /* Sets the current point to (x,y) in absolute */ /* character space coordinates without per- */ /* forming a CharString MOVETO command */ static int SetCurrentPoint(x, y) DOUBLE x, y; { IfTrace2((FontDebug), "SetCurrentPoint %f %f\n", x, y); currx = x; curry = y; return(0); } /* The Type1Char routine for use by PostScript. */ /************************************************/ struct xobject *Type1Char(psfont *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, psobj *osubrsP, struct blues_struct *bluesP, int *modeP, char *charname) { int Code; path = NULL; errflag = FALSE; /* Make parameters available to all Type1 routines */ currentchar=charname; Environment = (char *)env; CharSpace = S; /* used when creating path elements */ CharStringP = charstrP; SubrsP = subrsP; OtherSubrsP = osubrsP; ModeP = modeP; blues = bluesP; /* compute the alignment zones */ SetRasterFlags(); ComputeAlignmentZones(); StartDecrypt(); ClearStack(); ClearPSFakeStack(); ClearCallStack(); InitStems(); currx = curry = 0; escapementX = escapementY = 0; sidebearingX = sidebearingY = 0; accentoffsetX = accentoffsetY = 0; wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */ wsset = 0; /* wsoffsetX,Y haven't been set yet. */ for (;;) { if (!DoRead(&Code)) break; Decode(Code); if (errflag) break; } FinitStems(); /* Report a possible error: */ *modeP=errflag; /* Clean up if an error has occurred */ if (errflag) { if (path != NULL) { Destroy(path); /* Reclaim storage */ path = NULL; /* Indicate that character could not be built */ } } return((struct xobject *) path); } /* We add a function to implement underlining in Type1-Routines. */ struct xobject *Type1Line(psfont *env, struct XYspace *S, float line_position, float line_thickness, float line_length) { path = NULL; errflag = FALSE; /* Make parameters available to all Type1 routines */ Environment = (char *)env; CharSpace = S; /* used when creating path elements */ currx = curry = 0; escapementX = escapementY = 0; sidebearingX = sidebearingY = 0; /* We have to initialize the stems-structures because the lineto commands refer to them! */ SetRasterFlags(); InitStems(); /* Draw Character */ Sbw(-1.0*line_length, 0.0, 0.0, 0.0); RMoveTo( 0.0, (double) (line_position+0.5*line_thickness)); RLineTo( 0.0, (double) -line_thickness); RLineTo( (double) line_length, 0.0); RLineTo( 0.0, (double) line_thickness); DoClosePath(); EndChar(); /* De-Initialize the stems (of course there have not been defined any) */ FinitStems(); return((struct xobject *)path); } grace-5.1.23/T1lib/type1/hints.c0000644000076500001440000007505406715154350015757 0ustar fnevgenyusers/* $XConsortium: hints.c,v 1.4 91/10/10 11:18:13 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* HINTS CWEB V0006 ******** */ /* :h1.HINTS Module - Processing Rasterization Hints &author. Sten F. Andler; continuity by Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Duaine W. Pryor, Jr. :h3.Include Files The included files are: */ #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "hints.h" /* :h3.Functions Provided to the TYPE1IMAGER User None. */ /* :h3.Functions Provided to Other Modules This module provides the following entry point to other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros Provided to Other Modules None. */ /* :h2.InitHints() - Initialize hint data structure */ #define MAXLABEL 20 static struct { int inuse; int computed; struct fractpoint hint; } oldHint[MAXLABEL]; #define ODD(x) (((int)(x)) & 01) #define FPFLOOR(fp) TOFRACTPEL((fp) >> FRACTBITS) #define FPROUND(fp) FPFLOOR((fp) + FPHALF) void InitHints() { int i; for (i = 0; i < MAXLABEL; i++) { oldHint[i].inuse = FALSE; oldHint[i].computed = FALSE; } } /* :h3.CloseHints(hintP) - Reverse hints that are still open */ void CloseHints(hintP) struct fractpoint *hintP; { int i; for (i = 0; i < MAXLABEL; i++) { if (oldHint[i].inuse) { hintP->x -= oldHint[i].hint.x; hintP->y -= oldHint[i].hint.y; oldHint[i].inuse = FALSE; IfTrace3((HintDebug > 1)," Hint %d was open, hint=(%d,%d)\n", i, hintP->x, hintP->y); } } } /* :h3.ComputeHint(hP, currX, currY, hintP) - Compute the value of a hint */ static void ComputeHint(hP, currX, currY, hintP) struct hintsegment *hP; fractpel currX, currY; struct fractpoint *hintP; { fractpel currRef=0, currWidth=0; int idealWidth; fractpel hintValue=0; char orientation; /* By construction, width is never zero. Therefore we can use the width value to determine if the hint has been rotated by a multiple of 90 degrees. */ if (hP->width.y == 0) { orientation = 'v'; /* vertical */ IfTrace0((HintDebug > 0)," vertical hint\n"); } else if (hP->width.x == 0) { orientation = 'h'; /* horizontal */ IfTrace0((HintDebug > 0)," horizontal hint\n"); } else { IfTrace0((HintDebug > 0)," hint not vertical or horizontal\n"); hintP->x = hintP->y = 0; return; } /* Compute currRef and currWidth with a unit of 1 pel */ if (orientation == 'v') /* vertical */ { currRef = hP->ref.x + currX; currWidth = TYPE1_ABS(hP->width.x); } else if (orientation == 'h') /* horizontal */ { currRef = hP->ref.y + currY; currWidth = TYPE1_ABS(hP->width.y); } else /* error */ { abort("ComputeHint: invalid orientation", 4); } IfTrace4((HintDebug > 1), " currX=%d, currY=%d, currRef=%d, currWidth=%d\n", currX, currY, currRef, currWidth); if ((hP->hinttype == 'b') /* Bar or stem */ || (hP->hinttype == 's')) /* Serif */ { idealWidth = NEARESTPEL(currWidth); if (idealWidth == 0) idealWidth = 1; if (ODD(idealWidth)) /* Is ideal width odd? */ { /* center "ref" over pel */ hintValue = FPFLOOR(currRef) + FPHALF - currRef; } else { /* align "ref" on pel boundary */ hintValue = FPROUND(currRef) - currRef; } if (HintDebug > 2) { IfTrace1(TRUE," idealWidth=%d, ", idealWidth); } } else if (hP->hinttype == 'c') /* Curve extrema */ { /* align "ref" on pel boundary */ hintValue = FPROUND(currRef) - currRef; } else /* error */ { abort("ComputeHint: invalid hinttype", 5); } IfTrace1((HintDebug > 1)," hintValue=%d", hintValue); if (orientation == 'v') /* vertical */ { hintP->x = hintValue; hintP->y = 0; } else if (orientation == 'h') /* horizontal */ { hintP->x = 0; hintP->y = hintValue; } else /* error */ { abort("ComputeHint: invalid orientation", 6); } } /* :h3.ProcessHint(hP, currX, currY, hintP) - Process a rasterization hint */ void ProcessHint(hP, currX, currY, hintP) struct hintsegment *hP; fractpel currX, currY; struct fractpoint *hintP; { struct fractpoint thisHint; IfTrace4((HintDebug > 1)," ref=(%d,%d), width=(%d,%d)", hP->ref.x, hP->ref.y, hP->width.x, hP->width.y); IfTrace4((HintDebug > 1),", %c %c %c %c", hP->orientation, hP->hinttype, hP->adjusttype, hP->direction); IfTrace1((HintDebug > 1),", label=%d\n", hP->label); if ((hP->adjusttype == 'm') /* Move */ || (hP->adjusttype == 'a')) /* Adjust */ { /* Look up hint in oldHint table */ if ((hP->label >= 0) && (hP->label < MAXLABEL)) { if (oldHint[hP->label].computed) /* Use old hint value if already computed */ { thisHint.x = oldHint[hP->label].hint.x; thisHint.y = oldHint[hP->label].hint.y; oldHint[hP->label].inuse = TRUE; } else /* Compute new value for hint and store it for future use */ { ComputeHint(hP, currX, currY, &thisHint); oldHint[hP->label].hint.x = thisHint.x; oldHint[hP->label].hint.y = thisHint.y; oldHint[hP->label].inuse = TRUE; oldHint[hP->label].computed = TRUE; } } else /* error */ { abort("ProcessHint: invalid label", 7); } } else if (hP->adjusttype == 'r') /* Reverse */ { /* Use the inverse of the existing hint value to reverse hint */ if ((hP->label >= 0) && (hP->label < MAXLABEL)) { if (oldHint[hP->label].inuse) { thisHint.x = -oldHint[hP->label].hint.x; thisHint.y = -oldHint[hP->label].hint.y; oldHint[hP->label].inuse = FALSE; } else /* error */ { abort("ProcessHint: label is not in use", 8); } } else /* error */ { abort("ProcessHint: invalid label", 9); } } else /* error */ { abort("ProcessHint: invalid adjusttype", 10); } IfTrace3((HintDebug > 1)," label=%d, thisHint=(%d,%d)\n", hP->label, thisHint.x, thisHint.y); hintP->x += thisHint.x; hintP->y += thisHint.y; IfTrace2((HintDebug > 1)," hint=(%d,%d)\n", hintP->x, hintP->y); } /* :h2 id=subpath.Navigation Through Edge Lists For continuity checking purposes, we need to navigate through edge lists by the "subpath" chains and answer questions about edges. The subpath chain links together edges that were part of the same subpath (no intervening move segments) when the interior of the path was calculated. Here we use the term "edge" to mean every edge list that was created in between changes of direction. The subpath chains are singly-linked circular chains. For the convenience of building them, they direction of the list (from edge to edge) is the reverse of the order in which they were built. Within any single edge, the subpath chain goes from top-to-bottom. (There might be a violation of this because of the way the user started the first chain; see :hdref refid=fixsubp..). :h3.ISTOP() and ISBOTTOM() - Flag Bits for Edge Lists at the Top and Bottom of Their SubPaths */ #define ISTOP(flag) ((flag)&0x20) #define ISBOTTOM(flag) ((flag)&0x10) /* :h3.ISLEFT() - Flag Bit for Left Edges */ #define ISLEFT(flag) ((flag)&0x08) /* :h3.XofY() - Macro to Find X Value at Given Y This macro can only be used if it is known that the Y is within the given edgelist's ymin and ymax. */ #define XofY(edge, y) edge->xvalues[y - edge->ymin] /* :h3.findXofY() - Like XofY(), Except not Restricted If the Y is out of bounds of the given edgelist, this macro will call SearchXofY to search the edge's subpath chain for the correct Y range. If the Y value is off the edge, MINPEL is returned. */ #define findXofY(edge, y) ((y < edge->ymin || y >= edge->ymax) ? SearchXofY(edge, y) : XofY(edge, y)) /* :h4.SearchXofY() - Routine Called by FindXofY() for Difficult Cases The concept of this routine is to follow the subpath chain to find the edge just below (i.e., next in chain) or just above (i.e., immediately before in chain. It is assumed that the Y value is no more than one off of the edge's range; XofY() could be replace by FindXofY() to call ourselves recursively if this were not true. */ static pel SearchXofY(edge, y) register struct edgelist *edge; /* represents edge */ register pel y; /* 'y' value to find edge for */ { register struct edgelist *e; /* loop variable */ if (y < edge->ymin) { if (ISTOP(edge->flag)) return(MINPEL); for (e = edge->subpath; e->subpath != edge; e = e->subpath) { ; } if (e->ymax == edge->ymin) return(XofY(e, y)); } else if (y >= edge->ymax) { if (ISBOTTOM(edge->flag)) return(MINPEL); e = edge->subpath; if (e->ymin == edge->ymax) return(XofY(e, y)); } else return(XofY(edge, y)); abort("bad subpath chain", 11); /*NOTREACHED*/ /* To make ANSI-C-compiler happy: */ return(y); } /* :h3.ISBREAK() Macro - Tests if an Edge List is at a "Break" The subpath chains are organized top to bottom. When the bottom of a given edge is reached, the subpath chain points to the top of the next edge. We call this a "break" in the chain. The following macro is the simple test for the break condition: */ #define ISBREAK(top,bot) (top->ymax != bot->ymin) /* :h3.ImpliedHorizontalLine() - Tests for Horizontal Connectivity This function returns true if two edges are connected horizontally. They are connected horizontally if they are consecutive in the subpath, and either we are at the bottom and the first edge is going down or we are at the top and the first edge is going up. */ #define BLACKABOVE -1 #define BLACKBELOW +1 #define NONE 0 static int ImpliedHorizontalLine(e1, e2, y) register struct edgelist *e1,*e2; /* two edges to check */ register int y; /* y where they might be connected */ { register struct edgelist *e3,*e4; if (ISDOWN(e1->flag) == ISDOWN(e2->flag)) return(NONE); /* can't be consecutive unless different directions */ /* Now we check for consecutiveness: Can we get from 'e1' to 'e2' with only one intervening break? Can we get from 'e2' to 'e1' with only one intervening break? 'e3' will be as far as we can get after 'e1'; 'e4' will be has far as we can get after 'e2': */ for (e3 = e1; !ISBREAK(e3, e3->subpath); e3 = e3->subpath) { ; } for (e3 = e3->subpath; e3 != e2; e3 = e3->subpath) if (ISBREAK(e3, e3->subpath)) break; for (e4 = e2; !ISBREAK(e4, e4->subpath); e4 = e4->subpath) { ; } for (e4 = e4->subpath; e4 != e1; e4 = e4->subpath) if (ISBREAK(e4, e4->subpath)) break; /* If the edges are mutually consecutive, we must have horizontal lines both top and bottom: */ if (e3 == e2 && e4 == e1) return(TRUE); /* If the edges are not consecutive either way, no horizontal lines are possible: */ if (e3 != e2 && e4 != e1) return(NONE); /* Now let's swap 'e1' and 'e2' if necessary to enforce the rule that 'e2' follows 'e1'. Remember that subpath chains go in the opposite direction from the way the subpaths were built; this led to the simplest way do build them. */ if (e4 != e1) { e2 = e1; e1 = e3; /* remember e3 == e2, this just swaps 'e1' and 'e2' */ } /* Now we have everything to return the answer: */ if (ISTOP(e1->flag) && y == e1->ymin) return(ISDOWN(e2->flag)); else if (ISBOTTOM(e1->flag) && y == e1->ymax) return(!ISDOWN(e2->flag)); else abort("ImpliedHorizontalLine: why ask?", 12); /*NOTREACHED*/ /* To make ANSI-C-compiler happy */ return(0); } /* :h3 id=fixsubp.FixSubPaths() - Must be Called to Organize Subpath Chains The region-building code in Interior(), in particular splitedge(), maintains the rule that sub-paths are linked top-to-bottom except at breaks. However, it is possible that there may be a "false break" because the user started the subpath in the middle of an edge (and went in the "wrong" direction from there, up instead of down). This routine finds and fixes false breaks. Also, this routine sets the ISTOP and ISBOTTOM flags in the edge lists. */ static void FixSubPaths(R) register struct region *R; /* anchor of region */ { register struct edgelist *e; /* fast loop variable */ register struct edgelist *edge; /* current edge in region */ register struct edgelist *next; /* next in subpath after 'edge' */ register struct edgelist *break1; /* first break after 'next' */ register struct edgelist *break2=NULL; /* last break before 'edge' */ register struct edgelist *prev; /* previous edge for fixing links */ int left = TRUE; for (edge = R->anchor; edge != NULL; edge = edge->link) { if (left) edge->flag |= ISLEFT(ON); left = !left; next = edge->subpath; if (!ISBREAK(edge, next)) continue; if (edge->ymax < next->ymin) abort("disjoint subpath?", 13); /* 'edge' now contains an edgelist at the bottom of an edge, and 'next' contains the next subsequent edgelist in the subpath, which must be at the top. We refer to this a "break" in the subpath. */ next->flag |= ISTOP(ON); edge->flag |= ISBOTTOM(ON); if (ISDOWN(edge->flag) != ISDOWN(next->flag)) continue; /* We are now in the unusual case; both edges are going in the same direction so this must be a "false break" due to the way that the user created the path. We'll have to fix it. */ for (break1 = next; !ISBREAK(break1, break1->subpath); break1 = break1->subpath) { ; } for (e = break1->subpath; e != edge; e = e->subpath) if (ISBREAK(e, e->subpath)) break2 = e; /* Now we've set up 'break1' and 'break2'. I've found the following diagram invaluable. 'break1' is the first break after 'next'. 'break2' is the LAST break before 'edge'. &drawing. next +------+ +---->+------+ +--->| >-----+ | | >-----+ | | | | | | | | | +-------------+ | +-------------+ | | |break1| | | | | | +->| >-------+ +->| >-----+ | | | | | | | | | +-------------+ | +------+ | | | | +----------------+ | | | | | +------+ | +->| >-----+ | +->| >-----+ | | | | | | | | | +-------------+ | +-------------+ | | | | | | |edge | | | |break2| | +->| >-----+ | +->| >-----+ | | | | | | | | | | | | | | | | | | | | | | | | | +------+ | | +------+ | | | | | +---------------+ +---------------+ &edrawing. We want to fix this situation by having 'edge' point to where 'break1' now points, and having 'break1' point to where 'break2' now points. Finally, 'break2' should point to 'next'. Also, we observe that 'break1' can't be a bottom, and is also not a top unless it is the same as 'next': */ edge->subpath = break1->subpath; break1->subpath = break2->subpath; if (ISBREAK(break1, break1->subpath)) abort("unable to fix subpath break?", 14); break2->subpath = next; break1->flag &= ~ISBOTTOM(ON); if (break1 != next) break1->flag &= ~ISTOP(ON); } /* This region might contain "ambiguous" edges; edges exactly equal to edge->link. Due to the random dynamics of where they get sorted into the list, they can yield false crossings, where the edges appear to cross. This confuses our continuity logic no end. Since we can swap them without changing the region, we do. */ for (edge = R->anchor, prev = NULL; VALIDEDGE(edge); prev = edge, edge = prev->link) { if (! ISAMBIGUOUS(edge->flag)) continue; next = edge->subpath; while (ISAMBIGUOUS(next->flag) && next != edge) next = next->subpath; /* We've finally found a non-ambiguous edge; we make sure it is left/right compatible with 'edge': */ if ( (ISLEFT(edge->flag) == ISLEFT(next->flag) && ISDOWN(edge->flag) == ISDOWN(next->flag) ) || (ISLEFT(edge->flag) != ISLEFT(next->flag) && ISDOWN(edge->flag) != ISDOWN(next->flag) ) ) continue; /* Incompatible, we will swap 'edge' and the following edge in the list. You may think that there must be a next edge in this swath. So did I. No! If there is a totally ambiguous inner loop, for example, we could get all the way to the outside without resolving ambiguity. */ next = edge->link; /* note new meaning of 'next' */ if (next == NULL || edge->ymin != next->ymin) continue; if (prev == NULL) R->anchor = next; else prev->link = next; edge->link = next->link; next->link = edge; edge->flag ^= ISLEFT(ON); edge->flag &= ~ISAMBIGUOUS(ON); next->flag ^= ISLEFT(ON); next->flag &= ~ISAMBIGUOUS(ON); edge = next; } } /* :h3.DumpSubPaths() A debug tool. */ static struct edgelist *before(); /* subroutine of DumpSubPaths */ static void DumpSubPaths(anchor) struct edgelist *anchor; { register struct edgelist *edge,*e,*e2; pel y; for (edge = anchor; VALIDEDGE(edge); edge = edge->link) { if (ISPERMANENT(edge->flag)) continue; IfTrace0(TRUE, "BEGIN Subpath\n"); for (e2 = edge; !ISPERMANENT(e2->flag);) { if (ISDOWN(e2->flag)) { IfTrace1(TRUE, ". Downgoing edge's top at %p\n", e2); for (e = e2;; e = e->subpath) { IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n", e->ymin, *e->xvalues, e, e->flag); for (y=e->ymin+1; y < e->ymax; y++) IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]); e->flag |= ISPERMANENT(ON); if (ISBREAK(e, e->subpath)) break; } } else { IfTrace1(TRUE, ". Upgoing edge's top at %p\n", e2); for (e = e2; !ISBREAK(e, e->subpath); e = e->subpath) { ; } for (;; e=before(e)) { IfTrace4(TRUE, ". . [%5d] %5d @ %p[%x]\n", e->ymax-1, e->xvalues[e->ymax-1-e->ymin], e, e->flag); for (y=e->ymax-2; y >= e->ymin; y--) IfTrace2(TRUE, ". . [%5d] %5d \"\n", y, e->xvalues[y-e->ymin]); e->flag |= ISPERMANENT(ON); if (e == e2) break; } } do { e2 = before(e2); } while (!ISBREAK(before(e2), e2)); } } } static struct edgelist *before(e) struct edgelist *e; { struct edgelist *r; for (r = e->subpath; r->subpath != e; r = r->subpath) { ; } return(r); } /* :h2.Fixing Region Continuity Problems Small regions may become disconnected when their connecting segments are less than a pel wide. This may be correct in some applications, but in many (especially small font characters), it is more pleasing to keep connectivity. ApplyContinuity() (invoked by +CONTINUITY on the Interior() fill rule) fixes connection breaks. The resulting region is geometrically less accurate, but may be more pleasing to the eye. */ /* Here are some macros which we will need: */ #define IsValidPel(j) (j!=MINPEL) /* :h3.writeXofY() - Stuffs an X Value Into an "edgelist" writeXofY writes an x value into an edge at position 'y'. It must update the edge's xmin and xmax. If there is a possibility that this new x might exceed the region's bounds, updating those are the responsibility of the caller. */ static void writeXofY(e, y, x) struct edgelist *e; /* relevant edgelist */ int y; /* y value */ int x; /* new x value */ { if (e->xmin > x) e->xmin = x; if (e->xmax < x) e->xmax = x; e->xvalues[y - e->ymin] = x; } /*-------------------------------------------------------------------------*/ /* the following three macros tell us whether we are at a birth point, a */ /* death point, or simply in the middle of the character */ /*-------------------------------------------------------------------------*/ #define WeAreAtTop(e,i) (ISTOP(e->flag) && e->ymin == i) #define WeAreAtBottom(e,i) (ISBOTTOM(e->flag) && e->ymax-1 == i) #define WeAreInMiddle(e,i) \ ((!ISTOP(e->flag) && !ISBOTTOM(e->flag))||(i < e->ymax-1 && i > e->ymin)) /* The following macro tests if two "edgelist" structures are in the same swath: */ #define SAMESWATH(e1,e2) (e1->ymin == e2->ymin) /* :h3.CollapseWhiteRun() - Subroutine of ApplyContinuity() When we have a white run with an implied horizontal line above or below it, we better have black on the other side of this line. This function both tests to see if black is there, and adjusts the end points (collapses) the white run as necessary if it is not. The goal is to collapse the white run as little as possible. */ static void CollapseWhiteRun(anchor, yblack, left, right, ywhite) struct edgelist *anchor; /* anchor of edge list */ pel yblack; /* y of (hopefully) black run above or below */ struct edgelist *left; /* edgelist at left of WHITE run */ struct edgelist *right; /* edgelist at right of WHITE run */ pel ywhite; /* y location of white run */ { struct edgelist *edge; struct edgelist *swathstart = anchor; register pel x; if (XofY(left, ywhite) >= XofY(right, ywhite)) return; /* Find the swath with 'yblack'. If we don't find it, completely collapse the white run and return: */ while (VALIDEDGE(swathstart)) { if (yblack < swathstart->ymin) { writeXofY(left, ywhite, XofY(right, ywhite)); return; } if (yblack < swathstart->ymax) break; swathstart = swathstart->link->link; } if(!VALIDEDGE(swathstart)) { writeXofY(left, ywhite, XofY(right, ywhite)); return; } /* Now we are in the swath that contains 'y', the reference line above or below that we are trying to maintain continuity with. If black in this line begins in the middle of our white run, we must collapse the white run from the left to that point. If black ends in the middle of our white run, we must collapse the white run from the right to that point. */ for (edge = swathstart; VALIDEDGE(edge); edge = edge->link) { if (!SAMESWATH(swathstart,edge)) break; if( XofY(edge, yblack) > XofY(left, ywhite)) { if (ISLEFT(edge->flag)) { x = XofY(edge, yblack); if (XofY(right, ywhite) < x) x = XofY(right, ywhite); writeXofY(left, ywhite, x); } else { x = XofY(edge, yblack); while (edge->link != NULL && SAMESWATH(edge, edge->link) && x >= XofY(edge->link, yblack) ) { edge = edge->link->link; x = XofY(edge, yblack); } if (x < XofY(right, ywhite)) writeXofY(right, ywhite, x); return; } } } writeXofY(left, ywhite, XofY(right, ywhite)); } /* :h3.ApplyContinuity() - Fix False Breaks in a Region This is the externally visible routine called from the REGIONS module when the +CONTINUITY flag is on the Interior() fill rule. */ void ApplyContinuity(R) struct region *R; { struct edgelist *left; struct edgelist *right; struct edgelist *edge,*e2; pel rightXabove,rightXbelow,leftXabove,leftXbelow; pel leftX,rightX; int i; LONG newcenter,abovecenter,belowcenter; FixSubPaths(R); if (RegionDebug >= 3) DumpSubPaths(R->anchor); left = R->anchor; /* loop through and do all of the easy checking. ( no tops or bottoms) */ while(VALIDEDGE(left)) { right = left->link; for(i=left->ymin;iymax;++i) { leftX = findXofY(left,i); rightX = findXofY(right,i); leftXbelow = findXofY(left,i+1); rightXbelow = findXofY(right,i+1); if(rightX <= leftX) { /* then, we have a break in a near vertical line */ leftXabove = findXofY(left,i-1); rightXabove = findXofY(right,i-1); if( IsValidPel(leftXabove) && IsValidPel(rightXabove) ) { abovecenter = leftXabove + rightXabove; } else { abovecenter = leftX + rightX; } if( IsValidPel(leftXbelow) && IsValidPel(rightXbelow) ) { belowcenter = leftXbelow + rightXbelow; } else { belowcenter = leftX + rightX; } newcenter = abovecenter + belowcenter; if( newcenter > 4*leftX ) { rightX = rightX + 1; } else if( newcenter < 4*leftX) { leftX = leftX - 1; } else { rightX = rightX + 1; } writeXofY(right,i,rightX); writeXofY(left,i,leftX); if(rightX > R->xmax) {R->xmax = rightX;} if(leftX < R->xmin) {R->xmin = leftX;} } if( !WeAreAtBottom(left,i) && (leftXbelow>=rightX)) { /* then we have a break in a near horizontal line in the middle */ writeXofY(right,i,leftXbelow); } if( !WeAreAtBottom(right,i) && (leftX >=rightXbelow)) { /* then we have a break in a near horizontal line in the middle */ writeXofY(left,i,rightXbelow); } } left = right->link; } /* There may be "implied horizontal lines" between edges that have implications for continuity. This loop looks for white runs that have implied horizontal lines on the top or bottom, and calls CollapseWhiteRuns to check and fix any continuity problems from them. */ for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { if ((!ISTOP(edge->flag) && !ISBOTTOM(edge->flag)) || ISLEFT(edge->flag)) continue; /* at some future date we may want left edge logic here too */ for (e2 = edge->link; VALIDEDGE(e2) && SAMESWATH(edge,e2); e2 = e2->link) { if (ISTOP(e2->flag) && ISTOP(edge->flag) && NONE != ImpliedHorizontalLine(edge,e2,edge->ymin)) { if (ISLEFT(e2->flag)) CollapseWhiteRun(R->anchor, edge->ymin-1, edge, e2, edge->ymin); } if (ISBOTTOM(e2->flag) && ISBOTTOM(edge->flag) && NONE != ImpliedHorizontalLine(edge,e2, edge->ymax)) { if (ISLEFT(e2->flag)) CollapseWhiteRun(R->anchor, edge->ymax, edge, e2, edge->ymax-1); } } } } grace-5.1.23/T1lib/type1/fsmasks.h0000644000076500001440000000545506626627165016316 0ustar fnevgenyusers/* $XConsortium: fsmasks.h,v 1.2 91/05/13 16:46:16 gildea Exp $ */ /* * Copyright 1990, 1991 Network Computing Devices; * Portions Copyright 1987 by Digital Equipment Corporation and the * Massachusetts Institute of Technology * * Permission to use, copy, modify, and distribute this protoype software * and its documentation to Members and Affiliates of the MIT X Consortium * any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the names of Network Computing Devices, Digital or * MIT not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. * * NETWORK COMPUTING DEVICES, DIGITAL AND MIT DISCLAIM ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES, DIGITAL OR MIT BE * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * @(#)fsmasks.h 4.1 91/05/02 * */ /* * masks & values used by the font lib and the font server */ #ifndef _FSMASKS_H_ #define _FSMASKS_H_ #include "types.h" /* font format macros */ #define BitmapFormatByteOrderMask (1L << 0) #define BitmapFormatBitOrderMask (1L << 1) #define BitmapFormatImageRectMask (3L << 2) #define BitmapFormatScanlinePadMask (3L << 8) #define BitmapFormatScanlineUnitMask (3L << 12) #define BitmapFormatByteOrderLSB (0) #define BitmapFormatByteOrderMSB (1L << 0) #define BitmapFormatBitOrderLSB (0) #define BitmapFormatBitOrderMSB (1L << 1) #define BitmapFormatImageRectMin (0L << 2) #define BitmapFormatImageRectMaxWidth (1L << 2) #define BitmapFormatImageRectMax (2L << 2) #define BitmapFormatScanlinePad8 (0L << 8) #define BitmapFormatScanlinePad16 (1L << 8) #define BitmapFormatScanlinePad32 (2L << 8) #define BitmapFormatScanlinePad64 (3L << 8) #define BitmapFormatScanlineUnit8 (0L << 12) #define BitmapFormatScanlineUnit16 (1L << 12) #define BitmapFormatScanlineUnit32 (2L << 12) #define BitmapFormatScanlineUnit64 (3L << 12) #define BitmapFormatMaskByte (1L << 0) #define BitmapFormatMaskBit (1L << 1) #define BitmapFormatMaskImageRectangle (1L << 2) #define BitmapFormatMaskScanLinePad (1L << 3) #define BitmapFormatMaskScanLineUnit (1L << 4) typedef ULONG fsBitmapFormat; typedef ULONG fsBitmapFormatMask; #endif /* _FSMASKS_H_ */ grace-5.1.23/T1lib/type1/spaces.c0000644000076500001440000010162006715154351016076 0ustar fnevgenyusers/* $XConsortium: spaces.c,v 1.4 91/10/10 11:19:16 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* SPACES CWEB V0021 ******** */ /* :h1 id=spaces.SPACES Module - Handles Coordinate Spaces This module is responsible for handling the TYPE1IMAGER "XYspace" object. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files */ #include #include #include #include "types.h" #include "objects.h" #include "spaces.h" #include "paths.h" #include "pictures.h" #include "fonts.h" #include "arith.h" #include "trig.h" static int FindFfcn(); static int FindIfcn(); /* :h3.Entry Points Provided to the TYPE1IMAGER User */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Entry Points Provided to Other Modules */ /* In addition, other modules call the SPACES module through function vectors in the "XYspace" structure. The entry points accessed that way are "FConvert()", "IConvert()", and "ForceFloat()". */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Macros and Typedefs Provided to Other Modules :h4.Duplicating and Killing Spaces Destroying XYspaces is so simple we can do it with a macro: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* On the other hand, duplicating XYspaces is slightly more difficult because of the need to keep a unique ID in the space, see :hdref refid=dupspace.. :h4.Fixed Point Pel Representation We represent pel positions with fixed point numbers. This does NOT mean integer, but truly means fixed point, with a certain number of binary digits (FRACTBITS) representing the fractional part of the pel. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h2.Data Structures for Coordinate Spaces and Points */ /* :h3 id=matrix.Matrices TYPE1IMAGER uses 2x2 transformation matrices. We'll use C notation for such a matrix (M[2][2]), the first index being rows, the second columns. */ /* :h3.The "doublematrix" Structure We frequently find it desirable to store both a matrix and its inverse. We store these in a "doublematrix" structure. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.The "XYspace" Structure The XYspace structure represents the XYspace object. */ /*SHARED LINE(S) ORIGINATED HERE*/ #define RESERVED 10 /* 'n' IDs are reserved for invalid & immortal spaces */ /* */ #define NEXTID ((SpaceID < RESERVED) ? (SpaceID = RESERVED) : ++SpaceID) static unsigned int SpaceID = 1; struct XYspace *CopySpace(S) register struct XYspace *S; { S = (struct XYspace *)Allocate(sizeof(struct XYspace), S, 0); S->ID = NEXTID; return(S); } /* :h3.The "fractpoint" Structure A fractional point is just a "fractpel" x and y: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Lazy Evaluation of Matrix Inverses Calculating the inverse of a matrix is somewhat involved, and we usually do not need them. So, we flag whether or not the space has the inverse already calculated: */ #define HASINVERSE(flag) ((flag)&0x80) /* The following macro forces a space to have an inverse: */ #define CoerceInverse(S) if (!HASINVERSE((S)->flag)) { \ MatrixInvert((S)->tofract.normal, (S)->tofract.inverse); (S)->flag |= HASINVERSE(ON); } /* :h3.IDENTITY Space IDENTITY space is (logically) the space corresponding to the identity transformation matrix. However, since all our transformation matrices have a common FRACTFLOAT scale factor to convert to 'fractpel's, that is actually what we store in 'tofract' matrix of IDENTITY: */ static struct XYspace identity = { SPACETYPE, ISPERMANENT(ON) + ISIMMORTAL(ON) + HASINVERSE(ON), 2, /* added 3-26-91 PNM */ NULL, NULL, NULL, NULL, NULL, NULL, INVALIDID + 1, 0, {{{FRACTFLOAT, 0.0}, {0.0, FRACTFLOAT}}, {{1.0/FRACTFLOAT, 0.0}, {0.0, 1.0/FRACTFLOAT}}}, {{0, 0}, {0, 0}} }; struct XYspace *IDENTITY = &identity; /* */ #define MAXCONTEXTS 16 static struct doublematrix contexts[MAXCONTEXTS]; #ifdef notdef static int nextcontext = 1; /*SHARED LINE(S) ORIGINATED HERE*/ #if __STDC__ #define pointer void * #else #define pointer char * #endif /* :h3.FindDeviceContext() - Find the Context Given a Device This routine, given a device, returns the index of the device's transformation matrix in the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ static int FindDeviceContext(device) pointer device; /* device token */ { DOUBLE M[2][2]; /* temporary matrix */ float Xres,Yres; /* device resolution */ int orient = -1; /* device orientation */ int rc = -1; /* return code for QueryDeviceState */ if (rc != 0) /* we only bother with this check once */ abort("Context: QueryDeviceState didn't work", 44); M[0][0] = M[1][0] = M[0][1] = M[1][1] = 0.0; switch (orient) { case 0: M[0][0] = Xres; M[1][1] = -Yres; break; case 1: M[1][0] = Yres; M[0][1] = Xres; break; case 2: M[0][0] = -Xres; M[1][1] = Yres; break; case 3: M[1][0] = -Yres; M[0][1] = -Xres; break; default: abort("QueryDeviceState returned invalid orientation", 45); } return(FindContext(M)); } /* :h3.FindContext() - Find the Context Given a Matrix This routine, given a matrix, returns the index of that matrix matrix in the context array. If it cannot find it, it will allocate a new array entry and fill it out. */ int FindContext(M) DOUBLE M[2][2]; /* array to search for */ { register int i; /* loop variable for search */ for (i=0; i < nextcontext; i++) if (M[0][0] == contexts[i].normal[0][0] && M[1][0] == contexts[i].normal[1][0] && M[0][1] == contexts[i].normal[0][1] && M[1][1] == contexts[i].normal[1][1]) break; if (i >= nextcontext) { if (i >= MAXCONTEXTS) abort("Context: out of them", 46); LONGCOPY(contexts[i].normal, M, sizeof(contexts[i].normal)); MatrixInvert(M, contexts[i].inverse); nextcontext++; } return(i); } /* :h3.Context() - Create a Coordinate Space for a Device This user operator is implemented by first finding the device context array index, then transforming IDENTITY space to create an appropriate cooridnate space. */ struct XYspace *Context(device, units) pointer device; /* device token */ DOUBLE units; /* multiples of one inch */ { DOUBLE M[2][2]; /* device transformation matrix */ register int n; /* will hold device context number */ register struct XYspace *S; /* XYspace constructed */ IfTrace2((MustTraceCalls),"Context(%x, %f)\n", device, &units); ARGCHECK((device == NULL), "Context of NULLDEVICE not allowed", NULL, IDENTITY, (0), struct XYspace *); ARGCHECK((units == 0.0), "Context: bad units", NULL, IDENTITY, (0), struct XYspace *); n = FindDeviceContext(device); LONGCOPY(M, contexts[n].normal, sizeof(M)); M[0][0] *= units; M[0][1] *= units; M[1][0] *= units; M[1][1] *= units; S = (struct XYspace *)Xform(IDENTITY, M); S->context = n; return(S); } #endif /* :h3.ConsiderContext() - Adjust a Matrix to Take Out Device Transform Remember, we have :f/x times U times D/ and :f/M/ and and we want :f/x times U times M times D/. An easy way to do this is to calculate :f/D sup <-1> times M times D/, because: :formula. x times U times D times D sup <-1> times M times D = x times U times M times D :formula. So this subroutine, given an :f/M/and an object, finds the :f/D/ for that object and modifies :f/M/ so it is :f/D sup <-1> times M times D/. */ static void ConsiderContext(obj, M) register struct xobject *obj; /* object to be transformed */ register DOUBLE M[2][2]; /* matrix (may be changed) */ { register int context=0; /* index in contexts array */ if (obj == NULL) return; if (ISPATHTYPE(obj->type)) { struct segment *path = (struct segment *) obj; context = path->context; } else if (obj->type == SPACETYPE) { struct XYspace *S = (struct XYspace *) obj; context = S->context; } else if (obj->type == PICTURETYPE) { } else context = NULLCONTEXT; if (context != NULLCONTEXT) { MatrixMultiply(contexts[context].inverse, M, M); MatrixMultiply(M, contexts[context].normal, M); } } /* :h2.Conversion from User's X,Y to "fractpel" X,Y When the user is building paths (lines, moves, curves, etc.) he passes the control points (x,y) for the paths together with an XYspace. We must convert from the user's (x,y) to our internal representation which is in pels (fractpels, actually). This involves transforming the user's (x,y) under the coordinate space transformation. It is important that we do this quickly. So, we store pointers to different conversion functions right in the XYspace structure. This allows us to have simpler special case functions for the more commonly encountered types of transformations. :h3.Convert(), IConvert(), and ForceFloat() - Called Through "XYspace" Structure These are functions that fit in the "convert" and "iconvert" function pointers in the XYspace structure. They call the "xconvert", "yconvert", "ixconvert", and "iyconvert" as appropriate to actually do the work. These secondary routines come in many flavors to handle different special cases as quickly as possible. */ int FXYConvert(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register DOUBLE x,y; /* user's coordinates of point */ { pt->x = (*S->xconvert)(S->tofract.normal[0][0], S->tofract.normal[1][0], x, y); pt->y = (*S->yconvert)(S->tofract.normal[0][1], S->tofract.normal[1][1], x, y); return(0); } int IXYConvert(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register LONG x,y; /* user's coordinates of point */ { pt->x = (*S->ixconvert)(S->itofract[0][0], S->itofract[1][0], x, y); pt->y = (*S->iyconvert)(S->itofract[0][1], S->itofract[1][1], x, y); return(0); } /* ForceFloat is a substitute for IConvert(), when we just do not have enough significant digits in the coefficients to get high enough precision in the answer with fixed point arithmetic. So, we force the integers to floats, and do the arithmetic all with floats: */ int ForceFloat(pt, S, x, y) register struct fractpoint *pt; /* point to set */ register struct XYspace *S; /* relevant coordinate space */ register LONG x,y; /* user's coordinates of point */ { (*S->convert)(pt, S, (DOUBLE) x, (DOUBLE) y); return(0); } /* :h3.FXYboth(), FXonly(), FYonly() - Floating Point Conversion These are the routines we use when the user has given us floating point numbers for x and y. FXYboth() is the general purpose routine; FXonly() and FYonly() are special cases when one of the coefficients is 0.0. */ fractpel FXYboth(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = x * cx + y * cy; return((fractpel) r); } /*ARGSUSED*/ fractpel FXonly(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = x * cx; return((fractpel) r); } /*ARGSUSED*/ fractpel FYonly(cx, cy, x, y) register DOUBLE cx,cy; /* x and y coefficients */ register DOUBLE x,y; /* user x,y */ { register DOUBLE r; /* temporary float */ r = y * cy; return((fractpel) r); } /* :h3.IXYboth(), IXonly(), IYonly() - Simple Integer Conversion These are the routines we use when the user has given us integers for x and y, and the coefficients have enough significant digits to provide precise answers with only "long" (32 bit?) multiplication. IXYboth() is the general purpose routine; IXonly() and IYonly() are special cases when one of the coefficients is 0. */ fractpel IXYboth(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(x * cx + y * cy); } /*ARGSUSED*/ fractpel IXonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(x * cx); } /*ARGSUSED*/ fractpel IYonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return(y * cy); } /* :h3.FPXYboth(), FPXonly(), FPYonly() - More Involved Integer Conversion These are the routines we use when the user has given us integers for x and y, but the coefficients do not have enough significant digits to provide precise answers with only "long" (32 bit?) multiplication. We have increased the number of significant bits in the coefficients by FRACTBITS; therefore we must use "double long" (64 bit?) multiplication by calling FPmult(). FPXYboth() is the general purpose routine; FPXonly() and FPYonly() are special cases when one of the coefficients is 0. Note that it is perfectly possible for us to calculate X with the "FP" method and Y with the "I" method, or vice versa. It all depends on how the functions in the XYspace structure are filled out. */ fractpel FPXYboth(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(x, cx) + FPmult(y, cy) ); } /*ARGSUSED*/ fractpel FPXonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(x, cx) ); } /*ARGSUSED*/ fractpel FPYonly(cx, cy, x, y) register fractpel cx,cy; /* x and y coefficients */ register LONG x,y; /* user x,y */ { return( FPmult(y, cy) ); } /* :h3.FillOutFcns() - Determine the Appropriate Functions to Use for Conversion This function fills out the "convert" and "iconvert" function pointers in an XYspace structure, and also fills the "helper" functions that actually do the work. */ static void FillOutFcns(S) register struct XYspace *S; /* functions will be set in this structure */ { S->convert = FXYConvert; S->iconvert = IXYConvert; FindFfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->xconvert); FindFfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->yconvert); FindIfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->itofract[0][0], &S->itofract[1][0], &S->ixconvert); FindIfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->itofract[0][1], &S->itofract[1][1], &S->iyconvert); if (S->ixconvert == NULL || S->iyconvert == NULL) S->iconvert = ForceFloat; } /* :h4.FindFfcn() - Subroutine of FillOutFcns() to Fill Out Floating Functions This function tests for the special case of one of the coefficients being zero: */ static int FindFfcn(cx, cy, fcnP) register DOUBLE cx,cy; /* x and y coefficients */ register fractpel (**fcnP)(); /* pointer to function to set */ { if (cx == 0.0) *fcnP = FYonly; else if (cy == 0.0) *fcnP = FXonly; else *fcnP = FXYboth; return(0); } /* :h4.FindIfcn() - Subroutine of FillOutFcns() to Fill Out Integer Functions There are two types of integer functions, the 'I' type and the 'FP' type. We use the I type functions when we are satisfied with simple integer arithmetic. We used the FP functions when we feel we need higher precision (but still fixed point) arithmetic. If all else fails, we store a NULL indicating that this we should do the conversion in floating point. */ static int FindIfcn(cx, cy, icxP, icyP, fcnP) register DOUBLE cx,cy; /* x and y coefficients */ register fractpel *icxP,*icyP; /* fixed point coefficients to set */ register fractpel (**fcnP)(); /* pointer to function to set */ { register fractpel imax; /* maximum of cx and cy */ *icxP = cx; *icyP = cy; if (cx != (float) (*icxP) || cy != (float) (*icyP)) { /* At this point we know our integer approximations of the coefficients are not exact. However, we will still use them if the maximum coefficient will not fit in a 'fractpel'. Of course, we have little choice at that point, but we haven't lost that much precision by staying with integer arithmetic. We have enough significant digits so that any error we introduce is less than one part in 2:sup/16/. */ imax = TYPE1_MAX(TYPE1_ABS(*icxP), TYPE1_ABS(*icyP)); if (imax < (fractpel) (1<<(FRACTBITS-1)) ) { /* At this point we know our integer approximations just do not have enough significant digits for accuracy. We will add FRACTBITS significant digits to the coefficients (by multiplying them by 1<x; y = pt->y; *xp = S->tofract.inverse[0][0] * x + S->tofract.inverse[1][0] * y; *yp = S->tofract.inverse[0][1] * x + S->tofract.inverse[1][1] * y; } /* :h2.Transformations */ /* :h3 id=xform.Xform() - Transform Object in X and Y TYPE1IMAGER wants transformations of objects like paths to be identical to transformations of spaces. For example, if you scale a line(1,1) by 10 it should yield the same result as generating the line(1,1) in a coordinate space that has been scaled by 10. We handle fonts by storing the accumulated transform, for example, SR (accumulating on the right). Then when we map the font through space TD, for example, we multiply the accumulated font transform on the left by the space transform on the right, yielding SRTD in this case. We will get the same result if we did S, then R, then T on the space and mapping an unmodified font through that space. */ struct xobject *t1_Xform(obj, M) register struct xobject *obj; /* object to transform */ register DOUBLE M[2][2]; /* transformation matrix */ { if (obj == NULL) return(NULL); if (obj->type == FONTTYPE) { register struct font *F = (struct font *) obj; F = UniqueFont(F); return((struct xobject*)F); } if (obj->type == PICTURETYPE) { /* In the case of a picture, we choose both to update the picture's transformation matrix and keep the handles up to date. */ register struct picture *P = (struct picture *) obj; register struct segment *handles; /* temporary path to transform handles */ P = UniquePicture(P); handles = PathSegment(LINETYPE, P->origin.x, P->origin.y); handles = Join(handles, PathSegment(LINETYPE, P->ending.x, P->ending.y) ); handles = (struct segment *)Xform((struct xobject *) handles, M); P->origin = handles->dest; P->ending = handles->link->dest; KillPath(handles); return((struct xobject *)P); } if (ISPATHTYPE(obj->type)) { struct XYspace pseudo; /* local temporary space */ PseudoSpace(&pseudo, M); return((struct xobject *) PathTransform(obj, &pseudo)); } if (obj->type == SPACETYPE) { register struct XYspace *S = (struct XYspace *) obj; /* replaced ISPERMANENT(S->flag) with S->references > 1 3-26-91 PNM */ if (S->references > 1) S = CopySpace(S); else S->ID = NEXTID; MatrixMultiply(S->tofract.normal, M, S->tofract.normal); /* * mark inverted matrix invalid: */ S->flag &= ~HASINVERSE(ON); FillOutFcns(S); return((struct xobject *) S); } return(ArgErr("Untransformable object", obj, obj)); } /* :h3.Transform() - Transform an Object This is the external user's entry point. */ struct xobject *t1_Transform(obj, cxx, cyx, cxy, cyy) struct xobject *obj; DOUBLE cxx,cyx,cxy,cyy; /* 2x2 transform matrix elements in row order */ { DOUBLE M[2][2]; IfTrace1((MustTraceCalls),"Transform(%p,", obj); IfTrace4((MustTraceCalls)," %f %f %f %f)\n", cxx, cyx, cxy, cyy); M[0][0] = cxx; M[0][1] = cyx; M[1][0] = cxy; M[1][1] = cyy; ConsiderContext(obj, M); return(Xform(obj, M)); } /* :h3.Scale() - Special Case of Transform() This is a user operator. */ struct xobject *t1_Scale(obj, sx, sy) struct xobject *obj; /* object to scale */ DOUBLE sx,sy; /* scale factors in x and y */ { DOUBLE M[2][2]; IfTrace3((MustTraceCalls),"Scale(%p, %f, %f)\n", obj, sx, sy); M[0][0] = sx; M[1][1] = sy; M[1][0] = M[0][1] = 0.0; ConsiderContext(obj, M); return(Xform(obj, M)); } /* :h3 id=rotate.Rotate() - Special Case of Transform() We special-case different settings of 'degrees' for performance and accuracy within the DegreeSin() and DegreeCos() routines themselves. */ #ifdef notdef struct xobject *xiRotate(obj, degrees) struct xobject *obj; /* object to be transformed */ DOUBLE degrees; /* degrees of COUNTER-clockwise rotation */ { DOUBLE M[2][2]; IfTrace2((MustTraceCalls),"Rotate(%z, %f)\n", obj, °rees); M[0][0] = M[1][1] = DegreeCos(degrees); M[1][0] = - (M[0][1] = DegreeSin(degrees)); ConsiderContext(obj, M); return(Xform(obj, M)); } #endif /* :h3.PseudoSpace() - Build a Coordinate Space from a Matrix Since we have built all this optimized code that, given an (x,y) and a coordinate space, yield transformed (x,y), it seems a shame not to use the same logic when we need to multiply an (x,y) by an arbitrary matrix that is not (initially) part of a coordinate space. This subroutine takes the arbitrary matrix and builds a coordinate space, with all its nifty function pointers. */ void PseudoSpace(S, M) struct XYspace *S; /* coordinate space structure to fill out */ DOUBLE M[2][2]; /* matrix that will become 'tofract.normal' */ { S->type = SPACETYPE; S->flag = ISPERMANENT(ON) + ISIMMORTAL(ON); S->references = 2; /* 3-26-91 added PNM */ S->tofract.normal[0][0] = M[0][0]; S->tofract.normal[1][0] = M[1][0]; S->tofract.normal[0][1] = M[0][1]; S->tofract.normal[1][1] = M[1][1]; FillOutFcns(S); } /* :h2 id=matrixa.Matrix Arithmetic Following the convention in Newman and Sproull, :hp1/Interactive Computer Graphics/, matrices are organized: :xmp. | cxx cyx | | cxy cyy | :exmp. A point is horizontal, for example: :xmp. [ x y ] :exmp. This means that: :formula/x prime = cxx times x + cxy times y/ :formula/y prime = cyx times x + cyy times y/ I've seen the other convention, where transform matrices are transposed, equally often in the literature. */ /* :h3.MatrixMultiply() - Implements Multiplication of Two Matrices Implements matrix multiplication, A * B = C. To remind myself, matrix multiplication goes rows of A times columns of B. The output matrix may be the same as one of the input matrices. */ void MatrixMultiply(A, B, C) register DOUBLE A[2][2],B[2][2]; /* input matrices */ register DOUBLE C[2][2]; /* output matrix */ { register DOUBLE txx,txy,tyx,tyy; txx = A[0][0] * B[0][0] + A[0][1] * B[1][0]; txy = A[1][0] * B[0][0] + A[1][1] * B[1][0]; tyx = A[0][0] * B[0][1] + A[0][1] * B[1][1]; tyy = A[1][0] * B[0][1] + A[1][1] * B[1][1]; C[0][0] = txx; C[1][0] = txy; C[0][1] = tyx; C[1][1] = tyy; } /* :h3.MatrixInvert() - Invert a Matrix My reference for matrix inversion was :hp1/Elementary Linear Algebra/ by Paul C. Shields, Worth Publishers, Inc., 1968. */ void MatrixInvert(M, Mprime) DOUBLE M[2][2]; /* input matrix */ DOUBLE Mprime[2][2]; /* output inverted matrix */ { register DOUBLE D; /* determinant of matrix M */ register DOUBLE txx,txy,tyx,tyy; txx = M[0][0]; txy = M[1][0]; tyx = M[0][1]; tyy = M[1][1]; D = M[1][1] * M[0][0] - M[1][0] * M[0][1]; if (D == 0.0) abort("MatrixInvert: can't", 47); Mprime[0][0] = tyy / D; Mprime[1][0] = -txy / D; Mprime[0][1] = -tyx / D; Mprime[1][1] = txx / D; } /* :h2.Initialization, Queries, and Debug */ /* :h3.InitSpaces() - Initialize Constant Spaces For compatibility, we initialize a coordinate space called USER which maps 72nds of an inch to pels on the default device. */ struct XYspace *USER = &identity; void InitSpaces() { /* extern char *DEFAULTDEVICE; */ IDENTITY->type = SPACETYPE; FillOutFcns(IDENTITY); contexts[NULLCONTEXT].normal[1][0] = contexts[NULLCONTEXT].normal[0][1] = contexts[NULLCONTEXT].inverse[1][0] = contexts[NULLCONTEXT].inverse[0][1] = 0.0; contexts[NULLCONTEXT].normal[0][0] = contexts[NULLCONTEXT].normal[1][1] = contexts[NULLCONTEXT].inverse[0][0] = contexts[NULLCONTEXT].inverse[1][1] = 1.0; USER->flag |= ISIMMORTAL(ON); CoerceInverse(USER); } /* :h3.QuerySpace() - Returns the Transformation Matrix of a Space Since the tofract matrix of an XYspace includes the scale factor necessary to produce fractpel results (i.e., FRACTFLOAT), this must be taken out before we return the matrix to the user. Fortunately, this is simple: just multiply by the inverse of IDENTITY! */ void QuerySpace(S, cxxP, cyxP, cxyP, cyyP) register struct XYspace *S; /* space asked about */ register DOUBLE *cxxP,*cyxP,*cxyP,*cyyP; /* where to put answer */ { DOUBLE M[2][2]; /* temp matrix to build user's answer */ if (S->type != SPACETYPE) { ArgErr("QuerySpace: not a space", S, NULL); return; } MatrixMultiply(S->tofract.normal, IDENTITY->tofract.inverse, M); *cxxP = M[0][0]; *cxyP = M[1][0]; *cyxP = M[0][1]; *cyyP = M[1][1]; } /* :h3.FormatFP() - Format a Fixed Point Pel We format the pel as "dddd.XXXX", where XX's are hexidecimal digits, and the dd's are decimal digits. This might be a little confusing mixing hexidecimal and decimal like that, but it is convenient to use for debug. We make sure we have N (FRACTBITS/4) digits past the decimal point. */ #define FRACTMASK ((1<> FRACTBITS, s); } /* :h3.DumpSpace() - Display a Coordinate Space */ /*ARGSUSED*/ void DumpSpace(S) register struct XYspace *S; { IfTrace4(TRUE,"--Coordinate space at %p,ID=%d,convert=%p,iconvert=%p\n", S, S->ID, S->convert, S->iconvert); IfTrace2(TRUE," | %12.3f %12.3f |", S->tofract.normal[0][0], S->tofract.normal[0][1]); IfTrace2(TRUE," [ %d %d ]\n", S->itofract[0][0], S->itofract[0][1]); IfTrace2(TRUE," | %12.3f %12.3f |", S->tofract.normal[1][0], S->tofract.normal[1][1]); IfTrace2(TRUE," [ %d %d ]\n", S->itofract[1][0], S->itofract[1][1]); } grace-5.1.23/T1lib/type1/objects.c0000644000076500001440000012122607415144745016261 0ustar fnevgenyusers/* $XConsortium: objects.c,v 1.5 92/03/20 15:56:06 eswu Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /* OBJECTS CWEB V0025 ******** */ /* :h1.OBJECTS Module - TYPE1IMAGER Objects Common Routines This module defines and implements the C structures that represent objects in the TYPE1IMAGER. All common routines for manipulating these objects are defined in this module. Specific routines for specific objects are defined in the modules that deal with that object type. &author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) :h3.Include Files The included files are: */ #define GLOBALS 1 /* see :hdref refid=debugvar. */ /* The following two includes are C standards; we include them because we use 'toupper' and the 'str'-type functions in this module. Potentially these may be defined as macros; if these ".h" files do not exist on your system it is a pretty safe bet that these are external entry points and you do do not need to include these header files. */ #include "types.h" #include #include #include #include #include /* override incorrect system functions; for example you might define a macro for "strcpy" that diverts it to "my_strcpy". */ /* moved these includes from above the */ /* was included first (it contains com- */ /* piler defines). dsr 081291 */ #include "objects.h" #include "spaces.h" #include "paths.h" #include "regions.h" #include "fonts.h" #include "pictures.h" #include "strokes.h" #include "cluts.h" static char *TypeFmt(); static int ObjectPostMortem(); /* :h3.The "pointer" Macro - Define a Generic Pointer Sadly, many compilers will give a warning message when a pointer to one structure is assigned to a pointer to another. We've even seen some that give severe errors (when the wrong pointer type is used as an initializer or returned from a function). TYPE1IMAGER has routines like Dup and Allocate that are perfectly willing to duplicate or allocate any of a number of different types of structures. How to declare them in a truely portable way? Well, there is no single good answer that I've found. You can always beg the question and "cast" everything. I find this distracting and the resulting code ugly. On the other hand, we have found at least one compiler that will accept "void *" as a generic pointer that can assigned to any other pointer type without error or warning (apparently this is also the ANSI standard). So, we define "void *" to be a generic pointer. (You might have to change this for your compiler; the "ifndef" allows the change to be made on the command line if you want.) :i1/portability assumptions/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Functions Provided to the TYPE1IMAGER User This module provides the following TYPE1IMAGER entry points: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that entry points that are intended for use external to TYPE1IMAGER begin with the characters :q/xi/. Macros are used to make the names more mnemonic. */ /* :h3.Functions Provided to Other Modules This module provides the following functions for other modules: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Note that entry points that intended for use within TYPE1IMAGER, but which must be global because they are used across module boundaries, begin with the characters :q/I_/. Macros are used to make the names more mnemonic. Entry points totally within a module use mnemonic names and are declared :hp2/static/. One of the compilers I used had a bug when static functions were passed as addresses. Thus, some functions which are logically "static" are not so declared. Note also the trick of declaring routines, like Consume(), with a variable number of arguments. To avoid the restrictions on variable numbers of arguments in the macro processor, we just replace the text 'Consume' with 'I_Consume'. */ /* :h3.Macros Provided to Other Modules This is the module where we define all the useful constants like TRUE, FALSE, and NULL, and simple expressions like TYPE1_MIN(), TYPE1_MAX(), and TYPE1_ABS(). We might as well get to it right here: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Notice that upper case is used for constant values and macro definitions. I generally follow that convention. Many more global macros are defined later in this module. */ /* :h2.Basic TYPE1IMAGER Object Structure All TYPE1IMAGER objects which are available to the user have a common header. This header is defined below: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* The following define is an attempt to centralize the definition of the common xobject data shared by structures that are derived from the generic xobject structure. For example, the structure font, defined in fonts.shr : &code. struct font { char type; char flag; int references; ... other data types & structs ... } &ecode. would now be defined as: &code. struct font { XOBJ_COMMON ... other data types & structs ... } &ecode. Thus we have a better-structured inheritance mechanism. 3-26-91 PNM */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Object Type Definitions These constants define the values which go in the 'type' field of an TYPE1IMAGER object structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Flag Byte Definitions Many programmers define flag bits as a mask (for example, 0x04), and test, set, and reset them as follows: &code. if ((flag & PERMANENT) != 0) flag |= PERMANENT; flag &= &inv.PERMANENT; :exmp. I favor a style where the 'if' statement can ask a question: &code. if (ISPERMANENT(flag)) flag |= ISPERMANENT(ON); flag &= &inv.ISPERMANENT(ON); :exmp. This said, we now define two bit settings of the flag byte of the object. "ISPERMANENT" will be set by the user, when he calls Permanent(). "ISIMMORTAL" will be used for compiled-in objects that we don't want the user to ever destroy. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* Flag bit definitions that apply to all objects are assigned starting with the least significant (0x01) bit. Flag bit definitions specific to a certain object type are assigned starting with the most significant (0x80) bit. We hope they never meet. */ /* :h3 id=preserve.PRESERVE() Macro Occasionally an TYPE1IMAGER operator is implemented by calling other TYPE1IMAGER operators. For example, Arc2() calls Conic(). When we call more than one operator as a subroutine, we have to be careful of temporary objects. A temporary object will be consumed by the subroutine operator and then is no longer available for the caller. This can be prevented simply by bumping a temporary object's reference count. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.RefRoll() Macro to Detect References Count Rollover The following macro is designed to check for reference count rollover. A return value of TRUE means rollover has not occurred; a return value of FALSE means we cannot increment the reference count. Note also that those functions that use this macro must decrement the reference count afterwards. 3-26-91 PNM */ #define RefRoll(obj) (++(obj)->references > 0) /* :h2.TYPE1IMAGER Object Functions :h3.LONGCOPY() - Macro to Copy "long" Aligned Data Copying arbitrary bytes in C is a bit of a problem. "strcpy" can't be used, because 0 bytes are special-cased. Most environments have a routine "memcopy" or "bcopy" or "bytecopy" that copies memory containing zero bytes. Sadly, there is no standard on the name of such a routine, which makes it impossible to write truely portable code to use it. It turns out that TYPE1IMAGER, when it wants to copy data, frequently knows that both the source and destination are aligned on "long" boundaries. This allows us to copy by using "long *" pointers. This is usually very efficient on almost all processors. Frequently, it is more efficient than using general-purpose assembly language routines. So, we define a macro to do this in a portable way. "dest" and "source" must be long-aligned, and "bytes" must be a multiple of "sizeof(long)": */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.Allocate() - Allocating a Memory Block Allocate returns a pointer to memory object that is a copy of the template passed (if any). In addition, extra bytes may be allocated contiguously with the object. (This may be useful for variable size objects such as edge lists. See :hdref refid=regions..) Allocate() always returns a non-immortal object, even if the template is immortal. Therefore a non-NULL template must have a "flag" byte. If the template is NULL, then 'size' bytes are cleared to all NULLs. If the template is non-NULL, a new object is allocated in memory. It therefore seems logical that its reference count field should be set to 1. So, a nun-NULL template must also have a "references" field. PNM 3-26-91 */ /* to pacify gcc we put the externals here ... */ extern struct XYspace *USER; extern jmp_buf stck_state; struct xobject *t1_Allocate(size, template, extra) /* non-ANSI; type checking was too strict */ register int size; /* number of bytes to allocate & initialize */ register struct xobject *template; /* example structure to allocate */ register int extra; /* any extra uninitialized bytes needed contiguously */ { register struct xobject *r; /* * round up 'size' and 'extra' to be an integer number of 'long's: */ size = (size + sizeof(LONG) - 1) & -sizeof(LONG); extra = (extra + sizeof(LONG) - 1) & -sizeof(LONG); if (size + extra <= 0) abort("Non-positive allocate?", 15); r = (struct xobject *) malloc(size + extra); while (r == NULL) { if (!GimeSpace()) { IfTrace1(TRUE, "malloc attempted %d bytes.\n", size + extra); abort("We have REALLY run out of memory", 16); } r = (struct xobject *) malloc(size + extra); } /* * copy the template into the new memory: */ if (template != NULL) { /* Added references count decrement if template is not permanent. This is for the case where Allocate is called by a Dupxxxx function, which was in turn called by Unique(). (PNM) */ if (!ISPERMANENT(template->flag)) --template->references; LONGCOPY(r, template, size); r->flag &= ~(ISPERMANENT(ON) | ISIMMORTAL(ON)); /* added reference field 3-2-6-91 PNM */ r->references = 1; } else { register char **p1; for (p1=(char **)r; size > 0; size -= sizeof(char *)) *p1++ = NULL; } if (MemoryDebug > 1) { register int *L; L = (int *) r; IfTrace4(TRUE, "Allocating at %p: %x %x %x\n", L, L[-1], L[0], L[1]); } return(r); } /* :h3.Free() - Frees an Allocated Object This routine makes a sanity check to make sure the "type" field of the standard object structure has not been cleared. If the object is not a standard structure, then the macro "NonObjectFree" is available that does not perform this check. In either case, the object must not be the NULL pointer. This preserves portability, as the C system Xfree() will not always accept NULL. */ void Free(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* structure to free */ { if (obj->type == INVALIDTYPE) abort("Free of already freed object?", 17); obj->type = INVALIDTYPE; if (MemoryDebug > 1) { register int *L; L = (int *) obj; IfTrace4(TRUE,"Freeing at %p: %x %x %x\n", L, L[-1], L[0], L[1]); } free(obj); } /* :h3.Permanent() - Makes an Object Permanent Real simple--just set a flag. Every routine that consumes its objects (which is almost every user entry) must check this flag, and not consume the object if it is set. If a temporary object is made permanent, and there is more than one reference to it, we must first Copy() it, then set the ISPERMANENT flag. Note also that the reference count must be incremented when an object is changed from temporary to permanent (see the ISUNIQUE macro). Note that the purpose of this function is to convert an object into a permanent object: If it was permanent to begin with, we do nothing; If it was temporary and unique, we set the PERMANENT flag and increment the reference count; If it was temporary and nonunique, we must make a unique Copy(), set the PERMANENT flag, and set the reference count to 2. We must also decrement the original object's reference count, because what we have done is to change one of the old temporary handles to a permanent one. 3-26-91 PNM */ struct xobject *t1_Permanent(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* object to be made permanent */ { IfTrace1((MustTraceCalls),"Permanent(%p)\n", obj); if ( (obj != NULL) && ( !(ISPERMANENT(obj->flag)) ) ) { /* there is a non-NULL, temporary object to be made permanent. If there are multiple references to this object, first get a new COPY(). Note also that we have to decrement the reference count if we do a Copy() here, because we are consuming the temporary argument passed, and returning a unique, permanent one. */ if ( obj->references > 1) { obj = Copy(obj); } /* now set the permanent flag, and increment the reference count, since a temporary object has now become permanent. */ obj->references++; obj->flag |= ISPERMANENT(ON); } return(obj); } /* :h3.Temporary() - Undoes the Effect of "Permanent()" This simply resets the "ISPERMANENT" flag. If a permanent object is made temporary, and there is more than one reference to it, we must first Copy() it, then reset the ISPERMANENT flag. However, if the permanent object has obly one reference, we need only decrement the reference count ( and reset the flag). Note that this function, in the case of a PERMANENT argument, basically converts the PERMANENT handle to a TEMPORARY one. Thus, in the case of a nonunique, permanent argument passed, we not only make a Copy(), we also decrement the reference count, to reflect the fact that we have lost a permanent handle and gained a temporary one. PNM 3-2-6-91 */ struct xobject *xiTemporary(obj) /* non-ANSI to avoid overly strict type checking */ register struct xobject *obj; /* object to be made permanent */ { IfTrace1((MustTraceCalls),"Temporary(%p)\n", obj); if (obj != NULL) { /* if it's already temporary, there's nothing to do. */ if ISPERMANENT(obj->flag) { /* if there are multiple references to this object, get a Copy we can safely alter. Recall that the reference count is incremented for permanent objects. Recall further that Copy returns an object with the same flag state and a reference count of 2 (for PERMANENT objects). Thus, regardless of whether or not we need to copy a permanent object, we still decrement its reference count and reset the flag. */ if (obj->references != 2 || ISIMMORTAL(obj->flag)) { /* not unique; consume handle, get a temporary Copy! */ obj = Copy(obj); } /* else decrement the reference count (since it's going from permanent to temporary) and clear the flag. */ else { obj->references--; obj->flag &= ~ISPERMANENT(ON); } } } return(obj); } /* :h3.Dup() - Duplicate an Object Dup will increment the reference count of an object, only making a Copy() if needed. Note that Dup() retains the state of the permanent flag. 3-26-91 PNM */ struct xobject *t1_Dup(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; /* object to be duplicated */ { register char oldflag; /* copy of original object's flag byte */ IfTrace1((MustTraceCalls),"Dup(%p)\n", obj); if (obj == NULL) return(NULL); /* An immortal object must be Copy'ed, so that we get a mortal copy of it, since we try not to destroy immortal objects. */ if (ISIMMORTAL(obj->flag)) return(Copy(obj)); /* if incrementing the reference count doesn't cause the count to wrap, simply return the object with the count bumped. Note that the RefRoll macro increments the count to perform the rollover check, so we must decrement the count. */ if (RefRoll(obj)) return(obj); /* that didn't work out, so put the count back and call Copy(). */ --obj->references; oldflag = obj->flag; obj = Copy(obj); if (ISPERMANENT(oldflag)) obj = Permanent(obj); return(obj); } /* :h3.Copy() - Make a New Copy of an Object This is the generic Copy() where the object type is unknown. There are specific Copyxxx functions for known object types. Copy will create a NEW temporary object, and WILL NOT simply bump the reference count. Sometimes duplicating an object is just as simple as Allocating with it as a template. But other objects are complicated linked lists. So, we let each module provide us a routine (or macro) that duplicates the objects it knows about. */ struct xobject *t1_Copy(obj) register struct xobject *obj; /* object to be Copy'ed */ { if (obj == NULL) return(NULL); if (ISPATHTYPE(obj->type)) obj = (struct xobject *) CopyPath(obj); else switch (obj->type) { case SPACETYPE: obj = (struct xobject *) CopySpace(obj); break; case FONTTYPE: obj = (struct xobject *) CopyFont(obj); break; case REGIONTYPE: obj = (struct xobject *) CopyRegion(obj); break; case PICTURETYPE: obj = (struct xobject *) CopyPicture(obj); break; case LINESTYLETYPE: obj = (struct xobject *) CopyLineStyle(obj); break; case STROKEPATHTYPE: obj = (struct xobject *) CopyStrokePath(obj); break; case CLUTTYPE: obj = (struct xobject *) CopyCLUT(obj); break; default: return(ArgErr("Copy: invalid object", obj, NULL)); } return(obj); } /* :h3.Destroy() - Destroys an Object This can get complicated. Just like with Copy(), we let the experts handle it. */ struct xobject *Destroy(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; /* object to be destroyed */ { IfTrace1((MustTraceCalls),"Destroy(%p)\n", obj); if (obj == NULL) return(NULL); if (ISIMMORTAL(obj->flag)) { IfTrace1(TRUE,"Destroy of immortal object %p ignored\n", obj); return(NULL); } if (ISPATHTYPE(obj->type)) KillPath(obj); else { switch (obj->type) { case REGIONTYPE: KillRegion(obj); break; case SPACETYPE: KillSpace(obj); break; case LINESTYLETYPE: KillLineStyle(obj); break; case FONTTYPE: KillFont(obj); break; case PICTURETYPE: /* KillPicture macro removed from sources (RMz, 2001-04-01) KillPicture(obj); */ break; case STROKEPATHTYPE: KillStrokePath(obj); break; case CLUTTYPE: KillCLUT(obj); break; default: return(ArgErr("Destroy: invalid object", obj, NULL)); } } return(NULL); } /* :h2.Generally Useful Macros :h3.FOLLOWING() - Macro to Point to the Data Following a Structure There are several places in TYPE1IMAGER where we will allocate variable data that belongs to a structure immediately after that structure. This is a performance technique, because it reduces the number of trips we have to take through Xalloc() and Xfree(). It turns out C has a very convenient way to point past a structure--if 'p' is a pointer to a structure, 'p+1' is a pointer to the data after it. This behavior of C is somewhat startling and somewhat hard to follow, if you are not used to it, so we define a macro to point to the data following a structure: */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.TYPECHECK() - Verify the Type of an Argument This macro tests the type of an argument. If the test fails, it consumes any other arguments as necessary and causes the imbedding routine to return the value 'whenBAD'. Note that the consumeables list should be an argument list itself, for example (0) or (2,A,B). See :hdref refid=consume. below. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.ARGCHECK() - Perform an Arbitrary Check on an Argument This macro is a generalization of TYPECHECK to take an arbitrary predicate. If the error occurs (i.e., the predicate is true), the arbitrary message 'msg' is returned. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.TYPENULLCHECK() - Extension of TYPECHECK() for NULL arguments Many routines allow NULLs to be passed as arguments. 'whenBAD' will be returned in this case, too. */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.MAKECONSUME() - Create a "Consume"-type Macro Consuming an object means destroying it if it is not permanent. This logic is so common to all the routines, that it is immortalized in this macro. For example, ConsumePath(p) can be simply defined as MAKECONSUME(p,KillPath(p)). In effect, this macro operates on a meta-level. :i1/consuming objects/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* :h3.MAKEUNIQUE() - Create a "Unique"-type Macro Many routines are written to modify their arguments in place. Thus, they want to insure that they duplicate an object if it is permanent. This is called making an object "unique". For example, UniquePath(p) can be simply defined as MAKEUNIQUE(p,DupPath(p)). :i1/unique objects/ */ /*SHARED LINE(S) ORIGINATED HERE*/ /* An object is unique (and directly alterable) if there is only one reference to it, and it is not permanent (in which case we increment the reference count, so we don't have to check the permanent bit). 3-26-91 PNM Note the rules for making a unique object: &drawing. IF (obj->references = 1) return(obj); ELSE (references > 1) IF (ISPERMANENT(obj->flag)) return(Dupxxx(obj)); ELSE (nonunique, temporary object!) obj->references--; return(Dupxxx(obj)); &edrawing. If we must make a Copy of a nonunique, temporary object, we decrement reference count of the original object! */ /* :h3.Unique() - Make a Unique Object Here is a generic 'Unique' function if the object type is not known. Why didn't we build it with the MAKEUNIQUE macro, you ask? Well, we used to, but there is at least one damn compiler in the world that raises errors if the types of an "(a) ? b : c" expression do not match. Also, when we changed Dup() to retain the permanent/temporary flag, we wanted to make sure "Unique" always returned a temporary object. Note that we cannot use Dup() to create a copy of the object in question, because Dup() may simply bump the reference count, and not return a unique copy to us. That is why we use t1_Copy(). The purpose of this function is to make sure we have a copy of an object that we can safely alter: :ol. :li.If we have a unique, temporary object, we simply return the argument. :li.If we have a nonunique, temporary object, we have to make a new copy of it, and decrement the reference count of the original object, to reflect the fact that we traded temporary handles. :li.If we have a permanent object, we make a temporary copy of it, but we do not decrement the reference count of the original permanent object, because permanent objects, by definition, are persistent. 3-2-6-91 PNM :eol. */ struct xobject *t1_Unique(obj) struct xobject *obj; { /* if the original object is not already unique, make a unique copy...Note also that if the object was not permanent, we must consume the old handle! 3-26-91 PNM NOTE : consumption of the old handle moved to Allocate. 4-18-91 */ if (!obj || obj->references == 1) return(obj); obj = Copy(obj); /* and make sure we return a temporary object ! */ if (ISPERMANENT(obj->flag)) { obj->flag &= ~ISPERMANENT(ON); obj->references--; } return(obj); } /* :h2.Initialization, Error, and Debug Routines :h3 id=debugvar.Declarations for Debug Purposes We declare all the debug flags here. Some link editors make the not unreasonable restriction that only one module may declare and initialize global variables; all the rest must declare the variable 'extern'. This is logical, but is somewhat awkward to implement with C include files. We solve the problem by temporarily making the name 'extern' a null name if GLOBALS is defined. (GLOBALS is only defined in this OBJECTS module.) Since 'externs' can't be initialized, we have to handle that with #defines too. :i1/GLOBALS (&#define.)/ */ /*SHARED LINE(S) ORIGINATED HERE*/ static char *ErrorMessage = NULL; /* :h3.Pragmatics() - Set/Reset Debug Flags We provide a controlled way for the TYPE1IMAGER user to set and reset our debugging and tracing: */ void Pragmatics(username, value) char *username; /* name of the flag */ int value; /* value to set it to */ { register char *p; /* temporary loop variable */ #define NAMESIZE 40 char name[NAMESIZE]; /* buffer to store my copy of 'username' */ if (strlen(username) >= NAMESIZE) abort("Pragmatics name too large", 18); strcpy(name, username); for (p = name; *p != '\0'; p++) *p = toupper(*p); if (!strcmp(name, "ALL")) MustTraceCalls = InternalTrace = /* MustCrash = */ LineIOTrace = value; else if (!strcmp(name, "LINEIOTRACE")) LineIOTrace = value; else if (!strcmp(name, "TRACECALLS")) MustTraceCalls = value; else if (!strcmp(name, "CHECKARGS")) MustCheckArgs = value; else if (!strcmp(name, "PROCESSHINTS")) ProcessHints = value; else if (!strcmp(name, "SAVEFONTPATHS")) SaveFontPaths = value; else if (!strcmp(name, "CRASTERCOMPRESSIONTYPE")) CRASTERCompressionType = value; else if (!strcmp(name, "CRASHONUSERERROR")) MustCrash = value; else if (!strcmp(name, "DEBUG")) StrokeDebug = SpaceDebug = PathDebug = ConicDebug = LineDebug = RegionDebug = MemoryDebug = FontDebug = HintDebug = ImageDebug = OffPageDebug = value; else if (!strcmp(name, "CONICDEBUG")) ConicDebug = value; else if (!strcmp(name, "LINEDEBUG")) LineDebug = value; else if (!strcmp(name, "REGIONDEBUG")) RegionDebug = value; else if (!strcmp(name, "PATHDEBUG")) PathDebug = value; else if (!strcmp(name, "SPACEDEBUG")) SpaceDebug = value; else if (!strcmp(name, "STROKEDEBUG")) StrokeDebug = value; else if (!strcmp(name, "MEMORYDEBUG")) MemoryDebug = value; else if (!strcmp(name, "FONTDEBUG")) FontDebug = value; else if (!strcmp(name, "HINTDEBUG")) HintDebug = value; else if (!strcmp(name, "IMAGEDEBUG")) ImageDebug = value; else if (!strcmp(name, "OFFPAGEDEBUG")) OffPageDebug = value; #ifdef MC68000 /* The following pragmatics flag turns on or off instruction histograming for performance analysis. It is only defined in the Delta card environment. */ else if (!strcmp(name, "PROFILE")) { if (value) StartProfile(); else StopProfile(); } #endif /* GimeSpace() is define as false ... */ /* else if (!strcmp(name, "FLUSHCACHE")) { while (GimeSpace()) { ; } } */ else if (!strcmp(name, "CACHEDCHARS")) CachedChars = (value <= 0) ? 1 : value; else if (!strcmp(name, "CACHEDFONTS")) CachedFonts = (value <= 0) ? 1 : value; else if (!strcmp(name, "CACHEBLIMIT")) CacheBLimit = value; else if (!strcmp(name, "CONTINUITY")) Continuity = value; else { printf("Pragmatics flag = '%s'\n", name); ArgErr("Pragmatics: flag not known", NULL, NULL); } return; } /* :h3.Consume() - Consume a List of Arguments This general purpose routine is provided in the case where the object type(s) to be consumed are unknown or not yet verified, and/or it is not known whether the object is permanent. If the type of the argument is known, it is faster to directly consume that type, for example, ConsumeRegion() or ConsumePath(). Furthermore, if it is already known that the object is temporary, it is faster to just kill it rather than consume it, for example, KillSpace(). */ void Consume(n, obj1, obj2, obj3) /* non-ANSI avoids overly strict type checking */ int n; struct xobject *obj1,*obj2,*obj3; { switch(n) { case 0: return; case 1: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); return; case 2: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); if (obj2 != NULL && !ISPERMANENT(obj2->flag)) Destroy(obj2); return; case 3: if (obj1 != NULL && !ISPERMANENT(obj1->flag)) Destroy(obj1); if (obj2 != NULL && !ISPERMANENT(obj2->flag)) Destroy(obj2); if (obj3 != NULL && !ISPERMANENT(obj3->flag)) Destroy(obj3); return; default: abort("Consume: too many objects", 19); } } /* :h3.TypeErr() - Handles "Invalid Object Type" Errors */ struct xobject *TypeErr(name, obj, expect, ret) /* non-ANSI avoids overly strict type checking */ char *name; /* Name of routine (for error message) */ struct xobject *obj; /* Object in error */ int expect; /* type expected */ struct xobject *ret; /* object to return to caller */ { static char typemsg[80]; if (MustCrash) LineIOTrace = TRUE; sprintf(typemsg, "Wrong object type in %s; expected %s, found %s.\n", name, TypeFmt(expect), TypeFmt(obj->type)); IfTrace0(TRUE,typemsg); ObjectPostMortem(obj); if (MustCrash) abort("Terminating because of CrashOnUserError...", 20); else ErrorMessage = typemsg; /* changed ISPERMANENT to ret->references > 1 3-26-91 PNM */ if (ret != NULL && (ret->references > 1)) ret = Dup(ret); return(ret); } /* :h4.TypeFmt() - Returns Pointer to English Name of Object Type This is a subroutine of TypeErr(). */ static char *TypeFmt(type) int type; /* type field */ { char *r; if (ISPATHTYPE(type)) if (type == TEXTTYPE) r = "path or region (from TextPath)"; else r = "path"; else { switch (type) { case INVALIDTYPE: r = "INVALID (previously consumed?)"; break; case REGIONTYPE: r = "region"; break; case SPACETYPE: r = "XYspace"; break; case LINESTYLETYPE: r = "linestyle"; break; case FONTTYPE: r = "font"; break; case PICTURETYPE: r = "picture"; break; case STROKEPATHTYPE: r = "path (from StrokePath)"; break; default: r = "UNKNOWN"; break; } } return(r); } /* :h4.ObjectPostMortem() - Prints as Much as We Can About a Bad Object This is a subroutine of TypeErr() and ArgErr(). */ /*ARGSUSED*/ static int ObjectPostMortem(obj) /* non-ANSI avoids overly strict type checking */ register struct xobject *obj; { Pragmatics("Debug", 10); IfTrace2(TRUE,"Bad object is of %s type %p\n", TypeFmt(obj->type), obj); IfTrace0((obj == (struct xobject *) USER), "Suspect that InitImager() was omitted.\n"); Pragmatics("Debug", 0); /* We return a value to make ANSI-compiler happy */ return(0); } /* :h3.ArgErr() - Invalid Argument Passed to a Routine A common routine to report argument errors. It is usually called is returned to the caller in case MustCrash is FALSE and ArgErr returns to its caller. */ struct xobject *ArgErr(string, obj, ret) /* non-ANSI avoids overly strict type checking */ char *string; /* description of error */ struct xobject *obj; /* object, if any, that was in error */ struct xobject *ret; /* object returned to caller or NULL */ { if (MustCrash) LineIOTrace = TRUE; IfTrace1(TRUE,"ARGUMENT ERROR-- %s.\n", string); if (obj != NULL) ObjectPostMortem(obj); if (MustCrash) abort("Terminating because of CrashOnUserError...", 21); else ErrorMessage = string; return(ret); } /* :h3.abort() - Crash Due to Error We divide by zero, and if that doesn't work, call exit(), the results of which is system dependent (and thus is part of the Hourglass required environment). */ /* RMz: We now do a longjmp in order to be able to recover from the error */ /*ARGSUSED*/ void abort(string, no) char *string; int no; { LineIOTrace = TRUE; TraceClose(); longjmp( stck_state, no); } /* By RMz: Return the abort string to t1lib! */ char *t1_get_abort_message( int number) { static char *err_msgs[]={ "DLdiv: dividend too large", /* 1 */ "divide algorithm error", /* 2 */ "Beziers this big not yet supported", /* 3 */ "ComputeHint: invalid orientation", /* 4 */ "ComputeHint: invalid hinttype", /* 5 */ "ComputeHint: invalid orientation", /* 6 */ "ProcessHint: invalid label", /* 7 */ "ProcessHint: label is not in use", /* 8 */ "ProcessHint: invalid label", /* 9 */ "ProcessHint: invalid adjusttype", /* 10 */ "bad subpath chain", /* 11 */ "ImpliedHorizontalLine: why ask?", /* 12 */ "disjoint subpath?", /* 13 */ "unable to fix subpath break?", /* 14 */ "Non-positive allocate?", /* 15 */ "We have REALLY run out of memory", /* 16 */ "Free of already freed object?", /* 17 */ "Pragmatics name too large", /* 18 */ "Consume: too many objects", /* 19 */ "Terminating because of CrashOnUserError...", /* 20 */ "Terminating because of CrashOnUserError...", /* 21 */ "Fundamental TYPE1IMAGER assumptions invalid in this port", /* 22 */ "Reverse: bad path segment", /* 23 */ "UnClose: no LASTCLOSED", /* 24 */ "PathTransform: invalid segment", /* 25 */ "QueryPath: unknown segment", /* 26 */ "QueryBounds: unknown type", /* 27 */ "KillRegion: negative reference count", /* 28 */ "newedge: height not positive", /* 29 */ "Interior: path type error", /* 30 */ "Unwind: uneven edges", /* 31 */ "negative sized edge?", /* 32 */ "splitedge: above top of list", /* 33 */ "splitedge: would be null", /* 34 */ "null splitedge", /* 35 */ "vertjoin not disjoint", /* 36 */ "SwathUnion: 0 height swath?", /* 37 */ "discard(): ran off end", /* 38 */ "UnJumble: unpaired edge?", /* 39 */ "Tighten: existing edge bound was bad", /* 40 */ "Tighten: existing region bound was bad", /* 41 */ "EDGE ERROR: non EDGETYPE in list", /* 42 */ "EDGE ERROR: overlapping swaths", /* 43 */ "Context: QueryDeviceState didn't work", /* 44 */ "QueryDeviceState returned invalid orientation", /* 45 */ "Context: out of them", /* 46 */ "MatrixInvert: can't", /* 47 */ "xiStub called", /* 48 */ "Illegal access type1 abort() message" /* 49 */ }; /* no is valid from 1 to 48 */ if ( (number<1)||(number>48)) number=49; return( err_msgs[number-1]); } /* :h3.REAL Miscellaneous Stuff :h4.ErrorMsg() - Return the User an Error Message */ char *ErrorMsg() { register char *r; r = ErrorMessage; ErrorMessage = NULL; return(r); } /* :h4.InitImager() - Initialize TYPE1IMAGER We check that a short is 16 bits and a long 32 bits; we have made those assumptions elsewhere in the code. (This is almost a C standard, anyway.) Note that TYPE1IMAGER makes no assumptions about the size of an 'int'! :i1/portability assumptions/ */ void InitImager() { /* Check to see if we have been using our own malloc. If so,*/ /* Undef malloc so that we can get to the system call. */ /* All other calls to malloc are defined to Xalloc. */ if (sizeof(SHORT) != 2 || sizeof(LONG) != 4) abort("Fundamental TYPE1IMAGER assumptions invalid in this port", 22); InitSpaces(); InitFonts(); InitFiles(); /* In some environments, constants and/or exception handling need to be */ LibInit(); } /* :h4.TermImager() - Terminate TYPE1IMAGER This only makes sense in a server environment; true TYPE1IMAGER needs do nothing. */ void TermImager() { return; } /* :h4.reportusage() - A Stub to Get a Clean Link with Portable PMP */ void reportusage( void) { return; } grace-5.1.23/T1lib/type1/token.c0000644000076500001440000006666306626627166015773 0ustar fnevgenyusers/* $XConsortium: token.c,v 1.2 91/10/10 11:19:55 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Authors: Sig Nin & Carol Thompson IBM Almaden Research Laboratory */ #include "types.h" #include "t1stdio.h" #include "util.h" #include "digit.h" #include "token.h" #include "tokst.h" #include "hdigit.h" /* * ------------------------------------------------------------------- * Globals * ------------------------------------------------------------------- */ extern int T1Getc(F_FILE * ), T1Ungetc( int,F_FILE *); /* These variables are set by the caller */ char *tokenStartP; /* Pointer to token buffer in VM */ char *tokenMaxP; /* Pointer to last byte in buffer + 1 */ /* These variables are set by TOKEN */ int tokenLength; /* Characters in token */ boolean tokenTooLong; /* Token too long for buffer */ int tokenType; /* Type of token identified */ psvalue tokenValue; /* Token value */ /* * ------------------------------------------------------------------- * Private variables * ------------------------------------------------------------------- */ static FILE *inputFileP; /* Current input file */ /* Token */ static char *tokenCharP; /* Pointer to next character in token */ /* * ------------------------------------------------------------------- * Private routines for manipulating numbers * ------------------------------------------------------------------- */ #define Exp10(e) \ ((e) == 0\ ? (DOUBLE)(1.0)\ : (-64 <= (e) && (e) <= 63\ ? Exp10T[(e)+64]\ : P10(e)\ )\ ) static DOUBLE Exp10T[128] = { 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49, 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33, 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18, 1e-17, 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31, 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, 1e48, 1e49, 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63 }; static DOUBLE P10(exponent) LONG exponent; { DOUBLE value, power; if (exponent < 0) { power = 0.1; value = (exponent & 1 ? power : 1.0); exponent = -((exponent+1) >> 1); /* portable C for -(exponent/2) */ } else { power = 10.0; value = (exponent & 1 ? power : 1.0); exponent = exponent >> 1; } while(exponent > 0) { power *= power; if (exponent & 1) value *= power; exponent >>= 1; } return(value); } /* * ------------------------------------------------------------------- * Private routines and macros for manipulating the input * ------------------------------------------------------------------- */ /* Get next character from the input -- * */ #define next_ch() (getc(inputFileP)) /* Push a character back into the input -- * * Ungetc of EOF will fail, but that's ok: the next getc will * return EOF. * * NOTE: These macros are presently written to return the character * pushed, or EOF if none was pushed. However, they are not * required to return anything in particular, and callers should * not rely on the returned value. */ #define back_ch(ch) (ungetc(ch, inputFileP)) /* Push a character back into the input if it was not white space. * If it is a carriage return (\r) then check next char for * linefeed and consume them both, otherwise put next char back. * */ #define back_ch_not_white(ch) \ (\ isWHITE_SPACE(ch)\ ? ((ch == '\r')\ ? (((ch = next_ch()) == '\n')\ ? EOF\ : back_ch(ch)\ )\ : EOF\ )\ : back_ch(ch)\ ) /* * ------------------------------------------------------------------- * Private routines and macros for manipulating the token buffer * ------------------------------------------------------------------- */ /* Add a character to the token * ---- use ONLY when you KNOW that this character will * be stored within the token buffer. */ #define save_unsafe_ch(ch) (*tokenCharP++ = ch) /* Add a character to the token, if not too long to fit */ #define save_ch(ch) \ ((tokenCharP < tokenMaxP)\ ? save_unsafe_ch(ch)\ : (tokenTooLong = TRUE)\ ) /* * ------------------------------------------------------------------- * Action Routines * * These routines all * -- take int ch as a parameter * -- return int ch if no token was recognized, DONE otherwise * -- leave the next character in the input, if returning DONE * ------------------------------------------------------------------- */ #define DONE (256) /* Get the next input character */ static int next_char(ch) int ch; { return(next_ch()); } /* Add character to token */ static int add_char(ch) int ch; { save_ch(ch); return(next_ch()); } /* ------------------------------------------------------------------- * Skip white space and comments */ /* Skip white space */ static int skip_space(ch) int ch; { do { ch = next_ch(); } while(isWHITE_SPACE(ch)); return(ch); } /* Skip comments */ static int skip_comment(ch) int ch; { do { ch = next_ch(); } while(isCOMMENT(ch)); return(ch); } /* ------------------------------------------------------------------- * Collect value elements for a number */ /* decimal integer or real number mantissa */ static int m_sign; static LONG m_value; static LONG m_scale; /* real number exponent */ static int e_sign; static LONG e_value; static LONG e_scale; /* radix number */ static LONG r_base; static LONG r_value; static LONG r_scale; static int add_sign(ch) int ch; { m_sign = ch; save_unsafe_ch(ch); return(next_ch()); } static int add_1st_digits(ch) int ch; { m_sign = '+'; return(add_digits(ch)); } static int add_digits(ch) int ch; { LONG value, p_value, scale; int digit; /* On entry, expect m_sign to be set to '+' or '-'; * ch is a decimal digit. * Expect at most one character saved at this point, * a sign. This routine will save up to 10 more * characters without checking the buffer boundary. */ value = ch - '0'; save_unsafe_ch(ch); ch = next_ch(); while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { value = (value << 3) + (value << 1) + (ch - '0'); save_unsafe_ch(ch); ch = next_ch(); } /* Quick exit for small integers -- * |x| <= 10*((MAX_INTEGER/10)-1)+9 * |x| <= 2,147,483,639 for 32 bit integers */ if (isNUMBER_ENDER(ch)) { back_ch_not_white(ch); tokenValue.integer = (m_sign == '-' ? -value : value); tokenType = TOKEN_INTEGER; return(DONE); } /* Handle additional digits. Beyond the boundary case, * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER * just count the digits: the number is too large to * represent as an integer and will be returned as a real. * The mantissa of a real holds fewer bits than an integer. */ p_value = value; value = (m_sign == '-' ? -value : value); scale = 0; if (isDECIMAL_DIGIT(ch)) { /* Handle the boundary case */ if (p_value == (MAX_INTEGER/10)) { digit = ch - '0'; /* Must handle positive and negative values separately */ /* for 2's complement arithmetic */ if (value > 0) { if (digit <= MAX_INTEGER%10) value = (value << 3) + (value << 1) + digit; else ++scale; /* Too big, just count it */ } else { /* Use positive % operands for portability */ if (digit <= -(MIN_INTEGER+10)%10) value = (value << 3) + (value << 1) - digit; else ++scale; /* Too big, just count it */ } } else ++scale; /* Not boundary case, just count digit */ save_unsafe_ch(ch); ch = next_ch(); /* Continue scanning digits, but can't store them */ while(isDECIMAL_DIGIT(ch)) { ++scale; save_ch(ch); ch = next_ch(); } } /* Continue from here scanning radix integer or real */ m_value = value; m_scale = scale; /* Initialize for possible real */ e_sign = '+'; e_value = 0; e_scale = 0; return(ch); } static int add_1st_decpt(ch) int ch; { m_sign = '+'; return(add_decpt(ch)); } static int add_decpt(ch) int ch; { /* On entry, expect m_sign to be set to '+' or '-' */ m_value = 0; m_scale = 0; save_unsafe_ch(ch); return(next_ch()); } static int add_fraction(ch) int ch; { LONG value, scale; int digit; /* On entry, expect m_value and m_scale to be initialized, * and m_sign to be set to '+' or '-'. Expect m_value and m_sign * to be consistent (this is not checked). */ value = m_value; scale = m_scale; /* Scan leading zeroes */ if (value == 0) { while(ch == '0') { --scale; save_ch(ch); ch = next_ch(); } /* Scan first significant digit */ if (isDECIMAL_DIGIT(ch)) { --scale; value = ch - '0'; value = (m_sign == '-' ? -value : value); save_ch(ch); ch = next_ch(); } else /* no significant digits -- number is zero */ scale = 0; } /* value != 0 || value == 0 && !isDECIMAL_DIGIT(ch) */ /* Scan additional significant digits */ if (isDECIMAL_DIGIT(ch)) { if (value > 0) { while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { --scale; value = (value << 3) + (value << 1) + (ch - '0'); save_ch(ch); ch = next_ch(); } /* Check boundary case */ if (isDECIMAL_DIGIT(ch) && value == (MAX_INTEGER/10)) { digit = ch - '0'; if (digit <= MAX_INTEGER%10) { --scale; value = (value << 3) + (value << 1) + digit; save_ch(ch); ch = next_ch(); } } } else { /* value < 0 */ while(isDECIMAL_DIGIT(ch) && value > -(-(MIN_INTEGER+10)/10+1)) { /* Use positive / operands for portability */ --scale; value = (value << 3) + (value << 1) - (ch - '0'); save_ch(ch); ch = next_ch(); } /* Check boundary case */ if (isDECIMAL_DIGIT(ch) && value == -(-(MIN_INTEGER+10)/10+1)) { digit = ch - '0'; if (digit <= -(MIN_INTEGER+10)%10) { /* Use positive % operands for portability */ --scale; value = (value << 3) + (value << 1) - digit; save_ch(ch); ch = next_ch(); } } } /* Additional digits can be discarded */ while(isDECIMAL_DIGIT(ch)) { save_ch(ch); ch = next_ch(); } } /* Store results */ m_value = value; m_scale = scale; /* Initialize for possible real */ e_sign = '+'; e_value = 0; e_scale = 0; return(ch); } static int add_e_sign(ch) int ch; { e_sign = ch; save_ch(ch); return(next_ch()); } static int add_exponent(ch) int ch; { LONG value, p_value; LONG scale = 0; int digit; /* On entry, expect e_sign to be set to '+' or '-' */ value = ch - '0'; save_ch(ch); ch = next_ch(); while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { value = (value << 3) + (value << 1) + (ch - '0'); save_ch(ch); ch = next_ch(); } p_value = value; value = (e_sign == '-' ? -value : value); /* Handle additional digits. Beyond the boundary case, * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER * just count the digits: the number is too large to * represent as an integer. */ if (isDECIMAL_DIGIT(ch)) { /* Examine boundary case */ if (p_value == (MAX_INTEGER/10)) { digit = ch - '0'; /* Must handle positive and negative values separately */ /* for 2's complement arithmetic */ if (value > 0) { if (digit <= MAX_INTEGER%10) value = (value << 3) + (value << 1) + digit; else ++scale; /* Too big, just count it */ } else { /* Use positive % operands for portability */ if (digit <= -(MIN_INTEGER+10)%10) value = (value << 3) + (value << 1) - digit; else ++scale; /* Too big, just count it */ } } else ++scale; /* Not boundary case, just count digit */ save_ch(ch); ch = next_ch(); /* Continue scanning digits, but can't store any more */ while(isDECIMAL_DIGIT(ch)) { ++scale; save_ch(ch); ch = next_ch(); } } /* Store results */ e_value = value; e_scale = scale; return(ch); } static int add_radix(ch) int ch; { if (2 <= m_value && m_value <= 36 && m_scale == 0) { r_base = m_value; save_ch(ch); return(next_ch()); } else { /* Radix invalid, complete a name token */ return(AAH_NAME(ch)); } } static int add_r_digits(ch) int ch; { ULONG value; LONG radix, scale; int digit; /* NOTE: The syntax of a radix number allows only for * values of zero or more. The value will be stored as * a 32 bit integer, which PostScript then interprets * as signed. This means, for example, that the numbers: * * 8#37777777777 * 10#4294967295 * 16#FFFFFFFF * 36#1Z141Z3 * * are all interpreted as -1. This routine implements this * idea explicitly: it accumulates the number's value * as unsigned, then casts it to signed when done. */ /* Expect r_base to be initialized */ radix = r_base; value = 0; scale = 0; /* Scan leading zeroes */ while(ch == '0') { save_ch(ch); ch = next_ch(); } /* Handle first non-zero digit */ if ((digit=digit_value[ch]) < radix) { value = digit; save_ch(ch); ch = next_ch(); /* Add digits until boundary case reached */ while((digit=digit_value[ch]) < radix && value < (MAX_ULONG / radix)) { value = value * radix + digit; save_ch(ch); ch = next_ch(); }; /* Scan remaining digits */ if ((digit=digit_value[ch]) < radix) { /* Examine boundary case --- * radix*(MAX_ULONG/radix) <= number <= MAX_ULONG */ if (value == (MAX_ULONG/radix) && digit <= MAX_ULONG%radix) value = value * radix + digit; else ++scale; /* Continue scanning digits, but can't store them */ save_ch(ch); ch = next_ch(); while(digit_value[ch] < radix) { ++scale; save_ch(ch); ch = next_ch(); } } } /* Store result */ r_value = (LONG) value; /* result is signed */ r_scale = scale; return(ch); } /* ------------------------------------------------------------------- * Complete a number; set token type and done flag. * Put current input character back, if it is not white space. */ /* Done: Radix Number */ static int RADIX_NUMBER(ch) int ch; { back_ch_not_white(ch); if (r_scale == 0) { tokenValue.integer = r_value; tokenType = TOKEN_INTEGER; } else { tokenType = TOKEN_NAME; } return(DONE); } /* Done: Integer */ static int INTEGER(ch) int ch; { back_ch_not_white(ch); if (m_scale == 0) { tokenValue.integer = m_value; tokenType = TOKEN_INTEGER; } else { tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale); tokenType = TOKEN_REAL; } return(DONE); } /* Done: Real */ static int REAL(ch) int ch; { DOUBLE temp; back_ch_not_white(ch); /* NOTE: ignore e_scale, since e_value alone will cause * exponent overflow if e_scale > 0. */ /* HAZARD: exponent overflow of intermediate result * (e.g., in 370 floating point); this should not be a problem * with IEEE floating point. Reduce exponent overflow hazard by * combining m_scale and e_value first, if they have different signs, * or multiplying m_value and one of the other factors, if both * m_scale and e_value are negative. */ if ((m_scale >= 0 && e_value <= 0) || (m_scale <= 0 && e_value >= 0)) { tokenValue.real = (DOUBLE)(m_value) * Exp10(m_scale + e_value); } else { temp = (DOUBLE)(m_value) * Exp10(m_scale); tokenValue.real = temp * Exp10(e_value); } tokenType = TOKEN_REAL; return(DONE); } /* ------------------------------------------------------------------- * Assemble a hex string; set token type and done flag. */ /* Done: Hex String */ static int HEX_STRING(ch) int ch; { int value; while(TRUE) { /* Process odd digit */ ch = next_ch(); if (!isHEX_DIGIT(ch)) { /* Skip white space */ while(isWHITE_SPACE(ch)) ch = next_ch(); /* Check for terminator */ if (!isHEX_DIGIT(ch)) { break; } } value = digit_value[ch] << 4; /* Process even digit */ ch = next_ch(); if (!isHEX_DIGIT(ch)) { /* Skip white space */ while(isWHITE_SPACE(ch)) ch = next_ch(); /* Check for terminator */ if (!isHEX_DIGIT(ch)) { save_ch(value); break; } } save_ch(value + digit_value[ch]); } /* Classify result, based on why loop ended */ if (ch == '>') tokenType = TOKEN_HEX_STRING; else { /* save the invalid character for error reporting */ save_ch(ch); tokenType = TOKEN_INVALID; } return(DONE); } /* ------------------------------------------------------------------- * Assemble a string; set token type and done flag */ /* Save a backslash-coded character in a string -- * * Store the proper character for special cases * "\b", "\f", "\n", "\r", and "\t". * * Decode and store octal-coded character, up to * three octal digits, "\o", "\oo", and "\ooo". * * The sequence "\" is a line continuation, * so consume both without storing anything. * * The sequence "\" is an error; exit without * storing anything and let the caller handle it. * * For other characters, including the sequences * "\\", "\(", and "\)", simply store the second * character. */ static void save_digraph(ch) int ch; { int value; switch (ch) { case 'b': /* backspace */ ch = '\b'; break; case 'f': /* formfeed */ ch = '\f'; break; case 'n': /* newline */ ch = '\n'; break; case 'r': /* carriage return */ ch = '\r'; break; case 't': /* horizontal tab */ ch = '\t'; break; case '\n': /* line continuation -- consume it */ return; case '\r': /* carriage return -- consume it */ ch = next_ch(); /* look at next character, is it \n? */ if (ch == '\n') return; back_ch(ch); /* if not a line feed, then return it */ return; case EOF: /* end of file -- forget it */ return; default: /* scan up to three octal digits to get value */ if (isOCTAL_DIGIT(ch)) { value = digit_value[ch]; ch = next_ch(); if (isOCTAL_DIGIT(ch)) { value = (value << 3) + digit_value[ch]; ch = next_ch(); if (isOCTAL_DIGIT(ch)) value = (value << 3) + digit_value[ch]; else back_ch(ch); } else back_ch(ch); ch = value; } } /* Found a character to save */ save_ch(ch); } /* Done: String */ static int STRING(ch) int ch; { int nest_level = 1; tokenType = TOKEN_STRING; do { ch = next_ch(); while(!isSTRING_SPECIAL(ch)) { save_ch(ch); ch = next_ch(); }; switch (ch) { case '(': ++nest_level; save_ch(ch); break; case ')': if (--nest_level > 0) save_ch(ch); break; case '\\': save_digraph(next_ch()); break; case '\r': /* All carriage returns (\r) are turned into linefeeds (\n)*/ ch = next_ch(); /* get the next one, is it \n? */ if (ch != '\n') { /* if not, then put it back. */ back_ch(ch); } save_ch('\n'); /* in either case, save a linefeed */ break; case EOF: tokenType = TOKEN_INVALID; /* Unterminated string */ nest_level = 0; break; } } while(nest_level > 0); return(DONE); } /* ------------------------------------------------------------------- * Assemble a name; set token type and done flag. * Put current input character back, if it is not white space. */ /* Done: Name * (Safe version used to complete name tokens that * start out looking like something else). */ static int AAH_NAME(ch) int ch; { do { save_ch(ch); ch = next_ch(); } while(isNAME(ch)); back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* Done: Name */ static int NAME(ch) int ch; { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* Done: Literal Name */ static int LITERAL_NAME(ch) int ch; { if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_LITERAL_NAME; return(DONE); } /* Done: immediate Name */ static int IMMED_NAME(ch) int ch; { ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); if (isNAME(ch)) { save_unsafe_ch(ch); ch = next_ch(); while(isNAME(ch)) { save_ch(ch); ch = next_ch(); } } } } } } } back_ch_not_white(ch); tokenType = TOKEN_IMMED_NAME; return(DONE); } /* Done: Name found while looking for something else */ static int OOPS_NAME(ch) int ch; { back_ch_not_white(ch); tokenType = TOKEN_NAME; return(DONE); } /* ------------------------------------------------------------------- * Complete a miscellaneous token; set token type and done flag. */ /* Done: Unmatched Right Angle-Bracket */ static int RIGHT_ANGLE(ch) int ch; { tokenType = TOKEN_RIGHT_ANGLE; return(DONE); } /* Done: Unmatched Right Parenthesis */ static int RIGHT_PAREN(ch) int ch; { tokenType = TOKEN_RIGHT_PAREN; return(DONE); } /* Done: Left Brace */ static int LEFT_BRACE(ch) int ch; { tokenType = TOKEN_LEFT_BRACE; return(DONE); } /* Done: Right Brace */ static int RIGHT_BRACE(ch) int ch; { tokenType = TOKEN_RIGHT_BRACE; return(DONE); } /* Done: Left Bracket */ static int LEFT_BRACKET(ch) int ch; { save_unsafe_ch(ch); tokenType = TOKEN_LEFT_BRACKET; return(DONE); } /* Done: Right Bracket */ static int RIGHT_BRACKET(ch) int ch; { save_unsafe_ch(ch); tokenType = TOKEN_RIGHT_BRACKET; return(DONE); } /* Done: Break */ static int BREAK_SIGNAL(ch) int ch; { tokenType = TOKEN_BREAK; return(DONE); } /* Done: No Token Found */ static int NO_TOKEN(ch) int ch; { tokenType = TOKEN_EOF; return(DONE); } /* * ------------------------------------------------------------------- * scan_token -- scan one token from the input. It uses a simple * finite state machine to recognize token classes. * * The input is from a file. * * On entry -- * * inputP -> input PostScript object, a file. * tokenStartP -> buffer in VM for accumulating the token. * tokenMaxP -> last character in the token buffer * * On exit -- * * tokenLength = number of characters in the token * tokenTooLong = TRUE if the token did not fit in the buffer * tokenType = code for the type of token parsed. * tokenValue = converted value of a numeric token. * * * ------------------------------------------------------------------- */ void scan_token(inputP) psobj *inputP; { int ch; unsigned char *stateP = s0; unsigned char entry; int (*actionP)(); /* Define input source */ inputFileP = inputP->data.fileP; if (inputFileP == NULL) { tokenType = TOKEN_EOF; return; } /* Ensure enough space for most cases * (so we don't have to keep checking) * The length needs to cover the maximum number * of save_unsafe_ch() calls that might be executed. * That number is 11 (a sign and 10 decimal digits, e.g., * when scanning -2147483648), but use MAX_NAME_LEN * in case someone changes that without checking. */ if (vm_free_bytes() < (MAX_NAME_LEN)) { if (!(vm_init())) { tokenLength = 0; tokenTooLong = TRUE; tokenType = TOKEN_NONE; tokenValue.integer = 0; return; } } tokenStartP = vm_next_byte(); /* Reset token */ tokenCharP = tokenStartP; tokenTooLong = FALSE; /* Scan one token */ ch = next_ch(); do { entry = stateP[ch]; stateP = classActionTable[entry].nextStateP; actionP = classActionTable[entry].actionRoutineP; ch = (*actionP)(ch); } while(ch != DONE); /* Return results */ tokenLength = tokenCharP - tokenStartP; } grace-5.1.23/T1lib/type1/paths_rmz.h0000644000076500001440000002130506626627166016647 0ustar fnevgenyusers/* $XConsortium: paths.h,v 1.2 91/10/10 11:18:50 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define XOBJ_COMMON char type; unsigned char flag; short references; #include "spaces_rmz.h" /* #define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y) #define ILoc(S,x,y) t1_ILoc(S,x,y) #define Line(P) t1_Line(P) #define Join(p1,p2) t1_Join(p1,p2) #define ClosePath(p) t1_ClosePath(p,0) #define CloseLastSubPath(p) t1_ClosePath(p,1) #define Conic(B,C,s) t1_Conic(B,C,(DOUBLE)s) #define RoundConic(M,C,r) t1_RoundConic(M,C,(DOUBLE)r) #define ArcP3(S,P2,P3) t1_ArcP3(S,P2,P3) #define ArcCA(S,C,d) t1_ArcCA(S,C,(DOUBLE)d) #define Bezier(B,C,D) t1_Bezier(B,C,D) #define Hint(S,r,w,o,h,a,d,l) t1_Hint(S,r,w,o,h,a,d,l) #define Reverse(p) t1_Reverse(p) #define ReverseSubPaths(p) t1_ReverseSubPaths(p) #define AddLoc(p1,p2) t1_Join(p1,p2) #define SubLoc(p1,p2) t1_SubLoc(p1,p2) #define DropSegment(p) t1_DropSegment(p) #define HeadSegment(p) t1_HeadSegment(p) #define QueryLoc(P,S,x,y) t1_QueryLoc(P,S,x,y) #define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r) #define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2) */ /* struct segment *t1_Loc(); struct segment *t1_ILoc(); struct segment *t1_Line(); struct segment *t1_Join(); struct segment *t1_ClosePath(); struct conicsegment *t1_Conic(); struct conicsegment *t1_RoundConic(); struct conicsegment *t1_ArcP3(); struct conicsegment *t1_ArcCA(); struct beziersegment *t1_Bezier(); struct hintsegment *t1_Hint(); struct segment *t1_Reverse(); struct segment *t1_ReverseSubPaths(); struct segment *t1_SubLoc(); struct segment *t1_DropSegment(); struct segment *t1_HeadSegment(); void t1_QueryLoc(); void t1_QueryPath(); void t1_QueryBounds(); */ /*END SHARED*/ /*SHARED*/ #define CopyPath(p) t1_CopyPath(p) #define KillPath(p) t1_KillPath(p) #define PathTransform(p,m) t1_PathXform(p,m) #define PathDelta(p,pt) t1_PathDelta(p,pt) #define BoundingBox(h,w) t1_BoundingBox(h,w) #define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y) #define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) #define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) #define BoxPath(S,h,w) t1_BoxPath(S,h,w) struct segment *t1_CopyPath(); /* duplicate a path */ void t1_KillPath(); /* destroy a path */ struct segment *t1_PathXform(); /* transform a path arbitrarily */ void t1_PathDelta(); /* calculate the ending point of a path */ struct segment *t1_PathSegment(); /* produce a MOVE or LINE segment */ struct segment *t1_JoinSegment(); /* join a MOVE or LINE segment to a path */ DOUBLE t1_Hypoteneuse(); /* returns the length of a line */ struct segment *t1_BoxPath(); /* returns a rectangular path */ /*END SHARED*/ /*SHARED*/ #define ConsumePath(p) MAKECONSUME(p,KillPath(p)) #define UniquePath(p) MAKEUNIQUE(p,CopyPath(p)) /*END SHARED*/ /*SHARED*/ struct segment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* relative ending location of path segment */ } ; #define ISCLOSED(flag) ((flag)&0x80) /* subpath is closed */ #define LASTCLOSED(flag) ((flag)&0x40) /* last segment in closed subpath */ /* NOTE: The ISCLOSED flag is set on the MOVETYPE segment before the subpath proper; the LASTCLOSED flag is set on the last segment (LINETYPE) in the subpath We define the ISPATHANCHOR predicate to test that a path handle passed by the user is valid: */ #define ISPATHANCHOR(p) (ISPATHTYPE(p->type)&&p->last!=NULL) /* For performance reasons, a user's "location" object is identical to a path whose only segment is a move segment. We define a predicate to test for this case. See also :hdref refid=location.. */ #define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL) /*END SHARED*/ /*SHARED*/ struct conicsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = CONICTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* Ending point (C point) */ struct fractpoint M; /* "midpoint" of conic explained above */ float roundness; /* explained above */ } ; /*END SHARED*/ /*SHARED*/ struct beziersegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = BEZIERTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* ending point (D) */ struct fractpoint B; /* control point B */ struct fractpoint C; /* control point C */ } ; /*END SHARED*/ /*SHARED*/ struct hintsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = HINTTYPE */ unsigned char size; /* size of the structure */ unsigned char context; /* device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* ALWAYS 0,0 */ struct fractpoint ref; struct fractpoint width; char orientation; char hinttype; char adjusttype; char direction; int label; } ; /*END SHARED*/ /*SHARED*/ /* CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro is also used by the STROKES module.) */ #define CONCAT(p1, p2) { \ (struct segment *)(p1)->last->link = (struct segment *)p2; \ (struct segment *)(p1)->last = p2->last; \ (struct segment *)(p2)->last = NULL; } /*END SHARED*/ grace-5.1.23/T1lib/type1/trig.h0000644000076500001440000000311606626627166015605 0ustar fnevgenyusers/* $XConsortium: trig.h,v 1.2 91/10/10 11:20:04 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /*SHARED*/ #define DegreeCos(d) xiStub() #define DegreeSin(d) xiStub() #define sqrt(d) xiStub() grace-5.1.23/T1lib/type1/t1io.c0000644000076500001440000004021207521323636015473 0ustar fnevgenyusers/* $XConsortium: t1io.c,v 1.4 91/10/10 11:19:41 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Carol H. Thompson IBM Almaden Research Center */ /******************************************************************* * I/O package for Type 1 font reading ********************************************************************/ #ifndef STATIC #define STATIC static #endif #if defined(_MSC_VER) # include # include # include #else # include #endif #include #include #include #include #include #include "t1stdio.h" #include "t1hdigit.h" /* we define this to switch to decrypt-debugging mode. The stream of decrypted bytes will be written to stdout! This contains binary charstring data */ /* #define DEBUG_DECRYPTION */ /* #define DEBUG_PFB_BLOCKS */ /* Constants and variables used in the decryption */ #define c1 ((unsigned short)52845) #define c2 ((unsigned short)22719) static unsigned short r; static int asc, Decrypt; static int extrach; static int haveextrach; static int starthex80=0; static long pfbblocklen=0; static long accu=0; static unsigned long bytecnt=0; static int eexec_startOK=0; static int eexec_endOK=0; static int in_eexec=0; /* Our single FILE structure and buffer for this package */ STATIC F_FILE TheFile; STATIC unsigned char TheBuffer[F_BUFSIZ]; /* Our routines */ F_FILE *T1Open(), *T1eexec(); int T1Close(); int T1Read(), T1Getc(), T1Ungetc(); void T1io_reset(void); STATIC int T1Decrypt(), T1Fill(); /* -------------------------------------------------------------- */ /*ARGSUSED*/ F_FILE *T1Open(fn, mode) char *fn; /* Pointer to filename */ char *mode; /* Pointer to open mode string */ { F_FILE *of = &TheFile; char c; Decrypt = 0; eexec_startOK=0; eexec_endOK=0; #ifndef O_BINARY # define O_BINARY 0x0 #endif /* We know we are only reading */ if ((of->fd=open(fn, O_RDONLY | O_BINARY)) < 0) return NULL; /* We check for pfa/pfb file */ if (read( of->fd, &c, 1)!=1) { close( of->fd); return(NULL); } else if (c==(char)0x80){ starthex80=1; } lseek( of->fd, 0, SEEK_SET); /* Initialize the buffer information of our file descriptor */ of->b_base = TheBuffer; of->b_size = F_BUFSIZ; of->b_ptr = NULL; of->b_cnt = 0; of->flags = 0; of->error = 0; haveextrach = 0; return &TheFile; } /* end Open */ /* -------------------------------------------------------------- */ int T1Getc(f) /* Read one character */ F_FILE *f; /* Stream descriptor */ { if (f->b_base == NULL) return EOF; /* already closed */ if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; return (int) f->ungotc; } if (f->b_cnt == 0) /* Buffer needs to be (re)filled */ f->b_cnt = T1Fill(f); if (f->b_cnt > 0) return (f->b_cnt--, (int) *(f->b_ptr++)); else { f->flags |= FIOEOF; return EOF; } } /* end Getc */ /* This function is added by RMz: T1Gets(): Read a line of the file and save it to string. At most, (size-1) bytes are read. The user *must* ensure (by making size large enough) that "eexec" does not get split between two calls because in this case, eexec-encryption does not set in. ------------------------------------------------------------ */ int T1Gets(char *string, int size, F_FILE *f) /* Read a line */ { int i=0; char *eexecP; if (string == NULL) { return( i); } if (f->b_base == NULL) return( i); /* already closed */ if (size<2) /* no bytes to be read. For size = 1 we only had room for the \0-character. */ return( i); if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; string[i++]=f->ungotc; size--; } size--; /* we have to leave room for one \0-character */ while ( size>0) { if (f->b_cnt == 0) { /* Buffer needs to be (re)filled */ f->b_cnt = T1Fill(f); } if (f->b_cnt == 0) { /* no more bytes available. Put \0-char and return. */ if ( i==0) { /* we did not already store one single char to string */ f->flags |= FIOEOF; return( i); } else { f->flags |= FIOEOF; string[i]='\0'; return( i); } } /* do not skip white space as required by Adobe spec, because if have found fonts where the first encrypted byte was of white space type. */ if ( (eexec_startOK==1) && (eexec_endOK==1)) { T1eexec( f); eexec_startOK=0; eexec_endOK=0; in_eexec=1; /* we are now in the encrypted portion. */ } string[i]=*(f->b_ptr); /* Check whether eexec appears in the string just setup */ if ( (Decrypt==0) && ((eexecP=strstr( string, "eexec"))!=NULL) ) { /* if eexec is an isolated token, start decryption */ if ( (eexec_startOK==1) && (isspace( (int)string[i])!=0) ) { eexec_endOK=1; } if ( (eexec_startOK==0) && (isspace( (int)string[i-5])!=0) ) { eexec_startOK=1; } } i++; /* Under UNIX, '\n' is the accepted newline. For pfb-files it is also common to use '\r' as the newline indicator. I have, however, never seen a pfb-file which uses the sequence '\r''\n' as a newline indicator, as known from DOS. So we don't take care for this case and simply map both single characters \r and \n into \n. Of course, this can only be done in the ASCII section of the font. */ if ( *(f->b_ptr)=='\n' || *(f->b_ptr)=='\r') { if (in_eexec==0) string[i-1]='\n'; string[i]='\0'; f->b_cnt--; f->b_ptr++; return( i); } f->b_cnt--; f->b_ptr++; size--; } /* end of while (size>0) */ string[i]='\0'; /* finish string */ return( i); } /* end of T1Gets() */ int T1GetDecrypt( void) { return( in_eexec); } /* Return the optional contents after the final cleartomark token. There might appear some PostScript code which is not important for t1lib, but which becomes important if subsetted fonts are embedded in PostScript files. */ int T1GetTrailer(char *string, int size, F_FILE *f) { unsigned long off_save; char *buf; char *ctmP; int i=0, j; int datasize; datasize=size; off_save=lseek( f->fd, 0, SEEK_CUR); if ((buf=(char *)malloc( size+1))==NULL ) { return( -1); } lseek( f->fd, -size, SEEK_END); read(f->fd, buf, size); buf[size]='\0'; /* to be ablo perform a strstr() on this memory */ i=datasize; j=datasize-11; /* length of "cleartomark" plus terminating white space or newline */ while ((j--)>-1) { if ((unsigned char)buf[i]==0x80) { datasize=i; /* we skip the segment marker of pfb-files */ } if ((ctmP=strstr( &(buf[j]), "cleartomark"))!=NULL) { memcpy( string, &(buf[i]), datasize-i); string[datasize-i]='\0'; lseek( f->fd, off_save, SEEK_SET); free( buf); return( datasize-i); } i--; } lseek( f->fd, off_save, SEEK_SET); free( buf); return( -1); } unsigned long T1GetFileSize( F_FILE *f) { unsigned long off_save; unsigned long filesize; off_save=lseek( f->fd, 0, SEEK_CUR); filesize=lseek( f->fd, 0, SEEK_END); lseek( f->fd, off_save, SEEK_SET); return( filesize); } /* -------------------------------------------------------------- */ int T1Ungetc(c, f) /* Put back one character */ int c; F_FILE *f; /* Stream descriptor */ { if (c != EOF) { f->ungotc = c; f->flags |= UNGOTTENC; /* set flag */ f->flags &= ~FIOEOF; /* reset EOF */ } return c; } /* end Ungetc */ /* -------------------------------------------------------------- */ int T1Read(buffP, size, n, f) /* Read n items into caller's buffer */ char *buffP; /* Buffer to be filled */ int size; /* Size of each item */ int n; /* Number of items to read */ F_FILE *f; /* Stream descriptor */ { int bytelen, cnt, i; F_char *p = (F_char *)buffP; int icnt; /* Number of characters to read */ if (f->b_base == NULL) return 0; /* closed */ icnt = (size!=1)?n*size:n; /* Number of bytes we want */ if (f->flags & UNGOTTENC) { /* there is an ungotten c */ f->flags &= ~UNGOTTENC; *(p++) = f->ungotc; icnt--; bytelen = 1; } else bytelen = 0; while (icnt > 0) { /* First use any bytes we have buffered in the stream buffer */ if ((cnt=f->b_cnt) > 0) { if (cnt > icnt) cnt = icnt; for (i=0; ib_ptr++); f->b_cnt -= cnt; icnt -= cnt; bytelen += cnt; } if ((icnt == 0) || (f->flags & FIOEOF)) break; f->b_cnt = T1Fill(f); } return ((size!=1)?bytelen/size:bytelen); } /* end Read */ /* -------------------------------------------------------------- */ int T1Close(f) /* Close the file */ F_FILE *f; /* Stream descriptor */ { if (f->b_base == NULL) return 0; /* already closed */ f->b_base = NULL; /* no valid stream */ return close(f->fd); } /* end Close */ /* -------------------------------------------------------------- */ F_FILE *T1eexec(f) /* Initialization */ F_FILE *f; /* Stream descriptor */ { int i; int H; unsigned char *p; unsigned char randomP[8]; r = 55665; /* initial key */ asc = 1; /* indicate ASCII form */ #ifdef DEBUG_DECRYPTION printf("T1eexec(1): first 20 bytes=%.20s, b_cnt=%d\n", f->b_ptr, f->b_cnt); #endif /* Consume the 4 random bytes, determining if we are also to ASCIIDecodeHex as we process our input. (See pages 63-64 of the Adobe Type 1 Font Format book.) */ /* Skipping over initial white space chars has been removed since it could lead to unprocessable pfb-fonts if accindentally the first cipher text byte was of the class HWHITE_SPACE. Instead, we just read ahead, this should suffice for any Type 1 font program. (RMz, 08/02/1998) */ /* If ASCII, the next 7 chars are guaranteed consecutive */ randomP[0] = getc(f); /* store first non white space char */ fread(randomP+1, 1, 3, f); /* read 3 more, for a total of 4 */ /* store first four chars */ for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */ if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */ asc = 0; break; } } if (asc) { /* ASCII form, convert first eight bytes to binary */ fread(randomP+4, 1, 4, f); /* Need four more */ for (i=0,p=randomP; i<4; i++) { /* Convert */ H = HighHexP[*p++]; randomP[i] = H | LowHexP[*p++]; } } /* Adjust our key */ for (i=0,p=randomP; i<4; i++) { r = (*p++ + r) * c1 + c2; } /* Decrypt the remaining buffered bytes */ f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); Decrypt = 1; #ifdef DEBUG_DECRYPTION printf("T1eexec(2): first 120 bytes=%.120s, b_cnt=%d\n", f->b_ptr, f->b_cnt); #endif return (feof(f))?NULL:f; } /* end eexec */ /* -------------------------------------------------------------- */ STATIC int T1Decrypt(p, len) unsigned char *p; int len; { int n; int H=0, L=0; unsigned char *inp = p; unsigned char *tblP; #ifdef DEBUG_DECRYPTION printf("T1_Decrypt(): called with len=%d\n",len); #endif if (asc) { if (haveextrach) { H = extrach; tblP = LowHexP; } else tblP = HighHexP; for (n=0; len>0; len--) { L = tblP[*inp++]; #ifdef DEBUG_DECRYPTION printf("L=0x%X, %d, inp=%c (%d)\n", L,L, *(inp-1), *(inp-1)); #endif if (L == HWHITE_SPACE) { #ifdef DEBUG_DECRYPTION printf("continue\n"); #endif continue; } if (L > LAST_HDIGIT) { #ifdef DEBUG_DECRYPTION printf("L=0x%X, --> break\n", L); #endif break; } if (tblP == HighHexP) { /* Got first hexit value */ H = L; tblP = LowHexP; } else { /* Got second hexit value; compute value and store it */ n++; tblP = HighHexP; H |= L; /* H is an int, 0 <= H <= 255, so all of this will work */ *p++ = H ^ (r >> 8); r = (H + r) * c1 + c2; } } if (tblP != HighHexP) { /* We had an odd number of hexits */ extrach = H; haveextrach = 1; } else haveextrach = 0; #ifdef DEBUG_DECRYPTION printf("T1_Decrypt(): Decrypted %d bytes\n",n); #endif return n; } else { for (n = len; n>0; n--) { H = *inp++; *p++ = H ^ (r >> 8); r = (H + r) * c1 + c2; } return len; } } /* end Decrypt */ /* -------------------------------------------------------------- */ /* This function has been adapted to support pfb-files with multiple data segments */ STATIC int T1Fill(f) /* Refill stream buffer */ F_FILE *f; /* Stream descriptor */ { int rc,i; static unsigned char hdr_buf[6]; if (starthex80){ /* we have a pfb-file -> be aware of pfb-blocks */ if ( pfbblocklen-accu >= F_BUFSIZ){ /* fill the buffer */ rc = read(f->fd, f->b_base, F_BUFSIZ); bytecnt+=rc; accu +=rc; } else{ if (pfbblocklen-accu>0){ /* read the remaining of the pfb-block ... */ rc = read(f->fd, f->b_base, pfbblocklen-accu); bytecnt +=rc; accu +=rc; /* ... and examine the next header */ i=read(f->fd, hdr_buf, 6); bytecnt +=i; pfbblocklen=0; pfbblocklen += hdr_buf[2]&0xFF ; pfbblocklen += (hdr_buf[3] & 0xFF) <<8; pfbblocklen += (hdr_buf[4] & 0xFF) <<16; pfbblocklen += (hdr_buf[5] & 0xFF) <<24; #ifdef DEBUG_PFB_BLOCKS printf("t1io: New segment, length=%d, type=%d\n", pfbblocklen, hdr_buf[1]); #endif accu=0; } else{ /* We are at the beginning of a new block -> examine header */ i=read(f->fd, hdr_buf, 6); pfbblocklen=0; pfbblocklen += hdr_buf[2]&0xFF ; pfbblocklen += (hdr_buf[3] & 0xFF) <<8; pfbblocklen += (hdr_buf[4] & 0xFF) <<16; pfbblocklen += (hdr_buf[5] & 0xFF) <<24; #ifdef DEBUG_PFB_BLOCKS printf("t1io: New segment, length=%d, type=%d\n", pfbblocklen, hdr_buf[1]); #endif accu=0; /* header read, now fill the buffer */ if (pfbblocklen-accu >= F_BUFSIZ){ rc = read(f->fd, f->b_base, F_BUFSIZ); accu +=rc; } else{ /* we have the unusual case that the pfb-block size is shorter than F_BUFSIZ -> Read this block only */ rc = read(f->fd, f->b_base, pfbblocklen); accu +=rc; } } } } else{ /* We have a pfa-file -> read straight ahead and fill buffer */ rc = read(f->fd, f->b_base, F_BUFSIZ); } /* propagate any error or eof to current file */ if (rc <= 0) { if (rc == 0) /* means EOF */ f->flags |= FIOEOF; else { f->error = (short)-rc; f->flags |= FIOERROR; rc = 0; } } f->b_ptr = f->b_base; #ifdef DEBUG_DECRYPTION printf("T1_Fill(): read %d bytes\n", rc); #endif if (Decrypt){ rc = T1Decrypt(f->b_base, rc); #ifdef DEBUG_DECRYPTION printf("T1_Fill(): decrypted %d bytes\n", rc); #endif } return rc; } /* end Fill */ void T1io_reset(void) { pfbblocklen=0; accu=0; starthex80=0; eexec_startOK=0; eexec_endOK=0; in_eexec=0; } grace-5.1.23/T1lib/type1/README0000644000076500001440000000235006626627165015345 0ustar fnevgenyusersThis directory contains a rasterizer for "Type 1" (PostScript) format outline fonts. It was donated by IBM for the R5 contrib tape and has been maintained since then by the MIT X Consortium. This version is compatible with X11R5 public patch 13. To be used, this rasterizer must be bound into the X server and the font server. It is most convenient to do this if this directory is moved into the 'mit' directory tree (i.e., mit/font/lib/font/Type1, a peer of the 'Speedo' directory). Of course, mit/font/lib/font/Imakefile must be made aware of its new subdirectory and the objects in it. In any case, you must ensure that the library mit/font/lib/font/libfont.a contains this code. In addition, the rasterizer must be "registered" with X. The source in mit/fonts/lib/font/fontfile/renderers.c, specifically the routine FontFileRegisterFontFileFunctions(), must be modified to add the line: Type1RegisterFontFileFunctions(); after the call to "SpeedoRegisterFontFileFunctions". Some Type 1 fonts have been donated; see, for example, the directory contrib/fonts/scaled/Type1. In order to use them, they must be in the font path, either by combining them in some existing font object directory, or adding a new font directory to the path. grace-5.1.23/T1lib/type1/t1hdigit.h0000644000076500001440000000344606626627166016363 0ustar fnevgenyusers/* $XConsortium: t1hdigit.h,v 1.2 91/10/10 11:19:31 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* Indicators for special characters in the p_hdigit.h tables */ #define HERROR (0xfe) #define HWHITE_SPACE (0xfd) #define HRIGHT_ANGLE (0xfc) #define LAST_HDIGIT (0xf0) /* Declarations for the tables */ #define HighHexP (HighHex+1) extern unsigned char HighHex[]; #define LowHexP (LowHex+1) extern unsigned char LowHex[]; grace-5.1.23/T1lib/type1/fontstruct.h0000644000076500001440000001677006765275311017060 0ustar fnevgenyusers/* $Header: /home/fnevgeny/cvsroot/grace/T1lib/type1/fontstruct.h,v 1.3 1999/09/07 20:51:21 fnevgeny Exp $ */ /*********************************************************** Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, and the Massachusetts Institute of Technology, Cambridge, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. @(#)fontstruct.h 3.2 91/04/15 ******************************************************************/ #ifndef FONTSTR_H #define FONTSTR_H #ifdef XSERVER #include #else #include "Xstuff.h" #endif #include "font.h" /* * This version of the server font data strucutre is only for describing * the in memory data structure. The file structure is not necessarily a * copy of this. That is up to the compiler and the OS layer font loading * machinery. */ #define GLYPHPADOPTIONS 4 /* 1, 2, 4, or 8 */ typedef enum { Linear8Bit, TwoD8Bit, Linear16Bit, TwoD16Bit } FontEncoding; typedef struct _FontProp { long name; long value; /* assumes ATOM is not larger than INT32 */ } FontPropRec; typedef struct _FontResolution { unsigned short x_resolution; unsigned short y_resolution; unsigned short point_size; } FontResolutionRec; typedef struct _ExtentInfo { DrawDirection drawDirection; int fontAscent; int fontDescent; int overallAscent; int overallDescent; int overallWidth; int overallLeft; int overallRight; } ExtentInfoRec; typedef struct _CharInfo { xCharInfo metrics; /* info preformatted for Queries */ char *bits; /* pointer to glyph image */ } CharInfoRec; /* * Font is created at font load time. It is specific to a single encoding. * e.g. not all of the glyphs in a font may be part of a single encoding. */ typedef struct _FontInfo { unsigned short firstCol; unsigned short lastCol; unsigned short firstRow; unsigned short lastRow; unsigned short defaultCh; unsigned int noOverlap:1; unsigned int terminalFont:1; unsigned int constantMetrics:1; unsigned int constantWidth:1; unsigned int inkInside:1; unsigned int inkMetrics:1; unsigned int allExist:1; unsigned int drawDirection:2; unsigned int cachable:1; unsigned int anamorphic:1; short maxOverlap; short pad; xCharInfo maxbounds; xCharInfo minbounds; xCharInfo ink_maxbounds; xCharInfo ink_minbounds; short fontAscent; short fontDescent; int nprops; FontPropPtr props; char *isStringProp; } FontInfoRec; typedef struct _Font { int refcnt; FontInfoRec info; char bit; char byte; char glyph; char scan; fsBitmapFormat format; int (*get_glyphs) ( /* font, count, chars, encoding, count, glyphs */ ); int (*get_metrics) ( /* font, count, chars, encoding, count, glyphs */ ); int (*get_bitmaps) (/* client, font, flags, ranges, nranges, nextents, extents */ ); int (*get_extents) (/* client, font, format, flags, ranges, nranges, nglyphs, offsets, glyphs */ ); void (*unload_font) ( /* font */ ); FontPathElementPtr fpe; pointer svrPrivate; pointer fontPrivate; pointer fpePrivate; int maxPrivate; pointer *devPrivates; } FontRec; extern Bool _FontSetNewPrivate (/* pFont, n, ptr */); extern int AllocateFontPrivateIndex (); #define FontGetPrivate(pFont,n) ((n) > (pFont)->maxPrivate ? (pointer) 0 : \ (pFont)->devPrivates[n]) #define FontSetPrivate(pFont,n,ptr) ((n) > (pFont)->maxPrivate ? \ _FontSetNewPrivate (pFont, n, ptr) : \ ((((pFont)->devPrivates[n] = (ptr)) != 0) || TRUE)) typedef struct _FontNames { int nnames; int size; int *length; char **names; } FontNamesRec; /* External view of font paths */ typedef struct _FontPathElement { int name_length; char *name; int type; int refcount; pointer private; } FontPathElementRec; typedef struct _FPEFunctions { int (*name_check) ( /* name */ ); int (*init_fpe) ( /* fpe */ ); int (*reset_fpe) ( /* fpe */ ); int (*free_fpe) ( /* fpe */ ); int (*open_font) ( /* client, fpe, flags, name, namelen, format, fid, ppfont, alias */ ); int (*close_font) ( /* pfont */ ); int (*list_fonts) ( /* client, fpe, pattern, patlen, maxnames, paths */ ); int (*start_list_fonts_with_info) ( /* client, fpe, name, namelen, maxnames, data */ ); int (*list_next_font_with_info) ( /* client, fpe, name, namelen, info, num, data */ ); int (*wakeup_fpe) ( /* fpe, mask */ ); int (*client_died) ( /* client, fpe */ ); } FPEFunctionsRec, FPEFunctions; extern int InitFPETypes(); /* * Various macros for computing values based on contents of * the above structures */ #define GLYPHWIDTHPIXELS(pci) \ ((pci)->metrics.rightSideBearing - (pci)->metrics.leftSideBearing) #define GLYPHHEIGHTPIXELS(pci) \ ((pci)->metrics.ascent + (pci)->metrics.descent) #define GLYPHWIDTHBYTES(pci) (((GLYPHWIDTHPIXELS(pci))+7) >> 3) #define GLYPHWIDTHPADDED(bc) (((bc)+7) & ~0x7) #define BYTES_PER_ROW(bits, nbytes) \ ((nbytes) == 1 ? (((bits)+7)>>3) /* pad to 1 byte */ \ :(nbytes) == 2 ? ((((bits)+15)>>3)&~1) /* pad to 2 bytes */ \ :(nbytes) == 4 ? ((((bits)+31)>>3)&~3) /* pad to 4 bytes */ \ :(nbytes) == 8 ? ((((bits)+63)>>3)&~7) /* pad to 8 bytes */ \ : 0) #define BYTES_FOR_GLYPH(ci,pad) (GLYPHHEIGHTPIXELS(ci) * \ BYTES_PER_ROW(GLYPHWIDTHPIXELS(ci),pad)) /* * Macros for computing different bounding boxes for fonts; from * the font protocol */ #define FONT_MAX_ASCENT(pi) ((pi)->fontAscent > (pi)->ink_maxbounds.ascent ? \ (pi)->fontAscent : (pi)->ink_maxbounds.ascent) #define FONT_MAX_DESCENT(pi) ((pi)->fontDescent > (pi)->ink_maxbounds.descent ? \ (pi)->fontDescent : (pi)->ink_maxbounds.descent) #define FONT_MAX_HEIGHT(pi) (FONT_MAX_ASCENT(pi) + FONT_MAX_DESCENT(pi)) #define FONT_MIN_LEFT(pi) ((pi)->ink_minbounds.leftSideBearing < 0 ? \ (pi)->ink_minbounds.leftSideBearing : 0) #define FONT_MAX_RIGHT(pi) ((pi)->ink_maxbounds.rightSideBearing > \ (pi)->ink_maxbounds.characterWidth ? \ (pi)->ink_maxbounds.rightSideBearing : \ (pi)->ink_maxbounds.characterWidth) #define FONT_MAX_WIDTH(pi) (FONT_MAX_RIGHT(pi) - FONT_MIN_LEFT(pi)) #endif /* FONTSTR_H */ grace-5.1.23/T1lib/type1/paths.h0000644000076500001440000002305706626627166015765 0ustar fnevgenyusers/* $XConsortium: paths.h,v 1.2 91/10/10 11:18:50 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #include "types.h" #define Loc(S,x,y) t1_Loc(S,(DOUBLE)x,(DOUBLE)y) #define ILoc(S,x,y) t1_ILoc(S,x,y) #define Line(P) t1_Line(P) #define Join(p1,p2) t1_Join(p1,p2) #define ClosePath(p) t1_ClosePath(p,0) #define CloseLastSubPath(p) t1_ClosePath(p,1) #define Conic(B,C,s) t1_Conic(B,C,(DOUBLE)s) #define RoundConic(M,C,r) t1_RoundConic(M,C,(DOUBLE)r) #define ArcP3(S,P2,P3) t1_ArcP3(S,P2,P3) #define ArcCA(S,C,d) t1_ArcCA(S,C,(DOUBLE)d) #define Bezier(B,C,D) t1_Bezier(B,C,D) #define Hint(S,r,w,o,h,a,d,l) t1_Hint(S,r,w,o,h,a,d,l) #define Reverse(p) t1_Reverse(p) #define ReverseSubPaths(p) t1_ReverseSubPaths(p) #define AddLoc(p1,p2) t1_Join(p1,p2) #define SubLoc(p1,p2) t1_SubLoc(p1,p2) #define DropSegment(p) t1_DropSegment(p) #define HeadSegment(p) t1_HeadSegment(p) #define QueryLoc(P,S,x,y) t1_QueryLoc(P,S,x,y) #define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r) #define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2) struct segment *t1_Loc(); /* create a location object (or "move" segment) */ struct segment *t1_ILoc(); /* integer argument version of same */ struct segment *t1_Line(); /* straight line path segment */ struct segment *t1_Join(); /* join two paths or regions together */ struct segment *t1_ClosePath(); /* close a path or path set */ struct conicsegment *t1_Conic(); /* conic curve path segment */ struct conicsegment *t1_RoundConic(); /* ditto, specified another way */ struct conicsegment *t1_ArcP3(); /* circular path segment with three points */ struct conicsegment *t1_ArcCA(); /* ditto, with center point and angle */ struct beziersegment *t1_Bezier(); /* Bezier third order curve path segment */ struct hintsegment *t1_Hint(); /* produce a font 'hint' path segment */ struct segment *t1_Reverse(); /* reverse the complete order of paths */ struct segment *t1_ReverseSubPaths(); /* reverse only sub-paths; moves unchanged */ struct segment *t1_SubLoc(); /* subtract two location objects */ struct segment *t1_DropSegment(); /* Drop the first segment in a path */ struct segment *t1_HeadSegment(); /* return the first segment in a path */ void t1_QueryLoc(); /* Query location; return its (x,y) */ void t1_QueryPath(); /* Query segment at head of a path */ void t1_QueryBounds(); /* Query the bounding box of a path */ /*END SHARED*/ /*SHARED*/ #define CopyPath(p) t1_CopyPath(p) #define KillPath(p) t1_KillPath(p) #define PathTransform(p,m) t1_PathXform(p,m) #define PathDelta(p,pt) t1_PathDelta(p,pt) #define BoundingBox(h,w) t1_BoundingBox(h,w) #define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y) #define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) #define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) #define BoxPath(S,h,w) t1_BoxPath(S,h,w) struct segment *t1_CopyPath(); /* duplicate a path */ void t1_KillPath(); /* destroy a path */ struct segment *t1_PathXform(); /* transform a path arbitrarily */ void t1_PathDelta(); /* calculate the ending point of a path */ struct segment *t1_PathSegment(); /* produce a MOVE or LINE segment */ struct segment *t1_JoinSegment(); /* join a MOVE or LINE segment to a path */ DOUBLE t1_Hypoteneuse(); /* returns the length of a line */ struct segment *t1_BoxPath(); /* returns a rectangular path */ /*END SHARED*/ /*SHARED*/ #define ConsumePath(p) MAKECONSUME(p,KillPath(p)) #define UniquePath(p) MAKEUNIQUE(p,CopyPath(p)) /*END SHARED*/ /*SHARED*/ struct segment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ unsigned char size; /* size of the structure */ unsigned char context; /* index to device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* relative ending location of path segment */ } ; #define ISCLOSED(flag) ((flag)&0x80) /* subpath is closed */ #define LASTCLOSED(flag) ((flag)&0x40) /* last segment in closed subpath */ /* NOTE: The ISCLOSED flag is set on the MOVETYPE segment before the subpath proper; the LASTCLOSED flag is set on the last segment (LINETYPE) in the subpath We define the ISPATHANCHOR predicate to test that a path handle passed by the user is valid: */ #define ISPATHANCHOR(p) (ISPATHTYPE(p->type)&&p->last!=NULL) /* For performance reasons, a user's "location" object is identical to a path whose only segment is a move segment. We define a predicate to test for this case. See also :hdref refid=location.. */ #define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL) /*END SHARED*/ /*SHARED*/ struct conicsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = CONICTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* Ending point (C point) */ struct fractpoint M; /* "midpoint" of conic explained above */ float roundness; /* explained above */ } ; /*END SHARED*/ /*SHARED*/ struct beziersegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = BEZIERTYPE */ unsigned char size; /* as with any 'segment' type */ unsigned char context; /* as with any 'segment' type */ struct segment *link; /* as with any 'segment' type */ struct segment *last; /* as with any 'segment' type */ struct fractpoint dest; /* ending point (D) */ struct fractpoint B; /* control point B */ struct fractpoint C; /* control point C */ } ; /*END SHARED*/ /*SHARED*/ struct hintsegment { XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ /* type = HINTTYPE */ unsigned char size; /* size of the structure */ unsigned char context; /* device context */ struct segment *link; /* pointer to next structure in linked list */ struct segment *last; /* pointer to last structure in list */ struct fractpoint dest; /* ALWAYS 0,0 */ struct fractpoint ref; struct fractpoint width; char orientation; char hinttype; char adjusttype; char direction; int label; } ; /*END SHARED*/ /*SHARED*/ /* CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro is also used by the STROKES module.) */ #define CONCAT(p1, p2) { \ p1->last->link = p2; /* link p2 on end of p1 */ \ p1->last = p2->last; /* last of new is last of p2 */ \ p2->last = NULL; } /* only first segment has non-NULL "last" */ /*END SHARED*/ grace-5.1.23/T1lib/type1/CHANGES0000644000076500001440000000723406626627165015466 0ustar fnevgenyusersThis are the sources as I have found them on the X11R5 distribution. In order to use them for my purpose (ps2pk: conversion tool for Type1 fonts to packed TeX fonts) a number of changes were needed (see Changelog). --Piet internet: rcpt@urc.tue.nl | Piet Tutelaers bitnet: rcpt@heitue5.BITNET | Computer Center Room RC 1.90 phone: +31 (0)40 474541 | Eindhoven University of Technology fax: +31 (0)40 434438 | P.O. Box 513, 5600 MB Eindhoven, NL Changelog (the main-line): -------------------------- 92-02: Start of ps2pk project - decoupling Type1 library from X11 (changes in t1intf.h + t1funcs.h; added Xstuff.h to replace X header files) - user definable encoding schemes (removed hardwired ISOLatin1 and Symbol encodings from t1funcs.c and replaced by encoding paramater in Type1OpenScalable) 92-03: First release 1.0 (pre-release) 92-04: - added expansion and slanting features as suggested by Lee Hetherington (changes in spaces.c, t1funcs.c) - changed t1test.c in order to test above features; added ISOLatin1 encoding vector. - README2 replaced by CHANGES (this file) - MSDOS concession (thanks to Sebastian Rahtz): renamed fontfilest.h to ffilest.h so it does not clash with fontfile.h (affects: fontfilest.h (->ffilest.h), t1funcs.c, t1info.c and t1test.c). - MSDOS concession: all file extensions .c.orig and .h.orig renamed to .crg respectivally .hrg - patch to handle /negationslash and /mapsto from LucidaMath-Symbol correctly in t1funcs.c (ILH: Lee Hetherington). 92-05: AMIGA/Aztec: - added type1.ami (contains order of objects in library) - added Makefile.ami - added bstring.c (contains a bzero()) 92-05: - fixed a reference to a NULL pointer in t1info.c - more verbose error messages in type1 library (NDW: Norman Walsh) - changed memory heuristic in type1 library from static (one chunk) into dynamic (up to a maximum of 10 chunks). This was needed for big fonts like daysrib.pfa (reported by Norman Walsh). (Changes in t1funcs.c and t1malloc.c) - added Makefile.tcc for MSDOS/Turbo C, removed Makefile.dos 92-06: - added Makefile.djg for MSDOS/GCC 386 (djgpp) - fixed bug in t1io.c so MSDOS can read its own .pfb format 92-08: - fixed alligment problem for machines with wordlength other than 32 bits (patch in util.c). Reported by J"urgen Marenda for DataGeneral AViiON (Motorola M88k machine) - The type1 library did not render Oblique fonts correctly. Erik Schenk provided a patch for this problem (patches in fontfcn.c and t1util.c). - Official X11.5 patches (Stephen Gildea 920728) merged in the type1 library version of ps2pk. These patches were available on: export.lcs.mit.edu:/pub/R5/contrib-fixes/Type1.patch - portability: index() in t1info.c replaced by strchr() 94-01: Version 1.4 (bug fix release) - types.h: added basic type definitions for non 32-bit platforms - fontfcn.c: made `virtual memory' management dynamically (reported by Norman Walsh, needed for complicated fonts) - Makefile.*: improved - original X11R5 sources no longer included (see X11R5 sources if you want to see them) - t1malloc.c removed, not longer needed. 95-11 Version 1.5 - Makefile.bcc, Makefile.djg and Makefile.wat removed in favour of Makefile.unx and Makefile.emx - bzero() dropped in favour of ANSI C's memset() - Improved cooperation between the master makefile and its depending makefiles (thanks ) grace-5.1.23/T1lib/type1/token.h0000644000076500001440000000571706626627166015771 0ustar fnevgenyusers/* $XConsortium: token.h,v 1.2 91/10/10 11:19:58 rws Exp $ */ /* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifndef TOKEN_H #define TOKEN_H /* Special characters */ #define CONTROL_C (3) /* Token type codes */ #define TOKEN_INVALID (-3) #define TOKEN_BREAK (-2) #define TOKEN_EOF (-1) #define TOKEN_NONE (0) #define TOKEN_LEFT_PAREN (1) #define TOKEN_RIGHT_PAREN (2) #define TOKEN_LEFT_ANGLE (3) #define TOKEN_RIGHT_ANGLE (4) #define TOKEN_LEFT_BRACE (5) #define TOKEN_RIGHT_BRACE (6) #define TOKEN_LEFT_BRACKET (7) #define TOKEN_RIGHT_BRACKET (8) #define TOKEN_NAME (9) #define TOKEN_LITERAL_NAME (10) #define TOKEN_INTEGER (11) #define TOKEN_REAL (12) #define TOKEN_RADIX_NUMBER (13) #define TOKEN_HEX_STRING (14) #define TOKEN_STRING (15) #define TOKEN_IMMED_NAME (16) /* Token routines */ extern void scan_token(); /* * ------------------------------------------------------------------------- * Globals shared -- (everyone else KEEP YOUR MITTS OFF THEM!) * ------------------------------------------------------------------------- */ /* These variables are set by the caller */ extern char *tokenStartP; /* Pointer to token buffer in VM */ extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */ /* These variables are set by P_TOKEN */ extern int tokenLength; /* Characters in token */ extern boolean tokenTooLong; /* Token too long for space available */ extern int tokenType; /* Type of token identified */ extern psvalue tokenValue; /* Token value */ #endif /* TOKEN_H */ grace-5.1.23/T1lib/type1/curves.h0000644000076500001440000000404206626627165016145 0ustar fnevgenyusers/* $XConsortium: curves.h,v 1.2 91/10/10 11:17:59 rws Exp $ */ /* Copyright International Business Machines, Corp. 1991 * All Rights Reserved * Copyright Lexmark International, Inc. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of IBM or Lexmark not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL * IBM OR LEXMARK BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ /*SHARED*/ #define StepConic(R,xA,yA,xB,yB,xC,yC,r) t1_StepConic(R,xA,yA,xB,yB,xC,yC,r) #define StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) t1_StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) #define FlattenConic(xM,yM,xC,yC,r) t1_StepConic(NULL,(fractpel)0,(fractpel)0,xM,yM,xC,yC,r) #define FlattenBezier(xB,yB,xC,yC,xD,yD) t1_StepBezier(NULL,(fractpel)0,(fractpel)0,xB,yB,xC,yC,xD,yD) struct segment *t1_StepConic(); struct segment *t1_StepBezier(); /*END SHARED*/ grace-5.1.23/T1lib/type1/Xstuff.h0000644000076500001440000000133206626627165016114 0ustar fnevgenyusers#ifndef NULL #define NULL 0 #endif #ifndef XMD_H #define XMD_H 1 #include "types.h" /* * Bitfield suffixes for the protocol structure elements, if you * need them. Note that bitfields are not guarranteed to be signed * (or even unsigned) according to ANSI C. */ #ifdef WORD64 #define B32 :32 #define B16 :16 #else #define B32 #define B16 #endif typedef struct { SHORT leftSideBearing B16, rightSideBearing B16, characterWidth B16, ascent B16, descent B16; USHORT attributes; } xCharInfo; #endif /* XMD_H */ #ifndef _FS_PROTO_H_ #define _FS_PROTO_H_ typedef struct { USHORT x_resolution B16; USHORT y_resolution B16; USHORT point_size B16; } fsResolution; #endif /* _FS_PROTO_H_ */ grace-5.1.23/T1lib/type1/bstring.c0000644000076500001440000000023506626627165016301 0ustar fnevgenyusers/* * A simple memset() in case your ANSI C does not provide it */ memset(void *s, int c, int length) { char *p = s; while (length--) *(p++) = c; } grace-5.1.23/T1lib/README0000644000076500001440000000034007332570545014272 0ustar fnevgenyusers The code in this directory is the T1lib library specially packaged (docs and examples omitted etc) for use with Grace. For the original package, see http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib.html. grace-5.1.23/T1lib/LGPL0000644000076500001440000006127306626627165014115 0ustar fnevgenyusers GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library 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 library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! grace-5.1.23/CHANGES0000644000076500001440000020441212032153130013414 0ustar fnevgenyusers Grace list of changes 5.1.23 Bug fixes * [ES] removed *86 specific optimizations (rep. #2154) * [ES] renamed RMS per cent error -> relative error (rep. #2192) * [ES] a workaround for a bug in recent Xorg not releasing grab of popup menus * [ES] accept -graphtype chart instead of bar. List possible values in the help output * [TK] fix building against png-1.5 * [SM] a grace_np fix * [ES] IsoLatin5.enc was not included in the distribution 5.1.22 Interface * [DC] mention object type when asking for user's confirmation on delete Parser * [ES] added "LINCONV(set1, set2)" command - an equivalent of Transformations->Linear convolution * [ES] added "VOIGT(gamma, sigma, x)" function (rep. #2144) Bug fixes * [ES] in the grace_np library GraceClose() could kill all user processes if by that time the Grace subprocess has exited (rep. #2035) * [ES] certain hand-modified settings in project files might cause the GUI crash (incl. rep. #2139) * [ES] ungraceful closing of anonymous pipes could result in high CPU load 5.1.21 Functionality * [ES] added IsoLatin5 (ISO 8859-9) encoding file * [ES] now honor locale in number stringifications (rep. #2109) * [ES] extended range of prefixes in the Engineering format up to 10^{+/-24} * [HR] added "Computing" tick label format Interface * [ES] added "-maxpath" command line option for setting maximal drawing path length * [ES] allow for longer legend lines Parser * [ES] added "KILL BLOCK" command (deallocates the memory of the current block data) Bug fixes * [ES] there was a misleading error message when attempting to redefine an existing variable/keyword in the parser * [ES] fixed rounding-off problem with zero labels (rep. #2098) Portability/Compilation * [IG] eliminated some of gcc-4.1 warnings (rep. #2111) * [IG] man page cleaned (rep. #2110) 5.1.20 Parser * [ES] added SGN() function Defaults * [ES] changed default major tick spacings to 0.2 Bug fixes * [ES] command argument "-graphtype pie" wasn't recognized (rep. #2058) * [ES] fixed openning of help documents when using an external browser * [ES] "Geometric transforms" with order: "Rotate, scale, translate" in fact was doing "Translate, scale, rotate" * [ES] Grace might crash when using "Engineering" tick label format (rep. #2094) * [ES] file selection dialog wasn't closed when fit parameters file was read in successfully 5.1.19 Functionality * [ES] BARDY and BARDYDY sets are now allowed in XY graphs Bug fixes * [RL] loading a DL module could fail with an irrelevant error message (rep. #2071) * [ES] a bug in the PS driver caused CUPS to output empty page if printing accounting was enabled in foomatic (rep. #2047) * [ES] automatic data point purging (enabled when set length exceeds "Max drawing path length" in Edit/Preferences) could fail silently (rep. #2069) * [ES] the point purging could result in wrong set filling when fill to the baseline was selected * [ES] configure's option --with-helpviewer was broken (rep. #1414) 5.1.18 Parser * [ES] implemented concatenation of quoted strings and numerical expressions Bug fixes * [ES] some X font configurations could make Grace crash (rep. #1436) * [ES] DEFAULT ... commands had no effect on new drawing objects (including rep. #1437) * [ES] DEFAULT CHAR SIZE had no effect on tick labels of new axes 5.1.17 Drivers * [ES] changed default resolution of the PDF driver to 300 dpi Documentation/Info * [ES] minor documentation updates, including rep. #1421 Bug fixes * [ES] with page fill disabled, the page frame line might be drawn with wrong properties * [ES] due to a bug in the Xbae widget, when a TrueType font was used, several dialogs could become unusable (including rep. #1366) * [ES] enabling patterned fills and PDF-1.4 compatibility mode could result in crash when printing to PDF 5.1.16 Interface * [ES] set scrolling of the custom ticks/labels table to 1 row per click (rep. #1419) Documentation/Info * [ES] updates relevant to the status of mailing lists/forums Portability/Compilation * [ES] PDF driver updated to work with PDFlib-6 (rep. #1426). Minimal supported version is now 5.0 Drivers * [ES] added option to generate PDF-1.4 format (Acrobat5). Support for PDF-1.2 (Acrobat3) removed Bug fixes * [ES] replaced meaningless error message issued when trying to load data with a few string columns as a single set * [ES] in the spreadsheet editor, the last entered cell's data wasn't committed (rep. #1420) 5.1.15 Functionality * [ES] increased max number of custom tick marks/labels to 256 per a popular demand Project files * [ES] now using one-line format for saving graph's world and viewport settings Defaults * [ES] changed default external help viewer to mozilla Documentation/Info * [ES] misc documentation updates (including rep. #1411) Bug fixes * [ES] fixed crash when number of custom tick marks/labels exceeded 100 * [ES] fixed evaluation of FWHM in "Feature extraction" (old version might produce wrong results for multi-peak data) * [ES] support for loadable functions of 4 and 5 parameters, introduced in 5.1.14, was incomplete * [ES] in correlation/covariance, only the absolute value at 0 is normalized to 1, so for anti-correlation the sign is preserved 5.1.14 Interface * [ES] use multiplication sign in formulae of regression report (rep. #1360) Parser * [ES] allow for DL modules to define functions of 4 and 5 parameters (rep. #1343) Portability/Compilation * [ES] fixed compilation under FreeBSD-5.1 and OS/X (rep. #1371) Bug fixes * [ES] on 64-bit platforms, when specific compiler/optimization combinations were used, some dialogs could crash randomly (e.g. rep. #1310) * [ES] on 64-bit platforms, when specific compiler/optimization combinations were used, X run-time warnings could be issued about unrecognized XKeySym's * [ES] set filling defaulted to even-odd filling rule in the X11 driver (rep. #1368) * [ES] fixed potential memory corruption * [ES] fixed page size sync in the free mode * [TO] fixed a race condition in the grace_np library 5.1.13 Functionality * [ES] enabled annotated values for HILO sets Parser * [ES] added IMIN(x) and IMAX(x) functions returning index of minimal or maximal value of array x (thusly providing a way to solve reps. #1340 and #1344) Portability/Compilation * [ES] updates for T1lib-5.0 API (rep. #1303) Documentation/Info * [WB] documented commands for calculating running properties Drivers * [MD] enabled font kerning in the MIF driver Bug fixes * [ES] Grace might fail starting in the GUI mode when a certain sequence of command line arguments was passed 5.1.12 Functionality * [MO] implemented zooming and scrolling of log plots Parser * [ES] added INT(x,y) evaluating integral value of y dx * [ES] added RSUM(vexpr) - running sum Bug fixes * [ES] fixed memory corruption when reading in block data (rep. #1258). The bug was introduced in 5.1.11 * [ES] fixed a couple of tiny memory leaks associated with loading block data * [ES] fixed crash in histogram and interpolation dialogs with multiple sets selected (rep. #1259) * [TO] signal issues with the grace_np library fixed (rep. #1270) * [ES] implied references to current graph in parser might crash Grace if the graph didn't exist (including reps. #886 and #1267) * [ES] removed extraneous accent glyphs in the 0x9? range of IsoLatin1 and IsoLatin2 encodings (including rep. #1269) * [MO] IsoLatin7 encoding file wasn't installed by "make install" * [ES] entering negative values of set symbol skip could crash Grace (rep. #1276) 5.1.11 Functionality * [ES] hotlinks now work for all set types (rep. #572) * [ES] updating hot-linked sets now works for all graphs, not the current one only * [YZ] added encoding files for Russian codepages koi8-r and cp1251 and for Ukrainian codepage koi8-u Interface * [ES] use "+"/"-" instead of "shown"/"hidden" in the graph selectors Parser * [ES] added UPDATEALL command, equivalent of "View/Update all" Drivers * [ES] set resolution in the PNG output (rep. #1225) Portability/Compilation * [ES] updated auto* stuff to work with autoconf-2.5.* (rep. #1199) Bug fixes * [SR] precision used for special tick locations was insufficient (rep. #1228) * [ES] referring to "S_" in the parser with no sets in the current project crashed the app * [ES] GraceIsOpen() from the grace_np library returned true after the Grace process exited (rep. #922) * [ES] excluded .cvsignore files from source tarballs (rep. #1248) * [ES] a minor memory leak fixed (40 bytes per set import/reading in) * [ES] configure --with=f77=/absolute/path/to/f77 was broken (rep. #1243) * [ES] in XY charts, explicitly check that abscissas of all sets are the same 5.1.10 Functionality * [MO] added IsoLatin7 encoding file Interface * [ES] disable showing hidden files in file selection dialogs by default and added a checkbox to alter this behaviour (Motif-2.* only) * [ES] in the spreadsheet dataset editor, set text insertion position corresponding to the mouse click location Defaults * [ES] changed default data format to %.8g (rep. #985) Bug fixes * [ES] the default GRACE_HELPVIEWER command was incompatible with Mozilla (rep. #1198) * [ES] fonts with long names (> 27 chars) could crash Grace (rep. #1200) * [ES] font antialiasing was broken for projects with more than 16 default colors defined * [ES] fonttool might crash on fonts with an invalid FontBBox entry (rep. #1202) * [ES] some font glyphs might not fit in the fonttool matrix cells, especially on low-resolution displays * [ES] canvas wasn't refreshed after a region started to be re-defined (rep. #1211) * [ES] provided workaround for a PDFlib bug, resulting, in rare cases, in wrong colorspace settings in the PDF output (rep. #1209) 5.1.9 Drivers * [MD] implemented patterned fills in the SVG driver * [MD] better font name definitions in the SVG driver * [MD] updated SVG DTD reference Compilation * [PB] installed binary of convcal now gets stripped * [PB] "make install links" now works * [PB] DESTDIR introduced for building binary packages (e.g. "make DESTDIR=/tmp install links") Bug fixes * [SR] -(no)safe flags were missed in the -help output * [ES] some standard Xt flags (-geometry etc) were ignored (the bug was introduced in 5.1.8) * [MD] patterned fills were transparent in the PDF output * [MD] font family might be set inconsistently in the MIF driver * [ES] xmgrace was run in the safe mode when invoked from GraceOpen() via the grace_np interface (rep. #1179) * [ES] fixed 1/n error in calculation of correlation coefficient in the non-linear fit (the value was used for information purposes only). The bug was introduced in 5.1.5 * [ES] redrawing canvas in the free mode might in some cases result in modified graph viewport values (rep. #1176) * [ES] allow trailing semicolon in the batch language (rep. #1193) * [ES] some fonts couldn't be opened when running under NT4 (rep. #1186). This was a T1lib bug, in fact * [ES] the cross-covariance was wrongly calculated (rep. #1196) 5.1.8 Security * [ES] implemented (and enabled by default) "safe" mode, in which statements of the command language which may result in file modifications are disabled. This is to prevent execution of such commands contained in potentially malicious project files acquired from untrusted sources Functionality * [ES] use leading zeros in axis year formats so to make up to 2 or 4 digits in total (depending on whether the two-digit year span is enabled in the project preferences) Interface * [ES] simplified X initialization - the resolution detection introduced in 5.1.5 prevented Grace from starting up with some buggy X servers (notably, StarNet's X-win32) (rep. #1138) * [ES] -safe/-nosafe command line options for switching the safe mode * [ES] "Run in safe mode" checkbox in "Edit/Preferences" for the same purpose * [ES] removed broken "Command" function of the hotlink popup Drivers * [MD] backported from 5.2 pattern fills in PDF driver (off by default) * [MD] better font definitions in the MIF driver Portability/Compilation * [ES] use strchr() instead of BSD-ish index() which broke compilation under newer IRIX boxes (rep. #1139) * [ES] stop with error (instead of warning as used to be) if Motif can't be found by configure Bug fixes * [ES] background of the canvas, if page filling was disabled, might get filled in with the last object's fill props (rep. #1152) * [ES] changing HTML viewer by setting the GRACE_HELPVIEWER shell variable might result in memory corruption (rep. #1160) * [ES] canvas wasn't refreshed after feature extraction 5.1.7 Functionality * [ES] allow XYZ sets in polar graphs * [ES] allow defining string columns when creating sets from block data via the command line or parser, e.g. -bxy "1:2:{3}" (rep. #978) * [ES] honour symskip for all set types (it wasn't for BAR, BARDY, BARDYDY, XYHILO, XYR, XYVMAP, and BOXPLOT) * [ES] extended x-correlation routines to calculate x-covariance if desired * [ES] implemented optional snake-like matrix fill in graph arranging (rep. #1119) Interface * [ES] accept non-ASCII characters from nationalized keyboards Documentation/Info * [ES] added compile-time $(LDFLAGS) to the `-version' output Parser * [ES] added an extra flag to the XCOR function to switch between x-correlation/x-covariance * [ES] when accessing drawing objects by id (e.g. "WITH STRING nexpr") allocate the referenced object if necessary * [ES] added optional argument to ARRANGE command to enable snake-like graph matrix filling Drivers * [ES] set resolution of the X11 device from the X server props * [ES] detect max request size of the X server and set max drawing path length accordingly Portability/Compilation * [ES] fixed new Motif checks introduced in 5.1.6 (rep. #1107) Bug fixes * [ES] applying graph properties reset axis limits of polar graphs * [ES] simply ignore comments (lines beginning with '#') in data files instead of splitting the set (rep. #831) * [ES] honour symskip for error bars (rep. #936) * [ES] when enabling log axis scaling on the command line, set reasonable major/minor settings and world bounds (reps. #723, #1021) * [ES] under very rare circumstances, Grace might cause a (probably buggy) X window manager misbehave * [MD] make sure the EPS/PS output lines don't exceed 255 chars in lenth (rep. #1100) 5.1.6 Parser ! [ES] implemented region on set evaluation: REGNUM(selectset) * [ES] implemented applying region and logical restrictions to a set: RESTRICT(selectset, vexpr) and RESTRICT(selectset, REGNUM, onoff) ! [ES] implemented KILL REGNUM * [ES] added SUM(vexpr) * [ES] allow accessing array segments (e.g. x[4:10]) Portability/Compilation * [ES] use the bundled Xbae by default to make sure we don't come across a buggy version installed * [ES] upgraded to T1lib-1.3.1, which fixed several bugs (see below) * [ES] re-wrote Motif checks; in some rare cases, Motif libraries might be misdetected * [ES] added a "My Computer" (actually, a list of drives) file selection box chdir entry for the Cygwin port * [ES] check for FFTW library version >= 2.1.3 * [ES] fixed compilation on systems without setlocale() Bug fixes * [ES] re-loading projects with polygon regions defined might result in memory leaks and wrong region evaluations * [ES] optimize (again) updating large pulldown selectors (rep. #1082) * [ES] axis label with "Auto" placement was misplaced/absent with tick marks and labels disabled on the respective side (rep. #1086) * [ES] in the interpolation and histogram dialogs it wasn't checked that the source and destinations sets were different (rep. #1084) * [ES] when the invert x-axis flag was turned on, pie charts were wrongly reproduced in all but screen outputs (rep. #1092) * [ES] when saving project under the same name, don't warn about file overwriting (rep. #1094) * [ES] there might be problems finding fonts under non-Unix environments (rep. #1013). This was a T1lib bug, in fact * [ES] text overlining didn't work for Symbol font (rep. #1026). This was a T1lib bug, in fact * [ES] fixed calculation of x-correlation. Previously, a broken x-covariance was calculated * [ES] lines starting with spaces weren't parsed by the command interpreter (rep. #1101) 5.1.5 Functionality * [ES] honour X axis start value and invert flag in pie charts * [ES] extended maximum allowed line width to 20 Interface * [ES] automatically adjust Xresources for low-resolution (800x600) displays so all dialogs fit in the screen * [ES] allow for setting via the GUI negative gaps in bar charts (rep. #1059) * [ES] allow to select font and symbol sizes up to 1000 * [ES] make the size scale controls change by 25 and angle controls by 10 when pressing Ctrl+Left/Right arrows on them Parser * [ES] implicitly cast to boolean double arguments used as bool Documentation/Info * [JS] added man page for convcal * [ES] added examples of XYCOLOR set presentation and reciprocal axis scale, contributed by Nels Dumin * [AM] include libpng, libjpeg, and libpdf versions in the `-version' and "Help/About" outputs * [ES] documented S$ and S_ special parser set names Bug fixes * [ES] PS output might be broken for plots containing XYCOLOR sets * [ES] when Line type:left/right stairs was selected, drawing with a dashed line of multiple short steps broke the dash pattern (rep. #1024) * [PM] the argument of --with-printcmd configure switch wasn't quoted * [ES] make result file output line-buffered instead of block-buffered * [LM] date format hint was ignored in the parser * [ES] legend and viewport dialog were not updated when moving legend or resizing graph from canvas * [ES] std. dev. was calculated using n instead of n-1 in the denominator (rep. #1042) * [ES] fixed crash under some platforms with zero width world/view coordinates (rep. #1014) * [ES] optimize updating large pulldown selectors (e.g. in the "Edit block data" popup) * [ES] fixed broken AA font rendering and potential crash when the color palette size exceeded 128 (rep. #1061) 5.1.4 Bug fixes * [ES] reading in a project file right after printing to a raster file (PNG, JPEG,...) caused a crash (rep. #990) * [ES] in the "Sample points" dialog, even when the "log. expression" is selected, one had to input some values into start/step input fields anyway * [AM] ellpe(x) and ellpk(x) in fact returned ellpe(1-x) and ellpk(1-x), respectively (rep. #989) * [ES] "graphno OFF" merely makes the graph hidden instead of killing it 5.1.3 Interface * [AM/ES] set icon's title = project name (rep. #957) * [ES] when switching to log scale, set major/minor tick settings to 10/9 respectively (rep. #826) Documentation * [ES] docs updates (including reps. #926, #965) * [EV] fixed a typo in Tutorials (rep. #916) Parser * [ES] added "HELP url" and "HELP" to the parser * [LM] added "AUTOSCALE ONREAD NONE|XAXES|YAXES|XYAXES" to the parser Drivers * [MD] produce MIF files with a textflow in which the graph is included, so it can be included in another FrameMaker document * [ES] list used fonts in %%DocumentNeededResources in the PS output (rep. #956) Portability/Compilation * [AM] allow to specify print command at config time * [AM] fixed problem compiling bundled Xbae (rep. #959) Bug fixes * [ES] fixed rounding error in calculation of pulldown menu length (rep. #929) * [RL] precision of offsets in the Axes dialog were restricted to two digits (rep. #911) * [AM/ES] double click on canvas with a pie chart might cause crash * [EV] legend entries for BARDY and BARDYDY sets weren't drawn * [MD] fixed conversion table for non-ASCII codes in the MIF driver (rep. #946) * [LM] reading in data files with floats when they were explicitly signed and positive resulted in parse error * [ES] failure to save project to a file due to wrong permissions didn't produce an error message * [ES] using non-standard fonts might crash the PDF driver * [ES] specifing a file-only output device with "-hdevice" didn't actually set the output to file (rep. #899) * [ES] the "Rescale plot on page size change" option in the "File/Print setup" dialog had no effect if the selected device was X11 * [ES] fixed (actually, just now implemented) automatic axis label placement (rep. #744) * [ES] projects with sets using symbol char from the upper half of the ASCII table weren't saved correctly * [ES] line width of drawing elements wasn't accounted for in the bbox calculations, which in rare cases resulted in a wrong EPS bbox 5.1.2 Functionality * [DB] implemented baseline setting to the set (y) average Interface * [ES] don't hardcode file extensions in file selection dialogs, but define them via X resources instead (rep. #671) Documentation * [ES] HTML docs now include tables of contents Parser * [ES] added "PAGE RESIZE xdim, ydim" which sets the page dimensions of all output devices (in pp) and rescales the current plot accordingly Drivers * [ES] implemented font kerning in the (E)PS output * [ES] added option to choose document data (7bit/8bit/binary) for the PS driver Portability/Compilation * [AM] OS/2 updates Bug fixes * [ES] "-saveall" filename argument was ignored (rep. #841) * [ES] not enough arguments to "-world" or "-viewport" could cause crash * [ES] with "Auto redraw" disabled, several operations still caused an immediate redraw * [ES] backslashes in text strings weren't escaped in the (E)PS output * [AM] interpolating non-monotonic data by spline caused crash or meaningless results (rep. #866) * [ES] for some non-standard fonts and/or encodings, the (E)PS output might be binary while declared as 8bit clean * [ES] path in print setup * [ES] too wide pulldowns in "Edit block data" if block data contained too many columns * [ES] it was impossible using GUI to disable annotated values in the XYZ set type * [LM] creating sets with strings from block data might crash * [ES] fixed a floating point rounding bug in the polygon clipping which (in rare cases under some OS's) caused set filling be performed wrong (rep. #874) * [ES] fixed a bug in the Xbae widget crashing under a multi-head X server (rep. #878) 5.1.1 Functionality * [ES] interpolation now takes into account all data set columns * [ES] normalized histograms can be calculated * [ES] histograms with varying bin widths - abscissas of a set can be used as the bin mesh * [EV/ES] added GraceOpenVA() function to the grace_np API * [ES] \V{} escape code in strings - baseline shift * [ES] \n escape code in strings - new line * [ES] a region can be linked only to a single graph * [UH] implemented logit axis scale Interface * [ES] "Edit/Locator props" popup rewritten * [ES] "Spline" popup removed * [ES] "Interpolation" popup rewritten; now includes the former "Spline" functionality * [ES] "Histograms" popup rewritten * [ES] "Arrange graphs" rewritten (including reps. #368, #592, #735) * [ES] double click on a set selector entry now pops up the SS editor * [ES] date/time format can be used in the SS editor to display/enter values * [ES] many other enhancements in the SS editor * [ES] if the XmHTML widget library is available, it will be used for displaying on-line help ("Gracilla"). The libhelp support is scheduled to be withdrawn soon * [ES] removed -[no]logwindow command line options and X resource * [ES] removed -arrange, -cols, and -rows command line options * [ES] "Results" and error message windows merged into "Console" * [ES] menubar added to the "Graph appearance" dialog * [ES] "File/Read/Sets" and "File/Write/Sets" moved to the "Data/Import" and "Data/Export" submenus, respectively * [ES] "File/Read/Parameters" and "File/Write/Parameters" moved to the "Plot" menu * [ES] renamed "File/Device setup" to "File/Print setup" and added "View/Page setup" (same dialog but with X11 as the selected device) * [ES] split axis/tick label offset input fields into two Documentation/Info * [WB] some fixes/additions to the User's Guide * [AM] include Xbae version in -version and "Help/About" * [DP] User's Guide additions * [EV] Tutorials updated * [AM] man page corrections * [ES] re-enabled on-line help for several dialogs Parser * [ES] removed restriction on the max line length (512) in parameter files * [ES] SPLINE, ASPLINE, and INTERP removed and INTERPOLATE added which includes the functionality of the former ones * [ES] added RAND(N) - creates an array of N random numbers * [ES] HISTO renamed to HISTOGRAM and syntax changed * [ES] changed syntax of ARRANGE command * [ES] removed UNLINK REGNUM FROM selectgraph; now that a region links to a single graph only the command makes no sense * [DP] added READ NXY CHRSTR for reading in data in the NXY format Portability/Compilation * [ES] configure checks for netCDF version * [AC] a couple of configure fixes * [AM] check for build/runtime Xbae version match * [AM] OS/2 updates * [JH] VMS updates Bug fixes * [ES] fixed text under/overlining in SVG * [ES] fixed dashed patterns for thick lines in SVG * [ES] a bug in interpolation caused crash under some conditions (rep. #783) * [ES] fixed overflowing of some tables in dvi output of the User's guide * [ES] fixed interpolation of reversed arrays (rep. #675) * [ES] fixed a memory leak in interpolation using splines * [ES] there was no automatic canvas refresh after performing interpolation * [ES] there was no automatic canvas refresh after changes in locator props * [ES] fixed "\\" in strings * [ES] check for positive page dims and dpi in device setup (rep. #779) * [ES] invert logics of the yesno dialog popped up if printout is truncated (rep. #778) * [JSB] text color might be wrongly set on raster devices with antialiasing off (rep. #803) * [ES] memory leak fix in the SS editor * [ES] "File/New" didn't update project description in "File/Save as" * [ES] graph operations on killed graphs result in crash (rep. #805) * [ES] drawing objects cursor remained active after closing window (rep. #807) * [ES] switching between (overlaid) graphs updated the locator bar only after pointer move (rep. #808) * [GJ] canvas didn't refresh on autoscale shortcut (rep. #809) * [ES] initial values of fit parameters with bounds set were printed wrongly in the "Results" window * [ES] disable canvas events on hidden graphs * [ES] white space at the beginning of text strings wasn't accounted in bbox calculations * [ES] fixed wrong initial canvas size in the free page mode (rep. #821) * [ES] fixed set split crash * [ES] couldn't use constant expressions in "Load & evaluate" (rep. #828) * [ES] a severe memory leak in "Load & evaluate" fixed * [ES] regions were displayed wrongly on plots with several graphs 5.1.0 Functionality * [ES] VMAP plots implemented (rep. #440) * [ES] BOXPLOT sets re-implemented. The control over appearance details is more detailed than in Xmgr (including rep. #188) * [ES] XYSIZE sets implemented (a generalized form of "bubble" plots) * [ES] XYCOLOR sets implemented (rep. #484) * [ES] pie charts implemented ! [EV] set restrictions in "Window/Point explorer" * [ES] \#{} escape code in strings - allows to enter non-printable chars by their hex codes * [ES] \r{} escape code in strings - text rotation * [ES] \q, \Q escape codes in strings - start/stop text slanting (rep. #716) * [ES] \l{} escape code in strings - slanting text with any factor * [ES] \t{}, \T{} escape codes in strings - generic text coordinate transforms * [ES] \R{} escape code in strings - changes color inside a string (rep. #535) * [ES] \Fl, \FL escape codes in strings - start/stop ligature processing * [ES] \Fk, \FK escape codes in strings - start/stop kerning pair processing * [ES] more font encoding files added ! [ES] alternative tick labels ("transformed" axes) (rep. #93) * [ES] changed default placement of error bars to two-sided (rep. #737) * [ES] for XYBAR/XYBOXPLOT sets draw the symbols in the legend with the fixed height (of the legend text) for better readability (rep. #741) ! [ES] user-defined tick labels are no longer allowed without tick mark positions ! [ES] autoticking now alters # of minor ticks only if the current value is anomalous * [LM] allow to use 'T' as date-time separator (as recommended by ISO8601) * [ES] new fonts from GNU gs-5.50 (including the euro symbol) Interface ! [ES] re-designed "Create by formula"; any set type can be defined ! [ES] controls for justifications of strings cover all possibilities (vertical and horizontal alignments) ! [ES] combined point ops dialogs into one, "Window/Point explorer" * [ES] print all point data (was only x, y) during point tracking * [ES] (optional) set comments in set selectors * [ES] "File/Describe" merged with "File/Save as" * [ES] reading in block data no longer resets set column selectors * [ES] implemented the color sync option in the "set app." dialog * [EV] "-barebones" command line switch (switch all tool bars off) * [ES] annotated strings can be modified in the spreadsheet editor * [ES] in "File/Device setup", introduced options to sync page size of all devices and rescale plot on page size change Drivers * [LM] FrameMaker MIF driver added (rep. #590) * [LM] implemented SVG driver * [ES] PS Level 1/2 option in the EPS driver * [ES] now any font encoding is correctly represented in (E)PS output * [ES] added under/overlining to the E(PS) driver (rep. #756) * [ES] PS output made a bit more compact * [ES] under/overlining now works in PDF output * [ES] PDF driver setup options: 1.2/1.3 compatibility and compression level * [ES] use "thin" lines in X11 driver if the line width <= 1 pixel * [ES] list fonts, colors and other resources in the metafile driver * [ES] don't rotate output in EPS landscape mode * [ES] optionally set hardware resolution in PS output * [ES] in PS driver, option to select input tray: auto/manual/match page dimensions Documentation/Info * [AM] omit a few GUI-specific flags/help strings when compiling a GUI-less exec * [EV] Tutorials updated - added a regions section and updated the create by formula * [LM] added usage help for convcal * [HS] updated instructions for Motif-2.1 bug work-around (+ = crash) in the FAQ * [ES] re-structured the FAQ * [ES] documented numeric operators and functions Parser * [ES] finally, introduced variables (usual and 1D arrays)... * [ES] as a result of the above, removed scratch arrays (A, B, C, D) ! [DP] SWAP selectset AND selectset * [ES] EXIT(iexpr) * [ES] enlarged parser buffer to 4K Portability/Compilation * [ES] new configure options (including rep. #757) * [ES] the GRACE_HOME dir is now set by `configure' as PREFIX/grace (rep. #758) * [ES] checks for proper versions and consistency of libs and includes * [AM/ES] checks for Motif/LessTif run-time clash * [ES] the grace_np Fortran wrapper is compiled independently of whether a F77 compiler has been found * [JH] VMS updates * [AM] OS/2 updates Bug fixes * [ES] "duplicate graph" caused memory corruption (rep. #752) * [ES] too long text strings (>255) crashed Grace (rep. #759) * [ES] parser errors in too long lines (>255), if processed from a RTI caused crash * [ES] using very long formulae (>~100) in the non-linear fit caused memory corruption * [ES] text strings were justified by the lower edge of the bounding box instead of the baseline (rep. #710) * [ES] "-" in PS output was squeezed (rep. #711) * [RW] empty src/buildinfo.h prevented further compilation (rep. #717) * [ES] fixed \m{} in the beginning of a string * [AM] fixed reading in files with DOS * [ES] graph overlay fixes (including rep. #734) * [ES] fixed spurious error message about non-monotonic bins when calculating histograms (happened sometimes due to a rounding error) * [ES] histogramming from command file crashed (rep. #736) * [KS] the lower error bar in BARDY and BARDYDY was shadowed by bar * [ES] rescaling did not follow mouse (rep. #715) * [JM] a workaround for strange behaviour of some versions of Motif resulting in several popup windows being too big (rep. #720) * [AH] on some platforms, "make install" moved files instead of copying (rep. #743) * [AM] feature extraction didn't update set lists (rep. #731) * [ES] fixed triangle symbols (now correctly centered) * [ES] font antialising was broken on X displays with 24 bits per pixel format of pixmaps * [EV] feature extraction/FFT was incorrectly determining if the set length was a power of 2 (unimportant if FFTW was used) * [ES] upon loading a project, set print file name automatically (rep. #641) * [ES] fixed a memory leak in set sort * [ES] fixed bugs in set and point operations with sets containing annotated strings (including rep. #767) * [ES] in "Window/Results...", the vertical scrollbar was missing when compiled with Motif-2.1 * [ES] closing (by means of window manager) a dialog with file selection box in it rendered the window unusable next time it was popped up (rep. #743) 5.0.5 Functionality ! [ES] long drawing paths (of polylines and polygons) with length exceeding a threshold are transformed to be shorter than the limit; the latter is adjustable in "Edit/Preferences" popup. This works around internal restrictions of some devices, notably old X11 and PS, causing visual data point drops (rep. #634, #651) Interface * [ES] the "Autoscale on read" option moved back from "Edit/Preferences" to "File/Read sets" ! [ES] added "Autoscale on load" for creating sets from block data * [ES] added possibility to select target set(s) produced from a block data (rep. #87) Documentation/Info * [ES] added docs on adding/replacing fonts * [AM] miscellaneous FAQ updates Portability/Compilation * [AM] OS/2 updates * [JH] VMS updates (including rep. #681) * [ES] fixed compilation on HP/UX-11.0 * [ES] compilation outside of the source tree is now possible Bug fixes * [HS] fixed text string copy/edit bug (rep. #661) * [LM/ES] under some conditions, project or parameter saving caused crash (rep. #678) * [ES] quotes were not escaped in several places (append/prepend strings of tick labels, avalues etc) * [LM] setting reference date worked incorrectly since did not ignore current reference date * [ES] a Linux libc5/locale memory leak workaround (rep. #676) * [ES] a parser memory leak fixed * [ES] applied a patch to fix a nasty memory leak in the bundled T1lib * [ES] compiling GUI-less version failed (rep. #680) * [ES/HS] a workaround for bug in Motif-2.1 (+ crashed) (rep. #685) * [OT/ES] fixed a floating point overflow, causing crashes on non-IEEE compliant FPU (rep. #689) * [AM/ES] problems with autoscale and log axis scales (rep. #325, #688) * [ES] killing set data erroneously set the "hidden" flag of the set on (rep. #691) * [ES] hidden sets were not saved (rep. #338) 5.0.4 Functionality * [ES] nonl-fit: added region restrictions (rep. #251) * [ES] nonl-fit: added optional stat weights * [ES] print some basic statistics on the non-linear fit quality * [LM] implemented proper rounding for date/time axis formats * [ES] in PS output, issue an explicit page size selection call. This should allow to automatically choose between several input trays with different paper (for printers that have mutiple trays, of course) Interface * [ES] nonl-fit GUI reworked (including part of rep. #77) Documentation/Info * [AM] docs on building DL modules under OS/2 Parser ! [ES] extended variant of NONLFIT added: NONLFIT (selectset, vexpr, nexpr). The vexpr argument is an array of weights (of proper length) Defaults * [ES] the default template had the 2-digit year format enabled and the wrap year set to 1900, imitating older versions. Changed to off and 1950 respectively - should be more Y2K compliant :) Portability/Compilation * [ES] upgraded to T1lib-0.9.2 (fixing rep. #650) * [AM] OS/2 updates * [AM/ES] header files of the bundled Xbae and T1lib could in some cases clash with system-wide installations of respective library Bug fixes * [ES] strings (titles, legends,...) with only spaces in them caused crash (rep. #640) * [ES] enabling bounds for fit parameters in the non-linear fit popup crashed Grace (rep. #642) * [HF/ES] fixed bug in creating sets from block data (rep. #644) * [ES] "rawbits" PPM format was broken on big endian machines (rep. #645) * [ES] in the non-linear fit window, set was deselected after each step of fit (rep. #646) * [JB] WRITE setselect crashed * [ES] fixed crash when selecting "Show data-less" or "Show hidden" from set popup menus (rep. #652) * [LM] fixed a few bugs in the date/Julian day conversion * [LM] fixed "day of week" format that was broken for negative dates * [ES] use "%g" format in the point tracking window * [ES] selecting multiple graphs in "graph appearance" corrupted titles/ subtitles (#566) * [ES] couldn't parse data from multicolumn files containing non-numerics fields (rep. #655) * [ES] the user tick locations were saved with insufficient precision; now we use the same format as for storing data sets (rep. #298) 5.0.3 Functionality ! [ES] added "Fixed" graph type (rep. #556) * [ES] XYR set is back ! [ES] filled circles in XYR (rep. #206) * [ES] RtoL text advancing (not yet if using device fonts) ! [ES] extended options for line arrows - see "examples/arrows.agr" * [ES] automatic allocation of drawing objects; -maxlines and like command line options removed * [LM] RTI is processed also when running in gui-less or batch mode * [LM] millisecond resolution of timer ! [ES] added XYdXdXdYdY set type ! [ES] color & pattern of error bars can be selected independently from symbols ! [ES] arrow clipping of error bars (rep. #451) * [ES] no limit on number of columns in block and nxy data reads anymore (reps. #357, #596) * [ES] empty line works as set delimiter (#540) * [ES] added JPEG backend * [ES] added PNG backend ! [ES] any set type now may have an additional column of text strings associated; as a result, the XYSTRING set type removed * [ES] canvas page dimensions, as saved in the project file, set the page dimensions of all devices (which afterwards can be adjusted separately) * [LM] Grace now can parse input data in several date/time formats, including the recommended ISO8601 * [LM] reference date for date conversions is adjustable * [LM] 2-digit format for years for the current century is now optional and the wrap year is adjustable Interface * [ES] start in the command line interface (CLI) mode if the exec's name is "grace" ! [ES] dataset operations GUI re-worked * [ES] new canvas hotkeys for drawing objects (rep. #585) * [ES] changind axis scale to Log updates world min if necessary (rep. #625) ! [ES] all file selection box (FSB) dialogs replaced (fixing reps. #465, #549, #568) * [ES] "File/Working dir" removed, since this option is in any FSB now * [ES] "File/Read/Block data" removed - it's in the "File/Read/Sets" now * [EV] in the non-linear fit popup, allow to use expressions when giving bounds for the loaded function ! [ES] applying changes in "Set appearance" for multiple sets selected doesn't act on legends by default; this can be changed from the "Options" menu (part of rep. #588) * [ES] added "File/Revert to saved" * [ES] -nxy command line flag requires a filename immediately after it * [ES] use GXinvert rather than GXxor for rubberband lines by default ! [ES] "Evaluate expression" rewritten * [HS] invert selection in set/graph lists ! [ES] removed column width controls from SS editor; the spreadsheet columns may be resized with Shift+middle button ! [ES] option to select set string column from block data Documentation/Info * [AM/ES] many more buildinfo details are displayed by "-version" command line option * [LM] many User's Guide additions/updates * [AM/ES] added man page for grace/xmgrace/gracebat * [AM] added man page for grconvert * [AM] FAQ updates (including rep. #562) * [ES] FAQ updates (including reps. #580, #587) * [ES] "Help/Examples" menu tree Parser * [HS/ES] several logical constructs of mixed type arguments (vector and scalar) didn't work * [ES] added '?' and ':' to the operator precedence list; no conflicts in the parser anymore * [ES] no need for () around boolean expressions ! [ES] new color selection options: COLOR "name", COLOR (R, G, B) ! [ES] PRINT TO DEVICE added; PRINT TO "filename" doesn't actually print, only sets the output to a file (rep. #605) ! [LM] TIMER NUMBER - set timer's resolution ! [ES] G.S can be used anywhere ! [ES] allow to use SET[index] amd GRAPH[index] for set & graph selections ! [EV] REVERSE setselect APPEND setselect TO setselect SPLIT setselect number ! [ES] no setno.extremetype ! [ES] extremetype(vexpr) ! [ES] expressions can be used virtually in any statement (where only numbers were allowed formerly) ! [ES] checks for expression types ! [ES] JDAY function (has been never documented) renamed to DATE ! [ES] removed INDEX and LOAD SCRARRAY ! [ES] added MESH (a la linspace) ! [ES] several statements per line are allowed, separated by ';' * [ES] PAGE SIZE x y -> PAGE SIZE x, y ! [LM] REFERENCE DATE, DATE WRAP onoff, DATE WRAP YEAR iexpr ! [ES] strict array length checks Defaults ! [LM] the default value for the timer has been reduced from 1000 to 200ms * [ES] sformat is saved in projects Portability * [ES] configure honours $CC; if available and not overridden, gcc will be picked * [ES] motif find fix * [ES] Irix-6.5 config fix (rep. #558) * [ES] compilation errors when using some weird old versions of make fixed (rep. #583) * [ES] configure checks for declarations of all math functions * [ES] removed the remnants of support for Motif-1.1 * [ES] PDF driver updated to use pdflib-2.01 * [ES] updated to Xbae-4.7 (which fixed rep. #560) * [ES] T1 font machinery updated to T1lib-0.9.1 * [ES] no need for GD lib (for raster drivers); a customized version is included * [AM] OS/2 updates * [JH] VMS updates Bug fixes * [MR] popping up PS GUI setup window caused crash (rep. #563) * [ES] set split was broken in 5.0.2 * [EV] frequency/period feature extraction fix (rep. #538) * [ES] in the PS driver, pattern fills were not opaque (rep. #567) * [ES] crosshairs were left as lines on canvas (rep. #571) * [ES] description length was limited to 2K (rep. #575) * [ES] setting negative offsets for PS driver was impossible via GUI (rep. #579) * [ES] antialiased (default) text strings were invisible on mono X terminals (rep. #582) * [ES] join sets is working now (rep. #513) * [ES] error bar clipping wasn't enabled * [ES] error bars were drawn above symbols * [ES] settings from "Ellipse props..." were ignored * [ES] Bitmapped strings with no AA were broken in the PDF output * [ES] non-POSIX locales caused invalid PS output in rare cases * [LM] detect cases of accesses beyond array bounds of drawing objects * [ES] problems with operations with sets of different lengths (rep. #227) resolved * [HS] "Start load at" of the regression window was ignored * [ES] non-linear fit didn't work in batch mode for any but S0 set * [ES] fixed crashes with log axes (rep. #282, #525) * [AM/ES] fixed crashes when major tick spacing was equal to 0 (rep. #591) * [AM] the default filename of hardcopy output was truncated at first period (rep. #593) * [LM] several bugs in date formats fixed * [ES] locator properties didn't work; changing the locator format caused chaotic behavior (rep. #621) * [ES] patterned fills of ellipses gave segmentation fault (rep. #616). This was a GD library's bug, in fact Misc * [ES] removed GD and GIF backends (the latter due to patent issues) * [LM] an auxiliary utility added (convcal) to convert between "usual" and julian day date formats. This obsoletes the former greg2jul.c and jul2greg.c utilities. 5.0.2 Functionality * [ES] graphs and sets are allocated dynamically; -maxgraph, -maxsets and -graphsets removed * [ES] XY chart is back * [ES] XYZ set type is back ! [ES] new chart set presentations: stacked line and scatter ! [ES] new options for charts (different bar border/fill colors and patterns etc) ! [ES] inter-bar gap for bar charts is adjustable (rep. #198) ! [ES] new set type: BarDY (bar charts with error bars) * [ES] precision can be used for XYZ sets (rep. #519) * [ES] new set auto-coloring is back * [ES] added 16 new patterns * [ES] added a few more line styles (rep. #305) ! [ES] legends can be displayed in reverse order (rep. #205) * [ES] legends are drawn by default * [ES] enhanced backward compatibility with Xmgr * [ES] in free mode, auto-re-scale all the plot objects (imitating Xmgr) (rep. #537) ! [ES] color map stuff (rep. #512) ! [AM] auto-scaling with range restrictions * [LM] added internals for RT (real time) input monitoring ! [LM] grace_np library now uses anonymous instead of named pipes ! [ES] write format is used for all dataset types ! [ES] FP line widths (rep. #483) ! [ES] locale, if available and set, is used for numeric labels * [ES] in case of crash, Grace tries to save the project anyway ! [ES] added an option to fill (or not to) the page background * [ES] Grace honors $GRACE_PRINT_CMD environment variable (rep. #522) * [ES] PS and PDF drivers optimized for speed and file size * [ES] added color/gray-scale and bbox:tight/page options to the EPS driver * [ES] added adjustable printer page offsets to the PS driver * [ES] warning issued on truncated printout (if display and hard-copy device aspect ratio don't coincide, for example) Interface ! [ES] menu shuffles ! [ES] new graph selectors - with many operations available from the popup menu (right mouse button) ! [ES] new set selectors - with many operations available from the popup menu (right mouse button). Set selectors in the Data/* popups are of the old style yet * [ES] pattern selectors have pattern bitmaps displayed * [ES] line style selectors have dash bitmaps displayed * [ES] graph number for ops is automatically graph that has focus (rep. #104) ! [ES] (approximate) number of tick divisions for auto-ticking is set in "Axis properties" now instead of "Autoscale" ! [ES] a simplistic (by now) fonttool added * [ES] removed all set pick operations ! [ES] "Set appearance/Edit/*" now act on selected sets only * [HS] it's possible to refer to the index of blockdata as column 0 via command line (rep. #464) * [ES] removed -xy, -xydy etc command line flags; use -(set)type instead * [ES] -source stdin removed ! [ES] "-" and "stdin/stdout" can be used anywhere (rep. #486) * [ES] Block data window reworked ! [ES] canvas events redone * [ES] immediate feedback for drawing object reposition/editing is back (rep. #532) ! [ES] Activate/Edit/Create/Reactivate Set menu confusion eliminated (rep. #136) * [ES] print popup fixes ! [ES] in the X11 driver, put dots every 0.1 viewport (visible only if the page bg is not filled) ! [ES] from text inputs fires up font tool * [ES] xwindow title has "Grace: " prefix prepended and, if project is modified, "(modified)" suffix ! [ES] removed "Clear all" and added "New" instead ! [ES] removed "Verify Pick sets operations" option, added "Don't ask questions" (same as -noask) ! [LM] added -dpipe command line switch for monitoring an already open file descriptor * [ES] removed -symcolorbug command line option * [ES] removed -dc/-nodc, -redraw/-noredraw, -GXxor/-GXinvert command line options * [ES] max error count upon reading in reduced from 50 to 5 Documentation/Info * [ES] old HTML docs removed; a draft version of User's Guide added * [EV] Tutorials prepared. It's a recommended reading not only for newbies, especially taking into account the rudimentary state of the User's Guide * [AM] -version additions Parser * [ES] device commands (rep. #490) ! [ES] VXMAX and VYMAX - max viewport values of the current device ! [ES] TRUE/FALSE and ON/OFF are interchangeable ! [ES] NEW - start new project from scratch using default template; NEW FROM "filename" - start new project from scratch using filename template ! [ES] MAP COLOR color_id TO (R, G, B), "colorname" (0 <= R, G, B < 256) ! [ES] S$ - currently processed (in parser) SETNUM ! [ES] S_ - recently assigned SETNUM (e.g., after a data have been read in) ! [ES] SETNUM.ID - id of the set (i.e., S5.ID is 5) ! [ES] G$, G_ and GRAPHNO.ID - same as above, but for graphs Defaults * [ES] toolbar X resources ! [ES] use IsoLatin1 encoding if Default.enc is not found * [ES] gracerc magic path ! [ES] gracerc re-read upon SIGHUP * [ES] templates (rep. #520) Portability * [LM] grace_np library now compiles and works correctly on OS/2 and Win32 (in addition to all Unices, of course). There is an unresolved problem with VMS, though * [ES] added configuration for use of lcc as compiler * [JH] VMS updates * [AM] OS/2 updates * [ES] grconvert works on Win32 * [ES] Win32 port should compile out of the box Bug fixes * [ES] configure issued wrong messages * [ES] drawing objects might not be drawn sometimes * [ES] fixed patterns #7, #14 and #15 * [ES] fixed rounding errors in clipping routines (in particular, rep. #476 and #504) * [EV] a feature extraction bug fixed * [ES] view/world coords in string edit (rep. #469) * [LM] input data line length restriction removed (rep. #260, #357, #443) * [ES] npipe "buffer overflow" fixed * [ES] npipe load bug fixed * [LM] linear regression on a two-point set was performed wrongly * [ES] spreadsheet fixes and clean-ups (rep. #203, #259, #409) * [ES] auto-scale fixes (rep. #510) * [LM] configure fixes * [LM] updated several explanation strings on example files with the new GUI layout * [LM] the correct stack depth was displayed only after cycling * [ES] regions and graph fixed points not drawn in hardcopy output anymore * [ES] if no set has a legend string defined, the empty legend box is not drawn (even when legends are enabled) * [ES] Disk/Pipe selector was broken (rep. #454) * [ES] Set appearance/Data/Load comments didn't update GUI settings for the currently selected set (rep. #474) * [ES] ignore non-printable characters in formulae (rep. #241) * [ES] working dir not initialized (rep. #470) * [ES] `make tests' failed if ran before `make install' (rep. #491) * [ES] incorrect postscript output of bar charts fixed (rep. #341, #410) * [ES] fixed crash if applying axis settings to all graphs (rep. #503) * [ES] warning popup on exit sometimes appeared even after no changes have been made (rep. #274) * [ES] auto-scale didn't work if specified from the command line together with some other arguments (rep. #385, #441) * [ES] File/Write/Sets didn't work for multiple set selection (rep. #394) * [ES] strange font size decrement (rep. #242) * [ES] crashes on SGI when accents are used in the legends (rep. #268) * [ES] Strings & Things : Default size is zero on HP (rep. #288) * [ES] sometimes in plots with multiple graphs, one couldn't get the x axis tick marks or labels to be displayed on any of the graphs except for graph 0 (rep. #339) * [LM] in applications linked against grace_np, a call to system() or like functions would abort execution (rep. #382) * [ES] Core dump in SetSelectedSet if optimized (rep. #366) * [ES] misc other bug fixes Misc * [ES] memory consumption reduced (typically, 0.5 MB less than that of 5.0.1 and about same as of Xmgr-4.1.2) * [ES] removed "Coalesce sets" (will be back in 5.0.3) * [ES] no input date/time formats (a smart input data filter is planned for 5.0.3). Please use Julian dates for a time being 5.0.1 Functionality ! [ES] added FORMAT_SCIENTIFIC, FORMAT_ENGINEERING ! [ES] polar plots (a work in progress - far from being completed, but definitely better than nothing :)) ! [ES] added tunable offsets for tick labels (in particular, rep. #467) ! [ES] added option of placing axis ticks at rounded positions (rep. #124) * [HS2] implemented axis label placement op (normal/opposite side) (rep. #463) * [HS2] changed tick and axis label offsets from (x,y) to (parallel/perpendicular) * [HS2] introduced tick label placement auto/spec (similar to axis label) ! [ES] fill rules for sets: winding/even-odd; not honored by raster formats ! [ES] smart colormap management: -install/-noinstall flags force a given behavior; default is to switch to the private colormap automatically as needed ! [ES] -rvideo now acts on all devices; XMgrace.reverseVideo removed from the list of X resources ! [ES] selecting devices by names instead of numbers; "-device" command line argument renamed to "-hdevice"; GR_HDEV not used anymore ! [ES] zero axes are back. Now, both "primary" and alternative axes can be "zero" ones ! [ES] PDF device options added: binary/ASCII output; misc fixes ! [ES] GIF device options added: transparent and interlaced output ! [ES] PS device options added: grayscale/color; Level2 toggle is back (in fact, nobody of developers has a Level 1 printer to really check it) * [ES] fixed bug when text strings might be typed wrong sometimes in the PS output * [ES] all drivers slightly rewritten ! [ES] added PNM (PBM/PGM/PPM) device (both ASCII and "rawbits" outputs) ! [ES] Courier font family added * [ES] added \f, \h, \v, \z, \m, \M and \d string controls. Load typeset.agr in the "examples" dir to get an idea ! [ES] in the batch language, in any statement with FONT NUMBER, the font selection can be done by fontname instead of the number: FONT "fontname" ! [ES] Grace can now use any number of user-defined fonts, both in addition and as a replacement for bundled ones (rep. #26) Documentation/Info * [HS] added a text (http://plasma-gate.weizmann.ac.il/Grace/y2k.html) on the Year 2000 problem (rep. #342) * [HS2] new extended FAQ written * [AM] version string includes GUI toolkit (Motif/Lesstif/None) * [AM] help screen updated * [ES] font docs (doc/fonts.html) updated Portability * [ES] configure should now be smarter about finding Motif (rep. #416) * [ES] added configuration file for Interix (aka OpenNT) (rep. #437) * [ES] SunOS4 build fixes * [AM] OS/2 updates Bug fixes * [AM] "Read/Block data" crash fixed (rep. #445) * [ES] Zooming now zooms exactly to the window specified by mouse (rep. #5) * [ES] "AutoT" doesn't alter graph min/max values (rep. #165) * [ES] killing sets in polar plots with parameters preserved caused crash (rep. #125) * [HS2] ellipses might be sometimes drawn incorrectly in X11 * [ES] a memory leak in "Edit String" fixed * [HS] leap year function corrected * [ES] XYString sets were not saved (rep. #452) * [ES] Disk/Pipe selector was broken (rep. #455) * [AM] fixed broken axis scaling when set min/max was +/- Inf * [EV] stack manipulation fixed (#417) * [AM] "-version" now outputs to stdout instead of stderr * [ES] misc small fixes 5.0.0 (since Xmgr-4.1.2): Functionality * [ES] T1 fonts are used for all devices using the T1lib library of Rainer Menzner. There should be no discrepancies anymore between characters displayed and printed (rep. #16) * [ES] routines of drawing layer rewritten from the scratch; Grace is now almost WYSIWYG, except patterns (rep. #184) * [EV] generic I/O filtering implemented (including rep. #240); see docs for details ! [ES] reciprocal axis scale implemented (rep. #33) * [EV] system-wide gracerc ($GRACE_HOME/gracerc) will be read at startup time, if exists ! [ES] overlined strings are possible (\o \O) (rep. #176). Doesn't work with device fonts yet ! [MM] extensions to regions including horizontal-inside, horizontal-outside, vertical-inside and vertical-outside ! [MM] Grace will use the FFTW library for Fourier transform if present on the system; see README.FFTW * [MM] negative indices in "Drop points" allowed (counting from the end of a set) * [EV] added a new feature to be extracted - the integral of each set ! [ES] "unit" and "const" added to the possible proctype's for modules. DEG (below) is an example what "unit" can be used for ! [ES] DEG and RAD are now meaningful. E.g., expressions like sin(90 deg) and sin(pi/2 rad) both are legitimate (and equivalent!) ("rad" can be omitted - it's there just for the sake of completeness) * [ES] metafile driver (not in final state) * [ES] PDF driver using the PDFlib of Thomas Merz; see README.PDF * [ES] GIF/GD driver using the GD library of Thomas Boutell (rep. #14); see README.GIF * [ES] logarithmic scales can have any base (rep. #370) * [ES] patterns and colors can be used simultaneously (rep. #291) * [ES] power tick label format changed to work in scientific format (rep. #361) * [ES] \B in composite strings will reset the font to the string's initial font (rep. #388) * [ES] PS/EPS driver rewritten from the scratch * [ES] X11 driver heavily rewritten Interface ! [ES] removed "Plot/World scaling" popup ! [ES] re-designed axis props GUI popup (in particular, rep. #63, #313) * [EV] point ops popup fixes ! [ES] graph appearance props GUI popup ! [ES] removed "Viewport", "Frame", "Titles" and "Legends" popups. ! [ES] removed "Error bars" and "Edit legends" popups. ! [ES] re-designed set appearance props GUI popup (rep. #311, #369 should be fixed) * [EV] added expression evaluation to text input fields in all widgets * [EV] error window changed - only 1 window, not 1 window per error ! [EV] regression fits can be applied to specified interval and results are printed out in readable form * [EV] scrolled windows for explicitly requested expressions * [EV] canvas hotkeys added ! [ES] re-designed print setup GUI popup (problems in rep. #372, #412 should be fixed) * [ES] changing page size is possible for any device separately; the units can be "pix"els, "cm" or "in" (rep. #108, #211, #216, #405) Project files * [EV] background color saved * [MM] all regions, whether active or not, are saved to the file, so temporarily inactive regions don't get lost * [ES] page size is saved (rep. #312) Parser * [ES] cleaned grammar parser; instead of 350 shift/reduce and 231 reduce/reduce conflicts - > 61 & 0 respectively * [ES] MAX() and MIN() renamed to MAXOF() and MINOF() ! [ES] removed DX, DY, IMAGE ! [ES] removed GRAPHNO *BAR SIZE NUMBER ! [ES] removed SETNUM = SETNUM etc ! [ES] removed CMAP, STATUS, STATUSBAR, TOOLBAR, LOCATORBAR, LOCATOR Defaults ! [ES] default page layout changed from free to fixed * [ES] \+ increases font size sqrt(sqrt(2)) times; \- respectively, decreases. Sub/superscripts are 1/sqrt(2) of the preceeding font size Portability * [AM] implemented dynamic modules for OS/2 * [EV] popen() for VMS * [JH/RN] VMS fixes * [AM] OS/2 updates Misc ! [ES] removed (broke) xwd image loading ! [ES] removed all app-defaults not specific to GUI ! [ES] \x and \b control sequences removed Bug fixes * [ES] "-mono" command line flag now works * [EV] "-wd" command line flag fixed * [EV] trying to create a new set preceded with soft kill of all sets caused crash (rep. #367) * [MM] FFT fixes * [MM] when regions were read in from a saved file, they ended up linked to all graphs * [MM] in saved projects, REGNUM TRUE was used instead of REGNUM ON * [EV] several sets can be linked to the same file as in xny data (rep. #269) * [ES] crash on mono X servers fixed (rep. #285) * [ES] canvas refresh (rep. #217, #271 #317, #333, #375) * [ES] axis labels were not displayed if `display tick marks' wasn't selected (rep. #3) * [ES] coordinates of legend frame now corresponds to the left upper corner of the frame (rep. #31) * [ES] ticklabel format was reset by autoscale (rep. #119, #144) * [ES] bounding box of EPS was calculated only approximately (rep. #123, #145) * [ES] legend frame didn't account for sub/superscripts (rep. #189) * [ES] extraneous logarithmic tick marks were drawn in some cases (rep. #193) * [ES] accentuated titles weren't centered correctly (rep. #195) * [ES] switch to log scale with an axis containing zero might cause error messages infinitely looped (rep. #210) * [ES] filling of legend frame didn't work unless one turned the frame on (rep. #215) * [ES] the axes tick marks were behind set curves (rep. #224) * [ES] popup positioning left up to WM for all windows (rep. #273) * [ES] if graph contained too many ticks, autoscale was applied instead of tick position recalculation (rep. #275) * [EV] in "Point ops", 'Delete' ignored set number (rep. #293) * [ES] once activated, legends fill frame couldn't be switched off from within GUI (rep. #326) * [CM] adding legends to plots with number of data sets exceeding the default maximum caused a crash (rep. #344) * [ES] arranging or rearranging graphs by means of the "arrange" dialog reset previously set tick properties to defaults (rep. #356) * [ES] user tick labels w/subscripts did not show up in PS output (rep. #383) * [ES] FFT command didn't work correctly in parser (rep. #398) * [HS] command line parsing was wrong in several places (rep. #400) * [ES] misc. small fixes (including rep. #289, #406, #287) Legend: [EV] - Ed Vigmond [RN] - Rolf Niepraschk [HS] - Henrik Seidel [JH] - John Hasstedt [AM] - Alexander Mai [CM] - Charles Myers [MM] - Marcus H. Mendenhall [HS2] - Heiko R. Selber [LM] - Luc Maisonobe [MR] - Mark Rintoul [HF] - Harald Freyer [JB] - Jesko Brudermann [OT] - Ovidiu Toader [RW] - Robin Williams [JM] - John McKitterick [AH] - A. Stewart Hopkins [KS] - Keith Stribley [DP] - Donald A. Peterson [WB] - Wolfgang Braun [JSB] - J. Scott Berg [AC] - Alber Chin [GJ] - Gerd Jahn [UH] - Ulrich Harttig [DB] - Dominique Bissieres [RL] - R. Lahaye [MD] - Matthias Dillier [PM] - Petrie L M [JS] - Jan Schaumann [SR] - Stewart Rounds [PB] - Peter Breitenlohner [MO] - Marius OlechnoviÄius [YZ] - Yura Zotov [TO] - Tobias Oed [IG] - Ionut Georgescu [HR] - Harvey Richardson [DC] - Dan Connelly [TK] - Thomas Klausner [SM] - Stan Maree [ES] - Evgeny Stambulchik "!" means no documentation provided (yet) grace-5.1.23/cephes/0000755000076500001440000000000012032153126013672 5ustar fnevgenyusersgrace-5.1.23/cephes/ellpk.c0000644000076500001440000001136210505257152015157 0ustar fnevgenyusers/* ellpk.c * * Complete elliptic integral of the first kind * * * * SYNOPSIS: * * double m1, y, ellpk(); * * y = ellpk( m1 ); * * * * DESCRIPTION: * * Approximates the integral * * * * pi/2 * - * | | * | dt * K(m) = | ------------------ * | 2 * | | sqrt( 1 - m sin t ) * - * 0 * * where m = 1 - m1, using the approximation * * P(x) - log x Q(x). * * The argument m1 is used rather than m so that the logarithmic * singularity at m = 1 will be shifted to the origin; this * preserves maximum accuracy. * * K(0) = pi/2. * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,1 16000 3.5e-17 1.1e-17 * IEEE 0,1 30000 2.5e-16 6.8e-17 * * ERROR MESSAGES: * * message condition value returned * ellpk domain x<0, x>1 0.0 * */ /* ellpk.c */ /* Cephes Math Library, Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef DEC static unsigned short P[] = { 0035020,0127576,0040430,0051544, 0036025,0070136,0042703,0153716, 0036402,0122614,0062555,0077777, 0036441,0102130,0072334,0025172, 0036341,0043320,0117242,0172076, 0036312,0146456,0077242,0154141, 0036420,0003467,0013727,0035407, 0036564,0137263,0110651,0020237, 0036775,0001330,0144056,0020305, 0037305,0144137,0157521,0141734, 0040261,0071027,0173721,0147572 }; static unsigned short Q[] = { 0034366,0130371,0103453,0077633, 0035557,0122745,0173515,0113016, 0036302,0124470,0167304,0074473, 0036575,0132403,0117226,0117576, 0036703,0156271,0047124,0147733, 0036766,0137465,0002053,0157312, 0037031,0014423,0154274,0176515, 0037107,0177747,0143216,0016145, 0037217,0177777,0172621,0074000, 0037377,0177777,0177776,0156435, 0040000,0000000,0000000,0000000 }; static union us2d_t ac1 = {{0040261,0071027,0173721,0147572}}; #define C1 ac1.d #endif #ifdef IBMPC static unsigned short P[] = { 0x0a6d,0xc823,0x15ef,0x3f22, 0x7afa,0xc8b8,0xae0b,0x3f62, 0xb000,0x8cad,0x54b1,0x3f80, 0x854f,0x0e9b,0x308b,0x3f84, 0x5e88,0x13d4,0x28da,0x3f7c, 0x5b0c,0xcfd4,0x59a5,0x3f79, 0xe761,0xe2fa,0x00e6,0x3f82, 0x2414,0x7235,0x97d6,0x3f8e, 0xc419,0x1905,0xa05b,0x3f9f, 0x387c,0xfbea,0xb90b,0x3fb8, 0x39ef,0xfefa,0x2e42,0x3ff6 }; static unsigned short Q[] = { 0x6ff3,0x30e5,0xd61f,0x3efe, 0xb2c2,0xbee9,0xf4bc,0x3f4d, 0x8f27,0x1dd8,0x5527,0x3f78, 0xd3f0,0x73d2,0xb6a0,0x3f8f, 0x99fb,0x29ca,0x7b97,0x3f98, 0x7bd9,0xa085,0xd7e6,0x3f9e, 0x9faa,0x7b17,0x2322,0x3fa3, 0xc38d,0xf8d1,0xfffc,0x3fa8, 0x2f00,0xfeb2,0xffff,0x3fb1, 0xdba4,0xffff,0xffff,0x3fbf, 0x0000,0x0000,0x0000,0x3fe0 }; static union us2d_t ac1 = {{0x39ef,0xfefa,0x2e42,0x3ff6}}; #define C1 ac1.d #endif #ifdef MIEEE static unsigned short P[] = { 0x3f22,0x15ef,0xc823,0x0a6d, 0x3f62,0xae0b,0xc8b8,0x7afa, 0x3f80,0x54b1,0x8cad,0xb000, 0x3f84,0x308b,0x0e9b,0x854f, 0x3f7c,0x28da,0x13d4,0x5e88, 0x3f79,0x59a5,0xcfd4,0x5b0c, 0x3f82,0x00e6,0xe2fa,0xe761, 0x3f8e,0x97d6,0x7235,0x2414, 0x3f9f,0xa05b,0x1905,0xc419, 0x3fb8,0xb90b,0xfbea,0x387c, 0x3ff6,0x2e42,0xfefa,0x39ef }; static unsigned short Q[] = { 0x3efe,0xd61f,0x30e5,0x6ff3, 0x3f4d,0xf4bc,0xbee9,0xb2c2, 0x3f78,0x5527,0x1dd8,0x8f27, 0x3f8f,0xb6a0,0x73d2,0xd3f0, 0x3f98,0x7b97,0x29ca,0x99fb, 0x3f9e,0xd7e6,0xa085,0x7bd9, 0x3fa3,0x2322,0x7b17,0x9faa, 0x3fa8,0xfffc,0xf8d1,0xc38d, 0x3fb1,0xffff,0xfeb2,0x2f00, 0x3fbf,0xffff,0xffff,0xdba4, 0x3fe0,0x0000,0x0000,0x0000 }; static union us2d_t ac1 = { {0x3ff6,0x2e42,0xfefa,0x39ef} }; #define C1 ac1.d #endif #ifdef UNK static double P[] = { 1.37982864606273237150E-4, 2.28025724005875567385E-3, 7.97404013220415179367E-3, 9.85821379021226008714E-3, 6.87489687449949877925E-3, 6.18901033637687613229E-3, 8.79078273952743772254E-3, 1.49380448916805252718E-2, 3.08851465246711995998E-2, 9.65735902811690126535E-2, 1.38629436111989062502E0 }; static double Q[] = { 2.94078955048598507511E-5, 9.14184723865917226571E-4, 5.94058303753167793257E-3, 1.54850516649762399335E-2, 2.39089602715924892727E-2, 3.01204715227604046988E-2, 3.73774314173823228969E-2, 4.88280347570998239232E-2, 7.03124996963957469739E-2, 1.24999999999870820058E-1, 4.99999999999999999821E-1 }; static double C1 = 1.3862943611198906188E0; /* log(4) */ #endif extern double MACHEP, MAXNUM; double ellpk(x) double x; { if( (x < 0.0) || (x > 1.0) ) { mtherr( "ellpk", DOMAIN ); return( 0.0 ); } if( x > MACHEP ) { return( polevl(x,P,10) - log(x) * polevl(x,Q,10) ); } else { if( x == 0.0 ) { mtherr( "ellpk", SING ); return( MAXNUM ); } else { return( C1 - 0.5 * log(x) ); } } } grace-5.1.23/cephes/isnan.c0000644000076500001440000001005007766432074015166 0ustar fnevgenyusers/* isnan() * signbit() * isfinite() * * Floating point numeric utilities * * * * SYNOPSIS: * * double ceil(), floor(), frexp(), ldexp(); * int signbit(), isnan(), isfinite(); * double x, y; * int expnt, n; * * y = floor(x); * y = ceil(x); * y = frexp( x, &expnt ); * y = ldexp( x, n ); * n = signbit(x); * n = isnan(x); * n = isfinite(x); * * * * DESCRIPTION: * * All four routines return a double precision floating point * result. * * floor() returns the largest integer less than or equal to x. * It truncates toward minus infinity. * * ceil() returns the smallest integer greater than or equal * to x. It truncates toward plus infinity. * * frexp() extracts the exponent from x. It returns an integer * power of two to expnt and the significand between 0.5 and 1 * to y. Thus x = y * 2**expn. * * ldexp() multiplies x by 2**n. * * signbit(x) returns 1 if the sign bit of x is 1, else 0. * * These functions are part of the standard C run time library * for many but not all C compilers. The ones supplied are * written in C for either DEC or IEEE arithmetic. They should * be used only if your compiler library does not already have * them. * * The IEEE versions assume that denormal numbers are implemented * in the arithmetic. Some modifications will be required if * the arithmetic has abrupt rather than gradual underflow. */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #if !defined(HAVE_ISNAN) && !defined(HAVE_ISNAN_MACRO) #ifdef UNK /* ceil(), floor(), frexp(), ldexp() may need to be rewritten. */ #undef UNK #if BIGENDIAN #define MIEEE 1 #else #define IBMPC 1 #endif #endif /* Return 1 if the sign bit of x is 1, else 0. */ int signbit(x) double x; { union { double d; short s[4]; int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC return( u.i[1] < 0 ); #endif #ifdef DEC return( u.s[3] < 0 ); #endif #ifdef MIEEE return( u.i[0] < 0 ); #endif } else { #ifdef IBMPC return( u.s[3] < 0 ); #endif #ifdef DEC return( u.s[3] < 0 ); #endif #ifdef MIEEE return( u.s[0] < 0 ); #endif } } /* Return 1 if x is a number that is Not a Number, else return 0. */ int isnan(x) double x; { #ifdef NANS union { double d; unsigned short s[4]; unsigned int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC if( ((u.i[1] & 0x7ff00000) == 0x7ff00000) && (((u.i[1] & 0x000fffff) != 0) || (u.i[0] != 0))) return 1; #endif #ifdef DEC if( (u.s[1] & 0x7fff) == 0) { if( (u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef MIEEE if( ((u.i[0] & 0x7ff00000) == 0x7ff00000) && (((u.i[0] & 0x000fffff) != 0) || (u.i[1] != 0))) return 1; #endif return(0); } else { /* size int not 4 */ #ifdef IBMPC if( (u.s[3] & 0x7ff0) == 0x7ff0) { if( ((u.s[3] & 0x000f) | u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef DEC if( (u.s[3] & 0x7fff) == 0) { if( (u.s[2] | u.s[1] | u.s[0]) != 0 ) return(1); } #endif #ifdef MIEEE if( (u.s[0] & 0x7ff0) == 0x7ff0) { if( ((u.s[0] & 0x000f) | u.s[1] | u.s[2] | u.s[3]) != 0 ) return(1); } #endif return(0); } /* size int not 4 */ #else /* No NANS. */ return(0); #endif } #endif /* HAVE_ISNAN */ #if !defined(HAVE_FINITE) && !defined(HAVE_ISFINITE) && !defined(HAVE_ISFINITE_MACRO) /* Return 1 if x is not infinite and is not a NaN. */ int isfinite(x) double x; { #ifdef INFINITIES union { double d; unsigned short s[4]; unsigned int i[2]; } u; u.d = x; if( sizeof(int) == 4 ) { #ifdef IBMPC if( (u.i[1] & 0x7ff00000) != 0x7ff00000) return 1; #endif #ifdef DEC if( (u.i[0] & 0x7fffffff) != 0x7fffffff) return 1; #endif #ifdef MIEEE if( (u.i[0] & 0x7ff00000) != 0x7ff00000) return 1; #endif return(0); } else { #ifdef IBMPC if( (u.s[3] & 0x7ff0) != 0x7ff0) return 1; #endif #ifdef DEC if( (u.s[3] & 0x7fff) != 0) return 1; #endif #ifdef MIEEE if( (u.s[0] & 0x7ff0) != 0x7ff0) return 1; #endif return(0); } #else /* No INFINITY. */ return(1); #endif } #endif /* HAVE_(IS)FINITE */ grace-5.1.23/cephes/log2.c0000644000076500001440000001514106724056645014726 0ustar fnevgenyusers/* log2.c * * Base 2 logarithm * * * * SYNOPSIS: * * double x, y, log2(); * * y = log2( x ); * * * * DESCRIPTION: * * Returns the base 2 logarithm of x. * * The argument is separated into its exponent and fractional * parts. If the exponent is between -1 and +1, the base e * logarithm of the fraction is approximated by * * log(1+x) = x - 0.5 x**2 + x**3 P(x)/Q(x). * * Otherwise, setting z = 2(x-1)/x+1), * * log(x) = z + z**3 P(z)/Q(z). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0.5, 2.0 30000 2.0e-16 5.5e-17 * IEEE exp(+-700) 40000 1.3e-16 4.6e-17 * * In the tests over the interval [exp(+-700)], the logarithms * of the random arguments were uniformly distributed. * * ERROR MESSAGES: * * log2 singularity: x = 0; returns -INFINITY * log2 domain: x < 0; returns NAN */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_LOG2 static char fname[] = {"log2"}; /* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x) * 1/sqrt(2) <= x < sqrt(2) */ #ifdef UNK static double P[] = { 1.01875663804580931796E-4, 4.97494994976747001425E-1, 4.70579119878881725854E0, 1.44989225341610930846E1, 1.79368678507819816313E1, 7.70838733755885391666E0, }; static double Q[] = { /* 1.00000000000000000000E0, */ 1.12873587189167450590E1, 4.52279145837532221105E1, 8.29875266912776603211E1, 7.11544750618563894466E1, 2.31251620126765340583E1, }; #define LOG2EA 0.44269504088896340735992 #endif #ifdef DEC static unsigned short P[] = { 0037777,0127270,0162547,0057274, 0041001,0054665,0164317,0005341, 0041451,0034104,0031640,0105773, 0041677,0011276,0123617,0160135, 0041701,0126603,0053215,0117250, 0041420,0115777,0135206,0030232, }; static unsigned short Q[] = { /*0040200,0000000,0000000,0000000,*/ 0041220,0144332,0045272,0174241, 0041742,0164566,0035720,0130431, 0042246,0126327,0166065,0116357, 0042372,0033420,0157525,0124560, 0042271,0167002,0066537,0172303, 0041730,0164777,0113711,0044407, }; static unsigned short L[5] = {0037742,0124354,0122560,0057703}; #define LOG2EA (*(double *)(&L[0])) #endif #ifdef IBMPC static unsigned short P[] = { 0x1bb0,0x93c3,0xb4c2,0x3f1a, 0x52f2,0x3f56,0xd6f5,0x3fdf, 0x6911,0xed92,0xd2ba,0x4012, 0xeb2e,0xc63e,0xff72,0x402c, 0xc84d,0x924b,0xefd6,0x4031, 0xdcf8,0x7d7e,0xd563,0x401e, }; static unsigned short Q[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xef8e,0xae97,0x9320,0x4026, 0xc033,0x4e19,0x9d2c,0x4046, 0xbdbd,0xa326,0xbf33,0x4054, 0xae21,0xeb5e,0xc9e2,0x4051, 0x25b2,0x9e1f,0x200a,0x4037, }; static unsigned short L[5] = {0x0bf8,0x94ae,0x551d,0x3fdc}; #define LOG2EA (*(double *)(&L[0])) #endif #ifdef MIEEE static unsigned short P[] = { 0x3f1a,0xb4c2,0x93c3,0x1bb0, 0x3fdf,0xd6f5,0x3f56,0x52f2, 0x4012,0xd2ba,0xed92,0x6911, 0x402c,0xff72,0xc63e,0xeb2e, 0x4031,0xefd6,0x924b,0xc84d, 0x401e,0xd563,0x7d7e,0xdcf8, }; static unsigned short Q[] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4026,0x9320,0xae97,0xef8e, 0x4046,0x9d2c,0x4e19,0xc033, 0x4054,0xbf33,0xa326,0xbdbd, 0x4051,0xc9e2,0xeb5e,0xae21, 0x4037,0x200a,0x9e1f,0x25b2, }; static unsigned short L[5] = {0x3fdc,0x551d,0x94ae,0x0bf8}; #define LOG2EA (*(double *)(&L[0])) #endif /* Coefficients for log(x) = z + z**3 P(z)/Q(z), * where z = 2(x-1)/(x+1) * 1/sqrt(2) <= x < sqrt(2) */ #ifdef UNK static double R[3] = { -7.89580278884799154124E-1, 1.63866645699558079767E1, -6.41409952958715622951E1, }; static double S[3] = { /* 1.00000000000000000000E0,*/ -3.56722798256324312549E1, 3.12093766372244180303E2, -7.69691943550460008604E2, }; #endif #ifdef DEC static unsigned short R[12] = { 0140112,0020756,0161540,0072035, 0041203,0013743,0114023,0155527, 0141600,0044060,0104421,0050400, }; static unsigned short S[12] = { /*0040200,0000000,0000000,0000000,*/ 0141416,0130152,0017543,0064122, 0042234,0006000,0104527,0020155, 0142500,0066110,0146631,0174731, }; #endif #ifdef IBMPC static unsigned short R[12] = { 0x0e84,0xdc6c,0x443d,0xbfe9, 0x7b6b,0x7302,0x62fc,0x4030, 0x2a20,0x1122,0x0906,0xc050, }; static unsigned short S[12] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x6d0a,0x43ec,0xd60d,0xc041, 0xe40e,0x112a,0x8180,0x4073, 0x3f3b,0x19b3,0x0d89,0xc088, }; #endif #ifdef MIEEE static unsigned short R[12] = { 0xbfe9,0x443d,0xdc6c,0x0e84, 0x4030,0x62fc,0x7302,0x7b6b, 0xc050,0x0906,0x1122,0x2a20, }; static unsigned short S[12] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xc041,0xd60d,0x43ec,0x6d0a, 0x4073,0x8180,0x112a,0xe40e, 0xc088,0x0d89,0x19b3,0x3f3b, }; #endif #define SQRTH 0.70710678118654752440 extern double LOGE2, INFINITY, NAN; double log2(x) double x; { int e; double y; VOLATILE double z; #ifdef DEC short *q; #endif #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES if( x == INFINITY ) return(x); #endif /* Test for domain */ if( x <= 0.0 ) { if( x == 0.0 ) { mtherr( fname, SING ); return( -INFINITY ); } else { mtherr( fname, DOMAIN ); return( NAN ); } } /* separate mantissa from exponent */ #ifdef DEC q = (short *)&x; e = *q; /* short containing exponent */ e = ((e >> 7) & 0377) - 0200; /* the exponent */ *q &= 0177; /* strip exponent from x */ *q |= 040000; /* x now between 0.5 and 1 */ #endif /* Note, frexp is used so that denormal numbers * will be handled properly. */ #ifdef IBMPC x = frexp( x, &e ); /* q = (short *)&x; q += 3; e = *q; e = ((e >> 4) & 0x0fff) - 0x3fe; *q &= 0x0f; *q |= 0x3fe0; */ #endif /* Equivalent C language standard library function: */ #ifdef UNK x = frexp( x, &e ); #endif #ifdef MIEEE x = frexp( x, &e ); #endif /* logarithm using log(x) = z + z**3 P(z)/Q(z), * where z = 2(x-1)/x+1) */ if( (e > 2) || (e < -2) ) { if( x < SQRTH ) { /* 2( 2x-1 )/( 2x+1 ) */ e -= 1; z = x - 0.5; y = 0.5 * z + 0.5; } else { /* 2 (x-1)/(x+1) */ z = x - 0.5; z -= 0.5; y = 0.5 * x + 0.5; } x = z / y; z = x*x; y = x * ( z * polevl( z, R, 2 ) / p1evl( z, S, 3 ) ); goto ldone; } /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ if( x < SQRTH ) { e -= 1; x = ldexp( x, 1 ) - 1.0; /* 2x - 1 */ } else { x = x - 1.0; } z = x*x; #if DEC y = x * ( z * polevl( x, P, 5 ) / p1evl( x, Q, 6 ) ) - ldexp( z, -1 ); #else y = x * ( z * polevl( x, P, 5 ) / p1evl( x, Q, 5 ) ) - ldexp( z, -1 ); #endif ldone: /* Multiply log of fraction by log2(e) * and base 2 exponent by 1 * * ***CAUTION*** * * This sequence of operations is critical and it may * be horribly defeated by some compiler optimizers. */ z = y * LOG2EA; z += x * LOG2EA; z += y; z += x; z += e; return( z ); } #endif /* HAVE_LOG2 */ grace-5.1.23/cephes/acosh.c0000644000076500001440000000571306626627164015165 0ustar fnevgenyusers/* acosh.c * * Inverse hyperbolic cosine * * * * SYNOPSIS: * * double x, y, acosh(); * * y = acosh( x ); * * * * DESCRIPTION: * * Returns inverse hyperbolic cosine of argument. * * If 1 <= x < 1.5, a rational approximation * * sqrt(z) * P(z)/Q(z) * * where z = x-1, is used. Otherwise, * * acosh(x) = log( x + sqrt( (x-1)(x+1) ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 1,3 30000 4.2e-17 1.1e-17 * IEEE 1,3 30000 4.6e-16 8.7e-17 * * * ERROR MESSAGES: * * message condition value returned * acosh domain |x| < 1 NAN * */ /* acosh.c */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ /* acosh(z) = sqrt(x) * R(x), z = x + 1, interval 0 < x < 0.5 */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_ACOSH #ifdef UNK static double P[] = { 1.18801130533544501356E2, 3.94726656571334401102E3, 3.43989375926195455866E4, 1.08102874834699867335E5, 1.10855947270161294369E5 }; static double Q[] = { /* 1.00000000000000000000E0,*/ 1.86145380837903397292E2, 4.15352677227719831579E3, 2.97683430363289370382E4, 8.29725251988426222434E4, 7.83869920495893927727E4 }; #endif #ifdef DEC static unsigned short P[] = { 0041755,0115055,0144002,0146444, 0043166,0132103,0155150,0150302, 0044006,0057360,0003021,0162753, 0044323,0021557,0175225,0056253, 0044330,0101771,0040046,0006636 }; static unsigned short Q[] = { /*0040200,0000000,0000000,0000000,*/ 0042072,0022467,0126670,0041232, 0043201,0146066,0152142,0034015, 0043750,0110257,0121165,0026100, 0044242,0007103,0034667,0033173, 0044231,0014576,0175573,0017472 }; #endif #ifdef IBMPC static unsigned short P[] = { 0x59a4,0xb900,0xb345,0x405d, 0x1a18,0x7b4d,0xd688,0x40ae, 0x3cbd,0x00c2,0xcbde,0x40e0, 0xab95,0xff52,0x646d,0x40fa, 0xc1b4,0x2804,0x107f,0x40fb }; static unsigned short Q[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x0853,0xf5b7,0x44a6,0x4067, 0x4702,0xda8c,0x3986,0x40b0, 0xa588,0xf44e,0x1215,0x40dd, 0xe6cf,0x6736,0x41c8,0x40f4, 0x63e7,0xdf6f,0x232f,0x40f3 }; #endif #ifdef MIEEE static unsigned short P[] = { 0x405d,0xb345,0xb900,0x59a4, 0x40ae,0xd688,0x7b4d,0x1a18, 0x40e0,0xcbde,0x00c2,0x3cbd, 0x40fa,0x646d,0xff52,0xab95, 0x40fb,0x107f,0x2804,0xc1b4 }; static unsigned short Q[] = { 0x4067,0x44a6,0xf5b7,0x0853, 0x40b0,0x3986,0xda8c,0x4702, 0x40dd,0x1215,0xf44e,0xa588, 0x40f4,0x41c8,0x6736,0xe6cf, 0x40f3,0x232f,0xdf6f,0x63e7, }; #endif extern double LOGE2, INFINITY, NAN; double acosh(x) double x; { double a, z; if( x < 1.0 ) { mtherr( "acosh", DOMAIN ); return(NAN); } if( x > 1.0e8 ) { #ifdef INFINITIES if( x == INFINITY ) return( INFINITY ); #endif return( log(x) + LOGE2 ); } z = x - 1.0; if( z < 0.5 ) { a = sqrt(z) * (polevl(z, P, 4) / p1evl(z, Q, 5) ); return( a ); } a = sqrt( z*(x+1.0) ); return( log(x + a) ); } #endif /* HAVE_ACOSH */ grace-5.1.23/cephes/gamma.c0000644000076500001440000003242710505257152015137 0ustar fnevgenyusers/* gamma.c * * Gamma function * * * * SYNOPSIS: * * double x, y, gamma(); * extern int sgngam; * * y = gamma( x ); * * * * DESCRIPTION: * * Returns gamma function of the argument. The result is * correctly signed, and the sign (+1 or -1) is also * returned in a global (extern) variable named sgngam. * This variable is also filled in by the logarithmic gamma * function lgam(). * * Arguments |x| <= 34 are reduced by recurrence and the function * approximated by a rational function of degree 6/7 in the * interval (2,3). Large arguments are handled by Stirling's * formula. Large negative arguments are made positive using * a reflection formula. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -34, 34 10000 1.3e-16 2.5e-17 * IEEE -170,-33 20000 2.3e-15 3.3e-16 * IEEE -33, 33 20000 9.4e-16 2.2e-16 * IEEE 33, 171.6 20000 2.3e-15 3.2e-16 * * Error for arguments outside the test range will be larger * owing to error amplification by the exponential function. * */ /* lgam() * * Natural logarithm of gamma function * * * * SYNOPSIS: * * double x, y, lgam(); * extern int sgngam; * * y = lgam( x ); * * * * DESCRIPTION: * * Returns the base e (2.718...) logarithm of the absolute * value of the gamma function of the argument. * The sign (+1 or -1) of the gamma function is returned in a * global (extern) variable named sgngam. * * For arguments greater than 13, the logarithm of the gamma * function is approximated by the logarithmic version of * Stirling's formula using a polynomial approximation of * degree 4. Arguments between -33 and +33 are reduced by * recurrence to the interval [2,3] of a rational approximation. * The cosecant reflection formula is employed for arguments * less than -33. * * Arguments greater than MAXLGM return MAXNUM and an error * message. MAXLGM = 2.035093e36 for DEC * arithmetic or 2.556348e305 for IEEE arithmetic. * * * * ACCURACY: * * * arithmetic domain # trials peak rms * DEC 0, 3 7000 5.2e-17 1.3e-17 * DEC 2.718, 2.035e36 5000 3.9e-17 9.9e-18 * IEEE 0, 3 28000 5.4e-16 1.1e-16 * IEEE 2.718, 2.556e305 40000 3.5e-16 8.3e-17 * The error criterion was relative when the function magnitude * was greater than one but absolute when it was less than one. * * The following test used the relative error criterion, though * at certain points the relative error could be much higher than * indicated. * IEEE -200, -4 10000 4.8e-16 1.3e-16 * */ /* gamma.c */ /* gamma function */ /* Cephes Math Library Release 2.2: July, 1992 Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK static double P[] = { 1.60119522476751861407E-4, 1.19135147006586384913E-3, 1.04213797561761569935E-2, 4.76367800457137231464E-2, 2.07448227648435975150E-1, 4.94214826801497100753E-1, 9.99999999999999996796E-1 }; static double Q[] = { -2.31581873324120129819E-5, 5.39605580493303397842E-4, -4.45641913851797240494E-3, 1.18139785222060435552E-2, 3.58236398605498653373E-2, -2.34591795718243348568E-1, 7.14304917030273074085E-2, 1.00000000000000000320E0 }; #define MAXGAM 171.624376956302725 #ifndef HAVE_LGAMMA static double LOGPI = 1.14472988584940017414; #endif #endif #ifdef DEC static unsigned short P[] = { 0035047,0162701,0146301,0005234, 0035634,0023437,0032065,0176530, 0036452,0137157,0047330,0122574, 0037103,0017310,0143041,0017232, 0037524,0066516,0162563,0164605, 0037775,0004671,0146237,0014222, 0040200,0000000,0000000,0000000 }; static unsigned short Q[] = { 0134302,0041724,0020006,0116565, 0035415,0072121,0044251,0025634, 0136222,0003447,0035205,0121114, 0036501,0107552,0154335,0104271, 0037022,0135717,0014776,0171471, 0137560,0034324,0165024,0037021, 0037222,0045046,0047151,0161213, 0040200,0000000,0000000,0000000 }; #define MAXGAM 34.84425627277176174 #ifndef HAVE_LGAMMA static union us2d_t LPI = { {0040222,0103202,0043475,0006750} }; #define LOGPI LPI.d #endif #endif #ifdef IBMPC static unsigned short P[] = { 0x2153,0x3998,0xfcb8,0x3f24, 0xbfab,0xe686,0x84e3,0x3f53, 0x14b0,0xe9db,0x57cd,0x3f85, 0x23d3,0x18c4,0x63d9,0x3fa8, 0x7d31,0xdcae,0x8da9,0x3fca, 0xe312,0x3993,0xa137,0x3fdf, 0x0000,0x0000,0x0000,0x3ff0 }; static unsigned short Q[] = { 0xd3af,0x8400,0x487a,0xbef8, 0x2573,0x2915,0xae8a,0x3f41, 0xb44a,0xe750,0x40e4,0xbf72, 0xb117,0x5b1b,0x31ed,0x3f88, 0xde67,0xe33f,0x5779,0x3fa2, 0x87c2,0x9d42,0x071a,0xbfce, 0x3c51,0xc9cd,0x4944,0x3fb2, 0x0000,0x0000,0x0000,0x3ff0 }; #define MAXGAM 171.624376956302725 #ifndef HAVE_LGAMMA static union us2d_t LPI = { { 0xa1bd,0x48e7,0x50d0,0x3ff2} }; #define LOGPI LPI.d #endif #endif #ifdef MIEEE static unsigned short P[] = { 0x3f24,0xfcb8,0x3998,0x2153, 0x3f53,0x84e3,0xe686,0xbfab, 0x3f85,0x57cd,0xe9db,0x14b0, 0x3fa8,0x63d9,0x18c4,0x23d3, 0x3fca,0x8da9,0xdcae,0x7d31, 0x3fdf,0xa137,0x3993,0xe312, 0x3ff0,0x0000,0x0000,0x0000 }; static unsigned short Q[] = { 0xbef8,0x487a,0x8400,0xd3af, 0x3f41,0xae8a,0x2915,0x2573, 0xbf72,0x40e4,0xe750,0xb44a, 0x3f88,0x31ed,0x5b1b,0xb117, 0x3fa2,0x5779,0xe33f,0xde67, 0xbfce,0x071a,0x9d42,0x87c2, 0x3fb2,0x4944,0xc9cd,0x3c51, 0x3ff0,0x0000,0x0000,0x0000 }; #define MAXGAM 171.624376956302725 #ifndef HAVE_LGAMMA static union us2d_t LPI = { { 0x3ff2,0x50d0,0x48e7,0xa1bd} }; #define LOGPI LPI.d #endif #endif /* Stirling's formula for the gamma function */ #if UNK static double STIR[5] = { 7.87311395793093628397E-4, -2.29549961613378126380E-4, -2.68132617805781232825E-3, 3.47222221605458667310E-3, 8.33333333333482257126E-2, }; #define MAXSTIR 143.01608 static double SQTPI = 2.50662827463100050242E0; #endif #if DEC static unsigned short STIR[20] = { 0035516,0061622,0144553,0112224, 0135160,0131531,0037460,0165740, 0136057,0134460,0037242,0077270, 0036143,0107070,0156306,0027751, 0037252,0125252,0125252,0146064, }; #define MAXSTIR 26.77 static union us2d_t SQT = { {0040440,0066230,0177661,0034055} }; #define SQTPI SQT.d #endif #if IBMPC static unsigned short STIR[20] = { 0x7293,0x592d,0xcc72,0x3f49, 0x1d7c,0x27e6,0x166b,0xbf2e, 0x4fd7,0x07d4,0xf726,0xbf65, 0xc5fd,0x1b98,0x71c7,0x3f6c, 0x5986,0x5555,0x5555,0x3fb5, }; #define MAXSTIR 143.01608 static union us2d_t SQT = { { 0x2706,0x1ff6,0x0d93,0x4004} }; #define SQTPI SQT.d #endif #if MIEEE static unsigned short STIR[20] = { 0x3f49,0xcc72,0x592d,0x7293, 0xbf2e,0x166b,0x27e6,0x1d7c, 0xbf65,0xf726,0x07d4,0x4fd7, 0x3f6c,0x71c7,0x1b98,0xc5fd, 0x3fb5,0x5555,0x5555,0x5986, }; #define MAXSTIR 143.01608 static union us2d_t SQT = { { 0x4004,0x0d93,0x1ff6,0x2706} }; #define SQTPI SQT.d #endif extern double MAXLOG, MAXNUM, PI; #ifdef INFINITIES extern double INFINITY; #endif #ifdef NANS extern double NAN; #endif /* Gamma function computed by Stirling's formula. * The polynomial STIR is valid for 33 <= x <= 172. */ static double stirf(x) double x; { double y, w, v; w = 1.0/x; w = 1.0 + w * polevl( w, STIR, 4 ); y = exp(x); if( x > MAXSTIR ) { /* Avoid overflow in pow() */ v = pow( x, 0.5 * x - 0.25 ); y = v * (v / y); } else { y = pow( x, x - 0.5 ) / y; } y = SQTPI * y * w; return( y ); } #ifndef HAVE_LGAMMA int sgngam = 0; #endif double true_gamma(x) double x; { double p, q, z; int i; sgngam = 1; #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES #ifdef NANS if( x == INFINITY ) return(x); if( x == -INFINITY ) return(NAN); #else if( !finite(x) ) return(x); #endif #endif q = fabs(x); if( q > 33.0 ) { if( x < 0.0 ) { p = floor(q); if( p == q ) { #ifdef NANS gamnan: mtherr( "gamma", DOMAIN ); return (NAN); #else goto goverf; #endif } i = p; if( (i & 1) == 0 ) sgngam = -1; z = q - p; if( z > 0.5 ) { p += 1.0; z = q - p; } z = q * sin( PI * z ); if( z == 0.0 ) { #ifdef INFINITIES return( sgngam * INFINITY); #else goverf: mtherr( "gamma", OVERFLOW ); return( sgngam * MAXNUM); #endif } z = fabs(z); z = PI/(z * stirf(q) ); } else { z = stirf(x); } return( sgngam * z ); } z = 1.0; while( x >= 3.0 ) { x -= 1.0; z *= x; } while( x < 0.0 ) { if( x > -1.E-9 ) goto small; z /= x; x += 1.0; } while( x < 2.0 ) { if( x < 1.e-9 ) goto small; z /= x; x += 1.0; } if( x == 2.0 ) return(z); x -= 2.0; p = polevl( x, P, 6 ); q = polevl( x, Q, 7 ); return( z * p / q ); small: if( x == 0.0 ) { #ifdef INFINITIES #ifdef NANS goto gamnan; #else return( INFINITY ); #endif #else mtherr( "gamma", SING ); return( MAXNUM ); #endif } else return( z/((1.0 + 0.5772156649015329 * x) * x) ); } #ifndef HAVE_LGAMMA /* A[]: Stirling's formula expansion of log gamma * B[], C[]: log gamma function between 2 and 3 */ #ifdef UNK static double A[] = { 8.11614167470508450300E-4, -5.95061904284301438324E-4, 7.93650340457716943945E-4, -2.77777777730099687205E-3, 8.33333333333331927722E-2 }; static double B[] = { -1.37825152569120859100E3, -3.88016315134637840924E4, -3.31612992738871184744E5, -1.16237097492762307383E6, -1.72173700820839662146E6, -8.53555664245765465627E5 }; static double C[] = { /* 1.00000000000000000000E0, */ -3.51815701436523470549E2, -1.70642106651881159223E4, -2.20528590553854454839E5, -1.13933444367982507207E6, -2.53252307177582951285E6, -2.01889141433532773231E6 }; /* log( sqrt( 2*pi ) ) */ static double LS2PI = 0.91893853320467274178; #define MAXLGM 2.556348e305 #endif #ifdef DEC static unsigned short A[] = { 0035524,0141201,0034633,0031405, 0135433,0176755,0126007,0045030, 0035520,0006371,0003342,0172730, 0136066,0005540,0132605,0026407, 0037252,0125252,0125252,0125132 }; static unsigned short B[] = { 0142654,0044014,0077633,0035410, 0144027,0110641,0125335,0144760, 0144641,0165637,0142204,0047447, 0145215,0162027,0146246,0155211, 0145322,0026110,0010317,0110130, 0145120,0061472,0120300,0025363 }; static unsigned short C[] = { /*0040200,0000000,0000000,0000000*/ 0142257,0164150,0163630,0112622, 0143605,0050153,0156116,0135272, 0144527,0056045,0145642,0062332, 0145213,0012063,0106250,0001025, 0145432,0111254,0044577,0115142, 0145366,0071133,0050217,0005122 }; /* log( sqrt( 2*pi ) ) */ static union us2d_t LS2P = { {040153,037616,041445,0172645}}; #define LS2PI LS2P.d #define MAXLGM 2.035093e36 #endif #ifdef IBMPC static unsigned short A[] = { 0x6661,0x2733,0x9850,0x3f4a, 0xe943,0xb580,0x7fbd,0xbf43, 0x5ebb,0x20dc,0x019f,0x3f4a, 0xa5a1,0x16b0,0xc16c,0xbf66, 0x554b,0x5555,0x5555,0x3fb5 }; static unsigned short B[] = { 0x6761,0x8ff3,0x8901,0xc095, 0xb93e,0x355b,0xf234,0xc0e2, 0x89e5,0xf890,0x3d73,0xc114, 0xdb51,0xf994,0xbc82,0xc131, 0xf20b,0x0219,0x4589,0xc13a, 0x055e,0x5418,0x0c67,0xc12a }; static unsigned short C[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x12b2,0x1cf3,0xfd0d,0xc075, 0xd757,0x7b89,0xaa0d,0xc0d0, 0x4c9b,0xb974,0xeb84,0xc10a, 0x0043,0x7195,0x6286,0xc131, 0xf34c,0x892f,0x5255,0xc143, 0xe14a,0x6a11,0xce4b,0xc13e }; /* log( sqrt( 2*pi ) ) */ static union us2d_t LS2P = { { 0xbeb5,0xc864,0x67f1,0x3fed} }; #define LS2PI LS2P.d #define MAXLGM 2.556348e305 #endif #ifdef MIEEE static unsigned short A[] = { 0x3f4a,0x9850,0x2733,0x6661, 0xbf43,0x7fbd,0xb580,0xe943, 0x3f4a,0x019f,0x20dc,0x5ebb, 0xbf66,0xc16c,0x16b0,0xa5a1, 0x3fb5,0x5555,0x5555,0x554b }; static unsigned short B[] = { 0xc095,0x8901,0x8ff3,0x6761, 0xc0e2,0xf234,0x355b,0xb93e, 0xc114,0x3d73,0xf890,0x89e5, 0xc131,0xbc82,0xf994,0xdb51, 0xc13a,0x4589,0x0219,0xf20b, 0xc12a,0x0c67,0x5418,0x055e }; static unsigned short C[] = { 0xc075,0xfd0d,0x1cf3,0x12b2, 0xc0d0,0xaa0d,0x7b89,0xd757, 0xc10a,0xeb84,0xb974,0x4c9b, 0xc131,0x6286,0x7195,0x0043, 0xc143,0x5255,0x892f,0xf34c, 0xc13e,0xce4b,0x6a11,0xe14a }; /* log( sqrt( 2*pi ) ) */ static union us2d_t LS2P = { { 0x3fed,0x67f1,0xc864,0xbeb5} }; #define LS2PI LS2P.d #define MAXLGM 2.556348e305 #endif /* Logarithm of gamma function */ double lgam(x) double x; { double p, q, u, w, z; int i; sgngam = 1; #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES if( !finite(x) ) return(INFINITY); #endif if( x < -34.0 ) { q = -x; w = lgam(q); /* note this modifies sgngam! */ p = floor(q); if( p == q ) { lgsing: #ifdef INFINITIES mtherr( "lgam", SING ); return (INFINITY); #else goto loverf; #endif } i = p; if( (i & 1) == 0 ) sgngam = -1; else sgngam = 1; z = q - p; if( z > 0.5 ) { p += 1.0; z = p - q; } z = q * sin( PI * z ); if( z == 0.0 ) goto lgsing; z = LOGPI - log( z ) - w; return( z ); } if( x < 13.0 ) { z = 1.0; p = 0.0; u = x; while( u >= 3.0 ) { p -= 1.0; u = x + p; z *= u; } while( u < 2.0 ) { if( u == 0.0 ) goto lgsing; z /= u; p += 1.0; u = x + p; } if( z < 0.0 ) { sgngam = -1; z = -z; } else sgngam = 1; if( u == 2.0 ) return( log(z) ); p -= 2.0; x = x + p; p = x * polevl( x, B, 5 ) / p1evl( x, C, 6); return( log(z) + p ); } if( x > MAXLGM ) { #ifdef INFINITIES return( sgngam * INFINITY ); #else loverf: mtherr( "lgam", OVERFLOW ); return( sgngam * MAXNUM ); #endif } q = ( x - 0.5 ) * log(x) - x + LS2PI; if( x > 1.0e8 ) return( q ); p = 1.0/(x*x); if( x >= 1000.0 ) q += (( 7.9365079365079365079365e-4 * p - 2.7777777777777777777778e-3) *p + 0.0833333333333333333333) / x; else q += polevl( p, A, 4 ) / x; return( q ); } #endif /* HAVE_LGAMMA */ grace-5.1.23/cephes/kn.c0000644000076500001440000001006006626627164014467 0ustar fnevgenyusers/* kn.c * * Modified Bessel function, third kind, integer order * * * * SYNOPSIS: * * double x, y, kn(); * int n; * * y = kn( n, x ); * * * * DESCRIPTION: * * Returns modified Bessel function of the third kind * of order n of the argument. * * The range is partitioned into the two intervals [0,9.55] and * (9.55, infinity). An ascending power series is used in the * low range, and an asymptotic expansion in the high range. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,30 3000 1.3e-9 5.8e-11 * IEEE 0,30 90000 1.8e-8 3.0e-10 * * Error is high only near the crossover point x = 9.55 * between the two expansions used. */ /* Cephes Math Library Release 2.1: November, 1988 Copyright 1984, 1987, 1988 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ /* Algorithm for Kn. n-1 -n - (n-k-1)! 2 k K (x) = 0.5 (x/2) > -------- (-x /4) n - k! k=0 inf. 2 k n n - (x /4) + (-1) 0.5(x/2) > {p(k+1) + p(n+k+1) - 2log(x/2)} --------- - k! (n+k)! k=0 where p(m) is the psi function: p(1) = -EUL and m-1 - p(m) = -EUL + > 1/k - k=1 For large x, 2 2 2 u-1 (u-1 )(u-3 ) K (z) = sqrt(pi/2z) exp(-z) { 1 + ------- + ------------ + ...} v 1 2 1! (8z) 2! (8z) asymptotically, where 2 u = 4 v . */ #include "mconf.h" #include "cephes.h" #define EUL 5.772156649015328606065e-1 #define MAXFAC 31 extern double MACHEP, MAXNUM, MAXLOG, PI; double kn( nn, x ) int nn; double x; { double k, kf, nk1f, nkf, zn, t, s, z0, z; double ans, fn, pn, pk, zmn, tlg, tox; int i, n; if( nn < 0 ) n = -nn; else n = nn; if( n > MAXFAC ) { overf: mtherr( "kn", OVERFLOW ); return( MAXNUM ); } if( x <= 0.0 ) { if( x < 0.0 ) mtherr( "kn", DOMAIN ); else mtherr( "kn", SING ); return( MAXNUM ); } if( x > 9.55 ) goto asymp; ans = 0.0; z0 = 0.25 * x * x; fn = 1.0; pn = 0.0; zmn = 1.0; tox = 2.0/x; if( n > 0 ) { /* compute factorial of n and psi(n) */ pn = -EUL; k = 1.0; for( i=1; i 1.0) && ((MAXNUM/tox) < zmn) ) goto overf; zmn *= tox; } s *= 0.5; t = fabs(s); if( (zmn > 1.0) && ((MAXNUM/zmn) < t) ) goto overf; if( (t > 1.0) && ((MAXNUM/t) < zmn) ) goto overf; ans = s * zmn; } } tlg = 2.0 * log( 0.5 * x ); pk = -EUL; if( n == 0 ) { pn = pk; t = 1.0; } else { pn = pn + 1.0/n; t = 1.0/fn; } s = (pk+pn-tlg)*t; k = 1.0; do { t *= z0 / (k * (k+n)); pk += 1.0/k; pn += 1.0/(k+n); s += (pk+pn-tlg)*t; k += 1.0; } while( fabs(t/s) > MACHEP ); s = 0.5 * s / zmn; if( n & 1 ) s = -s; ans += s; return(ans); /* Asymptotic expansion for Kn(x) */ /* Converges to 1.4e-17 for x > 18.4 */ asymp: if( x > MAXLOG ) { mtherr( "kn", UNDERFLOW ); return(0.0); } k = n; pn = 4.0 * k * k; pk = 1.0; z0 = 8.0 * x; fn = 1.0; t = 1.0; s = t; nkf = MAXNUM; i = 0; do { z = pn - pk * pk; t = t * z /(fn * z0); nk1f = fabs(t); if( (i >= n) && (nk1f > nkf) ) { goto adone; } nkf = nk1f; s += t; fn += 1.0; pk += 2.0; i += 1; } while( fabs(t/s) > MACHEP ); adone: ans = exp(-x) * sqrt( PI/(2.0*x) ) * s; return(ans); } grace-5.1.23/cephes/fac.c0000644000076500001440000001360206626627164014615 0ustar fnevgenyusers/* fac.c * * Factorial function * * * * SYNOPSIS: * * double y, fac(); * int i; * * y = fac( i ); * * * * DESCRIPTION: * * Returns factorial of i = 1 * 2 * 3 * ... * i. * fac(0) = 1.0. * * Due to machine arithmetic bounds the largest value of * i accepted is 33 in DEC arithmetic or 170 in IEEE * arithmetic. Greater values, or negative ones, * produce an error message and return MAXNUM. * * * * ACCURACY: * * For i < 34 the values are simply tabulated, and have * full machine accuracy. If i > 55, fac(i) = true_gamma(i+1); * see gamma.c. * * Relative error: * arithmetic domain peak * IEEE 0, 170 1.4e-15 * DEC 0, 33 1.4e-17 * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Factorials of integers from 0 through 33 */ #ifdef UNK static double factbl[] = { 1.00000000000000000000E0, 1.00000000000000000000E0, 2.00000000000000000000E0, 6.00000000000000000000E0, 2.40000000000000000000E1, 1.20000000000000000000E2, 7.20000000000000000000E2, 5.04000000000000000000E3, 4.03200000000000000000E4, 3.62880000000000000000E5, 3.62880000000000000000E6, 3.99168000000000000000E7, 4.79001600000000000000E8, 6.22702080000000000000E9, 8.71782912000000000000E10, 1.30767436800000000000E12, 2.09227898880000000000E13, 3.55687428096000000000E14, 6.40237370572800000000E15, 1.21645100408832000000E17, 2.43290200817664000000E18, 5.10909421717094400000E19, 1.12400072777760768000E21, 2.58520167388849766400E22, 6.20448401733239439360E23, 1.55112100433309859840E25, 4.03291461126605635584E26, 1.0888869450418352160768E28, 3.04888344611713860501504E29, 8.841761993739701954543616E30, 2.6525285981219105863630848E32, 8.22283865417792281772556288E33, 2.6313083693369353016721801216E35, 8.68331761881188649551819440128E36 }; #define MAXFAC 33 #endif #ifdef DEC static unsigned short factbl[] = { 0040200,0000000,0000000,0000000, 0040200,0000000,0000000,0000000, 0040400,0000000,0000000,0000000, 0040700,0000000,0000000,0000000, 0041300,0000000,0000000,0000000, 0041760,0000000,0000000,0000000, 0042464,0000000,0000000,0000000, 0043235,0100000,0000000,0000000, 0044035,0100000,0000000,0000000, 0044661,0030000,0000000,0000000, 0045535,0076000,0000000,0000000, 0046430,0042500,0000000,0000000, 0047344,0063740,0000000,0000000, 0050271,0112146,0000000,0000000, 0051242,0060731,0040000,0000000, 0052230,0035673,0126000,0000000, 0053230,0035673,0126000,0000000, 0054241,0137567,0063300,0000000, 0055265,0173546,0051630,0000000, 0056330,0012711,0101504,0100000, 0057407,0006635,0171012,0150000, 0060461,0040737,0046656,0030400, 0061563,0135223,0005317,0101540, 0062657,0027031,0127705,0023155, 0064003,0061223,0041723,0156322, 0065115,0045006,0014773,0004410, 0066246,0146044,0172433,0173526, 0067414,0136077,0027317,0114261, 0070566,0044556,0110753,0045465, 0071737,0031214,0032075,0036050, 0073121,0037543,0070371,0064146, 0074312,0132550,0052561,0116443, 0075512,0132550,0052561,0116443, 0076721,0005423,0114035,0025014 }; #define MAXFAC 33 #endif #ifdef IBMPC static unsigned short factbl[] = { 0x0000,0x0000,0x0000,0x3ff0, 0x0000,0x0000,0x0000,0x3ff0, 0x0000,0x0000,0x0000,0x4000, 0x0000,0x0000,0x0000,0x4018, 0x0000,0x0000,0x0000,0x4038, 0x0000,0x0000,0x0000,0x405e, 0x0000,0x0000,0x8000,0x4086, 0x0000,0x0000,0xb000,0x40b3, 0x0000,0x0000,0xb000,0x40e3, 0x0000,0x0000,0x2600,0x4116, 0x0000,0x0000,0xaf80,0x414b, 0x0000,0x0000,0x08a8,0x4183, 0x0000,0x0000,0x8cfc,0x41bc, 0x0000,0xc000,0x328c,0x41f7, 0x0000,0x2800,0x4c3b,0x4234, 0x0000,0x7580,0x0777,0x4273, 0x0000,0x7580,0x0777,0x42b3, 0x0000,0xecd8,0x37ee,0x42f4, 0x0000,0xca73,0xbeec,0x4336, 0x9000,0x3068,0x02b9,0x437b, 0x5a00,0xbe41,0xe1b3,0x43c0, 0xc620,0xe9b5,0x283b,0x4406, 0xf06c,0x6159,0x7752,0x444e, 0xa4ce,0x35f8,0xe5c3,0x4495, 0x7b9a,0x687a,0x6c52,0x44e0, 0x6121,0xc33f,0xa940,0x4529, 0x7eeb,0x9ea3,0xd984,0x4574, 0xf316,0xe5d9,0x9787,0x45c1, 0x6967,0xd23d,0xc92d,0x460e, 0xa785,0x8687,0xe651,0x465b, 0x2d0d,0x6e1f,0x27ec,0x46aa, 0x33a4,0x0aae,0x56ad,0x46f9, 0x33a4,0x0aae,0x56ad,0x4749, 0xa541,0x7303,0x2162,0x479a }; #define MAXFAC 170 #endif #ifdef MIEEE static unsigned short factbl[] = { 0x3ff0,0x0000,0x0000,0x0000, 0x3ff0,0x0000,0x0000,0x0000, 0x4000,0x0000,0x0000,0x0000, 0x4018,0x0000,0x0000,0x0000, 0x4038,0x0000,0x0000,0x0000, 0x405e,0x0000,0x0000,0x0000, 0x4086,0x8000,0x0000,0x0000, 0x40b3,0xb000,0x0000,0x0000, 0x40e3,0xb000,0x0000,0x0000, 0x4116,0x2600,0x0000,0x0000, 0x414b,0xaf80,0x0000,0x0000, 0x4183,0x08a8,0x0000,0x0000, 0x41bc,0x8cfc,0x0000,0x0000, 0x41f7,0x328c,0xc000,0x0000, 0x4234,0x4c3b,0x2800,0x0000, 0x4273,0x0777,0x7580,0x0000, 0x42b3,0x0777,0x7580,0x0000, 0x42f4,0x37ee,0xecd8,0x0000, 0x4336,0xbeec,0xca73,0x0000, 0x437b,0x02b9,0x3068,0x9000, 0x43c0,0xe1b3,0xbe41,0x5a00, 0x4406,0x283b,0xe9b5,0xc620, 0x444e,0x7752,0x6159,0xf06c, 0x4495,0xe5c3,0x35f8,0xa4ce, 0x44e0,0x6c52,0x687a,0x7b9a, 0x4529,0xa940,0xc33f,0x6121, 0x4574,0xd984,0x9ea3,0x7eeb, 0x45c1,0x9787,0xe5d9,0xf316, 0x460e,0xc92d,0xd23d,0x6967, 0x465b,0xe651,0x8687,0xa785, 0x46aa,0x27ec,0x6e1f,0x2d0d, 0x46f9,0x56ad,0x0aae,0x33a4, 0x4749,0x56ad,0x0aae,0x33a4, 0x479a,0x2162,0x7303,0xa541 }; #define MAXFAC 170 #endif extern double MAXNUM; double fac(i) int i; { double x, f, n; int j; if( i < 0 ) { mtherr( "fac", SING ); return( MAXNUM ); } if( i > MAXFAC ) { mtherr( "fac", OVERFLOW ); return( MAXNUM ); } /* Get answer from table for small i. */ if( i < 34 ) { #ifdef UNK return( factbl[i] ); #else return( *(double *)(&factbl[4*i]) ); #endif } /* Use gamma function for large i. */ if( i > 55 ) { x = i + 1; return( true_gamma(x) ); } /* Compute directly for intermediate i. */ n = 34.0; f = 34.0; for( j=35; j<=i; j++ ) { n += 1.0; f *= n; } #ifdef UNK f *= factbl[33]; #else f *= *(double *)(&factbl[4*33]); #endif return( f ); } grace-5.1.23/cephes/cephes.h0000644000076500001440000000731310505257152015325 0ustar fnevgenyusers/* * Prototypes of Cephes functions */ /* Variable for error reporting. See mtherr.c. */ extern int merror; extern int airy ( double x, double *ai, double *aip, double *bi, double *bip ); extern double beta ( double a, double b ); extern double lbeta ( double a, double b ); extern double chdtrc ( double df, double x ); extern double chdtr ( double df, double x ); extern double chdtri ( double df, double y ); extern double dawsn ( double xx ); extern double ellie ( double phi, double m ); extern double ellik ( double phi, double m ); extern double ellpe ( double x ); extern double ellpk ( double x ); extern double expn ( int n, double x ); extern double fac ( int i ); extern double fdtrc ( int ia, int ib, double x ); extern double fdtr ( int ia, int ib, double x ); extern double fdtri ( int ia, int ib, double y ); extern double frexp ( double x, int *pw2 ); extern double ldexp ( double x, int pw2 ); extern int fresnl ( double xxa, double *ssa, double *cca ); extern double gdtr ( double a, double b, double x ); extern double gdtrc ( double a, double b, double x ); extern double hyp2f0 ( double a, double b, double x, int type, double *err ); extern double hyp2f1 ( double a, double b, double c, double x ); extern double hyperg ( double a, double b, double x ); extern double i0 ( double x ); extern double i0e ( double x ); extern double i1 ( double x ); extern double i1e ( double x ); extern double iv ( double v, double x ); extern double igamc ( double a, double x ); extern double igam ( double a, double x ); extern double igami ( double a, double y0 ); extern double incbet ( double aa, double bb, double xx ); extern double incbi ( double aa, double bb, double yy0 ); extern double jv ( double n, double x ); extern double k0 ( double x ); extern double k0e ( double x ); extern double k1 ( double x ); extern double k1e ( double x ); extern double kn ( int nn, double x ); extern int mtherr ( char *name, int code ); extern double ndtr ( double a ); extern double ndtri ( double y0 ); extern double pdtrc ( int k, double m ); extern double pdtr ( int k, double m ); extern double pdtri ( int k, double y ); extern double psi ( double x ); extern void revers ( double y[], double x[], int n ); extern double true_gamma ( double x ); extern double rgamma ( double x ); extern int shichi ( double x, double *si, double *ci ); extern int sici ( double x, double *si, double *ci ); extern double spence ( double x ); extern double stdtr ( int k, double t ); extern double stdtri ( int k, double p ); extern double onef2 ( double a, double b, double c, double x, double *err ); extern double threef0 ( double a, double b, double c, double x, double *err ); extern double struve ( double v, double x ); extern double log1p ( double x ); extern double expm1 ( double x ); extern double cosm1 ( double x ); extern double yv ( double v, double x ); extern double zeta ( double x, double q ); extern double zetac ( double x ); extern double chbevl ( double x, void *P, int n ); extern double polevl ( double x, void *P, int n ); extern double p1evl ( double x, void *P, int n ); /* polyn.c */ extern void polini ( int maxdeg ); extern void polprt ( double a[], int na, int d ); extern void polclr ( double *a, int n ); extern void polmov ( double *a, int na, double *b ); extern void polmul ( double a[], int na, double b[], int nb, double c[] ); extern void poladd ( double a[], int na, double b[], int nb, double c[] ); extern void polsub ( double a[], int na, double b[], int nb, double c[] ); extern int poldiv ( double a[], int na, double b[], int nb, double c[] ); extern void polsbt ( double a[], int na, double b[], int nb, double c[] ); extern double poleva ( double a[], int na, double x ); union us2d_t { unsigned short us[4]; double d; }; grace-5.1.23/cephes/zeta.c0000644000076500001440000000615306626627164015032 0ustar fnevgenyusers/* zeta.c * * Riemann zeta function of two arguments * * * * SYNOPSIS: * * double x, q, y, zeta(); * * y = zeta( x, q ); * * * * DESCRIPTION: * * * * inf. * - -x * zeta(x,q) = > (k+q) * - * k=0 * * where x > 1 and q is not a negative integer or zero. * The Euler-Maclaurin summation formula is used to obtain * the expansion * * n * - -x * zeta(x,q) = > (k+q) * - * k=1 * * 1-x inf. B x(x+1)...(x+2j) * (n+q) 1 - 2j * + --------- - ------- + > -------------------- * x-1 x - x+2j+1 * 2(n+q) j=1 (2j)! (n+q) * * where the B2j are Bernoulli numbers. Note that (see zetac.c) * zeta(x,1) = zetac(x) + 1. * * * * ACCURACY: * * * * REFERENCE: * * Gradshteyn, I. S., and I. M. Ryzhik, Tables of Integrals, * Series, and Products, p. 1073; Academic Press, 1980. * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double MAXNUM, MACHEP; /* Expansion coefficients * for Euler-Maclaurin summation formula * (2k)! / B2k * where B2k are Bernoulli numbers */ static double A[] = { 12.0, -720.0, 30240.0, -1209600.0, 47900160.0, -1.8924375803183791606e9, /*1.307674368e12/691*/ 7.47242496e10, -2.950130727918164224e12, /*1.067062284288e16/3617*/ 1.1646782814350067249e14, /*5.109094217170944e18/43867*/ -4.5979787224074726105e15, /*8.028576626982912e20/174611*/ 1.8152105401943546773e17, /*1.5511210043330985984e23/854513*/ -7.1661652561756670113e18 /*1.6938241367317436694528e27/236364091*/ }; /* 30 Nov 86 -- error in third coefficient fixed */ double zeta(x,q) double x,q; { int i; double a, b, k, s, t, w; if( x == 1.0 ) goto retinf; if( x < 1.0 ) { domerr: mtherr( "zeta", DOMAIN ); return(0.0); } if( q <= 0.0 ) { if(q == floor(q)) { mtherr( "zeta", SING ); retinf: return( MAXNUM ); } if( x != floor(x) ) goto domerr; /* because q^-x not defined */ } /* Euler-Maclaurin summation formula */ /* if( x < 25.0 ) */ { /* Permit negative q but continue sum until n+q > +9 . * This case should be handled by a reflection formula. * If q<0 and x is an integer, there is a relation to * the polygamma function. */ s = pow( q, -x ); a = q; i = 0; b = 0.0; while( (i < 9) || (a <= 9.0) ) { i += 1; a += 1.0; b = pow( a, -x ); s += b; if( fabs(b/s) < MACHEP ) goto done; } w = a; s += b*w/(x-1.0); s -= 0.5 * b; a = 1.0; k = 0.0; for( i=0; i<12; i++ ) { a *= x + k; b /= w; t = a*b/A[i]; s = s + t; t = fabs(t/s); if( t < MACHEP ) goto done; k += 1.0; a *= x + k; b /= w; k += 1.0; } done: return(s); } /* Basic sum of inverse powers */ /* pseres: s = pow( q, -x ); a = q; do { a += 2.0; b = pow( a, -x ); s += b; } while( b/s > MACHEP ); b = pow( 2.0, -x ); s = (s + b)/(1.0-b); return(s); */ } grace-5.1.23/cephes/revers.c0000644000076500001440000000377706626627164015406 0ustar fnevgenyusers/* revers.c * * Reversion of power series * * * * SYNOPSIS: * * extern int MAXPOL; * int n; * double x[n+1], y[n+1]; * * polini(n); * revers( y, x, n ); * * Note, polini() initializes the polynomial arithmetic subroutines; * see polyn.c. * * * DESCRIPTION: * * If * * inf * - i * y(x) = > a x * - i * i=1 * * then * * inf * - j * x(y) = > A y , * - j * j=1 * * where * 1 * A = --- * 1 a * 1 * * etc. The coefficients of x(y) are found by expanding * * inf inf * - - i * x(y) = > A > a x * - j - i * j=1 i=1 * * and setting each coefficient of x , higher than the first, * to zero. * * * * RESTRICTIONS: * * y[0] must be zero, and y[1] must be nonzero. * */ /* Cephes Math Library Release 2.2: July, 1992 Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #include extern int MAXPOL; /* initialized by polini() */ /* See polyn.c. */ void polmov(), polclr(), poladd(), polmul(); void revers( y, x, n) double y[], x[]; int n; { double *yn, *yp, *ysum; int j; if( y[1] == 0.0 ) mtherr( "revers", DOMAIN ); /* printf( "revers: y[1] = 0\n" );*/ j = (MAXPOL + 1) * sizeof(double); yn = (double *)malloc(j); yp = (double *)malloc(j); ysum = (double *)malloc(j); polmov( y, n, yn ); polclr( ysum, n ); x[0] = 0.0; x[1] = 1.0/y[1]; for( j=2; j<=n; j++ ) { /* A_(j-1) times the expansion of y^(j-1) */ polmul( &x[j-1], 0, yn, n, yp ); /* The expansion of the sum of A_k y^k up to k=j-1 */ poladd( yp, n, ysum, n, ysum ); /* The expansion of y^j */ polmul( yn, n, y, n, yn ); /* The coefficient A_j to make the sum up to k=j equal to zero */ x[j] = -ysum[j]/yn[j]; } free(yn); free(yp); free(ysum); } grace-5.1.23/cephes/asinh.c0000644000076500001440000000547406626627164015176 0ustar fnevgenyusers/* asinh.c * * Inverse hyperbolic sine * * * * SYNOPSIS: * * double x, y, asinh(); * * y = asinh( x ); * * * * DESCRIPTION: * * Returns inverse hyperbolic sine of argument. * * If |x| < 0.5, the function is approximated by a rational * form x + x**3 P(x)/Q(x). Otherwise, * * asinh(x) = log( x + sqrt(1 + x*x) ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -3,3 75000 4.6e-17 1.1e-17 * IEEE -1,1 30000 3.7e-16 7.8e-17 * IEEE 1,3 30000 2.5e-16 6.7e-17 * */ /* asinh.c */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_ASINH #ifdef UNK static double P[] = { -4.33231683752342103572E-3, -5.91750212056387121207E-1, -4.37390226194356683570E0, -9.09030533308377316566E0, -5.56682227230859640450E0 }; static double Q[] = { /* 1.00000000000000000000E0,*/ 1.28757002067426453537E1, 4.86042483805291788324E1, 6.95722521337257608734E1, 3.34009336338516356383E1 }; #endif #ifdef DEC static unsigned short P[] = { 0136215,0173033,0110410,0105475, 0140027,0076361,0020056,0164520, 0140613,0173401,0160136,0053142, 0141021,0070744,0000503,0176261, 0140662,0021550,0073106,0133351 }; static unsigned short Q[] = { /* 0040200,0000000,0000000,0000000,*/ 0041116,0001336,0034120,0173054, 0041502,0065300,0013144,0021231, 0041613,0022376,0035516,0153063, 0041405,0115216,0054265,0004557 }; #endif #ifdef IBMPC static unsigned short P[] = { 0x1168,0x7221,0xbec3,0xbf71, 0xdd2a,0x2405,0xef9e,0xbfe2, 0xcacc,0x3c0b,0x7ee0,0xc011, 0x7f96,0x8028,0x2e3c,0xc022, 0xd6dd,0x0ec8,0x446d,0xc016 }; static unsigned short Q[] = { /* 0x0000,0x0000,0x0000,0x3ff0,*/ 0x1ec5,0xc70a,0xc05b,0x4029, 0x8453,0x02cc,0x4d58,0x4048, 0xdac6,0xc769,0x649f,0x4051, 0xa12e,0xcb16,0xb351,0x4040 }; #endif #ifdef MIEEE static unsigned short P[] = { 0xbf71,0xbec3,0x7221,0x1168, 0xbfe2,0xef9e,0x2405,0xdd2a, 0xc011,0x7ee0,0x3c0b,0xcacc, 0xc022,0x2e3c,0x8028,0x7f96, 0xc016,0x446d,0x0ec8,0xd6dd }; static unsigned short Q[] = { 0x4029,0xc05b,0xc70a,0x1ec5, 0x4048,0x4d58,0x02cc,0x8453, 0x4051,0x649f,0xc769,0xdac6, 0x4040,0xb351,0xcb16,0xa12e }; #endif extern double LOGE2, INFINITY; double asinh(xx) double xx; { double a, z, x; int sign; #ifdef MINUSZERO if( xx == 0.0 ) return(xx); #endif if( xx < 0.0 ) { sign = -1; x = -xx; } else { sign = 1; x = xx; } if( x > 1.0e8 ) { #ifdef INFINITIES if( x == INFINITY ) return(xx); #endif return( sign * (log(x) + LOGE2) ); } z = x * x; if( x < 0.5 ) { a = ( polevl(z, P, 4)/p1evl(z, Q, 4) ) * z; a = a * x + x; if( sign < 0 ) a = -a; return(a); } a = sqrt( z + 1.0 ); return( sign * log(x + a) ); } #endif /* HAVE_ASINH */ grace-5.1.23/cephes/expn.c0000644000076500001440000000567106626627164015045 0ustar fnevgenyusers/* expn.c * * Exponential integral En * * * * SYNOPSIS: * * int n; * double x, y, expn(); * * y = expn( n, x ); * * * * DESCRIPTION: * * Evaluates the exponential integral * * inf. * - * | | -xt * | e * E (x) = | ---- dt. * n | n * | | t * - * 1 * * * Both n and x must be nonnegative. * * The routine employs either a power series, a continued * fraction, or an asymptotic formula depending on the * relative values of n and x. * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 30 5000 2.0e-16 4.6e-17 * IEEE 0, 30 10000 1.7e-15 3.6e-16 * */ /* expn.c */ /* Cephes Math Library Release 1.1: March, 1985 * Copyright 1985 by Stephen L. Moshier * Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #define EUL 0.57721566490153286060 #define BIG 1.44115188075855872E+17 extern double MAXNUM, MACHEP, MAXLOG; double expn( n, x ) int n; double x; { double ans, r, t, yk, xk; double pk, pkm1, pkm2, qk, qkm1, qkm2; double psi, z; int i, k; static double big = BIG; if( n < 0 ) goto domerr; if( x < 0 ) { domerr: mtherr( "expn", DOMAIN ); return( MAXNUM ); } if( x > MAXLOG ) return( 0.0 ); if( x == 0.0 ) { if( n < 2 ) { mtherr( "expn", SING ); return( MAXNUM ); } else return( 1.0/(n-1.0) ); } if( n == 0 ) return( exp(-x)/x ); /* expn.c */ /* Expansion for large n */ if( n > 5000 ) { xk = x + n; yk = 1.0 / (xk * xk); t = n; ans = yk * t * (6.0 * x * x - 8.0 * t * x + t * t); ans = yk * (ans + t * (t - 2.0 * x)); ans = yk * (ans + t); ans = (ans + 1.0) * exp( -x ) / xk; goto done; } if( x > 1.0 ) goto cfrac; /* expn.c */ /* Power series expansion */ psi = -EUL - log(x); for( i=1; i MACHEP ); k = xk; t = n; r = n - 1; ans = (pow(z, r) * psi / true_gamma(t)) - ans; goto done; /* expn.c */ /* continued fraction */ cfrac: k = 1; pkm2 = 1.0; qkm2 = x; pkm1 = 1.0; qkm1 = x + n; ans = pkm1/qkm1; do { k += 1; if( k & 1 ) { yk = 1.0; xk = n + (k-1)/2; } else { yk = x; xk = k/2; } pk = pkm1 * yk + pkm2 * xk; qk = qkm1 * yk + qkm2 * xk; if( qk != 0 ) { r = pk/qk; t = fabs( (ans - r)/r ); ans = r; } else t = 1.0; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; if( fabs(pk) > big ) { pkm2 /= big; pkm1 /= big; qkm2 /= big; qkm1 /= big; } } while( t > MACHEP ); ans *= exp( -x ); done: return( ans ); } grace-5.1.23/cephes/Make.dep0000644000076500001440000000016406626627164015266 0ustar fnevgenyusers# # Dependencies (should be generated automatically): # $(OBJS) : $(TOP)/config.h $(TOP)/cmath.h mconf.h cephes.h grace-5.1.23/cephes/jv.c0000644000076500001440000003415606626627164014512 0ustar fnevgenyusers/* jv.c * * Bessel function of noninteger order * * * * SYNOPSIS: * * double v, x, y, jv(); * * y = jv( v, x ); * * * * DESCRIPTION: * * Returns Bessel function of order v of the argument, * where v is real. Negative x is allowed if v is an integer. * * Several expansions are included: the ascending power * series, the Hankel expansion, and two transitional * expansions for large v. If v is not too large, it * is reduced by recurrence to a region of best accuracy. * The transitional expansions give 12D accuracy for v > 500. * * * * ACCURACY: * Results for integer v are indicated by *, where x and v * both vary from -125 to +125. Otherwise, * x ranges from 0 to 125, v ranges as indicated by "domain." * Error criterion is absolute, except relative when |jv()| > 1. * * arithmetic v domain x domain # trials peak rms * IEEE 0,125 0,125 100000 4.6e-15 2.2e-16 * IEEE -125,0 0,125 40000 5.4e-11 3.7e-13 * IEEE 0,500 0,500 20000 4.4e-15 4.0e-16 * Integer v: * IEEE -125,125 -125,125 50000 3.5e-15* 1.9e-16* * */ /* Cephes Math Library Release 2.2: July, 1992 Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #if defined(DEBUG) # undef DEBUG #endif #define DEBUG 0 #ifdef DEC #define MAXGAM 34.84425627277176174 #else #define MAXGAM 171.624376956302725 #endif static double recur(double *, double, double *, int); static double jvs(double, double); static double hankel(double, double); static double jnx(double, double); static double jnt(double, double); extern double MAXNUM, MACHEP, MINLOG, MAXLOG; #define BIG 1.44115188075855872E+17 int airy(); double jv( n, x ) double n, x; { double k, q, t, y, an; int i, sign, nint; nint = 0; /* Flag for integer n */ sign = 1; /* Flag for sign inversion */ an = fabs( n ); y = floor( an ); if( y == an ) { nint = 1; i = an - 16384.0 * floor( an/16384.0 ); if( n < 0.0 ) { if( i & 1 ) sign = -sign; n = an; } if( x < 0.0 ) { if( i & 1 ) sign = -sign; x = -x; } if( n == 0.0 ) return( j0(x) ); if( n == 1.0 ) return( sign * j1(x) ); } if( (x < 0.0) && (y != an) ) { mtherr( "Jv", DOMAIN ); y = 0.0; goto done; } y = fabs(x); if( y < MACHEP ) goto underf; k = 3.6 * sqrt(y); t = 3.6 * sqrt(an); if( (y < t) && (an > 21.0) ) return( sign * jvs(n,x) ); if( (an < k) && (y > 21.0) ) return( sign * hankel(n,x) ); if( an < 500.0 ) { /* Note: if x is too large, the continued * fraction will fail; but then the * Hankel expansion can be used. */ if( nint != 0 ) { k = 0.0; q = recur( &n, x, &k, 1 ); if( k == 0.0 ) { y = j0(x)/q; goto done; } if( k == 1.0 ) { y = j1(x)/q; goto done; } } if( an > 2.0 * y ) goto rlarger; if( (n >= 0.0) && (n < 20.0) && (y > 6.0) && (y < 20.0) ) { /* Recur backwards from a larger value of n */ rlarger: k = n; y = y + an + 1.0; if( y < 30.0 ) y = 30.0; y = n + floor(y-n); q = recur( &y, x, &k, 0 ); y = jvs(y,x) * q; goto done; } if( k <= 30.0 ) { k = 2.0; } else if( k < 90.0 ) { k = (3*k)/4; } if( an > (k + 3.0) ) { if( n < 0.0 ) k = -k; q = n - floor(n); k = floor(k) + q; if( n > 0.0 ) q = recur( &n, x, &k, 1 ); else { t = k; k = n; q = recur( &t, x, &k, 1 ); k = t; } if( q == 0.0 ) { underf: y = 0.0; goto done; } } else { k = n; q = 1.0; } /* boundary between convergence of * power series and Hankel expansion */ y = fabs(k); if( y < 26.0 ) t = (0.0083*y + 0.09)*y + 12.9; else t = 0.9 * y; if( x > t ) y = hankel(k,x); else y = jvs(k,x); #if DEBUG printf( "y = %.16e, recur q = %.16e\n", y, q ); #endif if( n > 0.0 ) y /= q; else y *= q; } else { /* For large n, use the uniform expansion * or the transitional expansion. * But if x is of the order of n**2, * these may blow up, whereas the * Hankel expansion will then work. */ if( n < 0.0 ) { mtherr( "Jv", TLOSS ); y = 0.0; goto done; } t = x/n; t /= n; if( t > 0.3 ) y = hankel(n,x); else y = jnx(n,x); } done: return( sign * y); } /* Reduce the order by backward recurrence. * AMS55 #9.1.27 and 9.1.73. */ static double recur( n, x, newn, cancel ) double *n; double x; double *newn; int cancel; { double pkm2, pkm1, pk, pkp1, qkm2, qkm1; double k, ans, qk, xk, yk, r, t, kf; static double big = BIG; int nflag, ctr; /* continued fraction for Jn(x)/Jn-1(x) */ if( *n < 0.0 ) nflag = 1; else nflag = 0; fstart: #if DEBUG printf( "recur: n = %.6e, newn = %.6e, cfrac = ", *n, *newn ); #endif pkm2 = 0.0; qkm2 = 1.0; pkm1 = x; qkm1 = *n + *n; xk = -x * x; yk = qkm1; ans = 1.0; ctr = 0; do { yk += 2.0; pk = pkm1 * yk + pkm2 * xk; qk = qkm1 * yk + qkm2 * xk; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; if( qk != 0 ) r = pk/qk; else r = 0.0; if( r != 0 ) { t = fabs( (ans - r)/r ); ans = r; } else t = 1.0; if( ++ctr > 1000 ) { mtherr( "jv", UNDERFLOW ); goto done; } if( t < MACHEP ) goto done; if( fabs(pk) > big ) { pkm2 /= big; pkm1 /= big; qkm2 /= big; qkm1 /= big; } } while( t > MACHEP ); done: #if DEBUG printf( "%.6e\n", ans ); #endif /* Change n to n-1 if n < 0 and the continued fraction is small */ if( nflag > 0 ) { if( fabs(ans) < 0.125 ) { nflag = -1; *n = *n - 1.0; goto fstart; } } kf = *newn; /* backward recurrence * 2k * J (x) = --- J (x) - J (x) * k-1 x k k+1 */ pk = 1.0; pkm1 = 1.0/ans; k = *n - 1.0; r = 2 * k; do { pkm2 = (pkm1 * r - pk * x) / x; pkp1 = pk; pk = pkm1; pkm1 = pkm2; r -= 2.0; /* t = fabs(pkp1) + fabs(pk); if( (k > (kf + 2.5)) && (fabs(pkm1) < 0.25*t) ) { k -= 1.0; t = x*x; pkm2 = ( (r*(r+2.0)-t)*pk - r*x*pkp1 )/t; pkp1 = pk; pk = pkm1; pkm1 = pkm2; r -= 2.0; } */ k -= 1.0; } while( k > (kf + 0.5) ); /* Take the larger of the last two iterates * on the theory that it may have less cancellation error. */ if( cancel ) { if( (kf >= 0.0) && (fabs(pk) > fabs(pkm1)) ) { k += 1.0; pkm2 = pk; } } *newn = k; #if DEBUG printf( "newn %.6e rans %.6e\n", k, pkm2 ); #endif return( pkm2 ); } /* Ascending power series for Jv(x). * AMS55 #9.1.10. */ extern double PI; static double jvs( n, x ) double n, x; { double t, u, y, z, k; int ex; z = -x * x / 4.0; u = 1.0; y = u; k = 1.0; t = 1.0; while( t > MACHEP ) { u *= z / (k * (n+k)); y += u; k += 1.0; if( y != 0 ) t = fabs( u/y ); } #if DEBUG printf( "power series=%.5e ", y ); #endif t = frexp( 0.5*x, &ex ); ex = ex * n; if( (ex > -1023) && (ex < 1023) && (n > 0.0) && (n < (MAXGAM-1.0)) ) { t = pow( 0.5*x, n ) / true_gamma( n + 1.0 ); #if DEBUG printf( "pow(.5*x, %.4e)/true_gamma(n+1)=%.5e\n", n, t ); #endif y *= t; } else { #if DEBUG z = n * log(0.5*x); k = lgam( n+1.0 ); t = z - k; printf( "log pow=%.5e, lgam(%.4e)=%.5e\n", z, n+1.0, k ); #else t = n * log(0.5*x) - lgam(n + 1.0); #endif if( y < 0 ) { sgngam = -sgngam; y = -y; } t += log(y); #if DEBUG printf( "log y=%.5e\n", log(y) ); #endif if( t < -MAXLOG ) { return( 0.0 ); } if( t > MAXLOG ) { mtherr( "Jv", OVERFLOW ); return( MAXNUM ); } y = sgngam * exp( t ); } return(y); } /* Hankel's asymptotic expansion * for large x. * AMS55 #9.2.5. */ static double hankel( n, x ) double n, x; { double t, u, z, k, sign, conv; double p, q, j, m, pp, qq; int flag; m = 4.0*n*n; j = 1.0; z = 8.0 * x; k = 1.0; p = 1.0; u = (m - 1.0)/z; q = u; sign = 1.0; conv = 1.0; flag = 0; t = 1.0; pp = 1.0e38; qq = 1.0e38; while( t > MACHEP ) { k += 2.0; j += 1.0; sign = -sign; u *= (m - k * k)/(j * z); p += sign * u; k += 2.0; j += 1.0; u *= (m - k * k)/(j * z); q += sign * u; t = fabs(u/p); if( t < conv ) { conv = t; qq = q; pp = p; flag = 1; } /* stop if the terms start getting larger */ if( (flag != 0) && (t > conv) ) { #if DEBUG printf( "Hankel: convergence to %.4E\n", conv ); #endif goto hank1; } } hank1: u = x - (0.5*n + 0.25) * PI; t = sqrt( 2.0/(PI*x) ) * ( pp * cos(u) - qq * sin(u) ); #if DEBUG printf( "hank: %.6e\n", t ); #endif return( t ); } /* Asymptotic expansion for large n. * AMS55 #9.3.35. */ static double lambda[] = { 1.0, 1.041666666666666666666667E-1, 8.355034722222222222222222E-2, 1.282265745563271604938272E-1, 2.918490264641404642489712E-1, 8.816272674437576524187671E-1, 3.321408281862767544702647E+0, 1.499576298686255465867237E+1, 7.892301301158651813848139E+1, 4.744515388682643231611949E+2, 3.207490090890661934704328E+3 }; static double mu[] = { 1.0, -1.458333333333333333333333E-1, -9.874131944444444444444444E-2, -1.433120539158950617283951E-1, -3.172272026784135480967078E-1, -9.424291479571202491373028E-1, -3.511203040826354261542798E+0, -1.572726362036804512982712E+1, -8.228143909718594444224656E+1, -4.923553705236705240352022E+2, -3.316218568547972508762102E+3 }; static double P1[] = { -2.083333333333333333333333E-1, 1.250000000000000000000000E-1 }; static double P2[] = { 3.342013888888888888888889E-1, -4.010416666666666666666667E-1, 7.031250000000000000000000E-2 }; static double P3[] = { -1.025812596450617283950617E+0, 1.846462673611111111111111E+0, -8.912109375000000000000000E-1, 7.324218750000000000000000E-2 }; static double P4[] = { 4.669584423426247427983539E+0, -1.120700261622299382716049E+1, 8.789123535156250000000000E+0, -2.364086914062500000000000E+0, 1.121520996093750000000000E-1 }; static double P5[] = { -2.8212072558200244877E1, 8.4636217674600734632E1, -9.1818241543240017361E1, 4.2534998745388454861E1, -7.3687943594796316964E0, 2.27108001708984375E-1 }; static double P6[] = { 2.1257013003921712286E2, -7.6525246814118164230E2, 1.0599904525279998779E3, -6.9957962737613254123E2, 2.1819051174421159048E2, -2.6491430486951555525E1, 5.7250142097473144531E-1 }; static double P7[] = { -1.9194576623184069963E3, 8.0617221817373093845E3, -1.3586550006434137439E4, 1.1655393336864533248E4, -5.3056469786134031084E3, 1.2009029132163524628E3, -1.0809091978839465550E2, 1.7277275025844573975E0 }; static double jnx( n, x ) double n, x; { double zeta, sqz, zz, zp, np; double cbn, n23, t, z, sz; double pp, qq, z32i, zzi; double ak, bk, akl, bkl; int sign, doa, dob, nflg, k, s, tk, tkp1, m; static double u[8]; static double ai, aip, bi, bip; /* Test for x very close to n. * Use expansion for transition region if so. */ cbn = cbrt(n); z = (x - n)/cbn; if( fabs(z) <= 0.7 ) return( jnt(n,x) ); z = x/n; zz = 1.0 - z*z; if( zz == 0.0 ) return(0.0); if( zz > 0.0 ) { sz = sqrt( zz ); t = 1.5 * (log( (1.0+sz)/z ) - sz ); /* zeta ** 3/2 */ zeta = cbrt( t * t ); nflg = 1; } else { sz = sqrt(-zz); t = 1.5 * (sz - acos(1.0/z)); zeta = -cbrt( t * t ); nflg = -1; } z32i = fabs(1.0/t); sqz = cbrt(t); /* Airy function */ n23 = cbrt( n * n ); t = n23 * zeta; #if DEBUG printf("zeta %.5E, Airy(%.5E)\n", zeta, t ); #endif airy( t, &ai, &aip, &bi, &bip ); /* polynomials in expansion */ u[0] = 1.0; zzi = 1.0/zz; u[1] = polevl( zzi, P1, 1 )/sz; u[2] = polevl( zzi, P2, 2 )/zz; u[3] = polevl( zzi, P3, 3 )/(sz*zz); pp = zz*zz; u[4] = polevl( zzi, P4, 4 )/pp; u[5] = polevl( zzi, P5, 5 )/(pp*sz); pp *= zz; u[6] = polevl( zzi, P6, 6 )/pp; u[7] = polevl( zzi, P7, 7 )/(pp*sz); #if DEBUG for( k=0; k<=7; k++ ) printf( "u[%d] = %.5E\n", k, u[k] ); #endif pp = 0.0; qq = 0.0; np = 1.0; /* flags to stop when terms get larger */ doa = 1; dob = 1; akl = MAXNUM; bkl = MAXNUM; for( k=0; k<=3; k++ ) { tk = 2 * k; tkp1 = tk + 1; zp = 1.0; ak = 0.0; bk = 0.0; for( s=0; s<=tk; s++ ) { if( doa ) { if( (s & 3) > 1 ) sign = nflg; else sign = 1; ak += sign * mu[s] * zp * u[tk-s]; } if( dob ) { m = tkp1 - s; if( ((m+1) & 3) > 1 ) sign = nflg; else sign = 1; bk += sign * lambda[s] * zp * u[m]; } zp *= z32i; } if( doa ) { ak *= np; t = fabs(ak); if( t < akl ) { akl = t; pp += ak; } else doa = 0; } if( dob ) { bk += lambda[tkp1] * zp * u[0]; bk *= -np/sqz; t = fabs(bk); if( t < bkl ) { bkl = t; qq += bk; } else dob = 0; } #if DEBUG printf("a[%d] %.5E, b[%d] %.5E\n", k, ak, k, bk ); #endif if( np < MACHEP ) break; np /= n*n; } /* normalizing factor ( 4*zeta/(1 - z**2) )**1/4 */ t = 4.0 * zeta/zz; t = sqrt( sqrt(t) ); t *= ai*pp/cbrt(n) + aip*qq/(n23*n); return(t); } /* Asymptotic expansion for transition region, * n large and x close to n. * AMS55 #9.3.23. */ static double PF2[] = { -9.0000000000000000000e-2, 8.5714285714285714286e-2 }; static double PF3[] = { 1.3671428571428571429e-1, -5.4920634920634920635e-2, -4.4444444444444444444e-3 }; static double PF4[] = { 1.3500000000000000000e-3, -1.6036054421768707483e-1, 4.2590187590187590188e-2, 2.7330447330447330447e-3 }; static double PG1[] = { -2.4285714285714285714e-1, 1.4285714285714285714e-2 }; static double PG2[] = { -9.0000000000000000000e-3, 1.9396825396825396825e-1, -1.1746031746031746032e-2 }; static double PG3[] = { 1.9607142857142857143e-2, -1.5983694083694083694e-1, 6.3838383838383838384e-3 }; static double jnt( n, x ) double n, x; { double z, zz, z3; double cbn, n23, cbtwo; double ai, aip, bi, bip; /* Airy functions */ double nk, fk, gk, pp, qq; double F[5], G[4]; int k; cbn = cbrt(n); z = (x - n)/cbn; cbtwo = cbrt( 2.0 ); /* Airy function */ zz = -cbtwo * z; airy( zz, &ai, &aip, &bi, &bip ); /* polynomials in expansion */ zz = z * z; z3 = zz * z; F[0] = 1.0; F[1] = -z/5.0; F[2] = polevl( z3, PF2, 1 ) * zz; F[3] = polevl( z3, PF3, 2 ); F[4] = polevl( z3, PF4, 3 ) * z; G[0] = 0.3 * zz; G[1] = polevl( z3, PG1, 1 ); G[2] = polevl( z3, PG2, 2 ) * z; G[3] = polevl( z3, PG3, 2 ) * zz; #if DEBUG for( k=0; k<=4; k++ ) printf( "F[%d] = %.5E\n", k, F[k] ); for( k=0; k<=3; k++ ) printf( "G[%d] = %.5E\n", k, G[k] ); #endif pp = 0.0; qq = 0.0; nk = 1.0; n23 = cbrt( n * n ); for( k=0; k<=4; k++ ) { fk = F[k]*nk; pp += fk; if( k != 4 ) { gk = G[k]*nk; qq += gk; } #if DEBUG printf("fk[%d] %.5E, gk[%d] %.5E\n", k, fk, k, gk ); #endif nk /= n23; } fk = cbtwo * ai * pp/cbn + cbrt(4.0) * aip * qq/n; return(fk); } grace-5.1.23/cephes/ellik.c0000644000076500001440000000433606626627163015167 0ustar fnevgenyusers/* ellik.c * * Incomplete elliptic integral of the first kind * * * * SYNOPSIS: * * double phi, m, y, ellik(); * * y = ellik( phi, m ); * * * * DESCRIPTION: * * Approximates the integral * * * * phi * - * | | * | dt * F(phi_\m) = | ------------------ * | 2 * | | sqrt( 1 - m sin t ) * - * 0 * * of amplitude phi and modulus m, using the arithmetic - * geometric mean algorithm. * * * * * ACCURACY: * * Tested at random points with m in [0, 1] and phi as indicated. * * Relative error: * arithmetic domain # trials peak rms * IEEE -10,10 200000 7.4e-16 1.0e-16 * * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ /* Incomplete elliptic integral of first kind */ #include "mconf.h" #include "cephes.h" extern double PI, PIO2, MACHEP, MAXNUM; double ellik( phi, m ) double phi, m; { double a, b, c, e, temp, t, K; int d, mod, sign, npio2; if( m == 0.0 ) return( phi ); a = 1.0 - m; if( a == 0.0 ) { if( fabs(phi) >= PIO2 ) { mtherr( "ellik", SING ); return( MAXNUM ); } return( log( tan( (PIO2 + phi)/2.0 ) ) ); } npio2 = floor( phi/PIO2 ); if( npio2 & 1 ) npio2 += 1; if( npio2 ) { K = ellpk( a ); phi = phi - npio2 * PIO2; } else K = 0.0; if( phi < 0.0 ) { phi = -phi; sign = -1; } else sign = 0; b = sqrt(a); t = tan( phi ); if( fabs(t) > 10.0 ) { /* Transform the amplitude */ e = 1.0/(b*t); /* ... but avoid multiple recursions. */ if( fabs(e) < 10.0 ) { e = atan(e); if( npio2 == 0 ) K = ellpk( a ); temp = K - ellik( e, m ); goto done; } } a = 1.0; c = sqrt(m); d = 1; mod = 0; while( fabs(c/a) > MACHEP ) { temp = b/a; phi = phi + atan(t*temp) + mod * PI; mod = (phi + PIO2)/PI; t = t * ( 1.0 + temp )/( 1.0 - temp * t * t ); c = ( a - b )/2.0; temp = sqrt( a * b ); a = ( a + b )/2.0; b = temp; d += d; } temp = (atan(t) + mod * PI)/(d * a); done: if( sign < 0 ) temp = -temp; temp += npio2 * K; return( temp ); } grace-5.1.23/cephes/ndtri.c0000644000076500001440000002327310505257152015174 0ustar fnevgenyusers/* ndtri.c * * Inverse of Normal distribution function * * * * SYNOPSIS: * * double x, y, ndtri(); * * x = ndtri( y ); * * * * DESCRIPTION: * * Returns the argument, x, for which the area under the * Gaussian probability density function (integrated from * minus infinity to x) is equal to y. * * * For small arguments 0 < y < exp(-2), the program computes * z = sqrt( -2.0 * log(y) ); then the approximation is * x = z - log(z)/z - (1/z) P(1/z) / Q(1/z). * There are two rational functions P/Q, one for 0 < y < exp(-32) * and the other for y up to exp(-2). For larger arguments, * w = y - 0.5, and x/sqrt(2pi) = w + w**3 R(w**2)/S(w**2)). * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0.125, 1 5500 9.5e-17 2.1e-17 * DEC 6e-39, 0.135 3500 5.7e-17 1.3e-17 * IEEE 0.125, 1 20000 7.2e-16 1.3e-16 * IEEE 3e-308, 0.135 50000 4.6e-16 9.8e-17 * * * ERROR MESSAGES: * * message condition value returned * ndtri domain x <= 0 -MAXNUM * ndtri domain x >= 1 MAXNUM * */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double MAXNUM; #ifdef UNK /* sqrt(2pi) */ static double s2pi = 2.50662827463100050242E0; #endif #ifdef DEC static union us2d_t s2p = {{0040440,0066230,0177661,0034055}}; #define s2pi s2p.d #endif #ifdef IBMPC static union us2d_t s2p = {{0x2706,0x1ff6,0x0d93,0x4004}}; #define s2pi s2p.d #endif #ifdef MIEEE static union us2d_t s2p = { {0x4004,0x0d93,0x1ff6,0x2706} }; #define s2pi s2p.d #endif /* approximation for 0 <= |y - 0.5| <= 3/8 */ #ifdef UNK static double P0[5] = { -5.99633501014107895267E1, 9.80010754185999661536E1, -5.66762857469070293439E1, 1.39312609387279679503E1, -1.23916583867381258016E0, }; static double Q0[8] = { /* 1.00000000000000000000E0,*/ 1.95448858338141759834E0, 4.67627912898881538453E0, 8.63602421390890590575E1, -2.25462687854119370527E2, 2.00260212380060660359E2, -8.20372256168333339912E1, 1.59056225126211695515E1, -1.18331621121330003142E0, }; #endif #ifdef DEC static unsigned short P0[20] = { 0141557,0155170,0071360,0120550, 0041704,0000214,0172417,0067307, 0141542,0132204,0040066,0156723, 0041136,0163161,0157276,0007747, 0140236,0116374,0073666,0051764, }; static unsigned short Q0[32] = { /*0040200,0000000,0000000,0000000,*/ 0040372,0026256,0110403,0123707, 0040625,0122024,0020277,0026661, 0041654,0134161,0124134,0007244, 0142141,0073162,0133021,0131371, 0042110,0041235,0043516,0057767, 0141644,0011417,0036155,0137305, 0041176,0076556,0004043,0125430, 0140227,0073347,0152776,0067251, }; #endif #ifdef IBMPC static unsigned short P0[20] = { 0x142d,0x0e5e,0xfb4f,0xc04d, 0xedd9,0x9ea1,0x8011,0x4058, 0xdbba,0x8806,0x5690,0xc04c, 0xc1fd,0x3bd7,0xdcce,0x402b, 0xca7e,0x8ef6,0xd39f,0xbff3, }; static unsigned short Q0[36] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x74f9,0xd220,0x4595,0x3fff, 0xe5b6,0x8417,0xb482,0x4012, 0x81d4,0x350b,0x970e,0x4055, 0x365f,0x56c2,0x2ece,0xc06c, 0xcbff,0xa8e9,0x0853,0x4069, 0xb7d9,0xe78d,0x8261,0xc054, 0x7563,0xc104,0xcfad,0x402f, 0xcdd5,0xfabf,0xeedc,0xbff2, }; #endif #ifdef MIEEE static unsigned short P0[20] = { 0xc04d,0xfb4f,0x0e5e,0x142d, 0x4058,0x8011,0x9ea1,0xedd9, 0xc04c,0x5690,0x8806,0xdbba, 0x402b,0xdcce,0x3bd7,0xc1fd, 0xbff3,0xd39f,0x8ef6,0xca7e, }; static unsigned short Q0[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3fff,0x4595,0xd220,0x74f9, 0x4012,0xb482,0x8417,0xe5b6, 0x4055,0x970e,0x350b,0x81d4, 0xc06c,0x2ece,0x56c2,0x365f, 0x4069,0x0853,0xa8e9,0xcbff, 0xc054,0x8261,0xe78d,0xb7d9, 0x402f,0xcfad,0xc104,0x7563, 0xbff2,0xeedc,0xfabf,0xcdd5, }; #endif /* Approximation for interval z = sqrt(-2 log y ) between 2 and 8 * i.e., y between exp(-2) = .135 and exp(-32) = 1.27e-14. */ #ifdef UNK static double P1[9] = { 4.05544892305962419923E0, 3.15251094599893866154E1, 5.71628192246421288162E1, 4.40805073893200834700E1, 1.46849561928858024014E1, 2.18663306850790267539E0, -1.40256079171354495875E-1, -3.50424626827848203418E-2, -8.57456785154685413611E-4, }; static double Q1[8] = { /* 1.00000000000000000000E0,*/ 1.57799883256466749731E1, 4.53907635128879210584E1, 4.13172038254672030440E1, 1.50425385692907503408E1, 2.50464946208309415979E0, -1.42182922854787788574E-1, -3.80806407691578277194E-2, -9.33259480895457427372E-4, }; #endif #ifdef DEC static unsigned short P1[36] = { 0040601,0143074,0150744,0073326, 0041374,0031554,0113253,0146016, 0041544,0123272,0012463,0176771, 0041460,0051160,0103560,0156511, 0041152,0172624,0117772,0030755, 0040413,0170713,0151545,0176413, 0137417,0117512,0022154,0131671, 0137017,0104257,0071432,0007072, 0135540,0143363,0063137,0036166, }; static unsigned short Q1[32] = { /*0040200,0000000,0000000,0000000,*/ 0041174,0075325,0004736,0120326, 0041465,0110044,0047561,0045567, 0041445,0042321,0012142,0030340, 0041160,0127074,0166076,0141051, 0040440,0046055,0040745,0150400, 0137421,0114146,0067330,0010621, 0137033,0175162,0025555,0114351, 0135564,0122773,0145750,0030357, }; #endif #ifdef IBMPC static unsigned short P1[36] = { 0x8edb,0x9a3c,0x38c7,0x4010, 0x7982,0x92d5,0x866d,0x403f, 0x7fbf,0x42a6,0x94d7,0x404c, 0x1ba9,0x10ee,0x0a4e,0x4046, 0x463e,0x93ff,0x5eb2,0x402d, 0xbfa1,0x7a6c,0x7e39,0x4001, 0x9677,0x448d,0xf3e9,0xbfc1, 0x41c7,0xee63,0xf115,0xbfa1, 0xe78f,0x6ccb,0x18de,0xbf4c, }; static unsigned short Q1[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xd41b,0xa13b,0x8f5a,0x402f, 0x296f,0x89ee,0xb204,0x4046, 0x461c,0x228c,0xa89a,0x4044, 0xd845,0x9d87,0x15c7,0x402e, 0xba20,0xa83c,0x0985,0x4004, 0x0232,0xcddb,0x330c,0xbfc2, 0xb31d,0x456d,0x7f4e,0xbfa3, 0x061e,0x797d,0x94bf,0xbf4e, }; #endif #ifdef MIEEE static unsigned short P1[36] = { 0x4010,0x38c7,0x9a3c,0x8edb, 0x403f,0x866d,0x92d5,0x7982, 0x404c,0x94d7,0x42a6,0x7fbf, 0x4046,0x0a4e,0x10ee,0x1ba9, 0x402d,0x5eb2,0x93ff,0x463e, 0x4001,0x7e39,0x7a6c,0xbfa1, 0xbfc1,0xf3e9,0x448d,0x9677, 0xbfa1,0xf115,0xee63,0x41c7, 0xbf4c,0x18de,0x6ccb,0xe78f, }; static unsigned short Q1[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x402f,0x8f5a,0xa13b,0xd41b, 0x4046,0xb204,0x89ee,0x296f, 0x4044,0xa89a,0x228c,0x461c, 0x402e,0x15c7,0x9d87,0xd845, 0x4004,0x0985,0xa83c,0xba20, 0xbfc2,0x330c,0xcddb,0x0232, 0xbfa3,0x7f4e,0x456d,0xb31d, 0xbf4e,0x94bf,0x797d,0x061e, }; #endif /* Approximation for interval z = sqrt(-2 log y ) between 8 and 64 * i.e., y between exp(-32) = 1.27e-14 and exp(-2048) = 3.67e-890. */ #ifdef UNK static double P2[9] = { 3.23774891776946035970E0, 6.91522889068984211695E0, 3.93881025292474443415E0, 1.33303460815807542389E0, 2.01485389549179081538E-1, 1.23716634817820021358E-2, 3.01581553508235416007E-4, 2.65806974686737550832E-6, 6.23974539184983293730E-9, }; static double Q2[8] = { /* 1.00000000000000000000E0,*/ 6.02427039364742014255E0, 3.67983563856160859403E0, 1.37702099489081330271E0, 2.16236993594496635890E-1, 1.34204006088543189037E-2, 3.28014464682127739104E-4, 2.89247864745380683936E-6, 6.79019408009981274425E-9, }; #endif #ifdef DEC static unsigned short P2[36] = { 0040517,0033507,0036236,0125641, 0040735,0044616,0014473,0140133, 0040574,0012567,0114535,0102541, 0040252,0120340,0143474,0150135, 0037516,0051057,0115361,0031211, 0036512,0131204,0101511,0125144, 0035236,0016627,0043160,0140216, 0033462,0060512,0060141,0010641, 0031326,0062541,0101304,0077706, }; static unsigned short Q2[32] = { /*0040200,0000000,0000000,0000000,*/ 0040700,0143322,0132137,0040501, 0040553,0101155,0053221,0140257, 0040260,0041071,0052573,0010004, 0037535,0066472,0177261,0162330, 0036533,0160475,0066666,0036132, 0035253,0174533,0027771,0044027, 0033502,0016147,0117666,0063671, 0031351,0047455,0141663,0054751, }; #endif #ifdef IBMPC static unsigned short P2[36] = { 0xd574,0xe793,0xe6e8,0x4009, 0x780b,0xc327,0xa931,0x401b, 0xb0ac,0xf32b,0x82ae,0x400f, 0x9a0c,0x18e7,0x541c,0x3ff5, 0x2651,0xf35e,0xca45,0x3fc9, 0x354d,0x9069,0x5650,0x3f89, 0x1812,0xe8ce,0xc3b2,0x3f33, 0x2234,0x4c0c,0x4c29,0x3ec6, 0x8ff9,0x3058,0xccac,0x3e3a, }; static unsigned short Q2[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xe828,0x568b,0x18da,0x4018, 0x3816,0xaad2,0x704d,0x400d, 0x6200,0x2aaf,0x0847,0x3ff6, 0x3c9b,0x5fd6,0xada7,0x3fcb, 0xc78b,0xadb6,0x7c27,0x3f8b, 0x2903,0x65ff,0x7f2b,0x3f35, 0xccf7,0xf3f6,0x438c,0x3ec8, 0x6b3d,0xb876,0x29e5,0x3e3d, }; #endif #ifdef MIEEE static unsigned short P2[36] = { 0x4009,0xe6e8,0xe793,0xd574, 0x401b,0xa931,0xc327,0x780b, 0x400f,0x82ae,0xf32b,0xb0ac, 0x3ff5,0x541c,0x18e7,0x9a0c, 0x3fc9,0xca45,0xf35e,0x2651, 0x3f89,0x5650,0x9069,0x354d, 0x3f33,0xc3b2,0xe8ce,0x1812, 0x3ec6,0x4c29,0x4c0c,0x2234, 0x3e3a,0xccac,0x3058,0x8ff9, }; static unsigned short Q2[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4018,0x18da,0x568b,0xe828, 0x400d,0x704d,0xaad2,0x3816, 0x3ff6,0x0847,0x2aaf,0x6200, 0x3fcb,0xada7,0x5fd6,0x3c9b, 0x3f8b,0x7c27,0xadb6,0xc78b, 0x3f35,0x7f2b,0x65ff,0x2903, 0x3ec8,0x438c,0xf3f6,0xccf7, 0x3e3d,0x29e5,0xb876,0x6b3d, }; #endif double ndtri(y0) double y0; { double x, y, z, y2, x0, x1; int code; if( y0 <= 0.0 ) { mtherr( "ndtri", DOMAIN ); return( -MAXNUM ); } if( y0 >= 1.0 ) { mtherr( "ndtri", DOMAIN ); return( MAXNUM ); } code = 1; y = y0; if( y > (1.0 - 0.13533528323661269189) ) /* 0.135... = exp(-2) */ { y = 1.0 - y; code = 0; } if( y > 0.13533528323661269189 ) { y = y - 0.5; y2 = y * y; x = y + y * (y2 * polevl( y2, P0, 4)/p1evl( y2, Q0, 8 )); x = x * s2pi; return(x); } x = sqrt( -2.0 * log(y) ); x0 = x - log(x)/x; z = 1.0/x; if( x < 8.0 ) /* y > exp(-32) = 1.2664165549e-14 */ x1 = z * polevl( z, P1, 8 )/p1evl( z, Q1, 8 ); else x1 = z * polevl( z, P2, 8 )/p1evl( z, Q2, 8 ); x = x0 - x1; if( code != 0 ) x = -x; return( x ); } grace-5.1.23/cephes/hyperg.c0000644000076500001440000001517710505257152015356 0ustar fnevgenyusers/* hyperg.c * * Confluent hypergeometric function * * * * SYNOPSIS: * * double a, b, x, y, hyperg(); * * y = hyperg( a, b, x ); * * * * DESCRIPTION: * * Computes the confluent hypergeometric function * * 1 2 * a x a(a+1) x * F ( a,b;x ) = 1 + ---- + --------- + ... * 1 1 b 1! b(b+1) 2! * * Many higher transcendental functions are special cases of * this power series. * * As is evident from the formula, b must not be a negative * integer or zero unless a is an integer with 0 >= a > b. * * The routine attempts both a direct summation of the series * and an asymptotic expansion. In each case error due to * roundoff, cancellation, and nonconvergence is estimated. * The result with smaller estimated error is returned. * * * * ACCURACY: * * Tested at random points (a, b, x), all three variables * ranging from 0 to 30. * Relative error: * arithmetic domain # trials peak rms * DEC 0,30 2000 1.2e-15 1.3e-16 * IEEE 0,30 30000 1.8e-14 1.1e-15 * * Larger errors can be observed when b is near a negative * integer or zero. Certain combinations of arguments yield * serious cancellation error in the power series summation * and also are not in the region of near convergence of the * asymptotic series. An error message is printed if the * self-estimated relative error is greater than 1.0e-12. * */ /* hyperg.c */ /* Cephes Math Library Release 2.1: November, 1988 Copyright 1984, 1987, 1988 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" static double hy1f1p( double a, double b, double x, double *err ); static double hy1f1a( double a, double b, double x, double *err ); extern double MAXNUM, MACHEP; double hyperg( a, b, x) double a, b, x; { double asum, psum, acanc, pcanc=0; /* See if a Kummer transformation will help */ /* temp = b - a; if( fabs(temp) < fabs(b) ) return( exp(x) * hyperg( temp, b, -x ) ); */ psum = hy1f1p( a, b, x, &pcanc ); if( pcanc < 1.0e-15 ) goto done; /* try asymptotic series */ asum = hy1f1a( a, b, x, &acanc ); /* Pick the result with less estimated error */ if( acanc < pcanc ) { pcanc = acanc; psum = asum; } done: if( pcanc > 1.0e-12 ) mtherr( "hyperg", PLOSS ); return( psum ); } /* Power series summation for confluent hypergeometric function */ static double hy1f1p( a, b, x, err ) double a, b, x; double *err; { double n, a0, sum, t, u, temp; double an, bn, maxt, pcanc; /* set up for power series summation */ an = a; bn = b; a0 = 1.0; sum = 1.0; n = 1.0; t = 1.0; maxt = 0.0; while( t > MACHEP ) { if( bn == 0 ) /* check bn first since if both */ { mtherr( "hyperg", SING ); return( MAXNUM ); /* an and bn are zero it is */ } if( an == 0 ) /* a singularity */ return( sum ); if( n > 200 ) goto pdone; u = x * ( an / (bn * n) ); /* check for blowup */ temp = fabs(u); if( (temp > 1.0 ) && (maxt > (MAXNUM/temp)) ) { pcanc = 1.0; /* estimate 100% error */ goto blowup; } a0 *= u; sum += a0; t = fabs(a0); if( t > maxt ) maxt = t; /* if( (maxt/fabs(sum)) > 1.0e17 ) { pcanc = 1.0; goto blowup; } */ an += 1.0; bn += 1.0; n += 1.0; } pdone: /* estimate error due to roundoff and cancellation */ if( sum != 0.0 ) maxt /= fabs(sum); maxt *= MACHEP; /* this way avoids multiply overflow */ pcanc = fabs( MACHEP * n + maxt ); blowup: *err = pcanc; return( sum ); } /* hy1f1a() */ /* asymptotic formula for hypergeometric function: * * ( -a * -- ( |z| * | (b) ( -------- 2f0( a, 1+a-b, -1/x ) * ( -- * ( | (b-a) * * * x a-b ) * e |x| ) * + -------- 2f0( b-a, 1-a, 1/x ) ) * -- ) * | (a) ) */ static double hy1f1a( a, b, x, err ) double a, b, x; double *err; { double h1, h2, t, u, temp, acanc, asum, err1, err2; if( x == 0 ) { acanc = 1.0; asum = MAXNUM; goto adone; } temp = log( fabs(x) ); t = x + temp * (a-b); u = -temp * a; if( b > 0 ) { temp = lgam(b); t += temp; u += temp; } h1 = hyp2f0( a, a-b+1, -1.0/x, 1, &err1 ); temp = exp(u) / true_gamma(b-a); h1 *= temp; err1 *= temp; h2 = hyp2f0( b-a, 1.0-a, 1.0/x, 2, &err2 ); if( a < 0 ) temp = exp(t) / true_gamma(a); else temp = exp( t - lgam(a) ); h2 *= temp; err2 *= temp; if( x < 0.0 ) asum = h1; else asum = h2; acanc = fabs(err1) + fabs(err2); if( b < 0 ) { temp = true_gamma(b); asum *= temp; acanc *= fabs(temp); } if( asum != 0.0 ) acanc /= fabs(asum); acanc *= 30.0; /* fudge factor, since error of asymptotic formula * often seems this much larger than advertised */ adone: *err = acanc; return( asum ); } /* hyp2f0() */ double hyp2f0( a, b, x, type, err ) double a, b, x; int type; /* determines what converging factor to use */ double *err; { double a0, alast, t, tlast, maxt; double n, an, bn, u, sum, temp; an = a; bn = b; a0 = 1.0e0; alast = 1.0e0; sum = 0.0; n = 1.0e0; t = 1.0e0; tlast = 1.0e9; maxt = 0.0; do { if( an == 0 ) goto pdone; if( bn == 0 ) goto pdone; u = an * (bn * x / n); /* check for blowup */ temp = fabs(u); if( (temp > 1.0 ) && (maxt > (MAXNUM/temp)) ) goto error; a0 *= u; t = fabs(a0); /* terminating condition for asymptotic series */ if( t > tlast ) goto ndone; tlast = t; sum += alast; /* the sum is one term behind */ alast = a0; if( n > 200 ) goto ndone; an += 1.0e0; bn += 1.0e0; n += 1.0e0; if( t > maxt ) maxt = t; } while( t > MACHEP ); pdone: /* series converged! */ /* estimate error due to roundoff and cancellation */ *err = fabs( MACHEP * (n + maxt) ); alast = a0; goto done; ndone: /* series did not converge */ /* The following "Converging factors" are supposed to improve accuracy, * but do not actually seem to accomplish very much. */ n -= 1.0; x = 1.0/x; switch( type ) /* "type" given as subroutine argument */ { case 1: alast *= ( 0.5 + (0.125 + 0.25*b - 0.5*a + 0.25*x - 0.25*n)/x ); break; case 2: alast *= 2.0/3.0 - b + 2.0*a + x - n; break; default: ; } /* estimate error due to roundoff, cancellation, and nonconvergence */ *err = MACHEP * (n + maxt) + fabs ( a0 ); done: sum += alast; return( sum ); /* series blew up: */ error: *err = MAXNUM; mtherr( "hyperg", TLOSS ); return( sum ); } grace-5.1.23/cephes/rgamma.c0000644000076500001440000001062106626627164015326 0ustar fnevgenyusers/* rgamma.c * * Reciprocal gamma function * * * * SYNOPSIS: * * double x, y, rgamma(); * * y = rgamma( x ); * * * * DESCRIPTION: * * Returns one divided by the gamma function of the argument. * * The function is approximated by a Chebyshev expansion in * the interval [0,1]. Range reduction is by recurrence * for arguments between -34.034 and +34.84425627277176174. * 1/MAXNUM is returned for positive arguments outside this * range. For arguments less than -34.034 the cosecant * reflection formula is applied; lograrithms are employed * to avoid unnecessary overflow. * * The reciprocal gamma function has no singularities, * but overflow and underflow may occur for large arguments. * These conditions return either MAXNUM or 1/MAXNUM with * appropriate sign. * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -30,+30 4000 1.2e-16 1.8e-17 * IEEE -30,+30 30000 1.1e-15 2.0e-16 * For arguments less than -34.034 the peak error is on the * order of 5e-15 (DEC), excepting overflow or underflow. */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1985, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Chebyshev coefficients for reciprocal gamma function * in interval 0 to 1. Function is 1/(x gamma(x)) - 1 */ #ifdef UNK static double R[] = { 3.13173458231230000000E-17, -6.70718606477908000000E-16, 2.20039078172259550000E-15, 2.47691630348254132600E-13, -6.60074100411295197440E-12, 5.13850186324226978840E-11, 1.08965386454418662084E-9, -3.33964630686836942556E-8, 2.68975996440595483619E-7, 2.96001177518801696639E-6, -8.04814124978471142852E-5, 4.16609138709688864714E-4, 5.06579864028608725080E-3, -6.41925436109158228810E-2, -4.98558728684003594785E-3, 1.27546015610523951063E-1 }; #endif #ifdef DEC static unsigned short R[] = { 0022420,0066376,0176751,0071636, 0123501,0051114,0042104,0131153, 0024036,0107013,0126504,0033361, 0025613,0070040,0035174,0162316, 0126750,0037060,0077775,0122202, 0027541,0177143,0037675,0105150, 0030625,0141311,0075005,0115436, 0132017,0067714,0125033,0014721, 0032620,0063707,0105256,0152643, 0033506,0122235,0072757,0170053, 0134650,0144041,0015617,0016143, 0035332,0066125,0000776,0006215, 0036245,0177377,0137173,0131432, 0137203,0073541,0055645,0141150, 0136243,0057043,0026226,0017362, 0037402,0115554,0033441,0012310 }; #endif #ifdef IBMPC static unsigned short R[] = { 0x2e74,0xdfbd,0x0d9f,0x3c82, 0x964d,0x8888,0x2a49,0xbcc8, 0x86de,0x75a8,0xd1c1,0x3ce3, 0x9c9a,0x074f,0x6e04,0x3d51, 0xb490,0x0fff,0x07c6,0xbd9d, 0xb14d,0x67f7,0x3fcc,0x3dcc, 0xb364,0x2f40,0xb859,0x3e12, 0x633a,0x9543,0xedf9,0xbe61, 0xdab4,0xf155,0x0cf8,0x3e92, 0xfe05,0xaebd,0xd493,0x3ec8, 0xe38c,0x2371,0x1904,0xbf15, 0xc192,0xa03f,0x4d8a,0x3f3b, 0x7663,0xf7cf,0xbfdf,0x3f74, 0xb84d,0x2b74,0x6eec,0xbfb0, 0xc3de,0x6592,0x6bc4,0xbf74, 0x2299,0x86e4,0x536d,0x3fc0 }; #endif #ifdef MIEEE static unsigned short R[] = { 0x3c82,0x0d9f,0xdfbd,0x2e74, 0xbcc8,0x2a49,0x8888,0x964d, 0x3ce3,0xd1c1,0x75a8,0x86de, 0x3d51,0x6e04,0x074f,0x9c9a, 0xbd9d,0x07c6,0x0fff,0xb490, 0x3dcc,0x3fcc,0x67f7,0xb14d, 0x3e12,0xb859,0x2f40,0xb364, 0xbe61,0xedf9,0x9543,0x633a, 0x3e92,0x0cf8,0xf155,0xdab4, 0x3ec8,0xd493,0xaebd,0xfe05, 0xbf15,0x1904,0x2371,0xe38c, 0x3f3b,0x4d8a,0xa03f,0xc192, 0x3f74,0xbfdf,0xf7cf,0x7663, 0xbfb0,0x6eec,0x2b74,0xb84d, 0xbf74,0x6bc4,0x6592,0xc3de, 0x3fc0,0x536d,0x86e4,0x2299 }; #endif static char name[] = "rgamma"; extern double PI, MAXLOG, MAXNUM; double rgamma(x) double x; { double w, y, z; int sign; if( x > 34.84425627277176174) { mtherr( name, UNDERFLOW ); return(1.0/MAXNUM); } if( x < -34.034 ) { w = -x; z = sin( PI*w ); if( z == 0.0 ) return(0.0); if( z < 0.0 ) { sign = 1; z = -z; } else sign = -1; y = log( w * z ) - log(PI) + lgam(w); if( y < -MAXLOG ) { mtherr( name, UNDERFLOW ); return( sign * 1.0 / MAXNUM ); } if( y > MAXLOG ) { mtherr( name, OVERFLOW ); return( sign * MAXNUM ); } return( sign * exp(y)); } z = 1.0; w = x; while( w > 1.0 ) /* Downward recurrence */ { w -= 1.0; z *= w; } while( w < 0.0 ) /* Upward recurrence */ { z /= w; w += 1.0; } if( w == 0.0 ) /* Nonpositive integer */ return(0.0); if( w == 1.0 ) /* Other integer */ return( 1.0/z ); y = w * ( 1.0 + chbevl( 4.0*w-2.0, R, 16 ) ) / z; return(y); } grace-5.1.23/cephes/j0.c0000644000076500001440000003072406626627164014401 0ustar fnevgenyusers/* j0.c * * Bessel function of order zero * * * * SYNOPSIS: * * double x, y, j0(); * * y = j0( x ); * * * * DESCRIPTION: * * Returns Bessel function of order zero of the argument. * * The domain is divided into the intervals [0, 5] and * (5, infinity). In the first interval the following rational * approximation is used: * * * 2 2 * (w - r ) (w - r ) P (w) / Q (w) * 1 2 3 8 * * 2 * where w = x and the two r's are zeros of the function. * * In the second interval, the Hankel asymptotic expansion * is employed with two rational functions of degree 6/6 * and 7/7. * * * * ACCURACY: * * Absolute error: * arithmetic domain # trials peak rms * DEC 0, 30 10000 4.4e-17 6.3e-18 * IEEE 0, 30 60000 4.2e-16 1.1e-16 * */ /* y0.c * * Bessel function of the second kind, order zero * * * * SYNOPSIS: * * double x, y, y0(); * * y = y0( x ); * * * * DESCRIPTION: * * Returns Bessel function of the second kind, of order * zero, of the argument. * * The domain is divided into the intervals [0, 5] and * (5, infinity). In the first interval a rational approximation * R(x) is employed to compute * y0(x) = R(x) + 2 * log(x) * j0(x) / PI. * Thus a call to j0() is required. * * In the second interval, the Hankel asymptotic expansion * is employed with two rational functions of degree 6/6 * and 7/7. * * * * ACCURACY: * * Absolute error, when y0(x) < 1; else relative error: * * arithmetic domain # trials peak rms * DEC 0, 30 9400 7.0e-17 7.9e-18 * IEEE 0, 30 30000 1.3e-15 1.6e-16 * */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ /* Note: all coefficients satisfy the relative error criterion * except YP, YQ which are designed for absolute error. */ #include "mconf.h" #include "cephes.h" #if !defined(HAVE_J0) || !defined(HAVE_Y0) #ifdef UNK static double PP[7] = { 7.96936729297347051624E-4, 8.28352392107440799803E-2, 1.23953371646414299388E0, 5.44725003058768775090E0, 8.74716500199817011941E0, 5.30324038235394892183E0, 9.99999999999999997821E-1, }; static double PQ[7] = { 9.24408810558863637013E-4, 8.56288474354474431428E-2, 1.25352743901058953537E0, 5.47097740330417105182E0, 8.76190883237069594232E0, 5.30605288235394617618E0, 1.00000000000000000218E0, }; #endif #ifdef DEC static unsigned short PP[28] = { 0035520,0164604,0140733,0054470, 0037251,0122605,0115356,0107170, 0040236,0124412,0071500,0056303, 0040656,0047737,0045720,0045263, 0041013,0172143,0045004,0142103, 0040651,0132045,0026241,0026406, 0040200,0000000,0000000,0000000, }; static unsigned short PQ[28] = { 0035562,0052006,0070034,0134666, 0037257,0057055,0055242,0123424, 0040240,0071626,0046630,0032371, 0040657,0011077,0032013,0012731, 0041014,0030307,0050331,0006414, 0040651,0145457,0065021,0150304, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short PP[28] = { 0x6b27,0x983b,0x1d30,0x3f4a, 0xd1cf,0xb35d,0x34b0,0x3fb5, 0x0b98,0x4e68,0xd521,0x3ff3, 0x0956,0xe97a,0xc9fb,0x4015, 0x9888,0x6940,0x7e8c,0x4021, 0x25a1,0xa594,0x3684,0x4015, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short PQ[28] = { 0x9737,0xce03,0x4a80,0x3f4e, 0x54e3,0xab54,0xebc5,0x3fb5, 0x069f,0xc9b3,0x0e72,0x3ff4, 0x62bb,0xe681,0xe247,0x4015, 0x21a1,0xea1b,0x8618,0x4021, 0x3a19,0xed42,0x3965,0x4015, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short PP[28] = { 0x3f4a,0x1d30,0x983b,0x6b27, 0x3fb5,0x34b0,0xb35d,0xd1cf, 0x3ff3,0xd521,0x4e68,0x0b98, 0x4015,0xc9fb,0xe97a,0x0956, 0x4021,0x7e8c,0x6940,0x9888, 0x4015,0x3684,0xa594,0x25a1, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short PQ[28] = { 0x3f4e,0x4a80,0xce03,0x9737, 0x3fb5,0xebc5,0xab54,0x54e3, 0x3ff4,0x0e72,0xc9b3,0x069f, 0x4015,0xe247,0xe681,0x62bb, 0x4021,0x8618,0xea1b,0x21a1, 0x4015,0x3965,0xed42,0x3a19, 0x3ff0,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double QP[8] = { -1.13663838898469149931E-2, -1.28252718670509318512E0, -1.95539544257735972385E1, -9.32060152123768231369E1, -1.77681167980488050595E2, -1.47077505154951170175E2, -5.14105326766599330220E1, -6.05014350600728481186E0, }; static double QQ[7] = { /* 1.00000000000000000000E0,*/ 6.43178256118178023184E1, 8.56430025976980587198E2, 3.88240183605401609683E3, 7.24046774195652478189E3, 5.93072701187316984827E3, 2.06209331660327847417E3, 2.42005740240291393179E2, }; #endif #ifdef DEC static unsigned short QP[32] = { 0136472,0035021,0142451,0141115, 0140244,0024731,0150620,0105642, 0141234,0067177,0124161,0060141, 0141672,0064572,0151557,0043036, 0142061,0127141,0003127,0043517, 0142023,0011727,0060271,0144544, 0141515,0122142,0126620,0143150, 0140701,0115306,0106715,0007344, }; static unsigned short QQ[28] = { /*0040200,0000000,0000000,0000000,*/ 0041600,0121272,0004741,0026544, 0042526,0015605,0105654,0161771, 0043162,0123155,0165644,0062645, 0043342,0041675,0167576,0130756, 0043271,0052720,0165631,0154214, 0043000,0160576,0034614,0172024, 0042162,0000570,0030500,0051235, }; #endif #ifdef IBMPC static unsigned short QP[32] = { 0x384a,0x38a5,0x4742,0xbf87, 0x1174,0x3a32,0x853b,0xbff4, 0x2c0c,0xf50e,0x8dcf,0xc033, 0xe8c4,0x5a6d,0x4d2f,0xc057, 0xe8ea,0x20ca,0x35cc,0xc066, 0x392d,0xec17,0x627a,0xc062, 0x18cd,0x55b2,0xb48c,0xc049, 0xa1dd,0xd1b9,0x3358,0xc018, }; static unsigned short QQ[28] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x25ac,0x413c,0x1457,0x4050, 0x9c7f,0xb175,0xc370,0x408a, 0x8cb5,0xbd74,0x54cd,0x40ae, 0xd63e,0xbdef,0x4877,0x40bc, 0x3b11,0x1d73,0x2aba,0x40b7, 0x9e82,0xc731,0x1c2f,0x40a0, 0x0a54,0x0628,0x402f,0x406e, }; #endif #ifdef MIEEE static unsigned short QP[32] = { 0xbf87,0x4742,0x38a5,0x384a, 0xbff4,0x853b,0x3a32,0x1174, 0xc033,0x8dcf,0xf50e,0x2c0c, 0xc057,0x4d2f,0x5a6d,0xe8c4, 0xc066,0x35cc,0x20ca,0xe8ea, 0xc062,0x627a,0xec17,0x392d, 0xc049,0xb48c,0x55b2,0x18cd, 0xc018,0x3358,0xd1b9,0xa1dd, }; static unsigned short QQ[28] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4050,0x1457,0x413c,0x25ac, 0x408a,0xc370,0xb175,0x9c7f, 0x40ae,0x54cd,0xbd74,0x8cb5, 0x40bc,0x4877,0xbdef,0xd63e, 0x40b7,0x2aba,0x1d73,0x3b11, 0x40a0,0x1c2f,0xc731,0x9e82, 0x406e,0x402f,0x0628,0x0a54, }; #endif #ifdef UNK static double YP[8] = { 1.55924367855235737965E4, -1.46639295903971606143E7, 5.43526477051876500413E9, -9.82136065717911466409E11, 8.75906394395366999549E13, -3.46628303384729719441E15, 4.42733268572569800351E16, -1.84950800436986690637E16, }; static double YQ[7] = { /* 1.00000000000000000000E0,*/ 1.04128353664259848412E3, 6.26107330137134956842E5, 2.68919633393814121987E8, 8.64002487103935000337E10, 2.02979612750105546709E13, 3.17157752842975028269E15, 2.50596256172653059228E17, }; #endif #ifdef DEC static unsigned short YP[32] = { 0043563,0120677,0042264,0046166, 0146137,0140371,0113444,0042260, 0050241,0175707,0100502,0063344, 0152144,0125737,0007265,0164526, 0053637,0051621,0163035,0060546, 0155105,0004416,0107306,0060023, 0056035,0045133,0030132,0000024, 0155603,0065132,0144061,0131732, }; static unsigned short YQ[28] = { /*0040200,0000000,0000000,0000000,*/ 0042602,0024422,0135557,0162663, 0045030,0155665,0044075,0160135, 0047200,0035432,0105446,0104005, 0051240,0167331,0056063,0022743, 0053223,0127746,0025764,0012160, 0055064,0044206,0177532,0145545, 0056536,0111375,0163715,0127201, }; #endif #ifdef IBMPC static unsigned short YP[32] = { 0x898f,0xe896,0x7437,0x40ce, 0x8896,0x32e4,0xf81f,0xc16b, 0x4cdd,0xf028,0x3f78,0x41f4, 0xbd2b,0xe1d6,0x957b,0xc26c, 0xac2d,0x3cc3,0xea72,0x42d3, 0xcc02,0xd1d8,0xa121,0xc328, 0x4003,0x660b,0xa94b,0x4363, 0x367b,0x5906,0x6d4b,0xc350, }; static unsigned short YQ[28] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xfcb6,0x576d,0x4522,0x4090, 0xbc0c,0xa907,0x1b76,0x4123, 0xd101,0x5164,0x0763,0x41b0, 0x64bc,0x2b86,0x1ddb,0x4234, 0x828e,0xc57e,0x75fc,0x42b2, 0x596d,0xdfeb,0x8910,0x4326, 0xb5d0,0xbcf9,0xd25f,0x438b, }; #endif #ifdef MIEEE static unsigned short YP[32] = { 0x40ce,0x7437,0xe896,0x898f, 0xc16b,0xf81f,0x32e4,0x8896, 0x41f4,0x3f78,0xf028,0x4cdd, 0xc26c,0x957b,0xe1d6,0xbd2b, 0x42d3,0xea72,0x3cc3,0xac2d, 0xc328,0xa121,0xd1d8,0xcc02, 0x4363,0xa94b,0x660b,0x4003, 0xc350,0x6d4b,0x5906,0x367b, }; static unsigned short YQ[28] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4090,0x4522,0x576d,0xfcb6, 0x4123,0x1b76,0xa907,0xbc0c, 0x41b0,0x0763,0x5164,0xd101, 0x4234,0x1ddb,0x2b86,0x64bc, 0x42b2,0x75fc,0xc57e,0x828e, 0x4326,0x8910,0xdfeb,0x596d, 0x438b,0xd25f,0xbcf9,0xb5d0, }; #endif #ifdef UNK /* 5.783185962946784521175995758455807035071 */ static double DR1 = 5.78318596294678452118E0; /* 30.47126234366208639907816317502275584842 */ static double DR2 = 3.04712623436620863991E1; #endif #ifdef DEC static unsigned short R1[] = {0040671,0007734,0001061,0056734}; #define DR1 *(double *)R1 static unsigned short R2[] = {0041363,0142445,0030416,0165567}; #define DR2 *(double *)R2 #endif #ifdef IBMPC static unsigned short R1[] = {0x2bbb,0x8046,0x21fb,0x4017}; #define DR1 *(double *)R1 static unsigned short R2[] = {0xdd6f,0xa621,0x78a4,0x403e}; #define DR2 *(double *)R2 #endif #ifdef MIEEE static unsigned short R1[] = {0x4017,0x21fb,0x8046,0x2bbb}; #define DR1 *(double *)R1 static unsigned short R2[] = {0x403e,0x78a4,0xa621,0xdd6f}; #define DR2 *(double *)R2 #endif #ifdef UNK static double RP[4] = { -4.79443220978201773821E9, 1.95617491946556577543E12, -2.49248344360967716204E14, 9.70862251047306323952E15, }; static double RQ[8] = { /* 1.00000000000000000000E0,*/ 4.99563147152651017219E2, 1.73785401676374683123E5, 4.84409658339962045305E7, 1.11855537045356834862E10, 2.11277520115489217587E12, 3.10518229857422583814E14, 3.18121955943204943306E16, 1.71086294081043136091E18, }; #endif #ifdef DEC static unsigned short RP[16] = { 0150216,0161235,0064344,0014450, 0052343,0135216,0035624,0144153, 0154142,0130247,0003310,0003667, 0055411,0173703,0047772,0176635, }; static unsigned short RQ[32] = { /*0040200,0000000,0000000,0000000,*/ 0042371,0144025,0032265,0136137, 0044451,0133131,0132420,0151466, 0046470,0144641,0072540,0030636, 0050446,0126600,0045042,0044243, 0052365,0172633,0110301,0071063, 0054215,0032424,0062272,0043513, 0055742,0005013,0171731,0072335, 0057275,0170646,0036663,0013134, }; #endif #ifdef IBMPC static unsigned short RP[16] = { 0x8325,0xad1c,0xdc53,0xc1f1, 0x990d,0xc772,0x7751,0x427c, 0x00f7,0xe0d9,0x5614,0xc2ec, 0x5fb4,0x69ff,0x3ef8,0x4341, }; static unsigned short RQ[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xb78c,0xa696,0x3902,0x407f, 0x1a67,0x36a2,0x36cb,0x4105, 0x0634,0x2eac,0x1934,0x4187, 0x4914,0x0944,0xd5b0,0x4204, 0x2e46,0x7218,0xbeb3,0x427e, 0x48e9,0x8c97,0xa6a2,0x42f1, 0x2e9c,0x7e7b,0x4141,0x435c, 0x62cc,0xc7b6,0xbe34,0x43b7, }; #endif #ifdef MIEEE static unsigned short RP[16] = { 0xc1f1,0xdc53,0xad1c,0x8325, 0x427c,0x7751,0xc772,0x990d, 0xc2ec,0x5614,0xe0d9,0x00f7, 0x4341,0x3ef8,0x69ff,0x5fb4, }; static unsigned short RQ[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x407f,0x3902,0xa696,0xb78c, 0x4105,0x36cb,0x36a2,0x1a67, 0x4187,0x1934,0x2eac,0x0634, 0x4204,0xd5b0,0x0944,0x4914, 0x427e,0xbeb3,0x7218,0x2e46, 0x42f1,0xa6a2,0x8c97,0x48e9, 0x435c,0x4141,0x7e7b,0x2e9c, 0x43b7,0xbe34,0xc7b6,0x62cc, }; #endif #endif #ifndef HAVE_J0 extern double TWOOPI, SQ2OPI, PIO4; double j0(x) double x; { double w, z, p, q, xn; if( x < 0 ) x = -x; if( x <= 5.0 ) { z = x * x; if( x < 1.0e-5 ) return( 1.0 - z/4.0 ); p = (z - DR1) * (z - DR2); p = p * polevl( z, RP, 3)/p1evl( z, RQ, 8 ); return( p ); } w = 5.0/x; q = 25.0/(x*x); p = polevl( q, PP, 6)/polevl( q, PQ, 6 ); q = polevl( q, QP, 7)/p1evl( q, QQ, 7 ); xn = x - PIO4; p = p * cos(xn) - w * q * sin(xn); return( p * SQ2OPI / sqrt(x) ); } #endif /* y0() 2 */ /* Bessel function of second kind, order zero */ /* Rational approximation coefficients YP[], YQ[] are used here. * The function computed is y0(x) - 2 * log(x) * j0(x) / PI, * whose value at x = 0 is 2 * ( log(0.5) + EUL ) / PI * = 0.073804295108687225. */ /* #define PIO4 .78539816339744830962 #define SQ2OPI .79788456080286535588 */ extern double MAXNUM; #ifndef HAVE_Y0 double y0(x) double x; { double w, z, p, q, xn; if( x <= 5.0 ) { if( x <= 0.0 ) { mtherr( "y0", DOMAIN ); return( -MAXNUM ); } z = x * x; w = polevl( z, YP, 7) / p1evl( z, YQ, 7 ); w += TWOOPI * log(x) * j0(x); return( w ); } w = 5.0/x; z = 25.0 / (x * x); p = polevl( z, PP, 6)/polevl( z, PQ, 6 ); q = polevl( z, QP, 7)/p1evl( z, QQ, 7 ); xn = x - PIO4; p = p * sin(xn) + w * q * cos(xn); return( p * SQ2OPI / sqrt(x) ); } #endif grace-5.1.23/cephes/spence.c0000644000076500001440000000741206626627164015343 0ustar fnevgenyusers/* spence.c * * Dilogarithm * * * * SYNOPSIS: * * double x, y, spence(); * * y = spence( x ); * * * * DESCRIPTION: * * Computes the integral * * x * - * | | log t * spence(x) = - | ----- dt * | | t - 1 * - * 1 * * for x >= 0. A rational approximation gives the integral in * the interval (0.5, 1.5). Transformation formulas for 1/x * and 1-x are employed outside the basic expansion range. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,4 30000 3.9e-15 5.4e-16 * DEC 0,4 3000 2.5e-16 4.5e-17 * * */ /* spence.c */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1985, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK static double A[8] = { 4.65128586073990045278E-5, 7.31589045238094711071E-3, 1.33847639578309018650E-1, 8.79691311754530315341E-1, 2.71149851196553469920E0, 4.25697156008121755724E0, 3.29771340985225106936E0, 1.00000000000000000126E0, }; static double B[8] = { 6.90990488912553276999E-4, 2.54043763932544379113E-2, 2.82974860602568089943E-1, 1.41172597751831069617E0, 3.63800533345137075418E0, 5.03278880143316990390E0, 3.54771340985225096217E0, 9.99999999999999998740E-1, }; #endif #ifdef DEC static unsigned short A[32] = { 0034503,0013315,0034120,0157771, 0036357,0135043,0016766,0150637, 0037411,0007533,0005212,0161475, 0040141,0031563,0023217,0120331, 0040455,0104461,0007002,0155522, 0040610,0034434,0065721,0120465, 0040523,0006674,0105671,0054427, 0040200,0000000,0000000,0000000, }; static unsigned short B[32] = { 0035465,0021626,0032367,0144157, 0036720,0016326,0134431,0000406, 0037620,0161024,0133701,0120766, 0040264,0131557,0152055,0064512, 0040550,0152424,0051166,0034272, 0040641,0006233,0014672,0111572, 0040543,0006674,0105671,0054425, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short A[32] = { 0x1bff,0xa70a,0x62d9,0x3f08, 0xda34,0x63be,0xf744,0x3f7d, 0x5c68,0x6151,0x21eb,0x3fc1, 0xf41b,0x64d1,0x266e,0x3fec, 0x5b6a,0x21c0,0xb126,0x4005, 0x3427,0x8d7a,0x0723,0x4011, 0x2b23,0x9177,0x61b7,0x400a, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short B[32] = { 0xf90e,0xc69e,0xa472,0x3f46, 0x2021,0xd723,0x039a,0x3f9a, 0x343f,0x96f8,0x1c42,0x3fd2, 0xad29,0xfa85,0x966d,0x3ff6, 0xc717,0x8a4e,0x1aa2,0x400d, 0x526f,0x6337,0x2193,0x4014, 0x2b23,0x9177,0x61b7,0x400c, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short A[32] = { 0x3f08,0x62d9,0xa70a,0x1bff, 0x3f7d,0xf744,0x63be,0xda34, 0x3fc1,0x21eb,0x6151,0x5c68, 0x3fec,0x266e,0x64d1,0xf41b, 0x4005,0xb126,0x21c0,0x5b6a, 0x4011,0x0723,0x8d7a,0x3427, 0x400a,0x61b7,0x9177,0x2b23, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short B[32] = { 0x3f46,0xa472,0xc69e,0xf90e, 0x3f9a,0x039a,0xd723,0x2021, 0x3fd2,0x1c42,0x96f8,0x343f, 0x3ff6,0x966d,0xfa85,0xad29, 0x400d,0x1aa2,0x8a4e,0xc717, 0x4014,0x2193,0x6337,0x526f, 0x400c,0x61b7,0x9177,0x2b23, 0x3ff0,0x0000,0x0000,0x0000, }; #endif extern double PI, MACHEP; double spence(x) double x; { double w, y, z; int flag; if( x < 0.0 ) { mtherr( "spence", DOMAIN ); return(0.0); } if( x == 1.0 ) return( 0.0 ); if( x == 0.0 ) return( PI*PI/6.0 ); flag = 0; if( x > 2.0 ) { x = 1.0/x; flag |= 2; } if( x > 1.5 ) { w = (1.0/x) - 1.0; flag |= 2; } else if( x < 0.5 ) { w = -x; flag |= 1; } else w = x - 1.0; y = -w * polevl( w, A, 7) / polevl( w, B, 7 ); if( flag & 1 ) y = (PI * PI)/6.0 - log(x) * log(1.0-x) - y; if( flag & 2 ) { z = log(x); y = -0.5 * z * z - y; } return( y ); } grace-5.1.23/cephes/shichi.c0000644000076500001440000003410406626627164015333 0ustar fnevgenyusers/* shichi.c * * Hyperbolic sine and cosine integrals * * * * SYNOPSIS: * * double x, Chi, Shi, shichi(); * * shichi( x, &Chi, &Shi ); * * * DESCRIPTION: * * Approximates the integrals * * x * - * | | cosh t - 1 * Chi(x) = eul + ln x + | ----------- dt, * | | t * - * 0 * * x * - * | | sinh t * Shi(x) = | ------ dt * | | t * - * 0 * * where eul = 0.57721566490153286061 is Euler's constant. * The integrals are evaluated by power series for x < 8 * and by Chebyshev expansions for x between 8 and 88. * For large x, both functions approach exp(x)/2x. * Arguments greater than 88 in magnitude return MAXNUM. * * * ACCURACY: * * Test interval 0 to 88. * Relative error: * arithmetic function # trials peak rms * DEC Shi 3000 9.1e-17 * IEEE Shi 30000 6.9e-16 1.6e-16 * Absolute error, except relative when |Chi| > 1: * DEC Chi 2500 9.3e-17 * IEEE Chi 30000 8.4e-16 1.4e-16 */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK /* x exp(-x) shi(x), inverted interval 8 to 18 */ static double S1[] = { 1.83889230173399459482E-17, -9.55485532279655569575E-17, 2.04326105980879882648E-16, 1.09896949074905343022E-15, -1.31313534344092599234E-14, 5.93976226264314278932E-14, -3.47197010497749154755E-14, -1.40059764613117131000E-12, 9.49044626224223543299E-12, -1.61596181145435454033E-11, -1.77899784436430310321E-10, 1.35455469767246947469E-9, -1.03257121792819495123E-9, -3.56699611114982536845E-8, 1.44818877384267342057E-7, 7.82018215184051295296E-7, -5.39919118403805073710E-6, -3.12458202168959833422E-5, 8.90136741950727517826E-5, 2.02558474743846862168E-3, 2.96064440855633256972E-2, 1.11847751047257036625E0 }; /* x exp(-x) shi(x), inverted interval 18 to 88 */ static double S2[] = { -1.05311574154850938805E-17, 2.62446095596355225821E-17, 8.82090135625368160657E-17, -3.38459811878103047136E-16, -8.30608026366935789136E-16, 3.93397875437050071776E-15, 1.01765565969729044505E-14, -4.21128170307640802703E-14, -1.60818204519802480035E-13, 3.34714954175994481761E-13, 2.72600352129153073807E-12, 1.66894954752839083608E-12, -3.49278141024730899554E-11, -1.58580661666482709598E-10, -1.79289437183355633342E-10, 1.76281629144264523277E-9, 1.69050228879421288846E-8, 1.25391771228487041649E-7, 1.16229947068677338732E-6, 1.61038260117376323993E-5, 3.49810375601053973070E-4, 1.28478065259647610779E-2, 1.03665722588798326712E0 }; #endif #ifdef DEC static unsigned short S1[] = { 0022251,0115635,0165120,0006574, 0122734,0050751,0020305,0101356, 0023153,0111154,0011103,0177462, 0023636,0060321,0060253,0124246, 0124554,0106655,0152525,0166400, 0025205,0140145,0171006,0106556, 0125034,0056427,0004205,0176022, 0126305,0016731,0025011,0134453, 0027046,0172453,0112604,0116235, 0127216,0022071,0116600,0137667, 0130103,0115126,0071104,0052535, 0030672,0025450,0010071,0141414, 0130615,0165136,0132137,0177737, 0132031,0031611,0074436,0175407, 0032433,0077602,0104345,0060076, 0033121,0165741,0167177,0172433, 0133665,0025262,0174621,0022612, 0134403,0006761,0124566,0145405, 0034672,0126332,0034737,0116744, 0036004,0137654,0037332,0131766, 0036762,0104466,0121445,0124326, 0040217,0025105,0062145,0042640 }; static unsigned short S2[] = { 0122102,0041774,0016051,0055137, 0022362,0010125,0007651,0015773, 0022713,0062551,0040227,0071645, 0123303,0015732,0025731,0146570, 0123557,0064016,0002067,0067711, 0024215,0136214,0132374,0124234, 0024467,0051425,0071066,0064210, 0125075,0124305,0135123,0024170, 0125465,0010261,0005560,0034232, 0025674,0066602,0030724,0174557, 0026477,0151520,0051510,0067250, 0026352,0161076,0113154,0116271, 0127431,0116470,0177465,0127274, 0130056,0056174,0170315,0013321, 0130105,0020575,0075327,0036710, 0030762,0043625,0113046,0125035, 0031621,0033211,0154354,0022077, 0032406,0121555,0074270,0041141, 0033234,0000116,0041611,0173743, 0034207,0013263,0174715,0115563, 0035267,0063300,0175753,0117266, 0036522,0077633,0033255,0136200, 0040204,0130457,0014454,0166254 }; #endif #ifdef IBMPC static unsigned short S1[] = { 0x01b0,0xbd4a,0x3373,0x3c75, 0xb05e,0x2418,0x8a3d,0xbc9b, 0x7fe6,0x8248,0x724d,0x3cad, 0x7515,0x2c15,0xcc1a,0x3cd3, 0xbda0,0xbaaa,0x91b5,0xbd0d, 0xd1ae,0xbe40,0xb80c,0x3d30, 0xbf82,0xe110,0x8ba2,0xbd23, 0x3725,0x2541,0xa3bb,0xbd78, 0x9394,0x72b0,0xdea5,0x3da4, 0x17f7,0x33b0,0xc487,0xbdb1, 0x8aac,0xce48,0x734a,0xbde8, 0x3862,0x0207,0x4565,0x3e17, 0xfffc,0xd68b,0xbd4b,0xbe11, 0xdf61,0x2f23,0x2671,0xbe63, 0xac08,0x511c,0x6ff0,0x3e83, 0xfea3,0x3dcf,0x3d7c,0x3eaa, 0x24b1,0x5f32,0xa556,0xbed6, 0xd961,0x352e,0x61be,0xbf00, 0xf3bd,0x473b,0x559b,0x3f17, 0x567f,0x87db,0x97f5,0x3f60, 0xb51b,0xd464,0x5126,0x3f9e, 0xa8b4,0xac8c,0xe548,0x3ff1 }; static unsigned short S2[] = { 0x2b4c,0x8385,0x487f,0xbc68, 0x237f,0xa1f5,0x420a,0x3c7e, 0xee75,0x2812,0x6cad,0x3c99, 0x39af,0x457b,0x637b,0xbcb8, 0xedf9,0xc086,0xed01,0xbccd, 0x9513,0x969f,0xb791,0x3cf1, 0xcd11,0xae46,0xea62,0x3d06, 0x650f,0xb74a,0xb518,0xbd27, 0x0713,0x216e,0xa216,0xbd46, 0x9f2e,0x463a,0x8db0,0x3d57, 0x0dd5,0x0a69,0xfa6a,0x3d87, 0x9397,0xd2cd,0x5c47,0x3d7d, 0xb5d8,0x1fe6,0x33a7,0xbdc3, 0xa2da,0x9e19,0xcb8f,0xbde5, 0xe7b9,0xaf5a,0xa42f,0xbde8, 0xd544,0xb2c4,0x48f2,0x3e1e, 0x8488,0x3b1d,0x26d1,0x3e52, 0x084c,0xaf17,0xd46d,0x3e80, 0x3efc,0xc871,0x8009,0x3eb3, 0xb36e,0x7f39,0xe2d6,0x3ef0, 0x73d7,0x1f7d,0xecd8,0x3f36, 0xb790,0x66d5,0x4ff3,0x3f8a, 0x9d96,0xe325,0x9625,0x3ff0 }; #endif #ifdef MIEEE static unsigned short S1[] = { 0x3c75,0x3373,0xbd4a,0x01b0, 0xbc9b,0x8a3d,0x2418,0xb05e, 0x3cad,0x724d,0x8248,0x7fe6, 0x3cd3,0xcc1a,0x2c15,0x7515, 0xbd0d,0x91b5,0xbaaa,0xbda0, 0x3d30,0xb80c,0xbe40,0xd1ae, 0xbd23,0x8ba2,0xe110,0xbf82, 0xbd78,0xa3bb,0x2541,0x3725, 0x3da4,0xdea5,0x72b0,0x9394, 0xbdb1,0xc487,0x33b0,0x17f7, 0xbde8,0x734a,0xce48,0x8aac, 0x3e17,0x4565,0x0207,0x3862, 0xbe11,0xbd4b,0xd68b,0xfffc, 0xbe63,0x2671,0x2f23,0xdf61, 0x3e83,0x6ff0,0x511c,0xac08, 0x3eaa,0x3d7c,0x3dcf,0xfea3, 0xbed6,0xa556,0x5f32,0x24b1, 0xbf00,0x61be,0x352e,0xd961, 0x3f17,0x559b,0x473b,0xf3bd, 0x3f60,0x97f5,0x87db,0x567f, 0x3f9e,0x5126,0xd464,0xb51b, 0x3ff1,0xe548,0xac8c,0xa8b4 }; static unsigned short S2[] = { 0xbc68,0x487f,0x8385,0x2b4c, 0x3c7e,0x420a,0xa1f5,0x237f, 0x3c99,0x6cad,0x2812,0xee75, 0xbcb8,0x637b,0x457b,0x39af, 0xbccd,0xed01,0xc086,0xedf9, 0x3cf1,0xb791,0x969f,0x9513, 0x3d06,0xea62,0xae46,0xcd11, 0xbd27,0xb518,0xb74a,0x650f, 0xbd46,0xa216,0x216e,0x0713, 0x3d57,0x8db0,0x463a,0x9f2e, 0x3d87,0xfa6a,0x0a69,0x0dd5, 0x3d7d,0x5c47,0xd2cd,0x9397, 0xbdc3,0x33a7,0x1fe6,0xb5d8, 0xbde5,0xcb8f,0x9e19,0xa2da, 0xbde8,0xa42f,0xaf5a,0xe7b9, 0x3e1e,0x48f2,0xb2c4,0xd544, 0x3e52,0x26d1,0x3b1d,0x8488, 0x3e80,0xd46d,0xaf17,0x084c, 0x3eb3,0x8009,0xc871,0x3efc, 0x3ef0,0xe2d6,0x7f39,0xb36e, 0x3f36,0xecd8,0x1f7d,0x73d7, 0x3f8a,0x4ff3,0x66d5,0xb790, 0x3ff0,0x9625,0xe325,0x9d96 }; #endif #ifdef UNK /* x exp(-x) chin(x), inverted interval 8 to 18 */ static double C1[] = { -8.12435385225864036372E-18, 2.17586413290339214377E-17, 5.22624394924072204667E-17, -9.48812110591690559363E-16, 5.35546311647465209166E-15, -1.21009970113732918701E-14, -6.00865178553447437951E-14, 7.16339649156028587775E-13, -2.93496072607599856104E-12, -1.40359438136491256904E-12, 8.76302288609054966081E-11, -4.40092476213282340617E-10, -1.87992075640569295479E-10, 1.31458150989474594064E-8, -4.75513930924765465590E-8, -2.21775018801848880741E-7, 1.94635531373272490962E-6, 4.33505889257316408893E-6, -6.13387001076494349496E-5, -3.13085477492997465138E-4, 4.97164789823116062801E-4, 2.64347496031374526641E-2, 1.11446150876699213025E0 }; /* x exp(-x) chin(x), inverted interval 18 to 88 */ static double C2[] = { 8.06913408255155572081E-18, -2.08074168180148170312E-17, -5.98111329658272336816E-17, 2.68533951085945765591E-16, 4.52313941698904694774E-16, -3.10734917335299464535E-15, -4.42823207332531972288E-15, 3.49639695410806959872E-14, 6.63406731718911586609E-14, -3.71902448093119218395E-13, -1.27135418132338309016E-12, 2.74851141935315395333E-12, 2.33781843985453438400E-11, 2.71436006377612442764E-11, -2.56600180000355990529E-10, -1.61021375163803438552E-9, -4.72543064876271773512E-9, -3.00095178028681682282E-9, 7.79387474390914922337E-8, 1.06942765566401507066E-6, 1.59503164802313196374E-5, 3.49592575153777996871E-4, 1.28475387530065247392E-2, 1.03665693917934275131E0 }; #endif #ifdef DEC static unsigned short C1[] = { 0122025,0157055,0021702,0021427, 0022310,0130043,0123265,0022340, 0022561,0002231,0017746,0013043, 0123610,0136375,0002352,0024467, 0024300,0171555,0141300,0000446, 0124531,0176777,0126210,0035616, 0125207,0046604,0167760,0077132, 0026111,0120666,0026606,0064143, 0126516,0103615,0054127,0005436, 0126305,0104721,0025415,0004134, 0027700,0131556,0164725,0157553, 0130361,0170602,0077274,0055406, 0130116,0131420,0125472,0017231, 0031541,0153747,0177312,0056304, 0132114,0035517,0041545,0043151, 0132556,0020415,0110044,0172442, 0033402,0117041,0031152,0010364, 0033621,0072737,0050647,0013720, 0134600,0121366,0140010,0063265, 0135244,0022637,0013756,0044742, 0035402,0052052,0006523,0043564, 0036730,0106660,0020277,0162146, 0040216,0123254,0135147,0005724 }; static unsigned short C2[] = { 0022024,0154550,0104311,0144257, 0122277,0165037,0133443,0155601, 0122611,0165102,0157053,0055252, 0023232,0146235,0153511,0113222, 0023402,0057340,0145304,0010471, 0124137,0164171,0113071,0100002, 0124237,0105473,0056130,0022022, 0025035,0073266,0056746,0164433, 0025225,0061313,0055600,0165407, 0125721,0056312,0107613,0051215, 0126262,0166534,0115336,0066653, 0026501,0064307,0127442,0065573, 0027315,0121375,0142020,0045356, 0027356,0140764,0070641,0046570, 0130215,0010503,0146335,0177737, 0130735,0047134,0015215,0163665, 0131242,0056523,0155276,0050053, 0131116,0034515,0050707,0163512, 0032247,0057507,0107545,0032007, 0033217,0104501,0021706,0025047, 0034205,0146413,0033746,0076562, 0035267,0044605,0065355,0002772, 0036522,0077173,0130716,0170304, 0040204,0130454,0130571,0027270 }; #endif #ifdef IBMPC static unsigned short C1[] = { 0x4463,0xa478,0xbbc5,0xbc62, 0xa49c,0x74d6,0x1604,0x3c79, 0xc2c4,0x23fc,0x2093,0x3c8e, 0x4527,0xa09d,0x179f,0xbcd1, 0x0025,0xb858,0x1e6d,0x3cf8, 0x0772,0xf591,0x3fbf,0xbd0b, 0x0fcb,0x9dfe,0xe9b0,0xbd30, 0xcd0c,0xc5b0,0x3436,0x3d69, 0xe164,0xab0a,0xd0f1,0xbd89, 0xa10c,0x2561,0xb13a,0xbd78, 0xbbed,0xdd3a,0x166d,0x3dd8, 0x8b61,0x4fd7,0x3e30,0xbdfe, 0x43d3,0x1567,0xd662,0xbde9, 0x4b98,0xffd9,0x3afc,0x3e4c, 0xa8cd,0xe86c,0x8769,0xbe69, 0x9ea4,0xb204,0xc421,0xbe8d, 0x421f,0x264d,0x53c4,0x3ec0, 0xe2fa,0xea34,0x2ebb,0x3ed2, 0x0cd7,0xd801,0x145e,0xbf10, 0xc93c,0xe2fd,0x84b3,0xbf34, 0x68ef,0x41aa,0x4a85,0x3f40, 0xfc8d,0x0417,0x11b6,0x3f9b, 0xe17b,0x974c,0xd4d5,0x3ff1 }; static unsigned short C2[] = { 0x3916,0x1119,0x9b2d,0x3c62, 0x7b70,0xf6e4,0xfd43,0xbc77, 0x6b55,0x5bc5,0x3d48,0xbc91, 0x32d2,0xbae9,0x5993,0x3cb3, 0x8227,0x1958,0x4bdc,0x3cc0, 0x3000,0x32c7,0xfd0f,0xbceb, 0x0482,0x6b8b,0xf167,0xbcf3, 0xdd23,0xcbbc,0xaed6,0x3d23, 0x1d61,0x6b70,0xac59,0x3d32, 0x6a52,0x51f1,0x2b99,0xbd5a, 0xcdb5,0x935b,0x5dab,0xbd76, 0x4d6f,0xf5e4,0x2d18,0x3d88, 0x095e,0xb882,0xb45f,0x3db9, 0x29af,0x8e34,0xd83e,0x3dbd, 0xbffc,0x799b,0xa228,0xbdf1, 0xbcf7,0x8351,0xa9cb,0xbe1b, 0xca05,0x7b57,0x4baa,0xbe34, 0xfce9,0xaa38,0xc729,0xbe29, 0xa681,0xf1ec,0xebe8,0x3e74, 0xc545,0x2478,0xf128,0x3eb1, 0xcfae,0x66fc,0xb9a1,0x3ef0, 0xa0bf,0xad5d,0xe930,0x3f36, 0xde19,0x7639,0x4fcf,0x3f8a, 0x25d7,0x962f,0x9625,0x3ff0 }; #endif #ifdef MIEEE static unsigned short C1[] = { 0xbc62,0xbbc5,0xa478,0x4463, 0x3c79,0x1604,0x74d6,0xa49c, 0x3c8e,0x2093,0x23fc,0xc2c4, 0xbcd1,0x179f,0xa09d,0x4527, 0x3cf8,0x1e6d,0xb858,0x0025, 0xbd0b,0x3fbf,0xf591,0x0772, 0xbd30,0xe9b0,0x9dfe,0x0fcb, 0x3d69,0x3436,0xc5b0,0xcd0c, 0xbd89,0xd0f1,0xab0a,0xe164, 0xbd78,0xb13a,0x2561,0xa10c, 0x3dd8,0x166d,0xdd3a,0xbbed, 0xbdfe,0x3e30,0x4fd7,0x8b61, 0xbde9,0xd662,0x1567,0x43d3, 0x3e4c,0x3afc,0xffd9,0x4b98, 0xbe69,0x8769,0xe86c,0xa8cd, 0xbe8d,0xc421,0xb204,0x9ea4, 0x3ec0,0x53c4,0x264d,0x421f, 0x3ed2,0x2ebb,0xea34,0xe2fa, 0xbf10,0x145e,0xd801,0x0cd7, 0xbf34,0x84b3,0xe2fd,0xc93c, 0x3f40,0x4a85,0x41aa,0x68ef, 0x3f9b,0x11b6,0x0417,0xfc8d, 0x3ff1,0xd4d5,0x974c,0xe17b }; static unsigned short C2[] = { 0x3c62,0x9b2d,0x1119,0x3916, 0xbc77,0xfd43,0xf6e4,0x7b70, 0xbc91,0x3d48,0x5bc5,0x6b55, 0x3cb3,0x5993,0xbae9,0x32d2, 0x3cc0,0x4bdc,0x1958,0x8227, 0xbceb,0xfd0f,0x32c7,0x3000, 0xbcf3,0xf167,0x6b8b,0x0482, 0x3d23,0xaed6,0xcbbc,0xdd23, 0x3d32,0xac59,0x6b70,0x1d61, 0xbd5a,0x2b99,0x51f1,0x6a52, 0xbd76,0x5dab,0x935b,0xcdb5, 0x3d88,0x2d18,0xf5e4,0x4d6f, 0x3db9,0xb45f,0xb882,0x095e, 0x3dbd,0xd83e,0x8e34,0x29af, 0xbdf1,0xa228,0x799b,0xbffc, 0xbe1b,0xa9cb,0x8351,0xbcf7, 0xbe34,0x4baa,0x7b57,0xca05, 0xbe29,0xc729,0xaa38,0xfce9, 0x3e74,0xebe8,0xf1ec,0xa681, 0x3eb1,0xf128,0x2478,0xc545, 0x3ef0,0xb9a1,0x66fc,0xcfae, 0x3f36,0xe930,0xad5d,0xa0bf, 0x3f8a,0x4fcf,0x7639,0xde19, 0x3ff0,0x9625,0x962f,0x25d7 }; #endif /* Sine and cosine integrals */ #define EUL 0.57721566490153286061 extern double MACHEP, MAXNUM, PIO2; int shichi( x, si, ci ) double x; double *si, *ci; { double k, z, c, s, a; short sign; if( x < 0.0 ) { sign = -1; x = -x; } else sign = 0; if( x == 0.0 ) { *si = 0.0; *ci = -MAXNUM; return( 0 ); } if( x >= 8.0 ) goto chb; z = x * x; /* Direct power series expansion */ a = 1.0; s = 1.0; c = 0.0; k = 2.0; do { a *= z/k; c += a/k; k += 1.0; a /= k; s += a/k; k += 1.0; } while( fabs(a/s) > MACHEP ); s *= x; goto done; chb: if( x < 18.0 ) { a = (576.0/x - 52.0)/10.0; k = exp(x) / x; s = k * chbevl( a, S1, 22 ); c = k * chbevl( a, C1, 23 ); goto done; } if( x <= 88.0 ) { a = (6336.0/x - 212.0)/70.0; k = exp(x) / x; s = k * chbevl( a, S2, 23 ); c = k * chbevl( a, C2, 24 ); goto done; } else { if( sign ) *si = -MAXNUM; else *si = MAXNUM; *ci = MAXNUM; return(0); } done: if( sign ) s = -s; *si = s; *ci = EUL + log(x) + c; return(0); } grace-5.1.23/cephes/ndtr.c0000644000076500001440000002323606626627164015037 0ustar fnevgenyusers/* ndtr.c * * Normal distribution function * * * * SYNOPSIS: * * double x, y, ndtr(); * * y = ndtr( x ); * * * * DESCRIPTION: * * Returns the area under the Gaussian probability density * function, integrated from minus infinity to x: * * x * - * 1 | | 2 * ndtr(x) = --------- | exp( - t /2 ) dt * sqrt(2pi) | | * - * -inf. * * = ( 1 + erf(z) ) / 2 * = erfc(z) / 2 * * where z = x/sqrt(2). Computation is via the functions * erf and erfc. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -13,0 8000 2.1e-15 4.8e-16 * IEEE -13,0 30000 3.4e-14 6.7e-15 * * * ERROR MESSAGES: * * message condition value returned * erfc underflow x > 37.519379347 0.0 * */ /* erf.c * * Error function * * * * SYNOPSIS: * * double x, y, erf(); * * y = erf( x ); * * * * DESCRIPTION: * * The integral is * * x * - * 2 | | 2 * erf(x) = -------- | exp( - t ) dt. * sqrt(pi) | | * - * 0 * * The magnitude of x is limited to 9.231948545 for DEC * arithmetic; 1 or -1 is returned outside this range. * * For 0 <= |x| < 1, erf(x) = x * P4(x**2)/Q5(x**2); otherwise * erf(x) = 1 - erfc(x). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,1 14000 4.7e-17 1.5e-17 * IEEE 0,1 30000 3.7e-16 1.0e-16 * */ /* erfc.c * * Complementary error function * * * * SYNOPSIS: * * double x, y, erfc(); * * y = erfc( x ); * * * * DESCRIPTION: * * * 1 - erf(x) = * * inf. * - * 2 | | 2 * erfc(x) = -------- | exp( - t ) dt * sqrt(pi) | | * - * x * * * For small x, erfc(x) = 1 - erf(x); otherwise rational * approximations are computed. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 9.2319 12000 5.1e-16 1.2e-16 * IEEE 0,26.6417 30000 5.7e-14 1.5e-14 * * * ERROR MESSAGES: * * message condition value returned * erfc underflow x > 9.231948545 (DEC) 0.0 * * */ /* Cephes Math Library Release 2.2: June, 1992 Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double SQRTH; #if !defined(HAVE_ERF) || !defined(HAVE_ERFC) extern double MAXLOG; #ifdef UNK static double P[] = { 2.46196981473530512524E-10, 5.64189564831068821977E-1, 7.46321056442269912687E0, 4.86371970985681366614E1, 1.96520832956077098242E2, 5.26445194995477358631E2, 9.34528527171957607540E2, 1.02755188689515710272E3, 5.57535335369399327526E2 }; static double Q[] = { /* 1.00000000000000000000E0,*/ 1.32281951154744992508E1, 8.67072140885989742329E1, 3.54937778887819891062E2, 9.75708501743205489753E2, 1.82390916687909736289E3, 2.24633760818710981792E3, 1.65666309194161350182E3, 5.57535340817727675546E2 }; static double R[] = { 5.64189583547755073984E-1, 1.27536670759978104416E0, 5.01905042251180477414E0, 6.16021097993053585195E0, 7.40974269950448939160E0, 2.97886665372100240670E0 }; static double S[] = { /* 1.00000000000000000000E0,*/ 2.26052863220117276590E0, 9.39603524938001434673E0, 1.20489539808096656605E1, 1.70814450747565897222E1, 9.60896809063285878198E0, 3.36907645100081516050E0 }; static double T[] = { 9.60497373987051638749E0, 9.00260197203842689217E1, 2.23200534594684319226E3, 7.00332514112805075473E3, 5.55923013010394962768E4 }; static double U[] = { /* 1.00000000000000000000E0,*/ 3.35617141647503099647E1, 5.21357949780152679795E2, 4.59432382970980127987E3, 2.26290000613890934246E4, 4.92673942608635921086E4 }; #define UTHRESH 37.519379347 #endif #ifdef DEC static unsigned short P[] = { 0030207,0054445,0011173,0021706, 0040020,0067272,0030661,0122075, 0040756,0151236,0173053,0067042, 0041502,0106175,0062555,0151457, 0042104,0102525,0047401,0003667, 0042403,0116176,0011446,0075303, 0042551,0120723,0061641,0123275, 0042600,0070651,0007264,0134516, 0042413,0061102,0167507,0176625 }; static unsigned short Q[] = { /*0040200,0000000,0000000,0000000,*/ 0041123,0123257,0165741,0017142, 0041655,0065027,0173413,0115450, 0042261,0074011,0021573,0004150, 0042563,0166530,0013662,0007200, 0042743,0176427,0162443,0105214, 0043014,0062546,0153727,0123772, 0042717,0012470,0006227,0067424, 0042413,0061103,0003042,0013254 }; static unsigned short R[] = { 0040020,0067272,0101024,0155421, 0040243,0037467,0056706,0026462, 0040640,0116017,0120665,0034315, 0040705,0020162,0143350,0060137, 0040755,0016234,0134304,0130157, 0040476,0122700,0051070,0015473 }; static unsigned short S[] = { /*0040200,0000000,0000000,0000000,*/ 0040420,0126200,0044276,0070413, 0041026,0053051,0007302,0063746, 0041100,0144203,0174051,0061151, 0041210,0123314,0126343,0177646, 0041031,0137125,0051431,0033011, 0040527,0117362,0152661,0066201 }; static unsigned short T[] = { 0041031,0126770,0170672,0166101, 0041664,0006522,0072360,0031770, 0043013,0100025,0162641,0126671, 0043332,0155231,0161627,0076200, 0044131,0024115,0021020,0117343 }; static unsigned short U[] = { /*0040200,0000000,0000000,0000000,*/ 0041406,0037461,0177575,0032714, 0042402,0053350,0123061,0153557, 0043217,0111227,0032007,0164217, 0043660,0145000,0004013,0160114, 0044100,0071544,0167107,0125471 }; #define UTHRESH 14.0 #endif #ifdef IBMPC static unsigned short P[] = { 0x6479,0xa24f,0xeb24,0x3df0, 0x3488,0x4636,0x0dd7,0x3fe2, 0x6dc4,0xdec5,0xda53,0x401d, 0xba66,0xacad,0x518f,0x4048, 0x20f7,0xa9e0,0x90aa,0x4068, 0xcf58,0xc264,0x738f,0x4080, 0x34d8,0x6c74,0x343a,0x408d, 0x972a,0x21d6,0x0e35,0x4090, 0xffb3,0x5de8,0x6c48,0x4081 }; static unsigned short Q[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x23cc,0xfd7c,0x74d5,0x402a, 0x7365,0xfee1,0xad42,0x4055, 0x610d,0x246f,0x2f01,0x4076, 0x41d0,0x02f6,0x7dab,0x408e, 0x7151,0xfca4,0x7fa2,0x409c, 0xf4ff,0xdafa,0x8cac,0x40a1, 0xede2,0x0192,0xe2a7,0x4099, 0x42d6,0x60c4,0x6c48,0x4081 }; static unsigned short R[] = { 0x9b62,0x5042,0x0dd7,0x3fe2, 0xc5a6,0xebb8,0x67e6,0x3ff4, 0xa71a,0xf436,0x1381,0x4014, 0x0c0c,0x58dd,0xa40e,0x4018, 0x960e,0x9718,0xa393,0x401d, 0x0367,0x0a47,0xd4b8,0x4007 }; static unsigned short S[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xce21,0x0917,0x1590,0x4002, 0x4cfd,0x21d8,0xcac5,0x4022, 0x2c4d,0x7f05,0x1910,0x4028, 0x7ff5,0x959c,0x14d9,0x4031, 0x26c1,0xaa63,0x37ca,0x4023, 0x2d90,0x5ab6,0xf3de,0x400a }; static unsigned short T[] = { 0x5d88,0x1e37,0x35bf,0x4023, 0x067f,0x4e9e,0x81aa,0x4056, 0x35b7,0xbcb4,0x7002,0x40a1, 0xef90,0x3c72,0x5b53,0x40bb, 0x13dc,0xa442,0x2509,0x40eb }; static unsigned short U[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xa6ba,0x3fef,0xc7e6,0x4040, 0x3aee,0x14c6,0x4add,0x4080, 0xfd12,0xe680,0xf252,0x40b1, 0x7c0a,0x0101,0x1940,0x40d6, 0xf567,0x9dc8,0x0e6c,0x40e8 }; #define UTHRESH 37.519379347 #endif #ifdef MIEEE static unsigned short P[] = { 0x3df0,0xeb24,0xa24f,0x6479, 0x3fe2,0x0dd7,0x4636,0x3488, 0x401d,0xda53,0xdec5,0x6dc4, 0x4048,0x518f,0xacad,0xba66, 0x4068,0x90aa,0xa9e0,0x20f7, 0x4080,0x738f,0xc264,0xcf58, 0x408d,0x343a,0x6c74,0x34d8, 0x4090,0x0e35,0x21d6,0x972a, 0x4081,0x6c48,0x5de8,0xffb3 }; static unsigned short Q[] = { 0x402a,0x74d5,0xfd7c,0x23cc, 0x4055,0xad42,0xfee1,0x7365, 0x4076,0x2f01,0x246f,0x610d, 0x408e,0x7dab,0x02f6,0x41d0, 0x409c,0x7fa2,0xfca4,0x7151, 0x40a1,0x8cac,0xdafa,0xf4ff, 0x4099,0xe2a7,0x0192,0xede2, 0x4081,0x6c48,0x60c4,0x42d6 }; static unsigned short R[] = { 0x3fe2,0x0dd7,0x5042,0x9b62, 0x3ff4,0x67e6,0xebb8,0xc5a6, 0x4014,0x1381,0xf436,0xa71a, 0x4018,0xa40e,0x58dd,0x0c0c, 0x401d,0xa393,0x9718,0x960e, 0x4007,0xd4b8,0x0a47,0x0367 }; static unsigned short S[] = { 0x4002,0x1590,0x0917,0xce21, 0x4022,0xcac5,0x21d8,0x4cfd, 0x4028,0x1910,0x7f05,0x2c4d, 0x4031,0x14d9,0x959c,0x7ff5, 0x4023,0x37ca,0xaa63,0x26c1, 0x400a,0xf3de,0x5ab6,0x2d90 }; static unsigned short T[] = { 0x4023,0x35bf,0x1e37,0x5d88, 0x4056,0x81aa,0x4e9e,0x067f, 0x40a1,0x7002,0xbcb4,0x35b7, 0x40bb,0x5b53,0x3c72,0xef90, 0x40eb,0x2509,0xa442,0x13dc }; static unsigned short U[] = { 0x4040,0xc7e6,0x3fef,0xa6ba, 0x4080,0x4add,0x14c6,0x3aee, 0x40b1,0xf252,0xe680,0xfd12, 0x40d6,0x1940,0x0101,0x7c0a, 0x40e8,0x0e6c,0x9dc8,0xf567 }; #define UTHRESH 37.519379347 #endif #endif /* HAVE_ERF or HAVE_ERFC */ double ndtr(a) double a; { double x, y, z; x = a * SQRTH; z = fabs(x); if( z < SQRTH ) y = 0.5 + 0.5 * erf(x); else { y = 0.5 * erfc(z); if( x > 0 ) y = 1.0 - y; } return(y); } #ifndef HAVE_ERFC double erfc(a) double a; { double p,q,x,y,z; if( a < 0.0 ) x = -a; else x = a; if( x < 1.0 ) return( 1.0 - erf(a) ); z = -a * a; if( z < -MAXLOG ) { under: mtherr( "erfc", UNDERFLOW ); if( a < 0 ) return( 2.0 ); else return( 0.0 ); } z = exp(z); if( x < 8.0 ) { p = polevl( x, P, 8 ); q = p1evl( x, Q, 8 ); } else { p = polevl( x, R, 5 ); q = p1evl( x, S, 6 ); } y = (z * p)/q; if( a < 0 ) y = 2.0 - y; if( y == 0.0 ) goto under; return(y); } #endif /* HAVE_ERFC */ #ifndef HAVE_ERF double erf(x) double x; { double y, z; if( fabs(x) > 1.0 ) return( 1.0 - erfc(x) ); z = x * x; y = x * polevl( z, T, 4 ) / p1evl( z, U, 5 ); return( y ); } #endif /* HAVE_ERF */ grace-5.1.23/cephes/ellie.c0000644000076500001440000000453606626627163015163 0ustar fnevgenyusers/* ellie.c * * Incomplete elliptic integral of the second kind * * * * SYNOPSIS: * * double phi, m, y, ellie(); * * y = ellie( phi, m ); * * * * DESCRIPTION: * * Approximates the integral * * * phi * - * | | * | 2 * E(phi_\m) = | sqrt( 1 - m sin t ) dt * | * | | * - * 0 * * of amplitude phi and modulus m, using the arithmetic - * geometric mean algorithm. * * * * ACCURACY: * * Tested at random arguments with phi in [-10, 10] and m in * [0, 1]. * Relative error: * arithmetic domain # trials peak rms * DEC 0,2 2000 1.9e-16 3.4e-17 * IEEE -10,10 150000 3.3e-15 1.4e-16 * * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987, 1993 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ /* Incomplete elliptic integral of second kind */ #include "mconf.h" #include "cephes.h" extern double PI, PIO2, MACHEP; double ellie( phi, m ) double phi, m; { double a, b, c, e, temp; double lphi, t, E; int d, mod, npio2, sign; if( m == 0.0 ) return( phi ); lphi = phi; npio2 = floor( lphi/PIO2 ); if( npio2 & 1 ) npio2 += 1; lphi = lphi - npio2 * PIO2; if( lphi < 0.0 ) { lphi = -lphi; sign = -1; } else { sign = 1; } a = 1.0 - m; E = ellpe( a ); if( a == 0.0 ) { temp = sin( lphi ); goto done; } t = tan( lphi ); b = sqrt(a); /* Thanks to Brian Fitzgerald for pointing out an instability near odd multiples of pi/2. */ if( fabs(t) > 10.0 ) { /* Transform the amplitude */ e = 1.0/(b*t); /* ... but avoid multiple recursions. */ if( fabs(e) < 10.0 ) { e = atan(e); temp = E + m * sin( lphi ) * sin( e ) - ellie( e, m ); goto done; } } c = sqrt(m); a = 1.0; d = 1; e = 0.0; mod = 0; while( fabs(c/a) > MACHEP ) { temp = b/a; lphi = lphi + atan(t*temp) + mod * PI; mod = (lphi + PIO2)/PI; t = t * ( 1.0 + temp )/( 1.0 - temp * t * t ); c = ( a - b )/2.0; temp = sqrt( a * b ); a = ( a + b )/2.0; b = temp; d += d; e += c * sin(lphi); } temp = E / ellpk( 1.0 - m ); temp *= (atan(t) + mod * PI)/(d * a); temp += e; done: if( sign < 0 ) temp = -temp; temp += npio2 * E; return( temp ); } grace-5.1.23/cephes/round.c0000644000076500001440000000177306626627164015221 0ustar fnevgenyusers/* round.c * * Round double to nearest or even integer valued double * * * * SYNOPSIS: * * double x, y, round(); * * y = round(x); * * * * DESCRIPTION: * * Returns the nearest integer to x as a double precision * floating point result. If x ends in 0.5 exactly, the * nearest even integer is chosen. * * * * ACCURACY: * * If x is greater than 1/(2*MACHEP), its closest machine * representation is already an integer, so rounding does * not change it. */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" double round(x) double x; { double y, r; /* Largest integer <= x */ y = floor(x); /* Fractional part */ r = x - y; /* Round up to nearest. */ if( r > 0.5 ) goto rndup; /* Round to even */ if( r == 0.5 ) { r = y - 2.0 * floor( 0.5 * y ); if( r == 1.0 ) { rndup: y += 1.0; } } /* Else round down. */ return(y); } grace-5.1.23/cephes/incbet.c0000644000076500001440000001500006626627164015322 0ustar fnevgenyusers/* incbet.c * * Incomplete beta integral * * * SYNOPSIS: * * double a, b, x, y, incbet(); * * y = incbet( a, b, x ); * * * DESCRIPTION: * * Returns incomplete beta integral of the arguments, evaluated * from zero to x. The function is defined as * * x * - - * | (a+b) | | a-1 b-1 * ----------- | t (1-t) dt. * - - | | * | (a) | (b) - * 0 * * The domain of definition is 0 <= x <= 1. In this * implementation a and b are restricted to positive values. * The integral from x to 1 may be obtained by the symmetry * relation * * 1 - incbet( a, b, x ) = incbet( b, a, 1-x ). * * The integral is evaluated by a continued fraction expansion * or, when b*x is small, by a power series. * * ACCURACY: * * Tested at uniformly distributed random points (a,b,x) with a and b * in "domain" and x between 0 and 1. * Relative error * arithmetic domain # trials peak rms * IEEE 0,5 10000 6.9e-15 4.5e-16 * IEEE 0,85 250000 2.2e-13 1.7e-14 * IEEE 0,1000 30000 5.3e-12 6.3e-13 * IEEE 0,10000 250000 9.3e-11 7.1e-12 * IEEE 0,100000 10000 8.7e-10 4.8e-11 * Outputs smaller than the IEEE gradual underflow threshold * were excluded from these statistics. * * ERROR MESSAGES: * message condition value returned * incbet domain x<0, x>1 0.0 * incbet underflow 0.0 */ /* Cephes Math Library, Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #ifdef DEC #define MAXGAM 34.84425627277176174 #else #define MAXGAM 171.624376956302725 #endif extern double MACHEP, MINLOG, MAXLOG; static double incbcf(double, double, double); static double incbd(double, double, double); static double pseries(double, double, double); static double big = 4.503599627370496e15; static double biginv = 2.22044604925031308085e-16; double incbet( aa, bb, xx ) double aa, bb, xx; { double a, b, t, x, xc, w, y; int flag; if( aa <= 0.0 || bb <= 0.0 ) goto domerr; if( (xx <= 0.0) || ( xx >= 1.0) ) { if( xx == 0.0 ) return(0.0); if( xx == 1.0 ) return( 1.0 ); domerr: mtherr( "incbet", DOMAIN ); return( 0.0 ); } flag = 0; if( (bb * xx) <= 1.0 && xx <= 0.95) { t = pseries(aa, bb, xx); goto done; } w = 1.0 - xx; /* Reverse a and b if x is greater than the mean. */ if( xx > (aa/(aa+bb)) ) { flag = 1; a = bb; b = aa; xc = xx; x = w; } else { a = aa; b = bb; xc = w; x = xx; } if( flag == 1 && (b * x) <= 1.0 && x <= 0.95) { t = pseries(a, b, x); goto done; } /* Choose expansion for better convergence. */ y = x * (a+b-2.0) - (a-1.0); if( y < 0.0 ) w = incbcf( a, b, x ); else w = incbd( a, b, x ) / xc; /* Multiply w by the factor a b _ _ _ x (1-x) | (a+b) / ( a | (a) | (b) ) . */ y = a * log(x); t = b * log(xc); if( (a+b) < MAXGAM && fabs(y) < MAXLOG && fabs(t) < MAXLOG ) { t = pow(xc,b); t *= pow(x,a); t /= a; t *= w; t *= true_gamma(a+b) / (true_gamma(a) * true_gamma(b)); goto done; } /* Resort to logarithms. */ y += t + lgam(a+b) - lgam(a) - lgam(b); y += log(w/a); if( y < MINLOG ) t = 0.0; else t = exp(y); done: if( flag == 1 ) { if( t <= MACHEP ) t = 1.0 - MACHEP; else t = 1.0 - t; } return( t ); } /* Continued fraction expansion #1 * for incomplete beta integral */ static double incbcf( a, b, x ) double a, b, x; { double xk, pk, pkm1, pkm2, qk, qkm1, qkm2; double k1, k2, k3, k4, k5, k6, k7, k8; double r, t, ans, thresh; int n; k1 = a; k2 = a + b; k3 = a; k4 = a + 1.0; k5 = 1.0; k6 = b - 1.0; k7 = k4; k8 = a + 2.0; pkm2 = 0.0; qkm2 = 1.0; pkm1 = 1.0; qkm1 = 1.0; ans = 1.0; r = 1.0; n = 0; thresh = 3.0 * MACHEP; do { xk = -( x * k1 * k2 )/( k3 * k4 ); pk = pkm1 + pkm2 * xk; qk = qkm1 + qkm2 * xk; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; xk = ( x * k5 * k6 )/( k7 * k8 ); pk = pkm1 + pkm2 * xk; qk = qkm1 + qkm2 * xk; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; if( qk != 0 ) r = pk/qk; if( r != 0 ) { t = fabs( (ans - r)/r ); ans = r; } else t = 1.0; if( t < thresh ) goto cdone; k1 += 1.0; k2 += 1.0; k3 += 2.0; k4 += 2.0; k5 += 1.0; k6 -= 1.0; k7 += 2.0; k8 += 2.0; if( (fabs(qk) + fabs(pk)) > big ) { pkm2 *= biginv; pkm1 *= biginv; qkm2 *= biginv; qkm1 *= biginv; } if( (fabs(qk) < biginv) || (fabs(pk) < biginv) ) { pkm2 *= big; pkm1 *= big; qkm2 *= big; qkm1 *= big; } } while( ++n < 300 ); cdone: return(ans); } /* Continued fraction expansion #2 * for incomplete beta integral */ static double incbd( a, b, x ) double a, b, x; { double xk, pk, pkm1, pkm2, qk, qkm1, qkm2; double k1, k2, k3, k4, k5, k6, k7, k8; double r, t, ans, z, thresh; int n; k1 = a; k2 = b - 1.0; k3 = a; k4 = a + 1.0; k5 = 1.0; k6 = a + b; k7 = a + 1.0;; k8 = a + 2.0; pkm2 = 0.0; qkm2 = 1.0; pkm1 = 1.0; qkm1 = 1.0; z = x / (1.0-x); ans = 1.0; r = 1.0; n = 0; thresh = 3.0 * MACHEP; do { xk = -( z * k1 * k2 )/( k3 * k4 ); pk = pkm1 + pkm2 * xk; qk = qkm1 + qkm2 * xk; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; xk = ( z * k5 * k6 )/( k7 * k8 ); pk = pkm1 + pkm2 * xk; qk = qkm1 + qkm2 * xk; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; if( qk != 0 ) r = pk/qk; if( r != 0 ) { t = fabs( (ans - r)/r ); ans = r; } else t = 1.0; if( t < thresh ) goto cdone; k1 += 1.0; k2 -= 1.0; k3 += 2.0; k4 += 2.0; k5 += 1.0; k6 += 1.0; k7 += 2.0; k8 += 2.0; if( (fabs(qk) + fabs(pk)) > big ) { pkm2 *= biginv; pkm1 *= biginv; qkm2 *= biginv; qkm1 *= biginv; } if( (fabs(qk) < biginv) || (fabs(pk) < biginv) ) { pkm2 *= big; pkm1 *= big; qkm2 *= big; qkm1 *= big; } } while( ++n < 300 ); cdone: return(ans); } /* Power series for incomplete beta integral. Use when b*x is small and x not too close to 1. */ static double pseries( a, b, x ) double a, b, x; { double s, t, u, v, n, t1, z, ai; ai = 1.0 / a; u = (1.0 - b) * x; v = u / (a + 1.0); t1 = v; t = u; n = 2.0; s = 0.0; z = MACHEP * ai; while( fabs(v) > z ) { u = (n - b) * x / n; t *= u; v = t / (a + n); s += v; n += 1.0; } s += t1; s += ai; u = a * log(x); if( (a+b) < MAXGAM && fabs(u) < MAXLOG ) { t = true_gamma(a+b)/(true_gamma(a)*true_gamma(b)); s = s * t * pow(x,a); } else { t = lgam(a+b) - lgam(a) - lgam(b) + u + log(s); if( t < MINLOG ) s = 0.0; else s = exp(t); } return(s); } grace-5.1.23/cephes/igami.c0000644000076500001440000000542606626627164015157 0ustar fnevgenyusers/* igami() * * Inverse of complemented imcomplete gamma integral * * * * SYNOPSIS: * * double a, x, p, igami(); * * x = igami( a, p ); * * DESCRIPTION: * * Given p, the function finds x such that * * igamc( a, x ) = p. * * Starting with the approximate value * * 3 * x = a t * * where * * t = 1 - d - ndtri(p) sqrt(d) * * and * * d = 1/9a, * * the routine performs up to 10 Newton iterations to find the * root of igamc(a,x) - p = 0. * * ACCURACY: * * Tested at random a, p in the intervals indicated. * * a p Relative error: * arithmetic domain domain # trials peak rms * IEEE 0.5,100 0,0.5 100000 1.0e-14 1.7e-15 * IEEE 0.01,0.5 0,0.5 100000 9.0e-14 3.4e-15 * IEEE 0.5,10000 0,0.5 20000 2.3e-13 3.8e-14 */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" extern double MACHEP, MAXNUM, MAXLOG, MINLOG; double igami( a, y0 ) double a, y0; { double x0, x1, x, yl, yh, y, d, lgm, dithresh; int i, dir; /* bound the solution */ x0 = MAXNUM; yl = 0; x1 = 0; yh = 1.0; dithresh = 5.0 * MACHEP; /* approximation to inverse function */ d = 1.0/(9.0*a); y = ( 1.0 - d - ndtri(y0) * sqrt(d) ); x = a * y * y * y; lgm = lgam(a); for( i=0; i<10; i++ ) { if( x > x0 || x < x1 ) goto ihalve; y = igamc(a,x); if( y < yl || y > yh ) goto ihalve; if( y < y0 ) { x0 = x; yl = y; } else { x1 = x; yh = y; } /* compute the derivative of the function at this point */ d = (a - 1.0) * log(x) - x - lgm; if( d < -MAXLOG ) goto ihalve; d = -exp(d); /* compute the step to the next approximation of x */ d = (y - y0)/d; if( fabs(d/x) < MACHEP ) goto done; x = x - d; } /* Resort to interval halving if Newton iteration did not converge. */ ihalve: d = 0.0625; if( x0 == MAXNUM ) { if( x <= 0.0 ) x = 1.0; while( x0 == MAXNUM ) { x = (1.0 + d) * x; y = igamc( a, x ); if( y < y0 ) { x0 = x; yl = y; break; } d = d + d; } } d = 0.5; dir = 0; for( i=0; i<400; i++ ) { x = x1 + d * (x0 - x1); y = igamc( a, x ); lgm = (x0 - x1)/(x1 + x0); if( fabs(lgm) < dithresh ) break; lgm = (y - y0)/y0; if( fabs(lgm) < dithresh ) break; if( x <= 0.0 ) break; if( y >= y0 ) { x1 = x; yh = y; if( dir < 0 ) { dir = 0; d = 0.5; } else if( dir > 1 ) d = 0.5 * d + 0.5; else d = (y0 - yl)/(yh - yl); dir += 1; } else { x0 = x; yl = y; if( dir > 0 ) { dir = 0; d = 0.5; } else if( dir < -1 ) d = 0.5 * d; else d = (y0 - yl)/(yh - yl); dir -= 1; } } if( x == 0.0 ) mtherr( "igami", UNDERFLOW ); done: return( x ); } grace-5.1.23/cephes/ellpe.c0000644000076500001440000001026206626627163015163 0ustar fnevgenyusers/* ellpe.c * * Complete elliptic integral of the second kind * * * * SYNOPSIS: * * double m1, y, ellpe(); * * y = ellpe( m1 ); * * * * DESCRIPTION: * * Approximates the integral * * * pi/2 * - * | | 2 * E(m) = | sqrt( 1 - m sin t ) dt * | | * - * 0 * * Where m = 1 - m1, using the approximation * * P(x) - x log x Q(x). * * Though there are no singularities, the argument m1 is used * rather than m for compatibility with ellpk(). * * E(1) = 1; E(0) = pi/2. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 1 13000 3.1e-17 9.4e-18 * IEEE 0, 1 10000 2.1e-16 7.3e-17 * * * ERROR MESSAGES: * * message condition value returned * ellpe domain x<0, x>1 0.0 * */ /* ellpe.c */ /* Elliptic integral of second kind */ /* Cephes Math Library, Release 2.1: February, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK static double P[] = { 1.53552577301013293365E-4, 2.50888492163602060990E-3, 8.68786816565889628429E-3, 1.07350949056076193403E-2, 7.77395492516787092951E-3, 7.58395289413514708519E-3, 1.15688436810574127319E-2, 2.18317996015557253103E-2, 5.68051945617860553470E-2, 4.43147180560990850618E-1, 1.00000000000000000299E0 }; static double Q[] = { 3.27954898576485872656E-5, 1.00962792679356715133E-3, 6.50609489976927491433E-3, 1.68862163993311317300E-2, 2.61769742454493659583E-2, 3.34833904888224918614E-2, 4.27180926518931511717E-2, 5.85936634471101055642E-2, 9.37499997197644278445E-2, 2.49999999999888314361E-1 }; #endif #ifdef DEC static unsigned short P[] = { 0035041,0001364,0141572,0117555, 0036044,0066032,0130027,0033404, 0036416,0053617,0064456,0102632, 0036457,0161100,0061177,0122612, 0036376,0136251,0012403,0124162, 0036370,0101316,0151715,0131613, 0036475,0105477,0050317,0133272, 0036662,0154232,0024645,0171552, 0037150,0126220,0047054,0030064, 0037742,0162057,0167645,0165612, 0040200,0000000,0000000,0000000 }; static unsigned short Q[] = { 0034411,0106743,0115771,0055462, 0035604,0052575,0155171,0045540, 0036325,0030424,0064332,0167756, 0036612,0052366,0063006,0115175, 0036726,0070430,0004533,0124654, 0037011,0022741,0030675,0030711, 0037056,0174452,0127062,0132122, 0037157,0177750,0142041,0072523, 0037277,0177777,0173137,0002627, 0037577,0177777,0177777,0101101 }; #endif #ifdef IBMPC static unsigned short P[] = { 0x53ee,0x986f,0x205e,0x3f24, 0xe6e0,0x5602,0x8d83,0x3f64, 0xd0b3,0xed25,0xcaf1,0x3f81, 0xf4b1,0x0c4f,0xfc48,0x3f85, 0x750e,0x22a0,0xd795,0x3f7f, 0xb671,0xda79,0x1059,0x3f7f, 0xf6d7,0xea19,0xb167,0x3f87, 0xbe6d,0x4534,0x5b13,0x3f96, 0x8607,0x09c5,0x1592,0x3fad, 0xbd71,0xfdf4,0x5c85,0x3fdc, 0x0000,0x0000,0x0000,0x3ff0 }; static unsigned short Q[] = { 0x2b66,0x737f,0x31bc,0x3f01, 0x296c,0xbb4f,0x8aaf,0x3f50, 0x5dfe,0x8d1b,0xa622,0x3f7a, 0xd350,0xccc0,0x4a9e,0x3f91, 0x7535,0x012b,0xce23,0x3f9a, 0xa639,0x2637,0x24bc,0x3fa1, 0x568a,0x55c6,0xdf25,0x3fa5, 0x2eaa,0x1884,0xfffd,0x3fad, 0xe0b3,0xfecb,0xffff,0x3fb7, 0xf048,0xffff,0xffff,0x3fcf }; #endif #ifdef MIEEE static unsigned short P[] = { 0x3f24,0x205e,0x986f,0x53ee, 0x3f64,0x8d83,0x5602,0xe6e0, 0x3f81,0xcaf1,0xed25,0xd0b3, 0x3f85,0xfc48,0x0c4f,0xf4b1, 0x3f7f,0xd795,0x22a0,0x750e, 0x3f7f,0x1059,0xda79,0xb671, 0x3f87,0xb167,0xea19,0xf6d7, 0x3f96,0x5b13,0x4534,0xbe6d, 0x3fad,0x1592,0x09c5,0x8607, 0x3fdc,0x5c85,0xfdf4,0xbd71, 0x3ff0,0x0000,0x0000,0x0000 }; static unsigned short Q[] = { 0x3f01,0x31bc,0x737f,0x2b66, 0x3f50,0x8aaf,0xbb4f,0x296c, 0x3f7a,0xa622,0x8d1b,0x5dfe, 0x3f91,0x4a9e,0xccc0,0xd350, 0x3f9a,0xce23,0x012b,0x7535, 0x3fa1,0x24bc,0x2637,0xa639, 0x3fa5,0xdf25,0x55c6,0x568a, 0x3fad,0xfffd,0x1884,0x2eaa, 0x3fb7,0xffff,0xfecb,0xe0b3, 0x3fcf,0xffff,0xffff,0xf048 }; #endif double ellpe(x) double x; { if( (x <= 0.0) || (x > 1.0) ) { if( x == 0.0 ) return( 1.0 ); mtherr( "ellpe", DOMAIN ); return( 0.0 ); } return( polevl(x,P,10) - log(x) * (x * polevl(x,Q,9)) ); } grace-5.1.23/cephes/polyn.c0000644000076500001440000001514606626627164015232 0ustar fnevgenyusers/* polyn.c * polyr.c * Arithmetic operations on polynomials * * In the following descriptions a, b, c are polynomials of degree * na, nb, nc respectively. The degree of a polynomial cannot * exceed a run-time value MAXPOL. An operation that attempts * to use or generate a polynomial of higher degree may produce a * result that suffers truncation at degree MAXPOL. The value of * MAXPOL is set by calling the function * * polini( maxpol ); * * where maxpol is the desired maximum degree. This must be * done prior to calling any of the other functions in this module. * Memory for internal temporary polynomial storage is allocated * by polini(). * * Each polynomial is represented by an array containing its * coefficients, together with a separately declared integer equal * to the degree of the polynomial. The coefficients appear in * ascending order; that is, * * 2 na * a(x) = a[0] + a[1] * x + a[2] * x + ... + a[na] * x . * * * * sum = poleva( a, na, x ); Evaluate polynomial a(t) at t = x. * polprt( a, na, D ); Print the coefficients of a to D digits. * polclr( a, na ); Set a identically equal to zero, up to a[na]. * polmov( a, na, b ); Set b = a. * poladd( a, na, b, nb, c ); c = b + a, nc = max(na,nb) * polsub( a, na, b, nb, c ); c = b - a, nc = max(na,nb) * polmul( a, na, b, nb, c ); c = b * a, nc = na+nb * * * Division: * * i = poldiv( a, na, b, nb, c ); c = b / a, nc = MAXPOL * * returns i = the degree of the first nonzero coefficient of a. * The computed quotient c must be divided by x^i. An error message * is printed if a is identically zero. * * * Change of variables: * If a and b are polynomials, and t = a(x), then * c(t) = b(a(x)) * is a polynomial found by substituting a(x) for t. The * subroutine call for this is * * polsbt( a, na, b, nb, c ); * * * Notes: * poldiv() is an integer routine; poleva() is double. * Any of the arguments a, b, c may refer to the same array. * */ #include "mconf.h" #include "cephes.h" #include #include /* Pointers to internal arrays. Note poldiv() allocates * and deallocates some temporary arrays every time it is called. */ static double *pt1 = 0; static double *pt2 = 0; static double *pt3 = 0; /* Maximum degree of polynomial. */ int MAXPOL = 0; extern int MAXPOL; /* Number of bytes (chars) in maximum size polynomial. */ static int psize = 0; /* Initialize max degree of polynomials * and allocate temporary storage. */ void polini( maxdeg ) int maxdeg; { MAXPOL = maxdeg; psize = (maxdeg + 1) * sizeof(double); /* Release previously allocated memory, if any. */ if( pt3 ) free(pt3); if( pt2 ) free(pt2); if( pt1 ) free(pt1); /* Allocate new arrays */ pt1 = (double * )malloc(psize); /* used by polsbt */ pt2 = (double * )malloc(psize); /* used by polsbt */ pt3 = (double * )malloc(psize); /* used by polmul */ /* Report if failure */ if( (pt1 == NULL) || (pt2 == NULL) || (pt3 == NULL) ) { mtherr( "polini", ERANGE ); exit(1); } } /* Set a = 0. */ void polclr( a, n ) register double *a; int n; { int i; if( n > MAXPOL ) n = MAXPOL; for( i=0; i<=n; i++ ) *a++ = 0.0; } /* Set b = a. */ void polmov( a, na, b ) register double *a, *b; int na; { int i; if( na > MAXPOL ) na = MAXPOL; for( i=0; i<= na; i++ ) { *b++ = *a++; } } /* c = b * a. */ void polmul( a, na, b, nb, c ) double a[], b[], c[]; int na, nb; { int i, j, k, nc; double x; nc = na + nb; polclr( pt3, MAXPOL ); for( i=0; i<=na; i++ ) { x = a[i]; for( j=0; j<=nb; j++ ) { k = i + j; if( k > MAXPOL ) break; pt3[k] += x * b[j]; } } if( nc > MAXPOL ) nc = MAXPOL; for( i=0; i<=nc; i++ ) c[i] = pt3[i]; } /* c = b + a. */ void poladd( a, na, b, nb, c ) double a[], b[], c[]; int na, nb; { int i, n; if( na > nb ) n = na; else n = nb; if( n > MAXPOL ) n = MAXPOL; for( i=0; i<=n; i++ ) { if( i > na ) c[i] = b[i]; else if( i > nb ) c[i] = a[i]; else c[i] = b[i] + a[i]; } } /* c = b - a. */ void polsub( a, na, b, nb, c ) double a[], b[], c[]; int na, nb; { int i, n; if( na > nb ) n = na; else n = nb; if( n > MAXPOL ) n = MAXPOL; for( i=0; i<=n; i++ ) { if( i > na ) c[i] = b[i]; else if( i > nb ) c[i] = -a[i]; else c[i] = b[i] - a[i]; } } /* c = b/a */ int poldiv( a, na, b, nb, c ) double a[], b[], c[]; int na, nb; { double quot; double *ta, *tb, *tq; int i, j, k, sing; sing = 0; /* Allocate temporary arrays. This would be quicker * if done automatically on the stack, but stack space * may be hard to obtain on a small computer. */ ta = (double * )malloc( psize ); polclr( ta, MAXPOL ); polmov( a, na, ta ); tb = (double * )malloc( psize ); polclr( tb, MAXPOL ); polmov( b, nb, tb ); tq = (double * )malloc( psize ); polclr( tq, MAXPOL ); /* What to do if leading (constant) coefficient * of denominator is zero. */ if( a[0] == 0.0 ) { for( i=0; i<=na; i++ ) { if( ta[i] != 0.0 ) goto nzero; } mtherr( "poldiv", SING ); goto done; nzero: /* Reduce the degree of the denominator. */ for( i=0; i MAXPOL ) break; tb[k] -= quot * ta[j]; } tq[i] = quot; } /* Send quotient to output array. */ polmov( tq, MAXPOL, c ); done: /* Restore allocated memory. */ free(tq); free(tb); free(ta); return( sing ); } /* Change of variables * Substitute a(y) for the variable x in b(x). * x = a(y) * c(x) = b(x) = b(a(y)). */ void polsbt( a, na, b, nb, c ) double a[], b[], c[]; int na, nb; { int i, j, k, n2; double x; /* 0th degree term: */ polclr( pt1, MAXPOL ); pt1[0] = b[0]; polclr( pt2, MAXPOL ); pt2[0] = 1.0; n2 = 0; for( i=1; i<=nb; i++ ) { /* Form ith power of a. */ polmul( a, na, pt2, n2, pt2 ); n2 += na; x = b[i]; /* Add the ith coefficient of b times the ith power of a. */ for( j=0; j<=n2; j++ ) { if( j > MAXPOL ) break; pt1[j] += x * pt2[j]; } } k = n2 + nb; if( k > MAXPOL ) k = MAXPOL; for( i=0; i<=k; i++ ) c[i] = pt1[i]; } /* Evaluate polynomial a(t) at t = x. */ double poleva( a, na, x ) double a[]; int na; double x; { double s; int i; s = a[na]; for( i=na-1; i>=0; i-- ) { s = s * x + a[i]; } return(s); } grace-5.1.23/cephes/stdtr.c0000644000076500001440000000743306626627164015231 0ustar fnevgenyusers/* stdtr.c * * Student's t distribution * * * * SYNOPSIS: * * double t, stdtr(); * short k; * * y = stdtr( k, t ); * * * DESCRIPTION: * * Computes the integral from minus infinity to t of the Student * t distribution with integer k > 0 degrees of freedom: * * t * - * | | * - | 2 -(k+1)/2 * | ( (k+1)/2 ) | ( x ) * ---------------------- | ( 1 + --- ) dx * - | ( k ) * sqrt( k pi ) | ( k/2 ) | * | | * - * -inf. * * Relation to incomplete beta integral: * * 1 - stdtr(k,t) = 0.5 * incbet( k/2, 1/2, z ) * where * z = k/(k + t**2). * * For t < -2, this is the method of computation. For higher t, * a direct method is derived from integration by parts. * Since the function is symmetric about t=0, the area under the * right tail of the density is found by calling the function * with -t instead of t. * * ACCURACY: * * Tested at random 1 <= k <= 25. The "domain" refers to t. * Relative error: * arithmetic domain # trials peak rms * IEEE -100,-2 50000 5.9e-15 1.4e-15 * IEEE -2,100 500000 2.7e-15 4.9e-17 */ /* stdtri.c * * Functional inverse of Student's t distribution * * * * SYNOPSIS: * * double p, t, stdtri(); * int k; * * t = stdtri( k, p ); * * * DESCRIPTION: * * Given probability p, finds the argument t such that stdtr(k,t) * is equal to p. * * ACCURACY: * * Tested at random 1 <= k <= 100. The "domain" refers to p: * Relative error: * arithmetic domain # trials peak rms * IEEE .001,.999 25000 5.7e-15 8.0e-16 * IEEE 10^-6,.001 25000 2.0e-12 2.9e-14 */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" extern double PI, MACHEP, MAXNUM; double stdtr( k, t ) int k; double t; { double x, rk, z, f, tz, p, xsqk; int j; if( k <= 0 ) { mtherr( "stdtr", DOMAIN ); return(0.0); } if( t == 0 ) return( 0.5 ); if( t < -2.0 ) { rk = k; z = rk / (rk + t * t); p = 0.5 * incbet( 0.5*rk, 0.5, z ); return( p ); } /* compute integral from -t to + t */ if( t < 0 ) x = -t; else x = t; rk = k; /* degrees of freedom */ z = 1.0 + ( x * x )/rk; /* test if k is odd or even */ if( (k & 1) != 0) { /* computation for odd k */ xsqk = x/sqrt(rk); p = atan( xsqk ); if( k > 1 ) { f = 1.0; tz = 1.0; j = 3; while( (j<=(k-2)) && ( (tz/f) > MACHEP ) ) { tz *= (j-1)/( z * j ); f += tz; j += 2; } p += f * xsqk/z; } p *= 2.0/PI; } else { /* computation for even k */ f = 1.0; tz = 1.0; j = 2; while( ( j <= (k-2) ) && ( (tz/f) > MACHEP ) ) { tz *= (j - 1)/( z * j ); f += tz; j += 2; } p = f * x/sqrt(z*rk); } /* common exit */ if( t < 0 ) p = -p; /* note destruction of relative accuracy */ p = 0.5 + 0.5 * p; return(p); } double stdtri( k, p ) int k; double p; { double t, rk, z; int rflg; if( k <= 0 || p <= 0.0 || p >= 1.0 ) { mtherr( "stdtri", DOMAIN ); return(0.0); } rk = k; if( p > 0.25 && p < 0.75 ) { if( p == 0.5 ) return( 0.0 ); z = 1.0 - 2.0 * p; z = incbi( 0.5, 0.5*rk, fabs(z) ); t = sqrt( rk*z/(1.0-z) ); if( p < 0.5 ) t = -t; return( t ); } rflg = -1; if( p >= 0.5) { p = 1.0 - p; rflg = 1; } z = incbi( 0.5*rk, 0.5, 2.0*p ); if( MAXNUM * z < rk ) return(rflg* MAXNUM); t = sqrt( rk/z - rk ); return( rflg * t ); } grace-5.1.23/cephes/struve.c0000644000076500001440000000776506626627164015431 0ustar fnevgenyusers/* struve.c * * Struve function * * * * SYNOPSIS: * * double v, x, y, struve(); * * y = struve( v, x ); * * * * DESCRIPTION: * * Computes the Struve function Hv(x) of order v, argument x. * Negative x is rejected unless v is an integer. * * This module also contains the hypergeometric functions 1F2 * and 3F0 and a routine for the Bessel function Yv(x) with * noninteger v. * * * * ACCURACY: * * Not accurately characterized, but spot checked against tables. * */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #if defined(DEBUG) # undef DEBUG #endif #define DEBUG 0 static double stop = 1.37e-17; extern double MACHEP; double onef2( a, b, c, x, err ) double a, b, c, x; double *err; { double n, a0, sum, t; double an, bn, cn, max, z; an = a; bn = b; cn = c; a0 = 1.0; sum = 1.0; n = 1.0; t = 1.0; max = 0.0; do { if( an == 0 ) goto done; if( bn == 0 ) goto error; if( cn == 0 ) goto error; if( (a0 > 1.0e34) || (n > 200) ) goto error; a0 *= (an * x) / (bn * cn * n); sum += a0; an += 1.0; bn += 1.0; cn += 1.0; n += 1.0; z = fabs( a0 ); if( z > max ) max = z; if( sum != 0 ) t = fabs( a0 / sum ); else t = z; } while( t > stop ); done: *err = fabs( MACHEP*max /sum ); #if DEBUG printf(" onef2 cancellation error %.5E\n", *err ); #endif goto xit; error: #if DEBUG printf("onef2 does not converge\n"); #endif *err = 1.0e38; xit: #if DEBUG printf("onef2( %.2E %.2E %.2E %.5E ) = %.3E %.6E\n", a, b, c, x, n, sum); #endif return(sum); } double threef0( a, b, c, x, err ) double a, b, c, x; double *err; { double n, a0, sum, t, conv, conv1; double an, bn, cn, max, z; an = a; bn = b; cn = c; a0 = 1.0; sum = 1.0; n = 1.0; t = 1.0; max = 0.0; conv = 1.0e38; conv1 = conv; do { if( an == 0.0 ) goto done; if( bn == 0.0 ) goto done; if( cn == 0.0 ) goto done; if( (a0 > 1.0e34) || (n > 200) ) goto error; a0 *= (an * bn * cn * x) / n; an += 1.0; bn += 1.0; cn += 1.0; n += 1.0; z = fabs( a0 ); if( z > max ) max = z; if( z >= conv ) { if( (z < max) && (z > conv1) ) goto done; } conv1 = conv; conv = z; sum += a0; if( sum != 0 ) t = fabs( a0 / sum ); else t = z; } while( t > stop ); done: t = fabs( MACHEP*max/sum ); #if DEBUG printf(" threef0 cancellation error %.5E\n", t ); #endif max = fabs( conv/sum ); if( max > t ) t = max; #if DEBUG printf(" threef0 convergence %.5E\n", max ); #endif goto xit; error: #if DEBUG printf("threef0 does not converge\n"); #endif t = 1.0e38; xit: #if DEBUG printf("threef0( %.2E %.2E %.2E %.5E ) = %.3E %.6E\n", a, b, c, x, n, sum); #endif *err = t; return(sum); } extern double PI; double struve( v, x ) double v, x; { double y, ya, f, g, h, t; double onef2err, threef0err; f = floor(v); if( (v < 0) && ( v-f == 0.5 ) ) { y = jv( -v, x ); f = 1.0 - f; g = 2.0 * floor(f/2.0); if( g != f ) y = -y; return(y); } t = 0.25*x*x; f = fabs(x); g = 1.5 * fabs(v); if( (f > 30.0) && (f > g) ) { onef2err = 1.0e38; y = 0.0; } else { y = onef2( 1.0, 1.5, 1.5+v, -t, &onef2err ); } if( (f < 18.0) || (x < 0.0) ) { threef0err = 1.0e38; ya = 0.0; } else { ya = threef0( 1.0, 0.5, 0.5-v, -1.0/t, &threef0err ); } f = sqrt( PI ); h = pow( 0.5*x, v-1.0 ); if( onef2err <= threef0err ) { g = true_gamma( v + 1.5 ); y = y * h * t / ( 0.5 * f * g ); return(y); } else { g = true_gamma( v + 0.5 ); ya = ya * h / ( f * g ); ya = ya + yv( v, x ); return(ya); } } /* Bessel function of noninteger order */ double yv( v, x ) double v, x; { double y, t; int n; y = floor( v ); if( y == v ) { n = v; y = yn( n, x ); return( y ); } t = PI * v; y = (cos(t) * jv( v, x ) - jv( -v, x ))/sin(t); return( y ); } /* Crossover points between ascending series and asymptotic series * for Struve function * * v x * * 0 19.2 * 1 18.95 * 2 19.15 * 3 19.3 * 5 19.7 * 10 21.35 * 20 26.35 * 30 32.31 * 40 40.0 */ grace-5.1.23/cephes/incbi.c0000644000076500001440000001125406626627164015151 0ustar fnevgenyusers/* incbi() * * Inverse of imcomplete beta integral * * * * SYNOPSIS: * * double a, b, x, y, incbi(); * * x = incbi( a, b, y ); * * * * DESCRIPTION: * * Given y, the function finds x such that * * incbet( a, b, x ) = y . * * The routine performs interval halving or Newton iterations to find the * root of incbet(a,b,x) - y = 0. * * * ACCURACY: * * Relative error: * x a,b * arithmetic domain domain # trials peak rms * IEEE 0,1 .5,10000 50000 5.8e-12 1.3e-13 * IEEE 0,1 .25,100 100000 1.8e-13 3.9e-15 * IEEE 0,1 0,5 50000 1.1e-12 5.5e-15 * VAX 0,1 .5,100 25000 3.5e-14 1.1e-15 * With a and b constrained to half-integer or integer values: * IEEE 0,1 .5,10000 50000 5.8e-12 1.1e-13 * IEEE 0,1 .5,100 100000 1.7e-14 7.9e-16 * With a = .5, b constrained to half-integer or integer values: * IEEE 0,1 .5,10000 10000 8.3e-11 1.0e-11 */ /* Cephes Math Library Release 2.4: March,1996 Copyright 1984, 1996 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" extern double MACHEP, MAXNUM, MAXLOG, MINLOG; double incbi( aa, bb, yy0 ) double aa, bb, yy0; { double a, b, y0, d, y, x, x0, x1, lgm, yp, di, dithresh, yl, yh, xt; int i, rflg, dir, nflg; i = 0; if( yy0 <= 0 ) return(0.0); if( yy0 >= 1.0 ) return(1.0); x0 = 0.0; yl = 0.0; x1 = 1.0; yh = 1.0; nflg = 0; if( aa <= 1.0 || bb <= 1.0 ) { dithresh = 1.0e-6; rflg = 0; a = aa; b = bb; y0 = yy0; x = a/(a+b); y = incbet( a, b, x ); goto ihalve; } else { dithresh = 1.0e-4; } /* approximation to inverse function */ yp = -ndtri(yy0); if( yy0 > 0.5 ) { rflg = 1; a = bb; b = aa; y0 = 1.0 - yy0; yp = -yp; } else { rflg = 0; a = aa; b = bb; y0 = yy0; } lgm = (yp * yp - 3.0)/6.0; x = 2.0/( 1.0/(2.0*a-1.0) + 1.0/(2.0*b-1.0) ); d = yp * sqrt( x + lgm ) / x - ( 1.0/(2.0*b-1.0) - 1.0/(2.0*a-1.0) ) * (lgm + 5.0/6.0 - 2.0/(3.0*x)); d = 2.0 * d; if( d < MINLOG ) { x = 1.0; goto under; } x = a/( a + b * exp(d) ); y = incbet( a, b, x ); yp = (y - y0)/y0; if( fabs(yp) < 0.2 ) goto newt; /* Resort to interval halving if not close enough. */ ihalve: dir = 0; di = 0.5; for( i=0; i<100; i++ ) { if( i != 0 ) { x = x0 + di * (x1 - x0); if( x == 1.0 ) x = 1.0 - MACHEP; if( x == 0.0 ) { di = 0.5; x = x0 + di * (x1 - x0); if( x == 0.0 ) goto under; } y = incbet( a, b, x ); yp = (x1 - x0)/(x1 + x0); if( fabs(yp) < dithresh ) goto newt; yp = (y-y0)/y0; if( fabs(yp) < dithresh ) goto newt; } if( y < y0 ) { x0 = x; yl = y; if( dir < 0 ) { dir = 0; di = 0.5; } else if( dir > 3 ) di = 1.0 - (1.0 - di) * (1.0 - di); else if( dir > 1 ) di = 0.5 * di + 0.5; else di = (y0 - y)/(yh - yl); dir += 1; if( x0 > 0.75 ) { if( rflg == 1 ) { rflg = 0; a = aa; b = bb; y0 = yy0; } else { rflg = 1; a = bb; b = aa; y0 = 1.0 - yy0; } x = 1.0 - x; y = incbet( a, b, x ); x0 = 0.0; yl = 0.0; x1 = 1.0; yh = 1.0; goto ihalve; } } else { x1 = x; if( rflg == 1 && x1 < MACHEP ) { x = 0.0; goto done; } yh = y; if( dir > 0 ) { dir = 0; di = 0.5; } else if( dir < -3 ) di = di * di; else if( dir < -1 ) di = 0.5 * di; else di = (y - y0)/(yh - yl); dir -= 1; } } mtherr( "incbi", PLOSS ); if( x0 >= 1.0 ) { x = 1.0 - MACHEP; goto done; } if( x <= 0.0 ) { under: mtherr( "incbi", UNDERFLOW ); x = 0.0; goto done; } newt: if( nflg ) goto done; nflg = 1; lgm = lgam(a+b) - lgam(a) - lgam(b); for( i=0; i<8; i++ ) { /* Compute the function at this point. */ if( i != 0 ) y = incbet(a,b,x); if( y < yl ) { x = x0; y = yl; } else if( y > yh ) { x = x1; y = yh; } else if( y < y0 ) { x0 = x; yl = y; } else { x1 = x; yh = y; } if( x == 1.0 || x == 0.0 ) break; /* Compute the derivative of the function at this point. */ d = (a - 1.0) * log(x) + (b - 1.0) * log(1.0-x) + lgm; if( d < MINLOG ) goto done; if( d > MAXLOG ) break; d = exp(d); /* Compute the step to the next approximation of x. */ d = (y - y0)/d; xt = x - d; if( xt <= x0 ) { y = (x - x0) / (x1 - x0); xt = x0 + 0.5 * y * (x - x0); if( xt <= 0.0 ) break; } if( xt >= x1 ) { y = (x1 - x) / (x1 - x0); xt = x1 - 0.5 * y * (x1 - x); if( xt >= 1.0 ) break; } x = xt; if( fabs(d/x) < 128.0 * MACHEP ) goto done; } /* Did not converge. */ dithresh = 256.0 * MACHEP; goto ihalve; done: if( rflg ) { if( x <= MACHEP ) x = 1.0 - MACHEP; else x = 1.0 - x; } return( x ); } grace-5.1.23/cephes/iv.c0000644000076500001440000000403206626627164014477 0ustar fnevgenyusers/* iv.c * * Modified Bessel function of noninteger order * * * * SYNOPSIS: * * double v, x, y, iv(); * * y = iv( v, x ); * * * * DESCRIPTION: * * Returns modified Bessel function of order v of the * argument. If x is negative, v must be integer valued. * * The function is defined as Iv(x) = Jv( ix ). It is * here computed in terms of the confluent hypergeometric * function, according to the formula * * v -x * Iv(x) = (x/2) e hyperg( v+0.5, 2v+1, 2x ) / true_gamma(v+1) * * If v is a negative integer, then v is replaced by -v. * * * ACCURACY: * * Tested at random points (v, x), with v between 0 and * 30, x between 0 and 28. * Relative error: * arithmetic domain # trials peak rms * DEC 0,30 2000 3.1e-15 5.4e-16 * IEEE 0,30 10000 1.7e-14 2.7e-15 * * Accuracy is diminished if v is near a negative integer. * * See also hyperg.c. * */ /* iv.c */ /* Modified Bessel function of noninteger order */ /* If x < 0, then v must be an integer. */ /* Cephes Math Library Release 2.1: November, 1988 Copyright 1984, 1987, 1988 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double MACHEP, MAXNUM; double iv( v, x ) double v, x; { int sign; double t, ax; /* If v is a negative integer, invoke symmetry */ t = floor(v); if( v < 0.0 ) { if( t == v ) { v = -v; /* symmetry */ t = -t; } } /* If x is negative, require v to be an integer */ sign = 1; if( x < 0.0 ) { if( t != v ) { mtherr( "iv", DOMAIN ); return( 0.0 ); } if( v != 2.0 * floor(v/2.0) ) sign = -1; } /* Avoid logarithm singularity */ if( x == 0.0 ) { if( v == 0.0 ) return( 1.0 ); if( v < 0.0 ) { mtherr( "iv", OVERFLOW ); return( MAXNUM ); } else return( 0.0 ); } ax = fabs(x); t = v * log( 0.5 * ax ) - x; t = sign * exp(t) / true_gamma( v + 1.0 ); ax = v + 0.5; return( t * hyperg( ax, 2.0 * ax, 2.0 * x ) ); } grace-5.1.23/cephes/k0.c0000644000076500001440000001601406626627164014376 0ustar fnevgenyusers/* k0.c * * Modified Bessel function, third kind, order zero * * * * SYNOPSIS: * * double x, y, k0(); * * y = k0( x ); * * * * DESCRIPTION: * * Returns modified Bessel function of the third kind * of order zero of the argument. * * The range is partitioned into the two intervals [0,8] and * (8, infinity). Chebyshev polynomial expansions are employed * in each interval. * * * * ACCURACY: * * Tested at 2000 random points between 0 and 8. Peak absolute * error (relative when K0 > 1) was 1.46e-14; rms, 4.26e-15. * Relative error: * arithmetic domain # trials peak rms * DEC 0, 30 3100 1.3e-16 2.1e-17 * IEEE 0, 30 30000 1.2e-15 1.6e-16 * * ERROR MESSAGES: * * message condition value returned * K0 domain x <= 0 MAXNUM * */ /* k0e() * * Modified Bessel function, third kind, order zero, * exponentially scaled * * * * SYNOPSIS: * * double x, y, k0e(); * * y = k0e( x ); * * * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of the third kind of order zero of the argument. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0, 30 30000 1.4e-15 1.4e-16 * See k0(). * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Chebyshev coefficients for K0(x) + log(x/2) I0(x) * in the interval [0,2]. The odd order coefficients are all * zero; only the even order coefficients are listed. * * lim(x->0){ K0(x) + log(x/2) I0(x) } = -EUL. */ #ifdef UNK static double A[] = { 1.37446543561352307156E-16, 4.25981614279661018399E-14, 1.03496952576338420167E-11, 1.90451637722020886025E-9, 2.53479107902614945675E-7, 2.28621210311945178607E-5, 1.26461541144692592338E-3, 3.59799365153615016266E-2, 3.44289899924628486886E-1, -5.35327393233902768720E-1 }; #endif #ifdef DEC static unsigned short A[] = { 0023036,0073417,0032477,0165673, 0025077,0154126,0016046,0012517, 0027066,0011342,0035211,0005041, 0031002,0160233,0037454,0050224, 0032610,0012747,0037712,0173741, 0034277,0144007,0172147,0162375, 0035645,0140563,0125431,0165626, 0037023,0057662,0125124,0102051, 0037660,0043304,0004411,0166707, 0140011,0005467,0047227,0130370 }; #endif #ifdef IBMPC static unsigned short A[] = { 0xfd77,0xe6a7,0xcee1,0x3ca3, 0xc2aa,0xc384,0xfb0a,0x3d27, 0x2144,0x4751,0xc25c,0x3da6, 0x8a13,0x67e5,0x5c13,0x3e20, 0x5efc,0xe7f9,0x02bc,0x3e91, 0xfca0,0xfe8c,0xf900,0x3ef7, 0x3d73,0x7563,0xb82e,0x3f54, 0x9085,0x554a,0x6bf6,0x3fa2, 0x3db9,0x8121,0x08d8,0x3fd6, 0xf61f,0xe9d2,0x2166,0xbfe1 }; #endif #ifdef MIEEE static unsigned short A[] = { 0x3ca3,0xcee1,0xe6a7,0xfd77, 0x3d27,0xfb0a,0xc384,0xc2aa, 0x3da6,0xc25c,0x4751,0x2144, 0x3e20,0x5c13,0x67e5,0x8a13, 0x3e91,0x02bc,0xe7f9,0x5efc, 0x3ef7,0xf900,0xfe8c,0xfca0, 0x3f54,0xb82e,0x7563,0x3d73, 0x3fa2,0x6bf6,0x554a,0x9085, 0x3fd6,0x08d8,0x8121,0x3db9, 0xbfe1,0x2166,0xe9d2,0xf61f }; #endif /* Chebyshev coefficients for exp(x) sqrt(x) K0(x) * in the inverted interval [2,infinity]. * * lim(x->inf){ exp(x) sqrt(x) K0(x) } = sqrt(pi/2). */ #ifdef UNK static double B[] = { 5.30043377268626276149E-18, -1.64758043015242134646E-17, 5.21039150503902756861E-17, -1.67823109680541210385E-16, 5.51205597852431940784E-16, -1.84859337734377901440E-15, 6.34007647740507060557E-15, -2.22751332699166985548E-14, 8.03289077536357521100E-14, -2.98009692317273043925E-13, 1.14034058820847496303E-12, -4.51459788337394416547E-12, 1.85594911495471785253E-11, -7.95748924447710747776E-11, 3.57739728140030116597E-10, -1.69753450938905987466E-9, 8.57403401741422608519E-9, -4.66048989768794782956E-8, 2.76681363944501510342E-7, -1.83175552271911948767E-6, 1.39498137188764993662E-5, -1.28495495816278026384E-4, 1.56988388573005337491E-3, -3.14481013119645005427E-2, 2.44030308206595545468E0 }; #endif #ifdef DEC static unsigned short B[] = { 0021703,0106456,0076144,0173406, 0122227,0173144,0116011,0030033, 0022560,0044562,0006506,0067642, 0123101,0076243,0123273,0131013, 0023436,0157713,0056243,0141331, 0124005,0032207,0063726,0164664, 0024344,0066342,0051756,0162300, 0124710,0121365,0154053,0077022, 0025264,0161166,0066246,0077420, 0125647,0141671,0006443,0103212, 0026240,0076431,0077147,0160445, 0126636,0153741,0174002,0105031, 0027243,0040102,0035375,0163073, 0127656,0176256,0113476,0044653, 0030304,0125544,0006377,0130104, 0130751,0047257,0110537,0127324, 0031423,0046400,0014772,0012164, 0132110,0025240,0155247,0112570, 0032624,0105314,0007437,0021574, 0133365,0155243,0174306,0116506, 0034152,0004776,0061643,0102504, 0135006,0136277,0036104,0175023, 0035715,0142217,0162474,0115022, 0137000,0147671,0065177,0134356, 0040434,0026754,0175163,0044070 }; #endif #ifdef IBMPC static unsigned short B[] = { 0x9ee1,0xcf8c,0x71a5,0x3c58, 0x2603,0x9381,0xfecc,0xbc72, 0xcdf4,0x41a8,0x092e,0x3c8e, 0x7641,0x74d7,0x2f94,0xbca8, 0x785b,0x6b94,0xdbf9,0x3cc3, 0xdd36,0xecfa,0xa690,0xbce0, 0xdc98,0x4a7d,0x8d9c,0x3cfc, 0x6fc2,0xbb05,0x145e,0xbd19, 0xcfe2,0xcd94,0x9c4e,0x3d36, 0x70d1,0x21a4,0xf877,0xbd54, 0xfc25,0x2fcc,0x0fa3,0x3d74, 0x5143,0x3f00,0xdafc,0xbd93, 0xbcc7,0x475f,0x6808,0x3db4, 0xc935,0xd2e7,0xdf95,0xbdd5, 0xf608,0x819f,0x956c,0x3df8, 0xf5db,0xf22b,0x29d5,0xbe1d, 0x428e,0x033f,0x69a0,0x3e42, 0xf2af,0x1b54,0x0554,0xbe69, 0xe46f,0x81e3,0x9159,0x3e92, 0xd3a9,0x7f18,0xbb54,0xbebe, 0x70a9,0xcc74,0x413f,0x3eed, 0x9f42,0xe788,0xd797,0xbf20, 0x9342,0xfca7,0xb891,0x3f59, 0xf71e,0x2d4f,0x19f7,0xbfa0, 0x6907,0x9f4e,0x85bd,0x4003 }; #endif #ifdef MIEEE static unsigned short B[] = { 0x3c58,0x71a5,0xcf8c,0x9ee1, 0xbc72,0xfecc,0x9381,0x2603, 0x3c8e,0x092e,0x41a8,0xcdf4, 0xbca8,0x2f94,0x74d7,0x7641, 0x3cc3,0xdbf9,0x6b94,0x785b, 0xbce0,0xa690,0xecfa,0xdd36, 0x3cfc,0x8d9c,0x4a7d,0xdc98, 0xbd19,0x145e,0xbb05,0x6fc2, 0x3d36,0x9c4e,0xcd94,0xcfe2, 0xbd54,0xf877,0x21a4,0x70d1, 0x3d74,0x0fa3,0x2fcc,0xfc25, 0xbd93,0xdafc,0x3f00,0x5143, 0x3db4,0x6808,0x475f,0xbcc7, 0xbdd5,0xdf95,0xd2e7,0xc935, 0x3df8,0x956c,0x819f,0xf608, 0xbe1d,0x29d5,0xf22b,0xf5db, 0x3e42,0x69a0,0x033f,0x428e, 0xbe69,0x0554,0x1b54,0xf2af, 0x3e92,0x9159,0x81e3,0xe46f, 0xbebe,0xbb54,0x7f18,0xd3a9, 0x3eed,0x413f,0xcc74,0x70a9, 0xbf20,0xd797,0xe788,0x9f42, 0x3f59,0xb891,0xfca7,0x9342, 0xbfa0,0x19f7,0x2d4f,0xf71e, 0x4003,0x85bd,0x9f4e,0x6907 }; #endif /* k0.c */ extern double PI; extern double MAXNUM; double k0(x) double x; { double y, z; if( x <= 0.0 ) { mtherr( "k0", DOMAIN ); return( MAXNUM ); } if( x <= 2.0 ) { y = x * x - 2.0; y = chbevl( y, A, 10 ) - log( 0.5 * x ) * i0(x); return( y ); } z = 8.0/x - 2.0; y = exp(-x) * chbevl( z, B, 25 ) / sqrt(x); return(y); } double k0e( x ) double x; { double y; if( x <= 0.0 ) { mtherr( "k0e", DOMAIN ); return( MAXNUM ); } if( x <= 2.0 ) { y = x * x - 2.0; y = chbevl( y, A, 10 ) - log( 0.5 * x ) * i0(x); return( y * exp(x) ); } y = chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x); return(y); } grace-5.1.23/cephes/k1.c0000644000076500001440000001570606626627164014406 0ustar fnevgenyusers/* k1.c * * Modified Bessel function, third kind, order one * * * * SYNOPSIS: * * double x, y, k1(); * * y = k1( x ); * * * * DESCRIPTION: * * Computes the modified Bessel function of the third kind * of order one of the argument. * * The range is partitioned into the two intervals [0,2] and * (2, infinity). Chebyshev polynomial expansions are employed * in each interval. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 30 3300 8.9e-17 2.2e-17 * IEEE 0, 30 30000 1.2e-15 1.6e-16 * * ERROR MESSAGES: * * message condition value returned * k1 domain x <= 0 MAXNUM * */ /* k1e.c * * Modified Bessel function, third kind, order one, * exponentially scaled * * * * SYNOPSIS: * * double x, y, k1e(); * * y = k1e( x ); * * * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of the third kind of order one of the argument: * * k1e(x) = exp(x) * k1(x). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0, 30 30000 7.8e-16 1.2e-16 * See k1(). * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Chebyshev coefficients for x(K1(x) - log(x/2) I1(x)) * in the interval [0,2]. * * lim(x->0){ x(K1(x) - log(x/2) I1(x)) } = 1. */ #ifdef UNK static double A[] = { -7.02386347938628759343E-18, -2.42744985051936593393E-15, -6.66690169419932900609E-13, -1.41148839263352776110E-10, -2.21338763073472585583E-8, -2.43340614156596823496E-6, -1.73028895751305206302E-4, -6.97572385963986435018E-3, -1.22611180822657148235E-1, -3.53155960776544875667E-1, 1.52530022733894777053E0 }; #endif #ifdef DEC static unsigned short A[] = { 0122001,0110501,0164746,0151255, 0124056,0165213,0150034,0147377, 0126073,0124026,0167207,0001044, 0130033,0030735,0141061,0033116, 0131676,0020350,0121341,0107175, 0133443,0046631,0062031,0070716, 0135065,0067427,0026435,0164022, 0136344,0112234,0165752,0006222, 0137373,0015622,0017016,0155636, 0137664,0150333,0125730,0067240, 0040303,0036411,0130200,0043120 }; #endif #ifdef IBMPC static unsigned short A[] = { 0xda56,0x3d3c,0x3228,0xbc60, 0x99e0,0x7a03,0xdd51,0xbce5, 0xe045,0xddd0,0x7502,0xbd67, 0x26ca,0xb846,0x663b,0xbde3, 0x31d0,0x145c,0xc41d,0xbe57, 0x2e3a,0x2c83,0x69b3,0xbec4, 0xbd02,0xe5a3,0xade2,0xbf26, 0x4192,0x9d7d,0x9293,0xbf7c, 0xdb74,0x43c1,0x6372,0xbfbf, 0x0dd4,0x757b,0x9a1b,0xbfd6, 0x08ca,0x3610,0x67a1,0x3ff8 }; #endif #ifdef MIEEE static unsigned short A[] = { 0xbc60,0x3228,0x3d3c,0xda56, 0xbce5,0xdd51,0x7a03,0x99e0, 0xbd67,0x7502,0xddd0,0xe045, 0xbde3,0x663b,0xb846,0x26ca, 0xbe57,0xc41d,0x145c,0x31d0, 0xbec4,0x69b3,0x2c83,0x2e3a, 0xbf26,0xade2,0xe5a3,0xbd02, 0xbf7c,0x9293,0x9d7d,0x4192, 0xbfbf,0x6372,0x43c1,0xdb74, 0xbfd6,0x9a1b,0x757b,0x0dd4, 0x3ff8,0x67a1,0x3610,0x08ca }; #endif /* Chebyshev coefficients for exp(x) sqrt(x) K1(x) * in the interval [2,infinity]. * * lim(x->inf){ exp(x) sqrt(x) K1(x) } = sqrt(pi/2). */ #ifdef UNK static double B[] = { -5.75674448366501715755E-18, 1.79405087314755922667E-17, -5.68946255844285935196E-17, 1.83809354436663880070E-16, -6.05704724837331885336E-16, 2.03870316562433424052E-15, -7.01983709041831346144E-15, 2.47715442448130437068E-14, -8.97670518232499435011E-14, 3.34841966607842919884E-13, -1.28917396095102890680E-12, 5.13963967348173025100E-12, -2.12996783842756842877E-11, 9.21831518760500529508E-11, -4.19035475934189648750E-10, 2.01504975519703286596E-9, -1.03457624656780970260E-8, 5.74108412545004946722E-8, -3.50196060308781257119E-7, 2.40648494783721712015E-6, -1.93619797416608296024E-5, 1.95215518471351631108E-4, -2.85781685962277938680E-3, 1.03923736576817238437E-1, 2.72062619048444266945E0 }; #endif #ifdef DEC static unsigned short B[] = { 0121724,0061352,0013041,0150076, 0022245,0074324,0016172,0173232, 0122603,0030250,0135670,0165221, 0023123,0165362,0023561,0060124, 0123456,0112436,0141654,0073623, 0024022,0163557,0077564,0006753, 0124374,0165221,0131014,0026524, 0024737,0017512,0144250,0175451, 0125312,0021456,0123136,0076633, 0025674,0077720,0020125,0102607, 0126265,0067543,0007744,0043701, 0026664,0152702,0033002,0074202, 0127273,0055234,0120016,0071733, 0027712,0133200,0042441,0075515, 0130346,0057000,0015456,0074470, 0031012,0074441,0051636,0111155, 0131461,0136444,0177417,0002101, 0032166,0111743,0032176,0021410, 0132674,0001224,0076555,0027060, 0033441,0077430,0135226,0106663, 0134242,0065610,0167155,0113447, 0035114,0131304,0043664,0102163, 0136073,0045065,0171465,0122123, 0037324,0152767,0147401,0017732, 0040456,0017275,0050061,0062120, }; #endif #ifdef IBMPC static unsigned short B[] = { 0x3a08,0x42c4,0x8c5d,0xbc5a, 0x5ed3,0x838f,0xaf1a,0x3c74, 0x1d52,0x1777,0x6615,0xbc90, 0x2c0b,0x44ee,0x7d5e,0x3caa, 0x8ef2,0xd875,0xd2a3,0xbcc5, 0x81bd,0xefee,0x5ced,0x3ce2, 0x85ab,0x3641,0x9d52,0xbcff, 0x1f65,0x5915,0xe3e9,0x3d1b, 0xcfb3,0xd4cb,0x4465,0xbd39, 0xb0b1,0x040a,0x8ffa,0x3d57, 0x88f8,0x61fc,0xadec,0xbd76, 0x4f10,0x46c0,0x9ab8,0x3d96, 0xce7b,0x9401,0x6b53,0xbdb7, 0x2f6a,0x08a4,0x56d0,0x3dd9, 0xcf27,0x0365,0xcbc0,0xbdfc, 0xd24e,0x2a73,0x4f24,0x3e21, 0xe088,0x9fe1,0x37a4,0xbe46, 0xc461,0x668f,0xd27c,0x3e6e, 0xa5c6,0x8fad,0x8052,0xbe97, 0xd1b6,0x1752,0x2fe3,0x3ec4, 0xb2e5,0x1dcd,0x4d71,0xbef4, 0x908e,0x88f6,0x9658,0x3f29, 0xb48a,0xbe66,0x6946,0xbf67, 0x23fb,0xf9e0,0x9abe,0x3fba, 0x2c8a,0xaa06,0xc3d7,0x4005 }; #endif #ifdef MIEEE static unsigned short B[] = { 0xbc5a,0x8c5d,0x42c4,0x3a08, 0x3c74,0xaf1a,0x838f,0x5ed3, 0xbc90,0x6615,0x1777,0x1d52, 0x3caa,0x7d5e,0x44ee,0x2c0b, 0xbcc5,0xd2a3,0xd875,0x8ef2, 0x3ce2,0x5ced,0xefee,0x81bd, 0xbcff,0x9d52,0x3641,0x85ab, 0x3d1b,0xe3e9,0x5915,0x1f65, 0xbd39,0x4465,0xd4cb,0xcfb3, 0x3d57,0x8ffa,0x040a,0xb0b1, 0xbd76,0xadec,0x61fc,0x88f8, 0x3d96,0x9ab8,0x46c0,0x4f10, 0xbdb7,0x6b53,0x9401,0xce7b, 0x3dd9,0x56d0,0x08a4,0x2f6a, 0xbdfc,0xcbc0,0x0365,0xcf27, 0x3e21,0x4f24,0x2a73,0xd24e, 0xbe46,0x37a4,0x9fe1,0xe088, 0x3e6e,0xd27c,0x668f,0xc461, 0xbe97,0x8052,0x8fad,0xa5c6, 0x3ec4,0x2fe3,0x1752,0xd1b6, 0xbef4,0x4d71,0x1dcd,0xb2e5, 0x3f29,0x9658,0x88f6,0x908e, 0xbf67,0x6946,0xbe66,0xb48a, 0x3fba,0x9abe,0xf9e0,0x23fb, 0x4005,0xc3d7,0xaa06,0x2c8a }; #endif extern double PI; extern double MINLOG, MAXNUM; double k1(x) double x; { double y, z; z = 0.5 * x; if( z <= 0.0 ) { mtherr( "k1", DOMAIN ); return( MAXNUM ); } if( x <= 2.0 ) { y = x * x - 2.0; y = log(z) * i1(x) + chbevl( y, A, 11 ) / x; return( y ); } return( exp(-x) * chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) ); } double k1e( x ) double x; { double y; if( x <= 0.0 ) { mtherr( "k1e", DOMAIN ); return( MAXNUM ); } if( x <= 2.0 ) { y = x * x - 2.0; y = log( 0.5 * x ) * i1(x) + chbevl( y, A, 11 ) / x; return( y * exp(x) ); } return( chbevl( 8.0/x - 2.0, B, 25 ) / sqrt(x) ); } grace-5.1.23/cephes/Makefile0000644000076500001440000000124006766330405015345 0ustar fnevgenyusers##################################################### # Makefile for Cephes math library # ##################################################### # You should not change anything here. # ##################################################### TOP=.. include $(TOP)/Make.conf .SUFFIXES : .c $(O) CFLAGS=$(CFLAGS0) -I$(TOP) -I. $(CPPFLAGS) LIB=libcephes.a all : $(LIB) include Make.common include Make.dep $(LIB) : $(OBJS) $(AR) cr $(LIB) $(OBJS) $(RANLIB) $(LIB) install : $(LIB) tests : dummy links : dummy clean : $(RM) $(LIB) $(OBJS) distclean : $(RM) $(LIB) $(OBJS) *.orig devclean : $(RM) $(LIB) $(OBJS) *.orig dummy : grace-5.1.23/cephes/chdtr.c0000644000076500001440000000645006626627163015172 0ustar fnevgenyusers/* chdtr.c * * Chi-square distribution * * * * SYNOPSIS: * * double df, x, y, chdtr(); * * y = chdtr( df, x ); * * * * DESCRIPTION: * * Returns the area under the left hand tail (from 0 to x) * of the Chi square probability density function with * v degrees of freedom. * * * inf. * - * 1 | | v/2-1 -t/2 * P( x | v ) = ----------- | t e dt * v/2 - | | * 2 | (v/2) - * x * * where x is the Chi-square variable. * * The incomplete gamma integral is used, according to the * formula * * y = chdtr( v, x ) = igam( v/2.0, x/2.0 ). * * * The arguments must both be positive. * * * * ACCURACY: * * See igam(). * * ERROR MESSAGES: * * message condition value returned * chdtr domain x < 0 or v < 1 0.0 */ /* chdtrc() * * Complemented Chi-square distribution * * * * SYNOPSIS: * * double v, x, y, chdtrc(); * * y = chdtrc( v, x ); * * * * DESCRIPTION: * * Returns the area under the right hand tail (from x to * infinity) of the Chi square probability density function * with v degrees of freedom: * * * inf. * - * 1 | | v/2-1 -t/2 * P( x | v ) = ----------- | t e dt * v/2 - | | * 2 | (v/2) - * x * * where x is the Chi-square variable. * * The incomplete gamma integral is used, according to the * formula * * y = chdtr( v, x ) = igamc( v/2.0, x/2.0 ). * * * The arguments must both be positive. * * * * ACCURACY: * * See igamc(). * * ERROR MESSAGES: * * message condition value returned * chdtrc domain x < 0 or v < 1 0.0 */ /* chdtri() * * Inverse of complemented Chi-square distribution * * * * SYNOPSIS: * * double df, x, y, chdtri(); * * x = chdtri( df, y ); * * * * * DESCRIPTION: * * Finds the Chi-square argument x such that the integral * from x to infinity of the Chi-square density is equal * to the given cumulative probability y. * * This is accomplished using the inverse gamma integral * function and the relation * * x/2 = igami( df/2, y ); * * * * * ACCURACY: * * See igami.c. * * ERROR MESSAGES: * * message condition value returned * chdtri domain y < 0 or y > 1 0.0 * v < 1 * */ /* chdtr() */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" double chdtrc(df,x) double df, x; { if( (x < 0.0) || (df < 1.0) ) { mtherr( "chdtrc", DOMAIN ); return(0.0); } return( igamc( df/2.0, x/2.0 ) ); } double chdtr(df,x) double df, x; { if( (x < 0.0) || (df < 1.0) ) { mtherr( "chdtr", DOMAIN ); return(0.0); } return( igam( df/2.0, x/2.0 ) ); } double chdtri( df, y ) double df, y; { double x; if( (y < 0.0) || (y > 1.0) || (df < 1.0) ) { mtherr( "chdtri", DOMAIN ); return(0.0); } x = igami( 0.5 * df, y ); return( 2.0 * x ); } grace-5.1.23/cephes/yn.c0000644000076500001440000000342306626627164014512 0ustar fnevgenyusers/* yn.c * * Bessel function of second kind of integer order * * * * SYNOPSIS: * * double x, y, yn(); * int n; * * y = yn( n, x ); * * * * DESCRIPTION: * * Returns Bessel function of order n, where n is a * (possibly negative) integer. * * The function is evaluated by forward recurrence on * n, starting with values computed by the routines * y0() and y1(). * * If n = 0 or 1 the routine for y0 or y1 is called * directly. * * * * ACCURACY: * * * Absolute error, except relative * when y > 1: * arithmetic domain # trials peak rms * DEC 0, 30 2200 2.9e-16 5.3e-17 * IEEE 0, 30 30000 3.4e-15 4.3e-16 * * * ERROR MESSAGES: * * message condition value returned * yn singularity x = 0 MAXNUM * yn overflow MAXNUM * * Spot checked against tables for x, n between 0 and 100. * */ /* Cephes Math Library Release 2.1: December, 1988 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_YN extern double MAXNUM, MAXLOG; double yn( n, x ) int n; double x; { double an, anm1, anm2, r; int k, sign; if( n < 0 ) { n = -n; if( (n & 1) == 0 ) /* -1**n */ sign = 1; else sign = -1; } else sign = 1; if( n == 0 ) return( sign * y0(x) ); if( n == 1 ) return( sign * y1(x) ); /* test for overflow */ if( x <= 0.0 ) { mtherr( "yn", SING ); return( -MAXNUM ); } /* forward recurrence on n */ anm2 = y0(x); anm1 = y1(x); k = 1; r = 2 * k; do { an = r * anm1 / x - anm2; anm2 = anm1; anm1 = an; r += 2.0; ++k; } while( k < n ); return( sign * an ); } #endif /* HAVE_YN */ grace-5.1.23/cephes/fresnl.c0000644000076500001440000002743306626627164015364 0ustar fnevgenyusers/* fresnl.c * * Fresnel integral * * * * SYNOPSIS: * * double x, S, C; * void fresnl(); * * fresnl( x, _&S, _&C ); * * * DESCRIPTION: * * Evaluates the Fresnel integrals * * x * - * | | * C(x) = | cos(pi/2 t**2) dt, * | | * - * 0 * * x * - * | | * S(x) = | sin(pi/2 t**2) dt. * | | * - * 0 * * * The integrals are evaluated by a power series for x < 1. * For x >= 1 auxiliary functions f(x) and g(x) are employed * such that * * C(x) = 0.5 + f(x) sin( pi/2 x**2 ) - g(x) cos( pi/2 x**2 ) * S(x) = 0.5 - f(x) cos( pi/2 x**2 ) - g(x) sin( pi/2 x**2 ) * * * * ACCURACY: * * Relative error. * * Arithmetic function domain # trials peak rms * IEEE S(x) 0, 10 10000 2.0e-15 3.2e-16 * IEEE C(x) 0, 10 10000 1.8e-15 3.3e-16 * DEC S(x) 0, 10 6000 2.2e-16 3.9e-17 * DEC C(x) 0, 10 5000 2.3e-16 3.9e-17 */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* S(x) for small x */ #ifdef UNK static double sn[6] = { -2.99181919401019853726E3, 7.08840045257738576863E5, -6.29741486205862506537E7, 2.54890880573376359104E9, -4.42979518059697779103E10, 3.18016297876567817986E11, }; static double sd[6] = { /* 1.00000000000000000000E0,*/ 2.81376268889994315696E2, 4.55847810806532581675E4, 5.17343888770096400730E6, 4.19320245898111231129E8, 2.24411795645340920940E10, 6.07366389490084639049E11, }; #endif #ifdef DEC static unsigned short sn[24] = { 0143072,0176433,0065455,0127034, 0045055,0007200,0134540,0026661, 0146560,0035061,0023667,0127545, 0050027,0166503,0002673,0153756, 0151045,0002721,0121737,0102066, 0051624,0013177,0033451,0021271, }; static unsigned short sd[24] = { /*0040200,0000000,0000000,0000000,*/ 0042214,0130051,0112070,0101617, 0044062,0010307,0172346,0152510, 0045635,0160575,0143200,0136642, 0047307,0171215,0127457,0052361, 0050647,0031447,0032621,0013510, 0052015,0064733,0117362,0012653, }; #endif #ifdef IBMPC static unsigned short sn[24] = { 0xb5c3,0x6d65,0x5fa3,0xc0a7, 0x05b6,0x172c,0xa1d0,0x4125, 0xf5ed,0x24f6,0x0746,0xc18e, 0x7afe,0x60b7,0xfda8,0x41e2, 0xf087,0x347b,0xa0ba,0xc224, 0x2457,0xe6e5,0x82cf,0x4252, }; static unsigned short sd[24] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x1072,0x3287,0x9605,0x4071, 0xdaa9,0xfe9c,0x4218,0x40e6, 0x17b4,0xb8d0,0xbc2f,0x4153, 0xea9e,0xb5e5,0xfe51,0x41b8, 0x22e9,0xe6b2,0xe664,0x4214, 0x42b5,0x73de,0xad3b,0x4261, }; #endif #ifdef MIEEE static unsigned short sn[24] = { 0xc0a7,0x5fa3,0x6d65,0xb5c3, 0x4125,0xa1d0,0x172c,0x05b6, 0xc18e,0x0746,0x24f6,0xf5ed, 0x41e2,0xfda8,0x60b7,0x7afe, 0xc224,0xa0ba,0x347b,0xf087, 0x4252,0x82cf,0xe6e5,0x2457, }; static unsigned short sd[24] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4071,0x9605,0x3287,0x1072, 0x40e6,0x4218,0xfe9c,0xdaa9, 0x4153,0xbc2f,0xb8d0,0x17b4, 0x41b8,0xfe51,0xb5e5,0xea9e, 0x4214,0xe664,0xe6b2,0x22e9, 0x4261,0xad3b,0x73de,0x42b5, }; #endif /* C(x) for small x */ #ifdef UNK static double cn[6] = { -4.98843114573573548651E-8, 9.50428062829859605134E-6, -6.45191435683965050962E-4, 1.88843319396703850064E-2, -2.05525900955013891793E-1, 9.99999999999999998822E-1, }; static double cd[7] = { 3.99982968972495980367E-12, 9.15439215774657478799E-10, 1.25001862479598821474E-7, 1.22262789024179030997E-5, 8.68029542941784300606E-4, 4.12142090722199792936E-2, 1.00000000000000000118E0, }; #endif #ifdef DEC static unsigned short cn[24] = { 0132126,0040141,0063733,0013231, 0034037,0072223,0010200,0075637, 0135451,0021020,0073264,0036057, 0036632,0131520,0101316,0060233, 0137522,0072541,0136124,0132202, 0040200,0000000,0000000,0000000, }; static unsigned short cd[28] = { 0026614,0135503,0051776,0032631, 0030573,0121116,0154033,0126712, 0032406,0034100,0012442,0106212, 0034115,0017567,0150520,0164623, 0035543,0106171,0177336,0146351, 0037050,0150073,0000607,0171635, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short cn[24] = { 0x62d3,0x2cfb,0xc80c,0xbe6a, 0x0f74,0x6210,0xee92,0x3ee3, 0x8786,0x0ed6,0x2442,0xbf45, 0xcc13,0x1059,0x566a,0x3f93, 0x9690,0x378a,0x4eac,0xbfca, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short cd[28] = { 0xc6b3,0x6a7f,0x9768,0x3d91, 0x75b9,0xdb03,0x7449,0x3e0f, 0x5191,0x02a4,0xc708,0x3e80, 0x1d32,0xfa2a,0xa3ee,0x3ee9, 0xd99d,0x3fdb,0x718f,0x3f4c, 0xfe74,0x6030,0x1a07,0x3fa5, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short cn[24] = { 0xbe6a,0xc80c,0x2cfb,0x62d3, 0x3ee3,0xee92,0x6210,0x0f74, 0xbf45,0x2442,0x0ed6,0x8786, 0x3f93,0x566a,0x1059,0xcc13, 0xbfca,0x4eac,0x378a,0x9690, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short cd[28] = { 0x3d91,0x9768,0x6a7f,0xc6b3, 0x3e0f,0x7449,0xdb03,0x75b9, 0x3e80,0xc708,0x02a4,0x5191, 0x3ee9,0xa3ee,0xfa2a,0x1d32, 0x3f4c,0x718f,0x3fdb,0xd99d, 0x3fa5,0x1a07,0x6030,0xfe74, 0x3ff0,0x0000,0x0000,0x0000, }; #endif /* Auxiliary function f(x) */ #ifdef UNK static double fn[10] = { 4.21543555043677546506E-1, 1.43407919780758885261E-1, 1.15220955073585758835E-2, 3.45017939782574027900E-4, 4.63613749287867322088E-6, 3.05568983790257605827E-8, 1.02304514164907233465E-10, 1.72010743268161828879E-13, 1.34283276233062758925E-16, 3.76329711269987889006E-20, }; static double fd[10] = { /* 1.00000000000000000000E0,*/ 7.51586398353378947175E-1, 1.16888925859191382142E-1, 6.44051526508858611005E-3, 1.55934409164153020873E-4, 1.84627567348930545870E-6, 1.12699224763999035261E-8, 3.60140029589371370404E-11, 5.88754533621578410010E-14, 4.52001434074129701496E-17, 1.25443237090011264384E-20, }; #endif #ifdef DEC static unsigned short fn[40] = { 0037727,0152216,0106601,0016214, 0037422,0154606,0112710,0071355, 0036474,0143453,0154253,0166545, 0035264,0161606,0022250,0073743, 0033633,0110036,0024653,0136246, 0032003,0036652,0041164,0036413, 0027740,0174122,0046305,0036726, 0025501,0125270,0121317,0167667, 0023032,0150555,0076175,0047443, 0020061,0133570,0070130,0027657, }; static unsigned short fd[40] = { /*0040200,0000000,0000000,0000000,*/ 0040100,0063767,0054413,0151452, 0037357,0061566,0007243,0065754, 0036323,0005365,0033552,0133625, 0035043,0101123,0000275,0165402, 0033367,0146614,0110623,0023647, 0031501,0116644,0125222,0144263, 0027436,0062051,0117235,0001411, 0025204,0111543,0056370,0036201, 0022520,0071351,0015227,0122144, 0017554,0172240,0112713,0005006, }; #endif #ifdef IBMPC static unsigned short fn[40] = { 0x2391,0xd1b0,0xfa91,0x3fda, 0x0e5e,0xd2b9,0x5b30,0x3fc2, 0x7dad,0x7b15,0x98e5,0x3f87, 0x0efc,0xc495,0x9c70,0x3f36, 0x7795,0xc535,0x7203,0x3ed3, 0x87a1,0x484e,0x67b5,0x3e60, 0xa7bb,0x4998,0x1f0a,0x3ddc, 0xfdf7,0x1459,0x3557,0x3d48, 0xa9e4,0xaf8f,0x5a2d,0x3ca3, 0x05f6,0x0e0b,0x36ef,0x3be6, }; static unsigned short fd[40] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x7a65,0xeb21,0x0cfe,0x3fe8, 0x6d7d,0xc1d4,0xec6e,0x3fbd, 0x56f3,0xa6ed,0x615e,0x3f7a, 0xbd60,0x6017,0x704a,0x3f24, 0x64f5,0x9232,0xf9b1,0x3ebe, 0x5916,0x9552,0x33b4,0x3e48, 0xa061,0x33d3,0xcc85,0x3dc3, 0x0790,0x6b9f,0x926c,0x3d30, 0xf48d,0x2352,0x0e5d,0x3c8a, 0x6141,0x12b9,0x9e94,0x3bcd, }; #endif #ifdef MIEEE static unsigned short fn[40] = { 0x3fda,0xfa91,0xd1b0,0x2391, 0x3fc2,0x5b30,0xd2b9,0x0e5e, 0x3f87,0x98e5,0x7b15,0x7dad, 0x3f36,0x9c70,0xc495,0x0efc, 0x3ed3,0x7203,0xc535,0x7795, 0x3e60,0x67b5,0x484e,0x87a1, 0x3ddc,0x1f0a,0x4998,0xa7bb, 0x3d48,0x3557,0x1459,0xfdf7, 0x3ca3,0x5a2d,0xaf8f,0xa9e4, 0x3be6,0x36ef,0x0e0b,0x05f6, }; static unsigned short fd[40] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3fe8,0x0cfe,0xeb21,0x7a65, 0x3fbd,0xec6e,0xc1d4,0x6d7d, 0x3f7a,0x615e,0xa6ed,0x56f3, 0x3f24,0x704a,0x6017,0xbd60, 0x3ebe,0xf9b1,0x9232,0x64f5, 0x3e48,0x33b4,0x9552,0x5916, 0x3dc3,0xcc85,0x33d3,0xa061, 0x3d30,0x926c,0x6b9f,0x0790, 0x3c8a,0x0e5d,0x2352,0xf48d, 0x3bcd,0x9e94,0x12b9,0x6141, }; #endif /* Auxiliary function g(x) */ #ifdef UNK static double gn[11] = { 5.04442073643383265887E-1, 1.97102833525523411709E-1, 1.87648584092575249293E-2, 6.84079380915393090172E-4, 1.15138826111884280931E-5, 9.82852443688422223854E-8, 4.45344415861750144738E-10, 1.08268041139020870318E-12, 1.37555460633261799868E-15, 8.36354435630677421531E-19, 1.86958710162783235106E-22, }; static double gd[11] = { /* 1.00000000000000000000E0,*/ 1.47495759925128324529E0, 3.37748989120019970451E-1, 2.53603741420338795122E-2, 8.14679107184306179049E-4, 1.27545075667729118702E-5, 1.04314589657571990585E-7, 4.60680728146520428211E-10, 1.10273215066240270757E-12, 1.38796531259578871258E-15, 8.39158816283118707363E-19, 1.86958710162783236342E-22, }; #endif #ifdef DEC static unsigned short gn[44] = { 0040001,0021435,0120406,0053123, 0037511,0152523,0037703,0122011, 0036631,0134302,0122721,0110235, 0035463,0051712,0043215,0114732, 0034101,0025677,0147725,0057630, 0032323,0010342,0067523,0002206, 0030364,0152247,0110007,0054107, 0026230,0057654,0035464,0047124, 0023706,0036401,0167705,0045440, 0021166,0154447,0105632,0142461, 0016142,0002353,0011175,0170530, }; static unsigned short gd[44] = { /*0040200,0000000,0000000,0000000,*/ 0040274,0145551,0016742,0127005, 0037654,0166557,0076416,0015165, 0036717,0140217,0030675,0050111, 0035525,0110060,0076405,0070502, 0034125,0176061,0060120,0031730, 0032340,0001615,0054343,0120501, 0030375,0041414,0070747,0107060, 0026233,0031034,0160757,0074526, 0023710,0003341,0137100,0144664, 0021167,0126414,0023774,0015435, 0016142,0002353,0011175,0170530, }; #endif #ifdef IBMPC static unsigned short gn[44] = { 0xcaca,0xb420,0x2463,0x3fe0, 0x7481,0x67f8,0x3aaa,0x3fc9, 0x3214,0x54ba,0x3718,0x3f93, 0xb33b,0x48d1,0x6a79,0x3f46, 0xabf3,0xf9fa,0x2577,0x3ee8, 0x6091,0x4dea,0x621c,0x3e7a, 0xeb09,0xf200,0x9a94,0x3dfe, 0x89cb,0x8766,0x0bf5,0x3d73, 0xa964,0x3df8,0xc7a0,0x3cd8, 0x58a6,0xf173,0xdb24,0x3c2e, 0xbe2b,0x624f,0x409d,0x3b6c, }; static unsigned short gd[44] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x55c1,0x23bc,0x996d,0x3ff7, 0xc34f,0xefa1,0x9dad,0x3fd5, 0xaa09,0xe637,0xf811,0x3f99, 0xae28,0x0fa0,0xb206,0x3f4a, 0x067b,0x2c0a,0xbf86,0x3eea, 0x7428,0xab1c,0x0071,0x3e7c, 0xf1c6,0x8e3c,0xa861,0x3dff, 0xef2b,0x9c3d,0x6643,0x3d73, 0x1936,0x37c8,0x00dc,0x3cd9, 0x8364,0x84ff,0xf5a1,0x3c2e, 0xbe2b,0x624f,0x409d,0x3b6c, }; #endif #ifdef MIEEE static unsigned short gn[44] = { 0x3fe0,0x2463,0xb420,0xcaca, 0x3fc9,0x3aaa,0x67f8,0x7481, 0x3f93,0x3718,0x54ba,0x3214, 0x3f46,0x6a79,0x48d1,0xb33b, 0x3ee8,0x2577,0xf9fa,0xabf3, 0x3e7a,0x621c,0x4dea,0x6091, 0x3dfe,0x9a94,0xf200,0xeb09, 0x3d73,0x0bf5,0x8766,0x89cb, 0x3cd8,0xc7a0,0x3df8,0xa964, 0x3c2e,0xdb24,0xf173,0x58a6, 0x3b6c,0x409d,0x624f,0xbe2b, }; static unsigned short gd[44] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3ff7,0x996d,0x23bc,0x55c1, 0x3fd5,0x9dad,0xefa1,0xc34f, 0x3f99,0xf811,0xe637,0xaa09, 0x3f4a,0xb206,0x0fa0,0xae28, 0x3eea,0xbf86,0x2c0a,0x067b, 0x3e7c,0x0071,0xab1c,0x7428, 0x3dff,0xa861,0x8e3c,0xf1c6, 0x3d73,0x6643,0x9c3d,0xef2b, 0x3cd9,0x00dc,0x37c8,0x1936, 0x3c2e,0xf5a1,0x84ff,0x8364, 0x3b6c,0x409d,0x624f,0xbe2b, }; #endif extern double PI, PIO2, MACHEP; int fresnl( xxa, ssa, cca ) double xxa, *ssa, *cca; { double f, g, cc, ss, c, s, t, u; double x, x2; x = fabs(xxa); x2 = x * x; if( x2 < 2.5625 ) { t = x2 * x2; ss = x * x2 * polevl( t, sn, 5)/p1evl( t, sd, 6 ); cc = x * polevl( t, cn, 5)/polevl(t, cd, 6 ); goto done; } if( x > 36974.0 ) { cc = 0.5; ss = 0.5; goto done; } /* Asymptotic power series auxiliary functions * for large argument */ x2 = x * x; t = PI * x2; u = 1.0/(t * t); t = 1.0/t; f = 1.0 - u * polevl( u, fn, 9)/p1evl(u, fd, 10); g = t * polevl( u, gn, 10)/p1evl(u, gd, 11); t = PIO2 * x2; c = cos(t); s = sin(t); t = PI * x; cc = 0.5 + (f * s - g * c)/t; ss = 0.5 - (f * c + g * s)/t; done: if( xxa < 0.0 ) { cc = -cc; ss = -ss; } *cca = cc; *ssa = ss; return(0); } grace-5.1.23/cephes/mtherr.c0000644000076500001440000000456506626627164015375 0ustar fnevgenyusers/* mtherr.c * * Library common error handling routine * * * * SYNOPSIS: * * char *fctnam; * int code; * int mtherr(); * * mtherr( fctnam, code ); * * * * DESCRIPTION: * * This routine may be called to report one of the following * error conditions (in the include file mconf.h). * * Mnemonic Value Significance * * DOMAIN 1 argument domain error * SING 2 function singularity * OVERFLOW 3 overflow range error * UNDERFLOW 4 underflow range error * TLOSS 5 total loss of precision * PLOSS 6 partial loss of precision * EDOM 33 Unix domain error code * ERANGE 34 Unix range error code * * The default version of the file prints the function name, * passed to it by the pointer fctnam, followed by the * error condition. The display is directed to the standard * output device. The routine then returns to the calling * program. Users may wish to modify the program to abort by * calling exit() under severe error conditions such as domain * errors. * * Since all error conditions pass control to this function, * the display may be easily changed, eliminated, or directed * to an error logging device. * * SEE ALSO: * * mconf.h * */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #include void errmsg(char *buf); int merror = 0; /* Notice: the order of appearance of the following * messages is bound to the error codes defined * in mconf.h. */ static char *ermsg[7] = { "unknown", /* error code 0 */ "domain", /* error code 1 */ "singularity", /* et seq. */ "overflow", "underflow", "total loss of precision", "partial loss of precision" }; int mtherr( name, code ) char *name; int code; { char buf[256]; /* Set global error message word */ merror = code; if( (code <= 0) || (code >= 7) ) code = 0; /* Display string passed by calling program, * which is supposed to be the name of the * function in which the error occurred and * error message defined by the code argument: */ sprintf(buf, "%s %s error", name, ermsg[code]); errmsg(buf); /* Return to calling * program */ return( 0 ); } grace-5.1.23/cephes/j1.c0000644000076500001440000002717506626627164014410 0ustar fnevgenyusers/* j1.c * * Bessel function of order one * * * * SYNOPSIS: * * double x, y, j1(); * * y = j1( x ); * * * * DESCRIPTION: * * Returns Bessel function of order one of the argument. * * The domain is divided into the intervals [0, 8] and * (8, infinity). In the first interval a 24 term Chebyshev * expansion is used. In the second, the asymptotic * trigonometric representation is employed using two * rational functions of degree 5/5. * * * * ACCURACY: * * Absolute error: * arithmetic domain # trials peak rms * DEC 0, 30 10000 4.0e-17 1.1e-17 * IEEE 0, 30 30000 2.6e-16 1.1e-16 * * */ /* y1.c * * Bessel function of second kind of order one * * * * SYNOPSIS: * * double x, y, y1(); * * y = y1( x ); * * * * DESCRIPTION: * * Returns Bessel function of the second kind of order one * of the argument. * * The domain is divided into the intervals [0, 8] and * (8, infinity). In the first interval a 25 term Chebyshev * expansion is used, and a call to j1() is required. * In the second, the asymptotic trigonometric representation * is employed using two rational functions of degree 5/5. * * * * ACCURACY: * * Absolute error: * arithmetic domain # trials peak rms * DEC 0, 30 10000 8.6e-17 1.3e-17 * IEEE 0, 30 30000 1.0e-15 1.3e-16 * * (error criterion relative when |y1| > 1). * */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ /* #define PIO4 .78539816339744830962 #define THPIO4 2.35619449019234492885 #define SQ2OPI .79788456080286535588 */ #include "mconf.h" #include "cephes.h" #if !defined(HAVE_J1) || !defined(HAVE_Y1) #ifdef UNK static double RP[4] = { -8.99971225705559398224E8, 4.52228297998194034323E11, -7.27494245221818276015E13, 3.68295732863852883286E15, }; static double RQ[8] = { /* 1.00000000000000000000E0,*/ 6.20836478118054335476E2, 2.56987256757748830383E5, 8.35146791431949253037E7, 2.21511595479792499675E10, 4.74914122079991414898E12, 7.84369607876235854894E14, 8.95222336184627338078E16, 5.32278620332680085395E18, }; #endif #ifdef DEC static unsigned short RP[16] = { 0147526,0110742,0063322,0077052, 0051722,0112720,0065034,0061530, 0153604,0052227,0033147,0105650, 0055121,0055025,0032276,0022015, }; static unsigned short RQ[32] = { /*0040200,0000000,0000000,0000000,*/ 0042433,0032610,0155604,0033473, 0044572,0173320,0067270,0006616, 0046637,0045246,0162225,0006606, 0050645,0004773,0157577,0053004, 0052612,0033734,0001667,0176501, 0054462,0054121,0173147,0121367, 0056237,0002777,0121451,0176007, 0057623,0136253,0131601,0044710, }; #endif #ifdef IBMPC static unsigned short RP[16] = { 0x4fc5,0x4cda,0xd23c,0xc1ca, 0x8c6b,0x0d43,0x52ba,0x425a, 0xf175,0xe6cc,0x8a92,0xc2d0, 0xc482,0xa697,0x2b42,0x432a, }; static unsigned short RQ[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x86e7,0x1b70,0x66b1,0x4083, 0x01b2,0x0dd7,0x5eda,0x410f, 0xa1b1,0xdc92,0xe954,0x4193, 0xeac1,0x7bef,0xa13f,0x4214, 0xffa8,0x8076,0x46fb,0x4291, 0xf45f,0x3ecc,0x4b0a,0x4306, 0x3f81,0xf465,0xe0bf,0x4373, 0x2939,0x7670,0x7795,0x43d2, }; #endif #ifdef MIEEE static unsigned short RP[16] = { 0xc1ca,0xd23c,0x4cda,0x4fc5, 0x425a,0x52ba,0x0d43,0x8c6b, 0xc2d0,0x8a92,0xe6cc,0xf175, 0x432a,0x2b42,0xa697,0xc482, }; static unsigned short RQ[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4083,0x66b1,0x1b70,0x86e7, 0x410f,0x5eda,0x0dd7,0x01b2, 0x4193,0xe954,0xdc92,0xa1b1, 0x4214,0xa13f,0x7bef,0xeac1, 0x4291,0x46fb,0x8076,0xffa8, 0x4306,0x4b0a,0x3ecc,0xf45f, 0x4373,0xe0bf,0xf465,0x3f81, 0x43d2,0x7795,0x7670,0x2939, }; #endif #ifdef UNK static double PP[7] = { 7.62125616208173112003E-4, 7.31397056940917570436E-2, 1.12719608129684925192E0, 5.11207951146807644818E0, 8.42404590141772420927E0, 5.21451598682361504063E0, 1.00000000000000000254E0, }; static double PQ[7] = { 5.71323128072548699714E-4, 6.88455908754495404082E-2, 1.10514232634061696926E0, 5.07386386128601488557E0, 8.39985554327604159757E0, 5.20982848682361821619E0, 9.99999999999999997461E-1, }; #endif #ifdef DEC static unsigned short PP[28] = { 0035507,0144542,0061543,0024326, 0037225,0145105,0017766,0022661, 0040220,0043766,0010254,0133255, 0040643,0113047,0142611,0151521, 0041006,0144344,0055351,0074261, 0040646,0156520,0120574,0006416, 0040200,0000000,0000000,0000000, }; static unsigned short PQ[28] = { 0035425,0142330,0115041,0165514, 0037214,0177352,0145105,0052026, 0040215,0072515,0141207,0073255, 0040642,0056427,0137222,0106405, 0041006,0062716,0166427,0165450, 0040646,0133352,0035425,0123304, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short PP[28] = { 0x651b,0x4c6c,0xf92c,0x3f48, 0xc4b6,0xa3fe,0xb948,0x3fb2, 0x96d6,0xc215,0x08fe,0x3ff2, 0x3a6a,0xf8b1,0x72c4,0x4014, 0x2f16,0x8b5d,0xd91c,0x4020, 0x81a2,0x142f,0xdbaa,0x4014, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short PQ[28] = { 0x3d69,0x1344,0xb89b,0x3f42, 0xaa83,0x5948,0x9fdd,0x3fb1, 0xeed6,0xb850,0xaea9,0x3ff1, 0x51a1,0xf7d2,0x4ba2,0x4014, 0xfd65,0xdda2,0xccb9,0x4020, 0xb4d9,0x4762,0xd6dd,0x4014, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short PP[28] = { 0x3f48,0xf92c,0x4c6c,0x651b, 0x3fb2,0xb948,0xa3fe,0xc4b6, 0x3ff2,0x08fe,0xc215,0x96d6, 0x4014,0x72c4,0xf8b1,0x3a6a, 0x4020,0xd91c,0x8b5d,0x2f16, 0x4014,0xdbaa,0x142f,0x81a2, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short PQ[28] = { 0x3f42,0xb89b,0x1344,0x3d69, 0x3fb1,0x9fdd,0x5948,0xaa83, 0x3ff1,0xaea9,0xb850,0xeed6, 0x4014,0x4ba2,0xf7d2,0x51a1, 0x4020,0xccb9,0xdda2,0xfd65, 0x4014,0xd6dd,0x4762,0xb4d9, 0x3ff0,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double QP[8] = { 5.10862594750176621635E-2, 4.98213872951233449420E0, 7.58238284132545283818E1, 3.66779609360150777800E2, 7.10856304998926107277E2, 5.97489612400613639965E2, 2.11688757100572135698E2, 2.52070205858023719784E1, }; static double QQ[7] = { /* 1.00000000000000000000E0,*/ 7.42373277035675149943E1, 1.05644886038262816351E3, 4.98641058337653607651E3, 9.56231892404756170795E3, 7.99704160447350683650E3, 2.82619278517639096600E3, 3.36093607810698293419E2, }; #endif #ifdef DEC static unsigned short QP[32] = { 0037121,0037723,0055605,0151004, 0040637,0066656,0031554,0077264, 0041627,0122714,0153170,0161466, 0042267,0061712,0036520,0140145, 0042461,0133315,0131573,0071176, 0042425,0057525,0147500,0013201, 0042123,0130122,0061245,0154131, 0041311,0123772,0064254,0172650, }; static unsigned short QQ[28] = { /*0040200,0000000,0000000,0000000,*/ 0041624,0074603,0002112,0101670, 0042604,0007135,0010162,0175565, 0043233,0151510,0157757,0172010, 0043425,0064506,0112006,0104276, 0043371,0164125,0032271,0164242, 0043060,0121425,0122750,0136013, 0042250,0005773,0053472,0146267, }; #endif #ifdef IBMPC static unsigned short QP[32] = { 0xba40,0x6b70,0x27fa,0x3faa, 0x8fd6,0xc66d,0xedb5,0x4013, 0x1c67,0x9acf,0xf4b9,0x4052, 0x180d,0x47aa,0xec79,0x4076, 0x6e50,0xb66f,0x36d9,0x4086, 0x02d0,0xb9e8,0xabea,0x4082, 0xbb0b,0x4c54,0x760a,0x406a, 0x9eb5,0x4d15,0x34ff,0x4039, }; static unsigned short QQ[28] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x5077,0x6089,0x8f30,0x4052, 0x5f6f,0xa20e,0x81cb,0x4090, 0xfe81,0x1bfd,0x7a69,0x40b3, 0xd118,0xd280,0xad28,0x40c2, 0x3d14,0xa697,0x3d0a,0x40bf, 0x1781,0xb4bd,0x1462,0x40a6, 0x5997,0x6ae7,0x017f,0x4075, }; #endif #ifdef MIEEE static unsigned short QP[32] = { 0x3faa,0x27fa,0x6b70,0xba40, 0x4013,0xedb5,0xc66d,0x8fd6, 0x4052,0xf4b9,0x9acf,0x1c67, 0x4076,0xec79,0x47aa,0x180d, 0x4086,0x36d9,0xb66f,0x6e50, 0x4082,0xabea,0xb9e8,0x02d0, 0x406a,0x760a,0x4c54,0xbb0b, 0x4039,0x34ff,0x4d15,0x9eb5, }; static unsigned short QQ[28] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4052,0x8f30,0x6089,0x5077, 0x4090,0x81cb,0xa20e,0x5f6f, 0x40b3,0x7a69,0x1bfd,0xfe81, 0x40c2,0xad28,0xd280,0xd118, 0x40bf,0x3d0a,0xa697,0x3d14, 0x40a6,0x1462,0xb4bd,0x1781, 0x4075,0x017f,0x6ae7,0x5997, }; #endif #ifdef UNK static double YP[6] = { 1.26320474790178026440E9, -6.47355876379160291031E11, 1.14509511541823727583E14, -8.12770255501325109621E15, 2.02439475713594898196E17, -7.78877196265950026825E17, }; static double YQ[8] = { /* 1.00000000000000000000E0,*/ 5.94301592346128195359E2, 2.35564092943068577943E5, 7.34811944459721705660E7, 1.87601316108706159478E10, 3.88231277496238566008E12, 6.20557727146953693363E14, 6.87141087355300489866E16, 3.97270608116560655612E18, }; #endif #ifdef DEC static unsigned short YP[24] = { 0047626,0112763,0013715,0133045, 0152026,0134552,0142033,0024411, 0053720,0045245,0102210,0077565, 0155347,0000321,0136415,0102031, 0056463,0146550,0055633,0032605, 0157054,0171012,0167361,0054265, }; static unsigned short YQ[32] = { /*0040200,0000000,0000000,0000000,*/ 0042424,0111515,0044773,0153014, 0044546,0005405,0171307,0075774, 0046614,0023575,0047105,0063556, 0050613,0143034,0101533,0156026, 0052541,0175367,0166514,0114257, 0054415,0014466,0134350,0171154, 0056164,0017436,0025075,0022101, 0057534,0103614,0103663,0121772, }; #endif #ifdef IBMPC static unsigned short YP[24] = { 0xb6c5,0x62f9,0xd2be,0x41d2, 0x6521,0x5883,0xd72d,0xc262, 0x0fef,0xb091,0x0954,0x42da, 0xb083,0x37a1,0xe01a,0xc33c, 0x66b1,0x0b73,0x79ad,0x4386, 0x2b17,0x5dde,0x9e41,0xc3a5, }; static unsigned short YQ[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x7ac2,0xa93f,0x9269,0x4082, 0xef7f,0xbe58,0xc160,0x410c, 0xacee,0xa9c8,0x84ef,0x4191, 0x7b83,0x906b,0x78c3,0x4211, 0x9316,0xfda9,0x3f5e,0x428c, 0x1e4e,0xd71d,0xa326,0x4301, 0xa488,0xc547,0x83e3,0x436e, 0x747f,0x90f6,0x90f1,0x43cb, }; #endif #ifdef MIEEE static unsigned short YP[24] = { 0x41d2,0xd2be,0x62f9,0xb6c5, 0xc262,0xd72d,0x5883,0x6521, 0x42da,0x0954,0xb091,0x0fef, 0xc33c,0xe01a,0x37a1,0xb083, 0x4386,0x79ad,0x0b73,0x66b1, 0xc3a5,0x9e41,0x5dde,0x2b17, }; static unsigned short YQ[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4082,0x9269,0xa93f,0x7ac2, 0x410c,0xc160,0xbe58,0xef7f, 0x4191,0x84ef,0xa9c8,0xacee, 0x4211,0x78c3,0x906b,0x7b83, 0x428c,0x3f5e,0xfda9,0x9316, 0x4301,0xa326,0xd71d,0x1e4e, 0x436e,0x83e3,0xc547,0xa488, 0x43cb,0x90f1,0x90f6,0x747f, }; #endif #ifdef UNK static double Z1 = 1.46819706421238932572E1; static double Z2 = 4.92184563216946036703E1; #endif #ifdef DEC static unsigned short DZ1[] = {0041152,0164532,0006114,0010540}; static unsigned short DZ2[] = {0041504,0157663,0001625,0020621}; #define Z1 (*(double *)DZ1) #define Z2 (*(double *)DZ2) #endif #ifdef IBMPC static unsigned short DZ1[] = {0x822c,0x4189,0x5d2b,0x402d}; static unsigned short DZ2[] = {0xa432,0x6072,0x9bf6,0x4048}; #define Z1 (*(double *)DZ1) #define Z2 (*(double *)DZ2) #endif #ifdef MIEEE static unsigned short DZ1[] = {0x402d,0x5d2b,0x4189,0x822c}; static unsigned short DZ2[] = {0x4048,0x9bf6,0x6072,0xa432}; #define Z1 (*(double *)DZ1) #define Z2 (*(double *)DZ2) #endif #endif #ifndef HAVE_J1 extern double TWOOPI, THPIO4, SQ2OPI; double j1(x) double x; { double w, z, p, q, xn; w = x; if( x < 0 ) w = -x; if( w <= 5.0 ) { z = x * x; w = polevl( z, RP, 3 ) / p1evl( z, RQ, 8 ); w = w * x * (z - Z1) * (z - Z2); return( w ); } w = 5.0/x; z = w * w; p = polevl( z, PP, 6)/polevl( z, PQ, 6 ); q = polevl( z, QP, 7)/p1evl( z, QQ, 7 ); xn = x - THPIO4; p = p * cos(xn) - w * q * sin(xn); return( p * SQ2OPI / sqrt(x) ); } #endif #ifndef HAVE_Y1 extern double MAXNUM; double y1(x) double x; { double w, z, p, q, xn; if( x <= 5.0 ) { if( x <= 0.0 ) { mtherr( "y1", DOMAIN ); return( -MAXNUM ); } z = x * x; w = x * (polevl( z, YP, 5 ) / p1evl( z, YQ, 8 )); w += TWOOPI * ( j1(x) * log(x) - 1.0/x ); return( w ); } w = 5.0/x; z = w * w; p = polevl( z, PP, 6)/polevl( z, PQ, 6 ); q = polevl( z, QP, 7)/p1evl( z, QQ, 7 ); xn = x - THPIO4; p = p * sin(xn) + w * q * cos(xn); return( p * SQ2OPI / sqrt(x) ); } #endif grace-5.1.23/cephes/cbrt.c0000644000076500001440000000452306727573105015015 0ustar fnevgenyusers/* cbrt.c * * Cube root * * * * SYNOPSIS: * * double x, y, cbrt(); * * y = cbrt( x ); * * * * DESCRIPTION: * * Returns the cube root of the argument, which may be negative. * * Range reduction involves determining the power of 2 of * the argument. A polynomial of degree 2 applied to the * mantissa, and multiplication by the cube root of 1, 2, or 4 * approximates the root to within about 0.1%. Then Newton's * iteration is used three times to converge to an accurate * result. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -10,10 200000 1.8e-17 6.2e-18 * IEEE 0,1e308 30000 1.5e-16 5.0e-17 * */ /* cbrt.c */ /* Cephes Math Library Release 2.2: January, 1991 Copyright 1984, 1991 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_CBRT static double CBRT2 = 1.2599210498948731647672; static double CBRT4 = 1.5874010519681994747517; static double CBRT2I = 0.79370052598409973737585; static double CBRT4I = 0.62996052494743658238361; double cbrt(x) double x; { int e, rem, sign; double z; #ifdef NANS if( isnan(x) ) return x; #endif #ifdef INFINITIES if( !finite(x) ) return x; #endif if( x == 0 ) return( x ); if( x > 0 ) sign = 1; else { sign = -1; x = -x; } z = x; /* extract power of 2, leaving * mantissa between 0.5 and 1 */ x = frexp( x, &e ); /* Approximate cube root of number between .5 and 1, * peak relative error = 9.2e-6 */ x = (((-1.3466110473359520655053e-1 * x + 5.4664601366395524503440e-1) * x - 9.5438224771509446525043e-1) * x + 1.1399983354717293273738e0 ) * x + 4.0238979564544752126924e-1; /* exponent divided by 3 */ if( e >= 0 ) { rem = e; e /= 3; rem -= 3*e; if( rem == 1 ) x *= CBRT2; else if( rem == 2 ) x *= CBRT4; } /* argument less than 1 */ else { e = -e; rem = e; e /= 3; rem -= 3*e; if( rem == 1 ) x *= CBRT2I; else if( rem == 2 ) x *= CBRT4I; e = -e; } /* multiply by power of 2 */ x = ldexp( x, e ); /* Newton iteration */ x -= ( x - (z/(x*x)) )*0.33333333333333333333; #ifdef DEC x -= ( x - (z/(x*x)) )/3.0; #else x -= ( x - (z/(x*x)) )*0.33333333333333333333; #endif if( sign < 0 ) x = -x; return(x); } #endif grace-5.1.23/cephes/fdtr.c0000644000076500001440000001170406626627164015024 0ustar fnevgenyusers/* fdtr.c * * F distribution * * * * SYNOPSIS: * * int df1, df2; * double x, y, fdtr(); * * y = fdtr( df1, df2, x ); * * DESCRIPTION: * * Returns the area from zero to x under the F density * function (also known as Snedcor's density or the * variance ratio density). This is the density * of x = (u1/df1)/(u2/df2), where u1 and u2 are random * variables having Chi square distributions with df1 * and df2 degrees of freedom, respectively. * * The incomplete beta integral is used, according to the * formula * * P(x) = incbet( df1/2, df2/2, (df1*x/(df2 + df1*x) ). * * * The arguments a and b are greater than zero, and x is * nonnegative. * * ACCURACY: * * Tested at random points (a,b,x). * * x a,b Relative error: * arithmetic domain domain # trials peak rms * IEEE 0,1 0,100 100000 9.8e-15 1.7e-15 * IEEE 1,5 0,100 100000 6.5e-15 3.5e-16 * IEEE 0,1 1,10000 100000 2.2e-11 3.3e-12 * IEEE 1,5 1,10000 100000 1.1e-11 1.7e-13 * See also incbet.c. * * * ERROR MESSAGES: * * message condition value returned * fdtr domain a<0, b<0, x<0 0.0 * */ /* fdtrc() * * Complemented F distribution * * * * SYNOPSIS: * * int df1, df2; * double x, y, fdtrc(); * * y = fdtrc( df1, df2, x ); * * DESCRIPTION: * * Returns the area from x to infinity under the F density * function (also known as Snedcor's density or the * variance ratio density). * * * inf. * - * 1 | | a-1 b-1 * 1-P(x) = ------ | t (1-t) dt * B(a,b) | | * - * x * * * The incomplete beta integral is used, according to the * formula * * P(x) = incbet( df2/2, df1/2, (df2/(df2 + df1*x) ). * * * ACCURACY: * * Tested at random points (a,b,x) in the indicated intervals. * x a,b Relative error: * arithmetic domain domain # trials peak rms * IEEE 0,1 1,100 100000 3.7e-14 5.9e-16 * IEEE 1,5 1,100 100000 8.0e-15 1.6e-15 * IEEE 0,1 1,10000 100000 1.8e-11 3.5e-13 * IEEE 1,5 1,10000 100000 2.0e-11 3.0e-12 * See also incbet.c. * * ERROR MESSAGES: * * message condition value returned * fdtrc domain a<0, b<0, x<0 0.0 * */ /* fdtri() * * Inverse of complemented F distribution * * * * SYNOPSIS: * * int df1, df2; * double x, p, fdtri(); * * x = fdtri( df1, df2, p ); * * DESCRIPTION: * * Finds the F density argument x such that the integral * from x to infinity of the F density is equal to the * given probability p. * * This is accomplished using the inverse beta integral * function and the relations * * z = incbi( df2/2, df1/2, p ) * x = df2 (1-z) / (df1 z). * * Note: the following relations hold for the inverse of * the uncomplemented F distribution: * * z = incbi( df1/2, df2/2, p ) * x = df2 z / (df1 (1-z)). * * ACCURACY: * * Tested at random points (a,b,p). * * a,b Relative error: * arithmetic domain # trials peak rms * For p between .001 and 1: * IEEE 1,100 100000 8.3e-15 4.7e-16 * IEEE 1,10000 100000 2.1e-11 1.4e-13 * For p between 10^-6 and 10^-3: * IEEE 1,100 50000 1.3e-12 8.4e-15 * IEEE 1,10000 50000 3.0e-12 4.8e-14 * See also fdtrc.c. * * ERROR MESSAGES: * * message condition value returned * fdtri domain p <= 0 or p > 1 0.0 * v < 1 * */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" double fdtrc( ia, ib, x ) int ia, ib; double x; { double a, b, w; if( (ia < 1) || (ib < 1) || (x < 0.0) ) { mtherr( "fdtrc", DOMAIN ); return( 0.0 ); } a = ia; b = ib; w = b / (b + a * x); return( incbet( 0.5*b, 0.5*a, w ) ); } double fdtr( ia, ib, x ) int ia, ib; double x; { double a, b, w; if( (ia < 1) || (ib < 1) || (x < 0.0) ) { mtherr( "fdtr", DOMAIN ); return( 0.0 ); } a = ia; b = ib; w = a * x; w = w / (b + w); return( incbet(0.5*a, 0.5*b, w) ); } double fdtri( ia, ib, y ) int ia, ib; double y; { double a, b, w, x; if( (ia < 1) || (ib < 1) || (y <= 0.0) || (y > 1.0) ) { mtherr( "fdtri", DOMAIN ); return( 0.0 ); } a = ia; b = ib; /* Compute probability for x = 0.5. */ w = incbet( 0.5*b, 0.5*a, 0.5 ); /* If that is greater than y, then the solution w < .5. Otherwise, solve at 1-y to remove cancellation in (b - b*w). */ if( w > y || y < 0.001) { w = incbi( 0.5*b, 0.5*a, y ); x = (b - b*w)/(a*w); } else { w = incbi( 0.5*a, 0.5*b, 1.0-y ); x = b*w/(a*(1.0-w)); } return(x); } grace-5.1.23/cephes/atanh.c0000644000076500001440000000547506626627164015170 0ustar fnevgenyusers/* atanh.c * * Inverse hyperbolic tangent * * * * SYNOPSIS: * * double x, y, atanh(); * * y = atanh( x ); * * * * DESCRIPTION: * * Returns inverse hyperbolic tangent of argument in the range * MINLOG to MAXLOG. * * If |x| < 0.5, the rational form x + x**3 P(x)/Q(x) is * employed. Otherwise, * atanh(x) = 0.5 * log( (1+x)/(1-x) ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC -1,1 50000 2.4e-17 6.4e-18 * IEEE -1,1 30000 1.9e-16 5.2e-17 * */ /* atanh.c */ /* Cephes Math Library Release 2.3: March, 1995 Copyright (C) 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_ATANH #ifdef UNK static double P[] = { -8.54074331929669305196E-1, 1.20426861384072379242E1, -4.61252884198732692637E1, 6.54566728676544377376E1, -3.09092539379866942570E1 }; static double Q[] = { /* 1.00000000000000000000E0,*/ -1.95638849376911654834E1, 1.08938092147140262656E2, -2.49839401325893582852E2, 2.52006675691344555838E2, -9.27277618139601130017E1 }; #endif #ifdef DEC static unsigned short P[] = { 0140132,0122235,0105775,0130300, 0041100,0127327,0124407,0034722, 0141470,0100113,0115607,0130535, 0041602,0164721,0003257,0013673, 0141367,0043046,0166673,0045750 }; static unsigned short Q[] = { /*0040200,0000000,0000000,0000000,*/ 0141234,0101326,0015460,0134564, 0041731,0160115,0116451,0032045, 0142171,0153343,0000532,0167226, 0042174,0000665,0077604,0000310, 0141671,0072235,0031114,0074377 }; #endif #ifdef IBMPC static unsigned short P[] = { 0xb618,0xb17f,0x5493,0xbfeb, 0xe73a,0xf520,0x15da,0x4028, 0xf62c,0x7370,0x1009,0xc047, 0xe2f7,0x20d5,0x5d3a,0x4050, 0x697d,0xddb7,0xe8c4,0xc03e }; static unsigned short Q[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x172f,0xc366,0x905a,0xc033, 0x2685,0xb3a5,0x3c09,0x405b, 0x5dd3,0x602b,0x3adc,0xc06f, 0x8019,0xaff0,0x8036,0x406f, 0x8f20,0xa649,0x2e93,0xc057 }; #endif #ifdef MIEEE static unsigned short P[] = { 0xbfeb,0x5493,0xb17f,0xb618, 0x4028,0x15da,0xf520,0xe73a, 0xc047,0x1009,0x7370,0xf62c, 0x4050,0x5d3a,0x20d5,0xe2f7, 0xc03e,0xe8c4,0xddb7,0x697d }; static unsigned short Q[] = { 0xc033,0x905a,0xc366,0x172f, 0x405b,0x3c09,0xb3a5,0x2685, 0xc06f,0x3adc,0x602b,0x5dd3, 0x406f,0x8036,0xaff0,0x8019, 0xc057,0x2e93,0xa649,0x8f20 }; #endif extern double INFINITY, NAN; double atanh(x) double x; { double s, z; #ifdef MINUSZERO if( x == 0.0 ) return(x); #endif z = fabs(x); if( z >= 1.0 ) { if( x == 1.0 ) return( INFINITY ); if( x == -1.0 ) return( -INFINITY ); mtherr( "atanh", DOMAIN ); return( NAN ); } if( z < 1.0e-7 ) return(x); if( z < 0.5 ) { z = x * x; s = x + x * z * (polevl(z, P, 4) / p1evl(z, Q, 5)); return(s); } return( 0.5 * log((1.0+x)/(1.0-x)) ); } #endif /* HAVE_ATANH */ grace-5.1.23/cephes/jn.c0000644000076500001440000000367706626627164014506 0ustar fnevgenyusers/* jn.c * * Bessel function of integer order * * * * SYNOPSIS: * * int n; * double x, y, jn(); * * y = jn( n, x ); * * * * DESCRIPTION: * * Returns Bessel function of order n, where n is a * (possibly negative) integer. * * The ratio of jn(x) to j0(x) is computed by backward * recurrence. First the ratio jn/jn-1 is found by a * continued fraction expansion. Then the recurrence * relating successive orders is applied until j0 or j1 is * reached. * * If n = 0 or 1 the routine for j0 or j1 is called * directly. * * * * ACCURACY: * * Absolute error: * arithmetic range # trials peak rms * DEC 0, 30 5500 6.9e-17 9.3e-18 * IEEE 0, 30 5000 4.4e-16 7.9e-17 * * * Not suitable for large n or x. Use jv() instead. * */ /* jn.c Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifndef HAVE_JN extern double MACHEP; double jn( n, x ) int n; double x; { double pkm2, pkm1, pk, xk, r, ans; int k, sign; if( n < 0 ) { n = -n; if( (n & 1) == 0 ) /* -1**n */ sign = 1; else sign = -1; } else sign = 1; if( x < 0.0 ) { if( n & 1 ) sign = -sign; x = -x; } if( n == 0 ) return( sign * j0(x) ); if( n == 1 ) return( sign * j1(x) ); if( n == 2 ) return( sign * (2.0 * j1(x) / x - j0(x)) ); if( x < MACHEP ) return( 0.0 ); /* continued fraction */ #ifdef DEC k = 56; #else k = 53; #endif pk = 2 * (n + k); ans = pk; xk = x * x; do { pk -= 2.0; ans = pk - (xk/ans); } while( --k > 0 ); ans = x/ans; /* backward recurrence */ pk = 1.0; pkm1 = 1.0/ans; k = n-1; r = 2 * k; do { pkm2 = (pkm1 * r - pk * x) / x; pk = pkm1; pkm1 = pkm2; r -= 2.0; } while( --k > 0 ); if( fabs(pk) > fabs(pkm1) ) ans = j1(x)/pk; else ans = j0(x)/pkm1; return( sign * ans ); } #endif grace-5.1.23/cephes/hyp2f1.c0000644000076500001440000001756706626627164015213 0ustar fnevgenyusers/* hyp2f1.c * * Gauss hypergeometric function F * 2 1 * * * SYNOPSIS: * * double a, b, c, x, y, hyp2f1(); * * y = hyp2f1( a, b, c, x ); * * * DESCRIPTION: * * * hyp2f1( a, b, c, x ) = F ( a, b; c; x ) * 2 1 * * inf. * - a(a+1)...(a+k) b(b+1)...(b+k) k+1 * = 1 + > ----------------------------- x . * - c(c+1)...(c+k) (k+1)! * k = 0 * * Cases addressed are * Tests and escapes for negative integer a, b, or c * Linear transformation if c - a or c - b negative integer * Special case c = a or c = b * Linear transformation for x near +1 * Transformation for x < -0.5 * Psi function expansion if x > 0.5 and c - a - b integer * Conditionally, a recurrence on c to make c-a-b > 0 * * |x| > 1 is rejected. * * The parameters a, b, c are considered to be integer * valued if they are within 1.0e-14 of the nearest integer * (1.0e-13 for IEEE arithmetic). * * ACCURACY: * * * Relative error (-1 < x < 1): * arithmetic domain # trials peak rms * IEEE -1,7 230000 1.2e-11 5.2e-14 * * Several special cases also tested with a, b, c in * the range -7 to 7. * * ERROR MESSAGES: * * A "partial loss of precision" message is printed if * the internally estimated relative error exceeds 1^-12. * A "singularity" message is printed on overflow or * in cases not addressed (such as x < -1). */ /* hyp2f1 */ /* Cephes Math Library Release 2.2: November, 1992 Copyright 1984, 1987, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef DEC #define EPS 1.0e-14 #define EPS2 1.0e-11 #endif #ifdef IBMPC #define EPS 1.0e-13 #define EPS2 1.0e-10 #endif #ifdef MIEEE #define EPS 1.0e-13 #define EPS2 1.0e-10 #endif #ifdef UNK #define EPS 1.0e-13 #define EPS2 1.0e-10 #endif #define ETHRESH 1.0e-12 static double hyt2f1(double, double, double, double, double *); static double hys2f1(double, double, double, double, double *); extern double MAXNUM, MACHEP; double hyp2f1( a, b, c, x ) double a, b, c, x; { double d, d1, d2, e; double p, q, r, s, y, ax; double ia, ib, ic, id, err; int flag, i, aid; err = 0.0; ax = fabs(x); s = 1.0 - x; flag = 0; ia = round(a); /* nearest integer to a */ ib = round(b); if( a <= 0 ) { if( fabs(a-ia) < EPS ) /* a is a negative integer */ flag |= 1; } if( b <= 0 ) { if( fabs(b-ib) < EPS ) /* b is a negative integer */ flag |= 2; } if( ax < 1.0 ) { if( fabs(b-c) < EPS ) /* b = c */ { y = pow( s, -a ); /* s to the -a power */ goto hypdon; } if( fabs(a-c) < EPS ) /* a = c */ { y = pow( s, -b ); /* s to the -b power */ goto hypdon; } } if( c <= 0.0 ) { ic = round(c); /* nearest integer to c */ if( fabs(c-ic) < EPS ) /* c is a negative integer */ { /* check if termination before explosion */ if( (flag & 1) && (ia > ic) ) goto hypok; if( (flag & 2) && (ib > ic) ) goto hypok; goto hypdiv; } } if( flag ) /* function is a polynomial */ goto hypok; if( ax > 1.0 ) /* series diverges */ goto hypdiv; p = c - a; ia = round(p); /* nearest integer to c-a */ if( (ia <= 0.0) && (fabs(p-ia) < EPS) ) /* negative int c - a */ flag |= 4; r = c - b; ib = round(r); /* nearest integer to c-b */ if( (ib <= 0.0) && (fabs(r-ib) < EPS) ) /* negative int c - b */ flag |= 8; d = c - a - b; id = round(d); /* nearest integer to d */ q = fabs(d-id); /* Thanks to Christian Burger * for reporting a bug here. */ if( fabs(ax-1.0) < EPS ) /* |x| == 1.0 */ { if( x > 0.0 ) { if( flag & 12 ) /* negative int c-a or c-b */ { if( d >= 0.0 ) goto hypf; else goto hypdiv; } if( d <= 0.0 ) goto hypdiv; y = true_gamma(c)*true_gamma(d)/(true_gamma(p)*true_gamma(r)); goto hypdon; } if( d <= -1.0 ) goto hypdiv; } /* Conditionally make d > 0 by recurrence on c * AMS55 #15.2.27 */ if( d < 0.0 ) { /* Try the power series first */ y = hyt2f1( a, b, c, x, &err ); if( err < ETHRESH ) goto hypdon; /* Apply the recurrence if power series fails */ err = 0.0; aid = 2 - id; e = c + aid; d2 = hyp2f1(a,b,e,x); d1 = hyp2f1(a,b,e+1.0,x); q = a + b + 1.0; for( i=0; i ETHRESH ) { mtherr( "hyp2f1", PLOSS ); /* printf( "Estimated err = %.2e\n", err ); */ } return(y); /* The transformation for c-a or c-b negative integer * AMS55 #15.3.3 */ hypf: y = pow( s, d ) * hys2f1( c-a, c-b, c, x, &err ); goto hypdon; /* The alarm exit */ hypdiv: mtherr( "hyp2f1", OVERFLOW ); return( MAXNUM ); } /* Apply transformations for |x| near 1 * then call the power series */ static double hyt2f1( a, b, c, x, loss ) double a, b, c, x; double *loss; { double p, q, r, s, t, y, d, err, err1; double ax, id, d1, d2, e, y1; int i, aid; err = 0.0; s = 1.0 - x; if( x < -0.5 ) { if( b > a ) y = pow( s, -a ) * hys2f1( a, c-b, c, -x/s, &err ); else y = pow( s, -b ) * hys2f1( c-a, b, c, -x/s, &err ); goto done; } d = c - a - b; id = round(d); /* nearest integer to d */ if( x > 0.9 ) { if( fabs(d-id) > EPS ) /* test for integer c-a-b */ { /* Try the power series first */ y = hys2f1( a, b, c, x, &err ); if( err < ETHRESH ) goto done; /* If power series fails, then apply AMS55 #15.3.6 */ q = hys2f1( a, b, 1.0-d, s, &err ); q *= true_gamma(d) /(true_gamma(c-a) * true_gamma(c-b)); r = pow(s,d) * hys2f1( c-a, c-b, d+1.0, s, &err1 ); r *= true_gamma(-d)/(true_gamma(a) * true_gamma(b)); y = q + r; q = fabs(q); /* estimate cancellation error */ r = fabs(r); if( q > r ) r = q; err += err1 + (MACHEP*r)/y; y *= true_gamma(c); goto done; } else { /* Psi function expansion, AMS55 #15.3.10, #15.3.11, #15.3.12 */ if( id >= 0.0 ) { e = d; d1 = d; d2 = 0.0; aid = id; } else { e = -d; d1 = 0.0; d2 = d; aid = -id; } ax = log(s); /* sum for t = 0 */ y = psi(1.0) + psi(1.0+e) - psi(a+d1) - psi(b+d1) - ax; y /= true_gamma(e+1.0); p = (a+d1) * (b+d1) * s / true_gamma(e+2.0); /* Poch for t=1 */ t = 1.0; do { r = psi(1.0+t) + psi(1.0+t+e) - psi(a+t+d1) - psi(b+t+d1) - ax; q = p * r; y += q; p *= s * (a+t+d1) / (t+1.0); p *= (b+t+d1) / (t+1.0+e); t += 1.0; } while( fabs(q/y) > EPS ); if( id == 0.0 ) { y *= true_gamma(c)/(true_gamma(a)*true_gamma(b)); goto psidon; } y1 = 1.0; if( aid == 1 ) goto nosum; t = 0.0; p = 1.0; for( i=1; i 0.0 ) y *= q; else y1 *= q; y += y1; psidon: goto done; } } /* Use defining power series if no special cases */ y = hys2f1( a, b, c, x, &err ); done: *loss = err; return(y); } /* Defining power series expansion of Gauss hypergeometric function */ static double hys2f1( a, b, c, x, loss ) double a, b, c, x; double *loss; /* estimates loss of significance */ { double f, g, h, k, m, s, u, umax; int i; i = 0; umax = 0.0; f = a; g = b; h = c; s = 1.0; u = 1.0; k = 0.0; do { if( fabs(h) < EPS ) { *loss = 1.0; return( MAXNUM ); } m = k + 1.0; u = u * ((f+k) * (g+k) * x / ((h+k) * m)); s += u; k = fabs(u); /* remember largest term summed */ if( k > umax ) umax = k; k = m; if( ++i > 10000 ) /* should never happen */ { *loss = 1.0; return(s); } } while( fabs(u/s) > MACHEP ); /* return estimated relative error */ *loss = (MACHEP*umax)/fabs(s) + (MACHEP*i); return(s); } grace-5.1.23/cephes/mconf.h0000644000076500001440000001117506626627164015176 0ustar fnevgenyusers/* mconf.h * * Common include file for math routines * * * * SYNOPSIS: * * #include "mconf.h" * * * * DESCRIPTION: * * This file contains definitions for error codes that are * passed to the common error handling routine mtherr() * (which see). * * The file also includes a conditional assembly definition * for the type of computer arithmetic (IEEE, DEC, Motorola * IEEE, or UNKnown). * * For Digital Equipment PDP-11 and VAX computers, certain * IBM systems, and others that use numbers with a 56-bit * significand, the symbol DEC should be defined. In this * mode, most floating point constants are given as arrays * of octal integers to eliminate decimal to binary conversion * errors that might be introduced by the compiler. * * For little-endian computers, such as IBM PC, that follow the * IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE * Std 754-1985), the symbol IBMPC should be defined. These * numbers have 53-bit significands. In this mode, constants * are provided as arrays of hexadecimal 16 bit integers. * * Big-endian IEEE format is denoted MIEEE. On some RISC * systems such as Sun SPARC, double precision constants * must be stored on 8-byte address boundaries. Since integer * arrays may be aligned differently, the MIEEE configuration * may fail on such machines. * * To accommodate other types of computer arithmetic, all * constants are also provided in a normal decimal radix * which one can hope are correctly converted to a suitable * format by the available C language compiler. To invoke * this mode, define the symbol UNK. * * An important difference among these modes is a predefined * set of machine arithmetic constants for each. The numbers * MACHEP (the machine roundoff error), MAXNUM (largest number * represented), and several other parameters are preset by * the configuration symbol. Check the file const.c to * ensure that these values are correct for your computer. * * Configurations NANS, INFINITIES, MINUSZERO, and DENORMAL * may fail on many systems. Verify that they are supposed * to work on your computer. */ /* Cephes Math Library Release 2.3: June, 1995 Copyright 1984, 1987, 1989, 1995 by Stephen L. Moshier Adjusted for use with ACE/gr by Evgeny Stambulchik, October 1997 */ #define __GRACE_SOURCE_ #include #include /* Type of computer arithmetic */ /* In ACE/gr, defined as a compiler directive - no need to define here */ /* PDP-11, Pro350, VAX: */ #if defined(HAVE_DEC_FPU) # define DEC 1 #endif /* Intel IEEE, low order words come first: */ #if defined(HAVE_LIEEE_FPU) # define IBMPC 1 #endif /* Motorola IEEE, high order words come first * (Sun 680x0 workstation): */ #if defined(HAVE_BIEEE_FPU) # define MIEEE 1 #endif /* UNKnown arithmetic, invokes coefficients given in * normal decimal format. Beware of range boundary * problems (MACHEP, MAXLOG, etc. in const.c) and * roundoff problems in pow.c: * (Sun SPARCstation) */ #if (!defined (DEC) && !defined (IBMPC) && !defined (MIEEE)) # define UNK 1 #endif /* Define this `volatile' if your compiler thinks * that floating point arithmetic obeys the associative * and distributive laws. It will defeat some optimizations * (but probably not enough of them). * * #define VOLATILE volatile */ #ifndef VOLATILE # define VOLATILE #endif #ifdef PI # undef PI #endif #ifdef NAN # undef NAN #endif #ifdef INFINITY # undef INFINITY #endif /* Constant definitions for math error conditions */ #if defined(DOMAIN) # undef DOMAIN #endif #define DOMAIN 1 /* argument domain error */ #if defined(SING) # undef SING #endif #define SING 2 /* argument singularity */ #if defined(OVERFLOW) # undef OVERFLOW #endif #define OVERFLOW 3 /* overflow range error */ #if defined(UNDERFLOW) # undef UNDERFLOW #endif #define UNDERFLOW 4 /* underflow range error */ #if defined(TLOSS) # undef TLOSS #endif #define TLOSS 5 /* total loss of precision */ #if defined(PLOSS) # undef PLOSS #endif #define PLOSS 6 /* partial loss of precision */ #if defined(EDOM) # undef EDOM #endif #define EDOM 33 #if defined(ERANGE) # undef ERANGE #endif #define ERANGE 34 #if !defined (UNK) /* Define to support tiny denormal numbers, else undefine. */ # define DENORMAL 1 /* Define to ask for infinity support, else undefine. */ # define INFINITIES 1 /* Define to ask for support of numbers that are Not-a-Number, else undefine. This may automatically define INFINITIES in some files. */ # define NANS 1 /* Define to distinguish between -0.0 and +0.0. */ # define MINUSZERO 1 #endif /* Define 1 for ANSI C atan2() function See atan.c and clog.c. */ #define ANSIC 1 grace-5.1.23/cephes/Make.common0000644000076500001440000000232206727573017016003 0ustar fnevgenyusers##################################################### # System-independent Make.common file for # # Cephes mathematical library # ##################################################### SRCS = airy.c beta.c chbevl.c chdtr.c const.c dawsn.c ellie.c ellik.c \ ellpe.c ellpk.c expn.c fac.c fdtr.c fresnl.c gamma.c gdtr.c hyp2f1.c \ hyperg.c i0.c i1.c igam.c igami.c incbet.c incbi.c iv.c j0.c j1.c \ jn.c jv.c k0.c k1.c kn.c log2.c mtherr.c ndtri.c pdtr.c polevl.c \ polyn.c psi.c revers.c rgamma.c round.c shichi.c sici.c \ spence.c stdtr.c struve.c unity.c yn.c zeta.c zetac.c \ acosh.c asinh.c atanh.c ndtr.c cbrt.c isnan.c OBJS = airy$(O) beta$(O) chbevl$(O) chdtr$(O) const$(O) dawsn$(O) ellie$(O) \ ellik$(O) ellpe$(O) ellpk$(O) expn$(O) fac$(O) fdtr$(O) fresnl$(O) \ gamma$(O) gdtr$(O) hyp2f1$(O) hyperg$(O) i0$(O) i1$(O) igam$(O) \ igami$(O) incbet$(O) incbi$(O) iv$(O) j0$(O) j1$(O) jn$(O) jv$(O) \ k0$(O) k1$(O) kn$(O) log2$(O) mtherr$(O) ndtri$(O) pdtr$(O) \ polevl$(O) polyn$(O) psi$(O) revers$(O) rgamma$(O) round$(O) \ shichi$(O) sici$(O) spence$(O) stdtr$(O) struve$(O) \ unity$(O) yn$(O) zeta$(O) zetac$(O) \ acosh$(O) asinh$(O) atanh$(O) ndtr$(O) cbrt$(O) isnan$(O) grace-5.1.23/cephes/pdtr.c0000644000076500001440000000456706626627164015047 0ustar fnevgenyusers/* pdtr.c * * Poisson distribution * * * * SYNOPSIS: * * int k; * double m, y, pdtr(); * * y = pdtr( k, m ); * * * * DESCRIPTION: * * Returns the sum of the first k terms of the Poisson * distribution: * * k j * -- -m m * > e -- * -- j! * j=0 * * The terms are not summed directly; instead the incomplete * gamma integral is employed, according to the relation * * y = pdtr( k, m ) = igamc( k+1, m ). * * The arguments must both be positive. * * * * ACCURACY: * * See igamc(). * */ /* pdtrc() * * Complemented poisson distribution * * * * SYNOPSIS: * * int k; * double m, y, pdtrc(); * * y = pdtrc( k, m ); * * * * DESCRIPTION: * * Returns the sum of the terms k+1 to infinity of the Poisson * distribution: * * inf. j * -- -m m * > e -- * -- j! * j=k+1 * * The terms are not summed directly; instead the incomplete * gamma integral is employed, according to the formula * * y = pdtrc( k, m ) = igam( k+1, m ). * * The arguments must both be positive. * * * * ACCURACY: * * See igam.c. * */ /* pdtri() * * Inverse Poisson distribution * * * * SYNOPSIS: * * int k; * double m, y, pdtr(); * * m = pdtri( k, y ); * * * * * DESCRIPTION: * * Finds the Poisson variable x such that the integral * from 0 to x of the Poisson density is equal to the * given probability y. * * This is accomplished using the inverse gamma integral * function and the relation * * m = igami( k+1, y ). * * * * * ACCURACY: * * See igami.c. * * ERROR MESSAGES: * * message condition value returned * pdtri domain y < 0 or y >= 1 0.0 * k < 0 * */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" double pdtrc( k, m ) int k; double m; { double v; if( (k < 0) || (m <= 0.0) ) { mtherr( "pdtrc", DOMAIN ); return( 0.0 ); } v = k+1; return( igam( v, m ) ); } double pdtr( k, m ) int k; double m; { double v; if( (k < 0) || (m <= 0.0) ) { mtherr( "pdtr", DOMAIN ); return( 0.0 ); } v = k+1; return( igamc( v, m ) ); } double pdtri( k, y ) int k; double y; { double v; if( (k < 0) || (y < 0.0) || (y >= 1.0) ) { mtherr( "pdtri", DOMAIN ); return( 0.0 ); } v = k+1; v = igami( v, y ); return( v ); } grace-5.1.23/cephes/i1.c0000644000076500001440000002157306626627164014403 0ustar fnevgenyusers/* i1.c * * Modified Bessel function of order one * * * * SYNOPSIS: * * double x, y, i1(); * * y = i1( x ); * * * * DESCRIPTION: * * Returns modified Bessel function of order one of the * argument. * * The function is defined as i1(x) = -i j1( ix ). * * The range is partitioned into the two intervals [0,8] and * (8, infinity). Chebyshev polynomial expansions are employed * in each interval. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0, 30 3400 1.2e-16 2.3e-17 * IEEE 0, 30 30000 1.9e-15 2.1e-16 * * */ /* i1e.c * * Modified Bessel function of order one, * exponentially scaled * * * * SYNOPSIS: * * double x, y, i1e(); * * y = i1e( x ); * * * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of order one of the argument. * * The function is defined as i1(x) = -i exp(-|x|) j1( ix ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0, 30 30000 2.0e-15 2.0e-16 * See i1(). * */ /* i1.c 2 */ /* Cephes Math Library Release 2.0: March, 1987 Copyright 1985, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Chebyshev coefficients for exp(-x) I1(x) / x * in the interval [0,8]. * * lim(x->0){ exp(-x) I1(x) / x } = 1/2. */ #ifdef UNK static double A[] = { 2.77791411276104639959E-18, -2.11142121435816608115E-17, 1.55363195773620046921E-16, -1.10559694773538630805E-15, 7.60068429473540693410E-15, -5.04218550472791168711E-14, 3.22379336594557470981E-13, -1.98397439776494371520E-12, 1.17361862988909016308E-11, -6.66348972350202774223E-11, 3.62559028155211703701E-10, -1.88724975172282928790E-9, 9.38153738649577178388E-9, -4.44505912879632808065E-8, 2.00329475355213526229E-7, -8.56872026469545474066E-7, 3.47025130813767847674E-6, -1.32731636560394358279E-5, 4.78156510755005422638E-5, -1.61760815825896745588E-4, 5.12285956168575772895E-4, -1.51357245063125314899E-3, 4.15642294431288815669E-3, -1.05640848946261981558E-2, 2.47264490306265168283E-2, -5.29459812080949914269E-2, 1.02643658689847095384E-1, -1.76416518357834055153E-1, 2.52587186443633654823E-1 }; #endif #ifdef DEC static unsigned short A[] = { 0021514,0174520,0060742,0000241, 0122302,0137206,0016120,0025663, 0023063,0017437,0026235,0176536, 0123637,0052523,0170150,0125632, 0024410,0165770,0030251,0044134, 0125143,0012160,0162170,0054727, 0025665,0075702,0035716,0145247, 0126413,0116032,0176670,0015462, 0027116,0073425,0110351,0105242, 0127622,0104034,0137530,0037364, 0030307,0050645,0120776,0175535, 0131001,0130331,0043523,0037455, 0031441,0026160,0010712,0100174, 0132076,0164761,0022706,0017500, 0032527,0015045,0115076,0104076, 0133146,0001714,0015434,0144520, 0033550,0161166,0124215,0077050, 0134136,0127715,0143365,0157170, 0034510,0106652,0013070,0064130, 0135051,0117126,0117264,0123761, 0035406,0045355,0133066,0175751, 0135706,0061420,0054746,0122440, 0036210,0031232,0047235,0006640, 0136455,0012373,0144235,0011523, 0036712,0107437,0036731,0015111, 0137130,0156742,0115744,0172743, 0037322,0033326,0124667,0124740, 0137464,0123210,0021510,0144556, 0037601,0051433,0111123,0177721 }; #endif #ifdef IBMPC static unsigned short A[] = { 0x4014,0x0c3c,0x9f2a,0x3c49, 0x0576,0xc38a,0x57d0,0xbc78, 0xbfac,0xe593,0x63e3,0x3ca6, 0x1573,0x7e0d,0xeaaa,0xbcd3, 0x290c,0x0615,0x1d7f,0x3d01, 0x0b3b,0x1c8f,0x628e,0xbd2c, 0xd955,0x4779,0xaf78,0x3d56, 0x0366,0x5fb7,0x7383,0xbd81, 0x3154,0xb21d,0xcee2,0x3da9, 0x07de,0x97eb,0x5103,0xbdd2, 0xdf6c,0xb43f,0xea34,0x3df8, 0x67e6,0x28ea,0x361b,0xbe20, 0x5010,0x0239,0x258e,0x3e44, 0xc3e8,0x24b8,0xdd3e,0xbe67, 0xd108,0xb347,0xe344,0x3e8a, 0x992a,0x8363,0xc079,0xbeac, 0xafc5,0xd511,0x1c4e,0x3ecd, 0xbbcf,0xb8de,0xd5f9,0xbeeb, 0x0d0b,0x42c7,0x11b5,0x3f09, 0x94fe,0xd3d6,0x33ca,0xbf25, 0xdf7d,0xb6c6,0xc95d,0x3f40, 0xd4a4,0x0b3c,0xcc62,0xbf58, 0xa1b4,0x49d3,0x0653,0x3f71, 0xa26a,0x7913,0xa29f,0xbf85, 0x2349,0xe7bb,0x51e3,0x3f99, 0x9ebc,0x537c,0x1bbc,0xbfab, 0xf53c,0xd536,0x46da,0x3fba, 0x192e,0x0469,0x94d1,0xbfc6, 0x7ffa,0x724a,0x2a63,0x3fd0 }; #endif #ifdef MIEEE static unsigned short A[] = { 0x3c49,0x9f2a,0x0c3c,0x4014, 0xbc78,0x57d0,0xc38a,0x0576, 0x3ca6,0x63e3,0xe593,0xbfac, 0xbcd3,0xeaaa,0x7e0d,0x1573, 0x3d01,0x1d7f,0x0615,0x290c, 0xbd2c,0x628e,0x1c8f,0x0b3b, 0x3d56,0xaf78,0x4779,0xd955, 0xbd81,0x7383,0x5fb7,0x0366, 0x3da9,0xcee2,0xb21d,0x3154, 0xbdd2,0x5103,0x97eb,0x07de, 0x3df8,0xea34,0xb43f,0xdf6c, 0xbe20,0x361b,0x28ea,0x67e6, 0x3e44,0x258e,0x0239,0x5010, 0xbe67,0xdd3e,0x24b8,0xc3e8, 0x3e8a,0xe344,0xb347,0xd108, 0xbeac,0xc079,0x8363,0x992a, 0x3ecd,0x1c4e,0xd511,0xafc5, 0xbeeb,0xd5f9,0xb8de,0xbbcf, 0x3f09,0x11b5,0x42c7,0x0d0b, 0xbf25,0x33ca,0xd3d6,0x94fe, 0x3f40,0xc95d,0xb6c6,0xdf7d, 0xbf58,0xcc62,0x0b3c,0xd4a4, 0x3f71,0x0653,0x49d3,0xa1b4, 0xbf85,0xa29f,0x7913,0xa26a, 0x3f99,0x51e3,0xe7bb,0x2349, 0xbfab,0x1bbc,0x537c,0x9ebc, 0x3fba,0x46da,0xd536,0xf53c, 0xbfc6,0x94d1,0x0469,0x192e, 0x3fd0,0x2a63,0x724a,0x7ffa }; #endif /* i1.c */ /* Chebyshev coefficients for exp(-x) sqrt(x) I1(x) * in the inverted interval [8,infinity]. * * lim(x->inf){ exp(-x) sqrt(x) I1(x) } = 1/sqrt(2pi). */ #ifdef UNK static double B[] = { 7.51729631084210481353E-18, 4.41434832307170791151E-18, -4.65030536848935832153E-17, -3.20952592199342395980E-17, 2.96262899764595013876E-16, 3.30820231092092828324E-16, -1.88035477551078244854E-15, -3.81440307243700780478E-15, 1.04202769841288027642E-14, 4.27244001671195135429E-14, -2.10154184277266431302E-14, -4.08355111109219731823E-13, -7.19855177624590851209E-13, 2.03562854414708950722E-12, 1.41258074366137813316E-11, 3.25260358301548823856E-11, -1.89749581235054123450E-11, -5.58974346219658380687E-10, -3.83538038596423702205E-9, -2.63146884688951950684E-8, -2.51223623787020892529E-7, -3.88256480887769039346E-6, -1.10588938762623716291E-4, -9.76109749136146840777E-3, 7.78576235018280120474E-1 }; #endif #ifdef DEC static unsigned short B[] = { 0022012,0125555,0115227,0043456, 0021642,0156127,0052075,0145203, 0122526,0072435,0111231,0011664, 0122424,0001544,0161671,0114403, 0023252,0144257,0163532,0142121, 0023276,0132162,0174045,0013204, 0124007,0077154,0057046,0110517, 0124211,0066650,0116127,0157073, 0024473,0133413,0130551,0107504, 0025100,0064741,0032631,0040364, 0124675,0045101,0071551,0012400, 0125745,0161054,0071637,0011247, 0126112,0117410,0035525,0122231, 0026417,0037237,0131034,0176427, 0027170,0100373,0024742,0025725, 0027417,0006417,0105303,0141446, 0127246,0163716,0121202,0060137, 0130431,0123122,0120436,0166000, 0131203,0144134,0153251,0124500, 0131742,0005234,0122732,0033006, 0132606,0157751,0072362,0121031, 0133602,0043372,0047120,0015626, 0134747,0165774,0001125,0046462, 0136437,0166402,0117746,0155137, 0040107,0050305,0125330,0124241 }; #endif #ifdef IBMPC static unsigned short B[] = { 0xe8e6,0xb352,0x556d,0x3c61, 0xb950,0xea87,0x5b8a,0x3c54, 0x2277,0xb253,0xcea3,0xbc8a, 0x3320,0x9c77,0x806c,0xbc82, 0x588a,0xfceb,0x5915,0x3cb5, 0xa2d1,0x5f04,0xd68e,0x3cb7, 0xd22a,0x8bc4,0xefcd,0xbce0, 0xfbc7,0x138a,0x2db5,0xbcf1, 0x31e8,0x762d,0x76e1,0x3d07, 0x281e,0x26b3,0x0d3c,0x3d28, 0x22a0,0x2e6d,0xa948,0xbd17, 0xe255,0x8e73,0xbc45,0xbd5c, 0xb493,0x076a,0x53e1,0xbd69, 0x9fa3,0xf643,0xe7d3,0x3d81, 0x457b,0x653c,0x101f,0x3daf, 0x7865,0xf158,0xe1a1,0x3dc1, 0x4c0c,0xd450,0xdcf9,0xbdb4, 0xdd80,0x5423,0x34ca,0xbe03, 0x3528,0x9ad5,0x790b,0xbe30, 0x46c1,0x94bb,0x4153,0xbe5c, 0x5443,0x2e9e,0xdbfd,0xbe90, 0x0373,0x49ca,0x48df,0xbed0, 0xa9a6,0x804a,0xfd7f,0xbf1c, 0xdb4c,0x53fc,0xfda0,0xbf83, 0x1514,0xb55b,0xea18,0x3fe8 }; #endif #ifdef MIEEE static unsigned short B[] = { 0x3c61,0x556d,0xb352,0xe8e6, 0x3c54,0x5b8a,0xea87,0xb950, 0xbc8a,0xcea3,0xb253,0x2277, 0xbc82,0x806c,0x9c77,0x3320, 0x3cb5,0x5915,0xfceb,0x588a, 0x3cb7,0xd68e,0x5f04,0xa2d1, 0xbce0,0xefcd,0x8bc4,0xd22a, 0xbcf1,0x2db5,0x138a,0xfbc7, 0x3d07,0x76e1,0x762d,0x31e8, 0x3d28,0x0d3c,0x26b3,0x281e, 0xbd17,0xa948,0x2e6d,0x22a0, 0xbd5c,0xbc45,0x8e73,0xe255, 0xbd69,0x53e1,0x076a,0xb493, 0x3d81,0xe7d3,0xf643,0x9fa3, 0x3daf,0x101f,0x653c,0x457b, 0x3dc1,0xe1a1,0xf158,0x7865, 0xbdb4,0xdcf9,0xd450,0x4c0c, 0xbe03,0x34ca,0x5423,0xdd80, 0xbe30,0x790b,0x9ad5,0x3528, 0xbe5c,0x4153,0x94bb,0x46c1, 0xbe90,0xdbfd,0x2e9e,0x5443, 0xbed0,0x48df,0x49ca,0x0373, 0xbf1c,0xfd7f,0x804a,0xa9a6, 0xbf83,0xfda0,0x53fc,0xdb4c, 0x3fe8,0xea18,0xb55b,0x1514 }; #endif /* i1.c */ double i1(x) double x; { double y, z; z = fabs(x); if( z <= 8.0 ) { y = (z/2.0) - 2.0; z = chbevl( y, A, 29 ) * z * exp(z); } else { z = exp(z) * chbevl( 32.0/z - 2.0, B, 25 ) / sqrt(z); } if( x < 0.0 ) z = -z; return( z ); } /* i1e() */ double i1e( x ) double x; { double y, z; z = fabs(x); if( z <= 8.0 ) { y = (z/2.0) - 2.0; z = chbevl( y, A, 29 ) * z; } else { z = chbevl( 32.0/z - 2.0, B, 25 ) / sqrt(z); } if( x < 0.0 ) z = -z; return( z ); } grace-5.1.23/cephes/dawsn.c0000644000076500001440000002167706626627163015212 0ustar fnevgenyusers/* dawsn.c * * Dawson's Integral * * * * SYNOPSIS: * * double x, y, dawsn(); * * y = dawsn( x ); * * * * DESCRIPTION: * * Approximates the integral * * x * - * 2 | | 2 * dawsn(x) = exp( -x ) | exp( t ) dt * | | * - * 0 * * Three different rational approximations are employed, for * the intervals 0 to 3.25; 3.25 to 6.25; and 6.25 up. * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,10 10000 6.9e-16 1.0e-16 * DEC 0,10 6000 7.4e-17 1.4e-17 * * */ /* dawsn.c */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Dawson's integral, interval 0 to 3.25 */ #ifdef UNK static double AN[10] = { 1.13681498971755972054E-11, 8.49262267667473811108E-10, 1.94434204175553054283E-8, 9.53151741254484363489E-7, 3.07828309874913200438E-6, 3.52513368520288738649E-4, -8.50149846724410912031E-4, 4.22618223005546594270E-2, -9.17480371773452345351E-2, 9.99999999999999994612E-1, }; static double AD[11] = { 2.40372073066762605484E-11, 1.48864681368493396752E-9, 5.21265281010541664570E-8, 1.27258478273186970203E-6, 2.32490249820789513991E-5, 3.25524741826057911661E-4, 3.48805814657162590916E-3, 2.79448531198828973716E-2, 1.58874241960120565368E-1, 5.74918629489320327824E-1, 1.00000000000000000539E0, }; #endif #ifdef DEC static unsigned short AN[40] = { 0027107,0176630,0075752,0107612, 0030551,0070604,0166707,0127727, 0031647,0002210,0117120,0056376, 0033177,0156026,0141275,0140627, 0033516,0112200,0037035,0165515, 0035270,0150613,0016423,0105634, 0135536,0156227,0023515,0044413, 0037055,0015273,0105147,0064025, 0137273,0163145,0014460,0166465, 0040200,0000000,0000000,0000000, }; static unsigned short AD[44] = { 0027323,0067372,0115566,0131320, 0030714,0114432,0074206,0006637, 0032137,0160671,0044203,0026344, 0033252,0146656,0020247,0100231, 0034303,0003346,0123260,0022433, 0035252,0125460,0173041,0155415, 0036144,0113747,0125203,0124617, 0036744,0166232,0143671,0133670, 0037442,0127755,0162625,0000100, 0040023,0026736,0003604,0106265, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short AN[40] = { 0x51f1,0x0f7d,0xffb3,0x3da8, 0xf5fb,0x9db8,0x2e30,0x3e0d, 0x0ba0,0x13ca,0xe091,0x3e54, 0xb833,0xd857,0xfb82,0x3eaf, 0xbd6a,0x07c3,0xd290,0x3ec9, 0x7174,0x63a2,0x1a31,0x3f37, 0xa921,0xe4e9,0xdb92,0xbf4b, 0xed03,0x714c,0xa357,0x3fa5, 0x1da7,0xa326,0x7ccc,0xbfb7, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short AD[44] = { 0xd65a,0x536e,0x6ddf,0x3dba, 0xc1b4,0x4f10,0x9323,0x3e19, 0x659c,0x2910,0xfc37,0x3e6b, 0xf013,0xc414,0x59b5,0x3eb5, 0x04a3,0xd4d6,0x60dc,0x3ef8, 0x3b62,0x1ec4,0x5566,0x3f35, 0x7532,0xf550,0x92fc,0x3f6c, 0x36f7,0x58f7,0x9d93,0x3f9c, 0xa008,0xbcb2,0x55fd,0x3fc4, 0x9197,0xc0f0,0x65bb,0x3fe2, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short AN[40] = { 0x3da8,0xffb3,0x0f7d,0x51f1, 0x3e0d,0x2e30,0x9db8,0xf5fb, 0x3e54,0xe091,0x13ca,0x0ba0, 0x3eaf,0xfb82,0xd857,0xb833, 0x3ec9,0xd290,0x07c3,0xbd6a, 0x3f37,0x1a31,0x63a2,0x7174, 0xbf4b,0xdb92,0xe4e9,0xa921, 0x3fa5,0xa357,0x714c,0xed03, 0xbfb7,0x7ccc,0xa326,0x1da7, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short AD[44] = { 0x3dba,0x6ddf,0x536e,0xd65a, 0x3e19,0x9323,0x4f10,0xc1b4, 0x3e6b,0xfc37,0x2910,0x659c, 0x3eb5,0x59b5,0xc414,0xf013, 0x3ef8,0x60dc,0xd4d6,0x04a3, 0x3f35,0x5566,0x1ec4,0x3b62, 0x3f6c,0x92fc,0xf550,0x7532, 0x3f9c,0x9d93,0x58f7,0x36f7, 0x3fc4,0x55fd,0xbcb2,0xa008, 0x3fe2,0x65bb,0xc0f0,0x9197, 0x3ff0,0x0000,0x0000,0x0000, }; #endif /* interval 3.25 to 6.25 */ #ifdef UNK static double BN[11] = { 5.08955156417900903354E-1, -2.44754418142697847934E-1, 9.41512335303534411857E-2, -2.18711255142039025206E-2, 3.66207612329569181322E-3, -4.23209114460388756528E-4, 3.59641304793896631888E-5, -2.14640351719968974225E-6, 9.10010780076391431042E-8, -2.40274520828250956942E-9, 3.59233385440928410398E-11, }; static double BD[10] = { /* 1.00000000000000000000E0,*/ -6.31839869873368190192E-1, 2.36706788228248691528E-1, -5.31806367003223277662E-2, 8.48041718586295374409E-3, -9.47996768486665330168E-4, 7.81025592944552338085E-5, -4.55875153252442634831E-6, 1.89100358111421846170E-7, -4.91324691331920606875E-9, 7.18466403235734541950E-11, }; #endif #ifdef DEC static unsigned short BN[44] = { 0040002,0045342,0113762,0004360, 0137572,0120346,0172745,0144046, 0037300,0151134,0123440,0117047, 0136663,0025423,0014755,0046026, 0036157,0177561,0027535,0046744, 0135335,0161052,0071243,0146535, 0034426,0154060,0164506,0135625, 0133420,0005356,0100017,0151334, 0032303,0066137,0024013,0046212, 0131045,0016612,0066270,0047574, 0027435,0177025,0060625,0116363, }; static unsigned short BD[40] = { /*0040200,0000000,0000000,0000000,*/ 0140041,0140101,0174552,0037073, 0037562,0061503,0124271,0160756, 0137131,0151760,0073210,0110534, 0036412,0170562,0117017,0155377, 0135570,0101374,0074056,0037276, 0034643,0145376,0001516,0060636, 0133630,0173540,0121344,0155231, 0032513,0005602,0134516,0007144, 0131250,0150540,0075747,0105341, 0027635,0177020,0012465,0125402, }; #endif #ifdef IBMPC static unsigned short BN[44] = { 0x411e,0x52fe,0x495c,0x3fe0, 0xb905,0xdebc,0x541c,0xbfcf, 0x13c5,0x94e4,0x1a4b,0x3fb8, 0xa983,0x633d,0x6562,0xbf96, 0xa9bd,0x25eb,0xffee,0x3f6d, 0x79ac,0x4e54,0xbc45,0xbf3b, 0xd773,0x1d28,0xdb06,0x3f02, 0xfa5b,0xd001,0x015d,0xbec2, 0x6991,0xe501,0x6d8b,0x3e78, 0x09f0,0x4d97,0xa3b1,0xbe24, 0xb39e,0xac32,0xbfc2,0x3dc3, }; static unsigned short BD[40] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x47c7,0x3f2d,0x3808,0xbfe4, 0x3c3e,0x7517,0x4c68,0x3fce, 0x122b,0x0ed1,0x3a7e,0xbfab, 0xfb60,0x53c1,0x5e2e,0x3f81, 0xc7d8,0x8f05,0x105f,0xbf4f, 0xcc34,0xc069,0x795f,0x3f14, 0x9b53,0x145c,0x1eec,0xbed3, 0xc1cd,0x5729,0x6170,0x3e89, 0xf15c,0x0f7c,0x1a2c,0xbe35, 0xb560,0x02a6,0xbfc2,0x3dd3, }; #endif #ifdef MIEEE static unsigned short BN[44] = { 0x3fe0,0x495c,0x52fe,0x411e, 0xbfcf,0x541c,0xdebc,0xb905, 0x3fb8,0x1a4b,0x94e4,0x13c5, 0xbf96,0x6562,0x633d,0xa983, 0x3f6d,0xffee,0x25eb,0xa9bd, 0xbf3b,0xbc45,0x4e54,0x79ac, 0x3f02,0xdb06,0x1d28,0xd773, 0xbec2,0x015d,0xd001,0xfa5b, 0x3e78,0x6d8b,0xe501,0x6991, 0xbe24,0xa3b1,0x4d97,0x09f0, 0x3dc3,0xbfc2,0xac32,0xb39e, }; static unsigned short BD[40] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xbfe4,0x3808,0x3f2d,0x47c7, 0x3fce,0x4c68,0x7517,0x3c3e, 0xbfab,0x3a7e,0x0ed1,0x122b, 0x3f81,0x5e2e,0x53c1,0xfb60, 0xbf4f,0x105f,0x8f05,0xc7d8, 0x3f14,0x795f,0xc069,0xcc34, 0xbed3,0x1eec,0x145c,0x9b53, 0x3e89,0x6170,0x5729,0xc1cd, 0xbe35,0x1a2c,0x0f7c,0xf15c, 0x3dd3,0xbfc2,0x02a6,0xb560, }; #endif /* 6.25 to infinity */ #ifdef UNK static double CN[5] = { -5.90592860534773254987E-1, 6.29235242724368800674E-1, -1.72858975380388136411E-1, 1.64837047825189632310E-2, -4.86827613020462700845E-4, }; static double CD[5] = { /* 1.00000000000000000000E0,*/ -2.69820057197544900361E0, 1.73270799045947845857E0, -3.93708582281939493482E-1, 3.44278924041233391079E-2, -9.73655226040941223894E-4, }; #endif #ifdef DEC static unsigned short CN[20] = { 0140027,0030427,0176477,0074402, 0040041,0012617,0112375,0162657, 0137461,0000761,0074120,0135160, 0036607,0004325,0117246,0115525, 0135377,0036345,0064750,0047732, }; static unsigned short CD[20] = { /*0040200,0000000,0000000,0000000,*/ 0140454,0127521,0071653,0133415, 0040335,0144540,0016105,0045241, 0137711,0112053,0155034,0062237, 0037015,0002102,0177442,0074546, 0135577,0036345,0064750,0052152, }; #endif #ifdef IBMPC static unsigned short CN[20] = { 0xef20,0xffa7,0xe622,0xbfe2, 0xbcb6,0xf29f,0x22b1,0x3fe4, 0x174e,0x2f0a,0x203e,0xbfc6, 0xd36b,0xb3d4,0xe11a,0x3f90, 0x09fb,0xad3d,0xe79c,0xbf3f, }; static unsigned short CD[20] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x76e2,0x2e75,0x95ea,0xc005, 0xa954,0x0388,0xb92c,0x3ffb, 0x8c94,0x7b43,0x3285,0xbfd9, 0x4f2d,0x5fe4,0xa088,0x3fa1, 0x0a8d,0xad3d,0xe79c,0xbf4f, }; #endif #ifdef MIEEE static unsigned short CN[20] = { 0xbfe2,0xe622,0xffa7,0xef20, 0x3fe4,0x22b1,0xf29f,0xbcb6, 0xbfc6,0x203e,0x2f0a,0x174e, 0x3f90,0xe11a,0xb3d4,0xd36b, 0xbf3f,0xe79c,0xad3d,0x09fb, }; static unsigned short CD[20] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xc005,0x95ea,0x2e75,0x76e2, 0x3ffb,0xb92c,0x0388,0xa954, 0xbfd9,0x3285,0x7b43,0x8c94, 0x3fa1,0xa088,0x5fe4,0x4f2d, 0xbf4f,0xe79c,0xad3d,0x0a8d, }; #endif extern double PI, MACHEP; double dawsn( xx ) double xx; { double x, y; int sign; sign = 1; if( xx < 0.0 ) { sign = -1; xx = -xx; } if( xx < 3.25 ) { x = xx*xx; y = xx * polevl( x, AN, 9 )/polevl( x, AD, 10 ); return( sign * y ); } x = 1.0/(xx*xx); if( xx < 6.25 ) { y = 1.0/xx + x * polevl( x, BN, 10) / (p1evl( x, BD, 10) * xx); return( sign * 0.5 * y ); } if( xx > 1.0e9 ) return( (sign * 0.5)/xx ); /* 6.25 to infinity */ y = 1.0/xx + x * polevl( x, CN, 4) / (p1evl( x, CD, 5) * xx); return( sign * 0.5 * y ); } grace-5.1.23/cephes/igam.c0000644000076500001440000000720006626627164014776 0ustar fnevgenyusers/* igam.c * * Incomplete gamma integral * * * * SYNOPSIS: * * double a, x, y, igam(); * * y = igam( a, x ); * * DESCRIPTION: * * The function is defined by * * x * - * 1 | | -t a-1 * igam(a,x) = ----- | e t dt. * - | | * | (a) - * 0 * * * In this implementation both arguments must be positive. * The integral is evaluated by either a power series or * continued fraction expansion, depending on the relative * values of a and x. * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,30 200000 3.6e-14 2.9e-15 * IEEE 0,100 300000 9.9e-14 1.5e-14 */ /* igamc() * * Complemented incomplete gamma integral * * * * SYNOPSIS: * * double a, x, y, igamc(); * * y = igamc( a, x ); * * DESCRIPTION: * * The function is defined by * * * igamc(a,x) = 1 - igam(a,x) * * inf. * - * 1 | | -t a-1 * = ----- | e t dt. * - | | * | (a) - * x * * * In this implementation both arguments must be positive. * The integral is evaluated by either a power series or * continued fraction expansion, depending on the relative * values of a and x. * * ACCURACY: * * Tested at random a, x. * a x Relative error: * arithmetic domain domain # trials peak rms * IEEE 0.5,100 0,100 200000 1.9e-14 1.7e-15 * IEEE 0.01,0.5 0,100 200000 1.4e-13 1.6e-15 */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1985, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double MACHEP, MAXLOG; static double big = 4.503599627370496e15; static double biginv = 2.22044604925031308085e-16; double igamc( a, x ) double a, x; { double ans, ax, c, yc, r, t, y, z; double pk, pkm1, pkm2, qk, qkm1, qkm2; if( (x <= 0) || ( a <= 0) ) return( 1.0 ); if( (x < 1.0) || (x < a) ) return( 1.0 - igam(a,x) ); ax = a * log(x) - x - lgam(a); if( ax < -MAXLOG ) { mtherr( "igamc", UNDERFLOW ); return( 0.0 ); } ax = exp(ax); /* continued fraction */ y = 1.0 - a; z = x + y + 1.0; c = 0.0; pkm2 = 1.0; qkm2 = x; pkm1 = x + 1.0; qkm1 = z * x; ans = pkm1/qkm1; do { c += 1.0; y += 1.0; z += 2.0; yc = y * c; pk = pkm1 * z - pkm2 * yc; qk = qkm1 * z - qkm2 * yc; if( qk != 0 ) { r = pk/qk; t = fabs( (ans - r)/r ); ans = r; } else t = 1.0; pkm2 = pkm1; pkm1 = pk; qkm2 = qkm1; qkm1 = qk; if( fabs(pk) > big ) { pkm2 *= biginv; pkm1 *= biginv; qkm2 *= biginv; qkm1 *= biginv; } } while( t > MACHEP ); return( ans * ax ); } /* left tail of incomplete gamma function: * * inf. k * a -x - x * x e > ---------- * - - * k=0 | (a+k+1) * */ double igam( a, x ) double a, x; { double ans, ax, c, r; if( (x <= 0) || ( a <= 0) ) return( 0.0 ); if( (x > 1.0) && (x > a ) ) return( 1.0 - igamc(a,x) ); /* Compute x**a * exp(-x) / gamma(a) */ ax = a * log(x) - x - lgam(a); if( ax < -MAXLOG ) { mtherr( "igam", UNDERFLOW ); return( 0.0 ); } ax = exp(ax); /* power series */ r = a; c = 1.0; ans = 1.0; do { r += 1.0; c *= x/r; ans += c; } while( c/ans > MACHEP ); return( ans * ax/a ); } grace-5.1.23/cephes/zetac.c0000644000076500001440000003263706626627164015203 0ustar fnevgenyusers /* zetac.c * * Riemann zeta function * * * * SYNOPSIS: * * double x, y, zetac(); * * y = zetac( x ); * * * * DESCRIPTION: * * * * inf. * - -x * zetac(x) = > k , x > 1, * - * k=2 * * is related to the Riemann zeta function by * * Riemann zeta(x) = zetac(x) + 1. * * Extension of the function definition for x < 1 is implemented. * Zero is returned for x > log2(MAXNUM). * * An overflow error may occur for large negative x, due to the * gamma function in the reflection formula. * * ACCURACY: * * Tabulated values have full machine accuracy. * * Relative error: * arithmetic domain # trials peak rms * IEEE 1,50 10000 9.8e-16 1.3e-16 * DEC 1,50 2000 1.1e-16 1.9e-17 * * */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" extern double MAXNUM, PI; /* Riemann zeta(x) - 1 * for integer arguments between 0 and 30. */ #ifdef UNK static double azetac[] = { -1.50000000000000000000E0, 1.70141183460469231730E38, /* infinity. */ 6.44934066848226436472E-1, 2.02056903159594285400E-1, 8.23232337111381915160E-2, 3.69277551433699263314E-2, 1.73430619844491397145E-2, 8.34927738192282683980E-3, 4.07735619794433937869E-3, 2.00839282608221441785E-3, 9.94575127818085337146E-4, 4.94188604119464558702E-4, 2.46086553308048298638E-4, 1.22713347578489146752E-4, 6.12481350587048292585E-5, 3.05882363070204935517E-5, 1.52822594086518717326E-5, 7.63719763789976227360E-6, 3.81729326499983985646E-6, 1.90821271655393892566E-6, 9.53962033872796113152E-7, 4.76932986787806463117E-7, 2.38450502727732990004E-7, 1.19219925965311073068E-7, 5.96081890512594796124E-8, 2.98035035146522801861E-8, 1.49015548283650412347E-8, 7.45071178983542949198E-9, 3.72533402478845705482E-9, 1.86265972351304900640E-9, 9.31327432419668182872E-10 }; #endif #ifdef DEC static unsigned short azetac[] = { 0140300,0000000,0000000,0000000, 0077777,0177777,0177777,0177777, 0040045,0015146,0022460,0076462, 0037516,0164001,0036001,0104116, 0037250,0114425,0061754,0022033, 0037027,0040616,0145174,0146670, 0036616,0011411,0100444,0104437, 0036410,0145550,0051474,0161067, 0036205,0115527,0141434,0133506, 0036003,0117475,0100553,0053403, 0035602,0056147,0045567,0027703, 0035401,0106157,0111054,0145242, 0035201,0002455,0113151,0101015, 0035000,0126235,0004273,0157260, 0034600,0071127,0112647,0005261, 0034400,0045736,0057610,0157550, 0034200,0031146,0172621,0074172, 0034000,0020603,0115503,0032007, 0033600,0013114,0124672,0023135, 0033400,0007330,0043715,0151117, 0033200,0004742,0145043,0033514, 0033000,0003225,0152624,0004411, 0032600,0002143,0033166,0035746, 0032400,0001354,0074234,0026143, 0032200,0000762,0147776,0170220, 0032000,0000514,0072452,0130631, 0031600,0000335,0114266,0063315, 0031400,0000223,0132710,0041045, 0031200,0000142,0073202,0153426, 0031000,0000101,0121400,0152065, 0030600,0000053,0140525,0072761 }; #endif #ifdef IBMPC static unsigned short azetac[] = { 0x0000,0x0000,0x0000,0xbff8, 0xffff,0xffff,0xffff,0x7fef, 0x0fa6,0xc4a6,0xa34c,0x3fe4, 0x310a,0x2780,0xdd00,0x3fc9, 0x8483,0xac7d,0x1322,0x3fb5, 0x99b7,0xd94f,0xe831,0x3fa2, 0x9124,0x3024,0xc261,0x3f91, 0x9c47,0x0a67,0x196d,0x3f81, 0x96e9,0xf863,0xb36a,0x3f70, 0x6ae0,0xb02d,0x73e7,0x3f60, 0xe5f8,0xe96e,0x4b8c,0x3f50, 0x9954,0xf245,0x318d,0x3f40, 0x3042,0xb2cd,0x20a5,0x3f30, 0x7bd6,0xa117,0x1593,0x3f20, 0xe156,0xf2b4,0x0e4a,0x3f10, 0x1bed,0xcbf1,0x097b,0x3f00, 0x2f0f,0xdeb2,0x064c,0x3ef0, 0x6681,0x7368,0x0430,0x3ee0, 0x44cc,0x9537,0x02c9,0x3ed0, 0xba4a,0x08f9,0x01db,0x3ec0, 0x66ea,0x5944,0x013c,0x3eb0, 0x8121,0xbab2,0x00d2,0x3ea0, 0xc77d,0x66ce,0x008c,0x3e90, 0x858c,0x8f13,0x005d,0x3e80, 0xde12,0x59ff,0x003e,0x3e70, 0x5633,0x8ea5,0x0029,0x3e60, 0xccda,0xb316,0x001b,0x3e50, 0x0845,0x76b9,0x0012,0x3e40, 0x5ae3,0x4ed0,0x000c,0x3e30, 0x1a87,0x3460,0x0008,0x3e20, 0xaebe,0x782a,0x0005,0x3e10 }; #endif #ifdef MIEEE static unsigned short azetac[] = { 0xbff8,0x0000,0x0000,0x0000, 0x7fef,0xffff,0xffff,0xffff, 0x3fe4,0xa34c,0xc4a6,0x0fa6, 0x3fc9,0xdd00,0x2780,0x310a, 0x3fb5,0x1322,0xac7d,0x8483, 0x3fa2,0xe831,0xd94f,0x99b7, 0x3f91,0xc261,0x3024,0x9124, 0x3f81,0x196d,0x0a67,0x9c47, 0x3f70,0xb36a,0xf863,0x96e9, 0x3f60,0x73e7,0xb02d,0x6ae0, 0x3f50,0x4b8c,0xe96e,0xe5f8, 0x3f40,0x318d,0xf245,0x9954, 0x3f30,0x20a5,0xb2cd,0x3042, 0x3f20,0x1593,0xa117,0x7bd6, 0x3f10,0x0e4a,0xf2b4,0xe156, 0x3f00,0x097b,0xcbf1,0x1bed, 0x3ef0,0x064c,0xdeb2,0x2f0f, 0x3ee0,0x0430,0x7368,0x6681, 0x3ed0,0x02c9,0x9537,0x44cc, 0x3ec0,0x01db,0x08f9,0xba4a, 0x3eb0,0x013c,0x5944,0x66ea, 0x3ea0,0x00d2,0xbab2,0x8121, 0x3e90,0x008c,0x66ce,0xc77d, 0x3e80,0x005d,0x8f13,0x858c, 0x3e70,0x003e,0x59ff,0xde12, 0x3e60,0x0029,0x8ea5,0x5633, 0x3e50,0x001b,0xb316,0xccda, 0x3e40,0x0012,0x76b9,0x0845, 0x3e30,0x000c,0x4ed0,0x5ae3, 0x3e20,0x0008,0x3460,0x1a87, 0x3e10,0x0005,0x782a,0xaebe }; #endif /* 2**x (1 - 1/x) (zeta(x) - 1) = P(1/x)/Q(1/x), 1 <= x <= 10 */ #ifdef UNK static double P[9] = { 5.85746514569725319540E11, 2.57534127756102572888E11, 4.87781159567948256438E10, 5.15399538023885770696E9, 3.41646073514754094281E8, 1.60837006880656492731E7, 5.92785467342109522998E5, 1.51129169964938823117E4, 2.01822444485997955865E2, }; static double Q[8] = { /* 1.00000000000000000000E0,*/ 3.90497676373371157516E11, 5.22858235368272161797E10, 5.64451517271280543351E9, 3.39006746015350418834E8, 1.79410371500126453702E7, 5.66666825131384797029E5, 1.60382976810944131506E4, 1.96436237223387314144E2, }; #endif #ifdef DEC static unsigned short P[36] = { 0052010,0060466,0101211,0134657, 0051557,0154353,0135060,0064411, 0051065,0133157,0133514,0133633, 0050231,0114735,0035036,0111344, 0047242,0164327,0146036,0033545, 0046165,0065364,0130045,0011005, 0045020,0134427,0075073,0134107, 0043554,0021653,0000440,0177426, 0042111,0151213,0134312,0021402, }; static unsigned short Q[32] = { /*0040200,0000000,0000000,0000000,*/ 0051665,0153363,0054252,0137010, 0051102,0143645,0121415,0036107, 0050250,0034073,0131133,0036465, 0047241,0123250,0150037,0070012, 0046210,0160426,0111463,0116507, 0045012,0054255,0031674,0173612, 0043572,0114460,0151520,0012221, 0042104,0067655,0037037,0137421, }; #endif #ifdef IBMPC static unsigned short P[36] = { 0x3736,0xd051,0x0c26,0x4261, 0x0d21,0x7746,0xfb1d,0x424d, 0x96f3,0xf6e9,0xb6cd,0x4226, 0xd25c,0xa743,0x333b,0x41f3, 0xc6ed,0xf983,0x5d1a,0x41b4, 0xa241,0x9604,0xad5e,0x416e, 0x7709,0xef47,0x1722,0x4122, 0x1fe3,0x6024,0x8475,0x40cd, 0x4460,0x7719,0x3a51,0x4069, }; static unsigned short Q[32] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x57c1,0x6b15,0xbade,0x4256, 0xa789,0xb461,0x58f4,0x4228, 0x67a7,0x764b,0x0707,0x41f5, 0xee01,0x1a03,0x34d5,0x41b4, 0x73a9,0xd266,0x1c22,0x4171, 0x9ef1,0xa677,0x4b15,0x4121, 0x0292,0x1a6a,0x5326,0x40cf, 0xf7e2,0xa7c3,0x8df5,0x4068, }; #endif #ifdef MIEEE static unsigned short P[36] = { 0x4261,0x0c26,0xd051,0x3736, 0x424d,0xfb1d,0x7746,0x0d21, 0x4226,0xb6cd,0xf6e9,0x96f3, 0x41f3,0x333b,0xa743,0xd25c, 0x41b4,0x5d1a,0xf983,0xc6ed, 0x416e,0xad5e,0x9604,0xa241, 0x4122,0x1722,0xef47,0x7709, 0x40cd,0x8475,0x6024,0x1fe3, 0x4069,0x3a51,0x7719,0x4460, }; static unsigned short Q[32] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4256,0xbade,0x6b15,0x57c1, 0x4228,0x58f4,0xb461,0xa789, 0x41f5,0x0707,0x764b,0x67a7, 0x41b4,0x34d5,0x1a03,0xee01, 0x4171,0x1c22,0xd266,0x73a9, 0x4121,0x4b15,0xa677,0x9ef1, 0x40cf,0x5326,0x1a6a,0x0292, 0x4068,0x8df5,0xa7c3,0xf7e2, }; #endif /* log(zeta(x) - 1 - 2**-x), 10 <= x <= 50 */ #ifdef UNK static double A[11] = { 8.70728567484590192539E6, 1.76506865670346462757E8, 2.60889506707483264896E10, 5.29806374009894791647E11, 2.26888156119238241487E13, 3.31884402932705083599E14, 5.13778997975868230192E15, -1.98123688133907171455E15, -9.92763810039983572356E16, 7.82905376180870586444E16, 9.26786275768927717187E16, }; static double B[10] = { /* 1.00000000000000000000E0,*/ -7.92625410563741062861E6, -1.60529969932920229676E8, -2.37669260975543221788E10, -4.80319584350455169857E11, -2.07820961754173320170E13, -2.96075404507272223680E14, -4.86299103694609136686E15, 5.34589509675789930199E15, 5.71464111092297631292E16, -1.79915597658676556828E16, }; #endif #ifdef DEC static unsigned short A[44] = { 0046004,0156325,0126302,0131567, 0047050,0052177,0015271,0136466, 0050702,0060271,0070727,0171112, 0051766,0132727,0064363,0145042, 0053245,0012466,0056000,0117230, 0054226,0166155,0174275,0170213, 0055222,0003127,0112544,0101322, 0154741,0036625,0010346,0053767, 0156260,0054653,0154052,0031113, 0056213,0011152,0021000,0007111, 0056244,0120534,0040576,0163262, }; static unsigned short B[40] = { /*0040200,0000000,0000000,0000000,*/ 0145761,0161734,0033026,0015520, 0147031,0013743,0017355,0036703, 0150661,0011720,0061061,0136402, 0151737,0125216,0070274,0164414, 0153227,0032653,0127211,0145250, 0154206,0121666,0123774,0042035, 0155212,0033352,0125154,0132533, 0055227,0170201,0110775,0072132, 0056113,0003133,0127132,0122303, 0155577,0126351,0141462,0171037, }; #endif #ifdef IBMPC static unsigned short A[44] = { 0x566f,0xb598,0x9b9a,0x4160, 0x37a7,0xe357,0x0a8f,0x41a5, 0xfe49,0x2e3a,0x4c17,0x4218, 0x7944,0xed1e,0xd6ba,0x425e, 0x13d3,0xcb80,0xa2a6,0x42b4, 0xbe11,0xbf17,0xdd8d,0x42f2, 0x905a,0xf2ac,0x40ca,0x4332, 0xcaff,0xa21c,0x27b2,0xc31c, 0x4649,0x7b05,0x0b35,0xc376, 0x01c9,0x4440,0x624d,0x4371, 0xdcd6,0x882f,0x942b,0x4374, }; static unsigned short B[40] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xc36a,0x86c2,0x3c7b,0xc15e, 0xa7b8,0x63dd,0x22fc,0xc1a3, 0x37a0,0x0c46,0x227a,0xc216, 0x9d22,0xce17,0xf551,0xc25b, 0x3955,0x75d1,0xe6b5,0xc2b2, 0x8884,0xd4ff,0xd476,0xc2f0, 0x96ab,0x554d,0x46dd,0xc331, 0xae8b,0x323f,0xfe10,0x4332, 0x5498,0x75cb,0x60cb,0x4369, 0x5e44,0x3866,0xf59d,0xc34f, }; #endif #ifdef MIEEE static unsigned short A[44] = { 0x4160,0x9b9a,0xb598,0x566f, 0x41a5,0x0a8f,0xe357,0x37a7, 0x4218,0x4c17,0x2e3a,0xfe49, 0x425e,0xd6ba,0xed1e,0x7944, 0x42b4,0xa2a6,0xcb80,0x13d3, 0x42f2,0xdd8d,0xbf17,0xbe11, 0x4332,0x40ca,0xf2ac,0x905a, 0xc31c,0x27b2,0xa21c,0xcaff, 0xc376,0x0b35,0x7b05,0x4649, 0x4371,0x624d,0x4440,0x01c9, 0x4374,0x942b,0x882f,0xdcd6, }; static unsigned short B[40] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xc15e,0x3c7b,0x86c2,0xc36a, 0xc1a3,0x22fc,0x63dd,0xa7b8, 0xc216,0x227a,0x0c46,0x37a0, 0xc25b,0xf551,0xce17,0x9d22, 0xc2b2,0xe6b5,0x75d1,0x3955, 0xc2f0,0xd476,0xd4ff,0x8884, 0xc331,0x46dd,0x554d,0x96ab, 0x4332,0xfe10,0x323f,0xae8b, 0x4369,0x60cb,0x75cb,0x5498, 0xc34f,0xf59d,0x3866,0x5e44, }; #endif /* (1-x) (zeta(x) - 1), 0 <= x <= 1 */ #ifdef UNK static double R[6] = { -3.28717474506562731748E-1, 1.55162528742623950834E1, -2.48762831680821954401E2, 1.01050368053237678329E3, 1.26726061410235149405E4, -1.11578094770515181334E5, }; static double S[5] = { /* 1.00000000000000000000E0,*/ 1.95107674914060531512E1, 3.17710311750646984099E2, 3.03835500874445748734E3, 2.03665876435770579345E4, 7.43853965136767874343E4, }; #endif #ifdef DEC static unsigned short R[24] = { 0137650,0046650,0022502,0040316, 0041170,0041222,0057666,0142216, 0142170,0141510,0167741,0075646, 0042574,0120074,0046505,0106053, 0043506,0001154,0130073,0101413, 0144331,0166414,0020560,0131652, }; static unsigned short S[20] = { /*0040200,0000000,0000000,0000000,*/ 0041234,0013015,0042073,0113570, 0042236,0155353,0077325,0077445, 0043075,0162656,0016646,0031723, 0043637,0016454,0157636,0071126, 0044221,0044262,0140365,0146434, }; #endif #ifdef IBMPC static unsigned short R[24] = { 0x481a,0x04a8,0x09b5,0xbfd5, 0xd892,0x4bf6,0x0852,0x402f, 0x2f75,0x1dfc,0x1869,0xc06f, 0xb185,0x89a8,0x9407,0x408f, 0x7061,0x9607,0xc04d,0x40c8, 0x1675,0x842e,0x3da1,0xc0fb, }; static unsigned short S[20] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x72ef,0xa887,0x82c1,0x4033, 0xafe5,0x6fda,0xdb5d,0x4073, 0xc67a,0xc3b4,0xbcb5,0x40a7, 0xce4b,0x9bf3,0xe3a5,0x40d3, 0xb9a3,0x581e,0x2916,0x40f2, }; #endif #ifdef MIEEE static unsigned short R[24] = { 0xbfd5,0x09b5,0x04a8,0x481a, 0x402f,0x0852,0x4bf6,0xd892, 0xc06f,0x1869,0x1dfc,0x2f75, 0x408f,0x9407,0x89a8,0xb185, 0x40c8,0xc04d,0x9607,0x7061, 0xc0fb,0x3da1,0x842e,0x1675, }; static unsigned short S[20] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4033,0x82c1,0xa887,0x72ef, 0x4073,0xdb5d,0x6fda,0xafe5, 0x40a7,0xbcb5,0xc3b4,0xc67a, 0x40d3,0xe3a5,0x9bf3,0xce4b, 0x40f2,0x2916,0x581e,0xb9a3, }; #endif #define MAXL2 127 /* * Riemann zeta function, minus one */ extern double MACHEP; double zetac(x) double x; { int i; double a, b, s, w; if( x < 0.0 ) { if( x < -30.8148 ) { mtherr( "zetac", OVERFLOW ); return(0.0); } s = 1.0 - x; w = zetac( s ); b = sin(0.5*PI*x) * pow(2.0*PI, x) * true_gamma(s) * (1.0 + w) / PI; return(b - 1.0); } if( x >= MAXL2 ) return(0.0); /* because first term is 2**-x */ /* Tabulated values for integer argument */ w = floor(x); if( w == x ) { i = x; if( i < 31 ) { #ifdef UNK return( azetac[i] ); #else return( *(double *)&azetac[4*i] ); #endif } } if( x < 1.0 ) { w = 1.0 - x; a = polevl( x, R, 5 ) / ( w * p1evl( x, S, 5 )); return( a ); } if( x == 1.0 ) { mtherr( "zetac", SING ); return( MAXNUM ); } if( x <= 10.0 ) { b = pow( 2.0, x ) * (x - 1.0); w = 1.0/x; s = (x * polevl( w, P, 8 )) / (b * p1evl( w, Q, 8 )); return( s ); } if( x <= 50.0 ) { b = pow( 2.0, -x ); w = polevl( x, A, 10 ) / p1evl( x, B, 10 ); w = exp(w) + b; return(w); } /* Basic sum of inverse powers */ s = 0.0; a = 1.0; do { a += 2.0; b = pow( a, -x ); s += b; } while( b/s > MACHEP ); b = pow( 2.0, -x ); s = (s + b)/(1.0-b); return(s); } grace-5.1.23/cephes/polevl.c0000644000076500001440000000315106626627164015363 0ustar fnevgenyusers/* polevl.c * p1evl.c * * Evaluate polynomial * * * * SYNOPSIS: * * int N; * double x, y, coef[N+1], polevl[]; * * y = polevl( x, coef, N ); * * * * DESCRIPTION: * * Evaluates polynomial of degree N: * * 2 N * y = C + C x + C x +...+ C x * 0 1 2 N * * Coefficients are stored in reverse order: * * coef[0] = C , ..., coef[N] = C . * N 0 * * The function p1evl() assumes that coef[N] = 1.0 and is * omitted from the array. Its calling arguments are * otherwise the same as polevl(). * * * SPEED: * * In the interest of speed, there are no checks for out * of bounds arithmetic. This routine is used by most of * the functions in the library. Depending on available * equipment features, the user may wish to rewrite the * program in microcode or assembly language. * */ /* Cephes Math Library Release 2.1: December, 1988 Copyright 1984, 1987, 1988 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "cephes.h" double polevl( x, coef, N ) double x; void *coef; int N; { double ans; int i; double *p; p = (double *) coef; ans = *p++; i = N; do ans = ans * x + *p++; while( --i ); return( ans ); } /* p1evl() */ /* N * Evaluate polynomial when coefficient of x is 1.0. * Otherwise same as polevl. */ double p1evl( x, coef, N ) double x; void *coef; int N; { double ans; double *p; int i; p = (double *) coef; ans = x + *p++; i = N-1; do ans = ans * x + *p++; while( --i ); return( ans ); } grace-5.1.23/cephes/sici.c0000644000076500001440000003651106626627164015017 0ustar fnevgenyusers/* sici.c * * Sine and cosine integrals * * * * SYNOPSIS: * * double x, Ci, Si, sici(); * * sici( x, &Si, &Ci ); * * * DESCRIPTION: * * Evaluates the integrals * * x * - * | cos t - 1 * Ci(x) = eul + ln x + | --------- dt, * | t * - * 0 * x * - * | sin t * Si(x) = | ----- dt * | t * - * 0 * * where eul = 0.57721566490153286061 is Euler's constant. * The integrals are approximated by rational functions. * For x > 8 auxiliary functions f(x) and g(x) are employed * such that * * Ci(x) = f(x) sin(x) - g(x) cos(x) * Si(x) = pi/2 - f(x) cos(x) - g(x) sin(x) * * * ACCURACY: * Test interval = [0,50]. * Absolute error, except relative when > 1: * arithmetic function # trials peak rms * IEEE Si 30000 4.4e-16 7.3e-17 * IEEE Ci 30000 6.9e-16 5.1e-17 * DEC Si 5000 4.4e-17 9.0e-18 * DEC Ci 5300 7.9e-17 5.2e-18 */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK static double SN[] = { -8.39167827910303881427E-11, 4.62591714427012837309E-8, -9.75759303843632795789E-6, 9.76945438170435310816E-4, -4.13470316229406538752E-2, 1.00000000000000000302E0, }; static double SD[] = { 2.03269266195951942049E-12, 1.27997891179943299903E-9, 4.41827842801218905784E-7, 9.96412122043875552487E-5, 1.42085239326149893930E-2, 9.99999999999999996984E-1, }; #endif #ifdef DEC static unsigned short SN[] = { 0127670,0104362,0167505,0035161, 0032106,0127177,0032131,0056461, 0134043,0132213,0000476,0172351, 0035600,0006331,0064761,0032665, 0137051,0055601,0044667,0017645, 0040200,0000000,0000000,0000000, }; static unsigned short SD[] = { 0026417,0004674,0052064,0001573, 0030657,0165501,0014666,0131526, 0032755,0032133,0034147,0024124, 0034720,0173167,0166624,0154477, 0036550,0145336,0063534,0063220, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short SN[] = { 0xa74e,0x5de8,0x111e,0xbdd7, 0x2ba6,0xe68b,0xd5cf,0x3e68, 0xde9d,0x6027,0x7691,0xbee4, 0x26b7,0x2d3e,0x019b,0x3f50, 0xe3f5,0x2936,0x2b70,0xbfa5, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short SD[] = { 0x806f,0x8a86,0xe137,0x3d81, 0xd66b,0x2336,0xfd68,0x3e15, 0xe50a,0x670c,0xa68b,0x3e9d, 0x9b28,0xfdb2,0x1ece,0x3f1a, 0x8cd2,0xcceb,0x195b,0x3f8d, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short SN[] = { 0xbdd7,0x111e,0x5de8,0xa74e, 0x3e68,0xd5cf,0xe68b,0x2ba6, 0xbee4,0x7691,0x6027,0xde9d, 0x3f50,0x019b,0x2d3e,0x26b7, 0xbfa5,0x2b70,0x2936,0xe3f5, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short SD[] = { 0x3d81,0xe137,0x8a86,0x806f, 0x3e15,0xfd68,0x2336,0xd66b, 0x3e9d,0xa68b,0x670c,0xe50a, 0x3f1a,0x1ece,0xfdb2,0x9b28, 0x3f8d,0x195b,0xcceb,0x8cd2, 0x3ff0,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double CN[] = { 2.02524002389102268789E-11, -1.35249504915790756375E-8, 3.59325051419993077021E-6, -4.74007206873407909465E-4, 2.89159652607555242092E-2, -1.00000000000000000080E0, }; static double CD[] = { 4.07746040061880559506E-12, 3.06780997581887812692E-9, 1.23210355685883423679E-6, 3.17442024775032769882E-4, 5.10028056236446052392E-2, 4.00000000000000000080E0, }; #endif #ifdef DEC static unsigned short CN[] = { 0027262,0022131,0160257,0020166, 0131550,0055534,0077637,0000557, 0033561,0021622,0161463,0026575, 0135370,0102053,0116333,0000466, 0036754,0160454,0122022,0024622, 0140200,0000000,0000000,0000000, }; static unsigned short CD[] = { 0026617,0073177,0107543,0104425, 0031122,0150573,0156453,0041517, 0033245,0057301,0077706,0110510, 0035246,0067130,0165424,0044543, 0037120,0164121,0061206,0053657, 0040600,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short CN[] = { 0xe40f,0x3c15,0x448b,0x3db6, 0xe02e,0x8ff3,0x0b6b,0xbe4d, 0x65b0,0x5c66,0x2472,0x3ece, 0x6027,0x739b,0x1085,0xbf3f, 0x4532,0x9482,0x9c25,0x3f9d, 0x0000,0x0000,0x0000,0xbff0, }; static unsigned short CD[] = { 0x7123,0xf1ec,0xeecf,0x3d91, 0x686a,0x7ba5,0x5a2f,0x3e2a, 0xd229,0x2ff8,0xabd8,0x3eb4, 0x892c,0x1d62,0xcdcb,0x3f34, 0xcaf6,0x2c50,0x1d0a,0x3faa, 0x0000,0x0000,0x0000,0x4010, }; #endif #ifdef MIEEE static unsigned short CN[] = { 0x3db6,0x448b,0x3c15,0xe40f, 0xbe4d,0x0b6b,0x8ff3,0xe02e, 0x3ece,0x2472,0x5c66,0x65b0, 0xbf3f,0x1085,0x739b,0x6027, 0x3f9d,0x9c25,0x9482,0x4532, 0xbff0,0x0000,0x0000,0x0000, }; static unsigned short CD[] = { 0x3d91,0xeecf,0xf1ec,0x7123, 0x3e2a,0x5a2f,0x7ba5,0x686a, 0x3eb4,0xabd8,0x2ff8,0xd229, 0x3f34,0xcdcb,0x1d62,0x892c, 0x3faa,0x1d0a,0x2c50,0xcaf6, 0x4010,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double FN4[] = { 4.23612862892216586994E0, 5.45937717161812843388E0, 1.62083287701538329132E0, 1.67006611831323023771E-1, 6.81020132472518137426E-3, 1.08936580650328664411E-4, 5.48900223421373614008E-7, }; static double FD4[] = { /* 1.00000000000000000000E0,*/ 8.16496634205391016773E0, 7.30828822505564552187E0, 1.86792257950184183883E0, 1.78792052963149907262E-1, 7.01710668322789753610E-3, 1.10034357153915731354E-4, 5.48900252756255700982E-7, }; #endif #ifdef DEC static unsigned short FN4[] = { 0040607,0107135,0120133,0153471, 0040656,0131467,0140424,0017567, 0040317,0073563,0121610,0002511, 0037453,0001710,0000040,0006334, 0036337,0024033,0176003,0171425, 0034744,0072341,0121657,0126035, 0033023,0054042,0154652,0000451, }; static unsigned short FD4[] = { /*0040200,0000000,0000000,0000000,*/ 0041002,0121663,0137500,0177450, 0040751,0156577,0042213,0061552, 0040357,0014026,0045465,0147265, 0037467,0012503,0110413,0131772, 0036345,0167701,0155706,0160551, 0034746,0141076,0162250,0123547, 0033023,0054043,0056706,0151050, }; #endif #ifdef IBMPC static unsigned short FN4[] = { 0x7ae7,0xb40b,0xf1cb,0x4010, 0x83ef,0xf822,0xd666,0x4015, 0x00a9,0x7471,0xeeee,0x3ff9, 0x019c,0x0004,0x6079,0x3fc5, 0x7e63,0x7f80,0xe503,0x3f7b, 0xf584,0x3475,0x8e9c,0x3f1c, 0x4025,0x5b35,0x6b04,0x3ea2, }; static unsigned short FD4[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x1fe5,0x77e8,0x5476,0x4020, 0x6c6d,0xe891,0x3baf,0x401d, 0xb9d7,0xc966,0xe302,0x3ffd, 0x767f,0x7221,0xe2a8,0x3fc6, 0xdc2d,0x3b78,0xbdf8,0x3f7c, 0x14ed,0xdc95,0xd847,0x3f1c, 0xda45,0x6bb8,0x6b04,0x3ea2, }; #endif #ifdef MIEEE static unsigned short FN4[] = { 0x4010,0xf1cb,0xb40b,0x7ae7, 0x4015,0xd666,0xf822,0x83ef, 0x3ff9,0xeeee,0x7471,0x00a9, 0x3fc5,0x6079,0x0004,0x019c, 0x3f7b,0xe503,0x7f80,0x7e63, 0x3f1c,0x8e9c,0x3475,0xf584, 0x3ea2,0x6b04,0x5b35,0x4025, }; static unsigned short FD4[] = { /* 0x3ff0,0x0000,0x0000,0x0000,*/ 0x4020,0x5476,0x77e8,0x1fe5, 0x401d,0x3baf,0xe891,0x6c6d, 0x3ffd,0xe302,0xc966,0xb9d7, 0x3fc6,0xe2a8,0x7221,0x767f, 0x3f7c,0xbdf8,0x3b78,0xdc2d, 0x3f1c,0xd847,0xdc95,0x14ed, 0x3ea2,0x6b04,0x6bb8,0xda45, }; #endif #ifdef UNK static double FN8[] = { 4.55880873470465315206E-1, 7.13715274100146711374E-1, 1.60300158222319456320E-1, 1.16064229408124407915E-2, 3.49556442447859055605E-4, 4.86215430826454749482E-6, 3.20092790091004902806E-8, 9.41779576128512936592E-11, 9.70507110881952024631E-14, }; static double FD8[] = { /* 1.00000000000000000000E0,*/ 9.17463611873684053703E-1, 1.78685545332074536321E-1, 1.22253594771971293032E-2, 3.58696481881851580297E-4, 4.92435064317881464393E-6, 3.21956939101046018377E-8, 9.43720590350276732376E-11, 9.70507110881952025725E-14, }; #endif #ifdef DEC static unsigned short FN8[] = { 0037751,0064467,0142332,0164573, 0040066,0133013,0050352,0071102, 0037444,0022671,0102157,0013535, 0036476,0024335,0136423,0146444, 0035267,0042253,0164110,0110460, 0033643,0022626,0062535,0060320, 0032011,0075223,0010110,0153413, 0027717,0014572,0011360,0014034, 0025332,0104755,0004563,0152354, }; static unsigned short FD8[] = { /*0040200,0000000,0000000,0000000,*/ 0040152,0157345,0030104,0075616, 0037466,0174527,0172740,0071060, 0036510,0046337,0144272,0156552, 0035274,0007555,0042537,0015572, 0033645,0035731,0112465,0026474, 0032012,0043612,0030613,0030123, 0027717,0103277,0004564,0151000, 0025332,0104755,0004563,0152354, }; #endif #ifdef IBMPC static unsigned short FN8[] = { 0x5d2f,0xf89b,0x2d26,0x3fdd, 0x4e48,0x6a1d,0xd6c1,0x3fe6, 0xe2ec,0x308d,0x84b7,0x3fc4, 0x79a4,0xb7a2,0xc51b,0x3f87, 0x1226,0x7d09,0xe895,0x3f36, 0xac1a,0xccab,0x64b2,0x3ed4, 0x1ae1,0x6209,0x2f52,0x3e61, 0x0304,0x425e,0xe32f,0x3dd9, 0x7a9d,0xa12e,0x513d,0x3d3b, }; static unsigned short FD8[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x8f72,0xa608,0x5bdc,0x3fed, 0x0e46,0xfebc,0xdf2a,0x3fc6, 0x5bad,0xf917,0x099b,0x3f89, 0xe36f,0xa8ab,0x81ed,0x3f37, 0xa5a8,0x32a6,0xa77b,0x3ed4, 0x660a,0x4631,0x48f1,0x3e61, 0x9a40,0xe12e,0xf0d7,0x3dd9, 0x7a9d,0xa12e,0x513d,0x3d3b, }; #endif #ifdef MIEEE static unsigned short FN8[] = { 0x3fdd,0x2d26,0xf89b,0x5d2f, 0x3fe6,0xd6c1,0x6a1d,0x4e48, 0x3fc4,0x84b7,0x308d,0xe2ec, 0x3f87,0xc51b,0xb7a2,0x79a4, 0x3f36,0xe895,0x7d09,0x1226, 0x3ed4,0x64b2,0xccab,0xac1a, 0x3e61,0x2f52,0x6209,0x1ae1, 0x3dd9,0xe32f,0x425e,0x0304, 0x3d3b,0x513d,0xa12e,0x7a9d, }; static unsigned short FD8[] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3fed,0x5bdc,0xa608,0x8f72, 0x3fc6,0xdf2a,0xfebc,0x0e46, 0x3f89,0x099b,0xf917,0x5bad, 0x3f37,0x81ed,0xa8ab,0xe36f, 0x3ed4,0xa77b,0x32a6,0xa5a8, 0x3e61,0x48f1,0x4631,0x660a, 0x3dd9,0xf0d7,0xe12e,0x9a40, 0x3d3b,0x513d,0xa12e,0x7a9d, }; #endif #ifdef UNK static double GN4[] = { 8.71001698973114191777E-2, 6.11379109952219284151E-1, 3.97180296392337498885E-1, 7.48527737628469092119E-2, 5.38868681462177273157E-3, 1.61999794598934024525E-4, 1.97963874140963632189E-6, 7.82579040744090311069E-9, }; static double GD4[] = { /* 1.00000000000000000000E0,*/ 1.64402202413355338886E0, 6.66296701268987968381E-1, 9.88771761277688796203E-2, 6.22396345441768420760E-3, 1.73221081474177119497E-4, 2.02659182086343991969E-6, 7.82579218933534490868E-9, }; #endif #ifdef DEC static unsigned short GN4[] = { 0037262,0060622,0164572,0157515, 0040034,0101527,0061263,0147204, 0037713,0055467,0037475,0144512, 0037231,0046151,0035234,0045261, 0036260,0111624,0150617,0053536, 0035051,0157175,0016675,0155456, 0033404,0154757,0041211,0000055, 0031406,0071060,0130322,0033322, }; static unsigned short GD4[] = { /* 0040200,0000000,0000000,0000000,*/ 0040322,0067520,0046707,0053275, 0040052,0111153,0126542,0005516, 0037312,0100035,0167121,0014552, 0036313,0171143,0137176,0014213, 0035065,0121256,0012033,0150603, 0033410,0000225,0013121,0071643, 0031406,0071062,0131152,0150454, }; #endif #ifdef IBMPC static unsigned short GN4[] = { 0x5bea,0x5d2f,0x4c32,0x3fb6, 0x79d1,0xec56,0x906a,0x3fe3, 0xb929,0xe7e7,0x6b66,0x3fd9, 0x8956,0x2753,0x298d,0x3fb3, 0xeaec,0x9a31,0x1272,0x3f76, 0xbb66,0xa3b7,0x3bcf,0x3f25, 0x2006,0xe851,0x9b3d,0x3ec0, 0x46da,0x161a,0xce46,0x3e40, }; static unsigned short GD4[] = { /* 0x0000,0x0000,0x0000,0x3ff0,*/ 0xead8,0x09b8,0x4dea,0x3ffa, 0x416a,0x75ac,0x524d,0x3fe5, 0x232d,0xbdca,0x5003,0x3fb9, 0xc311,0x77cf,0x7e4c,0x3f79, 0x7a30,0xc283,0xb455,0x3f26, 0x2e74,0xa2ca,0x0012,0x3ec1, 0x5a26,0x564d,0xce46,0x3e40, }; #endif #ifdef MIEEE static unsigned short GN4[] = { 0x3fb6,0x4c32,0x5d2f,0x5bea, 0x3fe3,0x906a,0xec56,0x79d1, 0x3fd9,0x6b66,0xe7e7,0xb929, 0x3fb3,0x298d,0x2753,0x8956, 0x3f76,0x1272,0x9a31,0xeaec, 0x3f25,0x3bcf,0xa3b7,0xbb66, 0x3ec0,0x9b3d,0xe851,0x2006, 0x3e40,0xce46,0x161a,0x46da, }; static unsigned short GD4[] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3ffa,0x4dea,0x09b8,0xead8, 0x3fe5,0x524d,0x75ac,0x416a, 0x3fb9,0x5003,0xbdca,0x232d, 0x3f79,0x7e4c,0x77cf,0xc311, 0x3f26,0xb455,0xc283,0x7a30, 0x3ec1,0x0012,0xa2ca,0x2e74, 0x3e40,0xce46,0x564d,0x5a26, }; #endif #ifdef UNK static double GN8[] = { 6.97359953443276214934E-1, 3.30410979305632063225E-1, 3.84878767649974295920E-2, 1.71718239052347903558E-3, 3.48941165502279436777E-5, 3.47131167084116673800E-7, 1.70404452782044526189E-9, 3.85945925430276600453E-12, 3.14040098946363334640E-15, }; static double GD8[] = { /* 1.00000000000000000000E0,*/ 1.68548898811011640017E0, 4.87852258695304967486E-1, 4.67913194259625806320E-2, 1.90284426674399523638E-3, 3.68475504442561108162E-5, 3.57043223443740838771E-7, 1.72693748966316146736E-9, 3.87830166023954706752E-12, 3.14040098946363335242E-15, }; #endif #ifdef DEC static unsigned short GN8[] = { 0040062,0103056,0110624,0033123, 0037651,0025640,0136266,0145647, 0037035,0122566,0137770,0061777, 0035741,0011424,0065311,0013370, 0034422,0055505,0134324,0016755, 0032672,0056530,0022565,0014747, 0030752,0031674,0114735,0013162, 0026607,0145353,0022020,0123625, 0024142,0045054,0060033,0016505, }; static unsigned short GD8[] = { /*0040200,0000000,0000000,0000000,*/ 0040327,0137032,0064331,0136425, 0037771,0143705,0070300,0105711, 0037077,0124101,0025275,0035356, 0035771,0064333,0145103,0105357, 0034432,0106301,0105311,0010713, 0032677,0127645,0120034,0157551, 0030755,0054466,0010743,0105566, 0026610,0072242,0142530,0135744, 0024142,0045054,0060033,0016505, }; #endif #ifdef IBMPC static unsigned short GN8[] = { 0x86ca,0xd232,0x50c5,0x3fe6, 0xd975,0x1796,0x2574,0x3fd5, 0x0c80,0xd7ff,0xb4ae,0x3fa3, 0x22df,0x8d59,0x2262,0x3f5c, 0x83be,0xb71a,0x4b68,0x3f02, 0xa33d,0x04ae,0x4bab,0x3e97, 0xa2ce,0x933b,0x4677,0x3e1d, 0x14f3,0x6482,0xf95d,0x3d90, 0x63a9,0x8c03,0x4945,0x3cec, }; static unsigned short GD8[] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x37a3,0x4d1b,0xf7c3,0x3ffa, 0x1179,0xae18,0x38f8,0x3fdf, 0xa75e,0x2557,0xf508,0x3fa7, 0x715e,0x7948,0x2d1b,0x3f5f, 0x2239,0x3159,0x5198,0x3f03, 0x9bed,0xb403,0xf5f4,0x3e97, 0x716f,0xc23c,0xab26,0x3e1d, 0x177c,0x58ab,0x0e94,0x3d91, 0x63a9,0x8c03,0x4945,0x3cec, }; #endif #ifdef MIEEE static unsigned short GN8[] = { 0x3fe6,0x50c5,0xd232,0x86ca, 0x3fd5,0x2574,0x1796,0xd975, 0x3fa3,0xb4ae,0xd7ff,0x0c80, 0x3f5c,0x2262,0x8d59,0x22df, 0x3f02,0x4b68,0xb71a,0x83be, 0x3e97,0x4bab,0x04ae,0xa33d, 0x3e1d,0x4677,0x933b,0xa2ce, 0x3d90,0xf95d,0x6482,0x14f3, 0x3cec,0x4945,0x8c03,0x63a9, }; static unsigned short GD8[] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x3ffa,0xf7c3,0x4d1b,0x37a3, 0x3fdf,0x38f8,0xae18,0x1179, 0x3fa7,0xf508,0x2557,0xa75e, 0x3f5f,0x2d1b,0x7948,0x715e, 0x3f03,0x5198,0x3159,0x2239, 0x3e97,0xf5f4,0xb403,0x9bed, 0x3e1d,0xab26,0xc23c,0x716f, 0x3d91,0x0e94,0x58ab,0x177c, 0x3cec,0x4945,0x8c03,0x63a9, }; #endif #define EUL 0.57721566490153286061 extern double MAXNUM, PIO2, MACHEP; int sici( x, si, ci ) double x; double *si, *ci; { double z, c, s, f, g; short sign; if( x < 0.0 ) { sign = -1; x = -x; } else sign = 0; if( x == 0.0 ) { *si = 0.0; *ci = -MAXNUM; return( 0 ); } if( x > 1.0e9 ) { *si = PIO2 - cos(x)/x; *ci = sin(x)/x; } if( x > 4.0 ) goto asympt; z = x * x; s = x * polevl( z, SN, 5 ) / polevl( z, SD, 5 ); c = z * polevl( z, CN, 5 ) / polevl( z, CD, 5 ); if( sign ) s = -s; *si = s; *ci = EUL + log(x) + c; /* real part if x < 0 */ return(0); /* The auxiliary functions are: * * * *si = *si - PIO2; * c = cos(x); * s = sin(x); * * t = *ci * s - *si * c; * a = *ci * c + *si * s; * * *si = t; * *ci = -a; */ asympt: s = sin(x); c = cos(x); z = 1.0/(x*x); if( x < 8.0 ) { f = polevl( z, FN4, 6 ) / (x * p1evl( z, FD4, 7 )); g = z * polevl( z, GN4, 7 ) / p1evl( z, GD4, 7 ); } else { f = polevl( z, FN8, 8 ) / (x * p1evl( z, FD8, 8 )); g = z * polevl( z, GN8, 8 ) / p1evl( z, GD8, 9 ); } *si = PIO2 - f * c - g * s; if( sign ) *si = -( *si ); *ci = f * s - g * c; return(0); } grace-5.1.23/cephes/chbevl.c0000644000076500001440000000313006626627163015321 0ustar fnevgenyusers/* chbevl.c * * Evaluate Chebyshev series * * * * SYNOPSIS: * * int N; * double x, y, coef[N], chebevl(); * * y = chbevl( x, coef, N ); * * * * DESCRIPTION: * * Evaluates the series * * N-1 * - ' * y = > coef[i] T (x/2) * - i * i=0 * * of Chebyshev polynomials Ti at argument x/2. * * Coefficients are stored in reverse order, i.e. the zero * order term is last in the array. Note N is the number of * coefficients, not the order. * * If coefficients are for the interval a to b, x must * have been transformed to x -> 2(2x - b - a)/(b-a) before * entering the routine. This maps x from (a, b) to (-1, 1), * over which the Chebyshev polynomials are defined. * * If the coefficients are for the inverted interval, in * which (a, b) is mapped to (1/b, 1/a), the transformation * required is x -> 2(2ab/x - b - a)/(b-a). If b is infinity, * this becomes x -> 4a/x - 1. * * * * SPEED: * * Taking advantage of the recurrence properties of the * Chebyshev polynomials, the routine requires one more * addition per loop than evaluating a nested polynomial of * the same degree. * */ /* chbevl.c */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1985, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "cephes.h" double chbevl( x, array, n ) double x; void *array; int n; { double b0, b1, b2, *p; int i; p = (double *) array; b0 = *p++; b1 = 0.0; i = n - 1; do { b2 = b1; b1 = b0; b0 = x * b1 - b2 + *p++; } while( --i ); return( 0.5*(b0-b2) ); } grace-5.1.23/cephes/const.c0000644000076500001440000002621006724056645015210 0ustar fnevgenyusers/* const.c * * Globally declared constants * * * * SYNOPSIS: * * extern double nameofconstant; * * * * * DESCRIPTION: * * This file contains a number of mathematical constants and * also some needed size parameters of the computer arithmetic. * The values are supplied as arrays of hexadecimal integers * for IEEE arithmetic; arrays of octal constants for DEC * arithmetic; and in a normal decimal scientific notation for * other machines. The particular notation used is determined * by a symbol (DEC, IBMPC, or UNK) defined in the include file * mconf.h. * * Modified 8 April 1998 by John.Hasstedt@sunysb.edu to define * the proper values for G floating point if DEC and __G_FLOAT * are defined. __G_FLOAT is defined by the DECC compiler if * it is invoked with /FLOAT=G_FLOAT. * * The default size parameters are as follows. * * For DEC and UNK modes: * MACHEP = 1.38777878078144567553E-17 2**-56 * MAXLOG = 8.8029691931113054295988E1 log(2**127) * MINLOG = -8.872283911167299960540E1 log(2**-128) * MAXNUM = 1.701411834604692317316873e38 2**127 * * For DEC/__G_FLOAT mode: * MACHEP = 1.1102230246251565404236E-16 * MAXLOG = 7.0908956571282408276602E2 * MINLOG = -7.0978271289338397309621E2 * MAXNUM = 8.9884656743115785407264E307 * * For IEEE arithmetic (IBMPC): * MACHEP = 1.11022302462515654042E-16 2**-53 * MAXLOG = 7.09782712893383996843E2 log(2**1024) * MINLOG = -7.08396418532264106224E2 log(2**-1022) * MAXNUM = 1.7976931348623158E308 2**1024 * * The global symbols for mathematical constants are * PI = 3.14159265358979323846 pi * PIO2 = 1.57079632679489661923 pi/2 * PIO4 = 7.85398163397448309616E-1 pi/4 * SQRT2 = 1.41421356237309504880 sqrt(2) * SQRTH = 7.07106781186547524401E-1 sqrt(2)/2 * LOG2E = 1.4426950408889634073599 1/log(2) * SQ2OPI = 7.9788456080286535587989E-1 sqrt( 2/pi ) * LOGE2 = 6.93147180559945309417E-1 log(2) * LOGSQ2 = 3.46573590279972654709E-1 log(2)/2 * THPIO4 = 2.35619449019234492885 3*pi/4 * TWOOPI = 6.36619772367581343075535E-1 2/pi * * These lists are subject to change. */ /* const.c */ /* Cephes Math Library Release 2.3: March, 1995 Copyright 1984, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" #ifdef UNK #if 1 double MACHEP = 1.11022302462515654042E-16; /* 2**-53 */ #else double MACHEP = 1.38777878078144567553E-17; /* 2**-56 */ #endif double UFLOWTHRESH = 2.22507385850720138309E-308; /* 2**-1022 */ #ifdef DENORMAL double MAXLOG = 7.09782712893383996732E2; /* log(MAXNUM) */ /* double MINLOG = -7.44440071921381262314E2; */ /* log(2**-1074) */ double MINLOG = -7.451332191019412076235E2; /* log(2**-1075) */ #else double MAXLOG = 7.08396418532264106224E2; /* log 2**1022 */ double MINLOG = -7.08396418532264106224E2; /* log 2**-1022 */ #endif double MAXNUM = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ double PI = 3.14159265358979323846; /* pi */ double PIO2 = 1.57079632679489661923; /* pi/2 */ double PIO4 = 7.85398163397448309616E-1; /* pi/4 */ double SQRT2 = 1.41421356237309504880; /* sqrt(2) */ double SQRTH = 7.07106781186547524401E-1; /* sqrt(2)/2 */ double LOG2E = 1.4426950408889634073599; /* 1/log(2) */ double SQ2OPI = 7.9788456080286535587989E-1; /* sqrt( 2/pi ) */ double LOGE2 = 6.93147180559945309417E-1; /* log(2) */ double LOGSQ2 = 3.46573590279972654709E-1; /* log(2)/2 */ double THPIO4 = 2.35619449019234492885; /* 3*pi/4 */ double TWOOPI = 6.36619772367581343075535E-1; /* 2/pi */ #ifdef INFINITIES double INFINITY = 1.0/0.0; /* 99e999; */ #else double INFINITY = 1.79769313486231570815E308; /* 2**1024*(1-MACHEP) */ #endif #ifdef NANS double NAN = 1.0/0.0 - 1.0/0.0; #else double NAN = 0.0; #endif #ifdef MINUSZERO double NEGZERO = -0.0; #else double NEGZERO = 0.0; #endif #endif #ifdef IBMPC /* 2**-53 = 1.11022302462515654042E-16 */ unsigned short MACHEP[4] = {0x0000,0x0000,0x0000,0x3ca0}; unsigned short UFLOWTHRESH[4] = {0x0000,0x0000,0x0000,0x0010}; #ifdef DENORMAL /* log(MAXNUM) = 7.09782712893383996732224E2 */ unsigned short MAXLOG[4] = {0x39ef,0xfefa,0x2e42,0x4086}; /* log(2**-1074) = - -7.44440071921381262314E2 */ /*unsigned short MINLOG[4] = {0x71c3,0x446d,0x4385,0xc087};*/ unsigned short MINLOG[4] = {0x3052,0xd52d,0x4910,0xc087}; #else /* log(2**1022) = 7.08396418532264106224E2 */ unsigned short MAXLOG[4] = {0xbcd2,0xdd7a,0x232b,0x4086}; /* log(2**-1022) = - 7.08396418532264106224E2 */ unsigned short MINLOG[4] = {0xbcd2,0xdd7a,0x232b,0xc086}; #endif /* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ unsigned short MAXNUM[4] = {0xffff,0xffff,0xffff,0x7fef}; unsigned short PI[4] = {0x2d18,0x5444,0x21fb,0x4009}; unsigned short PIO2[4] = {0x2d18,0x5444,0x21fb,0x3ff9}; unsigned short PIO4[4] = {0x2d18,0x5444,0x21fb,0x3fe9}; unsigned short SQRT2[4] = {0x3bcd,0x667f,0xa09e,0x3ff6}; unsigned short SQRTH[4] = {0x3bcd,0x667f,0xa09e,0x3fe6}; unsigned short LOG2E[4] = {0x82fe,0x652b,0x1547,0x3ff7}; unsigned short SQ2OPI[4] = {0x3651,0x33d4,0x8845,0x3fe9}; unsigned short LOGE2[4] = {0x39ef,0xfefa,0x2e42,0x3fe6}; unsigned short LOGSQ2[4] = {0x39ef,0xfefa,0x2e42,0x3fd6}; unsigned short THPIO4[4] = {0x21d2,0x7f33,0xd97c,0x4002}; unsigned short TWOOPI[4] = {0xc883,0x6dc9,0x5f30,0x3fe4}; #ifdef INFINITIES unsigned short INFINITY[4] = {0x0000,0x0000,0x0000,0x7ff0}; #else unsigned short INFINITY[4] = {0xffff,0xffff,0xffff,0x7fef}; #endif #ifdef NANS unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x7ffc}; #else unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #ifdef MINUSZERO unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x8000}; #else unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #endif #ifdef MIEEE /* 2**-53 = 1.11022302462515654042E-16 */ unsigned short MACHEP[4] = {0x3ca0,0x0000,0x0000,0x0000}; unsigned short UFLOWTHRESH[4] = {0x0010,0x0000,0x0000,0x0000}; #ifdef DENORMAL /* log(2**1024) = 7.09782712893383996843E2 */ unsigned short MAXLOG[4] = {0x4086,0x2e42,0xfefa,0x39ef}; /* log(2**-1074) = - -7.44440071921381262314E2 */ /* unsigned short MINLOG[4] = {0xc087,0x4385,0x446d,0x71c3}; */ unsigned short MINLOG[4] = {0xc087,0x4910,0xd52d,0x3052}; #else /* log(2**1022) = 7.08396418532264106224E2 */ unsigned short MAXLOG[4] = {0x4086,0x232b,0xdd7a,0xbcd2}; /* log(2**-1022) = - 7.08396418532264106224E2 */ unsigned short MINLOG[4] = {0xc086,0x232b,0xdd7a,0xbcd2}; #endif /* 2**1024*(1-MACHEP) = 1.7976931348623158E308 */ unsigned short MAXNUM[4] = {0x7fef,0xffff,0xffff,0xffff}; unsigned short PI[4] = {0x4009,0x21fb,0x5444,0x2d18}; unsigned short PIO2[4] = {0x3ff9,0x21fb,0x5444,0x2d18}; unsigned short PIO4[4] = {0x3fe9,0x21fb,0x5444,0x2d18}; unsigned short SQRT2[4] = {0x3ff6,0xa09e,0x667f,0x3bcd}; unsigned short SQRTH[4] = {0x3fe6,0xa09e,0x667f,0x3bcd}; unsigned short LOG2E[4] = {0x3ff7,0x1547,0x652b,0x82fe}; unsigned short SQ2OPI[4] = {0x3fe9,0x8845,0x33d4,0x3651}; unsigned short LOGE2[4] = {0x3fe6,0x2e42,0xfefa,0x39ef}; unsigned short LOGSQ2[4] = {0x3fd6,0x2e42,0xfefa,0x39ef}; unsigned short THPIO4[4] = {0x4002,0xd97c,0x7f33,0x21d2}; unsigned short TWOOPI[4] = {0x3fe4,0x5f30,0x6dc9,0xc883}; #ifdef INFINITIES unsigned short INFINITY[4] = {0x7ff0,0x0000,0x0000,0x0000}; #else unsigned short INFINITY[4] = {0x7fef,0xffff,0xffff,0xffff}; #endif #ifdef NANS unsigned short NAN[4] = {0x7ff8,0x0000,0x0000,0x0000}; #else unsigned short NAN[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #ifdef MINUSZERO unsigned short NEGZERO[4] = {0x8000,0x0000,0x0000,0x0000}; #else unsigned short NEGZERO[4] = {0x0000,0x0000,0x0000,0x0000}; #endif #endif #ifdef DEC #if __G_FLOAT double MACHEP = 1.1102230246251565404236E-16; double UFLOWTHRESH = 5.5626846462680034577256E-309; double MAXLOG = 7.0908956571282408276602E2; double MINLOG = -7.0978271289338397309621E2; double MAXNUM = 8.9884656743115785407264E307; double PI = 3.14159265358979323846; /* pi */ double PIO2 = 1.57079632679489661923; /* pi/2 */ double PIO4 = 7.85398163397448309616E-1; /* pi/4 */ double SQRT2 = 1.41421356237309504880; /* sqrt(2) */ double SQRTH = 7.07106781186547524401E-1; /* sqrt(2)/2 */ double LOG2E = 1.4426950408889634073599; /* 1/log(2) */ double SQ2OPI = 7.9788456080286535587989E-1; /* sqrt( 2/pi ) */ double LOGE2 = 6.93147180559945309417E-1; /* log(2) */ double LOGSQ2 = 3.46573590279972654709E-1; /* log(2)/2 */ double THPIO4 = 2.35619449019234492885; /* 3*pi/4 */ double TWOOPI = 6.36619772367581343075535E-1; /* 2/pi */ double INFINITY = 8.9884656743115785407264E307; double NAN = 0.0; double NEGZERO = 0.0; #else /* __G_FLOAT == 0 */ /* 2**-56 = 1.38777878078144567553E-17 */ unsigned short MACHEP[4] = {0022200,0000000,0000000,0000000}; unsigned short UFLOWTHRESH[4] = {0x0080,0x0000,0x0000,0x0000}; /* log 2**127 = 88.029691931113054295988 */ unsigned short MAXLOG[4] = {041660,007463,0143742,025733,}; /* log 2**-128 = -88.72283911167299960540 */ unsigned short MINLOG[4] = {0141661,071027,0173721,0147572,}; /* 2**127 = 1.701411834604692317316873e38 */ unsigned short MAXNUM[4] = {077777,0177777,0177777,0177777,}; unsigned short PI[4] = {040511,007732,0121041,064302,}; unsigned short PIO2[4] = {040311,007732,0121041,064302,}; unsigned short PIO4[4] = {040111,007732,0121041,064302,}; unsigned short SQRT2[4] = {040265,002363,031771,0157145,}; unsigned short SQRTH[4] = {040065,002363,031771,0157144,}; unsigned short LOG2E[4] = {040270,0125073,024534,013761,}; unsigned short SQ2OPI[4] = {040114,041051,0117241,0131204,}; unsigned short LOGE2[4] = {040061,071027,0173721,0147572,}; unsigned short LOGSQ2[4] = {037661,071027,0173721,0147572,}; unsigned short THPIO4[4] = {040426,0145743,0174631,007222,}; unsigned short TWOOPI[4] = {040042,0174603,067116,042025,}; /* Approximate infinity by MAXNUM. */ unsigned short INFINITY[4] = {077777,0177777,0177777,0177777,}; unsigned short NAN[4] = {0000000,0000000,0000000,0000000}; #ifdef MINUSZERO unsigned short NEGZERO[4] = {0000000,0000000,0000000,0100000}; #else unsigned short NEGZERO[4] = {0000000,0000000,0000000,0000000}; #endif #endif /* __G_FLOAT */ #endif #ifndef UNK #if ! __G_FLOAT extern unsigned short MACHEP[]; extern unsigned short UFLOWTHRESH[]; extern unsigned short MAXLOG[]; extern unsigned short UNDLOG[]; extern unsigned short MINLOG[]; extern unsigned short MAXNUM[]; extern unsigned short PI[]; extern unsigned short PIO2[]; extern unsigned short PIO4[]; extern unsigned short SQRT2[]; extern unsigned short SQRTH[]; extern unsigned short LOG2E[]; extern unsigned short SQ2OPI[]; extern unsigned short LOGE2[]; extern unsigned short LOGSQ2[]; extern unsigned short THPIO4[]; extern unsigned short TWOOPI[]; extern unsigned short INFINITY[]; extern unsigned short NAN[]; extern unsigned short NEGZERO[]; #endif #endif /* * Get more reliable definitions of UFLOWTHRESH and MAXNUM from math.h * if possible */ #if defined (HAVE_LIBM) # if defined (DBL_MIN) # define UFLOWTHRESH = DBL_MIN # endif # if defined (DBL_MAX) # define MAXNUM = DBL_MAX # endif # if defined (DBL_EPSILON) # define MACHEP = DBL_EPSILON # endif #endif grace-5.1.23/cephes/check_float.c0000644000076500001440000000203106626627164016320 0ustar fnevgenyusers/* check_float.c -- Rolf Niepraschk 11/97, niepraschk@ptb.de */ /* test program for the cephes library definitions */ #include #include #include #define LOG2EA 0.44269504088896340735992 #define EQS(x, y) (strcmp(x, y) == 0) #define ACCURACY "%1.4f" typedef struct { union {unsigned short s[5]; double d;} f; char *name; } XTYPE; XTYPE X[] = { {{0037742,0124354,0122560,0057703}, "DEC"}, {{0x0bf8,0x94ae,0x551d,0x3fdc}, "IBMPC"}, {{0x3fdc,0x551d,0x94ae,0x0bf8}, "MIEEE"}, {{0,0,0,0}, "UNK"}, {{0,0,0,0}, ""} }; int main (int argc, char *argv[]) { int i; char TMPSTR[1024]; char LOG2EA_STR[80]; i = 0; sprintf(LOG2EA_STR, ACCURACY, LOG2EA); for (i=0; *X[i].name; i++) { sprintf(TMPSTR, ACCURACY, X[i].f.d); if (EQS(TMPSTR, LOG2EA_STR)) break; } if (*X[i].name) printf("Your system needs \"#define %s = 1\"\n", X[i].name); else printf("Try to use \"#define %s = 1\"\n", X[--i].name); exit(EXIT_SUCCESS); } grace-5.1.23/cephes/gdtr.c0000644000076500001440000000344306626627164015026 0ustar fnevgenyusers/* gdtr.c * * Gamma distribution function * * * * SYNOPSIS: * * double a, b, x, y, gdtr(); * * y = gdtr( a, b, x ); * * * * DESCRIPTION: * * Returns the integral from zero to x of the gamma probability * density function: * * * x * b - * a | | b-1 -at * y = ----- | t e dt * - | | * | (b) - * 0 * * The incomplete gamma integral is used, according to the * relation * * y = igam( b, ax ). * * * ACCURACY: * * See igam(). * * ERROR MESSAGES: * * message condition value returned * gdtr domain x < 0 0.0 * */ /* gdtrc.c * * Complemented gamma distribution function * * * * SYNOPSIS: * * double a, b, x, y, gdtrc(); * * y = gdtrc( a, b, x ); * * * * DESCRIPTION: * * Returns the integral from x to infinity of the gamma * probability density function: * * * inf. * b - * a | | b-1 -at * y = ----- | t e dt * - | | * | (b) - * x * * The incomplete gamma integral is used, according to the * relation * * y = igamc( b, ax ). * * * ACCURACY: * * See igamc(). * * ERROR MESSAGES: * * message condition value returned * gdtrc domain x < 0 0.0 * */ /* gdtr() */ /* Cephes Math Library Release 2.3: March,1995 Copyright 1984, 1987, 1995 by Stephen L. Moshier */ #include "mconf.h" #include "cephes.h" double gdtr( a, b, x ) double a, b, x; { if( x < 0.0 ) { mtherr( "gdtr", DOMAIN ); return( 0.0 ); } return( igam( b, a * x ) ); } double gdtrc( a, b, x ) double a, b, x; { if( x < 0.0 ) { mtherr( "gdtrc", DOMAIN ); return( 0.0 ); } return( igamc( b, a * x ) ); } grace-5.1.23/cephes/i0.c0000644000076500001440000002155306626627164014400 0ustar fnevgenyusers/* i0.c * * Modified Bessel function of order zero * * * * SYNOPSIS: * * double x, y, i0(); * * y = i0( x ); * * * * DESCRIPTION: * * Returns modified Bessel function of order zero of the * argument. * * The function is defined as i0(x) = j0( ix ). * * The range is partitioned into the two intervals [0,8] and * (8, infinity). Chebyshev polynomial expansions are employed * in each interval. * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * DEC 0,30 6000 8.2e-17 1.9e-17 * IEEE 0,30 30000 5.8e-16 1.4e-16 * */ /* i0e.c * * Modified Bessel function of order zero, * exponentially scaled * * * * SYNOPSIS: * * double x, y, i0e(); * * y = i0e( x ); * * * * DESCRIPTION: * * Returns exponentially scaled modified Bessel function * of order zero of the argument. * * The function is defined as i0e(x) = exp(-|x|) j0( ix ). * * * * ACCURACY: * * Relative error: * arithmetic domain # trials peak rms * IEEE 0,30 30000 5.4e-16 1.2e-16 * See i0(). * */ /* i0.c */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" /* Chebyshev coefficients for exp(-x) I0(x) * in the interval [0,8]. * * lim(x->0){ exp(-x) I0(x) } = 1. */ #ifdef UNK static double A[] = { -4.41534164647933937950E-18, 3.33079451882223809783E-17, -2.43127984654795469359E-16, 1.71539128555513303061E-15, -1.16853328779934516808E-14, 7.67618549860493561688E-14, -4.85644678311192946090E-13, 2.95505266312963983461E-12, -1.72682629144155570723E-11, 9.67580903537323691224E-11, -5.18979560163526290666E-10, 2.65982372468238665035E-9, -1.30002500998624804212E-8, 6.04699502254191894932E-8, -2.67079385394061173391E-7, 1.11738753912010371815E-6, -4.41673835845875056359E-6, 1.64484480707288970893E-5, -5.75419501008210370398E-5, 1.88502885095841655729E-4, -5.76375574538582365885E-4, 1.63947561694133579842E-3, -4.32430999505057594430E-3, 1.05464603945949983183E-2, -2.37374148058994688156E-2, 4.93052842396707084878E-2, -9.49010970480476444210E-2, 1.71620901522208775349E-1, -3.04682672343198398683E-1, 6.76795274409476084995E-1 }; #endif #ifdef DEC static unsigned short A[] = { 0121642,0162671,0004646,0103567, 0022431,0115424,0135755,0026104, 0123214,0023533,0110365,0156635, 0023767,0033304,0117662,0172716, 0124522,0100426,0012277,0157531, 0025254,0155062,0054461,0030465, 0126010,0131143,0013560,0153604, 0026517,0170577,0006336,0114437, 0127227,0162253,0152243,0052734, 0027724,0142766,0061641,0160200, 0130416,0123760,0116564,0125262, 0031066,0144035,0021246,0054641, 0131537,0053664,0060131,0102530, 0032201,0155664,0165153,0020652, 0132617,0061434,0074423,0176145, 0033225,0174444,0136147,0122542, 0133624,0031576,0056453,0020470, 0034211,0175305,0172321,0041314, 0134561,0054462,0147040,0165315, 0035105,0124333,0120203,0162532, 0135427,0013750,0174257,0055221, 0035726,0161654,0050220,0100162, 0136215,0131361,0000325,0041110, 0036454,0145417,0117357,0017352, 0136702,0072367,0104415,0133574, 0037111,0172126,0072505,0014544, 0137302,0055601,0120550,0033523, 0037457,0136543,0136544,0043002, 0137633,0177536,0001276,0066150, 0040055,0041164,0100655,0010521 }; #endif #ifdef IBMPC static unsigned short A[] = { 0xd0ef,0x2134,0x5cb7,0xbc54, 0xa589,0x977d,0x3362,0x3c83, 0xbbb4,0x721e,0x84eb,0xbcb1, 0x5eba,0x93f6,0xe6d8,0x3cde, 0xfbeb,0xc297,0x5022,0xbd0a, 0x2627,0x4b26,0x9b46,0x3d35, 0x1af0,0x62ee,0x164c,0xbd61, 0xd324,0xe19b,0xfe2f,0x3d89, 0x6abc,0x7a94,0xfc95,0xbdb2, 0x3c10,0xcc74,0x98be,0x3dda, 0x9556,0x13ae,0xd4fe,0xbe01, 0xcb34,0xa454,0xd903,0x3e26, 0x30ab,0x8c0b,0xeaf6,0xbe4b, 0x6435,0x9d4d,0x3b76,0x3e70, 0x7f8d,0x8f22,0xec63,0xbe91, 0xf4ac,0x978c,0xbf24,0x3eb2, 0x6427,0xcba5,0x866f,0xbed2, 0x2859,0xbe9a,0x3f58,0x3ef1, 0x1d5a,0x59c4,0x2b26,0xbf0e, 0x7cab,0x7410,0xb51b,0x3f28, 0xeb52,0x1f15,0xe2fd,0xbf42, 0x100e,0x8a12,0xdc75,0x3f5a, 0xa849,0x201a,0xb65e,0xbf71, 0xe3dd,0xf3dd,0x9961,0x3f85, 0xb6f0,0xf121,0x4e9e,0xbf98, 0xa32d,0xcea8,0x3e8a,0x3fa9, 0x06ea,0x342d,0x4b70,0xbfb8, 0x88c0,0x77ac,0xf7ac,0x3fc5, 0xcd8d,0xc057,0x7feb,0xbfd3, 0xa22a,0x9035,0xa84e,0x3fe5, }; #endif #ifdef MIEEE static unsigned short A[] = { 0xbc54,0x5cb7,0x2134,0xd0ef, 0x3c83,0x3362,0x977d,0xa589, 0xbcb1,0x84eb,0x721e,0xbbb4, 0x3cde,0xe6d8,0x93f6,0x5eba, 0xbd0a,0x5022,0xc297,0xfbeb, 0x3d35,0x9b46,0x4b26,0x2627, 0xbd61,0x164c,0x62ee,0x1af0, 0x3d89,0xfe2f,0xe19b,0xd324, 0xbdb2,0xfc95,0x7a94,0x6abc, 0x3dda,0x98be,0xcc74,0x3c10, 0xbe01,0xd4fe,0x13ae,0x9556, 0x3e26,0xd903,0xa454,0xcb34, 0xbe4b,0xeaf6,0x8c0b,0x30ab, 0x3e70,0x3b76,0x9d4d,0x6435, 0xbe91,0xec63,0x8f22,0x7f8d, 0x3eb2,0xbf24,0x978c,0xf4ac, 0xbed2,0x866f,0xcba5,0x6427, 0x3ef1,0x3f58,0xbe9a,0x2859, 0xbf0e,0x2b26,0x59c4,0x1d5a, 0x3f28,0xb51b,0x7410,0x7cab, 0xbf42,0xe2fd,0x1f15,0xeb52, 0x3f5a,0xdc75,0x8a12,0x100e, 0xbf71,0xb65e,0x201a,0xa849, 0x3f85,0x9961,0xf3dd,0xe3dd, 0xbf98,0x4e9e,0xf121,0xb6f0, 0x3fa9,0x3e8a,0xcea8,0xa32d, 0xbfb8,0x4b70,0x342d,0x06ea, 0x3fc5,0xf7ac,0x77ac,0x88c0, 0xbfd3,0x7feb,0xc057,0xcd8d, 0x3fe5,0xa84e,0x9035,0xa22a }; #endif /* Chebyshev coefficients for exp(-x) sqrt(x) I0(x) * in the inverted interval [8,infinity]. * * lim(x->inf){ exp(-x) sqrt(x) I0(x) } = 1/sqrt(2pi). */ #ifdef UNK static double B[] = { -7.23318048787475395456E-18, -4.83050448594418207126E-18, 4.46562142029675999901E-17, 3.46122286769746109310E-17, -2.82762398051658348494E-16, -3.42548561967721913462E-16, 1.77256013305652638360E-15, 3.81168066935262242075E-15, -9.55484669882830764870E-15, -4.15056934728722208663E-14, 1.54008621752140982691E-14, 3.85277838274214270114E-13, 7.18012445138366623367E-13, -1.79417853150680611778E-12, -1.32158118404477131188E-11, -3.14991652796324136454E-11, 1.18891471078464383424E-11, 4.94060238822496958910E-10, 3.39623202570838634515E-9, 2.26666899049817806459E-8, 2.04891858946906374183E-7, 2.89137052083475648297E-6, 6.88975834691682398426E-5, 3.36911647825569408990E-3, 8.04490411014108831608E-1 }; #endif #ifdef DEC static unsigned short B[] = { 0122005,0066672,0123124,0054311, 0121662,0033323,0030214,0104602, 0022515,0170300,0113314,0020413, 0022437,0117350,0035402,0007146, 0123243,0000135,0057220,0177435, 0123305,0073476,0144106,0170702, 0023777,0071755,0017527,0154373, 0024211,0052214,0102247,0033270, 0124454,0017763,0171453,0012322, 0125072,0166316,0075505,0154616, 0024612,0133770,0065376,0025045, 0025730,0162143,0056036,0001632, 0026112,0015077,0150464,0063542, 0126374,0101030,0014274,0065457, 0127150,0077271,0125763,0157617, 0127412,0104350,0040713,0120445, 0027121,0023765,0057500,0001165, 0030407,0147146,0003643,0075644, 0031151,0061445,0044422,0156065, 0031702,0132224,0003266,0125551, 0032534,0000076,0147153,0005555, 0033502,0004536,0004016,0026055, 0034620,0076433,0142314,0171215, 0036134,0146145,0013454,0101104, 0040115,0171425,0062500,0047133 }; #endif #ifdef IBMPC static unsigned short B[] = { 0x8b19,0x54ca,0xadb7,0xbc60, 0x9130,0x6611,0x46da,0xbc56, 0x8421,0x12d9,0xbe18,0x3c89, 0x41cd,0x0760,0xf3dd,0x3c83, 0x1fe4,0xabd2,0x600b,0xbcb4, 0xde38,0xd908,0xaee7,0xbcb8, 0xfb1f,0xa3ea,0xee7d,0x3cdf, 0xe6d7,0x9094,0x2a91,0x3cf1, 0x629a,0x7e65,0x83fe,0xbd05, 0xbb32,0xcf68,0x5d99,0xbd27, 0xc545,0x0d5f,0x56ff,0x3d11, 0xc073,0x6b83,0x1c8c,0x3d5b, 0x8cec,0xfa26,0x4347,0x3d69, 0x8d66,0x0317,0x9043,0xbd7f, 0x7bf2,0x357e,0x0fd7,0xbdad, 0x7425,0x0839,0x511d,0xbdc1, 0x004f,0xabe8,0x24fe,0x3daa, 0x6f75,0xc0f4,0xf9cc,0x3e00, 0x5b87,0xa922,0x2c64,0x3e2d, 0xd56d,0x80d6,0x5692,0x3e58, 0x616e,0xd9cd,0x8007,0x3e8b, 0xc586,0xc101,0x412b,0x3ec8, 0x9e52,0x7899,0x0fa3,0x3f12, 0x9049,0xa2e5,0x998c,0x3f6b, 0x09cb,0xaca8,0xbe62,0x3fe9 }; #endif #ifdef MIEEE static unsigned short B[] = { 0xbc60,0xadb7,0x54ca,0x8b19, 0xbc56,0x46da,0x6611,0x9130, 0x3c89,0xbe18,0x12d9,0x8421, 0x3c83,0xf3dd,0x0760,0x41cd, 0xbcb4,0x600b,0xabd2,0x1fe4, 0xbcb8,0xaee7,0xd908,0xde38, 0x3cdf,0xee7d,0xa3ea,0xfb1f, 0x3cf1,0x2a91,0x9094,0xe6d7, 0xbd05,0x83fe,0x7e65,0x629a, 0xbd27,0x5d99,0xcf68,0xbb32, 0x3d11,0x56ff,0x0d5f,0xc545, 0x3d5b,0x1c8c,0x6b83,0xc073, 0x3d69,0x4347,0xfa26,0x8cec, 0xbd7f,0x9043,0x0317,0x8d66, 0xbdad,0x0fd7,0x357e,0x7bf2, 0xbdc1,0x511d,0x0839,0x7425, 0x3daa,0x24fe,0xabe8,0x004f, 0x3e00,0xf9cc,0xc0f4,0x6f75, 0x3e2d,0x2c64,0xa922,0x5b87, 0x3e58,0x5692,0x80d6,0xd56d, 0x3e8b,0x8007,0xd9cd,0x616e, 0x3ec8,0x412b,0xc101,0xc586, 0x3f12,0x0fa3,0x7899,0x9e52, 0x3f6b,0x998c,0xa2e5,0x9049, 0x3fe9,0xbe62,0xaca8,0x09cb }; #endif double i0(x) double x; { double y; if( x < 0 ) x = -x; if( x <= 8.0 ) { y = (x/2.0) - 2.0; return( exp(x) * chbevl( y, A, 30 ) ); } return( exp(x) * chbevl( 32.0/x - 2.0, B, 25 ) / sqrt(x) ); } double i0e( x ) double x; { double y; if( x < 0 ) x = -x; if( x <= 8.0 ) { y = (x/2.0) - 2.0; return( chbevl( y, A, 30 ) ); } return( chbevl( 32.0/x - 2.0, B, 25 ) / sqrt(x) ); } grace-5.1.23/cephes/airy.c0000644000076500001440000005574506626627163015045 0ustar fnevgenyusers/* airy.c * * Airy function * * * * SYNOPSIS: * * double x, ai, aip, bi, bip; * int airy(); * * airy( x, _&ai, _&aip, _&bi, _&bip ); * * * * DESCRIPTION: * * Solution of the differential equation * * y"(x) = xy. * * The function returns the two independent solutions Ai, Bi * and their first derivatives Ai'(x), Bi'(x). * * Evaluation is by power series summation for small x, * by rational minimax approximations for large x. * * * * ACCURACY: * Error criterion is absolute when function <= 1, relative * when function > 1, except * denotes relative error criterion. * For large negative x, the absolute error increases as x^1.5. * For large positive x, the relative error increases as x^1.5. * * Arithmetic domain function # trials peak rms * IEEE -10, 0 Ai 10000 1.6e-15 2.7e-16 * IEEE 0, 10 Ai 10000 2.3e-14* 1.8e-15* * IEEE -10, 0 Ai' 10000 4.6e-15 7.6e-16 * IEEE 0, 10 Ai' 10000 1.8e-14* 1.5e-15* * IEEE -10, 10 Bi 30000 4.2e-15 5.3e-16 * IEEE -10, 10 Bi' 30000 4.9e-15 7.3e-16 * DEC -10, 0 Ai 5000 1.7e-16 2.8e-17 * DEC 0, 10 Ai 5000 2.1e-15* 1.7e-16* * DEC -10, 0 Ai' 5000 4.7e-16 7.8e-17 * DEC 0, 10 Ai' 12000 1.8e-15* 1.5e-16* * DEC -10, 10 Bi 10000 5.5e-16 6.8e-17 * DEC -10, 10 Bi' 7000 5.3e-16 8.7e-17 * */ /* airy.c */ /* Cephes Math Library Release 2.1: January, 1989 Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" static double c1 = 0.35502805388781723926; static double c2 = 0.258819403792806798405; static double sqrt3 = 1.732050807568877293527; static double sqpii = 5.64189583547756286948E-1; extern double PI; extern double MAXNUM, MACHEP; #ifdef UNK #define MAXAIRY 25.77 #endif #ifdef DEC #define MAXAIRY 25.77 #endif #ifdef IBMPC #define MAXAIRY 103.892 #endif #ifdef MIEEE #define MAXAIRY 103.892 #endif #ifdef UNK static double AN[8] = { 3.46538101525629032477E-1, 1.20075952739645805542E1, 7.62796053615234516538E1, 1.68089224934630576269E2, 1.59756391350164413639E2, 7.05360906840444183113E1, 1.40264691163389668864E1, 9.99999999999999995305E-1, }; static double AD[8] = { 5.67594532638770212846E-1, 1.47562562584847203173E1, 8.45138970141474626562E1, 1.77318088145400459522E2, 1.64234692871529701831E2, 7.14778400825575695274E1, 1.40959135607834029598E1, 1.00000000000000000470E0, }; #endif #ifdef DEC static unsigned short AN[32] = { 0037661,0066561,0024675,0131301, 0041100,0017434,0034324,0101466, 0041630,0107450,0067427,0007430, 0042050,0013327,0071000,0034737, 0042037,0140642,0156417,0167366, 0041615,0011172,0075147,0051165, 0041140,0066152,0160520,0075146, 0040200,0000000,0000000,0000000, }; static unsigned short AD[32] = { 0040021,0046740,0011422,0064606, 0041154,0014640,0024631,0062450, 0041651,0003435,0101152,0106401, 0042061,0050556,0034605,0136602, 0042044,0036024,0152377,0151414, 0041616,0172247,0072216,0115374, 0041141,0104334,0124154,0166007, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short AN[32] = { 0xb658,0x2537,0x2dae,0x3fd6, 0x9067,0x871a,0x03e3,0x4028, 0xe1e3,0x0de2,0x11e5,0x4053, 0x073c,0xee40,0x02da,0x4065, 0xfddf,0x5ba1,0xf834,0x4063, 0xea4f,0x4f4c,0xa24f,0x4051, 0x0f4d,0x5c2a,0x0d8d,0x402c, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short AD[32] = { 0x4d31,0x0262,0x29bc,0x3fe2, 0x2ca5,0x0533,0x8334,0x402d, 0x51a0,0xb04d,0x20e3,0x4055, 0xb7b0,0xc730,0x2a2d,0x4066, 0xfa61,0x9a9f,0x8782,0x4064, 0xd35f,0xee91,0xde94,0x4051, 0x9d81,0x950d,0x311b,0x402c, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short AN[32] = { 0x3fd6,0x2dae,0x2537,0xb658, 0x4028,0x03e3,0x871a,0x9067, 0x4053,0x11e5,0x0de2,0xe1e3, 0x4065,0x02da,0xee40,0x073c, 0x4063,0xf834,0x5ba1,0xfddf, 0x4051,0xa24f,0x4f4c,0xea4f, 0x402c,0x0d8d,0x5c2a,0x0f4d, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short AD[32] = { 0x3fe2,0x29bc,0x0262,0x4d31, 0x402d,0x8334,0x0533,0x2ca5, 0x4055,0x20e3,0xb04d,0x51a0, 0x4066,0x2a2d,0xc730,0xb7b0, 0x4064,0x8782,0x9a9f,0xfa61, 0x4051,0xde94,0xee91,0xd35f, 0x402c,0x311b,0x950d,0x9d81, 0x3ff0,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double APN[8] = { 6.13759184814035759225E-1, 1.47454670787755323881E1, 8.20584123476060982430E1, 1.71184781360976385540E2, 1.59317847137141783523E2, 6.99778599330103016170E1, 1.39470856980481566958E1, 1.00000000000000000550E0, }; static double APD[8] = { 3.34203677749736953049E-1, 1.11810297306158156705E1, 7.11727352147859965283E1, 1.58778084372838313640E2, 1.53206427475809220834E2, 6.86752304592780337944E1, 1.38498634758259442477E1, 9.99999999999999994502E-1, }; #endif #ifdef DEC static unsigned short APN[32] = { 0040035,0017522,0065145,0054755, 0041153,0166556,0161471,0057174, 0041644,0016750,0034445,0046462, 0042053,0027515,0152316,0046717, 0042037,0050536,0067023,0023264, 0041613,0172252,0007240,0131055, 0041137,0023503,0052472,0002305, 0040200,0000000,0000000,0000000, }; static unsigned short APD[32] = { 0037653,0016276,0112106,0126625, 0041062,0162577,0067111,0111761, 0041616,0054160,0140004,0137455, 0042036,0143460,0104626,0157206, 0042031,0032330,0067131,0114260, 0041611,0054667,0147207,0134564, 0041135,0114412,0070653,0146015, 0040200,0000000,0000000,0000000, }; #endif #ifdef IBMPC static unsigned short APN[32] = { 0xab3e,0x4d4c,0xa3ea,0x3fe3, 0x2bcf,0xdc67,0x7dad,0x402d, 0xa9a6,0x0724,0x83bd,0x4054, 0xc9ba,0xba99,0x65e9,0x4065, 0x64d7,0xcdc2,0xea2b,0x4063, 0x1646,0x41d4,0x7e95,0x4051, 0x4099,0x6aa7,0xe4e8,0x402b, 0x0000,0x0000,0x0000,0x3ff0, }; static unsigned short APD[32] = { 0xd5b3,0xd288,0x6397,0x3fd5, 0x327e,0xedc9,0x5caf,0x4026, 0x97e6,0x1800,0xcb0e,0x4051, 0xdbd1,0x1132,0xd8e6,0x4063, 0x3316,0x0dcb,0x269b,0x4063, 0xf72f,0xf9d0,0x2b36,0x4051, 0x7982,0x4e35,0xb321,0x402b, 0x0000,0x0000,0x0000,0x3ff0, }; #endif #ifdef MIEEE static unsigned short APN[32] = { 0x3fe3,0xa3ea,0x4d4c,0xab3e, 0x402d,0x7dad,0xdc67,0x2bcf, 0x4054,0x83bd,0x0724,0xa9a6, 0x4065,0x65e9,0xba99,0xc9ba, 0x4063,0xea2b,0xcdc2,0x64d7, 0x4051,0x7e95,0x41d4,0x1646, 0x402b,0xe4e8,0x6aa7,0x4099, 0x3ff0,0x0000,0x0000,0x0000, }; static unsigned short APD[32] = { 0x3fd5,0x6397,0xd288,0xd5b3, 0x4026,0x5caf,0xedc9,0x327e, 0x4051,0xcb0e,0x1800,0x97e6, 0x4063,0xd8e6,0x1132,0xdbd1, 0x4063,0x269b,0x0dcb,0x3316, 0x4051,0x2b36,0xf9d0,0xf72f, 0x402b,0xb321,0x4e35,0x7982, 0x3ff0,0x0000,0x0000,0x0000, }; #endif #ifdef UNK static double BN16[5] = { -2.53240795869364152689E-1, 5.75285167332467384228E-1, -3.29907036873225371650E-1, 6.44404068948199951727E-2, -3.82519546641336734394E-3, }; static double BD16[5] = { /* 1.00000000000000000000E0,*/ -7.15685095054035237902E0, 1.06039580715664694291E1, -5.23246636471251500874E0, 9.57395864378383833152E-1, -5.50828147163549611107E-2, }; #endif #ifdef DEC static unsigned short BN16[20] = { 0137601,0124307,0010213,0035210, 0040023,0042743,0101621,0016031, 0137650,0164623,0036056,0074511, 0037203,0174525,0000473,0142474, 0136172,0130041,0066726,0064324, }; static unsigned short BD16[20] = { /*0040200,0000000,0000000,0000000,*/ 0140745,0002354,0044335,0055276, 0041051,0124717,0170130,0104013, 0140647,0070135,0046473,0103501, 0040165,0013745,0033324,0127766, 0137141,0117204,0076164,0033107, }; #endif #ifdef IBMPC static unsigned short BN16[20] = { 0x6751,0xe211,0x3518,0xbfd0, 0x2383,0x7072,0x68bc,0x3fe2, 0xcf29,0x6785,0x1d32,0xbfd5, 0x78a8,0xa027,0x7f2a,0x3fb0, 0xcd1b,0x2dba,0x5604,0xbf6f, }; static unsigned short BD16[20] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xab58,0x891b,0xa09d,0xc01c, 0x1101,0xfe0b,0x3539,0x4025, 0x70e8,0xa9a7,0xee0b,0xc014, 0x95ff,0xa6da,0xa2fc,0x3fee, 0x86c9,0x8f8e,0x33d0,0xbfac, }; #endif #ifdef MIEEE static unsigned short BN16[20] = { 0xbfd0,0x3518,0xe211,0x6751, 0x3fe2,0x68bc,0x7072,0x2383, 0xbfd5,0x1d32,0x6785,0xcf29, 0x3fb0,0x7f2a,0xa027,0x78a8, 0xbf6f,0x5604,0x2dba,0xcd1b, }; static unsigned short BD16[20] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xc01c,0xa09d,0x891b,0xab58, 0x4025,0x3539,0xfe0b,0x1101, 0xc014,0xee0b,0xa9a7,0x70e8, 0x3fee,0xa2fc,0xa6da,0x95ff, 0xbfac,0x33d0,0x8f8e,0x86c9, }; #endif #ifdef UNK static double BPPN[5] = { 4.65461162774651610328E-1, -1.08992173800493920734E0, 6.38800117371827987759E-1, -1.26844349553102907034E-1, 7.62487844342109852105E-3, }; static double BPPD[5] = { /* 1.00000000000000000000E0,*/ -8.70622787633159124240E0, 1.38993162704553213172E1, -7.14116144616431159572E0, 1.34008595960680518666E0, -7.84273211323341930448E-2, }; #endif #ifdef DEC static unsigned short BPPN[20] = { 0037756,0050354,0167531,0135731, 0140213,0101216,0032767,0020375, 0040043,0104147,0106312,0177632, 0137401,0161574,0032015,0043714, 0036371,0155035,0143165,0142262, }; static unsigned short BPPD[20] = { /*0040200,0000000,0000000,0000000,*/ 0141013,0046265,0115005,0161053, 0041136,0061631,0072445,0156131, 0140744,0102145,0001127,0065304, 0040253,0103757,0146453,0102513, 0137240,0117200,0155402,0113500, }; #endif #ifdef IBMPC static unsigned short BPPN[20] = { 0x377b,0x9deb,0xca1d,0x3fdd, 0xe420,0xc6be,0x7051,0xbff1, 0x5ff3,0xf199,0x710c,0x3fe4, 0xa8fa,0x8681,0x3c6f,0xbfc0, 0xb896,0xb8ce,0x3b43,0x3f7f, }; static unsigned short BPPD[20] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xbc45,0xb340,0x6996,0xc021, 0xbb8b,0x2ea4,0xcc73,0x402b, 0xed59,0xa04a,0x908c,0xc01c, 0x70a9,0xf9a5,0x70fd,0x3ff5, 0x52e8,0x1b60,0x13d0,0xbfb4, }; #endif #ifdef MIEEE static unsigned short BPPN[20] = { 0x3fdd,0xca1d,0x9deb,0x377b, 0xbff1,0x7051,0xc6be,0xe420, 0x3fe4,0x710c,0xf199,0x5ff3, 0xbfc0,0x3c6f,0x8681,0xa8fa, 0x3f7f,0x3b43,0xb8ce,0xb896, }; static unsigned short BPPD[20] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0xc021,0x6996,0xb340,0xbc45, 0x402b,0xcc73,0x2ea4,0xbb8b, 0xc01c,0x908c,0xa04a,0xed59, 0x3ff5,0x70fd,0xf9a5,0x70a9, 0xbfb4,0x13d0,0x1b60,0x52e8, }; #endif #ifdef UNK static double AFN[9] = { -1.31696323418331795333E-1, -6.26456544431912369773E-1, -6.93158036036933542233E-1, -2.79779981545119124951E-1, -4.91900132609500318020E-2, -4.06265923594885404393E-3, -1.59276496239262096340E-4, -2.77649108155232920844E-6, -1.67787698489114633780E-8, }; static double AFD[9] = { /* 1.00000000000000000000E0,*/ 1.33560420706553243746E1, 3.26825032795224613948E1, 2.67367040941499554804E1, 9.18707402907259625840E0, 1.47529146771666414581E0, 1.15687173795188044134E-1, 4.40291641615211203805E-3, 7.54720348287414296618E-5, 4.51850092970580378464E-7, }; #endif #ifdef DEC static unsigned short AFN[36] = { 0137406,0155546,0124127,0033732, 0140040,0057564,0141263,0041222, 0140061,0071316,0013674,0175754, 0137617,0037522,0056637,0120130, 0137111,0075567,0121755,0166122, 0136205,0020016,0043317,0002201, 0135047,0001565,0075130,0002334, 0133472,0051700,0165021,0131551, 0131620,0020347,0132165,0013215, }; static unsigned short AFD[36] = { /*0040200,0000000,0000000,0000000,*/ 0041125,0131131,0025627,0067623, 0041402,0135342,0021703,0154315, 0041325,0162305,0016671,0120175, 0041022,0177101,0053114,0141632, 0040274,0153131,0147364,0114306, 0037354,0166545,0120042,0150530, 0036220,0043127,0000727,0130273, 0034636,0043275,0075667,0034733, 0032762,0112715,0146250,0142474, }; #endif #ifdef IBMPC static unsigned short AFN[36] = { 0xe6fb,0xd50a,0xdb6c,0xbfc0, 0x6852,0x9856,0x0bee,0xbfe4, 0x9f7d,0xc2f7,0x2e59,0xbfe6, 0xf40b,0x4bb3,0xe7ea,0xbfd1, 0xbd8a,0xf47d,0x2f6e,0xbfa9, 0xe090,0xc8d9,0xa401,0xbf70, 0x009c,0xaf4b,0xe06e,0xbf24, 0x366d,0x1d42,0x4a78,0xbec7, 0xa2d2,0xf68e,0x041c,0xbe52, }; static unsigned short AFD[36] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xedf2,0x2572,0xb64b,0x402a, 0x7b1a,0x4478,0x575c,0x4040, 0x3410,0xa3b7,0xbc98,0x403a, 0x9873,0x2ac9,0x5fc8,0x4022, 0x9319,0x39de,0x9acb,0x3ff7, 0x5a2b,0xb404,0x9dac,0x3fbd, 0xf617,0xe03a,0x08ca,0x3f72, 0xe73b,0xaf76,0xc8d7,0x3f13, 0x18a7,0xb995,0x52b9,0x3e9e, }; #endif #ifdef MIEEE static unsigned short AFN[36] = { 0xbfc0,0xdb6c,0xd50a,0xe6fb, 0xbfe4,0x0bee,0x9856,0x6852, 0xbfe6,0x2e59,0xc2f7,0x9f7d, 0xbfd1,0xe7ea,0x4bb3,0xf40b, 0xbfa9,0x2f6e,0xf47d,0xbd8a, 0xbf70,0xa401,0xc8d9,0xe090, 0xbf24,0xe06e,0xaf4b,0x009c, 0xbec7,0x4a78,0x1d42,0x366d, 0xbe52,0x041c,0xf68e,0xa2d2, }; static unsigned short AFD[36] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x402a,0xb64b,0x2572,0xedf2, 0x4040,0x575c,0x4478,0x7b1a, 0x403a,0xbc98,0xa3b7,0x3410, 0x4022,0x5fc8,0x2ac9,0x9873, 0x3ff7,0x9acb,0x39de,0x9319, 0x3fbd,0x9dac,0xb404,0x5a2b, 0x3f72,0x08ca,0xe03a,0xf617, 0x3f13,0xc8d7,0xaf76,0xe73b, 0x3e9e,0x52b9,0xb995,0x18a7, }; #endif #ifdef UNK static double AGN[11] = { 1.97339932091685679179E-2, 3.91103029615688277255E-1, 1.06579897599595591108E0, 9.39169229816650230044E-1, 3.51465656105547619242E-1, 6.33888919628925490927E-2, 5.85804113048388458567E-3, 2.82851600836737019778E-4, 6.98793669997260967291E-6, 8.11789239554389293311E-8, 3.41551784765923618484E-10, }; static double AGD[10] = { /* 1.00000000000000000000E0,*/ 9.30892908077441974853E0, 1.98352928718312140417E1, 1.55646628932864612953E1, 5.47686069422975497931E0, 9.54293611618961883998E-1, 8.64580826352392193095E-2, 4.12656523824222607191E-3, 1.01259085116509135510E-4, 1.17166733214413521882E-6, 4.91834570062930015649E-9, }; #endif #ifdef DEC static unsigned short AGN[44] = { 0036641,0124456,0167175,0157354, 0037710,0037250,0001441,0136671, 0040210,0066031,0150401,0123532, 0040160,0066545,0003570,0153133, 0037663,0171516,0072507,0170345, 0037201,0151011,0007510,0045702, 0036277,0172317,0104572,0101030, 0035224,0045663,0000160,0136422, 0033752,0074753,0047702,0135160, 0032256,0052225,0156550,0107103, 0030273,0142443,0166277,0071720, }; static unsigned short AGD[40] = { /*0040200,0000000,0000000,0000000,*/ 0041024,0170537,0117253,0055003, 0041236,0127256,0003570,0143240, 0041171,0004333,0172476,0160645, 0040657,0041161,0055716,0157161, 0040164,0046226,0006257,0063431, 0037261,0010357,0065445,0047563, 0036207,0034043,0057434,0116732, 0034724,0055416,0130035,0026377, 0033235,0041056,0154071,0023502, 0031250,0177071,0167254,0047242, }; #endif #ifdef IBMPC static unsigned short AGN[44] = { 0xbbde,0xddcf,0x3525,0x3f94, 0x37b7,0x0064,0x07d5,0x3fd9, 0x34eb,0x3a20,0x0d83,0x3ff1, 0x1acb,0xa0ef,0x0dac,0x3fee, 0xfe1d,0xcea8,0x7e69,0x3fd6, 0x0978,0x21e9,0x3a41,0x3fb0, 0x5043,0xf12f,0xfe99,0x3f77, 0x17a2,0x600e,0x8976,0x3f32, 0x574e,0x69f8,0x4f3d,0x3edd, 0x11c8,0xbbad,0xca92,0x3e75, 0xee7a,0x7d97,0x78a4,0x3df7, }; static unsigned short AGD[40] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x6b40,0xf3d5,0x9e2b,0x4022, 0x18d4,0xc0ef,0xd5d5,0x4033, 0xdc35,0x7ea7,0x211b,0x402f, 0xdbce,0x2b79,0xe84e,0x4015, 0xece3,0xc195,0x8992,0x3fee, 0xa9ee,0xed64,0x221d,0x3fb6, 0x93bb,0x6be3,0xe704,0x3f70, 0xa5a0,0xd603,0x8b61,0x3f1a, 0x24e8,0xdb07,0xa845,0x3eb3, 0x89d4,0x3dd5,0x1fc7,0x3e35, }; #endif #ifdef MIEEE static unsigned short AGN[44] = { 0x3f94,0x3525,0xddcf,0xbbde, 0x3fd9,0x07d5,0x0064,0x37b7, 0x3ff1,0x0d83,0x3a20,0x34eb, 0x3fee,0x0dac,0xa0ef,0x1acb, 0x3fd6,0x7e69,0xcea8,0xfe1d, 0x3fb0,0x3a41,0x21e9,0x0978, 0x3f77,0xfe99,0xf12f,0x5043, 0x3f32,0x8976,0x600e,0x17a2, 0x3edd,0x4f3d,0x69f8,0x574e, 0x3e75,0xca92,0xbbad,0x11c8, 0x3df7,0x78a4,0x7d97,0xee7a, }; static unsigned short AGD[40] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4022,0x9e2b,0xf3d5,0x6b40, 0x4033,0xd5d5,0xc0ef,0x18d4, 0x402f,0x211b,0x7ea7,0xdc35, 0x4015,0xe84e,0x2b79,0xdbce, 0x3fee,0x8992,0xc195,0xece3, 0x3fb6,0x221d,0xed64,0xa9ee, 0x3f70,0xe704,0x6be3,0x93bb, 0x3f1a,0x8b61,0xd603,0xa5a0, 0x3eb3,0xa845,0xdb07,0x24e8, 0x3e35,0x1fc7,0x3dd5,0x89d4, }; #endif #ifdef UNK static double APFN[9] = { 1.85365624022535566142E-1, 8.86712188052584095637E-1, 9.87391981747398547272E-1, 4.01241082318003734092E-1, 7.10304926289631174579E-2, 5.90618657995661810071E-3, 2.33051409401776799569E-4, 4.08718778289035454598E-6, 2.48379932900442457853E-8, }; static double APFD[9] = { /* 1.00000000000000000000E0,*/ 1.47345854687502542552E1, 3.75423933435489594466E1, 3.14657751203046424330E1, 1.09969125207298778536E1, 1.78885054766999417817E0, 1.41733275753662636873E-1, 5.44066067017226003627E-3, 9.39421290654511171663E-5, 5.65978713036027009243E-7, }; #endif #ifdef DEC static unsigned short APFN[36] = { 0037475,0150174,0071752,0166651, 0040142,0177621,0164246,0101757, 0040174,0142670,0106760,0006573, 0037715,0067570,0116274,0022404, 0037221,0074157,0053341,0117207, 0036301,0104257,0015075,0004777, 0035164,0057502,0164034,0001313, 0033611,0022254,0176000,0112565, 0031725,0055523,0025153,0166057, }; static unsigned short APFD[36] = { /*0040200,0000000,0000000,0000000,*/ 0041153,0140334,0130506,0061402, 0041426,0025551,0024440,0070611, 0041373,0134750,0047147,0176702, 0041057,0171532,0105430,0017674, 0040344,0174416,0001726,0047754, 0037421,0021207,0020167,0136264, 0036262,0043621,0151321,0124324, 0034705,0001313,0163733,0016407, 0033027,0166702,0150440,0170561, }; #endif #ifdef IBMPC static unsigned short APFN[36] = { 0x5db5,0x8e7d,0xba0f,0x3fc7, 0xd07e,0x3d14,0x5ff2,0x3fec, 0x01af,0x11be,0x98b7,0x3fef, 0x84a1,0x1397,0xadef,0x3fd9, 0x33d1,0xeadc,0x2f0d,0x3fb2, 0xa140,0xe347,0x3115,0x3f78, 0x8059,0x5d03,0x8be8,0x3f2e, 0x12af,0x9f80,0x2495,0x3ed1, 0x7d86,0x654d,0xab6a,0x3e5a, }; static unsigned short APFD[36] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0xcc60,0x9628,0x781b,0x402d, 0x0e31,0x2524,0xc56d,0x4042, 0xffb8,0x09cc,0x773d,0x403f, 0x03f7,0x5163,0xfe6b,0x4025, 0xc9fd,0xc07a,0x9f21,0x3ffc, 0xf796,0xe40e,0x2450,0x3fc2, 0x351a,0x3a5a,0x48f2,0x3f76, 0x63a1,0x7cfb,0xa059,0x3f18, 0x1e2e,0x5a24,0xfdb8,0x3ea2, }; #endif #ifdef MIEEE static unsigned short APFN[36] = { 0x3fc7,0xba0f,0x8e7d,0x5db5, 0x3fec,0x5ff2,0x3d14,0xd07e, 0x3fef,0x98b7,0x11be,0x01af, 0x3fd9,0xadef,0x1397,0x84a1, 0x3fb2,0x2f0d,0xeadc,0x33d1, 0x3f78,0x3115,0xe347,0xa140, 0x3f2e,0x8be8,0x5d03,0x8059, 0x3ed1,0x2495,0x9f80,0x12af, 0x3e5a,0xab6a,0x654d,0x7d86, }; static unsigned short APFD[36] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x402d,0x781b,0x9628,0xcc60, 0x4042,0xc56d,0x2524,0x0e31, 0x403f,0x773d,0x09cc,0xffb8, 0x4025,0xfe6b,0x5163,0x03f7, 0x3ffc,0x9f21,0xc07a,0xc9fd, 0x3fc2,0x2450,0xe40e,0xf796, 0x3f76,0x48f2,0x3a5a,0x351a, 0x3f18,0xa059,0x7cfb,0x63a1, 0x3ea2,0xfdb8,0x5a24,0x1e2e, }; #endif #ifdef UNK static double APGN[11] = { -3.55615429033082288335E-2, -6.37311518129435504426E-1, -1.70856738884312371053E0, -1.50221872117316635393E0, -5.63606665822102676611E-1, -1.02101031120216891789E-1, -9.48396695961445269093E-3, -4.60325307486780994357E-4, -1.14300836484517375919E-5, -1.33415518685547420648E-7, -5.63803833958893494476E-10, }; static double APGD[11] = { /* 1.00000000000000000000E0,*/ 9.85865801696130355144E0, 2.16401867356585941885E1, 1.73130776389749389525E1, 6.17872175280828766327E0, 1.08848694396321495475E0, 9.95005543440888479402E-2, 4.78468199683886610842E-3, 1.18159633322838625562E-4, 1.37480673554219441465E-6, 5.79912514929147598821E-9, }; #endif #ifdef DEC static unsigned short APGN[44] = { 0137021,0124372,0176075,0075331, 0140043,0023330,0177672,0161655, 0140332,0131126,0010413,0171112, 0140300,0044263,0175560,0054070, 0140020,0044206,0142603,0073324, 0137321,0015130,0066144,0144033, 0136433,0061243,0175542,0103373, 0135361,0053721,0020441,0053203, 0134077,0141725,0160277,0130612, 0132417,0040372,0100363,0060200, 0130432,0175052,0171064,0034147, }; static unsigned short APGD[40] = { /*0040200,0000000,0000000,0000000,*/ 0041035,0136420,0030124,0140220, 0041255,0017432,0034447,0162256, 0041212,0100456,0154544,0006321, 0040705,0134026,0127154,0123414, 0040213,0051612,0044470,0172607, 0037313,0143362,0053273,0157051, 0036234,0144322,0054536,0007264, 0034767,0146170,0054265,0170342, 0033270,0102777,0167362,0073631, 0031307,0040644,0167103,0021763, }; #endif #ifdef IBMPC static unsigned short APGN[44] = { 0xaf5b,0x5f87,0x351f,0xbfa2, 0x5c76,0x1ff7,0x64db,0xbfe4, 0x7e49,0xc221,0x564a,0xbffb, 0x0b07,0x7f6e,0x0916,0xbff8, 0x6edb,0xd8b0,0x0910,0xbfe2, 0x9903,0x0d8c,0x234b,0xbfba, 0x50df,0x7f6c,0x6c54,0xbf83, 0x2ad0,0x2424,0x2afa,0xbf3e, 0xf631,0xbc17,0xf87a,0xbee7, 0x6c10,0x501e,0xe81f,0xbe81, 0x870d,0x5e46,0x5f45,0xbe03, }; static unsigned short APGD[40] = { /*0x0000,0x0000,0x0000,0x3ff0,*/ 0x9812,0x060a,0xb7a2,0x4023, 0xfc96,0x4724,0xa3e3,0x4035, 0x819a,0xdb2c,0x5025,0x4031, 0x94e2,0xd5cd,0xb702,0x4018, 0x1eb1,0x4927,0x6a71,0x3ff1, 0x7bc5,0x4ad7,0x78de,0x3fb9, 0xc1d7,0x4b2b,0x991a,0x3f73, 0xbe1c,0x0b16,0xf98f,0x3f1e, 0x4ef3,0xfdde,0x10bf,0x3eb7, 0x647e,0x9dc8,0xe834,0x3e38, }; #endif #ifdef MIEEE static unsigned short APGN[44] = { 0xbfa2,0x351f,0x5f87,0xaf5b, 0xbfe4,0x64db,0x1ff7,0x5c76, 0xbffb,0x564a,0xc221,0x7e49, 0xbff8,0x0916,0x7f6e,0x0b07, 0xbfe2,0x0910,0xd8b0,0x6edb, 0xbfba,0x234b,0x0d8c,0x9903, 0xbf83,0x6c54,0x7f6c,0x50df, 0xbf3e,0x2afa,0x2424,0x2ad0, 0xbee7,0xf87a,0xbc17,0xf631, 0xbe81,0xe81f,0x501e,0x6c10, 0xbe03,0x5f45,0x5e46,0x870d, }; static unsigned short APGD[40] = { /*0x3ff0,0x0000,0x0000,0x0000,*/ 0x4023,0xb7a2,0x060a,0x9812, 0x4035,0xa3e3,0x4724,0xfc96, 0x4031,0x5025,0xdb2c,0x819a, 0x4018,0xb702,0xd5cd,0x94e2, 0x3ff1,0x6a71,0x4927,0x1eb1, 0x3fb9,0x78de,0x4ad7,0x7bc5, 0x3f73,0x991a,0x4b2b,0xc1d7, 0x3f1e,0xf98f,0x0b16,0xbe1c, 0x3eb7,0x10bf,0xfdde,0x4ef3, 0x3e38,0xe834,0x9dc8,0x647e, }; #endif int airy( x, ai, aip, bi, bip ) double x, *ai, *aip, *bi, *bip; { double z, zz, t, f, g, uf, ug, k, zeta, theta; int domflg; domflg = 0; if( x > MAXAIRY ) { *ai = 0; *aip = 0; *bi = MAXNUM; *bip = MAXNUM; return(-1); } if( x < -2.09 ) { domflg = 15; t = sqrt(-x); zeta = -2.0 * x * t / 3.0; t = sqrt(t); k = sqpii / t; z = 1.0/zeta; zz = z * z; uf = 1.0 + zz * polevl( zz, AFN, 8 ) / p1evl( zz, AFD, 9 ); ug = z * polevl( zz, AGN, 10 ) / p1evl( zz, AGD, 10 ); theta = zeta + 0.25 * PI; f = sin( theta ); g = cos( theta ); *ai = k * (f * uf - g * ug); *bi = k * (g * uf + f * ug); uf = 1.0 + zz * polevl( zz, APFN, 8 ) / p1evl( zz, APFD, 9 ); ug = z * polevl( zz, APGN, 10 ) / p1evl( zz, APGD, 10 ); k = sqpii * t; *aip = -k * (g * uf + f * ug); *bip = k * (f * uf - g * ug); return(0); } if( x >= 2.09 ) /* cbrt(9) */ { domflg = 5; t = sqrt(x); zeta = 2.0 * x * t / 3.0; g = exp( zeta ); t = sqrt(t); k = 2.0 * t * g; z = 1.0/zeta; f = polevl( z, AN, 7 ) / polevl( z, AD, 7 ); *ai = sqpii * f / k; k = -0.5 * sqpii * t / g; f = polevl( z, APN, 7 ) / polevl( z, APD, 7 ); *aip = f * k; if( x > 8.3203353 ) /* zeta > 16 */ { f = z * polevl( z, BN16, 4 ) / p1evl( z, BD16, 5 ); k = sqpii * g; *bi = k * (1.0 + f) / t; f = z * polevl( z, BPPN, 4 ) / p1evl( z, BPPD, 5 ); *bip = k * t * (1.0 + f); return(0); } } f = 1.0; g = x; t = 1.0; uf = 1.0; ug = x; k = 1.0; z = x * x * x; while( t > MACHEP ) { uf *= z; k += 1.0; uf /=k; ug *= z; k += 1.0; ug /=k; uf /=k; f += uf; k += 1.0; ug /=k; g += ug; t = fabs(uf/f); } uf = c1 * f; ug = c2 * g; if( (domflg & 1) == 0 ) *ai = uf - ug; if( (domflg & 2) == 0 ) *bi = sqrt3 * (uf + ug); /* the deriviative of ai */ k = 4.0; uf = x * x/2.0; ug = z/3.0; f = uf; g = 1.0 + ug; uf /= 3.0; t = 1.0; while( t > MACHEP ) { uf *= z; ug /=k; k += 1.0; ug *= z; uf /=k; f += uf; k += 1.0; ug /=k; uf /=k; g += ug; k += 1.0; t = fabs(ug/g); } uf = c1 * f; ug = c2 * g; if( (domflg & 4) == 0 ) *aip = uf - ug; if( (domflg & 8) == 0 ) *bip = sqrt3 * (uf + ug); return(0); } grace-5.1.23/cephes/unity.c0000644000076500001440000000446206724056645015237 0ustar fnevgenyusers/* unity.c * * Relative error approximations for function arguments near * unity. * * log1p(x) = log(1+x) * expm1(x) = exp(x) - 1 * cosm1(x) = cos(x) - 1 * */ #include "mconf.h" #include "cephes.h" #ifdef INFINITIES extern double INFINITY; #endif /* log1p(x) = log(1 + x) */ /* Coefficients for log(1+x) = x - x**2/2 + x**3 P(x)/Q(x) * 1/sqrt(2) <= x < sqrt(2) * Theoretical peak relative error = 2.32e-20 */ static double LP[] = { 4.5270000862445199635215E-5, 4.9854102823193375972212E-1, 6.5787325942061044846969E0, 2.9911919328553073277375E1, 6.0949667980987787057556E1, 5.7112963590585538103336E1, 2.0039553499201281259648E1, }; static double LQ[] = { /* 1.0000000000000000000000E0,*/ 1.5062909083469192043167E1, 8.3047565967967209469434E1, 2.2176239823732856465394E2, 3.0909872225312059774938E2, 2.1642788614495947685003E2, 6.0118660497603843919306E1, }; #define SQRTH 0.70710678118654752440 #define SQRT2 1.41421356237309504880 double log1p(x) double x; { double z; z = 1.0 + x; if( (z < SQRTH) || (z > SQRT2) ) return( log(z) ); z = x*x; z = -0.5 * z + x * ( z * polevl( x, LP, 6 ) / p1evl( x, LQ, 6 ) ); return (x + z); } /* expm1(x) = exp(x) - 1 */ /* e^x = 1 + 2x P(x^2)/( Q(x^2) - P(x^2) ) * -0.5 <= x <= 0.5 */ static double EP[3] = { 1.2617719307481059087798E-4, 3.0299440770744196129956E-2, 9.9999999999999999991025E-1, }; static double EQ[4] = { 3.0019850513866445504159E-6, 2.5244834034968410419224E-3, 2.2726554820815502876593E-1, 2.0000000000000000000897E0, }; double expm1(x) double x; { double r, xx; #ifdef NANS if( isnan(x) ) return(x); #endif #ifdef INFINITIES if( x == INFINITY ) return(INFINITY); if( x == -INFINITY ) return(-1.0); #endif if( (x < -0.5) || (x > 0.5) ) return( exp(x) - 1.0 ); xx = x * x; r = x * polevl( xx, EP, 2 ); r = r/( polevl( xx, EQ, 3 ) - r ); return (r + r); } /* cosm1(x) = cos(x) - 1 */ static double coscof[7] = { 4.7377507964246204691685E-14, -1.1470284843425359765671E-11, 2.0876754287081521758361E-9, -2.7557319214999787979814E-7, 2.4801587301570552304991E-5, -1.3888888888888872993737E-3, 4.1666666666666666609054E-2, }; extern double PIO4; double cosm1(x) double x; { double xx; if( (x < -PIO4) || (x > PIO4) ) return( cos(x) - 1.0 ); xx = x * x; xx = -0.5*xx + xx * xx * polevl( xx, coscof, 6 ); return xx; } grace-5.1.23/cephes/psi.c0000644000076500001440000000704006626627164014656 0ustar fnevgenyusers/* psi.c * * Psi (digamma) function * * * SYNOPSIS: * * double x, y, psi(); * * y = psi( x ); * * * DESCRIPTION: * * d - * psi(x) = -- ln | (x) * dx * * is the logarithmic derivative of the gamma function. * For integer x, * n-1 * - * psi(n) = -EUL + > 1/k. * - * k=1 * * This formula is used for 0 < n <= 10. If x is negative, it * is transformed to a positive argument by the reflection * formula psi(1-x) = psi(x) + pi cot(pi x). * For general positive x, the argument is made greater than 10 * using the recurrence psi(x+1) = psi(x) + 1/x. * Then the following asymptotic expansion is applied: * * inf. B * - 2k * psi(x) = log(x) - 1/2x - > ------- * - 2k * k=1 2k x * * where the B2k are Bernoulli numbers. * * ACCURACY: * Relative error (except absolute when |psi| < 1): * arithmetic domain # trials peak rms * DEC 0,30 2500 1.7e-16 2.0e-17 * IEEE 0,30 30000 1.3e-15 1.4e-16 * IEEE -30,0 40000 1.5e-15 2.2e-16 * * ERROR MESSAGES: * message condition value returned * psi singularity x integer <=0 MAXNUM */ /* Cephes Math Library Release 2.2: July, 1992 Copyright 1984, 1987, 1992 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK static double A[] = { 8.33333333333333333333E-2, -2.10927960927960927961E-2, 7.57575757575757575758E-3, -4.16666666666666666667E-3, 3.96825396825396825397E-3, -8.33333333333333333333E-3, 8.33333333333333333333E-2 }; #endif #ifdef DEC static unsigned short A[] = { 0037252,0125252,0125252,0125253, 0136654,0145314,0126312,0146255, 0036370,0037017,0101740,0174076, 0136210,0104210,0104210,0104211, 0036202,0004040,0101010,0020202, 0136410,0104210,0104210,0104211, 0037252,0125252,0125252,0125253 }; #endif #ifdef IBMPC static unsigned short A[] = { 0x5555,0x5555,0x5555,0x3fb5, 0x5996,0x9599,0x9959,0xbf95, 0x1f08,0xf07c,0x07c1,0x3f7f, 0x1111,0x1111,0x1111,0xbf71, 0x0410,0x1041,0x4104,0x3f70, 0x1111,0x1111,0x1111,0xbf81, 0x5555,0x5555,0x5555,0x3fb5 }; #endif #ifdef MIEEE static unsigned short A[] = { 0x3fb5,0x5555,0x5555,0x5555, 0xbf95,0x9959,0x9599,0x5996, 0x3f7f,0x07c1,0xf07c,0x1f08, 0xbf71,0x1111,0x1111,0x1111, 0x3f70,0x4104,0x1041,0x0410, 0xbf81,0x1111,0x1111,0x1111, 0x3fb5,0x5555,0x5555,0x5555 }; #endif #define EUL 0.57721566490153286061 extern double PI, MAXNUM; double psi(x) double x; { double p, q, nz, s, w, y, z; int i, n, negative; negative = 0; nz = 0.0; if( x <= 0.0 ) { negative = 1; q = x; p = floor(q); if( p == q ) { mtherr( "psi", SING ); return( MAXNUM ); } /* Remove the zeros of tan(PI x) * by subtracting the nearest integer from x */ nz = q - p; if( nz != 0.5 ) { if( nz > 0.5 ) { p += 1.0; nz = q - p; } nz = PI/tan(PI*nz); } else { nz = 0.0; } x = 1.0 - x; } /* check for positive integer up to 10 */ if( (x <= 10.0) && (x == floor(x)) ) { y = 0.0; n = x; for( i=1; i MAXLOG 0.0 * a or b <0 integer 0.0 * */ /* beta.c */ /* Cephes Math Library Release 2.0: April, 1987 Copyright 1984, 1987 by Stephen L. Moshier Direct inquiries to 30 Frost Street, Cambridge, MA 02140 */ #include "mconf.h" #include "cephes.h" #ifdef UNK #define MAXGAM 34.84425627277176174 #endif #ifdef DEC #define MAXGAM 34.84425627277176174 #endif #ifdef IBMPC #define MAXGAM 171.624376956302725 #endif #ifdef MIEEE #define MAXGAM 171.624376956302725 #endif extern double MAXLOG, MAXNUM; double beta( a, b ) double a, b; { double y; int sign; sign = 1; if( a <= 0.0 ) { if( a == floor(a) ) goto over; } if( b <= 0.0 ) { if( b == floor(b) ) goto over; } y = a + b; if( fabs(y) > MAXGAM ) { y = lgam(y); sign *= sgngam; /* keep track of the sign */ y = lgam(b) - y; sign *= sgngam; y = lgam(a) + y; sign *= sgngam; if( y > MAXLOG ) { over: mtherr( "beta", OVERFLOW ); return( sign * MAXNUM ); } return( sign * exp(y) ); } y = true_gamma(y); if( y == 0.0 ) goto over; if( a > b ) { y = true_gamma(a)/y; y *= true_gamma(b); } else { y = true_gamma(b)/y; y *= true_gamma(a); } return(y); } /* Natural log of |beta|. Return the sign of beta in sgngam. */ double lbeta( a, b ) double a, b; { double y; int sign; sign = 1; if( a <= 0.0 ) { if( a == floor(a) ) goto over; } if( b <= 0.0 ) { if( b == floor(b) ) goto over; } y = a + b; if( fabs(y) > MAXGAM ) { y = lgam(y); sign *= sgngam; /* keep track of the sign */ y = lgam(b) - y; sign *= sgngam; y = lgam(a) + y; sign *= sgngam; sgngam = sign; return( y ); } y = true_gamma(y); if( y == 0.0 ) { over: mtherr( "lbeta", OVERFLOW ); return( sign * MAXNUM ); } if( a > b ) { y = true_gamma(a)/y; y *= true_gamma(b); } else { y = true_gamma(b)/y; y *= true_gamma(a); } if( y < 0 ) { sgngam = -1; y = -y; } else sgngam = 1; return( log(y) ); } grace-5.1.23/DEVELOPERS0000644000076500001440000000012306626627162014034 0ustar fnevgenyusers The "CHANGES" file in the current directory should give you an idea who's who :)